[vdr-plugin-skindesigner] 01/12: Imported Upstream version 0.2.2-3-gf3ad276
Tobias Grimm
tiber-guest at moszumanska.debian.org
Sun Feb 15 18:24:20 UTC 2015
This is an automated email from the git hooks/post-receive script.
tiber-guest pushed a commit to branch master
in repository vdr-plugin-skindesigner.
commit 97e4bde104069179f4b263ce866c83d7a3658114
Author: etobi <git at e-tobi.net>
Date: Sat Feb 14 19:44:34 2015 +0100
Imported Upstream version 0.2.2-3-gf3ad276
---
.gitignore | 8 +
COPYING | 340 ++++
HISTORY | 205 +++
Makefile | 182 ++
README | 108 ++
config.c | 333 ++++
config.h | 107 ++
designer.c | 349 ++++
designer.h | 52 +
displaychannel.c | 206 +++
displaychannel.h | 32 +
displaymenu.c | 308 ++++
displaymenu.h | 54 +
displaymessage.c | 45 +
displaymessage.h | 22 +
displayreplay.c | 99 ++
displayreplay.h | 30 +
displaytracks.c | 58 +
displaytracks.h | 27 +
displayvolume.c | 43 +
displayvolume.h | 21 +
dtd/displayaudiotracks.dtd | 42 +
dtd/displaychannel.dtd | 111 ++
dtd/displaymenu.dtd | 276 +++
dtd/displaymenuplugin.dtd | 96 ++
dtd/displaymessage.dtd | 28 +
dtd/displayreplay.dtd | 116 ++
dtd/displayvolume.dtd | 28 +
dtd/functions.dtd | 146 ++
dtd/globals.dtd | 29 +
dtd/setup.dtd | 28 +
extrecinfo/template.txt | 4 +
fonts/VDROpenSans/Apache License.txt | 201 +++
fonts/VDROpenSans/VDROpenSans-Bold.ttf | Bin 0 -> 125932 bytes
fonts/VDROpenSans/VDROpenSans-BoldItalic.ttf | Bin 0 -> 114584 bytes
fonts/VDROpenSans/VDROpenSans-ExtraBold.ttf | Bin 0 -> 123960 bytes
fonts/VDROpenSans/VDROpenSans-ExtraBoldItalic.ttf | Bin 0 -> 114768 bytes
fonts/VDROpenSans/VDROpenSans-Italic.ttf | Bin 0 -> 114100 bytes
fonts/VDROpenSans/VDROpenSans-Light.ttf | Bin 0 -> 123772 bytes
fonts/VDROpenSans/VDROpenSans-LightItalic.ttf | Bin 0 -> 114484 bytes
fonts/VDROpenSans/VDROpenSans-Regular.ttf | Bin 0 -> 118664 bytes
fonts/VDROpenSans/VDROpenSans-Semibold.ttf | Bin 0 -> 122672 bytes
fonts/VDROpenSans/VDROpenSans-SemiboldItalic.ttf | Bin 0 -> 114192 bytes
libcore/extrecinfo.c | 96 ++
libcore/extrecinfo.h | 36 +
libcore/fontmanager.c | 180 ++
libcore/fontmanager.h | 36 +
libcore/helpers.c | 234 +++
libcore/helpers.h | 46 +
libcore/imagecache.c | 476 ++++++
libcore/imagecache.h | 57 +
libcore/imageloader.c | 368 ++++
libcore/imageloader.h | 87 +
libcore/pixmapcontainer.c | 487 ++++++
libcore/pixmapcontainer.h | 74 +
libcore/recfolderinfo.c | 219 +++
libcore/recfolderinfo.h | 43 +
libcore/skinsetup.c | 308 ++++
libcore/skinsetup.h | 97 ++
libcore/timers.c | 87 +
libcore/timers.h | 20 +
libtemplate/globals.c | 250 +++
libtemplate/globals.h | 59 +
libtemplate/parameter.c | 402 +++++
libtemplate/parameter.h | 141 ++
libtemplate/template.c | 281 +++
libtemplate/template.h | 58 +
libtemplate/templatefunction.c | 1611 ++++++++++++++++++
libtemplate/templatefunction.h | 217 +++
libtemplate/templateloopfunction.c | 208 +++
libtemplate/templateloopfunction.h | 33 +
libtemplate/templatepixmap.c | 474 ++++++
libtemplate/templatepixmap.h | 82 +
libtemplate/templateview.c | 1799 ++++++++++++++++++++
libtemplate/templateview.h | 207 +++
libtemplate/templateviewelement.c | 135 ++
libtemplate/templateviewelement.h | 106 ++
libtemplate/templateviewlist.c | 177 ++
libtemplate/templateviewlist.h | 50 +
libtemplate/templateviewtab.c | 38 +
libtemplate/templateviewtab.h | 31 +
libtemplate/xmlparser.c | 954 +++++++++++
libtemplate/xmlparser.h | 65 +
po/de_DE.po | 91 +
po/fi_FI.po | 91 +
scripts/README | 10 +
scripts/temperatures.default | 29 +
scripts/temperatures.g2v | 31 +
services.h | 38 +
services/epgsearch.h | 167 ++
services/remotetimers.h | 141 ++
services/scraper2vdr.h | 214 +++
services/weatherforecast.h | 49 +
setup.c | 219 +++
setup.h | 57 +
skindesclient-0.0.1/COPYING | 340 ++++
skindesclient-0.0.1/Makefile | 123 ++
skindesclient-0.0.1/README | 16 +
skindesclient-0.0.1/libskindesigner/services.h | 52 +
.../libskindesigner/skindesignerosdbase.c | 172 ++
.../libskindesigner/skindesignerosdbase.h | 62 +
skindesclient-0.0.1/osdmenu.c | 148 ++
skindesclient-0.0.1/skindesclient.c | 147 ++
.../plug-skindesclient-menudetail.xml | 80 +
.../plug-skindesclient-menulistmain.xml | 67 +
.../plug-skindesclient-menulistsub.xml | 67 +
skindesigner.c | 262 +++
skins/blackhole/globals.xml | 269 +++
skins/blackhole/setup.xml | 58 +
skins/blackhole/themes/default/icons/clear-day.png | Bin 0 -> 4980 bytes
.../blackhole/themes/default/icons/clear-night.png | Bin 0 -> 3115 bytes
skins/blackhole/themes/default/icons/cloudy.png | Bin 0 -> 6433 bytes
skins/blackhole/themes/default/icons/fog.png | Bin 0 -> 3652 bytes
.../themes/default/icons/ico_back_active.svg | 66 +
.../themes/default/icons/ico_back_active_x1.svg | 82 +
.../themes/default/icons/ico_back_active_x2.svg | 98 ++
.../themes/default/icons/ico_back_active_x3.svg | 114 ++
.../themes/default/icons/ico_back_inactive.svg | 66 +
.../blackhole/themes/default/icons/ico_crypted.svg | 151 ++
.../themes/default/icons/ico_cutmark_start.svg | 95 ++
.../themes/default/icons/ico_cutmark_stop.svg | 101 ++
.../blackhole/themes/default/icons/ico_cutted.svg | 48 +
skins/blackhole/themes/default/icons/ico_dolby.svg | 141 ++
.../blackhole/themes/default/icons/ico_folder.svg | 53 +
.../themes/default/icons/ico_fwd_active.svg | 66 +
.../themes/default/icons/ico_fwd_active_x1.svg | 89 +
.../themes/default/icons/ico_fwd_active_x2.svg | 105 ++
.../themes/default/icons/ico_fwd_active_x3.svg | 121 ++
.../themes/default/icons/ico_fwd_inactive.svg | 66 +
.../blackhole/themes/default/icons/ico_hd1080i.svg | 173 ++
.../blackhole/themes/default/icons/ico_hd720p.svg | 169 ++
.../blackhole/themes/default/icons/ico_new_rec.svg | 48 +
.../themes/default/icons/ico_pause_active.svg | 103 ++
.../themes/default/icons/ico_pause_inactive.svg | 103 ++
.../themes/default/icons/ico_play_active.svg | 97 ++
.../themes/default/icons/ico_play_inactive.svg | 97 ++
.../blackhole/themes/default/icons/ico_rec_on.svg | 160 ++
.../themes/default/icons/ico_recording.svg | 48 +
.../blackhole/themes/default/icons/ico_sd576i.svg | 169 ++
skins/blackhole/themes/default/icons/ico_timer.svg | 48 +
.../themes/default/icons/ico_timer_active.svg | 63 +
.../themes/default/icons/ico_timer_inactive.svg | 51 +
.../themes/default/icons/ico_videotext.svg | 154 ++
.../themes/default/icons/ico_volume_full.svg | 61 +
.../themes/default/icons/ico_volume_low.svg | 53 +
.../themes/default/icons/ico_volume_medium.svg | 57 +
.../themes/default/icons/ico_volume_mute.svg | 49 +
.../themes/default/icons/ico_widescreen.svg | 137 ++
.../themes/default/icons/partly-cloudy-day.png | Bin 0 -> 7028 bytes
.../themes/default/icons/partly-cloudy-night.png | Bin 0 -> 6409 bytes
skins/blackhole/themes/default/icons/rain.png | Bin 0 -> 6000 bytes
skins/blackhole/themes/default/icons/sleet.png | Bin 0 -> 6021 bytes
skins/blackhole/themes/default/icons/snow.png | Bin 0 -> 7660 bytes
skins/blackhole/themes/default/icons/wind.png | Bin 0 -> 2568 bytes
.../menuicons/customicons/Applikationen.png | Bin 0 -> 2073 bytes
.../themes/default/menuicons/customicons/Audio.png | Bin 0 -> 2674 bytes
.../customicons/Aufnahmen-Liste aktualisieren.png | Bin 0 -> 3550 bytes
.../menuicons/customicons/Dienstprogramme.png | Bin 0 -> 1581 bytes
.../default/menuicons/customicons/FireFox.png | Bin 0 -> 3359 bytes
.../themes/default/menuicons/customicons/Info.png | Bin 0 -> 2138 bytes
.../default/menuicons/customicons/Internet.png | Bin 0 -> 3801 bytes
.../default/menuicons/customicons/Medien.png | Bin 0 -> 3009 bytes
.../menuicons/customicons/Rechner neu starten.png | Bin 0 -> 2886 bytes
.../menuicons/customicons/Remote wakeup.png | Bin 0 -> 859 bytes
.../default/menuicons/customicons/Spiele.png | Bin 0 -> 2993 bytes
.../customicons/System herunterfahren.png | Bin 0 -> 2713 bytes
.../default/menuicons/customicons/System.png | Bin 0 -> 3227 bytes
.../themes/default/menuicons/customicons/Tools.png | Bin 0 -> 2355 bytes
.../default/menuicons/customicons/Tunderbird.png | Bin 0 -> 3544 bytes
.../USB Massenspeicher sicher entfernen.png | Bin 0 -> 2019 bytes
.../menuicons/customicons/VDR neu starten.png | Bin 0 -> 2577 bytes
.../themes/default/menuicons/customicons/Video.png | Bin 0 -> 2276 bytes
.../themes/default/menuicons/customicons/Web.png | Bin 0 -> 3930 bytes
.../themes/default/menuicons/customicons/XBMC.png | Bin 0 -> 3336 bytes
.../themes/default/menuicons/customicons/Xterm.png | Bin 0 -> 1575 bytes
.../default/menuicons/customicons/audiovideo.png | Bin 0 -> 2765 bytes
.../menuicons/customicons/markad_status.png | Bin 0 -> 2865 bytes
.../menuicons/customicons/schneiden_abbrechen.png | Bin 0 -> 3420 bytes
.../themes/default/menuicons/customicons/tux.png | Bin 0 -> 3852 bytes
.../themes/default/menuicons/customicons/usb.png | Bin 0 -> 1438 bytes
.../default/menuicons/customicons/vdrlogo.png | Bin 0 -> 12796 bytes
.../default/menuicons/customicons/yaicon_blue.png | Bin 0 -> 1931 bytes
.../themes/default/menuicons/pluginicons/admin.png | Bin 0 -> 2355 bytes
.../default/menuicons/pluginicons/arghdirector.png | Bin 0 -> 1824 bytes
.../default/menuicons/pluginicons/autostart.png | Bin 0 -> 3320 bytes
.../default/menuicons/pluginicons/avahi4vdr.png | Bin 0 -> 3734 bytes
.../default/menuicons/pluginicons/avards.png | Bin 0 -> 665 bytes
.../themes/default/menuicons/pluginicons/block.png | Bin 0 -> 1341 bytes
.../themes/default/menuicons/pluginicons/burn.png | Bin 0 -> 4233 bytes
.../default/menuicons/pluginicons/cdplayer.png | Bin 0 -> 2258 bytes
.../default/menuicons/pluginicons/chanman.png | Bin 0 -> 3224 bytes
.../themes/default/menuicons/pluginicons/check.png | Bin 0 -> 2141 bytes
.../menuicons/pluginicons/conflictcheckonly.png | Bin 0 -> 3050 bytes
.../themes/default/menuicons/pluginicons/ddci.png | Bin 0 -> 2876 bytes
.../default/menuicons/pluginicons/devstatus.png | Bin 0 -> 3159 bytes
.../default/menuicons/pluginicons/dummydevice.png | Bin 0 -> 2035 bytes
.../default/menuicons/pluginicons/duplicates.png | Bin 0 -> 2485 bytes
.../default/menuicons/pluginicons/dvbapi.png | Bin 0 -> 2869 bytes
.../default/menuicons/pluginicons/dvbhddevice.png | Bin 0 -> 3175 bytes
.../default/menuicons/pluginicons/dvbsddevice.png | Bin 0 -> 3588 bytes
.../default/menuicons/pluginicons/dynamite.png | Bin 0 -> 3973 bytes
.../themes/default/menuicons/pluginicons/eepg.png | Bin 0 -> 3590 bytes
.../default/menuicons/pluginicons/epg2vdr.png | Bin 0 -> 4051 bytes
.../default/menuicons/pluginicons/epgsearch.png | Bin 0 -> 3228 bytes
.../menuicons/pluginicons/epgsearchonly.png | Bin 0 -> 2983 bytes
.../default/menuicons/pluginicons/epgsync.png | Bin 0 -> 3518 bytes
.../menuicons/pluginicons/externalplayer.png | Bin 0 -> 2449 bytes
.../default/menuicons/pluginicons/extrecmenu.png | Bin 0 -> 2323 bytes
.../default/menuicons/pluginicons/favorites.png | Bin 0 -> 1375 bytes
.../themes/default/menuicons/pluginicons/femon.png | Bin 0 -> 3331 bytes
.../themes/default/menuicons/pluginicons/fepg.png | Bin 0 -> 2406 bytes
.../default/menuicons/pluginicons/filebrowser.png | Bin 0 -> 1463 bytes
.../default/menuicons/pluginicons/fritzbox.png | Bin 0 -> 1931 bytes
.../default/menuicons/pluginicons/graphlcd.png | Bin 0 -> 1421 bytes
.../default/menuicons/pluginicons/graphtft.png | Bin 0 -> 1421 bytes
.../themes/default/menuicons/pluginicons/image.png | Bin 0 -> 2559 bytes
.../default/menuicons/pluginicons/imonlcd.png | Bin 0 -> 1421 bytes
.../themes/default/menuicons/pluginicons/iptv.png | Bin 0 -> 2774 bytes
.../default/menuicons/pluginicons/lcdproc.png | Bin 0 -> 1421 bytes
.../default/menuicons/pluginicons/mailbox.png | Bin 0 -> 1904 bytes
.../default/menuicons/pluginicons/makemkv.png | Bin 0 -> 1941 bytes
.../default/menuicons/pluginicons/markad.png | Bin 0 -> 2865 bytes
.../themes/default/menuicons/pluginicons/mlist.png | Bin 0 -> 2505 bytes
.../themes/default/menuicons/pluginicons/music.png | Bin 0 -> 2674 bytes
.../themes/default/menuicons/pluginicons/noepg.png | Bin 0 -> 3355 bytes
.../menuicons/pluginicons/nordlichtsepg.png | Bin 0 -> 2643 bytes
.../default/menuicons/pluginicons/osdteletext.png | Bin 0 -> 1591 bytes
.../themes/default/menuicons/pluginicons/peer.png | Bin 0 -> 4175 bytes
.../themes/default/menuicons/pluginicons/play.png | Bin 0 -> 1059 bytes
.../default/menuicons/pluginicons/pvrinput.png | Bin 0 -> 1976 bytes
.../menuicons/pluginicons/quickepgsearch.png | Bin 0 -> 4781 bytes
.../themes/default/menuicons/pluginicons/radio.png | Bin 0 -> 2016 bytes
.../default/menuicons/pluginicons/remote.png | Bin 0 -> 3807 bytes
.../default/menuicons/pluginicons/remotetimers.png | Bin 0 -> 4372 bytes
.../default/menuicons/pluginicons/rssreader.png | Bin 0 -> 2620 bytes
.../themes/default/menuicons/pluginicons/sc.png | Bin 0 -> 2208 bytes
.../default/menuicons/pluginicons/scraper2vdr.png | Bin 0 -> 2726 bytes
.../default/menuicons/pluginicons/screenshot.png | Bin 0 -> 2526 bytes
.../default/menuicons/pluginicons/seduatmo.png | Bin 0 -> 2024 bytes
.../menuicons/pluginicons/skyselectfeeds.png | Bin 0 -> 2852 bytes
.../default/menuicons/pluginicons/sleeptimer.png | Bin 0 -> 4694 bytes
.../default/menuicons/pluginicons/softhddevice.png | Bin 0 -> 2410 bytes
.../menuicons/pluginicons/streamdev-server.png | Bin 0 -> 2821 bytes
.../default/menuicons/pluginicons/systeminfo.png | Bin 0 -> 1709 bytes
.../default/menuicons/pluginicons/targavfd.png | Bin 0 -> 1421 bytes
.../default/menuicons/pluginicons/trayopenng.png | Bin 0 -> 1077 bytes
.../default/menuicons/pluginicons/tvguide.png | Bin 0 -> 2129 bytes
.../default/menuicons/pluginicons/tvm2vdr.png | Bin 0 -> 2622 bytes
.../default/menuicons/pluginicons/tvscraper.png | Bin 0 -> 2726 bytes
.../default/menuicons/pluginicons/undelete.png | Bin 0 -> 2947 bytes
.../menuicons/pluginicons/weatherforecast.png | Bin 0 -> 1726 bytes
.../default/menuicons/pluginicons/weatherng.png | Bin 0 -> 1726 bytes
.../default/menuicons/pluginicons/xmltv2vdr.png | Bin 0 -> 2985 bytes
.../default/menuicons/pluginicons/yaepghg.png | Bin 0 -> 2129 bytes
.../themes/default/menuicons/standardicons/CAM.png | Bin 0 -> 1619 bytes
.../default/menuicons/standardicons/Channels.png | Bin 0 -> 3561 bytes
.../default/menuicons/standardicons/Commands.png | Bin 0 -> 2428 bytes
.../themes/default/menuicons/standardicons/DVB.png | Bin 0 -> 2758 bytes
.../themes/default/menuicons/standardicons/EPG.png | Bin 0 -> 2874 bytes
.../themes/default/menuicons/standardicons/LNB.png | Bin 0 -> 3739 bytes
.../menuicons/standardicons/Miscellaneous.png | Bin 0 -> 1576 bytes
.../themes/default/menuicons/standardicons/OSD.png | Bin 0 -> 1577 bytes
.../default/menuicons/standardicons/Plugins.png | Bin 0 -> 2230 bytes
.../default/menuicons/standardicons/Recording.png | Bin 0 -> 1115 bytes
.../default/menuicons/standardicons/Recordings.png | Bin 0 -> 3640 bytes
.../default/menuicons/standardicons/Replay.png | Bin 0 -> 1059 bytes
.../default/menuicons/standardicons/Restart.png | Bin 0 -> 2577 bytes
.../default/menuicons/standardicons/Schedule.png | Bin 0 -> 2056 bytes
.../default/menuicons/standardicons/Setup.png | Bin 0 -> 3179 bytes
.../menuicons/standardicons/StopRecording.png | Bin 0 -> 547 bytes
.../default/menuicons/standardicons/StopReplay.png | Bin 0 -> 1595 bytes
.../default/menuicons/standardicons/Timers.png | Bin 0 -> 4113 bytes
.../themes/default/skinparts/buttonblue.svg | 218 +++
.../themes/default/skinparts/buttongreen.svg | 220 +++
.../themes/default/skinparts/buttonred.svg | 215 +++
.../themes/default/skinparts/buttonyellow.svg | 203 +++
.../default/skinparts/displaychannelback.svg | 65 +
.../default/skinparts/displaychannelbackepg.svg | 286 ++++
.../default/skinparts/displaychannellogoback.svg | 184 ++
.../default/skinparts/displaymendetailback.svg | 190 +++
.../themes/default/skinparts/displaymenuback.svg | 250 +++
.../themes/default/skinparts/displaymenubacktv.svg | 348 ++++
.../themes/default/skinparts/displaymenucorner.svg | 275 +++
.../default/skinparts/displaymenucurrentback.svg | 188 ++
.../themes/default/skinparts/displaymenuheader.svg | 292 ++++
.../themes/default/skinparts/displayvolumeback.svg | 62 +
.../themes/default/skinparts/line_horizontal.svg | 90 +
.../themes/default/skinparts/line_vertical.svg | 90 +
.../themes/default/skinparts/menubutton.svg | 143 ++
.../themes/default/skinparts/menubuttonactive.svg | 139 ++
.../themes/default/skinparts/messageblue.svg | 196 +++
.../themes/default/skinparts/messagegreen.svg | 197 +++
.../themes/default/skinparts/messagered.svg | 196 +++
.../themes/default/skinparts/messageyellow.svg | 203 +++
.../themes/default/skinparts/progressbar.svg | 105 ++
.../themes/default/skinparts/progressbarback.svg | 156 ++
.../default/skinparts/progressbarback_replay.svg | 111 ++
.../skinparts/progressbarback_replay_left.svg | 116 ++
.../themes/default/skinparts/progressbarend.svg | 115 ++
.../themes/default/skinparts/scrollbar.svg | 120 ++
.../themes/default/skinparts/scrollbarback.svg | 112 ++
.../blackhole/themes/default/skinparts/tabback.svg | 242 +++
.../themes/default/skinparts/tacho_load_back.svg | 767 +++++++++
.../default/skinparts/tacho_percent_back.svg | 749 ++++++++
.../themes/default/skinparts/tacho_temp_back.svg | 640 +++++++
.../themes/default/skinparts/tachohands/load_0.svg | 181 ++
.../default/skinparts/tachohands/load_100.svg | 181 ++
.../default/skinparts/tachohands/load_1000.svg | 181 ++
.../default/skinparts/tachohands/load_1025.svg | 181 ++
.../default/skinparts/tachohands/load_1050.svg | 181 ++
.../default/skinparts/tachohands/load_1075.svg | 181 ++
.../default/skinparts/tachohands/load_1100.svg | 181 ++
.../default/skinparts/tachohands/load_1125.svg | 181 ++
.../default/skinparts/tachohands/load_1150.svg | 181 ++
.../default/skinparts/tachohands/load_1175.svg | 181 ++
.../default/skinparts/tachohands/load_1200.svg | 181 ++
.../default/skinparts/tachohands/load_1225.svg | 181 ++
.../default/skinparts/tachohands/load_125.svg | 181 ++
.../default/skinparts/tachohands/load_1250.svg | 181 ++
.../default/skinparts/tachohands/load_1275.svg | 181 ++
.../default/skinparts/tachohands/load_1300.svg | 181 ++
.../default/skinparts/tachohands/load_1325.svg | 181 ++
.../default/skinparts/tachohands/load_1350.svg | 181 ++
.../default/skinparts/tachohands/load_1375.svg | 181 ++
.../default/skinparts/tachohands/load_1400.svg | 181 ++
.../default/skinparts/tachohands/load_1425.svg | 181 ++
.../default/skinparts/tachohands/load_1450.svg | 181 ++
.../default/skinparts/tachohands/load_1475.svg | 181 ++
.../default/skinparts/tachohands/load_150.svg | 181 ++
.../default/skinparts/tachohands/load_1500.svg | 181 ++
.../default/skinparts/tachohands/load_1525.svg | 181 ++
.../default/skinparts/tachohands/load_1550.svg | 181 ++
.../default/skinparts/tachohands/load_1575.svg | 181 ++
.../default/skinparts/tachohands/load_1600.svg | 181 ++
.../default/skinparts/tachohands/load_1625.svg | 181 ++
.../default/skinparts/tachohands/load_1650.svg | 181 ++
.../default/skinparts/tachohands/load_1675.svg | 181 ++
.../default/skinparts/tachohands/load_1700.svg | 181 ++
.../default/skinparts/tachohands/load_1725.svg | 181 ++
.../default/skinparts/tachohands/load_175.svg | 181 ++
.../default/skinparts/tachohands/load_1750.svg | 181 ++
.../default/skinparts/tachohands/load_1775.svg | 181 ++
.../default/skinparts/tachohands/load_1800.svg | 181 ++
.../default/skinparts/tachohands/load_1825.svg | 181 ++
.../default/skinparts/tachohands/load_1850.svg | 181 ++
.../default/skinparts/tachohands/load_1875.svg | 181 ++
.../default/skinparts/tachohands/load_1900.svg | 181 ++
.../default/skinparts/tachohands/load_1925.svg | 181 ++
.../default/skinparts/tachohands/load_1950.svg | 181 ++
.../default/skinparts/tachohands/load_1975.svg | 181 ++
.../default/skinparts/tachohands/load_200.svg | 181 ++
.../default/skinparts/tachohands/load_2000.svg | 181 ++
.../default/skinparts/tachohands/load_2025.svg | 181 ++
.../default/skinparts/tachohands/load_2050.svg | 181 ++
.../default/skinparts/tachohands/load_2075.svg | 181 ++
.../default/skinparts/tachohands/load_2100.svg | 181 ++
.../default/skinparts/tachohands/load_2125.svg | 181 ++
.../default/skinparts/tachohands/load_2150.svg | 181 ++
.../default/skinparts/tachohands/load_2175.svg | 181 ++
.../default/skinparts/tachohands/load_2200.svg | 181 ++
.../default/skinparts/tachohands/load_2225.svg | 181 ++
.../default/skinparts/tachohands/load_225.svg | 181 ++
.../default/skinparts/tachohands/load_2250.svg | 181 ++
.../default/skinparts/tachohands/load_2275.svg | 181 ++
.../default/skinparts/tachohands/load_2300.svg | 181 ++
.../default/skinparts/tachohands/load_2325.svg | 181 ++
.../default/skinparts/tachohands/load_2350.svg | 181 ++
.../default/skinparts/tachohands/load_2375.svg | 181 ++
.../default/skinparts/tachohands/load_2400.svg | 181 ++
.../default/skinparts/tachohands/load_2425.svg | 181 ++
.../default/skinparts/tachohands/load_2450.svg | 181 ++
.../default/skinparts/tachohands/load_2475.svg | 181 ++
.../default/skinparts/tachohands/load_25.svg | 181 ++
.../default/skinparts/tachohands/load_250.svg | 181 ++
.../default/skinparts/tachohands/load_2500.svg | 181 ++
.../default/skinparts/tachohands/load_2525.svg | 181 ++
.../default/skinparts/tachohands/load_275.svg | 181 ++
.../default/skinparts/tachohands/load_300.svg | 181 ++
.../default/skinparts/tachohands/load_325.svg | 181 ++
.../default/skinparts/tachohands/load_350.svg | 181 ++
.../default/skinparts/tachohands/load_375.svg | 181 ++
.../default/skinparts/tachohands/load_400.svg | 181 ++
.../default/skinparts/tachohands/load_425.svg | 181 ++
.../default/skinparts/tachohands/load_450.svg | 181 ++
.../default/skinparts/tachohands/load_475.svg | 181 ++
.../default/skinparts/tachohands/load_50.svg | 181 ++
.../default/skinparts/tachohands/load_500.svg | 181 ++
.../default/skinparts/tachohands/load_525.svg | 181 ++
.../default/skinparts/tachohands/load_550.svg | 181 ++
.../default/skinparts/tachohands/load_575.svg | 181 ++
.../default/skinparts/tachohands/load_600.svg | 181 ++
.../default/skinparts/tachohands/load_625.svg | 181 ++
.../default/skinparts/tachohands/load_650.svg | 181 ++
.../default/skinparts/tachohands/load_675.svg | 181 ++
.../default/skinparts/tachohands/load_700.svg | 181 ++
.../default/skinparts/tachohands/load_725.svg | 181 ++
.../default/skinparts/tachohands/load_75.svg | 181 ++
.../default/skinparts/tachohands/load_750.svg | 181 ++
.../default/skinparts/tachohands/load_775.svg | 181 ++
.../default/skinparts/tachohands/load_800.svg | 181 ++
.../default/skinparts/tachohands/load_825.svg | 181 ++
.../default/skinparts/tachohands/load_850.svg | 181 ++
.../default/skinparts/tachohands/load_875.svg | 181 ++
.../default/skinparts/tachohands/load_900.svg | 181 ++
.../default/skinparts/tachohands/load_925.svg | 181 ++
.../default/skinparts/tachohands/load_950.svg | 181 ++
.../default/skinparts/tachohands/load_975.svg | 181 ++
.../themes/default/skinparts/tachohands/perc_0.svg | 94 +
.../themes/default/skinparts/tachohands/perc_1.svg | 94 +
.../default/skinparts/tachohands/perc_10.svg | 94 +
.../default/skinparts/tachohands/perc_100.svg | 94 +
.../default/skinparts/tachohands/perc_11.svg | 94 +
.../default/skinparts/tachohands/perc_12.svg | 94 +
.../default/skinparts/tachohands/perc_13.svg | 94 +
.../default/skinparts/tachohands/perc_14.svg | 94 +
.../default/skinparts/tachohands/perc_15.svg | 94 +
.../default/skinparts/tachohands/perc_16.svg | 94 +
.../default/skinparts/tachohands/perc_17.svg | 94 +
.../default/skinparts/tachohands/perc_18.svg | 94 +
.../default/skinparts/tachohands/perc_19.svg | 94 +
.../themes/default/skinparts/tachohands/perc_2.svg | 94 +
.../default/skinparts/tachohands/perc_20.svg | 94 +
.../default/skinparts/tachohands/perc_21.svg | 94 +
.../default/skinparts/tachohands/perc_22.svg | 94 +
.../default/skinparts/tachohands/perc_23.svg | 94 +
.../default/skinparts/tachohands/perc_24.svg | 94 +
.../default/skinparts/tachohands/perc_25.svg | 94 +
.../default/skinparts/tachohands/perc_26.svg | 94 +
.../default/skinparts/tachohands/perc_27.svg | 94 +
.../default/skinparts/tachohands/perc_28.svg | 94 +
.../default/skinparts/tachohands/perc_29.svg | 94 +
.../themes/default/skinparts/tachohands/perc_3.svg | 94 +
.../default/skinparts/tachohands/perc_30.svg | 94 +
.../default/skinparts/tachohands/perc_31.svg | 94 +
.../default/skinparts/tachohands/perc_32.svg | 94 +
.../default/skinparts/tachohands/perc_33.svg | 94 +
.../default/skinparts/tachohands/perc_34.svg | 94 +
.../default/skinparts/tachohands/perc_35.svg | 94 +
.../default/skinparts/tachohands/perc_36.svg | 94 +
.../default/skinparts/tachohands/perc_37.svg | 94 +
.../default/skinparts/tachohands/perc_38.svg | 94 +
.../default/skinparts/tachohands/perc_39.svg | 94 +
.../themes/default/skinparts/tachohands/perc_4.svg | 94 +
.../default/skinparts/tachohands/perc_40.svg | 94 +
.../default/skinparts/tachohands/perc_41.svg | 94 +
.../default/skinparts/tachohands/perc_42.svg | 94 +
.../default/skinparts/tachohands/perc_43.svg | 94 +
.../default/skinparts/tachohands/perc_44.svg | 94 +
.../default/skinparts/tachohands/perc_45.svg | 94 +
.../default/skinparts/tachohands/perc_46.svg | 94 +
.../default/skinparts/tachohands/perc_47.svg | 94 +
.../default/skinparts/tachohands/perc_48.svg | 94 +
.../default/skinparts/tachohands/perc_49.svg | 94 +
.../themes/default/skinparts/tachohands/perc_5.svg | 94 +
.../default/skinparts/tachohands/perc_50.svg | 94 +
.../default/skinparts/tachohands/perc_51.svg | 94 +
.../default/skinparts/tachohands/perc_52.svg | 94 +
.../default/skinparts/tachohands/perc_53.svg | 94 +
.../default/skinparts/tachohands/perc_54.svg | 94 +
.../default/skinparts/tachohands/perc_55.svg | 94 +
.../default/skinparts/tachohands/perc_56.svg | 94 +
.../default/skinparts/tachohands/perc_57.svg | 94 +
.../default/skinparts/tachohands/perc_58.svg | 94 +
.../default/skinparts/tachohands/perc_59.svg | 94 +
.../themes/default/skinparts/tachohands/perc_6.svg | 94 +
.../default/skinparts/tachohands/perc_60.svg | 94 +
.../default/skinparts/tachohands/perc_61.svg | 94 +
.../default/skinparts/tachohands/perc_62.svg | 94 +
.../default/skinparts/tachohands/perc_63.svg | 94 +
.../default/skinparts/tachohands/perc_64.svg | 94 +
.../default/skinparts/tachohands/perc_65.svg | 94 +
.../default/skinparts/tachohands/perc_66.svg | 94 +
.../default/skinparts/tachohands/perc_67.svg | 94 +
.../default/skinparts/tachohands/perc_68.svg | 94 +
.../default/skinparts/tachohands/perc_69.svg | 94 +
.../themes/default/skinparts/tachohands/perc_7.svg | 94 +
.../default/skinparts/tachohands/perc_70.svg | 94 +
.../default/skinparts/tachohands/perc_71.svg | 94 +
.../default/skinparts/tachohands/perc_72.svg | 94 +
.../default/skinparts/tachohands/perc_73.svg | 94 +
.../default/skinparts/tachohands/perc_74.svg | 94 +
.../default/skinparts/tachohands/perc_75.svg | 94 +
.../default/skinparts/tachohands/perc_76.svg | 94 +
.../default/skinparts/tachohands/perc_77.svg | 94 +
.../default/skinparts/tachohands/perc_78.svg | 94 +
.../default/skinparts/tachohands/perc_79.svg | 94 +
.../themes/default/skinparts/tachohands/perc_8.svg | 94 +
.../default/skinparts/tachohands/perc_80.svg | 94 +
.../default/skinparts/tachohands/perc_81.svg | 94 +
.../default/skinparts/tachohands/perc_82.svg | 94 +
.../default/skinparts/tachohands/perc_83.svg | 94 +
.../default/skinparts/tachohands/perc_84.svg | 94 +
.../default/skinparts/tachohands/perc_85.svg | 94 +
.../default/skinparts/tachohands/perc_86.svg | 94 +
.../default/skinparts/tachohands/perc_87.svg | 94 +
.../default/skinparts/tachohands/perc_88.svg | 94 +
.../default/skinparts/tachohands/perc_89.svg | 94 +
.../themes/default/skinparts/tachohands/perc_9.svg | 94 +
.../default/skinparts/tachohands/perc_90.svg | 94 +
.../default/skinparts/tachohands/perc_91.svg | 94 +
.../default/skinparts/tachohands/perc_92.svg | 94 +
.../default/skinparts/tachohands/perc_93.svg | 94 +
.../default/skinparts/tachohands/perc_94.svg | 94 +
.../default/skinparts/tachohands/perc_95.svg | 94 +
.../default/skinparts/tachohands/perc_96.svg | 94 +
.../default/skinparts/tachohands/perc_97.svg | 94 +
.../default/skinparts/tachohands/perc_98.svg | 94 +
.../default/skinparts/tachohands/perc_99.svg | 94 +
.../themes/default/skinparts/tachohands/temp_0.svg | 82 +
.../themes/default/skinparts/tachohands/temp_1.svg | 82 +
.../default/skinparts/tachohands/temp_10.svg | 82 +
.../default/skinparts/tachohands/temp_11.svg | 82 +
.../default/skinparts/tachohands/temp_12.svg | 82 +
.../default/skinparts/tachohands/temp_13.svg | 82 +
.../default/skinparts/tachohands/temp_14.svg | 82 +
.../default/skinparts/tachohands/temp_15.svg | 82 +
.../default/skinparts/tachohands/temp_16.svg | 82 +
.../default/skinparts/tachohands/temp_17.svg | 82 +
.../default/skinparts/tachohands/temp_18.svg | 82 +
.../default/skinparts/tachohands/temp_19.svg | 82 +
.../themes/default/skinparts/tachohands/temp_2.svg | 82 +
.../default/skinparts/tachohands/temp_20.svg | 82 +
.../default/skinparts/tachohands/temp_21.svg | 82 +
.../default/skinparts/tachohands/temp_22.svg | 82 +
.../default/skinparts/tachohands/temp_23.svg | 82 +
.../default/skinparts/tachohands/temp_24.svg | 82 +
.../default/skinparts/tachohands/temp_25.svg | 82 +
.../default/skinparts/tachohands/temp_26.svg | 82 +
.../default/skinparts/tachohands/temp_27.svg | 82 +
.../default/skinparts/tachohands/temp_28.svg | 82 +
.../default/skinparts/tachohands/temp_29.svg | 82 +
.../themes/default/skinparts/tachohands/temp_3.svg | 82 +
.../default/skinparts/tachohands/temp_30.svg | 82 +
.../default/skinparts/tachohands/temp_31.svg | 82 +
.../default/skinparts/tachohands/temp_32.svg | 82 +
.../default/skinparts/tachohands/temp_33.svg | 82 +
.../default/skinparts/tachohands/temp_34.svg | 82 +
.../default/skinparts/tachohands/temp_35.svg | 82 +
.../default/skinparts/tachohands/temp_36.svg | 82 +
.../default/skinparts/tachohands/temp_37.svg | 82 +
.../default/skinparts/tachohands/temp_38.svg | 82 +
.../default/skinparts/tachohands/temp_39.svg | 82 +
.../themes/default/skinparts/tachohands/temp_4.svg | 82 +
.../default/skinparts/tachohands/temp_40.svg | 82 +
.../default/skinparts/tachohands/temp_41.svg | 82 +
.../default/skinparts/tachohands/temp_42.svg | 82 +
.../default/skinparts/tachohands/temp_43.svg | 82 +
.../default/skinparts/tachohands/temp_44.svg | 82 +
.../default/skinparts/tachohands/temp_45.svg | 82 +
.../default/skinparts/tachohands/temp_46.svg | 82 +
.../default/skinparts/tachohands/temp_47.svg | 82 +
.../default/skinparts/tachohands/temp_48.svg | 82 +
.../default/skinparts/tachohands/temp_49.svg | 82 +
.../themes/default/skinparts/tachohands/temp_5.svg | 82 +
.../default/skinparts/tachohands/temp_50.svg | 82 +
.../default/skinparts/tachohands/temp_51.svg | 82 +
.../default/skinparts/tachohands/temp_52.svg | 82 +
.../default/skinparts/tachohands/temp_53.svg | 82 +
.../default/skinparts/tachohands/temp_54.svg | 82 +
.../default/skinparts/tachohands/temp_55.svg | 82 +
.../default/skinparts/tachohands/temp_56.svg | 82 +
.../default/skinparts/tachohands/temp_57.svg | 82 +
.../default/skinparts/tachohands/temp_58.svg | 82 +
.../default/skinparts/tachohands/temp_59.svg | 82 +
.../themes/default/skinparts/tachohands/temp_6.svg | 82 +
.../default/skinparts/tachohands/temp_60.svg | 82 +
.../default/skinparts/tachohands/temp_61.svg | 82 +
.../default/skinparts/tachohands/temp_62.svg | 82 +
.../default/skinparts/tachohands/temp_63.svg | 82 +
.../default/skinparts/tachohands/temp_64.svg | 82 +
.../default/skinparts/tachohands/temp_65.svg | 82 +
.../default/skinparts/tachohands/temp_66.svg | 82 +
.../default/skinparts/tachohands/temp_67.svg | 82 +
.../default/skinparts/tachohands/temp_68.svg | 82 +
.../default/skinparts/tachohands/temp_69.svg | 82 +
.../themes/default/skinparts/tachohands/temp_7.svg | 82 +
.../default/skinparts/tachohands/temp_70.svg | 81 +
.../default/skinparts/tachohands/temp_71.svg | 82 +
.../default/skinparts/tachohands/temp_72.svg | 82 +
.../default/skinparts/tachohands/temp_73.svg | 82 +
.../default/skinparts/tachohands/temp_74.svg | 82 +
.../default/skinparts/tachohands/temp_75.svg | 82 +
.../default/skinparts/tachohands/temp_76.svg | 82 +
.../default/skinparts/tachohands/temp_77.svg | 82 +
.../default/skinparts/tachohands/temp_78.svg | 82 +
.../default/skinparts/tachohands/temp_79.svg | 82 +
.../themes/default/skinparts/tachohands/temp_8.svg | 82 +
.../default/skinparts/tachohands/temp_80.svg | 82 +
.../default/skinparts/tachohands/temp_81.svg | 82 +
.../themes/default/skinparts/tachohands/temp_9.svg | 82 +
.../themes/default/skinparts/tachos_back.svg | 162 ++
.../themes/default/skinparts/watchback.svg | 950 +++++++++++
.../themes/default/skinparts/watchhands/h_0.svg | 68 +
.../themes/default/skinparts/watchhands/h_1.svg | 69 +
.../themes/default/skinparts/watchhands/h_10.svg | 69 +
.../themes/default/skinparts/watchhands/h_11.svg | 69 +
.../themes/default/skinparts/watchhands/h_12.svg | 69 +
.../themes/default/skinparts/watchhands/h_13.svg | 69 +
.../themes/default/skinparts/watchhands/h_14.svg | 69 +
.../themes/default/skinparts/watchhands/h_15.svg | 69 +
.../themes/default/skinparts/watchhands/h_16.svg | 69 +
.../themes/default/skinparts/watchhands/h_17.svg | 69 +
.../themes/default/skinparts/watchhands/h_18.svg | 69 +
.../themes/default/skinparts/watchhands/h_19.svg | 69 +
.../themes/default/skinparts/watchhands/h_2.svg | 69 +
.../themes/default/skinparts/watchhands/h_20.svg | 69 +
.../themes/default/skinparts/watchhands/h_21.svg | 69 +
.../themes/default/skinparts/watchhands/h_22.svg | 69 +
.../themes/default/skinparts/watchhands/h_23.svg | 69 +
.../themes/default/skinparts/watchhands/h_24.svg | 69 +
.../themes/default/skinparts/watchhands/h_25.svg | 69 +
.../themes/default/skinparts/watchhands/h_26.svg | 69 +
.../themes/default/skinparts/watchhands/h_27.svg | 69 +
.../themes/default/skinparts/watchhands/h_28.svg | 69 +
.../themes/default/skinparts/watchhands/h_29.svg | 69 +
.../themes/default/skinparts/watchhands/h_3.svg | 69 +
.../themes/default/skinparts/watchhands/h_30.svg | 69 +
.../themes/default/skinparts/watchhands/h_31.svg | 69 +
.../themes/default/skinparts/watchhands/h_32.svg | 69 +
.../themes/default/skinparts/watchhands/h_33.svg | 69 +
.../themes/default/skinparts/watchhands/h_34.svg | 69 +
.../themes/default/skinparts/watchhands/h_35.svg | 69 +
.../themes/default/skinparts/watchhands/h_36.svg | 69 +
.../themes/default/skinparts/watchhands/h_37.svg | 69 +
.../themes/default/skinparts/watchhands/h_38.svg | 69 +
.../themes/default/skinparts/watchhands/h_39.svg | 69 +
.../themes/default/skinparts/watchhands/h_4.svg | 69 +
.../themes/default/skinparts/watchhands/h_40.svg | 69 +
.../themes/default/skinparts/watchhands/h_41.svg | 69 +
.../themes/default/skinparts/watchhands/h_42.svg | 69 +
.../themes/default/skinparts/watchhands/h_43.svg | 69 +
.../themes/default/skinparts/watchhands/h_44.svg | 69 +
.../themes/default/skinparts/watchhands/h_45.svg | 69 +
.../themes/default/skinparts/watchhands/h_46.svg | 69 +
.../themes/default/skinparts/watchhands/h_47.svg | 69 +
.../themes/default/skinparts/watchhands/h_48.svg | 69 +
.../themes/default/skinparts/watchhands/h_49.svg | 69 +
.../themes/default/skinparts/watchhands/h_5.svg | 69 +
.../themes/default/skinparts/watchhands/h_50.svg | 69 +
.../themes/default/skinparts/watchhands/h_51.svg | 69 +
.../themes/default/skinparts/watchhands/h_52.svg | 69 +
.../themes/default/skinparts/watchhands/h_53.svg | 69 +
.../themes/default/skinparts/watchhands/h_54.svg | 69 +
.../themes/default/skinparts/watchhands/h_55.svg | 69 +
.../themes/default/skinparts/watchhands/h_56.svg | 69 +
.../themes/default/skinparts/watchhands/h_57.svg | 69 +
.../themes/default/skinparts/watchhands/h_58.svg | 69 +
.../themes/default/skinparts/watchhands/h_59.svg | 69 +
.../themes/default/skinparts/watchhands/h_6.svg | 69 +
.../themes/default/skinparts/watchhands/h_7.svg | 69 +
.../themes/default/skinparts/watchhands/h_8.svg | 69 +
.../themes/default/skinparts/watchhands/h_9.svg | 69 +
.../themes/default/skinparts/watchhands/m_0.svg | 68 +
.../themes/default/skinparts/watchhands/m_1.svg | 69 +
.../themes/default/skinparts/watchhands/m_10.svg | 69 +
.../themes/default/skinparts/watchhands/m_11.svg | 69 +
.../themes/default/skinparts/watchhands/m_12.svg | 69 +
.../themes/default/skinparts/watchhands/m_13.svg | 69 +
.../themes/default/skinparts/watchhands/m_14.svg | 69 +
.../themes/default/skinparts/watchhands/m_15.svg | 69 +
.../themes/default/skinparts/watchhands/m_16.svg | 69 +
.../themes/default/skinparts/watchhands/m_17.svg | 69 +
.../themes/default/skinparts/watchhands/m_18.svg | 69 +
.../themes/default/skinparts/watchhands/m_19.svg | 69 +
.../themes/default/skinparts/watchhands/m_2.svg | 69 +
.../themes/default/skinparts/watchhands/m_20.svg | 69 +
.../themes/default/skinparts/watchhands/m_21.svg | 69 +
.../themes/default/skinparts/watchhands/m_22.svg | 69 +
.../themes/default/skinparts/watchhands/m_23.svg | 69 +
.../themes/default/skinparts/watchhands/m_24.svg | 69 +
.../themes/default/skinparts/watchhands/m_25.svg | 69 +
.../themes/default/skinparts/watchhands/m_26.svg | 69 +
.../themes/default/skinparts/watchhands/m_27.svg | 69 +
.../themes/default/skinparts/watchhands/m_28.svg | 69 +
.../themes/default/skinparts/watchhands/m_29.svg | 69 +
.../themes/default/skinparts/watchhands/m_3.svg | 69 +
.../themes/default/skinparts/watchhands/m_30.svg | 69 +
.../themes/default/skinparts/watchhands/m_31.svg | 69 +
.../themes/default/skinparts/watchhands/m_32.svg | 69 +
.../themes/default/skinparts/watchhands/m_33.svg | 69 +
.../themes/default/skinparts/watchhands/m_34.svg | 69 +
.../themes/default/skinparts/watchhands/m_35.svg | 69 +
.../themes/default/skinparts/watchhands/m_36.svg | 69 +
.../themes/default/skinparts/watchhands/m_37.svg | 69 +
.../themes/default/skinparts/watchhands/m_38.svg | 69 +
.../themes/default/skinparts/watchhands/m_39.svg | 69 +
.../themes/default/skinparts/watchhands/m_4.svg | 69 +
.../themes/default/skinparts/watchhands/m_40.svg | 69 +
.../themes/default/skinparts/watchhands/m_41.svg | 69 +
.../themes/default/skinparts/watchhands/m_42.svg | 69 +
.../themes/default/skinparts/watchhands/m_43.svg | 69 +
.../themes/default/skinparts/watchhands/m_44.svg | 69 +
.../themes/default/skinparts/watchhands/m_45.svg | 69 +
.../themes/default/skinparts/watchhands/m_46.svg | 69 +
.../themes/default/skinparts/watchhands/m_47.svg | 69 +
.../themes/default/skinparts/watchhands/m_48.svg | 69 +
.../themes/default/skinparts/watchhands/m_49.svg | 69 +
.../themes/default/skinparts/watchhands/m_5.svg | 69 +
.../themes/default/skinparts/watchhands/m_50.svg | 69 +
.../themes/default/skinparts/watchhands/m_51.svg | 69 +
.../themes/default/skinparts/watchhands/m_52.svg | 69 +
.../themes/default/skinparts/watchhands/m_53.svg | 69 +
.../themes/default/skinparts/watchhands/m_54.svg | 69 +
.../themes/default/skinparts/watchhands/m_55.svg | 69 +
.../themes/default/skinparts/watchhands/m_56.svg | 69 +
.../themes/default/skinparts/watchhands/m_57.svg | 69 +
.../themes/default/skinparts/watchhands/m_58.svg | 69 +
.../themes/default/skinparts/watchhands/m_59.svg | 69 +
.../themes/default/skinparts/watchhands/m_6.svg | 69 +
.../themes/default/skinparts/watchhands/m_7.svg | 69 +
.../themes/default/skinparts/watchhands/m_8.svg | 69 +
.../themes/default/skinparts/watchhands/m_9.svg | 69 +
.../themes/default/skinparts/watchhands/s_0.svg | 69 +
.../themes/default/skinparts/watchhands/s_1.svg | 69 +
.../themes/default/skinparts/watchhands/s_10.svg | 69 +
.../themes/default/skinparts/watchhands/s_11.svg | 69 +
.../themes/default/skinparts/watchhands/s_12.svg | 69 +
.../themes/default/skinparts/watchhands/s_13.svg | 69 +
.../themes/default/skinparts/watchhands/s_14.svg | 69 +
.../themes/default/skinparts/watchhands/s_15.svg | 69 +
.../themes/default/skinparts/watchhands/s_16.svg | 69 +
.../themes/default/skinparts/watchhands/s_17.svg | 69 +
.../themes/default/skinparts/watchhands/s_18.svg | 69 +
.../themes/default/skinparts/watchhands/s_19.svg | 69 +
.../themes/default/skinparts/watchhands/s_2.svg | 69 +
.../themes/default/skinparts/watchhands/s_20.svg | 69 +
.../themes/default/skinparts/watchhands/s_21.svg | 69 +
.../themes/default/skinparts/watchhands/s_22.svg | 69 +
.../themes/default/skinparts/watchhands/s_23.svg | 69 +
.../themes/default/skinparts/watchhands/s_24.svg | 69 +
.../themes/default/skinparts/watchhands/s_25.svg | 69 +
.../themes/default/skinparts/watchhands/s_26.svg | 69 +
.../themes/default/skinparts/watchhands/s_27.svg | 69 +
.../themes/default/skinparts/watchhands/s_28.svg | 69 +
.../themes/default/skinparts/watchhands/s_29.svg | 69 +
.../themes/default/skinparts/watchhands/s_3.svg | 69 +
.../themes/default/skinparts/watchhands/s_30.svg | 69 +
.../themes/default/skinparts/watchhands/s_31.svg | 69 +
.../themes/default/skinparts/watchhands/s_32.svg | 69 +
.../themes/default/skinparts/watchhands/s_33.svg | 69 +
.../themes/default/skinparts/watchhands/s_34.svg | 69 +
.../themes/default/skinparts/watchhands/s_35.svg | 69 +
.../themes/default/skinparts/watchhands/s_36.svg | 69 +
.../themes/default/skinparts/watchhands/s_37.svg | 69 +
.../themes/default/skinparts/watchhands/s_38.svg | 69 +
.../themes/default/skinparts/watchhands/s_39.svg | 69 +
.../themes/default/skinparts/watchhands/s_4.svg | 69 +
.../themes/default/skinparts/watchhands/s_40.svg | 69 +
.../themes/default/skinparts/watchhands/s_41.svg | 69 +
.../themes/default/skinparts/watchhands/s_42.svg | 69 +
.../themes/default/skinparts/watchhands/s_43.svg | 69 +
.../themes/default/skinparts/watchhands/s_44.svg | 69 +
.../themes/default/skinparts/watchhands/s_45.svg | 69 +
.../themes/default/skinparts/watchhands/s_46.svg | 69 +
.../themes/default/skinparts/watchhands/s_47.svg | 69 +
.../themes/default/skinparts/watchhands/s_48.svg | 69 +
.../themes/default/skinparts/watchhands/s_49.svg | 69 +
.../themes/default/skinparts/watchhands/s_5.svg | 69 +
.../themes/default/skinparts/watchhands/s_50.svg | 69 +
.../themes/default/skinparts/watchhands/s_51.svg | 69 +
.../themes/default/skinparts/watchhands/s_52.svg | 69 +
.../themes/default/skinparts/watchhands/s_53.svg | 69 +
.../themes/default/skinparts/watchhands/s_54.svg | 69 +
.../themes/default/skinparts/watchhands/s_55.svg | 69 +
.../themes/default/skinparts/watchhands/s_56.svg | 69 +
.../themes/default/skinparts/watchhands/s_57.svg | 69 +
.../themes/default/skinparts/watchhands/s_58.svg | 69 +
.../themes/default/skinparts/watchhands/s_59.svg | 69 +
.../themes/default/skinparts/watchhands/s_6.svg | 69 +
.../themes/default/skinparts/watchhands/s_7.svg | 69 +
.../themes/default/skinparts/watchhands/s_8.svg | 69 +
.../themes/default/skinparts/watchhands/s_9.svg | 69 +
skins/blackhole/themes/default/theme.xml | 46 +
skins/blackhole/xmlfiles/displayaudiotracks.xml | 43 +
skins/blackhole/xmlfiles/displaychannel.xml | 298 ++++
skins/blackhole/xmlfiles/displaymenu.xml | 241 +++
skins/blackhole/xmlfiles/displaymenuchannels.xml | 123 ++
skins/blackhole/xmlfiles/displaymenudefault.xml | 75 +
skins/blackhole/xmlfiles/displaymenudetailepg.xml | 301 ++++
.../xmlfiles/displaymenudetailrecording.xml | 263 +++
skins/blackhole/xmlfiles/displaymenudetailtext.xml | 37 +
skins/blackhole/xmlfiles/displaymenumain.xml | 228 +++
skins/blackhole/xmlfiles/displaymenurecordings.xml | 120 ++
skins/blackhole/xmlfiles/displaymenuschedules.xml | 265 +++
skins/blackhole/xmlfiles/displaymenusetup.xml | 51 +
skins/blackhole/xmlfiles/displaymenutimers.xml | 117 ++
skins/blackhole/xmlfiles/displaymessage.xml | 28 +
skins/blackhole/xmlfiles/displayreplay.xml | 379 +++++
skins/blackhole/xmlfiles/displayvolume.xml | 36 +
.../plug-weatherforecast-weatherforecast.xml | 129 ++
...eatherforecast-weatherforecastdetailcurrent.xml | 70 +
...-weatherforecast-weatherforecastdetaildaily.xml | 69 +
...weatherforecast-weatherforecastdetailhourly.xml | 66 +
skins/metrixhd/globals.xml | 277 +++
skins/metrixhd/setup.xml | 22 +
skins/metrixhd/themes/default/icons/clear-day.png | Bin 0 -> 4980 bytes
.../metrixhd/themes/default/icons/clear-night.png | Bin 0 -> 3115 bytes
skins/metrixhd/themes/default/icons/cloudy.png | Bin 0 -> 6433 bytes
skins/metrixhd/themes/default/icons/fog.png | Bin 0 -> 3652 bytes
skins/metrixhd/themes/default/icons/ico_ac3.png | Bin 0 -> 2684 bytes
.../themes/default/icons/ico_activetimer.png | Bin 0 -> 1731 bytes
.../themes/default/icons/ico_channelsep.png | Bin 0 -> 958 bytes
.../themes/default/icons/ico_crypt_off.png | Bin 0 -> 386 bytes
.../metrixhd/themes/default/icons/ico_crypt_on.png | Bin 0 -> 369 bytes
skins/metrixhd/themes/default/icons/ico_cutted.png | Bin 0 -> 2007 bytes
.../themes/default/icons/ico_discusage.png | Bin 0 -> 4404 bytes
.../themes/default/icons/ico_dolby_off.png | Bin 0 -> 458 bytes
.../metrixhd/themes/default/icons/ico_dolby_on.png | Bin 0 -> 413 bytes
skins/metrixhd/themes/default/icons/ico_ff.png | Bin 0 -> 4572 bytes
skins/metrixhd/themes/default/icons/ico_ff_1x.png | Bin 0 -> 5264 bytes
skins/metrixhd/themes/default/icons/ico_ff_2x.png | Bin 0 -> 5564 bytes
skins/metrixhd/themes/default/icons/ico_ff_3x.png | Bin 0 -> 5639 bytes
skins/metrixhd/themes/default/icons/ico_ff_off.png | Bin 0 -> 3265 bytes
skins/metrixhd/themes/default/icons/ico_hd_off.png | Bin 0 -> 1603 bytes
skins/metrixhd/themes/default/icons/ico_hd_off.svg | 64 +
skins/metrixhd/themes/default/icons/ico_hd_on.png | Bin 0 -> 1904 bytes
skins/metrixhd/themes/default/icons/ico_hd_on.svg | 64 +
.../metrixhd/themes/default/icons/ico_line_off.png | Bin 0 -> 147 bytes
.../metrixhd/themes/default/icons/ico_line_on.png | Bin 0 -> 958 bytes
skins/metrixhd/themes/default/icons/ico_mute.png | Bin 0 -> 3075 bytes
skins/metrixhd/themes/default/icons/ico_pause.png | Bin 0 -> 1558 bytes
.../themes/default/icons/ico_pause_off.png | Bin 0 -> 1191 bytes
skins/metrixhd/themes/default/icons/ico_play.png | Bin 0 -> 3481 bytes
.../metrixhd/themes/default/icons/ico_play_off.png | Bin 0 -> 2505 bytes
.../metrixhd/themes/default/icons/ico_rec_off.png | Bin 0 -> 788 bytes
skins/metrixhd/themes/default/icons/ico_rec_on.png | Bin 0 -> 1111 bytes
.../themes/default/icons/ico_recfolder.png | Bin 0 -> 2423 bytes
skins/metrixhd/themes/default/icons/ico_recnew.png | Bin 0 -> 2815 bytes
skins/metrixhd/themes/default/icons/ico_rew.png | Bin 0 -> 4515 bytes
skins/metrixhd/themes/default/icons/ico_rew_1x.png | Bin 0 -> 5201 bytes
skins/metrixhd/themes/default/icons/ico_rew_2x.png | Bin 0 -> 5508 bytes
skins/metrixhd/themes/default/icons/ico_rew_3x.png | Bin 0 -> 5582 bytes
.../metrixhd/themes/default/icons/ico_rew_off.png | Bin 0 -> 3373 bytes
skins/metrixhd/themes/default/icons/ico_stereo.png | Bin 0 -> 4433 bytes
.../themes/default/icons/ico_timer_active.png | Bin 0 -> 3297 bytes
.../themes/default/icons/ico_timer_inactive.png | Bin 0 -> 1527 bytes
.../themes/default/icons/ico_timer_recording.png | Bin 0 -> 531 bytes
.../metrixhd/themes/default/icons/ico_txt_off.png | Bin 0 -> 346 bytes
skins/metrixhd/themes/default/icons/ico_txt_on.png | Bin 0 -> 349 bytes
skins/metrixhd/themes/default/icons/ico_volume.png | Bin 0 -> 7443 bytes
.../themes/default/icons/ico_widescreen_off.png | Bin 0 -> 861 bytes
.../themes/default/icons/ico_widescreen_off.svg | 58 +
.../themes/default/icons/ico_widescreen_on.png | Bin 0 -> 1072 bytes
.../themes/default/icons/ico_widescreen_on.svg | 58 +
.../themes/default/icons/partly-cloudy-day.png | Bin 0 -> 7028 bytes
.../themes/default/icons/partly-cloudy-night.png | Bin 0 -> 6409 bytes
skins/metrixhd/themes/default/icons/rain.png | Bin 0 -> 6000 bytes
skins/metrixhd/themes/default/icons/sleet.png | Bin 0 -> 6021 bytes
skins/metrixhd/themes/default/icons/snow.png | Bin 0 -> 7660 bytes
skins/metrixhd/themes/default/icons/wind.png | Bin 0 -> 2568 bytes
.../menuicons/customicons/Applikationen.png | Bin 0 -> 2073 bytes
.../themes/default/menuicons/customicons/Audio.png | Bin 0 -> 2674 bytes
.../customicons/Aufnahmen-Liste aktualisieren.png | Bin 0 -> 3550 bytes
.../menuicons/customicons/Dienstprogramme.png | Bin 0 -> 1581 bytes
.../default/menuicons/customicons/FireFox.png | Bin 0 -> 3359 bytes
.../themes/default/menuicons/customicons/Info.png | Bin 0 -> 2138 bytes
.../default/menuicons/customicons/Internet.png | Bin 0 -> 3801 bytes
.../default/menuicons/customicons/Medien.png | Bin 0 -> 3009 bytes
.../menuicons/customicons/Rechner neu starten.png | Bin 0 -> 2886 bytes
.../menuicons/customicons/Remote wakeup.png | Bin 0 -> 859 bytes
.../default/menuicons/customicons/Spiele.png | Bin 0 -> 2993 bytes
.../customicons/System herunterfahren.png | Bin 0 -> 2713 bytes
.../default/menuicons/customicons/System.png | Bin 0 -> 3227 bytes
.../themes/default/menuicons/customicons/Tools.png | Bin 0 -> 2355 bytes
.../default/menuicons/customicons/Tunderbird.png | Bin 0 -> 3544 bytes
.../USB Massenspeicher sicher entfernen.png | Bin 0 -> 2019 bytes
.../menuicons/customicons/VDR neu starten.png | Bin 0 -> 2577 bytes
.../themes/default/menuicons/customicons/Video.png | Bin 0 -> 2276 bytes
.../themes/default/menuicons/customicons/Web.png | Bin 0 -> 3930 bytes
.../themes/default/menuicons/customicons/XBMC.png | Bin 0 -> 3336 bytes
.../themes/default/menuicons/customicons/Xterm.png | Bin 0 -> 1575 bytes
.../default/menuicons/customicons/audiovideo.png | Bin 0 -> 2765 bytes
.../menuicons/customicons/markad_status.png | Bin 0 -> 2865 bytes
.../menuicons/customicons/schneiden_abbrechen.png | Bin 0 -> 3420 bytes
.../themes/default/menuicons/customicons/tux.png | Bin 0 -> 3852 bytes
.../themes/default/menuicons/customicons/usb.png | Bin 0 -> 1438 bytes
.../default/menuicons/customicons/vdrlogo.png | Bin 0 -> 12796 bytes
.../default/menuicons/customicons/yaicon_blue.png | Bin 0 -> 1931 bytes
.../themes/default/menuicons/pluginicons/admin.png | Bin 0 -> 2355 bytes
.../default/menuicons/pluginicons/arghdirector.png | Bin 0 -> 1824 bytes
.../default/menuicons/pluginicons/autostart.png | Bin 0 -> 3320 bytes
.../default/menuicons/pluginicons/avahi4vdr.png | Bin 0 -> 3734 bytes
.../default/menuicons/pluginicons/avards.png | Bin 0 -> 665 bytes
.../themes/default/menuicons/pluginicons/block.png | Bin 0 -> 1341 bytes
.../themes/default/menuicons/pluginicons/burn.png | Bin 0 -> 4233 bytes
.../default/menuicons/pluginicons/cdplayer.png | Bin 0 -> 2258 bytes
.../default/menuicons/pluginicons/chanman.png | Bin 0 -> 3224 bytes
.../themes/default/menuicons/pluginicons/check.png | Bin 0 -> 2141 bytes
.../menuicons/pluginicons/conflictcheckonly.png | Bin 0 -> 3050 bytes
.../themes/default/menuicons/pluginicons/ddci.png | Bin 0 -> 2876 bytes
.../default/menuicons/pluginicons/devstatus.png | Bin 0 -> 3159 bytes
.../default/menuicons/pluginicons/dummydevice.png | Bin 0 -> 2035 bytes
.../default/menuicons/pluginicons/duplicates.png | Bin 0 -> 2485 bytes
.../default/menuicons/pluginicons/dvbapi.png | Bin 0 -> 2869 bytes
.../default/menuicons/pluginicons/dvbhddevice.png | Bin 0 -> 3175 bytes
.../default/menuicons/pluginicons/dvbsddevice.png | Bin 0 -> 3588 bytes
.../default/menuicons/pluginicons/dynamite.png | Bin 0 -> 3973 bytes
.../themes/default/menuicons/pluginicons/eepg.png | Bin 0 -> 3590 bytes
.../default/menuicons/pluginicons/epg2vdr.png | Bin 0 -> 4051 bytes
.../default/menuicons/pluginicons/epgsearch.png | Bin 0 -> 3228 bytes
.../menuicons/pluginicons/epgsearchonly.png | Bin 0 -> 2983 bytes
.../default/menuicons/pluginicons/epgsync.png | Bin 0 -> 3518 bytes
.../menuicons/pluginicons/externalplayer.png | Bin 0 -> 2449 bytes
.../default/menuicons/pluginicons/extrecmenu.png | Bin 0 -> 2323 bytes
.../default/menuicons/pluginicons/favorites.png | Bin 0 -> 1375 bytes
.../themes/default/menuicons/pluginicons/femon.png | Bin 0 -> 3331 bytes
.../themes/default/menuicons/pluginicons/fepg.png | Bin 0 -> 2406 bytes
.../default/menuicons/pluginicons/filebrowser.png | Bin 0 -> 1463 bytes
.../default/menuicons/pluginicons/fritzbox.png | Bin 0 -> 1931 bytes
.../default/menuicons/pluginicons/graphlcd.png | Bin 0 -> 1421 bytes
.../default/menuicons/pluginicons/graphtft.png | Bin 0 -> 1421 bytes
.../themes/default/menuicons/pluginicons/image.png | Bin 0 -> 2559 bytes
.../default/menuicons/pluginicons/imonlcd.png | Bin 0 -> 1421 bytes
.../themes/default/menuicons/pluginicons/iptv.png | Bin 0 -> 2774 bytes
.../default/menuicons/pluginicons/lcdproc.png | Bin 0 -> 1421 bytes
.../default/menuicons/pluginicons/mailbox.png | Bin 0 -> 1904 bytes
.../default/menuicons/pluginicons/makemkv.png | Bin 0 -> 1941 bytes
.../default/menuicons/pluginicons/markad.png | Bin 0 -> 2865 bytes
.../themes/default/menuicons/pluginicons/mlist.png | Bin 0 -> 2505 bytes
.../themes/default/menuicons/pluginicons/music.png | Bin 0 -> 2674 bytes
.../themes/default/menuicons/pluginicons/noepg.png | Bin 0 -> 3355 bytes
.../menuicons/pluginicons/nordlichtsepg.png | Bin 0 -> 2643 bytes
.../default/menuicons/pluginicons/osdteletext.png | Bin 0 -> 1591 bytes
.../themes/default/menuicons/pluginicons/peer.png | Bin 0 -> 4175 bytes
.../themes/default/menuicons/pluginicons/play.png | Bin 0 -> 1059 bytes
.../default/menuicons/pluginicons/pvrinput.png | Bin 0 -> 1976 bytes
.../menuicons/pluginicons/quickepgsearch.png | Bin 0 -> 4781 bytes
.../themes/default/menuicons/pluginicons/radio.png | Bin 0 -> 2016 bytes
.../default/menuicons/pluginicons/remote.png | Bin 0 -> 3807 bytes
.../default/menuicons/pluginicons/remotetimers.png | Bin 0 -> 4372 bytes
.../default/menuicons/pluginicons/rssreader.png | Bin 0 -> 2620 bytes
.../themes/default/menuicons/pluginicons/sc.png | Bin 0 -> 2208 bytes
.../default/menuicons/pluginicons/scraper2vdr.png | Bin 0 -> 2726 bytes
.../default/menuicons/pluginicons/screenshot.png | Bin 0 -> 2526 bytes
.../default/menuicons/pluginicons/seduatmo.png | Bin 0 -> 2024 bytes
.../menuicons/pluginicons/skyselectfeeds.png | Bin 0 -> 2852 bytes
.../default/menuicons/pluginicons/sleeptimer.png | Bin 0 -> 4694 bytes
.../default/menuicons/pluginicons/softhddevice.png | Bin 0 -> 2410 bytes
.../menuicons/pluginicons/streamdev-server.png | Bin 0 -> 2821 bytes
.../default/menuicons/pluginicons/systeminfo.png | Bin 0 -> 1709 bytes
.../default/menuicons/pluginicons/targavfd.png | Bin 0 -> 1421 bytes
.../default/menuicons/pluginicons/trayopenng.png | Bin 0 -> 1077 bytes
.../default/menuicons/pluginicons/tvguide.png | Bin 0 -> 2129 bytes
.../default/menuicons/pluginicons/tvm2vdr.png | Bin 0 -> 2622 bytes
.../default/menuicons/pluginicons/tvscraper.png | Bin 0 -> 2726 bytes
.../default/menuicons/pluginicons/undelete.png | Bin 0 -> 2947 bytes
.../menuicons/pluginicons/weatherforecast.png | Bin 0 -> 1726 bytes
.../default/menuicons/pluginicons/weatherng.png | Bin 0 -> 1726 bytes
.../default/menuicons/pluginicons/xmltv2vdr.png | Bin 0 -> 2985 bytes
.../default/menuicons/pluginicons/yaepghg.png | Bin 0 -> 2129 bytes
.../themes/default/menuicons/standardicons/CAM.png | Bin 0 -> 1619 bytes
.../default/menuicons/standardicons/Channels.png | Bin 0 -> 3561 bytes
.../default/menuicons/standardicons/Commands.png | Bin 0 -> 2428 bytes
.../themes/default/menuicons/standardicons/DVB.png | Bin 0 -> 2758 bytes
.../themes/default/menuicons/standardicons/EPG.png | Bin 0 -> 2874 bytes
.../themes/default/menuicons/standardicons/LNB.png | Bin 0 -> 3739 bytes
.../menuicons/standardicons/Miscellaneous.png | Bin 0 -> 1576 bytes
.../themes/default/menuicons/standardicons/OSD.png | Bin 0 -> 1577 bytes
.../default/menuicons/standardicons/Plugins.png | Bin 0 -> 2230 bytes
.../default/menuicons/standardicons/Recording.png | Bin 0 -> 1115 bytes
.../default/menuicons/standardicons/Recordings.png | Bin 0 -> 3640 bytes
.../default/menuicons/standardicons/Replay.png | Bin 0 -> 1059 bytes
.../default/menuicons/standardicons/Restart.png | Bin 0 -> 2577 bytes
.../default/menuicons/standardicons/Schedule.png | Bin 0 -> 2056 bytes
.../default/menuicons/standardicons/Setup.png | Bin 0 -> 3179 bytes
.../menuicons/standardicons/StopRecording.png | Bin 0 -> 547 bytes
.../default/menuicons/standardicons/StopReplay.png | Bin 0 -> 1595 bytes
.../default/menuicons/standardicons/Timers.png | Bin 0 -> 4113 bytes
skins/metrixhd/themes/default/theme.xml | 53 +
skins/metrixhd/xmlfiles/displayaudiotracks.xml | 46 +
skins/metrixhd/xmlfiles/displaychannel.xml | 320 ++++
skins/metrixhd/xmlfiles/displaymenu.xml | 161 ++
skins/metrixhd/xmlfiles/displaymenuchannels.xml | 122 ++
skins/metrixhd/xmlfiles/displaymenudefault.xml | 185 ++
skins/metrixhd/xmlfiles/displaymenudetailepg.xml | 349 ++++
.../xmlfiles/displaymenudetailrecording.xml | 326 ++++
skins/metrixhd/xmlfiles/displaymenudetailtext.xml | 99 ++
skins/metrixhd/xmlfiles/displaymenumain.xml | 322 ++++
skins/metrixhd/xmlfiles/displaymenurecordings.xml | 101 ++
skins/metrixhd/xmlfiles/displaymenuschedules.xml | 215 +++
skins/metrixhd/xmlfiles/displaymenusetup.xml | 110 ++
skins/metrixhd/xmlfiles/displaymenutimers.xml | 97 ++
skins/metrixhd/xmlfiles/displaymessage.xml | 27 +
skins/metrixhd/xmlfiles/displayreplay.xml | 372 ++++
skins/metrixhd/xmlfiles/displayvolume.xml | 29 +
.../plug-weatherforecast-weatherforecast.xml | 164 ++
...eatherforecast-weatherforecastdetailcurrent.xml | 90 +
...-weatherforecast-weatherforecastdetaildaily.xml | 90 +
...weatherforecast-weatherforecastdetailhourly.xml | 89 +
skins/nopacity/globals.xml | 269 +++
skins/nopacity/setup.xml | 30 +
skins/nopacity/themes/darkred/icons/clear-day.png | Bin 0 -> 4980 bytes
.../nopacity/themes/darkred/icons/clear-night.png | Bin 0 -> 3115 bytes
skins/nopacity/themes/darkred/icons/cloudy.png | Bin 0 -> 6433 bytes
skins/nopacity/themes/darkred/icons/fog.png | Bin 0 -> 3652 bytes
skins/nopacity/themes/darkred/icons/ico_ac3.png | Bin 0 -> 2684 bytes
.../themes/darkred/icons/ico_activetimer.png | Bin 0 -> 1731 bytes
.../darkred/icons/ico_arrow_left_channelsep.png | Bin 0 -> 9782 bytes
.../darkred/icons/ico_arrow_right_channelsep.png | Bin 0 -> 10540 bytes
.../themes/darkred/icons/ico_channelsep.png | Bin 0 -> 958 bytes
skins/nopacity/themes/darkred/icons/ico_cutted.png | Bin 0 -> 2007 bytes
.../themes/darkred/icons/ico_daydelimiter.png | Bin 0 -> 2785 bytes
.../themes/darkred/icons/ico_discusage.png | Bin 0 -> 2835 bytes
.../nopacity/themes/darkred/icons/ico_dolbyoff.png | Bin 0 -> 4142 bytes
.../nopacity/themes/darkred/icons/ico_dolbyon.png | Bin 0 -> 4547 bytes
.../themes/darkred/icons/ico_encrypted.png | Bin 0 -> 4409 bytes
skins/nopacity/themes/darkred/icons/ico_ff.png | Bin 0 -> 12210 bytes
skins/nopacity/themes/darkred/icons/ico_ff_1x.png | Bin 0 -> 13911 bytes
skins/nopacity/themes/darkred/icons/ico_ff_2x.png | Bin 0 -> 14268 bytes
skins/nopacity/themes/darkred/icons/ico_ff_3x.png | Bin 0 -> 14752 bytes
skins/nopacity/themes/darkred/icons/ico_ff_off.png | Bin 0 -> 12656 bytes
skins/nopacity/themes/darkred/icons/ico_fta.png | Bin 0 -> 4081 bytes
.../nopacity/themes/darkred/icons/ico_hd1080i.png | Bin 0 -> 3313 bytes
skins/nopacity/themes/darkred/icons/ico_hd720p.png | Bin 0 -> 3248 bytes
skins/nopacity/themes/darkred/icons/ico_mute.png | Bin 0 -> 3075 bytes
skins/nopacity/themes/darkred/icons/ico_pause.png | Bin 0 -> 6316 bytes
.../themes/darkred/icons/ico_pause_off.png | Bin 0 -> 6329 bytes
skins/nopacity/themes/darkred/icons/ico_play.png | Bin 0 -> 10119 bytes
.../nopacity/themes/darkred/icons/ico_play_off.png | Bin 0 -> 10871 bytes
.../themes/darkred/icons/ico_recfolder.png | Bin 0 -> 2423 bytes
skins/nopacity/themes/darkred/icons/ico_recnew.png | Bin 0 -> 2815 bytes
skins/nopacity/themes/darkred/icons/ico_recoff.png | Bin 0 -> 4036 bytes
skins/nopacity/themes/darkred/icons/ico_recon.png | Bin 0 -> 4322 bytes
skins/nopacity/themes/darkred/icons/ico_rew.png | Bin 0 -> 11793 bytes
skins/nopacity/themes/darkred/icons/ico_rew_1x.png | Bin 0 -> 13221 bytes
skins/nopacity/themes/darkred/icons/ico_rew_2x.png | Bin 0 -> 13842 bytes
skins/nopacity/themes/darkred/icons/ico_rew_3x.png | Bin 0 -> 14562 bytes
.../nopacity/themes/darkred/icons/ico_rew_off.png | Bin 0 -> 13211 bytes
skins/nopacity/themes/darkred/icons/ico_sd576i.png | Bin 0 -> 3390 bytes
skins/nopacity/themes/darkred/icons/ico_stereo.png | Bin 0 -> 4433 bytes
.../themes/darkred/icons/ico_stereooff.png | Bin 0 -> 4224 bytes
.../nopacity/themes/darkred/icons/ico_stereoon.png | Bin 0 -> 4606 bytes
.../themes/darkred/icons/ico_timer_active.png | Bin 0 -> 3297 bytes
.../themes/darkred/icons/ico_timer_inactive.png | Bin 0 -> 1527 bytes
.../themes/darkred/icons/ico_timer_recording.png | Bin 0 -> 531 bytes
skins/nopacity/themes/darkred/icons/ico_txtoff.png | Bin 0 -> 3783 bytes
skins/nopacity/themes/darkred/icons/ico_txton.png | Bin 0 -> 4012 bytes
.../nopacity/themes/darkred/icons/ico_vdrlogo.png | Bin 0 -> 11135 bytes
skins/nopacity/themes/darkred/icons/ico_volume.png | Bin 0 -> 7443 bytes
.../themes/darkred/icons/partly-cloudy-day.png | Bin 0 -> 7028 bytes
.../themes/darkred/icons/partly-cloudy-night.png | Bin 0 -> 6409 bytes
skins/nopacity/themes/darkred/icons/rain.png | Bin 0 -> 6000 bytes
skins/nopacity/themes/darkred/icons/sleet.png | Bin 0 -> 6021 bytes
skins/nopacity/themes/darkred/icons/snow.png | Bin 0 -> 7660 bytes
skins/nopacity/themes/darkred/icons/wind.png | Bin 0 -> 2568 bytes
.../menuicons/customicons/Applikationen.png | Bin 0 -> 2073 bytes
.../themes/darkred/menuicons/customicons/Audio.png | Bin 0 -> 2674 bytes
.../customicons/Aufnahmen-Liste aktualisieren.png | Bin 0 -> 3550 bytes
.../menuicons/customicons/Dienstprogramme.png | Bin 0 -> 1581 bytes
.../darkred/menuicons/customicons/FireFox.png | Bin 0 -> 3359 bytes
.../themes/darkred/menuicons/customicons/Info.png | Bin 0 -> 2138 bytes
.../darkred/menuicons/customicons/Internet.png | Bin 0 -> 3801 bytes
.../darkred/menuicons/customicons/Medien.png | Bin 0 -> 3009 bytes
.../menuicons/customicons/Rechner neu starten.png | Bin 0 -> 2886 bytes
.../menuicons/customicons/Remote wakeup.png | Bin 0 -> 859 bytes
.../darkred/menuicons/customicons/Spiele.png | Bin 0 -> 2993 bytes
.../customicons/System herunterfahren.png | Bin 0 -> 2713 bytes
.../darkred/menuicons/customicons/System.png | Bin 0 -> 3227 bytes
.../themes/darkred/menuicons/customicons/Tools.png | Bin 0 -> 2355 bytes
.../darkred/menuicons/customicons/Tunderbird.png | Bin 0 -> 3544 bytes
.../USB Massenspeicher sicher entfernen.png | Bin 0 -> 2019 bytes
.../menuicons/customicons/VDR neu starten.png | Bin 0 -> 2577 bytes
.../themes/darkred/menuicons/customicons/Video.png | Bin 0 -> 2276 bytes
.../themes/darkred/menuicons/customicons/Web.png | Bin 0 -> 3930 bytes
.../themes/darkred/menuicons/customicons/XBMC.png | Bin 0 -> 3336 bytes
.../themes/darkred/menuicons/customicons/Xterm.png | Bin 0 -> 1575 bytes
.../darkred/menuicons/customicons/audiovideo.png | Bin 0 -> 2765 bytes
.../menuicons/customicons/markad_status.png | Bin 0 -> 2865 bytes
.../menuicons/customicons/schneiden_abbrechen.png | Bin 0 -> 3420 bytes
.../themes/darkred/menuicons/customicons/tux.png | Bin 0 -> 3852 bytes
.../themes/darkred/menuicons/customicons/usb.png | Bin 0 -> 1438 bytes
.../darkred/menuicons/customicons/vdrlogo.png | Bin 0 -> 12796 bytes
.../darkred/menuicons/customicons/yaicon_blue.png | Bin 0 -> 1931 bytes
.../themes/darkred/menuicons/pluginicons/admin.png | Bin 0 -> 2355 bytes
.../darkred/menuicons/pluginicons/arghdirector.png | Bin 0 -> 1824 bytes
.../darkred/menuicons/pluginicons/autostart.png | Bin 0 -> 3320 bytes
.../darkred/menuicons/pluginicons/avahi4vdr.png | Bin 0 -> 3734 bytes
.../darkred/menuicons/pluginicons/avards.png | Bin 0 -> 665 bytes
.../themes/darkred/menuicons/pluginicons/block.png | Bin 0 -> 1341 bytes
.../themes/darkred/menuicons/pluginicons/burn.png | Bin 0 -> 4233 bytes
.../darkred/menuicons/pluginicons/cdplayer.png | Bin 0 -> 2258 bytes
.../darkred/menuicons/pluginicons/chanman.png | Bin 0 -> 3224 bytes
.../themes/darkred/menuicons/pluginicons/check.png | Bin 0 -> 2141 bytes
.../menuicons/pluginicons/conflictcheckonly.png | Bin 0 -> 3050 bytes
.../themes/darkred/menuicons/pluginicons/ddci.png | Bin 0 -> 2876 bytes
.../darkred/menuicons/pluginicons/devstatus.png | Bin 0 -> 3159 bytes
.../darkred/menuicons/pluginicons/dummydevice.png | Bin 0 -> 2035 bytes
.../darkred/menuicons/pluginicons/duplicates.png | Bin 0 -> 2485 bytes
.../darkred/menuicons/pluginicons/dvbapi.png | Bin 0 -> 2869 bytes
.../darkred/menuicons/pluginicons/dvbhddevice.png | Bin 0 -> 3175 bytes
.../darkred/menuicons/pluginicons/dvbsddevice.png | Bin 0 -> 3588 bytes
.../darkred/menuicons/pluginicons/dynamite.png | Bin 0 -> 3973 bytes
.../themes/darkred/menuicons/pluginicons/eepg.png | Bin 0 -> 3590 bytes
.../darkred/menuicons/pluginicons/epg2vdr.png | Bin 0 -> 4051 bytes
.../darkred/menuicons/pluginicons/epgsearch.png | Bin 0 -> 3228 bytes
.../menuicons/pluginicons/epgsearchonly.png | Bin 0 -> 2983 bytes
.../darkred/menuicons/pluginicons/epgsync.png | Bin 0 -> 3518 bytes
.../menuicons/pluginicons/externalplayer.png | Bin 0 -> 2449 bytes
.../darkred/menuicons/pluginicons/extrecmenu.png | Bin 0 -> 2323 bytes
.../darkred/menuicons/pluginicons/favorites.png | Bin 0 -> 1375 bytes
.../themes/darkred/menuicons/pluginicons/femon.png | Bin 0 -> 3331 bytes
.../themes/darkred/menuicons/pluginicons/fepg.png | Bin 0 -> 2406 bytes
.../darkred/menuicons/pluginicons/filebrowser.png | Bin 0 -> 1463 bytes
.../darkred/menuicons/pluginicons/fritzbox.png | Bin 0 -> 1931 bytes
.../darkred/menuicons/pluginicons/graphlcd.png | Bin 0 -> 1421 bytes
.../darkred/menuicons/pluginicons/graphtft.png | Bin 0 -> 1421 bytes
.../themes/darkred/menuicons/pluginicons/image.png | Bin 0 -> 2559 bytes
.../darkred/menuicons/pluginicons/imonlcd.png | Bin 0 -> 1421 bytes
.../themes/darkred/menuicons/pluginicons/iptv.png | Bin 0 -> 2774 bytes
.../darkred/menuicons/pluginicons/lcdproc.png | Bin 0 -> 1421 bytes
.../darkred/menuicons/pluginicons/mailbox.png | Bin 0 -> 1904 bytes
.../darkred/menuicons/pluginicons/makemkv.png | Bin 0 -> 1941 bytes
.../darkred/menuicons/pluginicons/markad.png | Bin 0 -> 2865 bytes
.../themes/darkred/menuicons/pluginicons/mlist.png | Bin 0 -> 2505 bytes
.../themes/darkred/menuicons/pluginicons/music.png | Bin 0 -> 2674 bytes
.../themes/darkred/menuicons/pluginicons/noepg.png | Bin 0 -> 3355 bytes
.../menuicons/pluginicons/nordlichtsepg.png | Bin 0 -> 2643 bytes
.../darkred/menuicons/pluginicons/osdteletext.png | Bin 0 -> 1591 bytes
.../themes/darkred/menuicons/pluginicons/peer.png | Bin 0 -> 4175 bytes
.../themes/darkred/menuicons/pluginicons/play.png | Bin 0 -> 1059 bytes
.../darkred/menuicons/pluginicons/pvrinput.png | Bin 0 -> 1976 bytes
.../menuicons/pluginicons/quickepgsearch.png | Bin 0 -> 4781 bytes
.../themes/darkred/menuicons/pluginicons/radio.png | Bin 0 -> 2016 bytes
.../darkred/menuicons/pluginicons/remote.png | Bin 0 -> 3807 bytes
.../darkred/menuicons/pluginicons/remotetimers.png | Bin 0 -> 4372 bytes
.../darkred/menuicons/pluginicons/rssreader.png | Bin 0 -> 2620 bytes
.../themes/darkred/menuicons/pluginicons/sc.png | Bin 0 -> 2208 bytes
.../darkred/menuicons/pluginicons/screenshot.png | Bin 0 -> 2526 bytes
.../darkred/menuicons/pluginicons/seduatmo.png | Bin 0 -> 2024 bytes
.../menuicons/pluginicons/skyselectfeeds.png | Bin 0 -> 2852 bytes
.../darkred/menuicons/pluginicons/sleeptimer.png | Bin 0 -> 4694 bytes
.../darkred/menuicons/pluginicons/softhddevice.png | Bin 0 -> 2410 bytes
.../menuicons/pluginicons/streamdev-server.png | Bin 0 -> 2821 bytes
.../darkred/menuicons/pluginicons/systeminfo.png | Bin 0 -> 1709 bytes
.../darkred/menuicons/pluginicons/targavfd.png | Bin 0 -> 1421 bytes
.../darkred/menuicons/pluginicons/trayopenng.png | Bin 0 -> 1077 bytes
.../darkred/menuicons/pluginicons/tvguide.png | Bin 0 -> 2129 bytes
.../darkred/menuicons/pluginicons/tvm2vdr.png | Bin 0 -> 2622 bytes
.../darkred/menuicons/pluginicons/tvscraper.png | Bin 0 -> 2726 bytes
.../darkred/menuicons/pluginicons/undelete.png | Bin 0 -> 2947 bytes
.../menuicons/pluginicons/weatherforecast.png | Bin 0 -> 1726 bytes
.../darkred/menuicons/pluginicons/weatherng.png | Bin 0 -> 1726 bytes
.../darkred/menuicons/pluginicons/xmltv2vdr.png | Bin 0 -> 2985 bytes
.../darkred/menuicons/pluginicons/yaepghg.png | Bin 0 -> 2129 bytes
.../themes/darkred/menuicons/standardicons/CAM.png | Bin 0 -> 1619 bytes
.../darkred/menuicons/standardicons/Channels.png | Bin 0 -> 3561 bytes
.../darkred/menuicons/standardicons/Commands.png | Bin 0 -> 2428 bytes
.../themes/darkred/menuicons/standardicons/DVB.png | Bin 0 -> 2758 bytes
.../themes/darkred/menuicons/standardicons/EPG.png | Bin 0 -> 2874 bytes
.../themes/darkred/menuicons/standardicons/LNB.png | Bin 0 -> 3739 bytes
.../menuicons/standardicons/Miscellaneous.png | Bin 0 -> 1576 bytes
.../themes/darkred/menuicons/standardicons/OSD.png | Bin 0 -> 1577 bytes
.../darkred/menuicons/standardicons/Plugins.png | Bin 0 -> 2230 bytes
.../darkred/menuicons/standardicons/Recording.png | Bin 0 -> 1115 bytes
.../darkred/menuicons/standardicons/Recordings.png | Bin 0 -> 3640 bytes
.../darkred/menuicons/standardicons/Replay.png | Bin 0 -> 1059 bytes
.../darkred/menuicons/standardicons/Restart.png | Bin 0 -> 2577 bytes
.../darkred/menuicons/standardicons/Schedule.png | Bin 0 -> 2056 bytes
.../darkred/menuicons/standardicons/Setup.png | Bin 0 -> 3179 bytes
.../menuicons/standardicons/StopRecording.png | Bin 0 -> 547 bytes
.../darkred/menuicons/standardicons/StopReplay.png | Bin 0 -> 1595 bytes
.../darkred/menuicons/standardicons/Timers.png | Bin 0 -> 4113 bytes
.../themes/darkred/skinparts/buttonblue.png | Bin 0 -> 13646 bytes
.../themes/darkred/skinparts/buttongreen.png | Bin 0 -> 13983 bytes
.../themes/darkred/skinparts/buttonred.png | Bin 0 -> 12620 bytes
.../themes/darkred/skinparts/buttonyellow.png | Bin 0 -> 13701 bytes
.../themes/darkred/skinparts/channellogoback.png | Bin 0 -> 35765 bytes
.../themes/darkred/skinparts/discpercent.png | Bin 0 -> 4553 bytes
.../darkred/skinparts/displaychannelback.png | Bin 0 -> 294017 bytes
.../themes/darkred/skinparts/displaychanneltop.png | Bin 0 -> 101277 bytes
.../themes/darkred/skinparts/displayreplayback.png | Bin 0 -> 293482 bytes
.../themes/darkred/skinparts/displayvolume.png | Bin 0 -> 55712 bytes
.../darkred/skinparts/header_mirroredback.png | Bin 0 -> 90195 bytes
.../darkred/skinparts/header_mirroredtop.png | Bin 0 -> 40519 bytes
.../themes/darkred/skinparts/headerback.png | Bin 0 -> 90159 bytes
.../themes/darkred/skinparts/headertop.png | Bin 0 -> 40302 bytes
.../themes/darkred/skinparts/menubutton.png | Bin 0 -> 38893 bytes
.../themes/darkred/skinparts/menubuttonactive.png | Bin 0 -> 7365 bytes
.../themes/darkred/skinparts/menubuttondefault.png | Bin 0 -> 57696 bytes
.../darkred/skinparts/menubuttondefaultactive.png | Bin 0 -> 56948 bytes
.../themes/darkred/skinparts/messageError.png | Bin 0 -> 105535 bytes
.../themes/darkred/skinparts/messageInfo.png | Bin 0 -> 111664 bytes
.../themes/darkred/skinparts/messageStatus.png | Bin 0 -> 115980 bytes
.../themes/darkred/skinparts/messageWarning.png | Bin 0 -> 110952 bytes
.../themes/darkred/skinparts/scrollbar.png | Bin 0 -> 12553 bytes
skins/nopacity/themes/darkred/skinparts/signal.png | Bin 0 -> 2436 bytes
skins/nopacity/themes/darkred/theme.xml | 28 +
skins/nopacity/themes/default/icons/clear-day.png | Bin 0 -> 4980 bytes
.../nopacity/themes/default/icons/clear-night.png | Bin 0 -> 3115 bytes
skins/nopacity/themes/default/icons/cloudy.png | Bin 0 -> 6433 bytes
skins/nopacity/themes/default/icons/fog.png | Bin 0 -> 3652 bytes
skins/nopacity/themes/default/icons/ico_ac3.png | Bin 0 -> 2684 bytes
.../themes/default/icons/ico_activetimer.png | Bin 0 -> 1731 bytes
.../default/icons/ico_arrow_left_channelsep.png | Bin 0 -> 11625 bytes
.../default/icons/ico_arrow_right_channelsep.png | Bin 0 -> 10951 bytes
.../themes/default/icons/ico_channelsep.png | Bin 0 -> 958 bytes
skins/nopacity/themes/default/icons/ico_cutted.png | Bin 0 -> 2007 bytes
.../themes/default/icons/ico_daydelimiter.png | Bin 0 -> 2785 bytes
.../themes/default/icons/ico_discusage.png | Bin 0 -> 4404 bytes
.../nopacity/themes/default/icons/ico_dolbyoff.png | Bin 0 -> 1791 bytes
.../nopacity/themes/default/icons/ico_dolbyon.png | Bin 0 -> 1792 bytes
.../themes/default/icons/ico_encrypted.png | Bin 0 -> 957 bytes
skins/nopacity/themes/default/icons/ico_ff.png | Bin 0 -> 11503 bytes
skins/nopacity/themes/default/icons/ico_ff_1x.png | Bin 0 -> 13093 bytes
skins/nopacity/themes/default/icons/ico_ff_2x.png | Bin 0 -> 13094 bytes
skins/nopacity/themes/default/icons/ico_ff_3x.png | Bin 0 -> 13010 bytes
skins/nopacity/themes/default/icons/ico_ff_off.png | Bin 0 -> 12656 bytes
skins/nopacity/themes/default/icons/ico_fta.png | Bin 0 -> 1641 bytes
.../nopacity/themes/default/icons/ico_hd1080i.png | Bin 0 -> 1095 bytes
skins/nopacity/themes/default/icons/ico_hd720p.png | Bin 0 -> 2299 bytes
skins/nopacity/themes/default/icons/ico_mute.png | Bin 0 -> 3075 bytes
skins/nopacity/themes/default/icons/ico_pause.png | Bin 0 -> 4959 bytes
.../themes/default/icons/ico_pause_off.png | Bin 0 -> 6329 bytes
skins/nopacity/themes/default/icons/ico_play.png | Bin 0 -> 10550 bytes
.../nopacity/themes/default/icons/ico_play_off.png | Bin 0 -> 10871 bytes
.../themes/default/icons/ico_recfolder.png | Bin 0 -> 2423 bytes
skins/nopacity/themes/default/icons/ico_recnew.png | Bin 0 -> 2815 bytes
skins/nopacity/themes/default/icons/ico_recoff.png | Bin 0 -> 2543 bytes
skins/nopacity/themes/default/icons/ico_recon.png | Bin 0 -> 2776 bytes
skins/nopacity/themes/default/icons/ico_rew.png | Bin 0 -> 12275 bytes
skins/nopacity/themes/default/icons/ico_rew_1x.png | Bin 0 -> 13588 bytes
skins/nopacity/themes/default/icons/ico_rew_2x.png | Bin 0 -> 13660 bytes
skins/nopacity/themes/default/icons/ico_rew_3x.png | Bin 0 -> 13970 bytes
.../nopacity/themes/default/icons/ico_rew_off.png | Bin 0 -> 13211 bytes
skins/nopacity/themes/default/icons/ico_sd576i.png | Bin 0 -> 2363 bytes
skins/nopacity/themes/default/icons/ico_stereo.png | Bin 0 -> 4433 bytes
.../themes/default/icons/ico_stereooff.png | Bin 0 -> 1944 bytes
.../nopacity/themes/default/icons/ico_stereoon.png | Bin 0 -> 1609 bytes
.../themes/default/icons/ico_timer_active.png | Bin 0 -> 3297 bytes
.../themes/default/icons/ico_timer_inactive.png | Bin 0 -> 1527 bytes
.../themes/default/icons/ico_timer_recording.png | Bin 0 -> 531 bytes
skins/nopacity/themes/default/icons/ico_txtoff.png | Bin 0 -> 1216 bytes
skins/nopacity/themes/default/icons/ico_txton.png | Bin 0 -> 1214 bytes
.../nopacity/themes/default/icons/ico_vdrlogo.png | Bin 0 -> 11135 bytes
skins/nopacity/themes/default/icons/ico_volume.png | Bin 0 -> 7443 bytes
.../themes/default/icons/partly-cloudy-day.png | Bin 0 -> 7028 bytes
.../themes/default/icons/partly-cloudy-night.png | Bin 0 -> 6409 bytes
skins/nopacity/themes/default/icons/rain.png | Bin 0 -> 6000 bytes
skins/nopacity/themes/default/icons/sleet.png | Bin 0 -> 6021 bytes
skins/nopacity/themes/default/icons/snow.png | Bin 0 -> 7660 bytes
skins/nopacity/themes/default/icons/wind.png | Bin 0 -> 2568 bytes
.../menuicons/customicons/Applikationen.png | Bin 0 -> 2073 bytes
.../themes/default/menuicons/customicons/Audio.png | Bin 0 -> 2674 bytes
.../customicons/Aufnahmen-Liste aktualisieren.png | Bin 0 -> 3550 bytes
.../menuicons/customicons/Dienstprogramme.png | Bin 0 -> 1581 bytes
.../default/menuicons/customicons/FireFox.png | Bin 0 -> 3359 bytes
.../themes/default/menuicons/customicons/Info.png | Bin 0 -> 2138 bytes
.../default/menuicons/customicons/Internet.png | Bin 0 -> 3801 bytes
.../default/menuicons/customicons/Medien.png | Bin 0 -> 3009 bytes
.../menuicons/customicons/Rechner neu starten.png | Bin 0 -> 2886 bytes
.../menuicons/customicons/Remote wakeup.png | Bin 0 -> 859 bytes
.../default/menuicons/customicons/Spiele.png | Bin 0 -> 2993 bytes
.../customicons/System herunterfahren.png | Bin 0 -> 2713 bytes
.../default/menuicons/customicons/System.png | Bin 0 -> 3227 bytes
.../themes/default/menuicons/customicons/Tools.png | Bin 0 -> 2355 bytes
.../default/menuicons/customicons/Tunderbird.png | Bin 0 -> 3544 bytes
.../USB Massenspeicher sicher entfernen.png | Bin 0 -> 2019 bytes
.../menuicons/customicons/VDR neu starten.png | Bin 0 -> 2577 bytes
.../themes/default/menuicons/customicons/Video.png | Bin 0 -> 2276 bytes
.../themes/default/menuicons/customicons/Web.png | Bin 0 -> 3930 bytes
.../themes/default/menuicons/customicons/XBMC.png | Bin 0 -> 3336 bytes
.../themes/default/menuicons/customicons/Xterm.png | Bin 0 -> 1575 bytes
.../default/menuicons/customicons/audiovideo.png | Bin 0 -> 2765 bytes
.../menuicons/customicons/markad_status.png | Bin 0 -> 2865 bytes
.../menuicons/customicons/schneiden_abbrechen.png | Bin 0 -> 3420 bytes
.../themes/default/menuicons/customicons/tux.png | Bin 0 -> 3852 bytes
.../themes/default/menuicons/customicons/usb.png | Bin 0 -> 1438 bytes
.../default/menuicons/customicons/vdrlogo.png | Bin 0 -> 12796 bytes
.../default/menuicons/customicons/yaicon_blue.png | Bin 0 -> 1931 bytes
.../themes/default/menuicons/pluginicons/admin.png | Bin 0 -> 2355 bytes
.../default/menuicons/pluginicons/arghdirector.png | Bin 0 -> 1824 bytes
.../default/menuicons/pluginicons/autostart.png | Bin 0 -> 3320 bytes
.../default/menuicons/pluginicons/avahi4vdr.png | Bin 0 -> 3734 bytes
.../default/menuicons/pluginicons/avards.png | Bin 0 -> 665 bytes
.../themes/default/menuicons/pluginicons/block.png | Bin 0 -> 1341 bytes
.../themes/default/menuicons/pluginicons/burn.png | Bin 0 -> 4233 bytes
.../default/menuicons/pluginicons/cdplayer.png | Bin 0 -> 2258 bytes
.../default/menuicons/pluginicons/chanman.png | Bin 0 -> 3224 bytes
.../themes/default/menuicons/pluginicons/check.png | Bin 0 -> 2141 bytes
.../menuicons/pluginicons/conflictcheckonly.png | Bin 0 -> 3050 bytes
.../themes/default/menuicons/pluginicons/ddci.png | Bin 0 -> 2876 bytes
.../default/menuicons/pluginicons/devstatus.png | Bin 0 -> 3159 bytes
.../default/menuicons/pluginicons/dummydevice.png | Bin 0 -> 2035 bytes
.../default/menuicons/pluginicons/duplicates.png | Bin 0 -> 2485 bytes
.../default/menuicons/pluginicons/dvbapi.png | Bin 0 -> 2869 bytes
.../default/menuicons/pluginicons/dvbhddevice.png | Bin 0 -> 3175 bytes
.../default/menuicons/pluginicons/dvbsddevice.png | Bin 0 -> 3588 bytes
.../default/menuicons/pluginicons/dynamite.png | Bin 0 -> 3973 bytes
.../themes/default/menuicons/pluginicons/eepg.png | Bin 0 -> 3590 bytes
.../default/menuicons/pluginicons/epg2vdr.png | Bin 0 -> 4051 bytes
.../default/menuicons/pluginicons/epgsearch.png | Bin 0 -> 3228 bytes
.../menuicons/pluginicons/epgsearchonly.png | Bin 0 -> 2983 bytes
.../default/menuicons/pluginicons/epgsync.png | Bin 0 -> 3518 bytes
.../menuicons/pluginicons/externalplayer.png | Bin 0 -> 2449 bytes
.../default/menuicons/pluginicons/extrecmenu.png | Bin 0 -> 2323 bytes
.../default/menuicons/pluginicons/favorites.png | Bin 0 -> 1375 bytes
.../themes/default/menuicons/pluginicons/femon.png | Bin 0 -> 3331 bytes
.../themes/default/menuicons/pluginicons/fepg.png | Bin 0 -> 2406 bytes
.../default/menuicons/pluginicons/filebrowser.png | Bin 0 -> 1463 bytes
.../default/menuicons/pluginicons/fritzbox.png | Bin 0 -> 1931 bytes
.../default/menuicons/pluginicons/graphlcd.png | Bin 0 -> 1421 bytes
.../default/menuicons/pluginicons/graphtft.png | Bin 0 -> 1421 bytes
.../themes/default/menuicons/pluginicons/image.png | Bin 0 -> 2559 bytes
.../default/menuicons/pluginicons/imonlcd.png | Bin 0 -> 1421 bytes
.../themes/default/menuicons/pluginicons/iptv.png | Bin 0 -> 2774 bytes
.../default/menuicons/pluginicons/lcdproc.png | Bin 0 -> 1421 bytes
.../default/menuicons/pluginicons/mailbox.png | Bin 0 -> 1904 bytes
.../default/menuicons/pluginicons/makemkv.png | Bin 0 -> 1941 bytes
.../default/menuicons/pluginicons/markad.png | Bin 0 -> 2865 bytes
.../themes/default/menuicons/pluginicons/mlist.png | Bin 0 -> 2505 bytes
.../themes/default/menuicons/pluginicons/music.png | Bin 0 -> 2674 bytes
.../themes/default/menuicons/pluginicons/noepg.png | Bin 0 -> 3355 bytes
.../menuicons/pluginicons/nordlichtsepg.png | Bin 0 -> 2643 bytes
.../default/menuicons/pluginicons/osdteletext.png | Bin 0 -> 1591 bytes
.../themes/default/menuicons/pluginicons/peer.png | Bin 0 -> 4175 bytes
.../themes/default/menuicons/pluginicons/play.png | Bin 0 -> 1059 bytes
.../default/menuicons/pluginicons/pvrinput.png | Bin 0 -> 1976 bytes
.../menuicons/pluginicons/quickepgsearch.png | Bin 0 -> 4781 bytes
.../themes/default/menuicons/pluginicons/radio.png | Bin 0 -> 2016 bytes
.../default/menuicons/pluginicons/remote.png | Bin 0 -> 3807 bytes
.../default/menuicons/pluginicons/remotetimers.png | Bin 0 -> 4372 bytes
.../default/menuicons/pluginicons/rssreader.png | Bin 0 -> 2620 bytes
.../themes/default/menuicons/pluginicons/sc.png | Bin 0 -> 2208 bytes
.../default/menuicons/pluginicons/screenshot.png | Bin 0 -> 2526 bytes
.../default/menuicons/pluginicons/seduatmo.png | Bin 0 -> 2024 bytes
.../menuicons/pluginicons/skyselectfeeds.png | Bin 0 -> 2852 bytes
.../default/menuicons/pluginicons/sleeptimer.png | Bin 0 -> 4694 bytes
.../default/menuicons/pluginicons/softhddevice.png | Bin 0 -> 2410 bytes
.../menuicons/pluginicons/streamdev-server.png | Bin 0 -> 2821 bytes
.../default/menuicons/pluginicons/systeminfo.png | Bin 0 -> 1709 bytes
.../default/menuicons/pluginicons/targavfd.png | Bin 0 -> 1421 bytes
.../default/menuicons/pluginicons/trayopenng.png | Bin 0 -> 1077 bytes
.../default/menuicons/pluginicons/tvguide.png | Bin 0 -> 2129 bytes
.../default/menuicons/pluginicons/tvm2vdr.png | Bin 0 -> 2622 bytes
.../default/menuicons/pluginicons/tvscraper.png | Bin 0 -> 2726 bytes
.../default/menuicons/pluginicons/undelete.png | Bin 0 -> 2947 bytes
.../menuicons/pluginicons/weatherforecast.png | Bin 0 -> 1726 bytes
.../default/menuicons/pluginicons/weatherng.png | Bin 0 -> 1726 bytes
.../default/menuicons/pluginicons/xmltv2vdr.png | Bin 0 -> 2985 bytes
.../default/menuicons/pluginicons/yaepghg.png | Bin 0 -> 2129 bytes
.../themes/default/menuicons/standardicons/CAM.png | Bin 0 -> 1619 bytes
.../default/menuicons/standardicons/Channels.png | Bin 0 -> 3561 bytes
.../default/menuicons/standardicons/Commands.png | Bin 0 -> 2428 bytes
.../themes/default/menuicons/standardicons/DVB.png | Bin 0 -> 2758 bytes
.../themes/default/menuicons/standardicons/EPG.png | Bin 0 -> 2874 bytes
.../themes/default/menuicons/standardicons/LNB.png | Bin 0 -> 3739 bytes
.../menuicons/standardicons/Miscellaneous.png | Bin 0 -> 1576 bytes
.../themes/default/menuicons/standardicons/OSD.png | Bin 0 -> 1577 bytes
.../default/menuicons/standardicons/Plugins.png | Bin 0 -> 2230 bytes
.../default/menuicons/standardicons/Recording.png | Bin 0 -> 1115 bytes
.../default/menuicons/standardicons/Recordings.png | Bin 0 -> 3640 bytes
.../default/menuicons/standardicons/Replay.png | Bin 0 -> 1059 bytes
.../default/menuicons/standardicons/Restart.png | Bin 0 -> 2577 bytes
.../default/menuicons/standardicons/Schedule.png | Bin 0 -> 2056 bytes
.../default/menuicons/standardicons/Setup.png | Bin 0 -> 3179 bytes
.../menuicons/standardicons/StopRecording.png | Bin 0 -> 547 bytes
.../default/menuicons/standardicons/StopReplay.png | Bin 0 -> 1595 bytes
.../default/menuicons/standardicons/Timers.png | Bin 0 -> 4113 bytes
.../themes/default/skinparts/buttonblue.png | Bin 0 -> 13973 bytes
.../themes/default/skinparts/buttongreen.png | Bin 0 -> 14537 bytes
.../themes/default/skinparts/buttonred.png | Bin 0 -> 13011 bytes
.../themes/default/skinparts/buttonyellow.png | Bin 0 -> 13919 bytes
.../themes/default/skinparts/channellogoback.png | Bin 0 -> 35436 bytes
.../themes/default/skinparts/discpercent.png | Bin 0 -> 4553 bytes
.../default/skinparts/displaychannelback.png | Bin 0 -> 324403 bytes
.../themes/default/skinparts/displaychanneltop.png | Bin 0 -> 8987 bytes
.../themes/default/skinparts/displayreplayback.png | Bin 0 -> 321112 bytes
.../themes/default/skinparts/displayreplaytop.png | Bin 0 -> 4881 bytes
.../themes/default/skinparts/displayvolume.png | Bin 0 -> 58704 bytes
.../themes/default/skinparts/headertop.png | Bin 0 -> 5295 bytes
.../themes/default/skinparts/menubutton.png | Bin 0 -> 9360 bytes
.../themes/default/skinparts/menubuttonactive.png | Bin 0 -> 11656 bytes
.../themes/default/skinparts/menubuttondefault.png | Bin 0 -> 60910 bytes
.../default/skinparts/menubuttondefaultactive.png | Bin 0 -> 64422 bytes
.../themes/default/skinparts/menubuttontop.png | Bin 0 -> 3772 bytes
.../themes/default/skinparts/messageError.png | Bin 0 -> 114302 bytes
.../themes/default/skinparts/messageInfo.png | Bin 0 -> 120782 bytes
.../themes/default/skinparts/messageStatus.png | Bin 0 -> 120430 bytes
.../themes/default/skinparts/messageWarning.png | Bin 0 -> 116747 bytes
.../themes/default/skinparts/scrollbar.png | Bin 0 -> 11893 bytes
skins/nopacity/themes/default/skinparts/signal.png | Bin 0 -> 2436 bytes
skins/nopacity/themes/default/theme.xml | 28 +
skins/nopacity/xmlfiles/displayaudiotracks.xml | 46 +
skins/nopacity/xmlfiles/displaychannel.xml | 225 +++
skins/nopacity/xmlfiles/displaymenu.xml | 188 ++
skins/nopacity/xmlfiles/displaymenuchannels.xml | 127 ++
skins/nopacity/xmlfiles/displaymenudefault.xml | 65 +
skins/nopacity/xmlfiles/displaymenudetailepg.xml | 257 +++
.../xmlfiles/displaymenudetailrecording.xml | 235 +++
skins/nopacity/xmlfiles/displaymenudetailtext.xml | 25 +
skins/nopacity/xmlfiles/displaymenumain.xml | 152 ++
skins/nopacity/xmlfiles/displaymenurecordings.xml | 94 +
skins/nopacity/xmlfiles/displaymenuschedules.xml | 235 +++
skins/nopacity/xmlfiles/displaymenusetup.xml | 45 +
skins/nopacity/xmlfiles/displaymenutimers.xml | 102 ++
skins/nopacity/xmlfiles/displaymessage.xml | 28 +
skins/nopacity/xmlfiles/displayreplay.xml | 342 ++++
skins/nopacity/xmlfiles/displayvolume.xml | 40 +
.../plug-weatherforecast-weatherforecast.xml | 142 ++
...eatherforecast-weatherforecastdetailcurrent.xml | 69 +
...-weatherforecast-weatherforecastdetaildaily.xml | 71 +
...weatherforecast-weatherforecastdetailhourly.xml | 70 +
skinskeleton/globals.xml | 37 +
skinskeleton/setup.xml | 28 +
skinskeleton/themes/default/theme.xml | 37 +
skinskeleton/xmlfiles/displayaudiotracks.xml | 30 +
skinskeleton/xmlfiles/displaychannel.xml | 213 +++
skinskeleton/xmlfiles/displaymenu.xml | 101 ++
skinskeleton/xmlfiles/displaymenuchannels.xml | 81 +
skinskeleton/xmlfiles/displaymenudefault.xml | 37 +
skinskeleton/xmlfiles/displaymenudetailepg.xml | 184 ++
.../xmlfiles/displaymenudetailrecording.xml | 180 ++
skinskeleton/xmlfiles/displaymenudetailtext.xml | 9 +
skinskeleton/xmlfiles/displaymenumain.xml | 141 ++
skinskeleton/xmlfiles/displaymenurecordings.xml | 65 +
skinskeleton/xmlfiles/displaymenuschedules.xml | 96 ++
skinskeleton/xmlfiles/displaymenusetup.xml | 28 +
skinskeleton/xmlfiles/displaymenutimers.xml | 67 +
skinskeleton/xmlfiles/displaymessage.xml | 19 +
skinskeleton/xmlfiles/displayreplay.xml | 252 +++
skinskeleton/xmlfiles/displayvolume.xml | 18 +
themes/blackhole-default.theme | 1 +
themes/nopacity-darkred.theme | 1 +
themes/nopacity-default.theme | 1 +
views/displayaudiotracksview.c | 79 +
views/displayaudiotracksview.h | 24 +
views/displaychannelview.c | 564 ++++++
views/displaychannelview.h | 58 +
views/displaymenudetailview.c | 871 ++++++++++
views/displaymenudetailview.h | 52 +
views/displaymenuitemcurrentview.c | 724 ++++++++
views/displaymenuitemcurrentview.h | 108 ++
views/displaymenuitemview.c | 870 ++++++++++
views/displaymenuitemview.h | 154 ++
views/displaymenulistview.c | 243 +++
views/displaymenulistview.h | 36 +
views/displaymenurootview.c | 627 +++++++
views/displaymenurootview.h | 75 +
views/displaymenutabview.c | 126 ++
views/displaymenutabview.h | 27 +
views/displaymenuview.c | 662 +++++++
views/displaymenuview.h | 71 +
views/displaymessageview.c | 53 +
views/displaymessageview.h | 20 +
views/displayreplayonpauseview.c | 107 ++
views/displayreplayonpauseview.h | 20 +
views/displayreplayview.c | 478 ++++++
views/displayreplayview.h | 42 +
views/displayvolumeview.c | 55 +
views/displayvolumeview.h | 21 +
views/view.c | 839 +++++++++
views/view.h | 73 +
views/viewhelpers.c | 457 +++++
views/viewhelpers.h | 25 +
1454 files changed, 95052 insertions(+)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..19526e0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+.dependencies
+*.o
+*.so
+*.orig
+*.rej
+*.mo
+*.pot
+*.tgz
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..f90922e
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/HISTORY b/HISTORY
new file mode 100644
index 0000000..fe62c28
--- /dev/null
+++ b/HISTORY
@@ -0,0 +1,205 @@
+VDR Plugin 'skindesigner' Revision History
+---------------------------------------
+
+2014-09-27: Version 0.0.1
+
+- Initial revision.
+
+Version 0.0.2
+
+- added some more tokens with more detailed audio information in
+ displaychannel -> statusinfo
+- added hasVPS for current scheduling in displaychannel -> epginfo
+- added common channel logo path for all skins
+- changed skin handling so that every skin is directly shown in VDR OSD Menu
+- added Theme support, each skin can now have various themes
+- fixed a crash if no skindesigner skins are found and plugin setup menu is
+ called from another skin
+- added {durationhours} and {durationminutes} tokens in several view elements
+- added discusage icons to menu header view element so that it discusage can be
+ displayed in every menu view
+- added numeric day, month and year tokens in different view elements
+- support for global variables type "double"
+- added setup options to configure rerun display behaviour
+- changed display of menu lists, do flush first after complete rendering
+- added support for custom tokens in dislaychannel
+- added vps token in menudetailepg
+- implemented cSDDisplayMenu::GetTextAreaFont()
+- introduced new viewelement audioinfo in displaychannel
+- added setup option to choose Menu Item display method between "at one go" and
+ "after one another"
+- fixed bug that new skin was not properly loaded sometimes when skin was
+ changed in OSD Setup menu
+- fixed bug that new font was displayed first after VDR restart when font was
+ changed in OSD Setup menu
+- display always newest recording of folders in recordings list,
+ thanks@ Lars Hanisch for providing the patch
+- added extented recording information
+- added token {nummenuitem} as number of item for every list, value starts
+ with 1
+- fixed bug that x and y of subviews was not respected
+- if a subview is completely not set in a skin, the default menu is used
+- fixed a bug if displaydetailedtext is called without correct menucat (mailbox
+ plugin)
+- implemented function drawslope, see Wiki for documentation
+- using default menu list in case an invalid MenuCategory is set
+- added device info in displaychannel, example in metrixHD
+- improved menu icon display, additionally using menu cat
+- changed devices list, device numbers start with 0
+- fixed bug that hasposter is only true if poster really exists
+- no absolute pathes allowed for image type "image", path has to start with
+ {ressourcedir}
+
+Version 0.0.3
+
+- added tokens for current video and audio bitrate in displaychannel.
+ Thx @rofafor for the original code
+ in the femon plugin and _Martin_ for extracting the code in skinflatplus
+- changed skin metrixHD to display bitrate infos
+- added "active" Token for cutting marks so that a mark can be displayed in a
+ dedicated way if current position in replay exactly hits the mark
+- added {channelname}, {channelid}, {channellogoexists} for all schedules list
+ and current views
+- added printf function for <drawtext>, see Wiki for documentation
+- removed code for displaying bitrates in displaychannel again because of
+ incompatibility with dvbapi Plugin
+- optimized performance when creating a menu list
+- fixed Bug that displaychannel was not shown after closing displaymenu with
+ "backspace" (with active menuorg plugin)
+- fixed Bug with menuselection Patch
+- added tokens {month}, {monthname} and {year} in displaymenutimers listitem and
+ currentitem
+- added dedicated tokens for posters and banners in <srapercontent> in
+ displaychannel and displayreplay
+- added Plugin Interface
+- fixed crash when clearing a message in displaychannel and displayreplay
+- fixed positioning of scaled video window if borders are configured
+
+Version 0.0.4
+
+- added SVG Support - thanks to Manuel Reimer!
+
+Version 0.0.5
+
+- added {channelnumber} and {channelname} Tokens in displaymenudetailepg
+ detailheader
+- fixed {hasicon} Token in displaymenu header
+- added {newmails} Token in displaychannel statusinfo, mailbox plugin
+ has to be installed
+- clearing displaymessage if it is called without text
+- changed handling of channel logos, width and height are now mandatory
+
+Version 0.0.6
+
+- fixed Bug that channel info was not shown when displaying reruns with
+ epgsearch
+- using VDRs OSD Language instead of system language
+- added compatibility to librsvg >= 2.36.1
+- added onpause and onpausemodeonly in displayreplay
+- added {channellogoexists} Token everywhere where {channelid} is available
+
+Version 0.0.7
+
+- fixed bug that global double vars are not working
+
+Version 0.0.8
+
+- added {channelnumber} Token in displaymenuschedules
+- displaying default menu list if menu category is set to another category
+ but SetItem() is called
+
+Version 0.1.0
+
+- fixed display of color buttons in detailed views
+- fixed possible Nullpointer access in displaymenurootview
+- added currentschedule viewelement in displaymenumain
+- fixed bug that wrong channel was shown in header of whatson
+ if entering from whatsonnow
+- added customtokens view element in displaymenumain
+- added automatic determination of custom int tokens
+
+Version 0.1.1
+
+- added "temperatures" view element in displaymenumainview to display
+ cpu and gpu temperature in main menu (scripts to get temperatures
+ borrowed from skinflatplus). scripts to get temperatures have to be
+ adapted according the system setup.
+- added "time" view element in displaychannelview, displayreplay view
+ and displaymenuviews to display current time with seconds precision
+- added {currenttab}, {prevtab}, {nexttab} Tokens in <tablabels> view
+ elements
+- fixed bug that in displaytracks the audio tracks are not positioned
+ correctly
+- fixed some minor bugs
+- added skin "blackhole"
+- added customtokens view element in displayreplay
+- optimised some settings in skin blackhole
+
+
+Version 0.1.2
+
+- display only active remote timers in main menu
+- fixed two possible null pointer accesses in displaymenurootview
+- fixed bug that EPGSearch Favorites Menu was not displayed correctly,
+ introduced "whatsonfavorites" Token in displaymenuschedules
+- fixed again display of channel in schedules header
+- added now and next in blackhole channels menu
+- fixed bug that epg quicksearch menu was not displayed properly
+- added weatherforecast templates
+- some fixes for plugins which use skindesigner template interface
+
+Version 0.1.3
+
+- added {epgname} token for recordings in currentview and detailedview.
+- fixed crash when start recording with extrecmenu or remotetimers
+
+Version 0.1.4
+
+- fixed token volpercent in nopacity and metrixhd
+- added "empty" operator additionally to "isset" to check in a condition
+ if a string token is set
+- added token {nummenuitem} for plugin menu lists
+- fixed bug that custom int tokens were not considered in conditions
+- added possibility for skinners to define a skin setup, skin setup can
+ be done in plugin setup menu
+- made skin blackhole configurable, adapted xml files
+
+Version 0.1.5
+
+- removed suppression of first DisplayChannel call after VDR start
+- fixed "flickering" bug with vdr2.1.7
+- fixed bug that osd language was not set correctly which caused one
+ additional skin caching at startup
+
+Version 0.1.6
+
+- fixed bug that onpause view potentially starts during setting cutting
+ marks
+- made all globals variables private
+- introduced globals.xml in skinpath, theme.xml in theme path. theme.xml
+ adds its vakues and potentially overrides valués from globals.xml
+- check icons, menuicons and skinparts additionally directly in skin folder
+ to allow default images which can be used for all skins
+- fixed bug that setup variables are sometimes not identified in case two
+ or more skin names start identically
+
+Version 0.2.0
+
+- fixed Bug that double vars were not handled correctly
+- fixed Bug that calling mplayer plugin via keymacros.conf causes segfault
+
+Version 0.2.1
+
+- fixed bug that global tokens were not parsed correctly
+- added finnish translation
+- some more nopacity optimizations - thanx at utility
+- added possibiliy to use submenus in the skin setup menus
+- reloading active skin directly after closing setup menu so that
+ changes of setup parameters are immediately in use
+
+Version 0.2.2
+
+- added replay onpause view in blackhole skin
+- implemented SetTitle() in displayreplay
+- fixed header icon for plugin menus
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..d2d77aa
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,182 @@
+#
+# Makefile for a Video Disk Recorder plugin
+#
+# $Id$ Makefile 1.0 2014/07/24 louis Exp $
+
+# Config
+CONFIG := #-DDOPROFILE # enable profiling code
+
+# The official name of this plugin.
+PLUGIN = skindesigner
+
+### The version number of this plugin (taken from the main source file):
+VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
+
+### The directory environment:
+
+# Use package data if installed...otherwise assume we're under the VDR source directory:
+PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
+LIBDIR = $(call PKGCFG,libdir)
+LOCDIR = $(call PKGCFG,locdir)
+PLGCFG = $(call PKGCFG,plgcfg)
+VDRCONFDIR = $(call PKGCFG,configdir)
+PLGRESDIR = $(call PKGCFG,resdir)/plugins/$(PLUGIN)
+TMPDIR ?= /tmp
+SKINDESIGNER_SCRIPTDIR ?= $(LIBDIR)/$(PLUGIN)/scripts
+
+### The compiler options:
+export CFLAGS = $(call PKGCFG,cflags)
+export CXXFLAGS = $(call PKGCFG,cxxflags)
+
+### Allow user defined options to overwrite defaults:
+
+-include $(PLGCFG)
+
+### The version number of VDR's plugin API:
+APIVERSION = $(call PKGCFG,apiversion)
+
+### The name of the distribution archive:
+ARCHIVE = $(PLUGIN)-$(VERSION)
+PACKAGE = vdr-$(ARCHIVE)
+
+### The name of the shared object file:
+SOFILE = libvdr-$(PLUGIN).so
+
+### Includes and Defines and Dependencies:
+DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' $(CONFIG)
+DEFINES += $(shell xml2-config --cflags)
+DEFINES += -DSCRIPTFOLDER='"$(SKINDESIGNER_SCRIPTDIR)"'
+
+INCLUDES += $(shell pkg-config --cflags freetype2 fontconfig)
+
+INCLUDES += $(shell pkg-config --cflags librsvg-2.0 cairo-png) -ljpeg
+LIBS += $(shell pkg-config --libs librsvg-2.0 cairo-png) -ljpeg
+
+LIBS += $(shell xml2-config --libs)
+
+### The object files:
+OBJS = $(PLUGIN).o \
+ config.o \
+ setup.o \
+ designer.o \
+ displaychannel.o \
+ displaymenu.o \
+ displaymessage.o \
+ displayreplay.o \
+ displaytracks.o \
+ displayvolume.o \
+ libcore/pixmapcontainer.o \
+ libcore/fontmanager.o \
+ libcore/imagecache.o \
+ libcore/helpers.o \
+ libcore/imageloader.o \
+ libcore/recfolderinfo.o \
+ libcore/skinsetup.o \
+ libcore/extrecinfo.o \
+ libcore/timers.o \
+ libtemplate/globals.o \
+ libtemplate/parameter.o \
+ libtemplate/template.o \
+ libtemplate/templateview.o \
+ libtemplate/templateviewelement.o \
+ libtemplate/templateviewlist.o \
+ libtemplate/templatepixmap.o \
+ libtemplate/templateviewtab.o \
+ libtemplate/templatefunction.o \
+ libtemplate/templateloopfunction.o \
+ libtemplate/xmlparser.o \
+ views/view.o \
+ views/viewhelpers.o \
+ views/displaychannelview.o \
+ views/displaymenurootview.o \
+ views/displaymenuview.o \
+ views/displaymenulistview.o \
+ views/displaymenuitemview.o \
+ views/displaymenuitemcurrentview.o \
+ views/displaymenudetailview.o \
+ views/displaymenutabview.o \
+ views/displaymessageview.o \
+ views/displayreplayview.o \
+ views/displayreplayonpauseview.o \
+ views/displayvolumeview.o \
+ views/displayaudiotracksview.o
+
+### The main target:
+
+all: $(SOFILE) i18n
+
+### Implicit rules:
+
+%.o: %.c
+ $(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
+ msgfmt -c -o $@ $<
+
+$(I18Npot): $(wildcard *.c)
+ xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
+
+%.po: $(I18Npot)
+ msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
+ @touch $@
+
+$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
+ install -D -m644 $< $@
+
+.PHONY: i18n
+i18n: $(I18Nmo) $(I18Npot)
+
+install-i18n: $(I18Nmsgs)
+
+### Targets:
+
+$(SOFILE): $(OBJS)
+ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) $(LIBS) -o $@
+
+install-lib: $(SOFILE)
+ install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
+
+install-themes:
+ mkdir -p $(DESTDIR)$(VDRCONFDIR)/themes
+ cp themes/* $(DESTDIR)$(VDRCONFDIR)/themes
+
+install-skins:
+ mkdir -p $(DESTDIR)$(PLGRESDIR)/skins
+ cp -r skins/* $(DESTDIR)$(PLGRESDIR)/skins
+ mkdir -p $(DESTDIR)$(PLGRESDIR)/dtd
+ cp -r dtd/* $(DESTDIR)$(PLGRESDIR)/dtd
+
+install-scripts:
+ mkdir -p $(DESTDIR)$(SKINDESIGNER_SCRIPTDIR)
+ cp -r scripts/* $(DESTDIR)$(SKINDESIGNER_SCRIPTDIR)
+
+install: install-lib install-i18n install-themes install-skins install-scripts
+
+dist: $(I18Npo) clean
+ @-rm -rf $(TMPDIR)/$(ARCHIVE)
+ @mkdir $(TMPDIR)/$(ARCHIVE)
+ @cp -a * $(TMPDIR)/$(ARCHIVE)
+ @tar czf $(PACKAGE).tgz --exclude .git* --exclude *.o --exclude *.rej --exclude *.orig -C $(TMPDIR) $(ARCHIVE)
+ @-rm -rf $(TMPDIR)/$(ARCHIVE)
+ @echo Distribution package created as $(PACKAGE).tgz
+
+clean:
+ @-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
+ @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
diff --git a/README b/README
new file mode 100644
index 0000000..0832271
--- /dev/null
+++ b/README
@@ -0,0 +1,108 @@
+This is a "plugin" for the Video Disk Recorder (VDR).
+
+Written by: Louis Braun <louis DOT braun AT gmx DOT de>
+
+Project's homepage: http://projects.vdr-developer.org/projects/plg-skindesigner
+
+Latest version: http://projects.vdr-developer.org/projects/plg-skindesigner/files
+GIT repository: git clone git://projects.vdr-developer.org/vdr-plugin-skindesigner.git
+
+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
+-----------
+
+Skindesigner is a VDR skin engine that displays XML based Skins.
+
+Currently two XML Skins (MetrixHD and nOpacity freestyle) are included in
+<pluginsourcedir>/skins/
+
+Requirements
+------------
+
+- VDR version >= 2.0.0
+
+- cairo
+
+- librsvg-2 >= 2.36.0
+
+- libxml2
+
+- for scaling the video picture to fit into the VDR menu window please use
+ softhddevice plugin revision 87c1c7be (2013-01-01) or newer.
+
+- epgsearch Git since commit ba7c6277 (2013-01-03) to correctly replace the
+ schedules menu with epgsearch
+
+Installation
+------------
+
+After "normal" Plugin installation you have to care about the paths for the
+XML skins and epg images. The following paths can be set at startup:
+
+-s <SKINPATH>, --skinpath=<SKINPATH>
+ Path to the XML skins (Default: <ResourceDirectory>/plugins/skindesigner/skins/)
+
+-l <LOGOPATH>, --logopath=<LOGOPATH>
+ Path to common logo set for all skins (Default: <ResourceDirectory>/plugins/skindesigner/logos/)
+
+-e path, --epgimages=path
+ Path to the epgimages (Default: <CacheDirectory>/epgimages/)
+
+ResourceDirectory and CacheDirectory are taken from your VDR configuration
+(make.config or vdr.pc).
+
+During a "make install" the included skins are automatically copied from
+<SkinSourceDirectory>/skins/ to the configured path.
+
+For S2-6400 Users: Disable High Level OSD, otherwise the plugin will not be
+loaded because lack of true color support
+
+For Xine-Plugin Users: Set "Blend scaled Auto" as OSD display mode to achieve
+an suitable true color OSD.
+
+For Xineliboutput Users: Start vdr-sxfe with the --hud option enabled
+
+Since the default skin MetrixHD uses VDROpenSans as font which is not installed
+per default, you may want to install this font (included in
+<SkinSourceDirectory>/fonts/) first. Otherwise the inside VDRs OSD menu
+configured vdrOsd Font is used as default.
+
+Channel Logos
+-------------
+
+Since each XML skin is responsible for it's used channel logos, skindesigner
+searches for channel logos only in the skin dependend directory
+
+<ResourceDirectory>/plugins/skindesigner/skins/<skinname>/logos
+
+Each copy your used logos directly to this directory or set a symbolic link to
+a common channellogo directory.
+
+I recommend to use channel logos from https://github.com/3PO/Senderlogos
+To download them just change in the directory you want to place the logos
+and do a:
+git clone https://github.com/3PO/Senderlogos.git logos
+An update of the logos can then be done with a "git pull" just inside this
+directory.
+
+In this logo pack all files are named only with lower case letters.
+Skindesigner uses the channel name CONVERTED TO LOWER CASE LETTERS to search
+for an appropriate channel logo. With this, approximately 90% of the channel
+logos should work immediately after placing the channel logos in the correct
+place. So if you have to change the name of a channel logo (may be by inserting
+a space or a hyphen) so that it fits to the channel name, only use lower case
+letters, and not the name of the channel with upper and lower letters as
+displayed inside VDR.
+If no logo is found for the channel name, additionally a search for a logo
+named as the ChannelID is performed. Analog to the channel name the ChannelID
+is also converted to lower case letters. This allows channel logos for channels
+with changing names (for instance Sky Feed Channels).
+Additional hint: some channels have slashes in their name (in germany
+nick/comedy for instance).
+In this example, as a dirty hack just create a folder in your channel logo
+directory named "nick" and place an image named "comedy.png" inside this folder.
diff --git a/config.c b/config.c
new file mode 100644
index 0000000..8b018f7
--- /dev/null
+++ b/config.c
@@ -0,0 +1,333 @@
+#include "config.h"
+#include "libcore/helpers.h"
+#include "libcore/imageloader.h"
+
+cDesignerConfig::cDesignerConfig() {
+ tmplGlobals = NULL;
+ epgImagePathSet = false;
+ skinPathSet = false;
+ logoPathSet = false;
+ //Common
+ numLogosPerSizeInitial = 30;
+ limitLogoCache = 1;
+ numLogosMax = 200;
+ debugImageLoading = 0;
+ replaceDecPoint = false;
+ //settings for rerun display
+ rerunAmount = 10;
+ rerunDistance = 2;
+ rerunMaxChannel = 0;
+ //menu display style, display menu items
+ //one after each other or in one step
+ blockFlush = 1;
+ //remember current skin and theme, osd size and osd fonts
+ SetSkin();
+ SetOSDSize();
+ SetOSDFonts();
+ osdLanguage = "";
+ setupCloseDoReload = false;
+}
+
+cDesignerConfig::~cDesignerConfig() {
+ ClearSkinSetups();
+}
+
+void cDesignerConfig::SetPathes(void) {
+ if (!skinPathSet)
+ skinPath = cString::sprintf("%s/skins/", cPlugin::ResourceDirectory(PLUGIN_NAME_I18N));
+ if (!logoPathSet)
+ logoPath = cString::sprintf("%s/logos/", cPlugin::ResourceDirectory(PLUGIN_NAME_I18N));
+ if (!epgImagePathSet)
+ epgImagePath = cString::sprintf("%s/epgimages/", cPlugin::CacheDirectory(PLUGIN_NAME_I18N));
+
+ dsyslog("skindesigner: using Skin Directory %s", *skinPath);
+ dsyslog("skindesigner: using common ChannelLogo Directory %s", *logoPath);
+ dsyslog("skindesigner: using EPG Images Directory %s", *epgImagePath);
+}
+
+void cDesignerConfig::SetSkinPath(cString path) {
+ skinPath = CheckSlashAtEnd(*path);
+ skinPathSet = true;
+}
+
+void cDesignerConfig::SetLogoPath(cString path) {
+ logoPath = CheckSlashAtEnd(*path);
+ logoPathSet = true;
+}
+
+void cDesignerConfig::SetEpgImagePath(cString path) {
+ epgImagePath = CheckSlashAtEnd(*path);
+ epgImagePathSet = true;
+}
+
+void cDesignerConfig::ReadSkins(void) {
+ DIR *folder = NULL;
+ struct dirent *dirEntry;
+ folder = opendir(skinPath);
+ if (!folder) {
+ esyslog("skindesigner: no skins found in %s", *skinPath);
+ return;
+ }
+ while (dirEntry = readdir(folder)) {
+ string dirEntryName = dirEntry->d_name;
+ int dirEntryType = dirEntry->d_type;
+ if (!dirEntryName.compare(".") || !dirEntryName.compare("..") || dirEntryType != DT_DIR)
+ continue;
+ skins.push_back(dirEntryName);
+ }
+ dsyslog("skindesigner %ld skins found in %s", skins.size(), *skinPath);
+}
+
+void cDesignerConfig::ClearSkinSetups(void) {
+ for (map < string, cSkinSetup* >::iterator it = skinSetups.begin(); it != skinSetups.end(); it++) {
+ delete it->second;
+ }
+ skinSetups.clear();
+}
+
+void cDesignerConfig::DebugSkinSetups(void) {
+ dsyslog("skindesigner: skin setups:");
+ InitSetupIterator();
+ cSkinSetup *skinSetup = NULL;
+ while (skinSetup = GetNextSkinSetup()) {
+ skinSetup->Debug();
+ }
+}
+
+void cDesignerConfig::DebugSkinSetupParameters(void) {
+ dsyslog("skindesigner: skin setup parameters:");
+ for (vector<pair<string, int> >::iterator it = skinSetupParameters.begin(); it != skinSetupParameters.end(); it++) {
+ dsyslog("skindesigner: parameter %s value %d", (*it).first.c_str(), (*it).second);
+ }
+}
+
+void cDesignerConfig::ReadSkinSetup(string skin) {
+ cSkinSetup *skinSetup = new cSkinSetup(skin);
+ if (skinSetup->ReadFromXML()) {
+ //skinSetup->Debug();
+ skinSetups.insert(pair<string, cSkinSetup* >(skin, skinSetup));
+ }
+}
+
+bool cDesignerConfig::GetSkin(string &skin) {
+ if (skinIterator == skins.end()) {
+ return false;
+ }
+ skin = *skinIterator;
+ skinIterator++;
+ return true;
+}
+
+cSkinSetup* cDesignerConfig::GetSkinSetup(string &skin) {
+ map< string, cSkinSetup* >::iterator hit = skinSetups.find(skin);
+ if (hit != skinSetups.end()) {
+ return hit->second;
+ }
+ return NULL;
+}
+
+cSkinSetup* cDesignerConfig::GetNextSkinSetup(void) {
+ if (setupIt == skinSetups.end()) {
+ return NULL;
+ }
+ cSkinSetup* skinSetup = setupIt->second;
+ setupIt++;
+ return skinSetup;
+}
+
+cSkinSetupMenu* cDesignerConfig::GetSkinSetupMenu(string &skin, string &menu) {
+ cSkinSetup *skinSetup = GetSkinSetup(skin);
+ if (!skinSetup)
+ return NULL;
+ esyslog("skindesigner: skinsetup found");
+ return skinSetup->GetMenu(menu);
+}
+
+
+void cDesignerConfig::TranslateSetup(void) {
+ for (map< string, cSkinSetup* >::iterator it = skinSetups.begin(); it != skinSetups.end(); it++) {
+ (it->second)->TranslateSetup();
+ }
+}
+
+void cDesignerConfig::UpdateSkinSetupParameter(string name, int value) {
+ vector<pair<string,int> >::iterator hit;
+ for (hit = skinSetupParameters.begin(); hit != skinSetupParameters.end(); hit++) {
+ if (!name.compare((*hit).first)) {
+ skinSetupParameters.erase(hit);
+ break;
+ }
+ }
+ skinSetupParameters.push_back(pair<string,int>(name, value));
+}
+
+void cDesignerConfig::SetSkinSetupParameters(void) {
+ for (vector < pair <string, int> >::iterator it = skinSetupParameters.begin(); it != skinSetupParameters.end(); it++) {
+ string name = (*it).first;
+ int value = (*it).second;
+
+ InitSkinIterator();
+ string activeSkin = "";
+ bool skinFound = false;
+ while (GetSkin(activeSkin)) {
+ stringstream checkString;
+ checkString << activeSkin << ".";
+ size_t hit = name.find(checkString.str());
+ if (hit != 0)
+ continue;
+ skinFound = true;
+ break;
+ }
+ if (skinFound) {
+ cSkinSetup* skinSetup = GetSkinSetup(activeSkin);
+ if (skinSetup != NULL) {
+ string paramName = name.substr(activeSkin.size()+1);
+ cSkinSetupParameter *skinSetupParam = skinSetup->GetParameter(paramName);
+ if (skinSetupParam) {
+ skinSetupParam->value = value;
+ continue;
+ }
+ }
+ }
+ esyslog("skindesigner: ERROR Unknown Setup Parameter %s", name.c_str());
+ }
+}
+
+void cDesignerConfig::UpdateGlobals(void) {
+ string activeSkin = Setup.OSDSkin;
+ cSkinSetup *skinSetupActiveSkin = GetSkinSetup(activeSkin);
+ if (skinSetupActiveSkin && tmplGlobals) {
+ dsyslog("skindesigner: globals for skin %s adapted to skin setup", activeSkin.c_str());
+ skinSetupActiveSkin->AddToGlobals(tmplGlobals);
+ }
+}
+
+void cDesignerConfig::CheckDecimalPoint(void) {
+ struct lconv *pLocInfo;
+ pLocInfo = localeconv();
+ string decimalPoint = pLocInfo->decimal_point;
+ if (decimalPoint.compare(".")) {
+ dsyslog("skindesigner: using decimal point %s", decimalPoint.c_str());
+ replaceDecPoint = true;
+ decPoint = decimalPoint[0];
+ }
+}
+
+void cDesignerConfig::SetSkin(void) {
+ osdSkin = Setup.OSDSkin;
+ osdTheme = Setup.OSDTheme;
+}
+
+bool cDesignerConfig::SkinChanged(void) {
+ bool changed = false;
+ if (osdSkin.compare(Setup.OSDSkin) != 0) {
+ dsyslog("skindesigner: skin changed from %s to %s", osdSkin.c_str(), Setup.OSDSkin);
+ changed = true;
+ }
+ if (osdTheme.compare(Setup.OSDTheme) != 0) {
+ dsyslog("skindesigner: theme changed from %s to %s", osdTheme.c_str(), Setup.OSDTheme);
+ changed = true;
+ }
+ if (changed)
+ SetSkin();
+ return changed;
+}
+
+void cDesignerConfig::SetOSDSize(void) {
+ osdSize.SetWidth(cOsd::OsdWidth());
+ osdSize.SetHeight(cOsd::OsdHeight());
+ osdSize.SetX(cOsd::OsdLeft());
+ osdSize.SetY(cOsd::OsdTop());
+}
+
+bool cDesignerConfig::OsdSizeChanged(void) {
+ if ((osdSize.Width() != cOsd::OsdWidth()) ||
+ (osdSize.Height() != cOsd::OsdHeight()) ||
+ (osdSize.X() != cOsd::OsdLeft()) ||
+ (osdSize.Y() != cOsd::OsdTop())) {
+ dsyslog("skindesigner: osd size changed");
+ dsyslog("skindesigner: old osd size: top %d left %d size %d * %d", osdSize.X(), osdSize.Y(), osdSize.Width(), osdSize.Height());
+ SetOSDSize();
+ dsyslog("skindesigner: new osd size: top %d left %d size %d * %d", osdSize.X(), osdSize.Y(), osdSize.Width(), osdSize.Height());
+ return true;
+ }
+ return false;
+}
+
+void cDesignerConfig::SetOSDFonts(void) {
+ fontFix = Setup.FontFix;
+ fontOsd = Setup.FontOsd;
+ fontSml = Setup.FontSml;
+}
+
+bool cDesignerConfig::OsdFontsChanged(void) {
+ bool changed = false;
+ if (fontFix.compare(Setup.FontFix) != 0) {
+ changed = true;
+ }
+ if (fontOsd.compare(Setup.FontOsd) != 0) {
+ changed = true;
+ }
+ if (fontSml.compare(Setup.FontSml) != 0) {
+ changed = true;
+ }
+ if (changed)
+ SetOSDFonts();
+ return changed;
+}
+
+bool cDesignerConfig::OsdLanguageChanged(void) {
+ if (osdLanguage.compare(Setup.OSDLanguage)) {
+ osdLanguage = Setup.OSDLanguage;
+ return true;
+ }
+ return false;
+}
+
+cString cDesignerConfig::GetSkinRessourcePath(void) {
+ return cString::sprintf("%s%s", *skinPath, osdSkin.c_str());
+}
+
+void cDesignerConfig::AddPlugin(string name, map < int, string > &menus) {
+ plugins.insert(pair< string, map < int, string > >(name, menus));
+}
+
+void cDesignerConfig::InitPluginIterator(void) {
+ plugIt = plugins.begin();
+}
+
+map <int,string> *cDesignerConfig::GetPluginTemplates(string &name) {
+ if (plugIt == plugins.end())
+ return NULL;
+ name = plugIt->first;
+ map <int,string> *templates = &plugIt->second;
+ plugIt++;
+ return templates;
+}
+
+cString cDesignerConfig::CheckSlashAtEnd(std::string path) {
+ try {
+ if (!(path.at(path.size()-1) == '/'))
+ return cString::sprintf("%s/", path.c_str());
+ } catch (...) {return path.c_str();}
+ return path.c_str();
+}
+
+bool cDesignerConfig::SetupParse(const char *Name, const char *Value) {
+ bool pluginSetupParam = true;
+ if (!strcasecmp(Name, "DebugImageLoading")) debugImageLoading = atoi(Value);
+ else if (!strcasecmp(Name, "LimitChannelLogoCache")) limitLogoCache = atoi(Value);
+ else if (!strcasecmp(Name, "NumberLogosInitially")) numLogosPerSizeInitial = atoi(Value);
+ else if (!strcasecmp(Name, "NumberLogosMax")) numLogosMax = atoi(Value);
+ else if (!strcasecmp(Name, "RerunAmount")) rerunAmount = atoi(Value);
+ else if (!strcasecmp(Name, "RerunDistance")) rerunDistance = atoi(Value);
+ else if (!strcasecmp(Name, "RerunMaxChannel")) rerunMaxChannel = atoi(Value);
+ else if (!strcasecmp(Name, "BlockFlush")) blockFlush = atoi(Value);
+ else pluginSetupParam = false;
+
+ if (!pluginSetupParam) {
+ skinSetupParameters.push_back(pair <string, int>(Name, atoi(Value)));
+ }
+
+ return true;
+}
diff --git a/config.h b/config.h
new file mode 100644
index 0000000..a10ad5f
--- /dev/null
+++ b/config.h
@@ -0,0 +1,107 @@
+#ifndef __DESIGNER_CONFIG_H
+#define __DESIGNER_CONFIG_H
+
+#include <string>
+#include <vector>
+#include <map>
+#include <vdr/tools.h>
+#include <vdr/skins.h>
+#include <vdr/plugin.h>
+#include "libcore/fontmanager.h"
+#include "libcore/imagecache.h"
+#include "libcore/recfolderinfo.h"
+#include "libcore/skinsetup.h"
+
+#define SCRIPTOUTPUTPATH "/tmp/skindesigner"
+
+class cDesignerConfig {
+private:
+ cString CheckSlashAtEnd(string path);
+ bool epgImagePathSet;
+ bool skinPathSet;
+ bool logoPathSet;
+ cRect osdSize;
+ string osdSkin;
+ string osdTheme;
+ string fontFix;
+ string fontOsd;
+ string fontSml;
+ string osdLanguage;
+ cGlobals *tmplGlobals;
+ map < string, map < int, string > > plugins;
+ map < string, map < int, string > >::iterator plugIt;
+ map < string, cSkinSetup* > skinSetups;
+ map < string, cSkinSetup* >::iterator setupIt;
+ vector < pair <string, int> > skinSetupParameters;
+public:
+ cDesignerConfig();
+ ~cDesignerConfig();
+ bool SetupParse(const char *Name, const char *Value);
+ void SetPathes(void);
+ void SetSkinPath(cString path);
+ void SetLogoPath(cString path);
+ void SetEpgImagePath(cString path);
+ void ReadSkins(void);
+ void ReadSkinSetup(string skin);
+ void InitSkinIterator(void) { skinIterator = skins.begin(); };
+ bool GetSkin(string &skin);
+ void ClearSkinSetups(void);
+ void DebugSkinSetups(void);
+ void DebugSkinSetupParameters(void);
+ cSkinSetup* GetSkinSetup(string &skin);
+ cSkinSetup* GetNextSkinSetup(void);
+ cSkinSetupMenu* GetSkinSetupMenu(string &skin, string &menu);
+ void InitSetupIterator(void) { setupIt = skinSetups.begin(); };
+ void TranslateSetup(void);
+ void SetSkinSetupParameters(void);
+ void UpdateSkinSetupParameter(string name, int value);
+ void SetGlobals(cGlobals *globals) { tmplGlobals = globals; };
+ void UpdateGlobals(void);
+ void CheckDecimalPoint(void);
+ void SetSkin(void);
+ bool SkinChanged(void);
+ void SetOSDSize(void);
+ bool OsdSizeChanged(void);
+ void SetOSDFonts(void);
+ bool OsdFontsChanged(void);
+ void SetOsdLanguage(void) { osdLanguage = Setup.OSDLanguage; };
+ bool OsdLanguageChanged(void);
+ cString GetSkinRessourcePath(void);
+ void AddPlugin(string name, map < int, string > &menus);
+ void InitPluginIterator(void);
+ map <int,string> *GetPluginTemplates(string &name);
+ cString skinPath;
+ cString logoPath;
+ cString epgImagePath;
+ vector<string> skins;
+ vector<string>::iterator skinIterator;
+ bool replaceDecPoint;
+ char decPoint;
+ //Setup Parameter
+ int numLogosPerSizeInitial;
+ int limitLogoCache;
+ int numLogosMax;
+ int debugImageLoading;
+ int rerunAmount;
+ int rerunDistance;
+ int rerunMaxChannel;
+ int blockFlush;
+ //TemplateReload on Setup Close
+ bool setupCloseDoReload;
+};
+
+#ifdef DEFINE_CONFIG
+ cDesignerConfig config;
+ cFontManager *fontManager = NULL;
+ cImageCache *imgCache = NULL;
+ cTheme Theme;
+ cRecordingsFolderInfo recFolderInfo(Recordings);
+#else
+ extern cDesignerConfig config;
+ extern cFontManager *fontManager;
+ extern cImageCache *imgCache;
+ extern cTheme Theme;
+ extern cRecordingsFolderInfo recFolderInfo;
+#endif
+
+#endif //__DESIGNER_CONFIG_H
diff --git a/designer.c b/designer.c
new file mode 100644
index 0000000..c279650
--- /dev/null
+++ b/designer.c
@@ -0,0 +1,349 @@
+#include "designer.h"
+#include "libcore/helpers.h"
+
+cSkinDesigner::cSkinDesigner(string skin) : cSkin(skin.c_str(), &::Theme) {
+ init = true;
+ this->skin = skin;
+
+ backupSkin = NULL;
+ useBackupSkin = false;
+
+ globals = NULL;
+ channelTemplate = NULL;
+ menuTemplate = NULL;
+ messageTemplate = NULL;
+ replayTemplate = NULL;
+ volumeTemplate = NULL;
+ audiotracksTemplate = NULL;
+
+ currentMenu = NULL;
+
+ dsyslog("skindesigner: skin %s started", skin.c_str());
+}
+
+cSkinDesigner::~cSkinDesigner(void) {
+ if (globals)
+ delete globals;
+ DeleteTemplates();
+ if (backupSkin)
+ delete backupSkin;
+}
+
+const char *cSkinDesigner::Description(void) {
+ return skin.c_str();
+}
+
+cSkinDisplayChannel *cSkinDesigner::DisplayChannel(bool WithInfo) {
+ currentMenu = NULL;
+ cSkinDisplayChannel *displayChannel = NULL;
+ if (!useBackupSkin) {
+ Init();
+ displayChannel = new cSDDisplayChannel(channelTemplate, WithInfo);
+ } else {
+ displayChannel = backupSkin->DisplayChannel(WithInfo);
+ }
+ return displayChannel;
+}
+
+cSkinDisplayMenu *cSkinDesigner::DisplayMenu(void) {
+ if (!useBackupSkin) {
+ cSDDisplayMenu *displayMenu = NULL;
+ Init();
+ displayMenu = new cSDDisplayMenu(menuTemplate);
+ currentMenu = displayMenu;
+ return displayMenu;
+ } else {
+ cSkinDisplayMenu *displayMenu = backupSkin->DisplayMenu();
+ currentMenu = NULL;
+ return displayMenu;
+ }
+}
+
+cSkinDisplayReplay *cSkinDesigner::DisplayReplay(bool ModeOnly) {
+ currentMenu = NULL;
+ cSkinDisplayReplay *displayReplay = NULL;
+ if (!useBackupSkin) {
+ Init();
+ displayReplay = new cSDDisplayReplay(replayTemplate, ModeOnly);
+ } else {
+ displayReplay = backupSkin->DisplayReplay(ModeOnly);
+ }
+ return displayReplay;
+}
+
+cSkinDisplayVolume *cSkinDesigner::DisplayVolume(void) {
+ currentMenu = NULL;
+ cSkinDisplayVolume *displayVolume = NULL;
+ if (!useBackupSkin) {
+ Init();
+ displayVolume = new cSDDisplayVolume(volumeTemplate);
+ } else {
+ displayVolume = backupSkin->DisplayVolume();
+ }
+ return displayVolume;
+}
+
+cSkinDisplayTracks *cSkinDesigner::DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks) {
+ currentMenu = NULL;
+ cSkinDisplayTracks *displayTracks = NULL;
+ if (!useBackupSkin) {
+ Init();
+ displayTracks = new cSDDisplayTracks(audiotracksTemplate, Title, NumTracks, Tracks);
+ } else {
+ displayTracks = backupSkin->DisplayTracks(Title, NumTracks, Tracks);
+ }
+ return displayTracks;
+}
+
+cSkinDisplayMessage *cSkinDesigner::DisplayMessage(void) {
+ currentMenu = NULL;
+ cSkinDisplayMessage *displayMessage = NULL;
+ if (!useBackupSkin) {
+ Init();
+ displayMessage = new cSDDisplayMessage(messageTemplate);
+ } else {
+ displayMessage = backupSkin->DisplayMessage();
+ }
+ return displayMessage;
+}
+
+void cSkinDesigner::Reload(void) {
+ dsyslog("skindesigner: forcing full reload of templates");
+ if (cOsd::IsOpen()) {
+ esyslog("skindesigner: OSD is open, close first!");
+ return;
+ }
+ DeleteTemplates();
+ cStopWatch watch;
+ bool ok = LoadTemplates();
+ if (!ok) {
+ esyslog("skindesigner: error during loading of templates - using LCARS as backup");
+ if (!backupSkin)
+ backupSkin = new cSkinLCARS();
+ useBackupSkin = true;
+ } else {
+ CacheTemplates();
+ useBackupSkin = false;
+ watch.Stop("templates reloaded and cache created");
+ }
+}
+
+void cSkinDesigner::ListAvailableFonts(void) {
+ fontManager->ListAvailableFonts();
+}
+
+bool cSkinDesigner::SetCustomToken(string option) {
+ splitstring s(option.c_str());
+ vector<string> flds = s.split('=', 0);
+
+ if (flds.size() != 2)
+ return false;
+
+ string key = trim(flds[0]);
+ string val = trim(flds[1]);
+
+ if (!globals)
+ return true;
+
+ if (isNumber(val)) {
+ globals->AddCustomInt(key, atoi(val.c_str()));
+ } else {
+ globals->AddCustomString(key, val);
+ }
+ return true;
+}
+
+void cSkinDesigner::ListCustomTokens(void) {
+ if (!globals)
+ return;
+ globals->ListCustomTokens();
+}
+
+/*********************************************************************************
+* PRIVATE FUNCTIONS
+*********************************************************************************/
+void cSkinDesigner::Init(void) {
+ if (init || config.OsdSizeChanged() || config.SkinChanged() || config.OsdLanguageChanged() || config.setupCloseDoReload) {
+ config.setupCloseDoReload = false;
+ if (init) {
+ config.SetSkin();
+ config.SetOSDSize();
+ config.SetOSDFonts();
+ }
+ dsyslog("skindesigner: initializing skin %s", skin.c_str());
+
+ config.CheckDecimalPoint();
+
+ if (fontManager)
+ delete fontManager;
+ fontManager = new cFontManager();
+ if (imgCache)
+ delete imgCache;
+ imgCache = new cImageCache();
+ imgCache->SetPathes();
+
+ cStopWatch watch;
+ bool ok = LoadTemplates();
+ if (!ok) {
+ esyslog("skindesigner: error during loading of templates - using LCARS as backup");
+ backupSkin = new cSkinLCARS();
+ useBackupSkin = true;
+ } else {
+ CacheTemplates();
+ watch.Stop("templates loaded and cache created");
+ }
+ init = false;
+ } else if (config.OsdFontsChanged()) {
+ dsyslog("skindesigner: reloading fonts");
+ if (fontManager)
+ delete fontManager;
+ fontManager = new cFontManager();
+ cStopWatch watch;
+ bool ok = LoadTemplates();
+ if (!ok) {
+ esyslog("skindesigner: error during loading of templates - using LCARS as backup");
+ backupSkin = new cSkinLCARS();
+ useBackupSkin = true;
+ } else {
+ CacheTemplates();
+ watch.Stop("templates loaded and cache created");
+ }
+ }
+}
+
+void cSkinDesigner::DeleteTemplates(void) {
+ if (channelTemplate) {
+ delete channelTemplate;
+ channelTemplate = NULL;
+ }
+ if (menuTemplate) {
+ delete menuTemplate;
+ menuTemplate = NULL;
+ }
+ if (messageTemplate) {
+ delete messageTemplate;
+ messageTemplate = NULL;
+ }
+ if (replayTemplate) {
+ delete replayTemplate;
+ replayTemplate = NULL;
+ }
+ if (volumeTemplate) {
+ delete volumeTemplate;
+ volumeTemplate = NULL;
+ }
+ if (audiotracksTemplate) {
+ delete audiotracksTemplate;
+ audiotracksTemplate = NULL;
+ }
+}
+
+bool cSkinDesigner::LoadTemplates(void) {
+ if (globals)
+ delete globals;
+ globals = new cGlobals();
+ bool ok = globals->ReadFromXML();
+ if (!ok) {
+ esyslog("skindesigner: error parsing globals, aborting");
+ return false;
+ }
+ config.SetGlobals(globals);
+
+ cSkinSetup *skinSetup = config.GetSkinSetup(skin);
+ if (skinSetup) {
+ skinSetup->AddToGlobals(globals);
+ }
+
+ DeleteTemplates();
+
+ channelTemplate = new cTemplate(vtDisplayChannel);
+ channelTemplate->SetGlobals(globals);
+ ok = channelTemplate->ReadFromXML();
+ if (!ok) {
+ esyslog("skindesigner: error reading displaychannel template, aborting");
+ DeleteTemplates();
+ return false;
+ }
+ channelTemplate->Translate();
+
+ menuTemplate = new cTemplate(vtDisplayMenu);
+ menuTemplate->SetGlobals(globals);
+ ok = menuTemplate->ReadFromXML();
+ if (!ok) {
+ esyslog("skindesigner: error reading displaymenu template, aborting");
+ DeleteTemplates();
+ return false;
+ }
+ menuTemplate->Translate();
+
+ messageTemplate = new cTemplate(vtDisplayMessage);
+ messageTemplate->SetGlobals(globals);
+ ok = messageTemplate->ReadFromXML();
+ if (!ok) {
+ esyslog("skindesigner: error reading displaymessage template, aborting");
+ DeleteTemplates();
+ return false;
+ }
+ messageTemplate->Translate();
+
+ replayTemplate = new cTemplate(vtDisplayReplay);
+ replayTemplate->SetGlobals(globals);
+ ok = replayTemplate->ReadFromXML();
+ if (!ok) {
+ esyslog("skindesigner: error reading displayreplay template, aborting");
+ DeleteTemplates();
+ return false;
+ }
+ replayTemplate->Translate();
+
+ volumeTemplate = new cTemplate(vtDisplayVolume);
+ volumeTemplate->SetGlobals(globals);
+ ok = volumeTemplate->ReadFromXML();
+ if (!ok) {
+ esyslog("skindesigner: error reading displayvolume template, aborting");
+ DeleteTemplates();
+ return false;
+ }
+ volumeTemplate->Translate();
+
+ audiotracksTemplate = new cTemplate(vtDisplayAudioTracks);
+ audiotracksTemplate->SetGlobals(globals);
+ ok = audiotracksTemplate->ReadFromXML();
+ if (!ok) {
+ esyslog("skindesigner: error reading displayaudiotracks template, aborting");
+ DeleteTemplates();
+ return false;
+ }
+ audiotracksTemplate->Translate();
+
+ dsyslog("skindesigner: templates successfully validated and parsed");
+ return true;
+}
+
+void cSkinDesigner::CacheTemplates(void) {
+ channelTemplate->PreCache();
+ menuTemplate->PreCache();
+ messageTemplate->PreCache();
+ replayTemplate->PreCache();
+ volumeTemplate->PreCache();
+ audiotracksTemplate->PreCache();
+ dsyslog("skindesigner: templates cached");
+ fontManager->CacheFonts(channelTemplate);
+ fontManager->CacheFonts(menuTemplate);
+ fontManager->CacheFonts(messageTemplate);
+ fontManager->CacheFonts(replayTemplate);
+ fontManager->CacheFonts(volumeTemplate);
+ fontManager->CacheFonts(audiotracksTemplate);
+ dsyslog("skindesigner: fonts cached");
+ dsyslog("skindesigner: caching images...");
+ imgCache->Clear();
+ imgCache->SetPathes();
+ channelTemplate->CacheImages();
+ menuTemplate->CacheImages();
+ messageTemplate->CacheImages();
+ replayTemplate->CacheImages();
+ volumeTemplate->CacheImages();
+ audiotracksTemplate->CacheImages();
+ imgCache->Debug(false);
+}
+
diff --git a/designer.h b/designer.h
new file mode 100644
index 0000000..abb63bc
--- /dev/null
+++ b/designer.h
@@ -0,0 +1,52 @@
+#ifndef __SKINDESIGNER_H
+#define __SKINDESIGNER_H
+
+#include "config.h"
+#include "libtemplate/template.h"
+#include "libtemplate/xmlparser.h"
+#include "displaychannel.h"
+#include "displaymenu.h"
+#include "displayreplay.h"
+#include "displayvolume.h"
+#include "displaytracks.h"
+#include "displaymessage.h"
+#include <vdr/skinlcars.h>
+
+class cSkinDesigner : public cSkin {
+private:
+ bool init;
+ string skin;
+ cSkinLCARS *backupSkin;
+ bool useBackupSkin;
+ cGlobals *globals;
+ cTemplate *channelTemplate;
+ cTemplate *menuTemplate;
+ cTemplate *messageTemplate;
+ cTemplate *replayTemplate;
+ cTemplate *volumeTemplate;
+ cTemplate *audiotracksTemplate;
+ cSDDisplayMenu *currentMenu;
+ void Init(void);
+ void ReloadCaches(void);
+ void DeleteTemplates(void);
+ bool LoadTemplates(void);
+ void CacheTemplates(void);
+public:
+ cSkinDesigner(string skin);
+ virtual ~cSkinDesigner(void);
+ virtual const char *Description(void);
+ virtual cSkinDisplayChannel *DisplayChannel(bool WithInfo);
+ virtual cSkinDisplayMenu *DisplayMenu(void);
+ virtual cSkinDisplayReplay *DisplayReplay(bool ModeOnly);
+ virtual cSkinDisplayVolume *DisplayVolume(void);
+ virtual cSkinDisplayTracks *DisplayTracks(const char *Title, int NumTracks, const char * const *Tracks);
+ virtual cSkinDisplayMessage *DisplayMessage(void);
+ void ActivateBackupSkin(void) { useBackupSkin = true; };
+ void Reload(void);
+ void ListAvailableFonts(void);
+ bool SetCustomToken(string option);
+ void ListCustomTokens(void);
+ cSDDisplayMenu *GetDisplayMenu(void) { return currentMenu; };
+};
+
+#endif //__SKINDESIGNER_H
diff --git a/displaychannel.c b/displaychannel.c
new file mode 100644
index 0000000..711f05a
--- /dev/null
+++ b/displaychannel.c
@@ -0,0 +1,206 @@
+#include "displaychannel.h"
+#include "libcore/timers.h"
+
+cSDDisplayChannel::cSDDisplayChannel(cTemplate *channelTemplate, bool WithInfo) {
+ channelView = NULL;
+
+ if (!channelTemplate) {
+ doOutput = false;
+ return;
+ } else {
+ doOutput = true;
+ }
+ groupSep = false;
+ present = NULL;
+ currentLast = 0;
+ channelChange = false;
+ initial = true;
+ devicesLast = cTimeMs::Now();
+
+ channelView = new cDisplayChannelView(channelTemplate->GetRootView());
+ if (!channelView->createOsd()) {
+ doOutput = false;
+ return;
+ }
+}
+
+cSDDisplayChannel::~cSDDisplayChannel() {
+ if (channelView)
+ delete channelView;
+}
+
+void cSDDisplayChannel::SetChannel(const cChannel *Channel, int Number) {
+ if (!doOutput)
+ return;
+
+ channelChange = true;
+ groupSep = false;
+
+ cString ChannelNumber("");
+ cString ChannelName("");
+ cString ChannelID("");
+
+ if (Channel) {
+ ChannelName = Channel->Name() ? Channel->Name() : "";
+ ChannelID = Channel->GetChannelID().ToString();
+ if (!Channel->GroupSep()) {
+ ChannelNumber = cString::sprintf("%d%s", Channel->Number(), Number ? "-" : "");
+ } else {
+ groupSep = true;
+ }
+ } else if (Number) {
+ ChannelNumber = cString::sprintf("%d-", Number);
+ } else {
+ ChannelName = ChannelString(NULL, 0);
+ }
+ channelView->ClearChannel();
+ channelView->ClearEPGInfo();
+ channelView->ClearStatusIcons();
+ channelView->ClearChannelGroups();
+ channelView->ClearScraperContent();
+ channelView->ClearAudioInfo();
+ if (!groupSep) {
+ channelView->DrawChannel(ChannelNumber, ChannelName, ChannelID, (Number > 0)?true:false);
+ channelView->DrawProgressBarBack();
+ channelView->DrawSignalBackground();
+ if (Channel) {
+ channelView->DrawStatusIcons(Channel);
+ channelView->DrawAudioInfo();
+ }
+ } else {
+ channelView->ClearSignal();
+ channelView->ClearSignalBackground();
+ channelView->ClearProgressBar();
+ channelView->ClearProgressBarBack();
+ if (Channel)
+ channelView->DrawChannelGroups(Channel, ChannelName);
+ }
+
+}
+
+void cSDDisplayChannel::SetEvents(const cEvent *Present, const cEvent *Following) {
+ if (!doOutput)
+ return;
+
+ present = Present;
+ channelView->ClearProgressBar();
+ if (!groupSep) {
+ channelView->ClearEPGInfo();
+ }
+
+ cGlobalSortedTimers SortedTimers;// local and remote timers
+
+ bool recPresent = false;
+ if (Present) {
+ if (!groupSep) {
+ SetProgressBar(Present);
+ }
+ eTimerMatch TimerMatch = tmNone;
+ const cTimer *Timer = Timers.GetMatch(Present, &TimerMatch);
+ if (Timer && Timer->Recording()) {
+ recPresent = true;
+ }
+ for (int i = 0; i < SortedTimers.Size() && !recPresent; i++)
+ if (const cTimer *Timer = SortedTimers[i])
+ if (Timer->Channel()->GetChannelID() == Present->ChannelID())
+ if (const cEvent *timerEvent = Timer->Event())
+ if (Present->EventID() == timerEvent->EventID())
+ recPresent = Timer->Recording();
+
+ }
+ bool recFollowing = false;
+ if (Following) {
+ recFollowing = Following->HasTimer();
+ for (int i = 0; i < SortedTimers.Size() && !recFollowing; i++)
+ if (const cTimer *Timer = SortedTimers[i])
+ if (Timer->Channel()->GetChannelID() == Following->ChannelID())
+ if (const cEvent *timerEvent = Timer->Event())
+ if (Following->EventID() == timerEvent->EventID())
+ recFollowing = true;
+ }
+
+ if (Present || Following) {
+ channelView->DrawEPGInfo(Present, Following, recPresent, recFollowing);
+ channelView->DrawScraperContent(Present);
+ }
+}
+
+void cSDDisplayChannel::SetProgressBar(const cEvent *present) {
+ int Current = 0;
+ int Total = 0;
+ time_t t = time(NULL);
+ if (t > present->StartTime())
+ Current = t - present->StartTime();
+ Total = present->Duration();
+ if ((Current > currentLast + 3) || initial || channelChange) {
+ currentLast = Current;
+ cString start = present->GetTimeString();
+ cString stop = present->GetEndTimeString();
+ channelView->DrawProgressBar(start, stop, Current, Total);
+ }
+}
+
+
+void cSDDisplayChannel::SetMessage(eMessageType Type, const char *Text) {
+ if (!doOutput)
+ return;
+ channelView->ClearChannel();
+ channelView->ClearEPGInfo();
+ channelView->ClearStatusIcons();
+ channelView->ClearScreenResolution();
+ channelView->ClearProgressBar();
+ channelView->ClearProgressBarBack();
+ channelView->ClearSignal();
+ channelView->ClearSignalBackground();
+ channelView->ClearScraperContent();
+ channelView->ClearAudioInfo();
+ channelView->DisplayMessage(Type, Text);
+ groupSep = true;
+}
+
+void cSDDisplayChannel::Flush(void) {
+ if (!doOutput)
+ return;
+
+ if (initial) {
+ channelView->DrawBackground();
+ channelView->DrawSignalBackground();
+ channelView->DrawCurrentWeather();
+ channelView->DrawCustomTokens();
+ }
+
+ if (initial || channelChange) {
+ channelView->DrawDate();
+ }
+ channelView->DrawTime();
+
+ if (present) {
+ SetProgressBar(present);
+ } else {
+ channelView->ClearProgressBar();
+ }
+
+ if (!groupSep) {
+ channelView->DrawScreenResolution();
+ channelView->DrawSignal();
+ channelView->DrawAudioInfo();
+ if (initial || cTimeMs::Now() - devicesLast > 500) {
+ channelView->DrawDevices(initial);
+ devicesLast = cTimeMs::Now();
+ }
+ } else {
+ channelView->ClearStatusIcons();
+ channelView->ClearScreenResolution();
+ channelView->ClearSignal();
+ channelView->ClearSignalBackground();
+ channelView->ClearDevices();
+ }
+
+ if (initial) {
+ channelView->DoStart();
+ }
+
+ initial = false;
+ channelChange = false;
+ channelView->Flush();
+}
\ No newline at end of file
diff --git a/displaychannel.h b/displaychannel.h
new file mode 100644
index 0000000..12c6922
--- /dev/null
+++ b/displaychannel.h
@@ -0,0 +1,32 @@
+#ifndef __DISPLAYCHANNEL_H
+#define __DISPLAYCHANNEL_H
+
+#include <vdr/thread.h>
+#include "config.h"
+#include "libtemplate/template.h"
+#include "views/displaychannelview.h"
+
+class cSDDisplayChannel : public cSkinDisplayChannel {
+private:
+ cDisplayChannelView *channelView;
+ bool doOutput;
+ bool initial;
+ bool groupSep;
+ bool channelChange;
+ time_t lastSignalDisplay;
+ int lastSignalStrength;
+ int lastSignalQuality;
+ int lastScreenWidth;
+ int currentLast;
+ uint64_t devicesLast;
+ const cEvent *present;
+ void SetProgressBar(const cEvent *present);
+public:
+ cSDDisplayChannel(cTemplate *channelTemplate, bool WithInfo);
+ virtual ~cSDDisplayChannel();
+ virtual void SetChannel(const cChannel *Channel, int Number);
+ virtual void SetEvents(const cEvent *Present, const cEvent *Following);
+ virtual void SetMessage(eMessageType Type, const char *Text);
+ virtual void Flush(void);
+};
+#endif //__DISPLAYCHANNEL_H
\ No newline at end of file
diff --git a/displaymenu.c b/displaymenu.c
new file mode 100644
index 0000000..2d922cd
--- /dev/null
+++ b/displaymenu.c
@@ -0,0 +1,308 @@
+#include "displaymenu.h"
+#include "libcore/helpers.h"
+
+cSDDisplayMenu::cSDDisplayMenu(cTemplate *menuTemplate) {
+ textAreaFont = NULL;
+ rootView = NULL;
+ doOutput = true;
+ state = vsInit;
+ pluginMenu = -1;
+ pluginName = "";
+ pluginMenuType = mtUnknown;
+ if (!menuTemplate) {
+ doOutput = false;
+ esyslog("skindesigner: displayMenu no valid template - aborting");
+ return;
+ }
+ rootView = new cDisplayMenuRootView(menuTemplate->GetRootView());
+ if (!rootView->createOsd()) {
+ doOutput = false;
+ return;
+ }
+}
+
+cSDDisplayMenu::~cSDDisplayMenu() {
+ if (rootView)
+ delete rootView;
+ if (textAreaFont)
+ delete textAreaFont;
+}
+
+void cSDDisplayMenu::Scroll(bool Up, bool Page) {
+ if (!doOutput)
+ return;
+ rootView->KeyInput(Up, Page);
+}
+
+int cSDDisplayMenu::MaxItems(void) {
+ if (!doOutput)
+ return 0;
+ int maxItems = rootView->GetMaxItems();
+ return maxItems;
+}
+
+void cSDDisplayMenu::Clear(void) {
+ if (!doOutput)
+ return;
+ rootView->Clear();
+}
+
+void cSDDisplayMenu::SetMenuCategory(eMenuCategory MenuCat) {
+ if (!doOutput)
+ return;
+ rootView->SetMenu(MenuCat, (state == vsInit) ? true : false);
+ cSkinDisplayMenu::SetMenuCategory(MenuCat);
+ if (state != vsInit)
+ state = vsMenuInit;
+}
+
+void cSDDisplayMenu::SetPluginMenu(string name, int menu, int type, bool init) {
+ pluginName = name;
+ pluginMenu = menu;
+ pluginMenuType = (ePluginMenuType)type;
+ rootView->SetPluginMenu(pluginName, pluginMenu, pluginMenuType);
+ if (!init) {
+ rootView->SetMenu(mcPlugin, false);
+ }
+}
+
+void cSDDisplayMenu::SetTitle(const char *Title) {
+ if (!doOutput)
+ return;
+ rootView->SetTitle(Title);
+}
+
+void cSDDisplayMenu::SetButtons(const char *Red, const char *Green, const char *Yellow, const char *Blue) {
+ if (!doOutput)
+ return;
+ rootView->SetButtonTexts(Red, Green, Yellow, Blue);
+ if (state != vsInit && MenuCategory() != mcMain)
+ state = vsMenuInit;
+}
+
+void cSDDisplayMenu::SetMessage(eMessageType Type, const char *Text) {
+ if (!doOutput)
+ return;
+ rootView->SetMessage(Type, Text);
+ rootView->DoFlush();
+}
+
+bool cSDDisplayMenu::SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, eTimerMatch TimerMatch) {
+ if (!doOutput)
+ return true;
+ if (!rootView->SubViewAvailable())
+ return false;
+ if (config.blockFlush)
+ rootView->LockFlush();
+ bool isFav = false;
+ if (MenuCategory() == mcSchedule && Channel) {
+ isFav = true;
+ rootView->SetEpgSearchFavorite();
+ }
+ const cChannel *channel = Channel;
+ if (MenuCategory() == mcSchedule) {
+ if (!channel) {
+ channel = rootView->GetChannel();
+ }
+ if (!channel && Event) {
+ channel = Channels.GetByChannelID(Event->ChannelID());
+ }
+ rootView->SetChannel(channel);
+ }
+
+ cDisplayMenuListView *list = rootView->GetListView();
+ if (!list)
+ return false;
+ list->AddSchedulesMenuItem(Index, Event, channel, TimerMatch, MenuCategory(), isFav, Current, Selectable);
+ if (state == vsIdle)
+ state = vsMenuUpdate;
+ return true;
+}
+
+bool cSDDisplayMenu::SetItemTimer(const cTimer *Timer, int Index, bool Current, bool Selectable) {
+ if (!doOutput)
+ return true;
+ if (!rootView->SubViewAvailable())
+ return false;
+ if (config.blockFlush)
+ rootView->LockFlush();
+ cDisplayMenuListView *list = rootView->GetListView();
+ if (!list)
+ return false;
+ list->AddTimersMenuItem(Index, Timer, Current, Selectable);
+ if (state == vsIdle)
+ state = vsMenuUpdate;
+ return true;
+}
+
+bool cSDDisplayMenu::SetItemChannel(const cChannel *Channel, int Index, bool Current, bool Selectable, bool WithProvider) {
+ if (!doOutput)
+ return true;
+ if (!rootView->SubViewAvailable())
+ return false;
+ if (config.blockFlush)
+ rootView->LockFlush();
+ cDisplayMenuListView *list = rootView->GetListView();
+ if (!list)
+ return false;
+ list->AddChannelsMenuItem(Index, Channel, WithProvider, Current, Selectable);
+ if (state == vsIdle)
+ state = vsMenuUpdate;
+ return true;
+}
+
+bool cSDDisplayMenu::SetItemRecording(const cRecording *Recording, int Index, bool Current, bool Selectable, int Level, int Total, int New) {
+ if (!doOutput)
+ return true;
+ if (!rootView->SubViewAvailable())
+ return false;
+ if (config.blockFlush)
+ rootView->LockFlush();
+ cDisplayMenuListView *list = rootView->GetListView();
+ if (!list)
+ return false;
+ list->AddRecordingMenuItem(Index, Recording, Level, Total, New, Current, Selectable);
+ if (state == vsIdle)
+ state = vsMenuUpdate;
+ return true;
+}
+
+bool cSDDisplayMenu::SetItemPlugin(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens, int Index, bool Current, bool Selectable) {
+ if (!doOutput)
+ return true;
+ if (!rootView->SubViewAvailable())
+ return false;
+ if (config.blockFlush)
+ rootView->LockFlush();
+ cDisplayMenuListView *list = rootView->GetListView();
+ if (!list)
+ return false;
+ list->AddPluginMenuItem(stringTokens, intTokens, loopTokens, Index, Current, Selectable);
+ if (state == vsIdle)
+ state = vsMenuUpdate;
+ return true;
+}
+
+void cSDDisplayMenu::SetItem(const char *Text, int Index, bool Current, bool Selectable) {
+ if (!doOutput)
+ return;
+ cDisplayMenuListView *list = rootView->GetListView();
+ if (!list) {
+ return;
+ }
+ if (config.blockFlush)
+ rootView->LockFlush();
+ eMenuCategory cat = MenuCategory();
+ if (cat == mcMain && rootView->SubViewAvailable()) {
+ list->AddMainMenuItem(Index, Text, Current, Selectable);
+ } else if (cat == mcSetup && rootView->SubViewAvailable()) {
+ list->AddSetupMenuItem(Index, Text, Current, Selectable);
+ } else {
+ rootView->CorrectDefaultMenu();
+ string *tabTexts = new string[MaxTabs];
+ for (int i=0; i<MaxTabs; i++) {
+ const char *s = GetTabbedText(Text, i);
+ if (s) {
+ if (strlen(s) == 0)
+ tabTexts[i] = " ";
+ else
+ tabTexts[i] = s;
+ } else {
+ tabTexts[i] = "";
+ }
+ }
+ list->AddDefaultMenuItem(Index, tabTexts, Current, Selectable);
+ SetEditableWidth( rootView->GetListViewWidth() / 2);
+ }
+ if (state == vsIdle)
+ state = vsMenuUpdate;
+}
+
+void cSDDisplayMenu::SetTabs(int Tab1, int Tab2, int Tab3, int Tab4, int Tab5) {
+ if (!doOutput)
+ return;
+ rootView->SetTabs(Tab1, Tab2, Tab3, Tab4, Tab5);
+}
+
+int cSDDisplayMenu::GetTextAreaWidth(void) const {
+ int areaWidth = rootView->GetTextAreaWidth();
+ return areaWidth;
+}
+
+const cFont *cSDDisplayMenu::GetTextAreaFont(bool FixedFont) const {
+ if (textAreaFont)
+ return textAreaFont;
+ textAreaFont = rootView->GetTextAreaFont();
+ return textAreaFont;
+}
+
+void cSDDisplayMenu::SetScrollbar(int Total, int Offset) {
+ if (!doOutput)
+ return;
+ rootView->RenderMenuScrollBar(Total, Offset);
+}
+
+void cSDDisplayMenu::SetEvent(const cEvent *Event) {
+ if (!doOutput)
+ return;
+ rootView->SetDetailedViewEvent(Event);
+ state = vsMenuDetail;
+}
+
+void cSDDisplayMenu::SetRecording(const cRecording *Recording) {
+ if (!doOutput)
+ return;
+ rootView->SetDetailedViewRecording(Recording);
+ state = vsMenuDetail;
+}
+
+void cSDDisplayMenu::SetText(const char *Text, bool FixedFont) {
+ if (!doOutput)
+ return;
+ rootView->SetDetailedViewText(Text);
+ state = vsMenuDetail;
+}
+
+bool cSDDisplayMenu::SetPluginText(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens) {
+ if (!doOutput)
+ return true;
+ bool tmplOk = rootView->SetDetailedViewPlugin(stringTokens, intTokens, loopTokens);
+ state = vsMenuDetail;
+ return tmplOk;
+}
+
+void cSDDisplayMenu::Flush(void) {
+ if (!doOutput)
+ return;
+
+ bool doFlush = false;
+ if (state == vsInit) {
+ rootView->Start();
+ rootView->RenderMenuItems();
+ doFlush = true;
+ } else if (state == vsMenuInit) {
+ rootView->Render();
+ rootView->RenderMenuItems();
+ doFlush = true;
+ } else if (state == vsMenuUpdate) {
+ rootView->RenderMenuItems();
+ doFlush = true;
+ } else if (state == vsMenuDetail) {
+ rootView->OpenFlush();
+ rootView->Render();
+ rootView->DoFlush();
+ rootView->RenderDetailView();
+ rootView->DoFlush();
+ }
+
+ if (rootView->RenderDynamicElements()) {
+ doFlush = true;
+ }
+
+ if (doFlush) {
+ if (config.blockFlush)
+ rootView->OpenFlush();
+ rootView->DoFlush();
+ }
+ state = vsIdle;
+}
diff --git a/displaymenu.h b/displaymenu.h
new file mode 100644
index 0000000..850b7e9
--- /dev/null
+++ b/displaymenu.h
@@ -0,0 +1,54 @@
+#ifndef __DISPLAYMENU_H
+#define __DISPLAYMENU_H
+
+#include "libtemplate/template.h"
+#include "views/displaymenurootview.h"
+
+enum eViewState {
+ vsInit,
+ vsMenuInit,
+ vsMenuUpdate,
+ vsMenuDetail,
+ vsIdle
+};
+
+class cSDDisplayMenu : public cSkinDisplayMenu {
+private:
+ cDisplayMenuRootView *rootView;
+ eViewState state;
+ bool doOutput;
+ string pluginName;
+ int pluginMenu;
+ ePluginMenuType pluginMenuType;
+ mutable cFont *textAreaFont;
+protected:
+ int Tab(int n);
+public:
+ cSDDisplayMenu(cTemplate *menuTemplate);
+ virtual ~cSDDisplayMenu();
+ virtual void Scroll(bool Up, bool Page);
+ virtual int MaxItems(void);
+ virtual void Clear(void);
+ virtual void SetMenuCategory(eMenuCategory MenuCat);
+ virtual void SetPluginMenu(string name, int menu, int type, bool init);
+ virtual void SetTitle(const char *Title);
+ virtual void SetButtons(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
+ virtual void SetMessage(eMessageType Type, const char *Text);
+ virtual void SetItem(const char *Text, int Index, bool Current, bool Selectable);
+ virtual bool SetItemEvent(const cEvent *Event, int Index, bool Current, bool Selectable, const cChannel *Channel, bool WithDate, eTimerMatch TimerMatch);
+ virtual bool SetItemTimer(const cTimer *Timer, int Index, bool Current, bool Selectable);
+ virtual bool SetItemChannel(const cChannel *Channel, int Index, bool Current, bool Selectable, bool WithProvider);
+ virtual bool SetItemRecording(const cRecording *Recording, int Index, bool Current, bool Selectable, int Level, int Total, int New);
+ virtual bool SetItemPlugin(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens, int Index, bool Current, bool Selectable);
+ virtual void SetScrollbar(int Total, int Offset);
+ virtual void SetEvent(const cEvent *Event);
+ virtual void SetRecording(const cRecording *Recording);
+ virtual void SetText(const char *Text, bool FixedFont);
+ virtual bool SetPluginText(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens);
+ virtual void Flush(void);
+ virtual void SetTabs(int Tab1, int Tab2 = 0, int Tab3 = 0, int Tab4 = 0, int Tab5 = 0);
+ virtual int GetTextAreaWidth(void) const;
+ virtual const cFont *GetTextAreaFont(bool FixedFont) const;
+};
+
+#endif //__DISPLAYMENU_H
diff --git a/displaymessage.c b/displaymessage.c
new file mode 100644
index 0000000..94c1bdd
--- /dev/null
+++ b/displaymessage.c
@@ -0,0 +1,45 @@
+#include "displaymessage.h"
+
+cSDDisplayMessage::cSDDisplayMessage(cTemplate *messageTemplate) {
+ messageView = NULL;
+ doOutput = true;
+ initial = true;
+ if (!messageTemplate) {
+ doOutput = false;
+ esyslog("skindesigner: displayMessage no valid template - aborting");
+ return;
+ }
+ messageView = new cDisplayMessageView(messageTemplate->GetRootView());
+ if (!messageView->createOsd()) {
+ doOutput = false;
+ return;
+ }
+ messageView->DrawBackground();
+}
+
+cSDDisplayMessage::~cSDDisplayMessage() {
+ if (messageView)
+ delete messageView;
+}
+
+void cSDDisplayMessage::SetMessage(eMessageType Type, const char *Text) {
+ if (!doOutput)
+ return;
+ messageView->ClearMessage();
+ if (!Text) {
+ return;
+ }
+ messageView->DrawMessage(Type, Text);
+}
+
+
+void cSDDisplayMessage::Flush(void) {
+ if (!doOutput)
+ return;
+ if (initial) {
+ messageView->DoFadeIn();
+ initial = false;
+ } else {
+ messageView->Flush();
+ }
+}
diff --git a/displaymessage.h b/displaymessage.h
new file mode 100644
index 0000000..f1fd01b
--- /dev/null
+++ b/displaymessage.h
@@ -0,0 +1,22 @@
+#ifndef __DISPLAYMESSAGE_H
+#define __DISPLAYMESSAGE_H
+
+#include <vdr/thread.h>
+#include <vdr/skins.h>
+#include "config.h"
+#include "libtemplate/template.h"
+#include "views/displaymessageview.h"
+
+class cSDDisplayMessage : public cSkinDisplayMessage {
+private:
+ cDisplayMessageView *messageView;
+ bool doOutput;
+ bool initial;
+public:
+ cSDDisplayMessage(cTemplate *messageTemplate);
+ virtual ~cSDDisplayMessage();
+ virtual void SetMessage(eMessageType Type, const char *Text);
+ virtual void Flush(void);
+};
+
+#endif //__DISPLAYMESSAGE_H
\ No newline at end of file
diff --git a/displayreplay.c b/displayreplay.c
new file mode 100644
index 0000000..88d6802
--- /dev/null
+++ b/displayreplay.c
@@ -0,0 +1,99 @@
+#define __STL_CONFIG_H
+#include "displayreplay.h"
+
+cSDDisplayReplay::cSDDisplayReplay(cTemplate *replayTemplate, bool ModeOnly) {
+ doOutput = true;
+ initial = true;
+ modeOnly = ModeOnly;
+ replayView = NULL;
+ if (!replayTemplate) {
+ doOutput = false;
+ esyslog("skindesigner: displayReplay no valid template - aborting");
+ return;
+ }
+ replayView = new cDisplayReplayView(replayTemplate->GetRootView());
+ if (!replayView->createOsd()) {
+ doOutput = false;
+ return;
+ }
+}
+
+cSDDisplayReplay::~cSDDisplayReplay() {
+ if (replayView)
+ delete replayView;
+}
+
+void cSDDisplayReplay::SetRecording(const cRecording *Recording) {
+ if (!doOutput || !Recording)
+ return;
+ replayView->DrawTitle(Recording);
+ replayView->DrawRecordingInformation(Recording);
+ replayView->DrawScraperContent(Recording);
+}
+
+void cSDDisplayReplay::SetTitle(const char *Title) {
+ if (!doOutput || !Title)
+ return;
+ replayView->DrawTitle(Title);
+}
+
+void cSDDisplayReplay::SetMode(bool Play, bool Forward, int Speed) {
+ if (!doOutput)
+ return;
+ if (!Play && Speed < 0) {
+ replayView->DrawOnPause(modeOnly);
+ } else {
+ replayView->ClearOnPause();
+ }
+ replayView->DrawControlIcons(Play, Forward, Speed, modeOnly);
+}
+
+void cSDDisplayReplay::SetProgress(int Current, int Total) {
+ if (!doOutput)
+ return;
+ replayView->DelayOnPause();
+ replayView->DrawProgressBar(Current, Total);
+ replayView->DrawMarks(marks, Current, Total);
+}
+
+void cSDDisplayReplay::SetCurrent(const char *Current) {
+ if (!doOutput)
+ return;
+ replayView->DrawCurrent(Current);
+}
+
+void cSDDisplayReplay::SetTotal(const char *Total) {
+ if (!doOutput)
+ return;
+ replayView->DrawTotal(Total);
+}
+
+void cSDDisplayReplay::SetJump(const char *Jump) {
+ if (!doOutput)
+ return;
+ replayView->DrawJump(Jump);
+}
+
+void cSDDisplayReplay::SetMessage(eMessageType Type, const char *Text) {
+ if (!doOutput)
+ return;
+ replayView->DrawMessage(Type, Text);
+}
+
+void cSDDisplayReplay::Flush(void) {
+ if (!doOutput)
+ return;
+ if (!modeOnly) {
+ replayView->DrawDate();
+ replayView->DrawTime();
+ }
+
+ if (initial) {
+ replayView->DrawBackground(modeOnly);
+ replayView->DrawCustomTokens();
+ replayView->DoFadeIn();
+ initial = false;
+ } else {
+ replayView->Flush();
+ }
+}
diff --git a/displayreplay.h b/displayreplay.h
new file mode 100644
index 0000000..836febb
--- /dev/null
+++ b/displayreplay.h
@@ -0,0 +1,30 @@
+#ifndef __DISPLAYREPLAY_H
+#define __DISPLAYREPLAY_H
+
+#include <vdr/skins.h>
+#include <vdr/thread.h>
+#include "config.h"
+#include "libtemplate/template.h"
+#include "views/displayreplayview.h"
+
+class cSDDisplayReplay : public cSkinDisplayReplay {
+private:
+ cDisplayReplayView *replayView;
+ bool initial;
+ bool doOutput;
+ bool modeOnly;
+public:
+ cSDDisplayReplay(cTemplate *replayTemplate, bool ModeOnly);
+ virtual ~cSDDisplayReplay();
+ virtual void SetRecording(const cRecording *Recording);
+ virtual void SetTitle(const char *Title);
+ virtual void SetMode(bool Play, bool Forward, int Speed);
+ virtual void SetProgress(int Current, int Total);
+ virtual void SetCurrent(const char *Current);
+ virtual void SetTotal(const char *Total);
+ virtual void SetJump(const char *Jump);
+ virtual void SetMessage(eMessageType Type, const char *Text);
+ virtual void Flush(void);
+};
+
+#endif //__DISPLAYREPLAY_H
\ No newline at end of file
diff --git a/displaytracks.c b/displaytracks.c
new file mode 100644
index 0000000..8e28095
--- /dev/null
+++ b/displaytracks.c
@@ -0,0 +1,58 @@
+#include "displaytracks.h"
+
+
+cSDDisplayTracks::cSDDisplayTracks(cTemplate *audiotracksTemplate, const char *Title, int NumTracks, const char * const *Tracks) {
+ initial = true;
+ numTracks = NumTracks;
+ tracksView = NULL;
+ doOutput = true;
+ currentTrack = 0;
+ menuTitle = Title;
+ if (!audiotracksTemplate) {
+ esyslog("skindesigner: displayTracks no valid template - aborting");
+ doOutput = false;
+ return;
+ }
+ tracksView = new cDisplayAudiotracksView(NumTracks, audiotracksTemplate->GetRootView());
+ if (!tracksView->createOsd()) {
+ doOutput = false;
+ return;
+ }
+ tracksView->DrawBackground();
+
+ cDisplayMenuListView *list = tracksView->GetListView();
+ if (list) {
+ for (int i = 0; i < NumTracks; i++) {
+ list->AddTracksMenuItem(i, Tracks[i], (i==currentTrack)?true:false, true);
+ }
+ }
+}
+
+cSDDisplayTracks::~cSDDisplayTracks() {
+ if (tracksView)
+ delete tracksView;
+}
+
+void cSDDisplayTracks::SetTrack(int Index, const char * const *Tracks) {
+ cDisplayMenuListView *list = tracksView->GetListView();
+ if (list) {
+ list->AddTracksMenuItem(currentTrack, Tracks[currentTrack], false, true);
+ list->AddTracksMenuItem(Index, Tracks[Index], true, true);
+ currentTrack = Index;
+ }
+}
+
+void cSDDisplayTracks::SetAudioChannel(int AudioChannel) {
+ tracksView->DrawHeader(menuTitle, AudioChannel);
+}
+
+void cSDDisplayTracks::Flush(void) {
+ if (!doOutput)
+ return;
+ if (initial) {
+ tracksView->DoFadeIn();
+ }
+ initial = false;
+ tracksView->RenderMenuItems();
+ tracksView->Flush();
+}
diff --git a/displaytracks.h b/displaytracks.h
new file mode 100644
index 0000000..4dd978c
--- /dev/null
+++ b/displaytracks.h
@@ -0,0 +1,27 @@
+#ifndef __DISPLAYTRACKS_H
+#define __DISPLAYTRACKS_H
+
+#include <vdr/skins.h>
+#include <vdr/thread.h>
+#include "config.h"
+#include "libtemplate/template.h"
+#include "views/displayaudiotracksview.h"
+
+class cSDDisplayTracks : public cSkinDisplayTracks {
+private:
+ cDisplayAudiotracksView *tracksView;
+ bool initial;
+ int numTracks;
+ bool doOutput;
+ int currentTrack;
+ const char *menuTitle;
+public:
+ cSDDisplayTracks(cTemplate *audiotracksTemplate, const char *Title, int NumTracks, const char * const *Tracks);
+ virtual ~cSDDisplayTracks();
+ virtual void SetTrack(int Index, const char * const *Tracks);
+ virtual void SetAudioChannel(int AudioChannel);
+ virtual void Flush(void);
+};
+
+
+#endif //__DISPLAYTRACKS_H
\ No newline at end of file
diff --git a/displayvolume.c b/displayvolume.c
new file mode 100644
index 0000000..9ee28a5
--- /dev/null
+++ b/displayvolume.c
@@ -0,0 +1,43 @@
+#include "displayvolume.h"
+
+#include "config.h"
+#include "libcore/helpers.h"
+
+cSDDisplayVolume::cSDDisplayVolume(cTemplate *volumeTemplate) {
+ volumeView = NULL;
+ doOutput = true;
+ initial = true;
+ if (!volumeTemplate) {
+ doOutput = false;
+ esyslog("skindesigner: displayVolume no valid template - aborting");
+ return;
+ }
+ volumeView = new cDisplayVolumeView(volumeTemplate->GetRootView());
+ if (!volumeView->createOsd()) {
+ doOutput = false;
+ } else {
+ volumeView->DrawBackground();
+ }
+}
+
+cSDDisplayVolume::~cSDDisplayVolume() {
+ if (volumeView)
+ delete volumeView;
+}
+
+void cSDDisplayVolume::SetVolume(int Current, int Total, bool Mute) {
+ if (!doOutput)
+ return;
+ volumeView->DrawVolume(Current, Total, Mute);
+}
+
+void cSDDisplayVolume::Flush(void) {
+ if (!doOutput)
+ return;
+ if (initial) {
+ volumeView->DoFadeIn();
+ initial = false;
+ } else {
+ volumeView->Flush();
+ }
+}
diff --git a/displayvolume.h b/displayvolume.h
new file mode 100644
index 0000000..1bfc877
--- /dev/null
+++ b/displayvolume.h
@@ -0,0 +1,21 @@
+#ifndef __DISPLAYVOLUME_H
+#define __DISPLAYVOLUME_H
+
+#include <vdr/skins.h>
+#include "config.h"
+#include "libtemplate/template.h"
+#include "views/displayvolumeview.h"
+
+class cSDDisplayVolume : public cSkinDisplayVolume {
+private:
+ cDisplayVolumeView *volumeView;
+ bool doOutput;
+ bool initial;
+public:
+ cSDDisplayVolume(cTemplate *volumeTemplate);
+ virtual ~cSDDisplayVolume();
+ virtual void SetVolume(int Current, int Total, bool Mute);
+ virtual void Flush(void);
+};
+
+#endif //__DISPLAYVOLUME_H
\ No newline at end of file
diff --git a/dtd/displayaudiotracks.dtd b/dtd/displayaudiotracks.dtd
new file mode 100644
index 0000000..e6cd869
--- /dev/null
+++ b/dtd/displayaudiotracks.dtd
@@ -0,0 +1,42 @@
+<?xml encoding="UTF-8"?>
+
+<!ENTITY % functions SYSTEM "functions.dtd">
+
+<!ELEMENT displayaudiotracks (background | header | menuitems)*>
+<!ATTLIST displayaudiotracks
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT background (area|areascroll)*>
+<!ATTLIST background
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT header (area|areascroll)*>
+<!ATTLIST header
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT menuitems (listelement)>
+<!ATTLIST menuitems
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ align (left|top|center|bottom|right) #IMPLIED
+ menuitemwidth CDATA #IMPLIED
+ numlistelements CDATA #REQUIRED
+ orientation (horizontal|vertical) #REQUIRED
+>
+
+<!ELEMENT listelement (area|areascroll)*>
+
+%functions;
\ No newline at end of file
diff --git a/dtd/displaychannel.dtd b/dtd/displaychannel.dtd
new file mode 100644
index 0000000..c3d3761
--- /dev/null
+++ b/dtd/displaychannel.dtd
@@ -0,0 +1,111 @@
+<?xml encoding="UTF-8"?>
+
+<!ENTITY % functions SYSTEM "functions.dtd">
+
+<!ELEMENT displaychannel (background | channelinfo | epginfo | progressbar | progressbarback |
+ statusinfo | audioinfo | screenresolution | channelgroup |
+ signalquality | signalqualityback | devices | currentweather | scrapercontent |
+ datetime | time | message | customtokens)* >
+<!ATTLIST displaychannel
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT background (area)*>
+<!ATTLIST background
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT channelinfo (area|areascroll)*>
+<!ATTLIST channelinfo
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT epginfo (area|areascroll)*>
+<!ATTLIST epginfo
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT progressbar (area|areascroll)*>
+<!ATTLIST progressbar
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT progressbarback (area)*>
+<!ATTLIST progressbarback
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT statusinfo (area|areascroll)*>
+<!ATTLIST statusinfo
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT audioinfo (area|areascroll)*>
+<!ATTLIST audioinfo
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT screenresolution (area|areascroll)*>
+<!ATTLIST screenresolution
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT channelgroup (area|areascroll)*>
+<!ATTLIST channelgroup
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT signalquality (area|areascroll)*>
+<!ATTLIST signalquality
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT signalqualityback (area|areascroll)*>
+<!ATTLIST signalqualityback
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT devices (area|areascroll)*>
+<!ATTLIST devices
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT currentweather (area|areascroll)*>
+<!ATTLIST currentweather
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT scrapercontent (area|areascroll)*>
+<!ATTLIST scrapercontent
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT datetime (area|areascroll)*>
+<!ATTLIST datetime
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT time (area|areascroll)*>
+<!ATTLIST time
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT message (area|areascroll)*>
+<!ATTLIST message
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT customtokens (area|areascroll)*>
+<!ATTLIST customtokens
+ debug CDATA #IMPLIED
+>
+
+%functions;
diff --git a/dtd/displaymenu.dtd b/dtd/displaymenu.dtd
new file mode 100644
index 0000000..b14c3da
--- /dev/null
+++ b/dtd/displaymenu.dtd
@@ -0,0 +1,276 @@
+<?xml encoding="UTF-8"?>
+
+<!ENTITY % functions SYSTEM "functions.dtd">
+
+<!ELEMENT displaymenu (background,header,datetime,time*,message,colorbuttons,
+ menudefault,menumain*,menusetup*,menuschedules*,
+ menutimers*,menuchannels*,menurecordings*,
+ menudetailedepg,menudetailedrecording,
+ menudetailedtext)>
+<!ATTLIST displaymenu
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+>
+
+<!ELEMENT background (area)*>
+<!ATTLIST background
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT header (area|areascroll)*>
+<!ATTLIST header
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT datetime (area|areascroll)*>
+<!ATTLIST datetime
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT time (area|areascroll)*>
+<!ATTLIST time
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT message (area|areascroll)*>
+<!ATTLIST message
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT colorbuttons (area|areascroll)*>
+<!ATTLIST colorbuttons
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT timers (area|areascroll)*>
+<!ATTLIST timers
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT discusage (area|areascroll)*>
+<!ATTLIST discusage
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT devices (area|areascroll)*>
+<!ATTLIST devices
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT systemload (area|areascroll)*>
+<!ATTLIST systemload
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT temperatures (area|areascroll)*>
+<!ATTLIST temperatures
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT currentschedule (area|areascroll)*>
+<!ATTLIST currentschedule
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT currentweather (area|areascroll)*>
+<!ATTLIST currentweather
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT customtokens (area|areascroll)*>
+<!ATTLIST customtokens
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT scrollbar (area|areascroll)*>
+<!ATTLIST scrollbar
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT detailheader (area|areascroll)*>
+<!ATTLIST detailheader
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT tablabels (area|areascroll)*>
+<!ATTLIST tablabels
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT menudefault (background | header | datetime | time | colorbuttons | scrollbar | menuitems)*>
+<!ATTLIST menudefault
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT menumain (background | header | datetime | time | colorbuttons | scrollbar | timers |
+ discusage | devices | systemload | temperatures | currentschedule | currentweather | customtokens | menuitems)*>
+<!ATTLIST menumain
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT menusetup (background | header | datetime | time | colorbuttons | scrollbar | menuitems)*>
+<!ATTLIST menusetup
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT menuschedules (background | header | datetime | time | colorbuttons | scrollbar | menuitems)*>
+<!ATTLIST menuschedules
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT menutimers (background | header | datetime | time | colorbuttons | scrollbar | menuitems)*>
+<!ATTLIST menutimers
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT menuchannels (background | header | datetime | time | colorbuttons | scrollbar | menuitems)*>
+<!ATTLIST menuchannels
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT menurecordings (background | header | datetime | time | colorbuttons | scrollbar | menuitems)*>
+<!ATTLIST menurecordings
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT menudetailedepg (background | header | datetime | time | colorbuttons | scrollbar |
+ detailheader | tab | tablabels)*>
+<!ATTLIST menudetailedepg
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT menudetailedrecording (background | header | datetime | time | colorbuttons | scrollbar |
+ detailheader | tab | tablabels)*>
+<!ATTLIST menudetailedrecording
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT menudetailedtext (background | header | datetime | time | colorbuttons | scrollbar |
+ detailheader | tab )*>
+<!ATTLIST menudetailedtext
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT menuitems (listelement,currentelement?)>
+<!ATTLIST menuitems
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ align (left|top|center|bottom|right) #IMPLIED
+ menuitemwidth CDATA #IMPLIED
+ determinatefont CDATA #IMPLIED
+ numlistelements CDATA #REQUIRED
+ orientation (horizontal|vertical) #REQUIRED
+>
+
+<!ELEMENT listelement (area|areascroll)*>
+<!ATTLIST listelement
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT currentelement (area|areascroll)*>
+<!ATTLIST currentelement
+ delay CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT tab (loop|fill|drawtext|drawtextbox|drawimage|drawrectangle|drawellipse)*>
+<!ATTLIST tab
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ layer CDATA #REQUIRED
+ name CDATA #REQUIRED
+ scrollheight CDATA #REQUIRED
+ transparency CDATA #IMPLIED
+ condition CDATA #IMPLIED
+ debug (true|false) #IMPLIED
+>
+
+%functions;
\ No newline at end of file
diff --git a/dtd/displaymenuplugin.dtd b/dtd/displaymenuplugin.dtd
new file mode 100644
index 0000000..bcd005c
--- /dev/null
+++ b/dtd/displaymenuplugin.dtd
@@ -0,0 +1,96 @@
+<?xml encoding="UTF-8"?>
+
+<!ENTITY % functions SYSTEM "functions.dtd">
+
+<!ELEMENT menuplugin (background|header|datetime|message|colorbuttons|scrollbar|detailheader|menuitems|tab|tablabels)*>
+<!ATTLIST menuplugin
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT background (area)*>
+<!ATTLIST background
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT header (area|areascroll)*>
+<!ATTLIST header
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT datetime (area|areascroll)*>
+<!ATTLIST datetime
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT message (area|areascroll)*>
+<!ATTLIST message
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT colorbuttons (area|areascroll)*>
+<!ATTLIST colorbuttons
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT scrollbar (area|areascroll)*>
+<!ATTLIST scrollbar
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT detailheader (area|areascroll)*>
+<!ATTLIST detailheader
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT tablabels (area|areascroll)*>
+<!ATTLIST tablabels
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT menuitems (listelement,currentelement?)>
+<!ATTLIST menuitems
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ align (left|top|center|bottom|right) #IMPLIED
+ menuitemwidth CDATA #IMPLIED
+ numlistelements CDATA #REQUIRED
+ orientation (horizontal|vertical) #REQUIRED
+>
+
+<!ELEMENT listelement (area|areascroll)*>
+<!ATTLIST listelement
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT currentelement (area|areascroll)*>
+<!ATTLIST currentelement
+ delay CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT tab (loop|fill|drawtext|drawtextbox|drawimage|drawrectangle|drawellipse)*>
+<!ATTLIST tab
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ layer CDATA #REQUIRED
+ name CDATA #REQUIRED
+ scrollheight CDATA #REQUIRED
+ transparency CDATA #IMPLIED
+ condition CDATA #IMPLIED
+ debug (true|false) #IMPLIED
+>
+
+%functions;
\ No newline at end of file
diff --git a/dtd/displaymessage.dtd b/dtd/displaymessage.dtd
new file mode 100644
index 0000000..223ea2d
--- /dev/null
+++ b/dtd/displaymessage.dtd
@@ -0,0 +1,28 @@
+<?xml encoding="UTF-8"?>
+
+<!ENTITY % functions SYSTEM "functions.dtd">
+
+<!ELEMENT displaymessage (background | message)*>
+<!ATTLIST displaymessage
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT background (area)*>
+<!ATTLIST background
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT message (area|areascroll)*>
+<!ATTLIST message
+ debug CDATA #IMPLIED
+>
+
+%functions;
\ No newline at end of file
diff --git a/dtd/displayreplay.dtd b/dtd/displayreplay.dtd
new file mode 100644
index 0000000..c2333c3
--- /dev/null
+++ b/dtd/displayreplay.dtd
@@ -0,0 +1,116 @@
+<?xml encoding="UTF-8"?>
+
+<!ENTITY % functions SYSTEM "functions.dtd">
+
+<!ELEMENT displayreplay (background | backgroundmodeonly |datetime | time |
+ scrapercontent | rectitle | recinfo | currenttime |
+ totaltime | progressbar | cutmarks | controlicons |
+ controliconsmodeonly | jump | message | onpause |
+ onpausemodeonly | customtokens)*>
+<!ATTLIST displayreplay
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT background (area)*>
+<!ATTLIST background
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT backgroundmodeonly (area)*>
+<!ATTLIST backgroundmodeonly
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT datetime (area|areascroll)*>
+<!ATTLIST datetime
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT time (area|areascroll)*>
+<!ATTLIST time
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT scrapercontent (area|areascroll)*>
+<!ATTLIST scrapercontent
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT rectitle (area|areascroll)*>
+<!ATTLIST rectitle
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT recinfo (area|areascroll)*>
+<!ATTLIST recinfo
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT currenttime (area|areascroll)*>
+<!ATTLIST currenttime
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT totaltime (area|areascroll)*>
+<!ATTLIST totaltime
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT progressbar (area|areascroll)*>
+<!ATTLIST progressbar
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT cutmarks (area|areascroll)*>
+<!ATTLIST cutmarks
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT controlicons (area|areascroll)*>
+<!ATTLIST controlicons
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT controliconsmodeonly (area|areascroll)*>
+<!ATTLIST controliconsmodeonly
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT jump (area|areascroll)*>
+<!ATTLIST jump
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT message (area|areascroll)*>
+<!ATTLIST message
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT onpause (area|areascroll)*>
+<!ATTLIST onpause
+ debug CDATA #IMPLIED
+ delay CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+>
+
+<!ELEMENT onpausemodeonly (area|areascroll)*>
+<!ATTLIST onpausemodeonly
+ debug CDATA #IMPLIED
+ delay CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+>
+
+<!ELEMENT customtokens (area|areascroll)*>
+<!ATTLIST customtokens
+ debug CDATA #IMPLIED
+>
+
+%functions;
\ No newline at end of file
diff --git a/dtd/displayvolume.dtd b/dtd/displayvolume.dtd
new file mode 100644
index 0000000..2be597d
--- /dev/null
+++ b/dtd/displayvolume.dtd
@@ -0,0 +1,28 @@
+<?xml encoding="UTF-8"?>
+
+<!ENTITY % functions SYSTEM "functions.dtd">
+
+<!ELEMENT displayvolume (background | volume)*>
+<!ATTLIST displayvolume
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ fadetime CDATA #IMPLIED
+ scaletvx CDATA #IMPLIED
+ scaletvy CDATA #IMPLIED
+ scaletvwidth CDATA #IMPLIED
+ scaletvheight CDATA #IMPLIED
+>
+
+<!ELEMENT background (area)*>
+<!ATTLIST background
+ debug CDATA #IMPLIED
+>
+
+<!ELEMENT volume (area|areascroll)*>
+<!ATTLIST volume
+ debug CDATA #IMPLIED
+>
+
+%functions;
diff --git a/dtd/functions.dtd b/dtd/functions.dtd
new file mode 100644
index 0000000..27ba561
--- /dev/null
+++ b/dtd/functions.dtd
@@ -0,0 +1,146 @@
+<!ELEMENT area (loop|fill|drawtext|drawtextbox|drawimage|drawrectangle|drawellipse|drawslope)*>
+<!ATTLIST area
+ x CDATA #IMPLIED
+ y CDATA #IMPLIED
+ width CDATA #IMPLIED
+ height CDATA #IMPLIED
+ layer CDATA #REQUIRED
+ transparency CDATA #IMPLIED
+ condition CDATA #IMPLIED
+ debug (true|false) #IMPLIED
+>
+
+<!ELEMENT areascroll (loop|fill|drawtext|drawtextbox|drawimage|drawrectangle|drawellipse|drawslope)*>
+<!ATTLIST areascroll
+ x CDATA #IMPLIED
+ y CDATA #IMPLIED
+ width CDATA #IMPLIED
+ height CDATA #IMPLIED
+ layer CDATA #REQUIRED
+ transparency CDATA #IMPLIED
+ mode (forthandback|carriagereturn) #REQUIRED
+ orientation (horizontal|vertical) #REQUIRED
+ scrollelement CDATA #IMPLIED
+ scrollspeed (slow|medium|fast) #REQUIRED
+ condition CDATA #IMPLIED
+ delay CDATA #REQUIRED
+ debug (true|false) #IMPLIED
+>
+
+<!ELEMENT loop (drawtext|drawtextbox|drawimage|drawrectangle|drawellipse|drawslope)+>
+<!ATTLIST loop
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #IMPLIED
+ height CDATA #IMPLIED
+ columnwidth CDATA #IMPLIED
+ rowheight CDATA #IMPLIED
+ name CDATA #REQUIRED
+ orientation (horizontal|vertical|absolute) #REQUIRED
+ overflow (linewrap|cut) #IMPLIED
+ maxitems CDATA #IMPLIED
+ debug (true|false) #IMPLIED
+>
+
+<!ELEMENT fill EMPTY>
+<!ATTLIST fill
+ color CDATA #REQUIRED
+ condition CDATA #IMPLIED
+ debug (true|false) #IMPLIED
+>
+
+<!ELEMENT drawtext EMPTY>
+<!ATTLIST drawtext
+ x CDATA #IMPLIED
+ y CDATA #IMPLIED
+ width CDATA #IMPLIED
+ align (left|center|right) #IMPLIED
+ valign (top|center|bottom) #IMPLIED
+ color CDATA #REQUIRED
+ font CDATA #REQUIRED
+ fontsize CDATA #REQUIRED
+ name NMTOKEN #IMPLIED
+ text CDATA #REQUIRED
+ condition CDATA #IMPLIED
+ debug (true|false) #IMPLIED
+>
+
+<!ELEMENT drawtextbox EMPTY>
+<!ATTLIST drawtextbox
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #REQUIRED
+ height CDATA #IMPLIED
+ align (left|center|right) #IMPLIED
+ maxlines CDATA #IMPLIED
+ floatwidth CDATA #IMPLIED
+ floatheight CDATA #IMPLIED
+ float (topleft|topright) #IMPLIED
+ color CDATA #REQUIRED
+ font CDATA #REQUIRED
+ fontsize CDATA #REQUIRED
+ name NMTOKEN #IMPLIED
+ text CDATA #REQUIRED
+ condition CDATA #IMPLIED
+ debug NMTOKEN #IMPLIED
+>
+
+<!ELEMENT drawrectangle EMPTY>
+<!ATTLIST drawrectangle
+ x CDATA #REQUIRED
+ y CDATA #REQUIRED
+ width CDATA #IMPLIED
+ height CDATA #IMPLIED
+ align (left|center|right) #IMPLIED
+ valign (top|center|bottom) #IMPLIED
+ color CDATA #REQUIRED
+ name NMTOKEN #IMPLIED
+ condition CDATA #IMPLIED
+ debug NMTOKEN #IMPLIED
+ >
+
+<!ELEMENT drawellipse EMPTY>
+<!ATTLIST drawellipse
+ x CDATA #IMPLIED
+ y CDATA #IMPLIED
+ width CDATA #IMPLIED
+ height CDATA #IMPLIED
+ align (left|center|right) #IMPLIED
+ valign (top|center|bottom) #IMPLIED
+ color CDATA #REQUIRED
+ quadrant CDATA #REQUIRED
+ name NMTOKEN #IMPLIED
+ condition CDATA #IMPLIED
+ debug NMTOKEN #IMPLIED
+ >
+
+<!ELEMENT drawslope EMPTY>
+<!ATTLIST drawslope
+ x CDATA #IMPLIED
+ y CDATA #IMPLIED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ align (left|center|right) #IMPLIED
+ valign (top|center|bottom) #IMPLIED
+ color CDATA #REQUIRED
+ type CDATA #REQUIRED
+ name NMTOKEN #IMPLIED
+ condition CDATA #IMPLIED
+ debug NMTOKEN #IMPLIED
+ >
+
+<!ELEMENT drawimage EMPTY>
+<!ATTLIST drawimage
+ x CDATA #IMPLIED
+ y CDATA #IMPLIED
+ width CDATA #REQUIRED
+ height CDATA #REQUIRED
+ align (left|center|right) #IMPLIED
+ valign (top|center|bottom) #IMPLIED
+ imagetype (channellogo|seplogo|skinpart|menuicon|icon|image) #REQUIRED
+ cache (true|false) #IMPLIED
+ path CDATA #REQUIRED
+ name CDATA #IMPLIED
+ condition CDATA #IMPLIED
+ debug NMTOKEN #IMPLIED
+>
diff --git a/dtd/globals.dtd b/dtd/globals.dtd
new file mode 100644
index 0000000..d7a463c
--- /dev/null
+++ b/dtd/globals.dtd
@@ -0,0 +1,29 @@
+<?xml encoding="UTF-8"?>
+
+<!ELEMENT globals (colors | variables | translations | fonts)*>
+<!ELEMENT colors (color)*>
+<!ELEMENT variables (var)*>
+<!ELEMENT translations (token)*>
+<!ELEMENT fonts (font)*>
+
+<!ELEMENT color (#PCDATA)>
+<!ATTLIST color
+ name NMTOKEN #REQUIRED>
+
+<!ELEMENT var (#PCDATA)>
+<!ATTLIST var
+ name NMTOKEN #REQUIRED
+ type (int|double|string) #REQUIRED>
+
+<!ELEMENT token (trans)+>
+<!ATTLIST token
+ name CDATA #REQUIRED>
+
+<!ELEMENT trans (#PCDATA)>
+<!ATTLIST trans
+ lang NMTOKEN #REQUIRED>
+
+<!ELEMENT font (#PCDATA)>
+<!ATTLIST font
+ name NMTOKEN #REQUIRED>
+
diff --git a/dtd/setup.dtd b/dtd/setup.dtd
new file mode 100644
index 0000000..d56fc40
--- /dev/null
+++ b/dtd/setup.dtd
@@ -0,0 +1,28 @@
+<?xml encoding="UTF-8"?>
+
+<!ELEMENT setup (menu,translations)>
+<!ELEMENT menu (submenu | parameter)*>
+<!ELEMENT translations (token)*>
+
+<!ELEMENT submenu (submenu | parameter)*>
+<!ATTLIST submenu
+ name NMTOKEN #REQUIRED
+ displaytext CDATA #REQUIRED
+ >
+
+<!ELEMENT parameter (#PCDATA)>
+<!ATTLIST parameter
+ name NMTOKEN #REQUIRED
+ type (int|bool) #REQUIRED
+ min NMTOKEN #IMPLIED
+ max NMTOKEN #IMPLIED
+ displaytext CDATA #REQUIRED
+ >
+
+<!ELEMENT token (trans)+>
+<!ATTLIST token
+ name CDATA #REQUIRED>
+
+<!ELEMENT trans (#PCDATA)>
+<!ATTLIST trans
+ lang NMTOKEN #REQUIRED>
diff --git a/extrecinfo/template.txt b/extrecinfo/template.txt
new file mode 100644
index 0000000..5a7e76b
--- /dev/null
+++ b/extrecinfo/template.txt
@@ -0,0 +1,4 @@
+General;<mediainfo>
+Video;<res_width>%Width%</res_width><res_height>%Height%</res_height><aspectratio>%DisplayAspectRatio/String%</aspectratio><codec>%Codec%</codec><format>%Format_Commercial%</format><framerate>%FrameRate%</framerate><interlace>%Interlacement%</interlace>
+Audio;<track><codec>%Format_Commercial%</codec><bitrate>%BitRate%</bitrate><language>%Language%</language></track>
+File_End;</mediainfo>
diff --git a/fonts/VDROpenSans/Apache License.txt b/fonts/VDROpenSans/Apache License.txt
new file mode 100644
index 0000000..989e2c5
--- /dev/null
+++ b/fonts/VDROpenSans/Apache License.txt
@@ -0,0 +1,201 @@
+Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/fonts/VDROpenSans/VDROpenSans-Bold.ttf b/fonts/VDROpenSans/VDROpenSans-Bold.ttf
new file mode 100644
index 0000000..9d51f27
Binary files /dev/null and b/fonts/VDROpenSans/VDROpenSans-Bold.ttf differ
diff --git a/fonts/VDROpenSans/VDROpenSans-BoldItalic.ttf b/fonts/VDROpenSans/VDROpenSans-BoldItalic.ttf
new file mode 100644
index 0000000..61fc899
Binary files /dev/null and b/fonts/VDROpenSans/VDROpenSans-BoldItalic.ttf differ
diff --git a/fonts/VDROpenSans/VDROpenSans-ExtraBold.ttf b/fonts/VDROpenSans/VDROpenSans-ExtraBold.ttf
new file mode 100644
index 0000000..3701480
Binary files /dev/null and b/fonts/VDROpenSans/VDROpenSans-ExtraBold.ttf differ
diff --git a/fonts/VDROpenSans/VDROpenSans-ExtraBoldItalic.ttf b/fonts/VDROpenSans/VDROpenSans-ExtraBoldItalic.ttf
new file mode 100644
index 0000000..b760f90
Binary files /dev/null and b/fonts/VDROpenSans/VDROpenSans-ExtraBoldItalic.ttf differ
diff --git a/fonts/VDROpenSans/VDROpenSans-Italic.ttf b/fonts/VDROpenSans/VDROpenSans-Italic.ttf
new file mode 100644
index 0000000..4fc4fe1
Binary files /dev/null and b/fonts/VDROpenSans/VDROpenSans-Italic.ttf differ
diff --git a/fonts/VDROpenSans/VDROpenSans-Light.ttf b/fonts/VDROpenSans/VDROpenSans-Light.ttf
new file mode 100644
index 0000000..4806a9c
Binary files /dev/null and b/fonts/VDROpenSans/VDROpenSans-Light.ttf differ
diff --git a/fonts/VDROpenSans/VDROpenSans-LightItalic.ttf b/fonts/VDROpenSans/VDROpenSans-LightItalic.ttf
new file mode 100644
index 0000000..4380547
Binary files /dev/null and b/fonts/VDROpenSans/VDROpenSans-LightItalic.ttf differ
diff --git a/fonts/VDROpenSans/VDROpenSans-Regular.ttf b/fonts/VDROpenSans/VDROpenSans-Regular.ttf
new file mode 100644
index 0000000..eaa8273
Binary files /dev/null and b/fonts/VDROpenSans/VDROpenSans-Regular.ttf differ
diff --git a/fonts/VDROpenSans/VDROpenSans-Semibold.ttf b/fonts/VDROpenSans/VDROpenSans-Semibold.ttf
new file mode 100644
index 0000000..2394fe1
Binary files /dev/null and b/fonts/VDROpenSans/VDROpenSans-Semibold.ttf differ
diff --git a/fonts/VDROpenSans/VDROpenSans-SemiboldItalic.ttf b/fonts/VDROpenSans/VDROpenSans-SemiboldItalic.ttf
new file mode 100644
index 0000000..1afcda3
Binary files /dev/null and b/fonts/VDROpenSans/VDROpenSans-SemiboldItalic.ttf differ
diff --git a/libcore/extrecinfo.c b/libcore/extrecinfo.c
new file mode 100644
index 0000000..435d43b
--- /dev/null
+++ b/libcore/extrecinfo.c
@@ -0,0 +1,96 @@
+#include "../config.h"
+#include "helpers.h"
+#include "extrecinfo.h"
+
+cExtRecInfo::cExtRecInfo(const char *xml) {
+ this->xml = xml;
+}
+
+cExtRecInfo::~cExtRecInfo(void) {
+
+}
+
+bool cExtRecInfo::Parse(void) {
+ //read media info
+ string mediaInfoXml;
+ StripXmlTag(xml, mediaInfoXml, "mediainfo");
+ if (mediaInfoXml.size() == 0) {
+ return false;
+ }
+ StripXmlTag(mediaInfoXml, resWidth, "res_width");
+ StripXmlTag(mediaInfoXml, resHeight, "res_height");
+ resString = GetScreenResolutionString(resWidth, resHeight, &isHD);
+ StripXmlTag(mediaInfoXml, aspectratio, "aspectratio");
+ isWideScreen = !aspectratio.compare("16:9");
+ StripXmlTag(mediaInfoXml, codec, "codec");
+ StripXmlTag(mediaInfoXml, format, "format");
+ StripXmlTag(mediaInfoXml, framerate, "framerate");
+ StripXmlTag(mediaInfoXml, interlace, "interlace");
+
+ size_t found = 0;
+ isDolby = false;
+ do {
+ string track;
+ found = StripXmlTag(mediaInfoXml, track, "track", found);
+ if (found == string::npos)
+ break;
+ tAudioTrack sTrack;
+ StripXmlTag(track, sTrack.codec, "codec");
+ StripXmlTag(track, sTrack.bitrate, "bitrate");
+ StripXmlTag(track, sTrack.language, "language");
+ if (!sTrack.codec.compare("AC-3"))
+ isDolby = true;
+ tracks.push_back(sTrack);
+ } while (found != string::npos);
+
+ return true;
+}
+
+//get content of <tag> ... </tag> inside xml
+size_t cExtRecInfo::StripXmlTag(string &xmlstring, string &content, const char *tag, int start) {
+ // set the search strings
+ stringstream strStart, strStop;
+ strStart << "<" << tag << ">";
+ strStop << "</" << tag << ">";
+ // find the strings
+ size_t locStart = xmlstring.find(strStart.str(), start);
+ size_t locStop = xmlstring.find(strStop.str(), start);
+ if (locStart == string::npos || locStop == string::npos)
+ return string::npos;
+ // extract relevant text
+ int pos = locStart + strStart.str().size();
+ int len = locStop - pos;
+
+ content = (len < 0) ? "" : xmlstring.substr(pos, len);
+ return locStop + strStop.str().size();
+}
+
+size_t cExtRecInfo::StripXmlTag(string &xmlstring, int &content, const char *tag, int start) {
+ // set the search strings
+ stringstream strStart, strStop;
+ strStart << "<" << tag << ">";
+ strStop << "</" << tag << ">";
+ // find the strings
+ size_t locStart = xmlstring.find(strStart.str(), start);
+ size_t locStop = xmlstring.find(strStop.str(), start);
+ if (locStart == string::npos || locStop == string::npos)
+ return string::npos;
+ // extract relevant text
+ int pos = locStart + strStart.str().size();
+ int len = locStop - pos;
+
+ string value = (len < 0) ? "" : xmlstring.substr(pos, len);
+ content = atoi(value.c_str());
+ return locStop + strStop.str().size();
+}
+
+void cExtRecInfo::Debug(void) {
+ dsyslog("skindesigner: extRecInfo xml: %s", xml.c_str());
+ dsyslog("skindesigner: : res_width %d, res_height %d, res %s, aspectratio %s, codec %s, format %s, framerate %s, interlace %s, hd %s, widescreen %s",
+ resWidth, resHeight, resString.c_str(), aspectratio.c_str(), codec.c_str(), format.c_str(), framerate.c_str(), interlace.c_str(),
+ isHD ? "true": "false", isWideScreen ? "true" : "false");
+ int numTrack = 1;
+ for (vector<tAudioTrack>::iterator it = tracks.begin(); it != tracks.end(); it++) {
+ dsyslog("skindesigner: audio track %d, codec %s, bitrate %s, language: %s", numTrack++, (*it).codec.c_str(), (*it).bitrate.c_str(), (*it).language.c_str());
+ }
+}
diff --git a/libcore/extrecinfo.h b/libcore/extrecinfo.h
new file mode 100644
index 0000000..9fb5bab
--- /dev/null
+++ b/libcore/extrecinfo.h
@@ -0,0 +1,36 @@
+#ifndef __EXTRECINFO_H
+#define __EXTRECINFO_H
+
+#include <vdr/recording.h>
+
+struct tAudioTrack {
+ string codec;
+ string bitrate;
+ string language;
+};
+
+class cExtRecInfo {
+private:
+ string xml;
+ size_t StripXmlTag(string &xmlstring, string &content, const char *tag, int start = 0);
+ size_t StripXmlTag(string &xmlstring, int &content, const char *tag, int start = 0);
+public:
+ cExtRecInfo(const char *xml);
+ ~cExtRecInfo(void);
+ bool Parse(void);
+ void Debug(void);
+ int resWidth;
+ int resHeight;
+ string resString;
+ bool isHD;
+ string aspectratio;
+ bool isWideScreen;
+ string codec;
+ string format;
+ string framerate;
+ string interlace;
+ bool isDolby;
+ vector< tAudioTrack > tracks;
+};
+
+#endif // __EXTRECINFO_H
\ No newline at end of file
diff --git a/libcore/fontmanager.c b/libcore/fontmanager.c
new file mode 100644
index 0000000..1f45af7
--- /dev/null
+++ b/libcore/fontmanager.c
@@ -0,0 +1,180 @@
+#include "fontmanager.h"
+#include "../config.h"
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+using namespace std;
+
+cMutex cFontManager::mutex;
+
+cFontManager::cFontManager() {
+}
+
+cFontManager::~cFontManager() {
+ DeleteFonts();
+}
+
+void cFontManager::CacheFonts(cTemplate *tpl) {
+ cMutexLock MutexLock(&mutex);
+
+ vector< pair<string, int> > usedFonts = tpl->GetUsedFonts();
+
+ cStringList availableFonts;
+ cFont::GetAvailableFontNames(&availableFonts);
+
+ for (vector< pair<string, int> >::iterator ft = usedFonts.begin(); ft != usedFonts.end(); ft++) {
+ string fontName = ft->first;
+ int fontSize = ft->second;
+ if (fontSize < 1) {
+ continue;
+ }
+
+ int fontAvailable = availableFonts.Find(fontName.c_str());
+ if (fontAvailable == -1) {
+ esyslog("skindesigner: font %s not available, skipping", fontName.c_str());
+ continue;
+ }
+
+ InsertFont(fontName, fontSize);
+ }
+}
+
+void cFontManager::Debug(void) {
+ dsyslog("skindesigner: fontmanager fonts available:");
+ for (map < string, map< int, cFont* > >::iterator fts = fonts.begin(); fts != fonts.end(); fts++) {
+ dsyslog("skindesigner: FontName %s", fts->first.c_str());
+ for (map<int, cFont*>::iterator ftSizes = (fts->second).begin(); ftSizes != (fts->second).end(); ftSizes++) {
+ int confHeight = ftSizes->first;
+ int realHeight = (ftSizes->second)->Height();
+ dsyslog("skindesigner: fontSize %d, fontHeight %d, ratio %f", confHeight, realHeight, (double)confHeight / (double)realHeight);
+ }
+ }
+}
+
+void cFontManager::ListAvailableFonts(void) {
+ cStringList availableFonts;
+ cFont::GetAvailableFontNames(&availableFonts);
+ int numFonts = availableFonts.Size();
+ esyslog("skindesigner: %d Fonts available:", numFonts);
+ for (int i=0; i<numFonts; i++) {
+ esyslog("skindesigner: font %d: %s", i, availableFonts[i]);
+ }
+}
+
+void cFontManager::DeleteFonts() {
+ cMutexLock MutexLock(&mutex);
+ for(map<string, map<int,cFont*> >::iterator it = fonts.begin(); it != fonts.end(); it++) {
+ for(map<int,cFont*>::iterator it2 = (it->second).begin(); it2 != (it->second).end(); it2++) {
+ delete it2->second;
+ }
+ }
+ fonts.clear();
+}
+
+int cFontManager::Width(string fontName, int fontSize, const char *text) {
+ cMutexLock MutexLock(&mutex);
+ if (!text)
+ return 0;
+ cFont *font = GetFont(fontName, fontSize);
+ //if not already cached, load it new
+ if (!font)
+ InsertFont(fontName, fontSize);
+ font = GetFont(fontName, fontSize);
+ if (!font)
+ return 0;
+ int width = font->Width(text);
+ return width;
+}
+
+int cFontManager::Height(string fontName, int fontSize) {
+ cMutexLock MutexLock(&mutex);
+ cFont *font = GetFont(fontName, fontSize);
+ //if not already cached, load it new
+ if (!font)
+ InsertFont(fontName, fontSize);
+ font = GetFont(fontName, fontSize);
+ if (!font)
+ return 0;
+ return font->Height();
+}
+
+cFont *cFontManager::Font(string fontName, int fontSize) {
+ cMutexLock MutexLock(&mutex);
+ cFont *font = GetFont(fontName, fontSize);
+ //if not already cached, load it new
+ if (!font)
+ InsertFont(fontName, fontSize);
+ font = GetFont(fontName, fontSize);
+ return font;
+}
+
+cFont *cFontManager::FontUncached(string fontName, int fontSize) {
+ cMutexLock MutexLock(&mutex);
+ cFont *font = CreateFont(fontName, fontSize);
+ return font;
+}
+
+/********************************************************************************
+* Private Functions
+********************************************************************************/
+
+cFont *cFontManager::CreateFont(string name, int size) {
+ cMutexLock MutexLock(&mutex);
+ cFont *fontTmp = cFont::CreateFont(name.c_str(), size);
+ if (!fontTmp)
+ fontTmp = cFont::CreateFont(Setup.FontOsd, size);
+ int realHeight = fontTmp->Height();
+ delete fontTmp;
+ cFont *font = cFont::CreateFont(name.c_str(), (double)size / (double)realHeight * (double)size);
+ if (!font)
+ font = cFont::CreateFont(Setup.FontOsd, (double)size / (double)realHeight * (double)size);
+ return font;
+}
+
+void cFontManager::InsertFont(string name, int size) {
+ cFont *newFont = CreateFont(name, size);
+ if (!newFont)
+ return;
+ map < string, map< int, cFont* > >::iterator hit = fonts.find(name);
+ if (hit != fonts.end()) {
+ (hit->second).insert(pair<int, cFont*>(size, newFont));
+ } else {
+ map<int, cFont*> fontsizes;
+ fontsizes.insert(pair<int, cFont*>(size, newFont));
+ fonts.insert(pair<string, map<int, cFont*> >(name, fontsizes));
+ }
+}
+
+cFont *cFontManager::GetFont(string name, int size) {
+ map< string, map<int,cFont*> >::iterator hitName = fonts.find(name);
+ if (hitName == fonts.end())
+ return NULL;
+ map<int,cFont*>::iterator hitSize = (hitName->second).find(size);
+ if (hitSize == (hitName->second).end())
+ return NULL;
+ return hitSize->second;
+}
+
+int cFontManager::GetFontHeight(const char *name, int height, int charWidth) {
+ FT_Library library;
+ FT_Face face;
+ cString fontFileName = cFont::GetFontFileName(name);
+
+ int descender = 0;
+ int y_ppem = 0;
+ int error = FT_Init_FreeType(&library);
+ if (error) return 0;
+ error = FT_New_Face(library, fontFileName, 0, &face);
+ if (error) return 0;
+ error = FT_Set_Char_Size(face, charWidth * 64, height * 64, 0, 0);
+ if (error) return 0;
+
+ descender = face->size->metrics.descender/64;
+ y_ppem = face->size->metrics.y_ppem;
+ int realHeight = y_ppem + descender;
+
+ FT_Done_Face(face);
+ FT_Done_FreeType(library);
+
+ return realHeight;
+}
diff --git a/libcore/fontmanager.h b/libcore/fontmanager.h
new file mode 100644
index 0000000..bfabb5c
--- /dev/null
+++ b/libcore/fontmanager.h
@@ -0,0 +1,36 @@
+#ifndef __FONTMANAGER_H
+#define __FONTMANAGER_H
+
+#include <string>
+#include <map>
+#include <vector>
+#include <vdr/skins.h>
+
+#include "../libtemplate/template.h"
+
+using namespace std;
+
+class cFontManager {
+ private:
+ static cMutex mutex;
+ map < string, map< int, cFont* > > fonts;
+ cFont *CreateFont(string name, int size);
+ void InsertFont(string name, int size);
+ cFont *GetFont(string name, int size);
+ int GetFontHeight(const char *name, int height, int charWidth = 0);
+ public:
+ cFontManager();
+ ~cFontManager();
+ void Lock(void) { mutex.Lock(); };
+ void Unlock(void) { mutex.Unlock(); };
+ void CacheFonts(cTemplate *tpl);
+ void DeleteFonts(void);
+ int Width(string fontName, int fontSize, const char *text);
+ int Height(string fontName, int fontSize);
+ cFont *Font(string fontName, int fontSize);
+ cFont *FontUncached(string fontName, int fontSize);
+ void Debug(void);
+ void ListAvailableFonts(void);
+};
+
+#endif //__FONTMANAGER_H
\ No newline at end of file
diff --git a/libcore/helpers.c b/libcore/helpers.c
new file mode 100644
index 0000000..3e08e11
--- /dev/null
+++ b/libcore/helpers.c
@@ -0,0 +1,234 @@
+#include <string>
+#include <sstream>
+#include <vector>
+#include "helpers.h"
+#include <vdr/skins.h>
+
+cPlugin *GetScraperPlugin(void) {
+ static cPlugin *pScraper = cPluginManager::GetPlugin("scraper2vdr");
+ if( !pScraper ) // if it doesn't exit, try tvscraper
+ pScraper = cPluginManager::GetPlugin("tvscraper");
+ return pScraper;
+}
+
+cSize ScaleToFit(int widthMax, int heightMax, int widthOriginal, int heightOriginal) {
+ int width = 1;
+ int height = 1;
+
+ if ((widthMax == 0)||(heightMax==0)||(widthOriginal==0)||(heightOriginal==0))
+ return cSize(width, height);
+
+ if ((widthOriginal <= widthMax) && (heightOriginal <= heightMax)) {
+ width = widthOriginal;
+ height = heightOriginal;
+ } else if ((widthOriginal > widthMax) && (heightOriginal <= heightMax)) {
+ width = widthMax;
+ height = (double)width/(double)widthOriginal * heightOriginal;
+ } else if ((widthOriginal <= widthMax) && (heightOriginal > heightMax)) {
+ height = heightMax;
+ width = (double)height/(double)heightOriginal * widthOriginal;
+ } else {
+ width = widthMax;
+ height = (double)width/(double)widthOriginal * heightOriginal;
+ if (height > heightMax) {
+ height = heightMax;
+ width = (double)height/(double)heightOriginal * widthOriginal;
+ }
+ }
+ return cSize(width, height);
+}
+
+int Minimum(int a, int b, int c, int d, int e, int f) {
+ int min = a;
+ if (b < min) min = b;
+ if (c < min) min = c;
+ if (d < min) min = d;
+ if (e < min) min = e;
+ if (f < min) min = f;
+ return min;
+}
+
+string CutText(string &text, int width, string fontName, int fontSize) {
+ if (width <= fontManager->Font(fontName, fontSize)->Size())
+ return text.c_str();
+ cTextWrapper twText;
+ twText.Set(text.c_str(), fontManager->Font(fontName, fontSize), width);
+ string cuttedTextNative = twText.GetLine(0);
+ stringstream sstrText;
+ sstrText << cuttedTextNative << "...";
+ string cuttedText = sstrText.str();
+ int actWidth = fontManager->Width(fontName, fontSize, cuttedText.c_str());
+ if (actWidth > width) {
+ int overlap = actWidth - width;
+ int charWidth = fontManager->Width(fontName, fontSize, ".");
+ if (charWidth == 0)
+ charWidth = 1;
+ int cutChars = overlap / charWidth;
+ if (cutChars > 0) {
+ cuttedTextNative = cuttedTextNative.substr(0, cuttedTextNative.length() - cutChars);
+ stringstream sstrText2;
+ sstrText2 << cuttedTextNative << "...";
+ cuttedText = sstrText2.str();
+ }
+ }
+ return cuttedText;
+}
+
+
+string StrToLowerCase(string str) {
+ string lowerCase = str;
+ const int length = lowerCase.length();
+ for(int i=0; i < length; ++i) {
+ lowerCase[i] = std::tolower(lowerCase[i]);
+ }
+ return lowerCase;
+}
+
+bool isNumber(const string& s) {
+ string::const_iterator it = s.begin();
+ while (it != s.end() && std::isdigit(*it)) ++it;
+ return !s.empty() && it == s.end();
+}
+
+bool IsToken(const string& token) {
+ if ((token.find("{") == 0) && (token.find("}") == (token.size()-1)))
+ return true;
+ return false;
+}
+
+bool FileExists(const string &fullpath) {
+ struct stat buffer;
+ return (stat (fullpath.c_str(), &buffer) == 0);
+}
+
+bool FileExists(const string &path, const string &name, const string &ext) {
+ stringstream fileName;
+ fileName << path << name << "." << ext;
+ struct stat buffer;
+ return (stat (fileName.str().c_str(), &buffer) == 0);
+}
+
+bool FolderExists(const string &path) {
+ struct stat buffer;
+ return stat(path.c_str(), &buffer) == 0 && S_ISDIR(buffer.st_mode);
+}
+
+bool FirstFileInFolder(string &path, string &extension, string &fileName) {
+ DIR *folder = NULL;
+ struct dirent *file;
+ folder = opendir(path.c_str());
+ if (!folder)
+ return false;
+ while (file = readdir(folder)) {
+ if (endswith(file->d_name, extension.c_str())) {
+ string currentFileName = file->d_name;
+ int strlength = currentFileName.size();
+ if (strlength < 8)
+ continue;
+ fileName = currentFileName;
+ return true;
+ }
+ }
+ return false;
+}
+
+// trim from start
+string <rim(string &s) {
+ s.erase(s.begin(), find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(isspace))));
+ return s;
+}
+
+// trim from end
+string &rtrim(string &s) {
+ s.erase(find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(), s.end());
+ return s;
+}
+
+// trim from both ends
+string &trim(string &s) {
+ return ltrim(rtrim(s));
+}
+
+// split: receives a char delimiter; returns a vector of strings
+// By default ignores repeated delimiters, unless argument rep == 1.
+vector<string>& splitstring::split(char delim, int rep) {
+ if (!flds.empty()) flds.clear(); // empty vector if necessary
+ string work = data();
+ string buf = "";
+ int i = 0;
+ while (i < work.length()) {
+ if (work[i] != delim)
+ buf += work[i];
+ else if (rep == 1) {
+ flds.push_back(buf);
+ buf = "";
+ } else if (buf.length() > 0) {
+ flds.push_back(buf);
+ buf = "";
+ }
+ i++;
+ }
+ if (!buf.empty())
+ flds.push_back(buf);
+ return flds;
+}
+
+cStopWatch::cStopWatch(const char* message) {
+ start = cTimeMs::Now();
+ last = start;
+ if (message) {
+ dsyslog("skindesigner: Starting StopWatch %s", message);
+ }
+}
+
+void cStopWatch::Report(const char* message) {
+ dsyslog("skindesigner: %s - needed %d ms", message, (int)(cTimeMs::Now() - last));
+ last = cTimeMs::Now();
+}
+
+void cStopWatch::Stop(const char* message) {
+ dsyslog("skindesigner: %s - needed %d ms", message, (int)(cTimeMs::Now() - start));
+}
+
+//View Helpers
+string GetScreenResolutionString(int width, int height, bool *isHD) {
+ string name = "";
+ switch (width) {
+ case 1920:
+ case 1440:
+ name = "hd1080i";
+ *isHD = true;
+ break;
+ case 1280:
+ if (height == 720)
+ name = "hd720p";
+ else
+ name = "hd1080i";
+ *isHD = true;
+ break;
+ case 720:
+ name = "sd576i";
+ break;
+ default:
+ name = "sd576i";
+ break;
+ }
+ return name;
+}
+
+string GetScreenAspectString(double aspect, bool *isWideScreen) {
+ string name = "";
+ *isWideScreen = false;
+ if (aspect == 4.0/3.0) {
+ name = "4:3";
+ *isWideScreen = false;
+ } else if (aspect == 16.0/9.0) {
+ name = "16:9";
+ *isWideScreen = true;
+ } else if (aspect == 2.21) {
+ name = "21:9";
+ *isWideScreen = true;
+ }
+ return name;
+}
+
diff --git a/libcore/helpers.h b/libcore/helpers.h
new file mode 100644
index 0000000..cfcd70d
--- /dev/null
+++ b/libcore/helpers.h
@@ -0,0 +1,46 @@
+#ifndef __HELPERS_H
+#define __HELPERS_H
+
+#include <vdr/osd.h>
+#include <vdr/plugin.h>
+#include "../config.h"
+
+cPlugin *GetScraperPlugin(void);
+
+cSize ScaleToFit(int widthMax, int heightMax, int widthOriginal, int heightOriginal);
+int Minimum(int a, int b, int c, int d, int e, int f);
+std::string CutText(string &text, int width, string fontName, int fontSize);
+std::string StrToLowerCase(string str);
+bool isNumber(const string& s);
+bool IsToken(const string& token);
+bool FileExists(const string &fullpath);
+bool FileExists(const string &path, const string &name, const string &ext);
+bool FolderExists(const string &path);
+bool FirstFileInFolder(string &path, string &extension, string &fileName);
+
+string <rim(string &s);
+string &rtrim(string &s);
+string &trim(string &s);
+
+class splitstring : public std::string {
+ std::vector<std::string> flds;
+public:
+ splitstring(const char *s) : std::string(s) { };
+ std::vector<std::string>& split(char delim, int rep=0);
+};
+
+class cStopWatch {
+private:
+ uint64_t start;
+ uint64_t last;
+public:
+ cStopWatch(const char* message = NULL);
+ ~cStopWatch(void) {};
+ void Report(const char* message);
+ void Stop(const char* message);
+};
+
+string GetScreenResolutionString(int width, int height, bool *isHD);
+string GetScreenAspectString(double aspect, bool *isWideScreen);
+
+#endif // __HELPERS_H
diff --git a/libcore/imagecache.c b/libcore/imagecache.c
new file mode 100644
index 0000000..2a9a948
--- /dev/null
+++ b/libcore/imagecache.c
@@ -0,0 +1,476 @@
+#include <string>
+#include <sstream>
+#include <map>
+#include <fstream>
+#include <sys/stat.h>
+#include "imagecache.h"
+#include "../config.h"
+#include "helpers.h"
+
+
+cMutex cImageCache::mutex;
+
+string cImageCache::items[16] = { "Schedule", "Channels", "Timers", "Recordings", "Setup", "Commands",
+ "OSD", "EPG", "DVB", "LNB", "CAM", "Recording", "Replay", "Miscellaneous", "Plugins", "Restart"};
+
+cImageCache::cImageCache() {
+ tempStaticLogo = NULL;
+}
+
+cImageCache::~cImageCache() {
+ Clear();
+ if (tempStaticLogo) {
+ delete tempStaticLogo;
+ tempStaticLogo = NULL;
+ }
+}
+
+void cImageCache::SetPathes(void) {
+ string logoPathSkin = *cString::sprintf("%s%s/themes/%s/logos/", *config.skinPath, Setup.OSDSkin, Setup.OSDTheme);
+ if (FolderExists(logoPathSkin)) {
+ logoPath = logoPathSkin;
+ } else {
+ logoPath = *config.logoPath;
+ }
+
+ iconPathSkin = *cString::sprintf("%s%s/", *config.skinPath, Setup.OSDSkin);
+ skinPartsPathSkin = *cString::sprintf("%s%s/skinparts/", *config.skinPath, Setup.OSDSkin);
+
+ iconPathTheme = *cString::sprintf("%s%s/themes/%s/", *config.skinPath, Setup.OSDSkin, Setup.OSDTheme);
+ skinPartsPathTheme = *cString::sprintf("%s%s/themes/%s/skinparts/", *config.skinPath, Setup.OSDSkin, Setup.OSDTheme);
+
+ dsyslog("skindesigner: using channel logo path %s", logoPath.c_str());
+ dsyslog("skindesigner: using icon path %s", iconPathTheme.c_str());
+ dsyslog("skindesigner: using skinparts path %s", skinPartsPathTheme.c_str());
+}
+
+void cImageCache::CacheLogo(int width, int height) {
+ if (config.numLogosPerSizeInitial == 0)
+ return;
+ if (width == 0 || height == 0)
+ return;
+
+ int logosCached = 0;
+
+ for (const cChannel *channel = Channels.First(); channel; channel = Channels.Next(channel)) {
+ if (logosCached >= config.numLogosPerSizeInitial)
+ break;
+ if (channel->GroupSep()) {
+ continue;
+ }
+ stringstream logoName;
+ logoName << *channel->GetChannelID().ToString() << "_" << width << "x" << height;
+ map<string, cImage*>::iterator hit = channelLogoCache.find(logoName.str());
+ if (hit != channelLogoCache.end()) {
+ continue;
+ }
+ bool success = LoadLogo(channel);
+ if (success) {
+ logosCached++;
+ cImage *image = CreateImage(width, height);
+ channelLogoCache.insert(pair<string, cImage*>(logoName.str(), image));
+ }
+ }
+}
+
+cImage *cImageCache::GetLogo(string channelID, int width, int height) {
+ cMutexLock MutexLock(&mutex);
+
+ stringstream logoName;
+ logoName << channelID << "_" << width << "x" << height;
+
+ std::map<std::string, cImage*>::iterator hit = channelLogoCache.find(logoName.str());
+
+ if (hit != channelLogoCache.end()) {
+ return (cImage*)hit->second;
+ } else {
+ tChannelID chanID = tChannelID::FromString(channelID.c_str());
+ const cChannel *channel = Channels.GetByChannelID(chanID);
+ if (!channel)
+ return NULL;
+ bool success = LoadLogo(channel);
+ if (success) {
+ if (config.limitLogoCache && (channelLogoCache.size() >= config.numLogosMax)) {
+ //logo cache is full, don't cache anymore
+ if (tempStaticLogo) {
+ delete tempStaticLogo;
+ tempStaticLogo = NULL;
+ }
+ tempStaticLogo = CreateImage(width, height);
+ return tempStaticLogo;
+ } else {
+ //add requested logo to cache
+ cImage *image = CreateImage(width, height);
+ channelLogoCache.insert(pair<string, cImage*>(logoName.str(), image));
+ hit = channelLogoCache.find(logoName.str());
+ if (hit != channelLogoCache.end()) {
+ return (cImage*)hit->second;
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
+cImage *cImageCache::GetSeparatorLogo(string name, int width, int height) {
+ cMutexLock MutexLock(&mutex);
+
+ stringstream logoName;
+ logoName << name << "_" << width << "x" << height;
+
+ std::map<std::string, cImage*>::iterator hit = channelLogoCache.find(logoName.str());
+
+ if (hit != channelLogoCache.end()) {
+ return (cImage*)hit->second;
+ } else {
+ bool success = LoadSeparatorLogo(name);
+ if (success) {
+ //add requested logo to cache
+ cImage *image = CreateImage(width, height);
+ channelLogoCache.insert(pair<string, cImage*>(logoName.str(), image));
+ hit = channelLogoCache.find(logoName.str());
+ if (hit != channelLogoCache.end()) {
+ return (cImage*)hit->second;
+ }
+ }
+ }
+ return NULL;
+}
+
+bool cImageCache::LogoExists(string channelID) {
+ tChannelID chanID = tChannelID::FromString(channelID.c_str());
+ const cChannel *channel = Channels.GetByChannelID(chanID);
+ if (!channel)
+ return false;
+ string logoLower = StrToLowerCase(channel->Name());
+
+ return (FileExists(logoPath.c_str(), logoLower, "svg") ||
+ FileExists(logoPath.c_str(), logoLower, "png") ||
+ FileExists(logoPath.c_str(), channelID, "svg") ||
+ FileExists(logoPath.c_str(), channelID, "png"));
+}
+
+bool cImageCache::SeparatorLogoExists(string name) {
+ string separatorPath = *cString::sprintf("%sseparatorlogos/", logoPath.c_str());
+ string nameLower = StrToLowerCase(name.c_str());
+
+ return (FileExists(separatorPath, nameLower, "svg") ||
+ FileExists(separatorPath, nameLower, "png"));
+}
+
+void cImageCache::CacheIcon(eImageType type, string name, int width, int height) {
+ if (width < 1 || width > 1920 || height < 1 || height > 1080)
+ return;
+ GetIcon(type, name, width, height);
+}
+
+cImage *cImageCache::GetIcon(eImageType type, string name, int width, int height) {
+ if (width < 1 || width > 1920 || height < 1 || height > 1080)
+ return NULL;
+ cMutexLock MutexLock(&mutex);
+ stringstream iconName;
+ iconName << name << "_" << width << "x" << height;
+ map<string, cImage*>::iterator hit = iconCache.find(iconName.str());
+ if (hit != iconCache.end()) {
+ return (cImage*)hit->second;
+ } else {
+ bool success = LoadIcon(type, name);
+ if (!success)
+ return NULL;
+ cImage *image = CreateImage(width, height, true);
+ iconCache.insert(pair<string, cImage*>(iconName.str(), image));
+ hit = iconCache.find(iconName.str());
+ if (hit != iconCache.end()) {
+ return (cImage*)hit->second;
+ }
+ }
+ return NULL;
+}
+
+string cImageCache::GetIconName(string label, eMenuCategory cat) {
+ //if cat is set, use standard menu entries
+ switch (cat) {
+ case mcSchedule:
+ case mcScheduleNow:
+ case mcScheduleNext:
+ case mcEvent:
+ return "standardicons/Schedule";
+ case mcChannel:
+ case mcChannelEdit:
+ return "standardicons/Channels";
+ case mcTimer:
+ case mcTimerEdit:
+ return "standardicons/Timers";
+ case mcRecording:
+ case mcRecordingInfo:
+ case mcSetupRecord:
+ case mcSetupReplay:
+ return "standardicons/Recordings";
+ case mcPlugin: {
+ //check for Plugins
+ for (int i = 0; ; i++) {
+ cPlugin *p = cPluginManager::GetPlugin(i);
+ if (p) {
+ const char *mainMenuEntry = p->MainMenuEntry();
+ if (mainMenuEntry) {
+ string plugMainEntry = mainMenuEntry;
+ try {
+ if (label.substr(0, plugMainEntry.size()) == plugMainEntry) {
+ return *cString::sprintf("pluginicons/%s", p->Name());
+ }
+ } catch (...) {}
+ }
+ } else
+ break;
+ }
+ return "standardicons/Plugins";
+ }
+ case mcPluginSetup:
+ case mcSetupPlugins:
+ return "standardicons/Plugins";
+ case mcSetup:
+ return "standardicons/Setup";
+ case mcSetupOsd:
+ return "standardicons/OSD";
+ case mcSetupEpg:
+ return "standardicons/EPG";
+ case mcSetupDvb:
+ return "standardicons/DVB";
+ case mcSetupLnb:
+ return "standardicons/LNB";
+ case mcSetupCam:
+ return "standardicons/CAM";
+ case mcSetupMisc:
+ return "standardicons/Miscellaneous";
+ case mcCommand:
+ return "standardicons/Commands";
+ }
+ //check for standard menu entries
+ for (int i=0; i<16; i++) {
+ string s = trVDR(items[i].c_str());
+ if (s == label) {
+ return *cString::sprintf("standardicons/%s", items[i].c_str());
+ }
+ }
+ //check for special main menu entries "stop recording", "stop replay"
+ string stopRecording = skipspace(trVDR(" Stop recording "));
+ string stopReplay = skipspace(trVDR(" Stop replaying"));
+ try {
+ if (label.substr(0, stopRecording.size()) == stopRecording) {
+ return "standardicons/StopRecording";
+ }
+ if (label.substr(0, stopReplay.size()) == stopReplay) {
+ return "standardicons/StopReplay";
+ }
+ } catch (...) {}
+ //check for Plugins
+ for (int i = 0; ; i++) {
+ cPlugin *p = cPluginManager::GetPlugin(i);
+ if (p) {
+ const char *mainMenuEntry = p->MainMenuEntry();
+ if (mainMenuEntry) {
+ string plugMainEntry = mainMenuEntry;
+ try {
+ if (label.substr(0, plugMainEntry.size()) == plugMainEntry) {
+ return *cString::sprintf("pluginicons/%s", p->Name());
+ }
+ } catch (...) {}
+ }
+ } else
+ break;
+ }
+ return *cString::sprintf("customicons/%s", label.c_str());
+}
+
+bool cImageCache::MenuIconExists(string name) {
+ //first check in theme specific icon folder
+ cString iconThemePath = cString::sprintf("%smenuicons/", iconPathTheme.c_str());
+ if (FileExists(*iconThemePath, name, "svg")) {
+ return true;
+ }
+ if (FileExists(*iconThemePath, name, "png")) {
+ return true;
+ }
+ //then check skin icon folder
+ cString iconSkinPath = cString::sprintf("%smenuicons/", iconPathSkin.c_str());
+ if (FileExists(*iconSkinPath, name, "svg")) {
+ return true;
+ }
+ if (FileExists(*iconSkinPath, name, "png")) {
+ return true;
+ }
+ return false;
+}
+
+void cImageCache::CacheSkinpart(string name, int width, int height) {
+ if (width < 1 || width > 1920 || height < 1 || height > 1080)
+ return;
+ GetSkinpart(name, width, height);
+}
+
+cImage *cImageCache::GetSkinpart(string name, int width, int height) {
+ if (width < 1 || width > 1920 || height < 1 || height > 1080)
+ return NULL;
+ cMutexLock MutexLock(&mutex);
+ stringstream iconName;
+ iconName << name << "_" << width << "x" << height;
+ map<string, cImage*>::iterator hit = skinPartsCache.find(iconName.str());
+ if (hit != skinPartsCache.end()) {
+ return (cImage*)hit->second;
+ } else {
+ bool success = LoadSkinpart(name);
+ if (!success)
+ return NULL;
+ cImage *image = CreateImage(width, height, false);
+ skinPartsCache.insert(pair<string, cImage*>(iconName.str(), image));
+ hit = skinPartsCache.find(iconName.str());
+ if (hit != skinPartsCache.end()) {
+ return (cImage*)hit->second;
+ }
+ }
+ return NULL;
+}
+
+bool cImageCache::LoadIcon(eImageType type, string name) {
+ cString subdir("");
+ if (type == itMenuIcon)
+ subdir = "menuicons";
+ else if (type == itIcon)
+ subdir = "icons";
+
+ //first check in theme specific icon path
+ cString subIconThemePath = cString::sprintf("%s%s/", iconPathTheme.c_str(), *subdir);
+
+ if (FileExists(*subIconThemePath, name, "svg"))
+ return LoadImage(*subIconThemePath, name, "svg");
+ else if (FileExists(*subIconThemePath, name, "png"))
+ return LoadImage(*subIconThemePath, name, "png");
+
+ //then check in skin icon path
+ cString subIconSkinPath = cString::sprintf("%s%s/", iconPathSkin.c_str(), *subdir);
+
+ if (FileExists(*subIconSkinPath, name, "svg"))
+ return LoadImage(*subIconSkinPath, name, "svg");
+ else
+ return LoadImage(*subIconSkinPath, name, "png");
+}
+
+bool cImageCache::LoadLogo(const cChannel *channel) {
+ if (!channel)
+ return false;
+ string channelID = StrToLowerCase(*(channel->GetChannelID().ToString()));
+ string logoLower = StrToLowerCase(channel->Name());
+
+ if (FileExists(logoPath.c_str(), channelID.c_str(), "svg"))
+ return LoadImage(logoPath.c_str(), channelID.c_str(), "svg");
+ if (FileExists(logoPath.c_str(), channelID.c_str(), "png"))
+ return LoadImage(logoPath.c_str(), channelID.c_str(), "png");
+ if (FileExists(logoPath.c_str(), logoLower.c_str(), "svg"))
+ return LoadImage(logoPath.c_str(), logoLower.c_str(), "svg");
+ if (FileExists(logoPath.c_str(), logoLower.c_str(), "png"))
+ return LoadImage(logoPath.c_str(), logoLower.c_str(), "png");
+
+ return false;
+}
+
+bool cImageCache::LoadSeparatorLogo(string name) {
+ string separatorPath = *cString::sprintf("%sseparatorlogos/", logoPath.c_str());
+ string nameLower = StrToLowerCase(name.c_str());
+ if (FileExists(separatorPath, nameLower.c_str(), "svg"))
+ return LoadImage(separatorPath, nameLower.c_str(), "svg");
+ else
+ return LoadImage(separatorPath, nameLower.c_str(), "png");
+}
+
+bool cImageCache::LoadSkinpart(string name) {
+ if (FileExists(skinPartsPathTheme.c_str(), name, "svg"))
+ return LoadImage(skinPartsPathTheme.c_str(), name, "svg");
+
+ else if (FileExists(skinPartsPathTheme.c_str(), name, "png"))
+ return LoadImage(skinPartsPathTheme.c_str(), name, "png");
+
+ else if (FileExists(skinPartsPathSkin.c_str(), name, "svg"))
+ return LoadImage(skinPartsPathSkin.c_str(), name, "svg");
+
+ else
+ return LoadImage(skinPartsPathSkin.c_str(), name, "png");
+}
+
+void cImageCache::Clear(void) {
+ for(map<string, cImage*>::const_iterator it = iconCache.begin(); it != iconCache.end(); it++) {
+ cImage *img = (cImage*)it->second;
+ delete img;
+ }
+ iconCache.clear();
+
+ for(map<string, cImage*>::const_iterator it = channelLogoCache.begin(); it != channelLogoCache.end(); it++) {
+ cImage *img = (cImage*)it->second;
+ delete img;
+ }
+ channelLogoCache.clear();
+
+ for(map<std::string, cImage*>::const_iterator it = skinPartsCache.begin(); it != skinPartsCache.end(); it++) {
+ cImage *img = (cImage*)it->second;
+ delete img;
+ }
+ skinPartsCache.clear();
+}
+
+void cImageCache::Debug(bool full) {
+ int sizeIconCache = 0;
+ int numIcons = 0;
+ GetIconCacheSize(numIcons, sizeIconCache);
+ dsyslog("skindesigner: cached %d icons - size %d byte", numIcons, sizeIconCache);
+ if (full) {
+ for(std::map<std::string, cImage*>::const_iterator it = iconCache.begin(); it != iconCache.end(); it++) {
+ string name = it->first;
+ dsyslog("skindesigner: cached icon %s", name.c_str());
+ }
+ }
+
+ int sizeLogoCache = 0;
+ int numLogos = 0;
+ GetLogoCacheSize(numLogos, sizeLogoCache);
+ dsyslog("skindesigner: cached %d logos - size %d byte", numLogos, sizeLogoCache);
+ if (full) {
+ for(std::map<std::string, cImage*>::const_iterator it = channelLogoCache.begin(); it != channelLogoCache.end(); it++) {
+ string name = it->first;
+ dsyslog("skindesigner: cached logo %s", name.c_str());
+ }
+ }
+
+ int sizeSkinpartCache = 0;
+ int numSkinparts = 0;
+ GetSkinpartsCacheSize(numSkinparts, sizeSkinpartCache);
+ dsyslog("skindesigner: cached %d skinparts - size %d byte", numSkinparts, sizeSkinpartCache);
+ if (full) {
+ for(std::map<std::string, cImage*>::const_iterator it = skinPartsCache.begin(); it != skinPartsCache.end(); it++) {
+ string name = it->first;
+ dsyslog("skindesigner: cached skinpart %s", name.c_str());
+ }
+ }
+}
+
+void cImageCache::GetIconCacheSize(int &num, int &size) {
+ num = iconCache.size();
+ for (map<string, cImage*>::iterator icon = iconCache.begin(); icon != iconCache.end(); icon++) {
+ cImage* img = icon->second;
+ size += img->Width() * img->Height() * sizeof(tColor);
+ }
+}
+
+void cImageCache::GetLogoCacheSize(int &num, int &size) {
+ num = channelLogoCache.size();
+ for (map<string, cImage*>::iterator logo = channelLogoCache.begin(); logo != channelLogoCache.end(); logo++) {
+ cImage* img = logo->second;
+ size += img->Width() * img->Height() * sizeof(tColor);
+ }
+}
+
+void cImageCache::GetSkinpartsCacheSize(int &num, int &size) {
+ num = skinPartsCache.size();
+ for (map<string, cImage*>::iterator skinpart = skinPartsCache.begin(); skinpart != skinPartsCache.end(); skinpart++) {
+ cImage* img = skinpart->second;
+ size += img->Width() * img->Height() * sizeof(tColor);
+ }
+}
diff --git a/libcore/imagecache.h b/libcore/imagecache.h
new file mode 100644
index 0000000..086d8e4
--- /dev/null
+++ b/libcore/imagecache.h
@@ -0,0 +1,57 @@
+#ifndef __NOPACITY_IMAGECACHE_H
+#define __NOPACITY_IMAGECACHE_H
+
+#define X_DISPLAY_MISSING
+
+#include <vdr/osd.h>
+#include <vdr/skins.h>
+#include <vector>
+#include "imageloader.h"
+#include "../libtemplate/templatefunction.h"
+
+class cImageCache : public cImageLoader {
+public:
+ cImageCache();
+ ~cImageCache();
+ void Lock(void) { mutex.Lock(); }
+ void Unlock(void) { mutex.Unlock(); }
+ void SetPathes(void);
+ //channel logos
+ void CacheLogo(int width, int height);
+ cImage *GetLogo(string channelID, int width, int height);
+ bool LogoExists(string channelID);
+ cImage *GetSeparatorLogo(string name, int width, int height);
+ bool SeparatorLogoExists(string name);
+ //icons
+ void CacheIcon(eImageType type, string path, int width, int height);
+ cImage *GetIcon(eImageType type, string name, int width, int height);
+ string GetIconName(string label, eMenuCategory cat = mcUndefined);
+ bool MenuIconExists(string name);
+ //skinparts
+ void CacheSkinpart(string path, int width, int height);
+ cImage *GetSkinpart(string name, int width, int height);
+ //helpers
+ void Clear(void);
+ void Debug(bool full);
+ void GetIconCacheSize(int &num, int &size);
+ void GetLogoCacheSize(int &num, int &size);
+ void GetSkinpartsCacheSize(int &num, int &size);
+private:
+ static cMutex mutex;
+ static string items[16];
+ cImage *tempStaticLogo;
+ string logoPath;
+ string iconPathSkin;
+ string skinPartsPathSkin;
+ string iconPathTheme;
+ string skinPartsPathTheme;
+ map<string, cImage*> iconCache;
+ map<string, cImage*> channelLogoCache;
+ map<string, cImage*> skinPartsCache;
+ bool LoadIcon(eImageType type, string name);
+ bool LoadLogo(const cChannel *channel);
+ bool LoadSeparatorLogo(string name);
+ bool LoadSkinpart(string name);
+};
+
+#endif //__NOPACITY_IMAGECACHE_H
diff --git a/libcore/imageloader.c b/libcore/imageloader.c
new file mode 100644
index 0000000..9b2a5b7
--- /dev/null
+++ b/libcore/imageloader.c
@@ -0,0 +1,368 @@
+#include "../config.h"
+#include "helpers.h"
+#include "imageloader.h"
+#include <string>
+#include <dirent.h>
+#include <iostream>
+
+cImageLoader::cImageLoader() {
+ importer = NULL;
+}
+
+cImageLoader::~cImageLoader() {
+ delete(importer);
+}
+
+cImage *cImageLoader::CreateImage(int width, int height, bool preserveAspect) {
+ if (!importer)
+ return NULL;
+ int w, h;
+ importer->GetImageSize(w, h);
+ if (width == 0)
+ width = w;
+ if (height == 0)
+ height = h;
+
+ cairo_surface_t *surface;
+ surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
+
+ cairo_t *cr;
+ cr = cairo_create(surface);
+
+ double sx = width / (double)w;
+ double sy = height / (double)h;
+ if (preserveAspect) {
+ double tx = 0;
+ double ty = 0;
+ if (sx < sy) {
+ sy = sx;
+ ty = (height - h * sy) / 2;
+ }
+ if (sy < sx) {
+ sx = sy;
+ tx = (width - w * sx) / 2;
+ }
+ cairo_translate(cr, tx, ty);
+ }
+ cairo_scale(cr, sx, sy);
+
+ importer->DrawToCairo(cr);
+
+ cairo_status_t status = cairo_status(cr);
+ if (status && config.debugImageLoading)
+ dsyslog("skindesigner: Cairo CreateImage Error %s", cairo_status_to_string(status));
+
+ unsigned char *data = cairo_image_surface_get_data(surface);
+ cImage *image = new cImage(cSize(width, height), (tColor*)data);
+
+ cairo_destroy(cr);
+ cairo_surface_destroy(surface);
+
+ return image;
+}
+
+bool cImageLoader::LoadImage(const char *fullpath) {
+ if ((fullpath == NULL) || (strlen(fullpath) < 5))
+ return false;
+
+ if (config.debugImageLoading)
+ dsyslog("skindesigner: trying to load: %s", fullpath);
+
+ delete(importer);
+ importer = NULL;
+
+ if (endswith(fullpath, ".png"))
+ importer = new cImageImporterPNG;
+ else if (endswith(fullpath, ".svg"))
+ importer = new cImageImporterSVG;
+ else if (endswith(fullpath, ".jpg"))
+ importer = new cImageImporterJPG;
+ else
+ return false;
+
+ return importer->LoadImage(fullpath);
+}
+
+// Just a different way to call LoadImage. Calls the above one.
+bool cImageLoader::LoadImage(std::string Path, std::string FileName, std::string Extension) {
+ std::stringstream sstrImgFile;
+ sstrImgFile << Path << FileName << "." << Extension;
+ std::string imgFile = sstrImgFile.str();
+ return LoadImage(imgFile.c_str());
+}
+
+//
+// Image importer for PNG
+//
+
+cImageImporterPNG::cImageImporterPNG() {
+ surface = NULL;
+}
+
+cImageImporterPNG::~cImageImporterPNG() {
+ if (surface)
+ cairo_surface_destroy(surface);
+}
+
+bool cImageImporterPNG::LoadImage(const char *path) {
+ if (surface)
+ cairo_surface_destroy(surface);
+
+ surface = cairo_image_surface_create_from_png(path);
+
+ if (cairo_surface_status(surface)) {
+ if (config.debugImageLoading)
+ dsyslog("skindesigner: Cairo LoadImage Error: %s", cairo_status_to_string(cairo_surface_status(surface)));
+ surface = NULL;
+ return false;
+ }
+
+ return true;
+}
+
+void cImageImporterPNG::DrawToCairo(cairo_t *cr) {
+ if (surface) {
+ cairo_set_source_surface(cr, surface, 0, 0);
+ cairo_paint(cr);
+ }
+}
+
+void cImageImporterPNG::GetImageSize(int &width, int &height) {
+ if (surface) {
+ width = cairo_image_surface_get_width(surface);
+ height = cairo_image_surface_get_height(surface);
+ }
+}
+
+//
+// Image importer for SVG
+//
+
+cImageImporterSVG::cImageImporterSVG() {
+ handle = NULL;
+}
+
+cImageImporterSVG::~cImageImporterSVG() {
+ if (handle) {
+ rsvg_handle_close(handle, NULL);
+ g_object_unref(handle);
+ }
+}
+
+bool cImageImporterSVG::LoadImage(const char *path) {
+ if (handle) {
+ rsvg_handle_close(handle, NULL);
+ g_object_unref(handle);
+ }
+
+ GError *error = NULL;
+ handle = rsvg_handle_new_from_file(path, &error);
+ if (!handle) {
+ if (config.debugImageLoading && error) {
+ dsyslog("skindesigner: RSVG Error: %s", error->message);
+ }
+ return false;
+ }
+
+ // 90 dpi is the hardcoded default setting of the Inkscape SVG editor
+ rsvg_handle_set_dpi(handle, 90);
+
+ return true;
+}
+
+void cImageImporterSVG::DrawToCairo(cairo_t *cr) {
+ if (handle)
+ rsvg_handle_render_cairo(handle, cr);
+}
+
+void cImageImporterSVG::GetImageSize(int &width, int &height) {
+ if (handle) {
+ RsvgDimensionData dim;
+ rsvg_handle_get_dimensions(handle, &dim);
+ width = dim.width;
+ height = dim.height;
+ }
+}
+
+void cImageImporterSVG::InitLibRSVG() {
+ #if !GLIB_CHECK_VERSION(2, 35, 0)
+ g_type_init();
+ #endif
+}
+
+//
+// Image importer for JPG
+//
+
+struct my_error_mgr {
+ struct jpeg_error_mgr pub; // "public" fields
+ jmp_buf setjmp_buffer; // for return to caller
+};
+
+METHODDEF(void)
+my_error_exit(j_common_ptr cinfo) {
+ // cinfo->err really points to a my_error_mgr struct, so coerce pointer
+ my_error_mgr *myerr = (my_error_mgr*) cinfo->err;
+
+ // Always display the message.
+ (*cinfo->err->output_message) (cinfo);
+
+ // Return control to the setjmp point
+ longjmp(myerr->setjmp_buffer, 1);
+}
+
+METHODDEF(void)
+my_output_message(j_common_ptr cinfo) {
+ char buf[JMSG_LENGTH_MAX];
+ cinfo->err->format_message(cinfo, buf);
+ if (config.debugImageLoading)
+ dsyslog("skindesigner: libjpeg error: %s", buf);
+}
+
+cImageImporterJPG::cImageImporterJPG() {
+ cinfo = NULL;
+}
+
+cImageImporterJPG::~cImageImporterJPG() {
+ if (cinfo) {
+ jpeg_destroy_decompress(cinfo);
+ free(cinfo);
+ fclose(infile);
+ }
+}
+
+bool cImageImporterJPG::LoadImage(const char *path) {
+ if (cinfo) {
+ jpeg_destroy_decompress(cinfo);
+ free(cinfo);
+ fclose(infile);
+ cinfo = NULL;
+ }
+
+ // Open input file
+ if ((infile = fopen(path, "rb")) == NULL) {
+ if (config.debugImageLoading)
+ dsyslog("skindesigner: Can't open %s", path);
+ return false;
+ }
+
+ // Allocate space for our decompress struct
+ cinfo = (j_decompress_ptr)malloc(sizeof(struct jpeg_decompress_struct));
+
+ // We set up the normal JPEG error routines, then override error_exit
+ // and output_message.
+ struct my_error_mgr jerr;
+ cinfo->err = jpeg_std_error(&jerr.pub);
+ jerr.pub.error_exit = my_error_exit;
+ jerr.pub.output_message = my_output_message;
+ // Establish the setjmp return context for my_error_exit to use.
+ if (setjmp(jerr.setjmp_buffer)) {
+ // If we get here, the JPEG code has signaled an error.
+ jpeg_destroy_decompress(cinfo);
+ free(cinfo);
+ fclose(infile);
+ cinfo = NULL;
+ return false;
+ }
+
+ // Now we can initialize the JPEG decompression object.
+ jpeg_create_decompress(cinfo);
+
+ // Step 2: specify data source (eg, a file)
+ jpeg_stdio_src(cinfo, infile);
+
+ // Step 3: read file parameters with jpeg_read_header()
+ (void) jpeg_read_header(cinfo, TRUE);
+ return true;
+}
+
+void cImageImporterJPG::DrawToCairo(cairo_t *cr) {
+ if (!cinfo)
+ return;
+
+ unsigned char *bmp_buffer = NULL;
+
+ // Re-establish error handling. We have to do this again as the saved
+ // calling environment of "LoadImage" is invalid if we reach here!
+ struct my_error_mgr jerr;
+ cinfo->err = jpeg_std_error(&jerr.pub);
+ jerr.pub.error_exit = my_error_exit;
+ jerr.pub.output_message = my_output_message;
+ if (setjmp(jerr.setjmp_buffer)) {
+ jpeg_destroy_decompress(cinfo);
+ free(cinfo);
+ fclose(infile);
+ free(bmp_buffer);
+ cinfo = NULL;
+ return;
+ }
+
+ // Step 4: set parameters for decompression
+ cinfo->out_color_space = JCS_RGB;
+
+ // Step 5: Start decompressor
+ (void) jpeg_start_decompress(cinfo);
+
+ // Allocate buffer. Directly allocate the space needed for ARGB
+ unsigned int width = cinfo->output_width;
+ unsigned int height = cinfo->output_height;
+ bmp_buffer = (unsigned char*)malloc(width * height * 4);
+
+ // Step 6: while (scan lines remain to be read)
+ int jpg_stride = width * cinfo->output_components;
+ while (cinfo->output_scanline < height) {
+ unsigned char *buffer_array[1];
+ buffer_array[0] = bmp_buffer + (cinfo->output_scanline) * jpg_stride;
+ jpeg_read_scanlines(cinfo, buffer_array, 1);
+ }
+
+ // Step 7: Finish decompression.
+ (void)jpeg_finish_decompress(cinfo);
+
+ // Cleanup. In this "ImageImporter" we clean up everything in "DrawToCairo"
+ // as I'm not really sure whether we are able to draw a second time.
+ fclose(infile);
+ jpeg_destroy_decompress(cinfo);
+ free(cinfo);
+ cinfo = NULL;
+
+ // --> At this point we have raw RGB data in bmp_buffer
+
+ // Do some ugly byte shifting.
+ // Byte order in libjpeg: RGB
+ // Byte order in cairo and VDR: BGRA
+ unsigned char temp[3];
+ for (int index = (width * height) - 1; index >= 0; index--) {
+ unsigned char *target = bmp_buffer + (index * 4);
+ unsigned char *source = bmp_buffer + (index * 3);
+ memcpy(&temp[0], source + 2, 1);
+ memcpy(&temp[1], source + 1, 1);
+ memcpy(&temp[2], source, 1);
+ memcpy(target, &temp, 3);
+ }
+
+ // Create new Cairo surface from our raw image data
+ cairo_surface_t *surface;
+ surface = cairo_image_surface_create_for_data(bmp_buffer,
+ CAIRO_FORMAT_RGB24,
+ width,
+ height,
+ width * 4);
+
+ // Draw surface to Cairo
+ if (surface) {
+ cairo_set_source_surface(cr, surface, 0, 0);
+ cairo_paint(cr);
+ cairo_surface_destroy(surface);
+ }
+
+ // Free our memory
+ free(bmp_buffer);
+}
+
+void cImageImporterJPG::GetImageSize(int &width, int &height) {
+ if (cinfo) {
+ width = cinfo->image_width;
+ height = cinfo->image_height;
+ }
+}
diff --git a/libcore/imageloader.h b/libcore/imageloader.h
new file mode 100644
index 0000000..6a83dec
--- /dev/null
+++ b/libcore/imageloader.h
@@ -0,0 +1,87 @@
+#ifndef __NOPACITY_IMAGELOADER_H
+#define __NOPACITY_IMAGELOADER_H
+
+#include <cairo.h>
+#include <librsvg/rsvg.h>
+#ifndef LIBRSVG_CHECK_VERSION // Workaround for librsvg < 2.36.2
+ #include <librsvg/rsvg-cairo.h>
+ #include <librsvg/librsvg-features.h>
+#endif
+#include <jpeglib.h>
+#include <setjmp.h>
+#include <vdr/osd.h>
+#include <vdr/tools.h>
+
+//
+// Image importers
+//
+class cImageImporter {
+public:
+ cImageImporter() {};
+ virtual ~cImageImporter() {};
+ virtual bool LoadImage(const char *path) { return false; };
+ virtual void DrawToCairo(cairo_t *cr) {};
+ virtual void GetImageSize(int &width, int &height) {};
+};
+
+// Image importer for PNG
+class cImageImporterPNG : public cImageImporter {
+public:
+ cImageImporterPNG();
+ ~cImageImporterPNG();
+ bool LoadImage(const char *path);
+ void DrawToCairo(cairo_t *cr);
+ void GetImageSize(int &width, int &height);
+private:
+ cairo_surface_t *surface;
+};
+
+// Image importer for SVG
+#if !LIBRSVG_CHECK_VERSION(2, 36, 0)
+ #error librsvg version 2.36.0 or above required!
+#endif
+
+class cImageImporterSVG : public cImageImporter {
+public:
+ cImageImporterSVG();
+ ~cImageImporterSVG();
+ bool LoadImage(const char *path);
+ void DrawToCairo(cairo_t *cr);
+ void GetImageSize(int &width, int &height);
+ static void InitLibRSVG();
+private:
+ RsvgHandle *handle;
+};
+
+// Image importer for JPG
+#if BITS_IN_JSAMPLE != 8
+ #error libjpeg has to be compiled with 8-bit samples!
+#endif
+
+class cImageImporterJPG : public cImageImporter {
+public:
+ cImageImporterJPG();
+ ~cImageImporterJPG();
+ bool LoadImage(const char *path);
+ void DrawToCairo(cairo_t *cr);
+ void GetImageSize(int &width, int &height);
+private:
+ j_decompress_ptr cinfo;
+ FILE *infile;
+};
+
+//
+// Image loader class
+//
+class cImageLoader {
+private:
+ cImageImporter *importer;
+public:
+ cImageLoader();
+ virtual ~cImageLoader();
+ cImage *CreateImage(int width, int height, bool preserveAspect = true);
+ bool LoadImage(std::string Path, std::string FileName, std::string Extension);
+ bool LoadImage(const char *fullpath);
+};
+
+#endif //__NOPACITY_IMAGELOADER_H
diff --git a/libcore/pixmapcontainer.c b/libcore/pixmapcontainer.c
new file mode 100644
index 0000000..69a47ca
--- /dev/null
+++ b/libcore/pixmapcontainer.c
@@ -0,0 +1,487 @@
+#define __STL_CONFIG_H
+#include "pixmapcontainer.h"
+#include "../config.h"
+
+cMutex cPixmapContainer::mutex;
+cOsd *cPixmapContainer::osd = NULL;
+eFlushState cPixmapContainer::flushState = fsOpen;
+
+cPixmapContainer::cPixmapContainer(int numPixmaps) {
+ this->numPixmaps = numPixmaps;
+ pixContainerInit = true;
+ mutex.Lock();
+ pixmaps = new cPixmap*[numPixmaps];
+ pixmapsTransparency = new int[numPixmaps];
+ for(int i=0; i < numPixmaps; i++) {
+ pixmaps[i] = NULL;
+ pixmapsTransparency[i] = 0;
+ }
+ mutex.Unlock();
+ checkRunning = false;
+ fadeTime = 0;
+ deleteOsdOnExit = false;
+}
+
+cPixmapContainer::~cPixmapContainer(void) {
+ for (int i=0; i < numPixmaps; i++) {
+ mutex.Lock();
+ if (pixmaps[i] && osd) {
+ osd->DestroyPixmap(pixmaps[i]);
+ pixmaps[i] = NULL;
+ }
+ mutex.Unlock();
+ }
+ delete[] pixmaps;
+ delete[] pixmapsTransparency;
+ if (deleteOsdOnExit && osd) {
+ mutex.Lock();
+ delete osd;
+ osd = NULL;
+ mutex.Unlock();
+ }
+ flushState = fsOpen;
+}
+
+bool cPixmapContainer::CreateOsd(int Left, int Top, int Width, int Height) {
+ if (osd) {
+ return false;
+ }
+ cOsd *newOsd = cOsdProvider::NewOsd(Left, Top);
+ if (newOsd) {
+ tArea Area = { 0, 0, Width, Height, 32 };
+ if (newOsd->SetAreas(&Area, 1) == oeOk) {
+ osd = newOsd;
+ return true;
+ }
+ }
+ return false;
+}
+
+void cPixmapContainer::LockFlush(void) {
+ flushState = fsLock;
+}
+
+void cPixmapContainer::OpenFlush(void) {
+ flushState = fsOpen;
+}
+
+bool cPixmapContainer::PixmapExists(int num) {
+ cMutexLock MutexLock(&mutex);
+ if (pixmaps[num])
+ return true;
+ return false;
+}
+
+void cPixmapContainer::DoFlush(void) {
+ cMutexLock MutexLock(&mutex);
+ if (!osd || (checkRunning && !Running()))
+ return;
+ if (flushState == fsOpen) {
+ osd->Flush();
+ }
+}
+
+void cPixmapContainer::CreatePixmap(int num, int Layer, const cRect &ViewPort, const cRect &DrawPort) {
+ cMutexLock MutexLock(&mutex);
+ if (!osd || (checkRunning && !Running()))
+ return;
+ pixmaps[num] = osd->CreatePixmap(Layer, ViewPort, DrawPort);
+ pixmaps[num]->Fill(clrTransparent);
+ if (pixContainerInit && fadeTime) {
+ pixmaps[num]->SetAlpha(0);
+ } else if (pixmapsTransparency[num] > 0) {
+ int alpha = (100 - pixmapsTransparency[num])*255/100;
+ pixmaps[num]->SetAlpha(alpha);
+ }
+}
+
+bool cPixmapContainer::DestroyPixmap(int num) {
+ cMutexLock MutexLock(&mutex);
+ if (pixmaps[num] && osd) {
+ osd->DestroyPixmap(pixmaps[num]);
+ pixmaps[num] = NULL;
+ return true;
+ }
+ return false;
+}
+
+void cPixmapContainer::DrawText(int num, const cPoint &Point, const char *s, tColor ColorFg, tColor ColorBg, std::string fontName, int fontSize) {
+ if (checkRunning && !Running())
+ return;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return;
+ fontManager->Lock();
+ cFont *font = fontManager->Font(fontName, fontSize);
+ if (font)
+ pixmaps[num]->DrawText(Point, s, ColorFg, ColorBg, font);
+ fontManager->Unlock();
+}
+
+
+void cPixmapContainer::DrawRectangle(int num, const cRect &Rect, tColor Color) {
+ if (checkRunning && !Running())
+ return;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return;
+ pixmaps[num]->DrawRectangle(Rect, Color);
+}
+
+void cPixmapContainer::DrawEllipse(int num, const cRect &Rect, tColor Color, int Quadrants) {
+ if (checkRunning && !Running())
+ return;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return;
+ pixmaps[num]->DrawEllipse(Rect, Color, Quadrants);
+}
+
+void cPixmapContainer::DrawSlope(int num, const cRect &Rect, tColor Color, int Type) {
+ if (checkRunning && !Running())
+ return;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return;
+ pixmaps[num]->DrawSlope(Rect, Color, Type);
+}
+
+void cPixmapContainer::DrawImage(int num, const cPoint &Point, const cImage &Image) {
+ if (checkRunning && !Running())
+ return;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return;
+ pixmaps[num]->DrawImage(Point, Image);
+}
+
+void cPixmapContainer::DrawBitmap(int num, const cPoint &Point, const cBitmap &Bitmap, tColor ColorFg, tColor ColorBg, bool Overlay) {
+ if (checkRunning && !Running())
+ return;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return;
+ pixmaps[num]->DrawBitmap(Point, Bitmap, ColorFg, ColorBg, Overlay);
+}
+
+void cPixmapContainer::Fill(int num, tColor Color) {
+ if (checkRunning && !Running())
+ return;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return;
+ pixmaps[num]->Fill(Color);
+}
+
+void cPixmapContainer::SetAlpha(int num, int Alpha) {
+ if (checkRunning && !Running())
+ return;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return;
+ pixmaps[num]->SetAlpha(Alpha);
+}
+
+void cPixmapContainer::SetTransparency(int num, int Transparency) {
+ if (Transparency < 0 && Transparency > 100)
+ return;
+ pixmapsTransparency[num] = Transparency;
+}
+
+void cPixmapContainer::SetLayer(int num, int Layer) {
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return;
+ pixmaps[num]->SetLayer(Layer);
+}
+
+int cPixmapContainer::Width(int num) {
+ if (checkRunning && !Running())
+ return 0;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return 0;
+ int width = pixmaps[num]->ViewPort().Width();
+ return width;
+}
+
+int cPixmapContainer::Height(int num) {
+ if (checkRunning && !Running())
+ return 0;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return 0;
+ int height = pixmaps[num]->ViewPort().Height();
+ return height;
+}
+
+int cPixmapContainer::DrawportWidth(int num) {
+ if (checkRunning && !Running())
+ return 0;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return 0;
+ int width = pixmaps[num]->DrawPort().Width();
+ return width;
+}
+
+int cPixmapContainer::DrawportHeight(int num) {
+ if (checkRunning && !Running())
+ return 0;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return 0;
+ int height = pixmaps[num]->DrawPort().Height();
+ return height;
+}
+
+int cPixmapContainer::DrawportX(int num) {
+ if (checkRunning && !Running())
+ return 0;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return 0;
+ int x = pixmaps[num]->DrawPort().X();
+ return x;
+}
+
+int cPixmapContainer::DrawportY(int num) {
+ if (checkRunning && !Running())
+ return 0;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return 0;
+ int y = pixmaps[num]->DrawPort().Y();
+ return y;
+}
+
+void cPixmapContainer::SetDrawPortPoint(int num, const cPoint &Point) {
+ if (checkRunning && !Running())
+ return;
+ cMutexLock MutexLock(&mutex);
+ if (!pixmaps[num])
+ return;
+ pixmaps[num]->SetDrawPortPoint(Point);
+}
+
+/***************************************************************************
+* HELPERS -- do not access the pixmaps array directly, use wrapper functions
+* to ensure that a proper lock is set before accessing pixmaps
+****************************************************************************/
+
+void cPixmapContainer::FadeIn(void) {
+ if (!fadeTime)
+ return;
+ uint64_t Start = cTimeMs::Now();
+ int FadeFrameTime = fadeTime / 10;
+ while (Running()) {
+ uint64_t Now = cTimeMs::Now();
+ double t = min(double(Now - Start) / fadeTime, 1.0);
+ int Alpha = t * ALPHA_OPAQUE;
+ for (int i = 0; i < numPixmaps; i++) {
+ if (!PixmapExists(i))
+ continue;
+ if (pixmapsTransparency[i] > 0) {
+ int alpha = (100 - pixmapsTransparency[i])*Alpha/100;
+ SetAlpha(i, alpha);
+ } else {
+ SetAlpha(i, Alpha);
+ }
+ }
+ DoFlush();
+ int Delta = cTimeMs::Now() - Now;
+ if (Running() && (Delta < FadeFrameTime))
+ cCondWait::SleepMs(FadeFrameTime - Delta);
+ if ((int)(Now - Start) > fadeTime)
+ break;
+ }
+}
+
+void cPixmapContainer::FadeOut(void) {
+ if (!fadeTime)
+ return;
+ uint64_t Start = cTimeMs::Now();
+ int FadeFrameTime = fadeTime / 10;
+ while (true) {
+ uint64_t Now = cTimeMs::Now();
+ double t = min(double(Now - Start) / fadeTime, 1.0);
+ int Alpha = (1 - t) * ALPHA_OPAQUE;
+ for (int i = 0; i < numPixmaps; i++) {
+ if (!PixmapExists(i))
+ continue;
+ if (pixmapsTransparency[i] > 0) {
+ int alpha = (100 - pixmapsTransparency[i])*Alpha/100;
+ SetAlpha(i, alpha);
+ } else {
+ SetAlpha(i, Alpha);
+ }
+ }
+ DoFlush();
+ int Delta = cTimeMs::Now() - Now;
+ if (Running() && (Delta < FadeFrameTime))
+ cCondWait::SleepMs(FadeFrameTime - Delta);
+ if ((int)(Now - Start) > fadeTime)
+ break;
+ }
+}
+
+/*****************************************
+* scrollSpeed: 1 slow
+* 2 medium
+* 3 fast
+******************************************/
+void cPixmapContainer::ScrollHorizontal(int num, int scrollDelay, int scrollSpeed, int scrollMode) {
+ bool carriageReturn = (scrollMode == 1) ? true : false;
+
+ int scrollDelta = 1;
+ int drawPortX;
+
+ int FrameTime = 0;
+ if (scrollSpeed == 1)
+ FrameTime = 50;
+ else if (scrollSpeed == 2)
+ FrameTime = 30;
+ else
+ FrameTime = 15;
+ if (!Running())
+ return;
+ int maxX = DrawportWidth(num) - Width(num);
+ bool doSleep = false;
+ while (Running()) {
+ if (doSleep) {
+ DoSleep(scrollDelay);
+ doSleep = false;
+ }
+ if (!Running())
+ return;
+ uint64_t Now = cTimeMs::Now();
+ drawPortX = DrawportX(num);
+ drawPortX -= scrollDelta;
+
+ if (abs(drawPortX) > maxX) {
+ DoSleep(scrollDelay);
+ if (carriageReturn)
+ drawPortX = 0;
+ else {
+ scrollDelta *= -1;
+ drawPortX -= scrollDelta;
+ }
+ doSleep = true;
+ }
+ if (!carriageReturn && (drawPortX == 0)) {
+ scrollDelta *= -1;
+ doSleep = true;
+ }
+ SetDrawPortPoint(num, cPoint(drawPortX, 0));
+ int Delta = cTimeMs::Now() - Now;
+ DoFlush();
+ if (Running() && (Delta < FrameTime))
+ cCondWait::SleepMs(FrameTime - Delta);
+ }
+}
+
+/*****************************************
+* scrollSpeed: 1 slow
+* 2 medium
+* 3 fast
+******************************************/
+void cPixmapContainer::ScrollVertical(int num, int scrollDelay, int scrollSpeed) {
+ if (!scrollSpeed)
+ return;
+ DoSleep(scrollDelay);
+ int drawPortY;
+ int FrameTime = 0;
+ if (scrollSpeed == 1)
+ FrameTime = 50;
+ else if (scrollSpeed == 2)
+ FrameTime = 30;
+ else
+ FrameTime = 15;
+ int maxY = DrawportHeight(num) - Height(num);
+ bool doSleep = false;
+ while (Running()) {
+ if (doSleep) {
+ doSleep = false;
+ DoSleep(scrollDelay);
+ }
+ uint64_t Now = cTimeMs::Now();
+ drawPortY = DrawportY(num);
+ drawPortY -= 1;
+ if (abs(drawPortY) > maxY) {
+ doSleep = true;
+ DoSleep(scrollDelay);
+ drawPortY = 0;
+ }
+ SetDrawPortPoint(num, cPoint(0, drawPortY));
+ if (doSleep) {
+ DoSleep(scrollDelay);
+ }
+ int Delta = cTimeMs::Now() - Now;
+ DoFlush();
+ if (Running() && (Delta < FrameTime))
+ cCondWait::SleepMs(FrameTime - Delta);
+ }
+}
+
+void cPixmapContainer::CancelSave(void) {
+ Cancel(-1);
+ while (Active())
+ cCondWait::SleepMs(10);
+}
+
+void cPixmapContainer::DoSleep(int duration) {
+ int sleepSlice = 10;
+ for (int i = 0; Running() && (i*sleepSlice < duration); i++)
+ cCondWait::SleepMs(sleepSlice);
+}
+
+void cPixmapContainer::DrawBlendedBackground(int num, int xStart, int width, tColor color, tColor colorBlending, bool fromTop) {
+ int height = Height(num);
+ int numSteps = 16;
+ int alphaStep = 0x0F;
+ int alpha = 0x00;
+ int step, begin, end;
+ if (fromTop) {
+ step = 1;
+ begin = 0;
+ end = numSteps;
+ } else {
+ step = -1;
+ begin = height;
+ end = height - numSteps;
+ }
+ tColor clr;
+ bool cont = true;
+ for (int i = begin; cont; i = i + step) {
+ clr = AlphaBlend(color, colorBlending, alpha);
+ DrawRectangle(num, cRect(xStart,i,width,1), clr);
+ alpha += alphaStep;
+ if (i == end)
+ cont = false;
+ }
+}
+
+void cPixmapContainer::DrawRoundedCorners(int num, int radius, int x, int y, int width, int height) {
+ if (radius > 2) {
+ DrawEllipse(num, cRect(x, y, radius, radius), clrTransparent, -2);
+ DrawEllipse(num, cRect(x + width - radius, y , radius, radius), clrTransparent, -1);
+ DrawEllipse(num, cRect(x, y + height - radius, radius, radius), clrTransparent, -3);
+ DrawEllipse(num, cRect(x + width - radius, y + height - radius, radius, radius), clrTransparent, -4);
+ }
+}
+
+void cPixmapContainer::DrawRoundedCornersWithBorder(int num, tColor borderColor, int radius, int width, int height) {
+ if (radius < 3)
+ return;
+ DrawEllipse(num, cRect(0,0,radius,radius), borderColor, -2);
+ DrawEllipse(num, cRect(-1,-1,radius,radius), clrTransparent, -2);
+
+ DrawEllipse(num, cRect(width-radius,0,radius,radius), borderColor, -1);
+ DrawEllipse(num, cRect(width-radius+1,-1,radius,radius), clrTransparent, -1);
+
+ DrawEllipse(num, cRect(0,height-radius,radius,radius), borderColor, -3);
+ DrawEllipse(num, cRect(-1,height-radius+1,radius,radius), clrTransparent, -3);
+
+ DrawEllipse(num, cRect(width-radius,height-radius,radius,radius), borderColor, -4);
+ DrawEllipse(num, cRect(width-radius+1,height-radius+1,radius,radius), clrTransparent, -4);
+}
diff --git a/libcore/pixmapcontainer.h b/libcore/pixmapcontainer.h
new file mode 100644
index 0000000..3b3105a
--- /dev/null
+++ b/libcore/pixmapcontainer.h
@@ -0,0 +1,74 @@
+#ifndef __PIXMAP_CONTAINER_H
+#define __PIXMAP_CONTAINER_H
+
+#include <string>
+#include <vdr/plugin.h>
+#include "fontmanager.h"
+
+enum eFlushState {
+ fsOpen,
+ fsLock,
+ fsCount,
+};
+
+class cPixmapContainer : public cThread {
+private:
+ static cMutex mutex;
+ static cOsd *osd;
+ static eFlushState flushState;
+ bool pixContainerInit;
+ int numPixmaps;
+ cPixmap **pixmaps;
+ int *pixmapsTransparency;
+ bool checkRunning;
+ int fadeTime;
+ bool deleteOsdOnExit;
+protected:
+ void SetInitFinished(void) { pixContainerInit = false; };
+ bool CreateOsd(int Left, int Top, int Width, int Height);
+ void DeleteOsdOnExit(void) { deleteOsdOnExit = true; };
+ //Wrappers for access to pixmaps
+ bool PixmapExists(int num);
+ int NumPixmaps(void) { return numPixmaps; };
+ void CreatePixmap(int num, int Layer, const cRect &ViewPort, const cRect &DrawPort = cRect::Null);
+ bool DestroyPixmap(int num);
+ void DrawText(int num, const cPoint &Point, const char *s, tColor ColorFg, tColor ColorBg, std::string fontName, int fontSize);
+ void DrawRectangle(int num, const cRect &Rect, tColor Color);
+ void DrawEllipse(int num, const cRect &Rect, tColor Color, int Quadrants = 0);
+ void DrawSlope(int num, const cRect &Rect, tColor Color, int Type);
+ void DrawImage(int num, const cPoint &Point, const cImage &Image);
+ void DrawBitmap(int num, const cPoint &Point, const cBitmap &Bitmap, tColor ColorFg = 0, tColor ColorBg = 0, bool Overlay = false);
+ void Fill(int num, tColor Color);
+ void SetAlpha(int num, int Alpha);
+ void SetTransparency(int num, int Transparency);
+ void SetLayer(int num, int Layer);
+ int Width(int num);
+ int Height(int num);
+ int DrawportWidth(int num);
+ int DrawportHeight(int num);
+ int DrawportX(int num);
+ int DrawportY(int num);
+ void SetDrawPortPoint(int num, const cPoint &Point);
+ void SetCheckRunning(void) { checkRunning = true; };
+ void UnsetCheckRunning(void) { checkRunning = false; };
+ //HELPERS -- do not access the pixmaps array directly, use wrapper functions
+ void SetFadeTime(int fade) { fadeTime = fade; };
+ void FadeIn(void);
+ void FadeOut(void);
+ void ScrollVertical(int num, int scrollDelay, int scrollSpeed);
+ void ScrollHorizontal(int num, int scrollDelay, int scrollSpeed, int scrollMode);
+ void CancelSave(void);
+ void DoSleep(int duration);
+ void DrawBlendedBackground(int num, int xStart, int width, tColor color, tColor colorBlending, bool fromTop);
+ void DrawRoundedCorners(int num, int radius, int x, int y, int width, int height);
+ void DrawRoundedCornersWithBorder(int num, tColor borderColor, int radius, int width, int height);
+public:
+ cPixmapContainer(int numPixmaps);
+ virtual ~cPixmapContainer(void);
+ void LockFlush(void);
+ void OpenFlush(void);
+ void DoFlush(void);
+ virtual void Action(void) {};
+};
+
+#endif //__PIXMAP_CONTAINER_H
\ No newline at end of file
diff --git a/libcore/recfolderinfo.c b/libcore/recfolderinfo.c
new file mode 100644
index 0000000..d03ed6c
--- /dev/null
+++ b/libcore/recfolderinfo.c
@@ -0,0 +1,219 @@
+#include "recfolderinfo.h"
+
+
+class cFolderInfoInternList;
+
+class cRecordingsFolderInfo::cFolderInfoIntern:public cListObject {
+private:
+ cFolderInfoIntern *_parent;
+ cList<cFolderInfoIntern> *_subFolders;
+
+ cString _name;
+ time_t _latest;
+ int _count;
+ cString _latestFileName;
+
+ void UpdateData(cRecording *Recording);
+ cFolderInfoIntern *FindSubFolder(const char *Name) const;
+
+public:
+ cFolderInfoIntern(cFolderInfoIntern *Parent, const char *Name);
+ virtual ~cFolderInfoIntern(void);
+
+ // split Name and find folder-info in tree
+ // if "Add", missing folders are created
+ cFolderInfoIntern *Find(const char *Name, bool Add);
+
+ void Add(cRecording *Recording);
+
+ cRecordingsFolderInfo::cFolderInfo *GetInfo(void) const;
+
+ cString FullName(void) const;
+ cString ToText(void) const;
+ cString DebugOutput(void) const;
+};
+
+
+cRecordingsFolderInfo::cFolderInfo::cFolderInfo(const char *Name, const char *FullName, time_t Latest, int Count, const char *LatestFileName)
+{
+ this->Name = Name;
+ this->FullName = FullName;
+ this->Latest = Latest;
+ this->Count = Count;
+ this->LatestFileName= LatestFileName;
+}
+
+
+cRecordingsFolderInfo::cRecordingsFolderInfo(cRecordings &Recordings)
+:_recordings(Recordings)
+,_root(NULL)
+{
+ Rebuild();
+}
+
+cRecordingsFolderInfo::~cRecordingsFolderInfo(void)
+{
+ delete _root;
+ _root = NULL;
+}
+
+void cRecordingsFolderInfo::Rebuild(void)
+{
+ delete _root;
+ _root = new cFolderInfoIntern(NULL, "");
+
+ cThreadLock RecordingsLock(&_recordings);
+ // re-get state with lock held
+ _recordings.StateChanged(_recState);
+ cFolderInfoIntern *info;
+ cString folder;
+ for (cRecording *rec = _recordings.First(); rec; rec = _recordings.Next(rec)) {
+#if APIVERSNUM < 20102
+ //cRecording::Folder() first available since VDR 2.1.2
+ const char *recName = rec->Name();
+ if (const char *s = strrchr(recName, FOLDERDELIMCHAR)) {
+ folder = recName;
+ folder.Truncate(s - recName);
+ }
+ else
+ folder = "";
+#else
+ folder = rec->Folder();
+#endif
+ info = _root->Find(*folder, true);
+ info->Add(rec);
+ }
+}
+
+cRecordingsFolderInfo::cFolderInfo *cRecordingsFolderInfo::Get(const char *Folder)
+{
+ cMutexLock lock(&_rootLock);
+
+ if (_recordings.StateChanged(_recState) || (_root == NULL))
+ Rebuild();
+
+ cFolderInfoIntern *info = _root->Find(Folder, false);
+ if (info == NULL)
+ return NULL;
+
+ return info->GetInfo();
+}
+
+cString cRecordingsFolderInfo::DebugOutput(void) const
+{
+ cMutexLock lock(&_rootLock);
+
+ return _root->DebugOutput();
+}
+
+
+cRecordingsFolderInfo::cFolderInfoIntern::cFolderInfoIntern(cFolderInfoIntern *Parent, const char *Name)
+:_parent(Parent)
+,_name(Name)
+,_latest(0)
+,_count(0)
+,_latestFileName("")
+{
+ _subFolders = new cList<cFolderInfoIntern>();
+}
+
+cRecordingsFolderInfo::cFolderInfoIntern::~cFolderInfoIntern(void)
+{
+ delete _subFolders;
+ _subFolders = NULL;
+}
+
+cRecordingsFolderInfo::cFolderInfoIntern *cRecordingsFolderInfo::cFolderInfoIntern::Find(const char *Name, bool Add)
+{
+ cFolderInfoIntern *info = NULL;
+ if (Add)
+ info = this;
+
+ if (Name && *Name) {
+ static char delim[2] = { FOLDERDELIMCHAR, 0 };
+ char *strtok_next;
+ cFolderInfoIntern *next;
+ char *folder = strdup(Name);
+ info = this;
+ for (char *t = strtok_r(folder, delim, &strtok_next); t; t = strtok_r(NULL, delim, &strtok_next)) {
+ next = info->FindSubFolder(t);
+ if (next == NULL) {
+ if (!Add) {
+ info = NULL;
+ break;
+ }
+
+ next = new cFolderInfoIntern(info, t);
+ info->_subFolders->Add(next);
+ }
+ info = next;
+ }
+ free(folder);
+ }
+
+ return info;
+}
+
+void cRecordingsFolderInfo::cFolderInfoIntern::UpdateData(cRecording *Recording)
+{
+ // count every recording
+ _count++;
+
+ // update date if newer
+ time_t recdate = Recording->Start();
+ if (_latest < recdate) {
+ _latest = recdate;
+ _latestFileName = Recording->FileName();
+ }
+}
+
+cRecordingsFolderInfo::cFolderInfoIntern *cRecordingsFolderInfo::cFolderInfoIntern::FindSubFolder(const char *Name) const
+{
+ for (cRecordingsFolderInfo::cFolderInfoIntern *info = _subFolders->First(); info; info = _subFolders->Next(info)) {
+ if (strcmp(info->_name, Name) == 0)
+ return info;
+ }
+ return NULL;
+}
+
+void cRecordingsFolderInfo::cFolderInfoIntern::Add(cRecording *Recording)
+{
+ if (Recording == NULL)
+ return;
+
+ // update this and all parent folders
+ for (cFolderInfoIntern *p = this; p; p = p->_parent)
+ p->UpdateData(Recording);
+}
+
+cRecordingsFolderInfo::cFolderInfo *cRecordingsFolderInfo::cFolderInfoIntern::GetInfo(void) const
+{
+ return new cRecordingsFolderInfo::cFolderInfo(*_name, *FullName(), _latest, _count, *_latestFileName);
+}
+
+cString cRecordingsFolderInfo::cFolderInfoIntern::FullName(void) const
+{
+ static char delim[2] = { FOLDERDELIMCHAR, 0 };
+
+ cString name = _name;
+ for (cFolderInfoIntern *p = _parent; p; p = p->_parent) {
+ // don't add FOLDERDELIMCHAR at start of FullName
+ if (p->_parent == NULL)
+ break;
+ name = cString::sprintf("%s%s%s", *p->_name, delim, *name);
+ }
+ return name;
+}
+
+cString cRecordingsFolderInfo::cFolderInfoIntern::ToText(void) const
+{
+ return cString::sprintf("%s (%d recordings, latest: %s)\n", *FullName(), _count, *ShortDateString(_latest));
+}
+
+cString cRecordingsFolderInfo::cFolderInfoIntern::DebugOutput(void) const
+{
+ cString output = ToText();
+ for (cFolderInfoIntern *i = _subFolders->First(); i; i = _subFolders->Next(i))
+ output = cString::sprintf("%s%s", *output, *i->DebugOutput());
+ return output;
+}
\ No newline at end of file
diff --git a/libcore/recfolderinfo.h b/libcore/recfolderinfo.h
new file mode 100644
index 0000000..8148ea7
--- /dev/null
+++ b/libcore/recfolderinfo.h
@@ -0,0 +1,43 @@
+#ifndef __RECFOLDERINFO_H
+#define __RECFOLDERINFO_H
+
+#include <vdr/recording.h>
+
+
+class cRecordingsFolderInfo {
+public:
+ class cFolderInfoIntern;
+
+private:
+ cRecordings &_recordings;
+ int _recState;
+ cFolderInfoIntern *_root;
+ mutable cMutex _rootLock;
+
+ void Rebuild(void);
+
+public:
+ class cFolderInfo {
+ public:
+ cString Name;
+ cString FullName;
+ time_t Latest;
+ int Count;
+ cString LatestFileName;
+
+ cFolderInfo(const char *Name, const char *FullName, time_t Latest, int Count, const char *LatestFileName);
+ };
+
+ cRecordingsFolderInfo(cRecordings &Recordings);
+ ~cRecordingsFolderInfo(void);
+
+ // caller must delete the cInfo object!
+ // returns NULL if folder doesn't exists
+ // will rebuild tree if recordings' state has changed
+ // is thread-safe
+ cFolderInfo *Get(const char *Folder);
+
+ cString DebugOutput(void) const;
+};
+
+#endif // __RECFOLDERINFO_H
\ No newline at end of file
diff --git a/libcore/skinsetup.c b/libcore/skinsetup.c
new file mode 100644
index 0000000..88901c8
--- /dev/null
+++ b/libcore/skinsetup.c
@@ -0,0 +1,308 @@
+#include "skinsetup.h"
+#include "../config.h"
+#include "../libtemplate/xmlparser.h"
+
+// --- cSkinSetupParameter -----------------------------------------------------------
+
+cSkinSetupParameter::cSkinSetupParameter(void) {
+ type = sptUnknown;
+ name = "";
+ displayText = "";
+ min = 0;
+ max = 1000;
+ value = 0;
+}
+
+void cSkinSetupParameter::Debug(void) {
+ string sType = "unknown";
+ if (type == sptBool)
+ sType = "bool";
+ else if (type == sptInt)
+ sType = "int";
+ dsyslog("skindesigner: name \"%s\", type %s, displayText \"%s\", Value %d", name.c_str(), sType.c_str(), displayText.c_str(), value);
+ if (type == sptInt)
+ dsyslog("skindesigner: min %d, max %d", min, max);
+}
+
+// --- cSkinSetupMenu -----------------------------------------------------------
+cSkinSetupMenu::cSkinSetupMenu(void) {
+ name = "";
+ displayText = "";
+ parent = NULL;
+}
+
+cSkinSetupMenu::~cSkinSetupMenu(void) {
+ for (map < string, cSkinSetupParameter* >::iterator p = parameters.begin(); p != parameters.end(); p++) {
+ delete p->second;
+ }
+ for (vector < cSkinSetupMenu* >::iterator s = subMenus.begin(); s != subMenus.end(); s++) {
+ delete (*s);
+ }
+}
+
+cSkinSetupParameter *cSkinSetupMenu::GetNextParameter(bool deep) {
+ cSkinSetupParameter *param = NULL;
+ if (paramIt != parameters.end()) {
+ param = paramIt->second;
+ paramIt++;
+ return param;
+ }
+ if (!deep)
+ return NULL;
+
+ if (subMenuIt != subMenus.end()) {
+ param = (*subMenuIt)->GetNextParameter();
+ if (!param) {
+ subMenuIt++;
+ if (subMenuIt != subMenus.end()) {
+ (*subMenuIt)->InitIterators();
+ param = (*subMenuIt)->GetNextParameter();
+ }
+ }
+ }
+ return param;
+}
+
+cSkinSetupParameter *cSkinSetupMenu::GetParameter(string name) {
+ map < string, cSkinSetupParameter* >::iterator hit = parameters.find(name);
+ if (hit != parameters.end())
+ return hit->second;
+
+ cSkinSetupParameter *paramHit = NULL;
+ for (vector < cSkinSetupMenu* >::iterator subMenu = subMenus.begin(); subMenu != subMenus.end(); subMenu++) {
+ paramHit = (*subMenu)->GetParameter(name);
+ if (paramHit)
+ return paramHit;
+ }
+ return NULL;
+}
+
+void cSkinSetupMenu::InitIterators(void) {
+ paramIt = parameters.begin();
+ subMenuIt = subMenus.begin();
+ while (subMenuIt != subMenus.end()) {
+ (*subMenuIt)->InitIterators();
+ subMenuIt++;
+ }
+ subMenuIt = subMenus.begin();
+}
+
+void cSkinSetupMenu::SetParameter(eSetupParameterType paramType, xmlChar *name, xmlChar* displayText, xmlChar *min, xmlChar *max, xmlChar *value) {
+ cSkinSetupParameter *param = new cSkinSetupParameter();
+ param->type = paramType;
+ param->name = (const char*)name;
+ param->displayText = (const char*)displayText;
+
+ if (min && paramType == sptInt) {
+ param->min = atoi((const char*)min);
+ }
+ if (max && paramType == sptInt) {
+ param->max = atoi((const char*)max);
+ }
+ param->value = atoi((const char*)value);
+
+ parameters.insert(pair< string, cSkinSetupParameter* >(param->name, param));
+}
+
+cSkinSetupMenu *cSkinSetupMenu::GetMenu(string &name) {
+ for (vector<cSkinSetupMenu*>::iterator m = subMenus.begin(); m != subMenus.end(); m++) {
+ cSkinSetupMenu *menu = (*m);
+ if (!name.compare(menu->GetName()))
+ return menu;
+ menu = menu->GetMenu(name);
+ if (menu)
+ return menu;
+ }
+ return NULL;
+}
+
+cSkinSetupMenu *cSkinSetupMenu::GetNextSubMenu(bool deep) {
+ cSkinSetupMenu *menu = NULL;
+ if (subMenuIt != subMenus.end()) {
+ if (deep) {
+ menu = (*subMenuIt)->GetNextSubMenu(deep);
+ if (menu)
+ return menu;
+ }
+ menu = *subMenuIt;
+ subMenuIt++;
+ return menu;
+ }
+ return NULL;
+}
+
+
+void cSkinSetupMenu::Debug(bool deep) {
+ dsyslog("skindesigner: Menu %s Setup Parameters", name.c_str());
+ for (map < string, cSkinSetupParameter* >::iterator p = parameters.begin(); p != parameters.end(); p++) {
+ (p->second)->Debug();
+ }
+ if (subMenus.empty())
+ return;
+ for (vector < cSkinSetupMenu* >::iterator s = subMenus.begin(); s != subMenus.end(); s++) {
+ dsyslog("skindesigner: SubMenu %s, Parent %s", ((*s)->GetName()).c_str(), ((*s)->GetParent()->GetName()).c_str());
+ if (deep)
+ (*s)->Debug();
+ }
+}
+// --- cSkinSetup -----------------------------------------------------------
+
+cSkinSetup::cSkinSetup(string skin) {
+ this->skin = skin;
+ rootMenu = new cSkinSetupMenu();
+ rootMenu->SetName("root");
+ currentMenu = rootMenu;
+}
+
+cSkinSetup::~cSkinSetup() {
+ delete rootMenu;
+}
+
+bool cSkinSetup::ReadFromXML(void) {
+ string xmlPath = *cString::sprintf("%s%s/setup.xml", *config.skinPath, skin.c_str());
+ cXmlParser parser;
+ if (!parser.ReadSkinSetup(this, xmlPath)) {
+ return false;
+ }
+ parser.ParseSkinSetup(skin);
+ return true;
+}
+
+void cSkinSetup::SetSubMenu(xmlChar *name, xmlChar *displayText) {
+ cSkinSetupMenu *subMenu = new cSkinSetupMenu();
+ subMenu->SetName((const char*)name);
+ subMenu->SetDisplayText((const char*)displayText);
+ subMenu->SetParent(currentMenu);
+ currentMenu->AddSubMenu(subMenu);
+ currentMenu = subMenu;
+}
+
+void cSkinSetup::SubMenuDone(void) {
+ cSkinSetupMenu *parent = currentMenu->GetParent();
+ if (parent) {
+ currentMenu = parent;
+ }
+}
+
+void cSkinSetup::SetParameter(xmlChar *type, xmlChar *name, xmlChar* displayText, xmlChar *min, xmlChar *max, xmlChar *value) {
+ if (!type || !name || !displayText || !value) {
+ esyslog("skindesigner: invalid setup parameter for skin %s", skin.c_str());
+ return;
+ }
+ eSetupParameterType paramType = sptUnknown;
+ if (!xmlStrcmp(type, (const xmlChar *) "int")) {
+ paramType = sptInt;
+ } else if (!xmlStrcmp(type, (const xmlChar *) "bool")) {
+ paramType = sptBool;
+ }
+ if (paramType == sptUnknown) {
+ esyslog("skindesigner: invalid setup parameter for skin %s", skin.c_str());
+ return;
+ }
+ currentMenu->SetParameter(paramType, name, displayText, min, max, value);
+}
+
+cSkinSetupParameter *cSkinSetup::GetNextParameter(void) {
+ return rootMenu->GetNextParameter();
+}
+
+cSkinSetupParameter *cSkinSetup::GetParameter(string name) {
+ return rootMenu->GetParameter(name);
+}
+
+void cSkinSetup::SetTranslation(string translationToken, map < string, string > transl) {
+ translations.insert(pair<string, map < string, string > >(translationToken, transl));
+}
+
+void cSkinSetup::AddToGlobals(cGlobals *globals) {
+ if (!globals)
+ return;
+ rootMenu->InitIterators();
+ cSkinSetupParameter *param = NULL;
+ while (param = rootMenu->GetNextParameter()) {
+ globals->AddInt(param->name, param->value);
+ }
+}
+
+void cSkinSetup::TranslateSetup(void) {
+ rootMenu->InitIterators();
+ cSkinSetupParameter *param = NULL;
+ while (param = rootMenu->GetNextParameter()) {
+ string transl = "";
+ if (Translate(param->displayText, transl)) {
+ param->displayText = transl;
+ }
+ }
+
+ rootMenu->InitIterators();
+ cSkinSetupMenu *subMenu = NULL;
+ while (subMenu = rootMenu->GetNextSubMenu()) {
+ string transl = "";
+ if (Translate(subMenu->GetDisplayText(), transl)) {
+ subMenu->SetDisplayText(transl);
+ }
+ }
+}
+
+cSkinSetupMenu *cSkinSetup::GetMenu(string &name) {
+ if (name.size() == 0)
+ return rootMenu;
+ return rootMenu->GetMenu(name);
+}
+
+bool cSkinSetup::Translate(string text, string &translation) {
+ string transStart = "{tr(";
+ string transEnd = ")}";
+ size_t foundStart = text.find(transStart);
+ size_t foundEnd = text.find(transEnd);
+ bool translated = false;
+
+ while (foundStart != string::npos && foundEnd != string::npos) {
+ string token = text.substr(foundStart + 1, foundEnd - foundStart);
+ string transToken = DoTranslate(token);
+ if (transToken.size() > 0)
+ translated = true;
+ else
+ return false;
+ text.replace(foundStart, foundEnd - foundStart + 2, transToken);
+ foundStart = text.find(transStart);
+ foundEnd = text.find(transEnd);
+ }
+ if (translated)
+ translation = text;
+ return translated;
+}
+
+string cSkinSetup::DoTranslate(string token) {
+ string translation = "";
+ map <string, map< string, string > >::iterator hit = translations.find(token);
+ if (hit == translations.end()) {
+ esyslog("skindesigner: invalid translation token %s", token.c_str());
+ return translation;
+ }
+ map< string, string > translats = hit->second;
+ map< string, string >::iterator trans = translats.find(Setup.OSDLanguage);
+ if (trans != translats.end()) {
+ translation = trans->second;
+ } else {
+ map< string, string >::iterator transDefault = translats.find("en_EN");
+ if (transDefault != translats.end()) {
+ translation = transDefault->second;
+ }
+ }
+ return translation;
+}
+
+void cSkinSetup::Debug(void) {
+ rootMenu->Debug();
+ return;
+ dsyslog("skindesigner: Skin \"%s\" Setup Parameter Translations", skin.c_str());
+ for (map<string, map<string,string> >::iterator trans = translations.begin(); trans != translations.end(); trans++) {
+ dsyslog("skindesigner: translation token %s", (trans->first).c_str());
+ map<string,string> transValues = trans->second;
+ for (map<string,string>::iterator trans2 = transValues.begin(); trans2 != transValues.end(); trans2++) {
+ dsyslog("skindesigner: translation language %s value \"%s\"", (trans2->first).c_str(), (trans2->second).c_str());
+ }
+ }
+
+}
diff --git a/libcore/skinsetup.h b/libcore/skinsetup.h
new file mode 100644
index 0000000..6e99799
--- /dev/null
+++ b/libcore/skinsetup.h
@@ -0,0 +1,97 @@
+#ifndef __SKINSETUP_H
+#define __SKINSETUP_H
+
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+#include <vdr/plugin.h>
+#include <libxml/xmlstring.h>
+#include "../libtemplate/globals.h"
+
+using namespace std;
+
+enum eSetupParameterType {
+ sptInt,
+ sptBool,
+ sptUnknown
+};
+
+// --- cSkinSetupParameter -----------------------------------------------------------
+
+class cSkinSetupParameter {
+private:
+public:
+ cSkinSetupParameter(void);
+ virtual ~cSkinSetupParameter(void) {};
+ eSetupParameterType type;
+ string name;
+ string displayText;
+ int min;
+ int max;
+ int value;
+ void Debug(void);
+};
+
+// --- cSkinSetupMenu -----------------------------------------------------------
+
+class cSkinSetupMenu {
+private:
+ string name;
+ string displayText;
+ cSkinSetupMenu *parent;
+ vector < cSkinSetupMenu* > subMenus;
+ vector < cSkinSetupMenu* >::iterator subMenuIt;
+ map < string, cSkinSetupParameter* > parameters;
+ map < string, cSkinSetupParameter* >::iterator paramIt;
+public:
+ cSkinSetupMenu(void);
+ virtual ~cSkinSetupMenu(void);
+ void SetName(string name) { this->name = name; };
+ void SetDisplayText(string displayText) { this->displayText = displayText; };
+ string GetName(void) { return name; };
+ string GetDisplayText(void) { return displayText; };
+ void SetParent(cSkinSetupMenu *p) { parent = p; };
+ cSkinSetupMenu *GetParent(void) { return parent; };
+ void AddSubMenu(cSkinSetupMenu *sub) { subMenus.push_back(sub); };
+ void SetParameter(eSetupParameterType paramType, xmlChar *name, xmlChar* displayText, xmlChar *min, xmlChar *max, xmlChar *value);
+ void InitIterators(void);
+ void InitParameterIterator(void) { paramIt = parameters.begin(); };
+ cSkinSetupParameter *GetNextParameter(bool deep = true);
+ cSkinSetupParameter *GetParameter(string name);
+ void InitSubmenuIterator(void) { subMenuIt = subMenus.begin(); };
+ cSkinSetupMenu *GetNextSubMenu(bool deep = true);
+ cSkinSetupMenu *GetMenu(string &name);
+ void Debug(bool deep = true);
+};
+
+// --- cSkinSetup -----------------------------------------------------------
+
+class cSkinSetup {
+private:
+ string skin;
+ cSkinSetupMenu *rootMenu;
+ cSkinSetupMenu *currentMenu;
+ map < string, map< string, string > > translations;
+ string DoTranslate(string token);
+ bool Translate(string text, string &translation);
+public:
+ cSkinSetup(string skin);
+ virtual ~cSkinSetup(void);
+ bool ReadFromXML(void);
+ void SetSubMenu(xmlChar *name, xmlChar *displayText);
+ void SubMenuDone(void);
+ void SetParameter(xmlChar *type, xmlChar *name, xmlChar* displayText, xmlChar *min, xmlChar *max, xmlChar *value);
+ void InitParameterIterator(void) { rootMenu->InitIterators(); };
+ cSkinSetupParameter *GetNextParameter(void);
+ cSkinSetupParameter *GetParameter(string name);
+ void SetTranslation(string translationToken, map < string, string > transl);
+ void AddToGlobals(cGlobals *globals);
+ void TranslateSetup(void);
+ string GetSkin(void) { return skin; };
+ cSkinSetupMenu *GetMenu(string &name);
+ void Debug(void);
+};
+
+#endif //__SKINSETUP_H
\ No newline at end of file
diff --git a/libcore/timers.c b/libcore/timers.c
new file mode 100644
index 0000000..3e80ec7
--- /dev/null
+++ b/libcore/timers.c
@@ -0,0 +1,87 @@
+#include "timers.h"
+#include "../services/epgsearch.h"
+#include "../services/remotetimers.h"
+
+static int CompareTimers(const void *a, const void *b) {
+ return (*(const cTimer **)a)->Compare(**(const cTimer **)b);
+}
+
+cGlobalSortedTimers::cGlobalSortedTimers(bool forceRefresh) : cVector<const cTimer *>(Timers.Count()) {
+ static bool initial = true;
+ static cRemoteTimerRefresh *remoteTimerRefresh = NULL;
+
+ if (forceRefresh)
+ initial = true;
+ //check if remotetimers plugin is available
+ static cPlugin* pRemoteTimers = cPluginManager::GetPlugin("remotetimers");
+
+ cSchedulesLock SchedulesLock;
+ const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock);
+
+ if (pRemoteTimers && initial) {
+ cString errorMsg;
+ pRemoteTimers->Service("RemoteTimers::RefreshTimers-v1.0", &errorMsg);
+ initial = false;
+ }
+
+ for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer)) {
+ if (Timer->HasFlags(tfActive))
+ Append(Timer);
+ }
+
+ //if remotetimers plugin is available, take timers also from him
+ if (pRemoteTimers) {
+ cTimer* remoteTimer = NULL;
+ while (pRemoteTimers->Service("RemoteTimers::ForEach-v1.0", &remoteTimer) && remoteTimer != NULL) {
+ remoteTimer->SetEventFromSchedule(Schedules); // make sure the event is current
+ if (remoteTimer->HasFlags(tfActive))
+ Append(remoteTimer);
+ }
+ }
+
+ Sort(CompareTimers);
+
+ if (pRemoteTimers && (remoteTimerRefresh == NULL))
+ remoteTimerRefresh = new cRemoteTimerRefresh();
+}
+
+int cGlobalSortedTimers::NumTimerConfilicts(void) {
+ int numConflicts = 0;
+ cPlugin *p = cPluginManager::GetPlugin("epgsearch");
+ if (p) {
+ Epgsearch_lastconflictinfo_v1_0 *serviceData = new Epgsearch_lastconflictinfo_v1_0;
+ if (serviceData) {
+ serviceData->nextConflict = 0;
+ serviceData->relevantConflicts = 0;
+ serviceData->totalConflicts = 0;
+ p->Service("Epgsearch-lastconflictinfo-v1.0", serviceData);
+ if (serviceData->relevantConflicts > 0) {
+ numConflicts = serviceData->relevantConflicts;
+ }
+ delete serviceData;
+ }
+ }
+ return numConflicts;
+}
+
+cRemoteTimerRefresh::cRemoteTimerRefresh(): cThread("skindesigner: RemoteTimers::RefreshTimers") {
+ Start();
+}
+
+cRemoteTimerRefresh::~cRemoteTimerRefresh(void) {
+ Cancel(-1);
+ while (Active())
+ cCondWait::SleepMs(10);
+}
+
+void cRemoteTimerRefresh::Action(void) {
+ #define REFESH_INTERVALL_MS 30000
+ while (Running()) {
+ cCondWait::SleepMs(REFESH_INTERVALL_MS);
+ if (!cOsd::IsOpen()) {//make sure that no timer is currently being edited
+ cGlobalSortedTimers(true);
+ Timers.SetModified();
+ }
+ }
+}
+
\ No newline at end of file
diff --git a/libcore/timers.h b/libcore/timers.h
new file mode 100644
index 0000000..81d988a
--- /dev/null
+++ b/libcore/timers.h
@@ -0,0 +1,20 @@
+#ifndef __NOPACITY_TIMERS_H
+#define __NOPACITY_TIMERS_H
+
+#include <vdr/timers.h>
+#include <vdr/plugin.h>
+
+class cGlobalSortedTimers : public cVector<const cTimer *> {
+ public:
+ cGlobalSortedTimers(bool forceRefresh = false);
+ int NumTimerConfilicts(void);
+};
+
+class cRemoteTimerRefresh: public cThread {
+ protected:
+ virtual void Action(void);
+ public:
+ cRemoteTimerRefresh(void);
+ virtual ~cRemoteTimerRefresh(void);
+};
+#endif //__NOPACITY_TIMERS_H
diff --git a/libtemplate/globals.c b/libtemplate/globals.c
new file mode 100644
index 0000000..e09638b
--- /dev/null
+++ b/libtemplate/globals.c
@@ -0,0 +1,250 @@
+#include "globals.h"
+#include "xmlparser.h"
+#include "../config.h"
+#include <locale.h>
+
+cGlobals::cGlobals(void) {
+ fonts.insert(pair<string, string>("vdrOsd", Setup.FontOsd));
+ fonts.insert(pair<string, string>("vdrFix", Setup.FontFix));
+ fonts.insert(pair<string, string>("vdrSml", Setup.FontSml));
+ language = Setup.OSDLanguage;
+ dsyslog("skindesigner: using language %s", language.c_str());
+}
+
+bool cGlobals::ReadFromXML(void) {
+ //globals.xml is mandatory
+ string xmlFile = "globals.xml";
+ cXmlParser parser;
+ if (!parser.ReadGlobals(this, xmlFile, true))
+ return false;
+ if (!parser.ParseGlobals())
+ return false;
+ //theme.xml is optional
+ xmlFile = "theme.xml";
+ if (parser.ReadGlobals(this, xmlFile, false)) {
+ parser.ParseGlobals();
+ }
+ return true;
+}
+
+void cGlobals::AddColor(string &name, tColor &col) {
+ colors.erase(name);
+ colors.insert(pair<string, tColor>(name, col));
+}
+
+bool cGlobals::GetColor(string &name, tColor &col) {
+ int size = name.size();
+ if (size < 2)
+ return false;
+ string nameCutted = name.substr(1, size-2);
+ map <string, tColor>::iterator hit = colors.find(nameCutted);
+ if (hit != colors.end()) {
+ col = hit->second;
+ return true;
+ }
+ return false;
+}
+
+void cGlobals::AddFont(string &name, string &font) {
+ fonts.erase(name);
+ fonts.insert(pair<string, string>(name, font));
+}
+
+bool cGlobals::GetFont(string name, string &font) {
+ int size = name.size();
+ if (size < 2)
+ return false;
+ string nameCutted = name.substr(1, size-2);
+ map<string,string>::iterator hit = fonts.find(nameCutted);
+ if (hit != fonts.end()) {
+ font = hit->second;
+ return true;
+ }
+ return false;
+}
+
+void cGlobals::AddInt(string &name, int value) {
+ intVars.erase(name);
+ intVars.insert(pair<string, int>(name, value));
+}
+
+void cGlobals::ReplaceIntVars(string &value) {
+ for (map<string, int>::iterator it = intVars.begin(); it != intVars.end(); it++) {
+ stringstream sToken;
+ sToken << "{" << it->first << "}";
+ string token = sToken.str();
+ size_t foundToken = string::npos;
+ do {
+ foundToken = value.find(token);
+ if (foundToken != string::npos) {
+ stringstream st;
+ st << it->second;
+ value = value.replace(foundToken, token.size(), st.str());
+ }
+ } while (foundToken != string::npos);
+ }
+}
+
+bool cGlobals::GetInt(string name, int &val) {
+ map < string, int >::iterator hit = intVars.find(name);
+ if (hit != intVars.end()) {
+ val = hit->second;
+ return true;
+ }
+ return false;
+}
+
+void cGlobals::AddDouble(string &name, string &value) {
+ doubleVars.erase(name);
+ if (config.replaceDecPoint) {
+ if (value.find_first_of('.') != string::npos) {
+ std::replace( value.begin(), value.end(), '.', config.decPoint);
+ }
+ }
+ double val = atof(value.c_str());
+ doubleVars.insert(pair<string, double>(name, val));
+}
+
+void cGlobals::ReplaceDoubleVars(string &value) {
+ for (map<string, double>::iterator it = doubleVars.begin(); it != doubleVars.end(); it++) {
+ stringstream sToken;
+ sToken << "{" << it->first << "}";
+ string token = sToken.str();
+ size_t foundToken = string::npos;
+ do {
+ foundToken = value.find(token);
+ if (foundToken != string::npos) {
+ stringstream st;
+ st << it->second;
+ string doubleVal = st.str();
+ if (config.replaceDecPoint) {
+ if (doubleVal.find_first_of('.') != string::npos) {
+ std::replace( doubleVal.begin(), doubleVal.end(), '.', config.decPoint);
+ }
+ }
+ value = value.replace(foundToken, token.size(), doubleVal);
+ }
+ } while (foundToken != string::npos);
+ }
+}
+
+void cGlobals::AddString(string &name, string &value) {
+ stringVars.erase(name);
+ stringVars.insert(pair<string, string>(name, value));
+}
+
+void cGlobals::ReplaceStringVars(string &value) {
+ for (map<string,string>::iterator it = stringVars.begin(); it != stringVars.end(); it++) {
+ stringstream sToken;
+ sToken << "{" << it->first << "}";
+ string token = sToken.str();
+ size_t foundToken = value.find(token);
+ if (foundToken != string::npos) {
+ value = value.replace(foundToken, token.size(), it->second);
+ }
+ }
+
+}
+
+bool cGlobals::AddTranslation(string name, map < string, string > transl) {
+ translations.erase(name);
+ translations.insert(pair<string, map < string, string > >(name, transl));
+}
+
+bool cGlobals::Translate(string text, string &translation) {
+ string transStart = "{tr(";
+ string transEnd = ")}";
+ size_t foundStart = text.find(transStart);
+ size_t foundEnd = text.find(transEnd);
+ bool translated = false;
+
+ while (foundStart != string::npos && foundEnd != string::npos) {
+ string token = text.substr(foundStart + 1, foundEnd - foundStart);
+ string transToken = DoTranslate(token);
+ if (transToken.size() > 0)
+ translated = true;
+ else
+ return false;
+ text.replace(foundStart, foundEnd - foundStart + 2, transToken);
+ foundStart = text.find(transStart);
+ foundEnd = text.find(transEnd);
+ }
+ if (translated)
+ translation = text;
+ return translated;
+}
+
+string cGlobals::DoTranslate(string token) {
+ string translation = "";
+ map <string, map< string, string > >::iterator hit = translations.find(token);
+ if (hit == translations.end()) {
+ esyslog("skindesigner: invalid translation token %s", token.c_str());
+ return translation;
+ }
+ map< string, string > translats = hit->second;
+ map< string, string >::iterator trans = translats.find(language);
+ if (trans != translats.end()) {
+ translation = trans->second;
+ } else {
+ map< string, string >::iterator transDefault = translats.find("en_EN");
+ if (transDefault != translats.end()) {
+ translation = transDefault->second;
+ }
+ }
+ return translation;
+}
+
+void cGlobals::AddCustomInt(string &name, int value) {
+ customIntTokens.erase(name);
+ customIntTokens.insert(pair<string,int>(name, value));
+}
+
+void cGlobals::AddCustomString(string &name, string &value) {
+ customStringTokens.erase(name);
+ customStringTokens.insert(pair<string,string>(name, value));
+}
+
+bool cGlobals::GetCustomInt(string name, int &val) {
+ map < string, int >::iterator hit = customIntTokens.find(name);
+ if (hit != customIntTokens.end()) {
+ val = hit->second;
+ return true;
+ }
+ return false;
+}
+
+void cGlobals::ListCustomTokens(void) {
+ for (map<string, string>::iterator it = customStringTokens.begin(); it != customStringTokens.end(); it++) {
+ dsyslog("skindesigner: custom string token \"%s\" = \"%s\"", (it->first).c_str(), (it->second).c_str());
+ }
+ for (map<string, int>::iterator it = customIntTokens.begin(); it != customIntTokens.end(); it++) {
+ dsyslog("skindesigner: custom int token \"%s\" = \"%d\"", (it->first).c_str(), it->second);
+ }
+}
+
+void cGlobals::Debug(void) {
+ dsyslog("skindesigner: GLOBAL VARIABLES");
+ for (map <string, tColor>::iterator col = colors.begin(); col != colors.end(); col++) {
+ dsyslog("skindesigner: Color \"%s\": %x", (col->first).c_str(), col->second);
+ }
+ for (map <string, int>::iterator myInt = intVars.begin(); myInt != intVars.end(); myInt++) {
+ dsyslog("skindesigner: Integer Variable \"%s\": %d", (myInt->first).c_str(), myInt->second);
+ }
+ for (map <string, double>::iterator myDouble = doubleVars.begin(); myDouble != doubleVars.end(); myDouble++) {
+ dsyslog("skindesigner: Double Variable \"%s\": %f", (myDouble->first).c_str(), myDouble->second);
+ }
+ for (map <string, string>::iterator myStr = stringVars.begin(); myStr != stringVars.end(); myStr++) {
+ dsyslog("skindesigner: String Variable \"%s\": \"%s\"", (myStr->first).c_str(), (myStr->second).c_str());
+ }
+ for (map <string, string>::iterator font = fonts.begin(); font != fonts.end(); font++) {
+ dsyslog("skindesigner: Font \"%s\": \"%s\"", (font->first).c_str(), (font->second).c_str());
+ }
+
+ for (map <string, map< string, string > >::iterator trans = translations.begin(); trans != translations.end(); trans++) {
+ dsyslog("skindesigner: Translation Token %s", (trans->first).c_str());
+ map< string, string > tokenTrans = trans->second;
+ for (map< string, string >::iterator transTok = tokenTrans.begin(); transTok != tokenTrans.end(); transTok++) {
+ dsyslog("skindesigner: language %s, translation %s", (transTok->first).c_str(), (transTok->second).c_str());
+ }
+ }
+}
diff --git a/libtemplate/globals.h b/libtemplate/globals.h
new file mode 100644
index 0000000..9629e63
--- /dev/null
+++ b/libtemplate/globals.h
@@ -0,0 +1,59 @@
+#ifndef __XMLGLOBALS_H
+#define __XMLGLOBALS_H
+
+#include <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+#include <vdr/plugin.h>
+
+using namespace std;
+
+typedef uint32_t tColor;
+
+// --- cGlobals -------------------------------------------------------------
+
+class cGlobals {
+private:
+ string language;
+ string DoTranslate(string token);
+ map <string, tColor> colors;
+ map <string, string> fonts;
+ map <string, int> intVars;
+ map <string, double> doubleVars;
+ map <string, string> stringVars;
+ map <string, map< string, string > > translations;
+ map <string, string> customStringTokens;
+ map <string, int> customIntTokens;
+public:
+ cGlobals(void);
+ virtual ~cGlobals(void) {};
+ bool ReadFromXML(void);
+ void AddColor(string &name, tColor &col);
+ bool GetColor(string &name, tColor &col);
+ void AddFont(string &name, string &font);
+ bool GetFont(string name, string &font);
+ void AddInt(string &name, int value);
+ void ReplaceIntVars(string &value);
+ bool GetInt(string name, int &val);
+ void AddDouble(string &name, string &value);
+ void ReplaceDoubleVars(string &value);
+ void AddString(string &name, string &value);
+ void ReplaceStringVars(string &value);
+ bool AddTranslation(string name, map < string, string > transl);
+ bool Translate(string text, string &translation);
+ void AddCustomInt(string &name, int value);
+ void AddCustomString(string &name, string &value);
+ bool GetCustomInt(string name, int &val);
+ map <string, string> GetCustomStringTokens(void) { return customStringTokens; };
+ map <string, int> GetCustomIntTokens(void) { return customIntTokens; };
+ void ListCustomTokens(void);
+ void Debug(void);
+};
+
+#endif //__XMLGLOBALS_H
\ No newline at end of file
diff --git a/libtemplate/parameter.c b/libtemplate/parameter.c
new file mode 100644
index 0000000..1479014
--- /dev/null
+++ b/libtemplate/parameter.c
@@ -0,0 +1,402 @@
+#include "../config.h"
+#include "parameter.h"
+
+using namespace std;
+
+// --- cNumericParameter -------------------------------------------------------------
+
+cNumericParameter::cNumericParameter(string value) {
+ this->value = value;
+ globals = NULL;
+ isValid = false;
+ width = 0;
+ height = 0;
+ columnWidth = -1;
+ rowHeight = -1;
+ hor = true;
+ defaultValue = 0;
+}
+
+cNumericParameter::~cNumericParameter(void) {
+}
+
+void cNumericParameter::SetAreaSize(int w, int h) {
+ width = w;
+ height = h;
+}
+
+int cNumericParameter::Parse(string &parsedValue) {
+ int retVal = defaultValue;
+
+ if (IsNumber(value)) {
+ isValid = true;
+ retVal = atoi(value.c_str());
+ return retVal;
+ }
+
+ //checking for percent value
+ bool isPercentValue = CheckPercentValue(retVal);
+ if (isPercentValue) {
+ isValid = true;
+ return retVal;
+ }
+
+ //checking for expression
+ bool isValidExpression = CheckExpression(retVal, parsedValue);
+ if (isValidExpression) {
+ isValid = true;
+ return retVal;
+ }
+
+ return retVal;
+}
+
+bool cNumericParameter::IsNumber(const string& s) {
+ string::const_iterator it = s.begin();
+ while (it != s.end() && isdigit(*it)) ++it;
+ return !s.empty() && it == s.end();
+}
+
+bool cNumericParameter::CheckPercentValue(int &val) {
+ bool ok = false;
+ size_t posPercent = value.find('%');
+ if (posPercent != string::npos) {
+ string strPerc = value.substr(0, posPercent);
+ if (!IsNumber(strPerc)) {
+ return ok;
+ }
+ int perc = atoi(strPerc.c_str());
+ if (hor) {
+ val = width * perc / 100;
+ } else {
+ val = height * perc / 100;
+ }
+ ok = true;
+ }
+ return ok;
+}
+
+bool cNumericParameter::CheckExpression(int &val, string &parsedVal) {
+ bool ok = false;
+ string parsedValue = value;
+ //remove white spaces
+ parsedValue.erase( std::remove_if( parsedValue.begin(), parsedValue.end(), ::isspace ), parsedValue.end() );
+
+ //check and replace {areawidth} and {areaheight} tokens
+ string tokenWidth = "{areawidth}";
+ string tokenHeight = "{areaheight}";
+
+ stringstream sw;
+ sw << width;
+ string strWidth = sw.str();
+ stringstream sh;
+ sh << height;
+ string strHeight = sh.str();
+
+ bool foundToken = true;
+ while(foundToken) {
+ size_t foundTokenWidth = parsedValue.find(tokenWidth);
+ if (foundTokenWidth != string::npos) {
+ parsedValue = parsedValue.replace(foundTokenWidth, tokenWidth.size(), strWidth);
+ } else {
+ foundToken = false;
+ }
+ }
+
+ foundToken = true;
+ while(foundToken) {
+ size_t foundTokenHeight = parsedValue.find(tokenHeight);
+ if (foundTokenHeight != string::npos) {
+ parsedValue = parsedValue.replace(foundTokenHeight, tokenHeight.size(), strHeight);
+ } else {
+ foundToken = false;
+ }
+ }
+
+ //check and replace {columnwidth} and {rowheight} tokens for loop functions
+ if (columnWidth > 0 || rowHeight > 0) {
+ tokenWidth = "{columnwidth}";
+ tokenHeight = "{rowheight}";
+ stringstream cw;
+ cw << columnWidth;
+ strWidth = cw.str();
+ stringstream rh;
+ rh << rowHeight;
+ strHeight = rh.str();
+
+ foundToken = true;
+ while(foundToken) {
+ size_t foundTokenWidth = parsedValue.find(tokenWidth);
+ if (foundTokenWidth != string::npos) {
+ parsedValue = parsedValue.replace(foundTokenWidth, tokenWidth.size(), strWidth);
+ } else {
+ foundToken = false;
+ }
+ }
+
+ foundToken = true;
+ while(foundToken) {
+ size_t foundTokenHeight = parsedValue.find(tokenHeight);
+ if (foundTokenHeight != string::npos) {
+ parsedValue = parsedValue.replace(foundTokenHeight, tokenHeight.size(), strHeight);
+ } else {
+ foundToken = false;
+ }
+ }
+ }
+
+ if (globals) {
+ globals->ReplaceIntVars(parsedValue);
+ globals->ReplaceDoubleVars(parsedValue);
+ }
+
+ if (IsNumber(parsedValue)) {
+ ok = true;
+ val = atoi(parsedValue.c_str());
+ return ok;
+ }
+
+ if (!ValidNumericExpression(parsedValue)) {
+ parsedVal = parsedValue;
+ return ok;
+ }
+ ok = true;
+ char * expression = new char[parsedValue.size() + 1];
+ std::copy(parsedValue.begin(), parsedValue.end(), expression);
+ expression[parsedValue.size()] = '\0';
+ int expRes = EvaluateTheExpression(expression);
+ val = expRes;
+ delete[] expression;
+ return ok;
+}
+
+bool cNumericParameter::ValidNumericExpression(string &parsedValue) {
+ string::const_iterator it = parsedValue.begin();
+ while (it != parsedValue.end() && (isdigit(*it) || *it == '.' || *it == ',' || *it == '+' || *it == '-' || *it == '*' || *it == '/')) ++it;
+ return !parsedValue.empty() && it == parsedValue.end();
+}
+
+int cNumericParameter::EvaluateTheExpression(char* expr) {
+ return round(ParseSummands(expr));
+}
+
+double cNumericParameter::ParseAtom(char*& expr) {
+ // Read the number from string
+ char* end_ptr;
+ double res = strtod(expr, &end_ptr);
+ // Advance the pointer and return the result
+ expr = end_ptr;
+ return res;
+}
+
+// Parse multiplication and division
+double cNumericParameter::ParseFactors(char*& expr) {
+ double num1 = ParseAtom(expr);
+ for(;;) {
+ // Save the operation
+ char op = *expr;
+ if(op != '/' && op != '*')
+ return num1;
+ expr++;
+ double num2 = ParseAtom(expr);
+ // Perform the saved operation
+ if(op == '/') {
+ if (num2 != 0) {
+ num1 /= num2;
+ }
+ } else
+ num1 *= num2;
+ }
+}
+
+// Parse addition and subtraction
+double cNumericParameter::ParseSummands(char*& expr) {
+ double num1 = ParseFactors(expr);
+ for(;;) {
+ char op = *expr;
+ if(op != '-' && op != '+')
+ return num1;
+ expr++;
+ double num2 = ParseFactors(expr);
+ if(op == '-')
+ num1 -= num2;
+ else
+ num1 += num2;
+ }
+}
+
+// --- cConditionalParameter -------------------------------------------------------------
+
+cConditionalParameter::cConditionalParameter(cGlobals *globals, string value) {
+ this->globals = globals;
+ isTrue = false;
+ this->value = value;
+ type = cpNone;
+}
+
+cConditionalParameter::~cConditionalParameter(void) {
+}
+
+void cConditionalParameter::Tokenize(void) {
+ size_t posAnd = value.find("++");
+ if (posAnd != string::npos) {
+ type = cpAnd;
+ TokenizeValue("++");
+ } else {
+ size_t posOr = value.find("||");
+ if (posOr != string::npos) {
+ type = cpOr;
+ TokenizeValue("||");
+ }
+ }
+ if (type == cpNone) {
+ InsertCondition(value);
+ }
+}
+
+bool cConditionalParameter::Evaluate(map < string, int > *intTokens, map < string, string > *stringTokens) {
+ isTrue = false;
+ bool first = true;
+ for (vector<sCondition>::iterator cond = conditions.begin(); cond != conditions.end(); cond++) {
+ bool tokenTrue = false;
+
+ if (cond->type == ctStringSet) {
+ if (stringTokens) {
+ map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
+ if (hit != stringTokens->end()) {
+ string value = hit->second;
+ if (value.size() > 0)
+ tokenTrue = true;
+ }
+ }
+ } else if (cond->type == ctStringEmpty) {
+ if (stringTokens) {
+ map < string, string >::iterator hit = stringTokens->find(cond->tokenName);
+ if (hit != stringTokens->end()) {
+ string value = hit->second;
+ if (value.size() == 0)
+ tokenTrue = true;
+ } else {
+ tokenTrue = true;
+ }
+ } else {
+ tokenTrue = true;
+ }
+ } else {
+ int tokenValue = EvaluateParameter(cond->tokenName, intTokens, stringTokens);
+ if (cond->type == ctBool) {
+ tokenTrue = tokenValue;
+ } else if (cond->type == ctGreater) {
+ tokenTrue = (tokenValue > cond->compareValue) ? true : false;
+ } else if (cond->type == ctLower) {
+ tokenTrue = (tokenValue < cond->compareValue) ? true : false;
+ } else if (cond->type == ctEquals) {
+ tokenTrue = (tokenValue == cond->compareValue) ? true : false;
+ }
+ }
+
+ if (cond->isNegated)
+ tokenTrue = !tokenTrue;
+ if (type == cpAnd) {
+ if (first)
+ isTrue = tokenTrue;
+ else
+ isTrue = isTrue && tokenTrue;
+ } else if (type == cpOr) {
+ isTrue = isTrue || tokenTrue;
+ } else {
+ isTrue = tokenTrue;
+ }
+ first = false;
+ }
+}
+
+int cConditionalParameter::EvaluateParameter(string token, map < string, int > *intTokens, map < string, string > *stringTokens) {
+ //first check globals
+ int result = 0;
+ if (globals->GetInt(token, result))
+ return result;
+ //then check custom tokens
+ if (globals->GetCustomInt(token, result))
+ return result;
+ //then check tokens
+ if (intTokens) {
+ map < string, int >::iterator hit = intTokens->find(token);
+ if (hit != intTokens->end()) {
+ return hit->second;
+ }
+ }
+ if (stringTokens) {
+ map < string, string >::iterator hit = stringTokens->find(token);
+ if (hit != stringTokens->end()) {
+ string value = hit->second;
+ return atoi(value.c_str());
+ }
+ }
+ return 0;
+}
+
+void cConditionalParameter::TokenizeValue(string sep) {
+ string buffer = value;
+ bool sepFound = true;
+ while (sepFound) {
+ size_t posSep = buffer.find(sep);
+ if (posSep == string::npos) {
+ InsertCondition(buffer);
+ sepFound = false;
+ }
+ string token = buffer.substr(0, posSep);
+ buffer = buffer.replace(0, posSep + sep.size(), "");
+ InsertCondition(token);
+ }
+}
+
+void cConditionalParameter::InsertCondition(string cond) {
+ cond.erase( std::remove_if( cond.begin(), cond.end(), ::isspace ), cond.end() );
+
+ if (cond.size() < 1)
+ return;
+
+ size_t tokenStart = cond.find('{');
+ size_t tokenEnd = cond.find('}');
+
+ if (tokenStart == string::npos || tokenEnd == string::npos || tokenStart > tokenEnd)
+ return;
+
+ string tokenName = cond.substr(tokenStart + 1, tokenEnd - tokenStart - 1);
+ string rest = cond.replace(tokenStart, tokenEnd - tokenStart + 1, "");
+
+ sCondition sCond;
+ sCond.tokenName = tokenName;
+ sCond.type = ctBool;
+ sCond.compareValue = 0;
+ sCond.isNegated = false;
+ if (!rest.compare("not")) {
+ sCond.isNegated = true;
+ } else if (!rest.compare("isset")) {
+ sCond.type = ctStringSet;
+ } else if (!rest.compare("empty")) {
+ sCond.type = ctStringEmpty;
+ } else if (startswith(rest.c_str(), "gt(")) {
+ string compVal = rest.substr(4, rest.size() - 5);
+ sCond.compareValue = atoi(compVal.c_str());
+ sCond.type = ctGreater;
+ } else if (startswith(rest.c_str(), "lt(")) {
+ string compVal = rest.substr(4, rest.size() - 5);
+ sCond.compareValue = atoi(compVal.c_str());
+ sCond.type = ctLower;
+ } else if (startswith(rest.c_str(), "eq(")) {
+ string compVal = rest.substr(4, rest.size() - 5);
+ sCond.compareValue = atoi(compVal.c_str());
+ sCond.type = ctEquals;
+ }
+
+ conditions.push_back(sCond);
+}
+
+void cConditionalParameter::Debug(void) {
+ dsyslog("skindesigner: Condition %s, Type: %s, cond is %s", value.c_str(), (type == cpAnd)?"and combination":((type == cpOr)?"or combination":"single param") , isTrue?"true":"false");
+ for (vector<sCondition>::iterator it = conditions.begin(); it != conditions.end(); it++) {
+ dsyslog("skindesigner: cond token %s, type: %d, compareValue %d, negated: %d", it->tokenName.c_str(), it->type, it->compareValue, it->isNegated);
+ }
+}
\ No newline at end of file
diff --git a/libtemplate/parameter.h b/libtemplate/parameter.h
new file mode 100644
index 0000000..c92af28
--- /dev/null
+++ b/libtemplate/parameter.h
@@ -0,0 +1,141 @@
+#ifndef __TEMPLATEPARAMETER_H
+#define __TEMPLATEPARAMETER_H
+
+#include <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <algorithm>
+#include <math.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+
+#include "globals.h"
+
+using namespace std;
+
+enum eAlign {
+ alLeft,
+ alCenter,
+ alRight,
+ alTop,
+ alBottom
+};
+
+enum eScrollMode {
+ smNone,
+ smCarriageReturn,
+ smForthAndBack
+};
+
+enum eScrollSpeed {
+ ssNone,
+ ssSlow,
+ ssMedium,
+ ssFast
+};
+
+enum eOrientation {
+ orNone,
+ orHorizontal,
+ orVertical,
+ orAbsolute
+};
+
+// --- cNumericParameter -------------------------------------------------------------
+
+class cNumericParameter {
+private:
+ cGlobals *globals;
+ string value;
+ bool isValid;
+ int width;
+ int height;
+ int columnWidth;
+ int rowHeight;
+ bool hor;
+ int defaultValue;
+ bool IsNumber(const string& s);
+ bool CheckPercentValue(int &val);
+ bool CheckExpression(int &val, string &parsedVal);
+ bool ValidNumericExpression(string &parsedValue);
+ int EvaluateTheExpression(char* expr);
+ double ParseAtom(char*& expr);
+ double ParseFactors(char*& expr);
+ double ParseSummands(char*& expr);
+public:
+ cNumericParameter(string value);
+ virtual ~cNumericParameter(void);
+ void SetGlobals(cGlobals *globals) { this->globals = globals; };
+ void SetAreaSize(int w, int h);
+ void SetLoopContainer(int columnWidth, int rowHeight) { this->columnWidth = columnWidth; this->rowHeight = rowHeight; };
+ void SetDefault(int def) { defaultValue = def; };
+ void SetHorizontal(void) { hor = true; };
+ void SetVertical(void) { hor = false; };
+ int Parse(string &parsedValue);
+ bool Valid(void) { return isValid; };
+};
+
+// --- cTextToken -------------------------------------------------------------
+
+enum eTextTokenType {
+ ttConstString,
+ ttToken,
+ ttConditionalToken,
+ ttPrintfToken
+};
+
+class cTextToken {
+public:
+ eTextTokenType type;
+ string value;
+ vector<string> parameters;
+ vector<cTextToken> subTokens;
+};
+
+// --- cConditionalParameter -------------------------------------------------------------
+
+enum eCondParameterType {
+ cpAnd,
+ cpOr,
+ cpNone
+};
+
+enum eCondType {
+ ctLower,
+ ctGreater,
+ ctEquals,
+ ctBool,
+ ctStringSet,
+ ctStringEmpty,
+ ctNone
+};
+
+struct sCondition {
+ string tokenName;
+ bool isNegated;
+ eCondType type;
+ int compareValue;
+};
+
+class cConditionalParameter {
+private:
+ cGlobals *globals;
+ bool isTrue;
+ string value;
+ eCondParameterType type;
+ vector<sCondition> conditions;
+ void TokenizeValue(string sep);
+ void InsertCondition(string cond);
+ int EvaluateParameter(string token, map < string, int > *intTokens, map < string, string > *stringTokens);
+public:
+ cConditionalParameter(cGlobals *globals, string value);
+ virtual ~cConditionalParameter(void);
+ void Tokenize(void);
+ bool Evaluate(map < string, int > *intTokens, map < string, string > *stringTokens);
+ bool IsTrue(void) { return isTrue; };
+ void Debug(void);
+};
+#endif //__TEMPLATEPARAMETER_H
\ No newline at end of file
diff --git a/libtemplate/template.c b/libtemplate/template.c
new file mode 100644
index 0000000..ef7d677
--- /dev/null
+++ b/libtemplate/template.c
@@ -0,0 +1,281 @@
+ #include "template.h"
+#include "xmlparser.h"
+#include "../config.h"
+
+// --- cTemplate -------------------------------------------------------------
+
+cTemplate::cTemplate(eViewType viewType) {
+ globals = NULL;
+ rootView = NULL;
+ this->viewType = viewType;
+ CreateView();
+}
+
+cTemplate::~cTemplate() {
+
+ if (rootView)
+ delete rootView;
+
+}
+
+/*******************************************************************
+* Public Functions
+*******************************************************************/
+bool cTemplate::ReadFromXML(void) {
+ std::string xmlFile;
+ switch (viewType) {
+ case vtDisplayChannel:
+ xmlFile = "displaychannel.xml";
+ break;
+ case vtDisplayMenu:
+ xmlFile = "displaymenu.xml";
+ break;
+ case vtDisplayMessage:
+ xmlFile = "displaymessage.xml";
+ break;
+ case vtDisplayReplay:
+ xmlFile = "displayreplay.xml";
+ break;
+ case vtDisplayVolume:
+ xmlFile = "displayvolume.xml";
+ break;
+ case vtDisplayAudioTracks:
+ xmlFile = "displayaudiotracks.xml";
+ break;
+ default:
+ return false;
+ }
+
+ cXmlParser parser;
+ if (!parser.ReadView(rootView, xmlFile)) {
+ return false;
+ }
+ if (!parser.ParseView()) {
+ return false;
+ }
+ //read additional plugin templates
+ bool ok = true;
+ if (viewType == vtDisplayMenu) {
+ config.InitPluginIterator();
+ map <int,string> *plugTemplates = NULL;
+ string plugName;
+ while ( plugTemplates = config.GetPluginTemplates(plugName) ) {
+ for (map <int,string>::iterator it = plugTemplates->begin(); it != plugTemplates->end(); it++) {
+ int templateNumber = it->first;
+ stringstream templateName;
+ templateName << "plug-" << plugName << "-" << it->second.c_str();
+ if (parser.ReadPluginView(plugName, templateNumber, templateName.str())) {
+ ok = parser.ParsePluginView(plugName, templateNumber);
+ }
+ }
+ }
+ }
+ return ok;
+}
+
+void cTemplate::SetGlobals(cGlobals *globals) {
+ this->globals = globals;
+ rootView->SetGlobals(globals);
+}
+
+void cTemplate::Translate(void) {
+ rootView->Translate();
+}
+
+
+void cTemplate::PreCache(void) {
+ rootView->PreCache(false);
+}
+
+vector< pair<string, int> > cTemplate::GetUsedFonts(void) {
+ vector< pair<string, int> > usedFonts;
+
+ GetUsedFonts(rootView, usedFonts);
+
+ rootView->InitSubViewIterator();
+ cTemplateView *subView = NULL;
+ while(subView = rootView->GetNextSubView()) {
+ GetUsedFonts(subView, usedFonts);
+ }
+
+ return usedFonts;
+}
+
+
+void cTemplate::CacheImages(void) {
+ CacheImages(rootView);
+ rootView->InitSubViewIterator();
+ cTemplateView *subView = NULL;
+ while(subView = rootView->GetNextSubView()) {
+ CacheImages(subView);
+ }
+}
+
+void cTemplate::Debug(void) {
+ rootView->Debug();
+}
+
+/*******************************************************************
+* Private Functions
+*******************************************************************/
+
+void cTemplate::CreateView(void) {
+ switch (viewType) {
+ case vtDisplayChannel:
+ rootView = new cTemplateViewChannel();
+ break;
+ case vtDisplayMenu:
+ rootView = new cTemplateViewMenu();
+ break;
+ case vtDisplayReplay:
+ rootView = new cTemplateViewReplay();
+ break;
+ case vtDisplayVolume:
+ rootView = new cTemplateViewVolume();
+ break;
+ case vtDisplayAudioTracks:
+ rootView = new cTemplateViewAudioTracks();
+ break;
+ case vtDisplayMessage:
+ rootView = new cTemplateViewMessage();
+ break;
+ default:
+ esyslog("skindesigner: unknown view %d", viewType);
+ }
+}
+
+void cTemplate::GetUsedFonts(cTemplateView *view, vector< pair<string, int> > &usedFonts) {
+ //used fonts in viewElements
+ view->InitViewElementIterator();
+ cTemplateViewElement *viewElement = NULL;
+ while(viewElement = view->GetNextViewElement()) {
+ viewElement->InitIterator();
+ cTemplatePixmap *pix = NULL;
+ while(pix = viewElement->GetNextPixmap()) {
+ pix->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = pix->GetNextFunction()) {
+ if (func->GetType() == ftDrawText) {
+ usedFonts.push_back(pair<string,int>(func->GetFontName(), func->GetNumericParameter(ptFontSize)));
+ }
+ }
+ }
+ }
+ //used fonts in viewLists pixmaps
+ view->InitViewListIterator();
+ cTemplateViewList *viewList = NULL;
+ while(viewList = view->GetNextViewList()) {
+ viewList->InitIterator();
+ cTemplatePixmap *pix = NULL;
+ while(pix = viewList->GetNextPixmap()) {
+ pix->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = pix->GetNextFunction()) {
+ if (func->GetType() == ftDrawText) {
+ usedFonts.push_back(pair<string,int>(func->GetFontName(), func->GetNumericParameter(ptFontSize)));
+ }
+ }
+ }
+ cTemplateViewElement *listElement = viewList->GetListElement();
+ listElement->InitIterator();
+ while(pix = listElement->GetNextPixmap()) {
+ pix->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = pix->GetNextFunction()) {
+ if (func->GetType() == ftDrawText) {
+ usedFonts.push_back(pair<string,int>(func->GetFontName(), func->GetNumericParameter(ptFontSize)));
+ }
+ }
+ }
+ }
+ //used fonts in viewTabs
+ view->InitViewTabIterator();
+ cTemplateViewTab *viewTab = NULL;
+ while(viewTab = view->GetNextViewTab()) {
+ viewTab->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = viewTab->GetNextFunction()) {
+ if (func->GetType() == ftDrawText) {
+ usedFonts.push_back(pair<string,int>(func->GetFontName(), func->GetNumericParameter(ptFontSize)));
+ }
+ }
+ }
+}
+
+void cTemplate::CacheImages(cTemplateView *view) {
+ //used images in viewElements
+ view->InitViewElementIterator();
+ cTemplateViewElement *viewElement = NULL;
+ while(viewElement = view->GetNextViewElement()) {
+ viewElement->InitIterator();
+ cTemplatePixmap *pix = NULL;
+ while(pix = viewElement->GetNextPixmap()) {
+ CachePixmapImages(pix);
+ }
+ }
+ //used images in viewLists pixmaps
+ view->InitViewListIterator();
+ cTemplateViewList *viewList = NULL;
+ while(viewList = view->GetNextViewList()) {
+ viewList->InitIterator();
+ cTemplatePixmap *pix = NULL;
+ while(pix = viewList->GetNextPixmap()) {
+ CachePixmapImages(pix);
+ }
+ cTemplateViewElement *listElement = viewList->GetListElement();
+ listElement->InitIterator();
+ while(pix = listElement->GetNextPixmap()) {
+ CachePixmapImages(pix);
+ }
+ cTemplateViewElement *currentElement = viewList->GetListElementCurrent();
+ if (!currentElement) {
+ continue;
+ }
+ currentElement->InitIterator();
+ while(pix = currentElement->GetNextPixmap()) {
+ CachePixmapImages(pix);
+ }
+ }
+ //used images in viewTabs
+ view->InitViewTabIterator();
+ cTemplateViewTab *viewTab = NULL;
+ while(viewTab = view->GetNextViewTab()) {
+ CachePixmapImages(viewTab);
+ }
+}
+
+void cTemplate::CachePixmapImages(cTemplatePixmap *pix) {
+ pix->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = pix->GetNextFunction()) {
+ if (func->GetType() == ftDrawImage) {
+ CacheImage(func);
+ }
+ }
+}
+
+void cTemplate::CacheImage(cTemplateFunction *func) {
+ eImageType imgType = (eImageType)func->GetNumericParameter(ptImageType);
+ int width = func->GetNumericParameter(ptWidth);
+ int height = func->GetNumericParameter(ptHeight);
+
+ switch (imgType) {
+ case itIcon:
+ case itMenuIcon: {
+ string path = func->GetParameter(ptPath);
+ imgCache->CacheIcon(imgType, path, width, height);
+ break; }
+ case itChannelLogo: {
+ string doCache = func->GetParameter(ptCache);
+ if (!doCache.compare("true")) {
+ imgCache->CacheLogo(width, height);
+ }
+ break; }
+ case itSkinPart: {
+ string path = func->GetParameter(ptPath);
+ imgCache->CacheSkinpart(path, width, height);
+ break; }
+ default:
+ break;
+ }
+}
diff --git a/libtemplate/template.h b/libtemplate/template.h
new file mode 100644
index 0000000..2c1cfb2
--- /dev/null
+++ b/libtemplate/template.h
@@ -0,0 +1,58 @@
+#ifndef __TEMPLATE_H
+#define __TEMPLATE_H
+
+#include <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+
+#include "globals.h"
+#include "templateview.h"
+#include "templateviewelement.h"
+#include "templatepixmap.h"
+#include "templatefunction.h"
+
+using namespace std;
+
+// --- cTemplate -------------------------------------------------------------
+enum eViewType {
+ vtDisplayChannel,
+ vtDisplayMenu,
+ vtDisplayReplay,
+ vtDisplayVolume,
+ vtDisplayAudioTracks,
+ vtDisplayMessage
+};
+
+class cTemplate {
+private:
+ eViewType viewType;
+ void CachePixmapImages(cTemplatePixmap *pix);
+ void CacheImage(cTemplateFunction *func);
+protected:
+ cGlobals *globals;
+ cTemplateView *rootView;
+ void CreateView(void);
+ void GetUsedFonts(cTemplateView *view, vector< pair<string, int> > &usedFonts);
+ void CacheImages(cTemplateView *view);
+public:
+ cTemplate(eViewType viewType);
+ virtual ~cTemplate(void);
+ bool ReadFromXML(void);
+ void SetGlobals(cGlobals *globals);
+ cTemplateView *GetRootView(void) { return rootView; };
+ void Translate(void);
+ void PreCache(void);
+ //get fonts for pre caching
+ vector< pair<string, int> > GetUsedFonts(void);
+ void CacheImages(void);
+ //Debug
+ void Debug(void);
+};
+
+#endif //__TEMPLATE_H
\ No newline at end of file
diff --git a/libtemplate/templatefunction.c b/libtemplate/templatefunction.c
new file mode 100644
index 0000000..0b3de8a
--- /dev/null
+++ b/libtemplate/templatefunction.c
@@ -0,0 +1,1611 @@
+#include "templatefunction.h"
+#include "../config.h"
+#include "../libcore/helpers.h"
+
+using namespace std;
+
+// --- cTemplateFunction -------------------------------------------------------------
+
+cTemplateFunction::cTemplateFunction(eFuncType type) {
+ this->type = type;
+ debug = false;
+ containerX = 0;
+ containerY = 0;
+ containerWidth = 0;
+ containerHeight = 0;
+ columnWidth = -1;
+ rowHeight = -1;
+ globals = NULL;
+ condParam = NULL;
+ parsedCompletely = false;
+ updated = false;
+ alreadyCutted = false;
+ parsedTextWidth = 0;
+ fontName = "";
+ imgPath = "";
+ textboxHeight = 0;
+ stringTokens = NULL;
+ intTokens = NULL;
+ parsedText = "";
+ cuttedText = "";
+}
+
+cTemplateFunction::~cTemplateFunction(void) {
+ if (condParam)
+ delete condParam;
+}
+
+/*******************************************************************
+* Public Functions
+*******************************************************************/
+
+void cTemplateFunction::SetParameters(vector<pair<string, string> > params) {
+ for (vector<pair<string, string> >::iterator it = params.begin(); it != params.end(); it++) {
+ string name = it->first;
+ pair< eParamType, string > p;
+ if (!name.compare("debug")) {
+ string value = it->second;
+ if (!value.compare("true")) {
+ debug = true;
+ }
+ continue;
+ } else if (!name.compare("condition")) {
+ p.first = ptCond;
+ } else if (!name.compare("name")) {
+ p.first = ptName;
+ } else if (!name.compare("x")) {
+ p.first = ptX;
+ } else if (!name.compare("y")) {
+ p.first = ptY;
+ } else if (!name.compare("width")) {
+ p.first = ptWidth;
+ } else if (!name.compare("height")) {
+ p.first = ptHeight;
+ } else if (!name.compare("menuitemwidth")) {
+ p.first = ptMenuItemWidth;
+ } else if (!name.compare("fadetime")) {
+ p.first = ptFadeTime;
+ } else if (!name.compare("imagetype")) {
+ p.first = ptImageType;
+ } else if (!name.compare("path")) {
+ p.first = ptPath;
+ } else if (!name.compare("color")) {
+ p.first = ptColor;
+ } else if (!name.compare("font")) {
+ p.first = ptFont;
+ } else if (!name.compare("fontsize")) {
+ p.first = ptFontSize;
+ } else if (!name.compare("text")) {
+ p.first = ptText;
+ } else if (!name.compare("layer")) {
+ p.first = ptLayer;
+ } else if (!name.compare("transparency")) {
+ p.first = ptTransparency;
+ } else if (!name.compare("quadrant")) {
+ p.first = ptQuadrant;
+ } else if (!name.compare("type")) {
+ p.first = ptType;
+ } else if (!name.compare("align")) {
+ p.first = ptAlign;
+ } else if (!name.compare("valign")) {
+ p.first = ptValign;
+ } else if (!name.compare("delay")) {
+ p.first = ptDelay;
+ } else if (!name.compare("mode")) {
+ p.first = ptScrollMode;
+ } else if (!name.compare("scrollspeed")) {
+ p.first = ptScrollSpeed;
+ } else if (!name.compare("orientation")) {
+ p.first = ptOrientation;
+ } else if (!name.compare("numlistelements")) {
+ p.first = ptNumElements;
+ } else if (!name.compare("scrollelement")) {
+ p.first = ptScrollElement;
+ } else if (!name.compare("scrollheight")) {
+ p.first = ptScrollHeight;
+ } else if (!name.compare("float")) {
+ p.first = ptFloat;
+ } else if (!name.compare("floatwidth")) {
+ p.first = ptFloatWidth;
+ } else if (!name.compare("floatheight")) {
+ p.first = ptFloatHeight;
+ } else if (!name.compare("maxlines")) {
+ p.first = ptMaxLines;
+ } else if (!name.compare("columnwidth")) {
+ p.first = ptColumnWidth;
+ } else if (!name.compare("rowheight")) {
+ p.first = ptRowHeight;
+ } else if (!name.compare("overflow")) {
+ p.first = ptOverflow;
+ } else if (!name.compare("scaletvx")) {
+ p.first = ptScaleTvX;
+ } else if (!name.compare("scaletvy")) {
+ p.first = ptScaleTvY;
+ } else if (!name.compare("scaletvwidth")) {
+ p.first = ptScaleTvWidth;
+ } else if (!name.compare("scaletvheight")) {
+ p.first = ptScaleTvHeight;
+ } else if (!name.compare("cache")) {
+ p.first = ptCache;
+ } else if (!name.compare("determinatefont")) {
+ p.first = ptDeterminateFont;
+ } else {
+ p.first = ptNone;
+ }
+ p.second = it->second;
+ nativeParameters.insert(p);
+ }
+}
+
+void cTemplateFunction::SetParameter(eParamType type, string value) {
+ nativeParameters.erase(type);
+ nativeParameters.insert(pair<eParamType, string>(type, value));
+}
+
+void cTemplateFunction::SetContainer(int x, int y, int w, int h) {
+ containerX = x;
+ containerY = y;
+ containerWidth = w;
+ containerHeight = h;
+}
+
+void cTemplateFunction::SetLoopContainer(int columnWidth, int rowHeight) {
+ this->columnWidth = columnWidth;
+ this->rowHeight = rowHeight;
+}
+
+void cTemplateFunction::SetWidthManually(string width) {
+ nativeParameters.erase(ptWidth);
+ nativeParameters.insert(pair<eParamType, string>(ptWidth, width));
+}
+
+void cTemplateFunction::SetHeightManually(string height) {
+ nativeParameters.erase(ptHeight);
+ nativeParameters.insert(pair<eParamType, string>(ptHeight, height));
+}
+
+void cTemplateFunction::SetXManually(int newX) {
+ numericParameters.erase(ptX);
+ numericParameters.insert(pair<eParamType, int>(ptX, newX));
+}
+
+void cTemplateFunction::SetYManually(int newY) {
+ numericParameters.erase(ptY);
+ numericParameters.insert(pair<eParamType, int>(ptY, newY));
+}
+
+void cTemplateFunction::SetTextboxHeight(int boxHeight) {
+ numericParameters.erase(ptHeight);
+ numericParameters.insert(pair<eParamType, int>(ptHeight, boxHeight));
+}
+
+void cTemplateFunction::SetTranslatedText(string translation) {
+ if (type != ftDrawText && type != ftDrawTextBox)
+ return;
+ if (translation.size() == 0)
+ return;
+ nativeParameters.erase(ptText);
+ nativeParameters.insert(pair<eParamType, string>(ptText, translation));
+}
+
+void cTemplateFunction::SetMaxTextWidth(int maxWidth) {
+ if (type != ftDrawText)
+ return;
+ numericParameters.erase(ptWidth);
+ numericParameters.insert(pair<eParamType, int>(ptWidth, maxWidth));
+}
+
+bool cTemplateFunction::CalculateParameters(void) {
+ bool paramValid = true;
+ bool paramsValid = true;
+ for (map< eParamType, string >::iterator param = nativeParameters.begin(); param != nativeParameters.end(); param++) {
+ paramValid = true;
+ eParamType type = param->first;
+ string value = param->second;
+ switch (type) {
+ case ptCond:
+ paramValid = SetCondition(value);
+ break;
+ case ptX:
+ case ptY:
+ case ptWidth:
+ case ptHeight:
+ case ptMenuItemWidth:
+ case ptFadeTime:
+ case ptDelay:
+ case ptFontSize:
+ case ptLayer:
+ case ptTransparency:
+ case ptQuadrant:
+ case ptType:
+ case ptNumElements:
+ case ptFloatWidth:
+ case ptFloatHeight:
+ case ptMaxLines:
+ case ptColumnWidth:
+ case ptRowHeight:
+ case ptScaleTvX:
+ case ptScaleTvY:
+ case ptScaleTvWidth:
+ case ptScaleTvHeight:
+ SetNumericParameter(type, value);
+ break;
+ case ptAlign:
+ case ptValign:
+ paramValid = SetAlign(type, value);
+ break;
+ case ptImageType:
+ paramValid = SetImageType(type, value);
+ break;
+ case ptColor:
+ paramValid = SetColor(type, value);
+ break;
+ case ptFont:
+ paramValid = SetFont(type, value);
+ break;
+ case ptText:
+ paramValid = SetTextTokens(value);
+ break;
+ case ptScrollMode:
+ paramValid = SetScrollMode(value);
+ break;
+ case ptScrollSpeed:
+ paramValid = SetScrollSpeed(value);
+ break;
+ case ptOrientation:
+ paramValid = SetOrientation(value);
+ break;
+ case ptFloat:
+ paramValid = SetFloating(value);
+ break;
+ case ptOverflow:
+ paramValid = SetOverflow(value);
+ default:
+ paramValid = true;
+ break;
+ }
+ if (!paramValid) {
+ paramsValid = false;
+ esyslog("skindesigner: %s: invalid parameter %d, value %s", GetFuncName().c_str(), type, value.c_str());
+ }
+ }
+ return paramsValid;
+}
+
+bool cTemplateFunction::ReCalculateParameters(void) {
+ bool paramValid = true;
+ bool paramsValid = true;
+ for (map< eParamType, string >::iterator param = nativeParameters.begin(); param != nativeParameters.end(); param++) {
+ paramValid = true;
+ eParamType type = param->first;
+ string value = param->second;
+ switch (type) {
+ case ptX:
+ case ptY:
+ case ptWidth:
+ case ptHeight:
+ case ptMenuItemWidth:
+ case ptFontSize:
+ case ptFloatWidth:
+ case ptFloatHeight:
+ case ptMaxLines:
+ case ptColumnWidth:
+ case ptRowHeight:
+ SetNumericParameter(type, value);
+ break;
+ }
+ if (!paramValid) {
+ paramsValid = false;
+ esyslog("skindesigner: %s: invalid parameter %d, value %s", GetFuncName().c_str(), type, value.c_str());
+ }
+ }
+ return paramsValid;
+}
+
+void cTemplateFunction::CompleteParameters(void) {
+ switch (type) {
+ case ftDrawImage: {
+ CalculateAlign(GetNumericParameter(ptWidth), GetNumericParameter(ptHeight));
+ if (imgPath.size() == 0) {
+ imgPath = GetParameter(ptPath);
+ }
+ break; }
+ case ftDrawRectangle:
+ CalculateAlign(GetNumericParameter(ptWidth), GetNumericParameter(ptHeight));
+ break;
+ case ftDrawEllipse:
+ CalculateAlign(GetNumericParameter(ptWidth), GetNumericParameter(ptHeight));
+ break;
+ case ftDrawSlope:
+ CalculateAlign(GetNumericParameter(ptWidth), GetNumericParameter(ptHeight));
+ break;
+ case ftDrawText:
+ CalculateAlign(GetWidth(), GetHeight());
+ break;
+ default:
+ break;
+ }
+}
+
+void cTemplateFunction::ClearDynamicParameters(void) {
+ parsedText = "";
+ cuttedText = "";
+ alreadyCutted = false;
+ parsedTextWidth = 0;
+ textboxHeight = 0;
+
+ //clear dynamically parsed int parameters
+ for (map<eParamType,string>::iterator it = numericDynamicParameters.begin(); it != numericDynamicParameters.end(); it++) {
+ numericParameters.erase(it->first);
+ }
+ //restoring dynamic numeric parameters only if x, y, width or height of other elements is needed dynamically
+ for (map<eParamType,string>::iterator it = nativeParameters.begin(); it != nativeParameters.end(); it++) {
+ eParamType paramType = it->first;
+ if (paramType == ptX ||
+ paramType == ptY ||
+ paramType == ptWidth ||
+ paramType == ptHeight ||
+ paramType == ptFloatWidth ||
+ paramType == ptFloatHeight)
+ {
+ string value = it->second;
+ if (value.find("{width(") != string::npos || value.find("{height(") != string::npos || value.find("{posx(") != string::npos || value.find("{posy(") != string::npos) {
+ numericDynamicParameters.erase(paramType);
+ SetNumericParameter(paramType, value);
+ }
+ }
+ }
+
+}
+
+bool cTemplateFunction::ParseParameters(void) {
+ updated = false;
+ parsedCompletely = true;
+
+ if (stringTokens) {
+ ParseStringParameters();
+ }
+
+ if (intTokens && numericDynamicParameters.size() > 0) {
+ ParseNumericalParameters();
+ }
+
+ if (condParam) {
+ condParam->Evaluate(intTokens, stringTokens);
+ }
+
+ return parsedCompletely;
+}
+
+string cTemplateFunction::GetParameter(eParamType type) {
+ map<eParamType,string>::iterator hit = nativeParameters.find(type);
+ if (hit == nativeParameters.end())
+ return "";
+ return hit->second;
+}
+
+int cTemplateFunction::GetNumericParameter(eParamType type) {
+ map<eParamType,int>::iterator hit = numericParameters.find(type);
+ if (hit == numericParameters.end()) {
+ //Set Default Value for Integer Parameters
+ if (type == ptLayer)
+ return 1;
+ else if (type == ptTransparency)
+ return 0;
+ else if (type == ptDelay)
+ return 0;
+ else if (type == ptFadeTime)
+ return 0;
+ else if (type == ptMenuItemWidth)
+ return 0;
+ return -1;
+ }
+ return hit->second;
+}
+
+string cTemplateFunction::GetText(bool cut) {
+ if (!cut) {
+ return parsedText;
+ }
+ if (alreadyCutted && cuttedText.size() > 0) {
+ return cuttedText;
+ }
+ alreadyCutted = true;
+ int maxWidth = GetNumericParameter(ptWidth);
+ if (maxWidth > 0) {
+ parsedTextWidth = fontManager->Width(fontName, GetNumericParameter(ptFontSize), parsedText.c_str());
+ if (parsedTextWidth > maxWidth) {
+ cuttedText = CutText(parsedText, maxWidth, fontName, GetNumericParameter(ptFontSize));
+ return cuttedText;
+ }
+ }
+ return parsedText;
+}
+
+
+tColor cTemplateFunction::GetColorParameter(eParamType type) {
+ map<eParamType,tColor>::iterator hit = colorParameters.find(type);
+ if (hit == colorParameters.end())
+ return 0x00000000;
+ return hit->second;
+}
+
+int cTemplateFunction::GetWidth(bool cutted) {
+ int funcWidth = 0;
+ switch (type) {
+ case ftDrawText: {
+ if (cutted) {
+ if (!alreadyCutted) {
+ alreadyCutted = true;
+ int maxWidth = GetNumericParameter(ptWidth);
+ if (maxWidth > 0) {
+ parsedTextWidth = fontManager->Width(fontName, GetNumericParameter(ptFontSize), parsedText.c_str());
+ if (parsedTextWidth > maxWidth) {
+ cuttedText = CutText(parsedText, maxWidth, fontName, GetNumericParameter(ptFontSize));
+ }
+ }
+ }
+ if (cuttedText.size() > 0)
+ return fontManager->Width(fontName, GetNumericParameter(ptFontSize), cuttedText.c_str());
+ }
+ if (parsedTextWidth > 0)
+ funcWidth = parsedTextWidth;
+ else
+ funcWidth = fontManager->Width(fontName, GetNumericParameter(ptFontSize), parsedText.c_str());
+ break; }
+ case ftFill:
+ case ftDrawImage:
+ case ftDrawRectangle:
+ case ftDrawEllipse:
+ case ftDrawSlope:
+ case ftDrawTextBox:
+ funcWidth = GetNumericParameter(ptWidth);
+ break;
+ default:
+ esyslog("skindesigner: GetWidth not implemented for funcType %d", type);
+ break;
+ }
+ return funcWidth;
+}
+
+int cTemplateFunction::GetHeight(void) {
+ int funcHeight = 0;
+ switch (type) {
+ case ftDrawText:
+ funcHeight = fontManager->Height(fontName, GetNumericParameter(ptFontSize));
+ break;
+ case ftFill:
+ case ftDrawImage:
+ case ftDrawRectangle:
+ case ftDrawEllipse:
+ case ftDrawSlope:
+ funcHeight = GetNumericParameter(ptHeight);
+ break;
+ case ftDrawTextBox: {
+ int maxLines = GetNumericParameter(ptMaxLines);
+ int fixedBoxHeight = GetNumericParameter(ptHeight);
+ if (maxLines > 0) {
+ funcHeight = maxLines * fontManager->Height(fontName, GetNumericParameter(ptFontSize));
+ } else if (fixedBoxHeight > 0) {
+ funcHeight = fixedBoxHeight;
+ } else if (textboxHeight > 0) {
+ funcHeight = textboxHeight;
+ } else {
+ funcHeight = CalculateTextBoxHeight();
+ textboxHeight = funcHeight;
+ }
+ break; }
+ case ftLoop:
+ //TODO: to be implemented
+ break;
+ default:
+ esyslog("skindesigner: GetHeight not implemented for funcType %d", type);
+ break;
+ }
+ return funcHeight;
+}
+
+void cTemplateFunction::GetNeededWidths(multimap<eParamType,string> *widths) {
+ for (map<eParamType, string>::iterator param = numericDynamicParameters.begin(); param !=numericDynamicParameters.end(); param++) {
+ string val = param->second;
+ size_t posStart = val.find("{width(");
+ while (posStart != string::npos) {
+ size_t posEnd = val.find(")", posStart+1);
+ if (posEnd != string::npos) {
+ string label = val.substr(posStart+7, posEnd - posStart - 7);
+ widths->insert(pair<eParamType,string>(param->first, label));
+ val = val.replace(posStart, posEnd - posStart, "");
+ } else {
+ break;
+ }
+ posStart = val.find("{width(");
+ }
+ }
+}
+
+void cTemplateFunction::GetNeededHeights(multimap<eParamType,string> *heights) {
+ for (map<eParamType, string>::iterator param = numericDynamicParameters.begin(); param !=numericDynamicParameters.end(); param++) {
+ string val = param->second;
+ size_t posStart = val.find("{height(");
+ while (posStart != string::npos) {
+ size_t posEnd = val.find(")", posStart + 1);
+ if (posEnd != string::npos) {
+ string label = val.substr(posStart + 8, posEnd - posStart - 8);
+ heights->insert(pair<eParamType,string>(param->first, label));
+ val = val.replace(posStart, posEnd - posStart, "");
+ } else {
+ break;
+ }
+ posStart = val.find("{height(");
+ }
+ }
+}
+
+void cTemplateFunction::GetNeededPosX(multimap<eParamType,string> *posXs) {
+ for (map<eParamType, string>::iterator param = numericDynamicParameters.begin(); param !=numericDynamicParameters.end(); param++) {
+ string val = param->second;
+ size_t posStart = val.find("{posx(");
+ while (posStart != string::npos) {
+ size_t posEnd = val.find(")", posStart+1);
+ if (posEnd != string::npos) {
+ string label = val.substr(posStart+6, posEnd - posStart - 6);
+ posXs->insert(pair<eParamType,string>(param->first, label));
+ val = val.replace(posStart, posEnd - posStart, "");
+ } else {
+ break;
+ }
+ posStart = val.find("{posx(");
+ }
+ }
+}
+
+void cTemplateFunction::GetNeededPosY(multimap<eParamType,string> *posYs) {
+ for (map<eParamType, string>::iterator param = numericDynamicParameters.begin(); param !=numericDynamicParameters.end(); param++) {
+ string val = param->second;
+ size_t posStart = val.find("{posy(");
+ while (posStart != string::npos) {
+ size_t posEnd = val.find(")", posStart+1);
+ if (posEnd != string::npos) {
+ string label = val.substr(posStart+6, posEnd - posStart - 6);
+ posYs->insert(pair<eParamType,string>(param->first, label));
+ val = val.replace(posStart, posEnd - posStart, "");
+ } else {
+ break;
+ }
+ posStart = val.find("{posy(");
+ }
+ }
+}
+
+void cTemplateFunction::SetWidth(eParamType type, string label, int funcWidth) {
+ updated = false;
+ map< eParamType, string >::iterator hit = numericDynamicParameters.find(type);
+ if (hit == numericDynamicParameters.end())
+ return;
+ stringstream needle;
+ needle << "{width(" << label << ")}";
+ size_t posFound = (hit->second).find(needle.str());
+ if (posFound == string::npos)
+ return;
+ stringstream repl;
+ repl << funcWidth;
+ string parsedVal = (hit->second).replace(posFound, needle.str().size(), repl.str());
+
+ cNumericParameter param(parsedVal);
+ param.SetAreaSize(containerWidth, containerHeight);
+ param.SetGlobals(globals);
+ int val = param.Parse(parsedVal);
+ if (param.Valid()) {
+ updated = true;
+ numericParameters.insert(pair<eParamType, int>(type, val));
+ } else {
+ numericDynamicParameters.erase(type);
+ numericDynamicParameters.insert(pair<eParamType, string>(type, parsedVal));
+ }
+}
+
+void cTemplateFunction::SetHeight(eParamType type, string label, int funcHeight) {
+ updated = false;
+ map< eParamType, string >::iterator hit = numericDynamicParameters.find(type);
+ if (hit == numericDynamicParameters.end())
+ return;
+ stringstream needle;
+ needle << "{height(" << label << ")}";
+ size_t posFound = (hit->second).find(needle.str());
+ if (posFound == string::npos)
+ return;
+ stringstream repl;
+ repl << funcHeight;
+ string parsedVal = (hit->second).replace(posFound, needle.str().size(), repl.str());
+
+ cNumericParameter param(parsedVal);
+ param.SetAreaSize(containerWidth, containerHeight);
+ param.SetGlobals(globals);
+ int val = param.Parse(parsedVal);
+ if (param.Valid()) {
+ updated = true;
+ numericParameters.insert(pair<eParamType, int>(type, val));
+ } else {
+ numericDynamicParameters.erase(type);
+ numericDynamicParameters.insert(pair<eParamType, string>(type, parsedVal));
+ }
+}
+
+void cTemplateFunction::SetX(eParamType type, string label, int funcX) {
+ updated = false;
+ map< eParamType, string >::iterator hit = numericDynamicParameters.find(type);
+ if (hit == numericDynamicParameters.end())
+ return;
+ stringstream needle;
+ needle << "{posx(" << label << ")}";
+ size_t posFound = (hit->second).find(needle.str());
+ if (posFound == string::npos)
+ return;
+ stringstream repl;
+ repl << funcX;
+ string parsedVal = (hit->second).replace(posFound, needle.str().size(), repl.str());
+
+ cNumericParameter param(parsedVal);
+ param.SetAreaSize(containerWidth, containerHeight);
+ param.SetGlobals(globals);
+ int val = param.Parse(parsedVal);
+ if (param.Valid()) {
+ updated = true;
+ numericParameters.insert(pair<eParamType, int>(type, val));
+ } else {
+ numericDynamicParameters.erase(type);
+ numericDynamicParameters.insert(pair<eParamType, string>(type, parsedVal));
+ }
+}
+
+void cTemplateFunction::SetY(eParamType type, string label, int funcY) {
+ updated = false;
+ map< eParamType, string >::iterator hit = numericDynamicParameters.find(type);
+ if (hit == numericDynamicParameters.end())
+ return;
+ stringstream needle;
+ needle << "{posy(" << label << ")}";
+ size_t posFound = (hit->second).find(needle.str());
+ if (posFound == string::npos)
+ return;
+ stringstream repl;
+ repl << funcY;
+ string parsedVal = (hit->second).replace(posFound, needle.str().size(), repl.str());
+
+ cNumericParameter param(parsedVal);
+ param.SetAreaSize(containerWidth, containerHeight);
+ param.SetGlobals(globals);
+ int val = param.Parse(parsedVal);
+ if (param.Valid()) {
+ updated = true;
+ numericParameters.insert(pair<eParamType, int>(type, val));
+ } else {
+ numericDynamicParameters.erase(type);
+ numericDynamicParameters.insert(pair<eParamType, string>(type, parsedVal));
+ }
+}
+
+bool cTemplateFunction::DoExecute(void) {
+ if (!condParam)
+ return true;
+ return condParam->IsTrue();
+}
+
+/*******************************************************************
+* Private Functions
+*******************************************************************/
+
+bool cTemplateFunction::SetCondition(string cond) {
+ if (condParam)
+ delete condParam;
+ condParam = new cConditionalParameter(globals, cond);
+ condParam->Tokenize();
+ return true;
+}
+
+
+bool cTemplateFunction::SetNumericParameter(eParamType type, string value) {
+ if (config.replaceDecPoint) {
+ if (value.find_first_of('.') != string::npos) {
+ std::replace( value.begin(), value.end(), '.', config.decPoint);
+ }
+ }
+
+ cNumericParameter param(value);
+ param.SetAreaSize(containerWidth, containerHeight);
+ param.SetLoopContainer(columnWidth, rowHeight);
+ param.SetGlobals(globals);
+ switch (type) {
+ case ptX:
+ case ptWidth:
+ case ptMenuItemWidth:
+ case ptScaleTvX:
+ case ptScaleTvWidth:
+ param.SetHorizontal();
+ break;
+ case ptY:
+ case ptHeight:
+ case ptFontSize:
+ case ptScaleTvY:
+ case ptScaleTvHeight:
+ param.SetVertical();
+ break;
+ case ptLayer:
+ param.SetDefault(1);
+ break;
+ default:
+ break;
+ }
+ string parsedValue = "";
+ int val = param.Parse(parsedValue);
+ if (param.Valid()) {
+ if (this->type < ftLoop && type == ptX) {
+ val += containerX;
+ }
+ if (this->type < ftLoop && type == ptY) {
+ val += containerY;
+ }
+ numericParameters.erase(type);
+ numericDynamicParameters.erase(type);
+ numericParameters.insert(pair<eParamType, int>(type, val));
+ } else {
+ numericDynamicParameters.erase(type);
+ numericDynamicParameters.insert(pair<eParamType, string>(type, parsedValue));
+ }
+ return param.Valid();
+}
+
+bool cTemplateFunction::SetAlign(eParamType type, string value) {
+ eAlign align = alLeft;
+ bool ok = true;
+ if (!value.compare("center")) {
+ align = alCenter;
+ } else if (!value.compare("right")) {
+ align = alRight;
+ } else if (!value.compare("top")) {
+ align = alTop;
+ } else if (!value.compare("bottom")) {
+ align = alBottom;
+ } else if (!value.compare("left")) {
+ align = alLeft;
+ } else {
+ ok = false;
+ }
+ numericParameters.insert(pair<eParamType, int>(type, align));
+ return ok;
+}
+
+bool cTemplateFunction::SetFont(eParamType type, string value) {
+ //check if token
+ if (IsToken(value)) {
+ if (!globals->GetFont(value, fontName)) {
+ if (!globals->GetFont("{vdrOsd}", fontName)) {
+ return false;
+ }
+ }
+ } else {
+ //if no token, directly use input
+ fontName = value;
+ }
+ return true;
+}
+
+bool cTemplateFunction::SetImageType(eParamType type, string value) {
+ eImageType imgType = itImage;
+ bool ok = true;
+ if (!value.compare("channellogo")) {
+ imgType = itChannelLogo;
+ } else if (!value.compare("seplogo")) {
+ imgType = itSepLogo;
+ } else if (!value.compare("skinpart")) {
+ imgType = itSkinPart;
+ } else if (!value.compare("menuicon")) {
+ imgType = itMenuIcon;
+ } else if (!value.compare("icon")) {
+ imgType = itIcon;
+ } else if (!value.compare("image")) {
+ imgType = itImage;
+ } else {
+ ok = false;
+ }
+ numericParameters.insert(pair<eParamType, int>(ptImageType, imgType));
+ return ok;
+}
+
+
+bool cTemplateFunction::SetColor(eParamType type, string value) {
+ if (globals) {
+ tColor colVal = 0x00000000;
+ if (globals->GetColor(value, colVal)) {
+ colorParameters.insert(pair<eParamType, tColor>(type, colVal));
+ return true;
+ }
+ }
+ if (value.size() != 8)
+ return false;
+ std::stringstream str;
+ str << value;
+ tColor colVal;
+ str >> std::hex >> colVal;
+ colorParameters.insert(pair<eParamType, tColor>(type, colVal));
+ return true;
+}
+
+bool cTemplateFunction::SetTextTokens(string value) {
+ textTokens.clear();
+ //first replace globals
+ globals->ReplaceStringVars(value);
+ //now tokenize
+ bool tokenFound = true;
+ while (tokenFound) {
+ //search for conditional token or normal token
+ size_t tokenStart = value.find_first_of('{');
+ size_t conditionStart = value.find_first_of('|');
+ size_t printfStart = value.find("{printf(");
+ if (tokenStart == string::npos && conditionStart == string::npos) {
+ //find constant strings
+ if (value.size() > 0) {
+ cTextToken token;
+ token.type = ttConstString;
+ token.value = value;
+ textTokens.push_back(token);
+ }
+ tokenFound = false;
+ continue;
+ } else if (tokenStart != string::npos && conditionStart == string::npos) {
+ size_t tokenEnd = value.find_first_of('}');
+ if (printfStart != string::npos && printfStart <= tokenStart) {
+ //replace printf text token
+ ParsePrintfTextToken(value, printfStart, tokenEnd);
+ } else {
+ //replace normal text token
+ ParseTextToken(value, tokenStart, tokenEnd);
+ }
+ } else if (tokenStart != string::npos && conditionStart != string::npos) {
+ if (tokenStart < conditionStart) {
+ size_t tokenEnd = value.find_first_of('}');
+ if (printfStart != string::npos && printfStart <= tokenStart) {
+ //replace printf text token
+ ParsePrintfTextToken(value, printfStart, tokenEnd);
+ } else {
+ //replace normal text token
+ ParseTextToken(value, tokenStart, tokenEnd);
+ }
+ } else {
+ //replace conditional text token
+ size_t conditionEnd = value.find_first_of('|', conditionStart+1);
+ ParseConditionalTextToken(value, conditionStart, conditionEnd);
+ }
+ }
+ }
+ return true;
+}
+
+void cTemplateFunction::ParseTextToken(string &value, size_t start, size_t end) {
+ cTextToken token;
+ if (start > 0) {
+ string constString = value.substr(0, start);
+ value = value.replace(0, start, "");
+ token.type = ttConstString;
+ token.value = constString;
+ textTokens.push_back(token);
+ } else {
+ string tokenName = value.substr(1, end - start - 1);
+ value = value.replace(0, end - start + 1, "");
+ token.type = ttToken;
+ token.value = tokenName;
+ textTokens.push_back(token);
+ }
+}
+
+void cTemplateFunction::ParseConditionalTextToken(string &value, size_t start, size_t end) {
+ cTextToken token;
+ if (start > 0) {
+ string constString = value.substr(0, start);
+ value = value.replace(0, start, "");
+ token.type = ttConstString;
+ token.value = constString;
+ textTokens.push_back(token);
+ } else {
+ string condToken = value.substr(start + 1, end - start - 1);
+ value = value.replace(0, end - start + 1, "");
+ size_t tokenStart = condToken.find_first_of('{');
+ size_t tokenEnd = condToken.find_first_of('}');
+ vector<cTextToken> subTokens;
+ if (tokenStart > 0) {
+ cTextToken subToken;
+ string constString = condToken.substr(0, tokenStart);
+ condToken = condToken.replace(0, tokenStart, "");
+ subToken.type = ttConstString;
+ subToken.value = constString;
+ subTokens.push_back(subToken);
+ }
+ string tokenName = condToken.substr(1, tokenEnd - tokenStart - 1);
+ condToken = condToken.replace(0, tokenEnd - tokenStart + 1, "");
+
+ cTextToken subToken2;
+ subToken2.type = ttToken;
+ subToken2.value = tokenName;
+ subTokens.push_back(subToken2);
+
+ if (condToken.size() > 0) {
+ cTextToken subToken3;
+ subToken3.type = ttConstString;
+ subToken3.value = condToken;
+ subTokens.push_back(subToken3);
+ }
+
+ token.type = ttConditionalToken;
+ token.value = tokenName;
+ token.subTokens = subTokens;
+ textTokens.push_back(token);
+ }
+
+}
+
+void cTemplateFunction::ParsePrintfTextToken(string &value, size_t start, size_t end) {
+ cTextToken token;
+ if (start > 0) {
+ string constString = value.substr(0, start);
+ value = value.replace(0, start, "");
+ token.type = ttConstString;
+ token.value = constString;
+ textTokens.push_back(token);
+ } else {
+ token.type = ttPrintfToken;
+ //fetch parameter list from printf
+ string printfParams = value.substr(start + 8, end - start - 9);
+ value = value.replace(0, end - start + 1, "");
+ splitstring s(printfParams.c_str());
+ vector<string> flds = s.split(',', 1);
+
+ int numParams = flds.size();
+ if (numParams < 1)
+ return;
+ string formatString = trim(flds[0]);
+ token.value = formatString.substr(1, formatString.size() - 2);
+ for (int i=1; i < numParams; i++) {
+ token.parameters.push_back(trim(flds[i]));
+ }
+ }
+ textTokens.push_back(token);
+}
+
+bool cTemplateFunction::SetScrollMode(string value) {
+ eScrollMode mode = smNone;
+ bool ok = true;
+ if (!value.compare("forthandback"))
+ mode = smForthAndBack;
+ else if (!value.compare("carriagereturn"))
+ mode = smCarriageReturn;
+ else
+ ok = false;
+ numericParameters.insert(pair<eParamType, int>(ptScrollMode, mode));
+ return ok;
+}
+
+bool cTemplateFunction::SetScrollSpeed(string value) {
+ eScrollSpeed speed = ssMedium;
+ bool ok = true;
+ if (!value.compare("slow"))
+ speed = ssSlow;
+ else if (!value.compare("fast"))
+ speed = ssFast;
+ else if (!value.compare("medium"))
+ speed = ssMedium;
+ else
+ ok = false;
+ numericParameters.insert(pair<eParamType, int>(ptScrollSpeed, speed));
+ return ok;
+
+}
+
+bool cTemplateFunction::SetOrientation(string value) {
+ eOrientation orientation = orNone;
+ bool ok = true;
+ if (!value.compare("horizontal"))
+ orientation = orHorizontal;
+ else if (!value.compare("vertical"))
+ orientation = orVertical;
+ else if (!value.compare("absolute"))
+ orientation = orAbsolute;
+ else
+ ok = false;
+ numericParameters.insert(pair<eParamType, int>(ptOrientation, orientation));
+ return ok;
+}
+
+bool cTemplateFunction::SetFloating(string value) {
+ eFloatType floatType = flNone;
+ bool ok = true;
+ if (!value.compare("topleft"))
+ floatType = flTopLeft;
+ else if (!value.compare("topright"))
+ floatType = flTopRight;
+ else
+ ok = false;
+ numericParameters.insert(pair<eParamType, int>(ptFloat, floatType));
+ return ok;
+}
+
+bool cTemplateFunction::SetOverflow(string value) {
+ eOverflowType overflowType = otNone;
+ bool ok = true;
+ if (!value.compare("linewrap"))
+ overflowType = otWrap;
+ else if (!value.compare("cut"))
+ overflowType = otCut;
+ else
+ ok = false;
+ numericParameters.insert(pair<eParamType, int>(ptOverflow, overflowType));
+ return ok;
+}
+
+void cTemplateFunction::ParseStringParameters(void) {
+ //first replace stringtokens in Text (drawText)
+ stringstream text;
+ for (vector<cTextToken>::iterator it = textTokens.begin(); it !=textTokens.end(); it++) {
+ updated = true;
+ if ((*it).type == ttConstString) {
+ text << (*it).value;
+ } else if ((*it).type == ttToken) {
+ bool found = false;
+ string tokenName = (*it).value;
+ if (stringTokens) {
+ map < string, string >::iterator hit = stringTokens->find(tokenName);
+ if (hit != stringTokens->end()) {
+ text << hit->second;
+ found = true;
+ }
+ }
+ if (!found && intTokens) {
+ map < string, int >::iterator hitInt = intTokens->find(tokenName);
+ if (hitInt != intTokens->end()) {
+ text << hitInt->second;
+ found = true;
+ }
+ }
+ if (!found) {
+ text << "{" << tokenName << "}";
+ }
+ } else if ((*it).type == ttConditionalToken) {
+ bool found = false;
+ string tokenName = (*it).value;
+ if (stringTokens) {
+ map < string, string >::iterator hit = stringTokens->find(tokenName);
+ if (hit != stringTokens->end()) {
+ string replaceText = hit->second;
+ if (replaceText.size() > 0) {
+ for (vector<cTextToken>::iterator it2 = (*it).subTokens.begin(); it2 != (*it).subTokens.end(); it2++) {
+ if ((*it2).type == ttConstString) {
+ text << (*it2).value;
+ } else {
+ text << replaceText;
+ }
+ }
+ }
+ found = true;
+ }
+ }
+ if (!found && intTokens) {
+ map < string, int >::iterator hitInt = intTokens->find(tokenName);
+ if (hitInt != intTokens->end()) {
+ int intVal = hitInt->second;
+ if (intVal > 0) {
+ for (vector<cTextToken>::iterator it2 = (*it).subTokens.begin(); it2 != (*it).subTokens.end(); it2++) {
+ if ((*it2).type == ttConstString) {
+ text << (*it2).value;
+ } else {
+ text << intVal;
+ }
+ }
+ }
+ found = true;
+ }
+ }
+ } else if ((*it).type == ttPrintfToken) {
+ cTextToken token = *it;
+ int paramCount = token.parameters.size();
+ string printfResult = "";
+ switch (paramCount) {
+ case 1: {
+ int param1 = ReplaceIntToken(token.parameters[0]);
+ printfResult = *cString::sprintf(token.value.c_str(), param1);
+ break; }
+ case 2: {
+ int param1 = ReplaceIntToken(token.parameters[0]);
+ int param2 = ReplaceIntToken(token.parameters[1]);
+ printfResult = *cString::sprintf(token.value.c_str(), param1, param2);
+ break; }
+ case 3: {
+ int param1 = ReplaceIntToken(token.parameters[0]);
+ int param2 = ReplaceIntToken(token.parameters[1]);
+ int param3 = ReplaceIntToken(token.parameters[2]);
+ printfResult = *cString::sprintf(token.value.c_str(), param1, param2, param3);
+ break; }
+ case 4: {
+ int param1 = ReplaceIntToken(token.parameters[0]);
+ int param2 = ReplaceIntToken(token.parameters[1]);
+ int param3 = ReplaceIntToken(token.parameters[2]);
+ int param4 = ReplaceIntToken(token.parameters[3]);
+ printfResult = *cString::sprintf(token.value.c_str(), param1, param2, param3, param4);
+ break; }
+ case 5: {
+ int param1 = ReplaceIntToken(token.parameters[0]);
+ int param2 = ReplaceIntToken(token.parameters[1]);
+ int param3 = ReplaceIntToken(token.parameters[2]);
+ int param4 = ReplaceIntToken(token.parameters[3]);
+ int param5 = ReplaceIntToken(token.parameters[4]);
+ printfResult = *cString::sprintf(token.value.c_str(), param1, param2, param3, param4, param5);
+ break; }
+ default:
+ break;
+ }
+ text << printfResult;
+ }
+ }
+ parsedText = text.str();
+
+ string path = GetParameter(ptPath);
+ if (GetNumericParameter(ptImageType) == itImage && path.size() > 0) {
+ //no absolute pathes allowed
+ if (!startswith(path.c_str(), "{")) {
+ esyslog("skindesigner: no absolute pathes allowed for images - %s", path.c_str());
+ }
+ if (startswith(path.c_str(), "{ressourcedir}")) {
+ imgPath = path.replace(0, 14, *config.GetSkinRessourcePath());
+ }
+ }
+ //now check further possible string variables
+ if (stringTokens && path.size() > 0 && path.find("{") != string::npos) {
+ for (map < string, string >::iterator it = stringTokens->begin(); it != stringTokens->end(); it++) {
+ size_t found = path.find(it->first);
+ if (found != string::npos) {
+ updated = true;
+ imgPath = path;
+ if (found > 0 && ((it->first).size() + 2 <= imgPath.size()))
+ imgPath.replace(found-1, (it->first).size() + 2, it->second);
+ break;
+ }
+ }
+ for (map < string, int >::iterator it = intTokens->begin(); it != intTokens->end(); it++) {
+ size_t found = path.find(it->first);
+ if (found != string::npos) {
+ updated = true;
+ imgPath = path;
+ if (found > 0 && ((it->first).size() + 2 <= imgPath.size())) {
+ stringstream intVal;
+ intVal << it->second;
+ imgPath.replace(found-1, (it->first).size() + 2, intVal.str());
+ }
+ break;
+ }
+ }
+ }
+}
+
+void cTemplateFunction::ParseNumericalParameters(void) {
+ parsedCompletely = true;
+ for (map<eParamType, string>::iterator param = numericDynamicParameters.begin(); param !=numericDynamicParameters.end(); param++) {
+ string val = param->second;
+ for (map<string,int >::iterator tok = intTokens->begin(); tok != intTokens->end(); tok++) {
+ stringstream sToken;
+ sToken << "{" << tok->first << "}";
+ string token = sToken.str();
+ size_t foundToken = val.find(token);
+ //replace token as often as it appears
+ while (foundToken != string::npos) {
+ stringstream sVal;
+ sVal << tok->second;
+ val = val.replace(foundToken, token.size(), sVal.str());
+ foundToken = val.find(token);
+ }
+ }
+ cNumericParameter p(val);
+ string parsedVal = "";
+ int newVal = p.Parse(parsedVal);
+ if (p.Valid()) {
+ updated = true;
+ numericParameters.insert(pair<eParamType, int>(param->first, newVal));
+ } else {
+ parsedCompletely = false;
+ }
+ }
+}
+
+void cTemplateFunction::CalculateAlign(int elementWidth, int elementHeight) {
+ int align = GetNumericParameter(ptAlign);
+ //if element is used in a loop, use loop box width
+ int boxWidth = (columnWidth > 0) ? columnWidth : containerWidth;
+ int boxHeight = (rowHeight > 0) ? rowHeight : containerHeight;
+ if (align == alCenter) {
+ int xNew = (boxWidth - elementWidth) / 2;
+ numericParameters.erase(ptX);
+ numericParameters.insert(pair<eParamType,int>(ptX, xNew));
+ } else if (align == alRight) {
+ int xNew = boxWidth - elementWidth;
+ numericParameters.erase(ptX);
+ numericParameters.insert(pair<eParamType,int>(ptX, xNew));
+ }
+
+ int vAlign = GetNumericParameter(ptValign);
+ if (vAlign == alCenter) {
+ int yNew = (boxHeight - elementHeight) / 2;
+ numericParameters.erase(ptY);
+ numericParameters.insert(pair<eParamType,int>(ptY, yNew));
+ } else if (vAlign == alBottom) {
+ int yNew = boxHeight - elementHeight;
+ numericParameters.erase(ptY);
+ numericParameters.insert(pair<eParamType,int>(ptY, yNew));
+ }
+}
+
+int cTemplateFunction::CalculateTextBoxHeight(void) {
+ int width = GetNumericParameter(ptWidth);
+ string fontName = GetFontName();
+ int fontSize = GetNumericParameter(ptFontSize);
+ string text = GetText(false);
+ const cFont *font = fontManager->Font(fontName, fontSize);
+ if (!font)
+ return 0;
+
+ int fontHeight = fontManager->Height(fontName, fontSize);
+ int floatType = GetNumericParameter(ptFloat);
+
+ if (floatType == flNone) {
+ cTextWrapper wrapper;
+ wrapper.Set(text.c_str(), font, width);
+ int lines = wrapper.Lines();
+ return (lines * fontHeight);
+ }
+
+ int floatWidth = GetNumericParameter(ptFloatWidth);
+ int floatHeight = GetNumericParameter(ptFloatHeight);
+
+ cTextWrapper wTextTall;
+ cTextWrapper wTextFull;
+
+ int linesNarrow = floatHeight / fontHeight;
+ int widthNarrow = width - floatWidth;
+ int linesDrawn = 0;
+ int curY = 0;
+ bool drawNarrow = true;
+
+ splitstring s(text.c_str());
+ vector<string> flds = s.split('\n', 1);
+
+ if (flds.size() < 1)
+ return 0;
+
+ stringstream sstrTextTall;
+ stringstream sstrTextFull;
+
+ for (int i=0; i<flds.size(); i++) {
+ if (!flds[i].size()) {
+ //empty line
+ linesDrawn++;
+ curY += fontHeight;
+ if (drawNarrow)
+ sstrTextTall << "\n";
+ else
+ sstrTextFull << "\n";
+ } else {
+ cTextWrapper wrapper;
+ if (drawNarrow) {
+ wrapper.Set((flds[i].c_str()), font, widthNarrow);
+ int newLines = wrapper.Lines();
+ //check if wrapper fits completely into narrow area
+ if (linesDrawn + newLines < linesNarrow) {
+ for (int line = 0; line < wrapper.Lines(); line++) {
+ sstrTextTall << wrapper.GetLine(line) << " ";
+ }
+ sstrTextTall << "\n";
+ linesDrawn += newLines;
+ } else {
+ //this wrapper has to be splitted
+ for (int line = 0; line < wrapper.Lines(); line++) {
+ if (line + linesDrawn < linesNarrow) {
+ sstrTextTall << wrapper.GetLine(line) << " ";
+ } else {
+ sstrTextFull << wrapper.GetLine(line) << " ";
+ }
+ }
+ sstrTextFull << "\n";
+ drawNarrow = false;
+ }
+ } else {
+ wrapper.Set((flds[i].c_str()), font, width);
+ for (int line = 0; line < wrapper.Lines(); line++) {
+ sstrTextFull << wrapper.GetLine(line) << " ";
+ }
+ sstrTextFull << "\n";
+ }
+ }
+ }
+ wTextTall.Set(sstrTextTall.str().c_str(), font, widthNarrow);
+ wTextFull.Set(sstrTextFull.str().c_str(), font, width);
+
+ int textLinesTall = wTextTall.Lines();
+ int textLinesFull = wTextFull.Lines();
+
+ return ((textLinesTall+textLinesFull) * fontHeight);
+}
+
+int cTemplateFunction::ReplaceIntToken(string intTok) {
+ if (intTokens) {
+ map<string,int>::iterator hit = intTokens->find(intTok);
+ if (hit != intTokens->end())
+ return hit->second;
+ }
+ if (stringTokens) {
+ map<string,string>::iterator hit = stringTokens->find(intTok);
+ if (hit != stringTokens->end()) {
+ return atoi(hit->second.c_str());
+ }
+ }
+ return 0;
+}
+
+/*******************************************************************
+* Helper Functions
+*******************************************************************/
+
+string cTemplateFunction::GetFuncName(void) {
+ string name;
+ switch (type) {
+ case ftOsd:
+ name = "OSD Parameters";
+ break;
+ case ftView:
+ name = "View Parameters";
+ break;
+ case ftViewElement:
+ name = "View Element Parameters";
+ break;
+ case ftPixmap:
+ name = "Pixmap Parameters";
+ break;
+ case ftPixmapScroll:
+ name = "ScrollPixmap Parameters";
+ break;
+ case ftLoop:
+ name = "Looping Function";
+ break;
+ case ftFill:
+ name = "Function Fill";
+ break;
+ case ftDrawText:
+ name = "Function DrawText";
+ break;
+ case ftDrawTextBox:
+ name = "Function DrawTextBox";
+ break;
+ case ftDrawImage:
+ name = "Function DrawImage";
+ break;
+ case ftDrawRectangle:
+ name = "Function DrawRectangle";
+ break;
+ case ftDrawEllipse:
+ name = "Function DrawEllipse";
+ break;
+ case ftDrawSlope:
+ name = "Function DrawSlope";
+ break;
+ case ftNone:
+ name = "Undefined";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+string cTemplateFunction::GetParamName(eParamType pt) {
+ string name;
+ switch (pt) {
+ case ptCond:
+ name = "Condition";
+ break;
+ case ptName:
+ name = "Name";
+ break;
+ case ptX:
+ name = "X";
+ break;
+ case ptY:
+ name = "Y";
+ break;
+ case ptWidth:
+ name = "Width";
+ break;
+ case ptHeight:
+ name = "Height";
+ break;
+ case ptMenuItemWidth:
+ name = "Menu Item Width";
+ break;
+ case ptFadeTime:
+ name = "Fade Time";
+ break;
+ case ptDelay:
+ name = "Delay";
+ break;
+ case ptImageType:
+ name = "Image Type";
+ break;
+ case ptPath:
+ name = "Image Path";
+ break;
+ case ptColor:
+ name = "Color";
+ break;
+ case ptFont:
+ name = "Font";
+ break;
+ case ptFontSize:
+ name = "FontSize";
+ break;
+ case ptText:
+ name = "Text";
+ break;
+ case ptLayer:
+ name = "Layer";
+ break;
+ case ptTransparency:
+ name = "Transparency";
+ break;
+ case ptQuadrant:
+ name = "Quadrant";
+ break;
+ case ptType:
+ name = "Type";
+ break;
+ case ptAlign:
+ name = "Align";
+ break;
+ case ptValign:
+ name = "Vertical Align";
+ break;
+ case ptScrollMode:
+ name = "Scroll Mode";
+ break;
+ case ptScrollSpeed:
+ name = "Scroll Speed";
+ break;
+ case ptOrientation:
+ name = "Orientation";
+ break;
+ case ptNumElements:
+ name = "NumElements";
+ break;
+ case ptScrollElement:
+ name = "Scroll Element";
+ break;
+ case ptScrollHeight:
+ name = "Scroll Height";
+ break;
+ case ptFloat:
+ name = "Floating Type";
+ break;
+ case ptFloatWidth:
+ name = "Floating Width";
+ break;
+ case ptFloatHeight:
+ name = "Floating Height";
+ break;
+ case ptMaxLines:
+ name = "Max num of lines";
+ break;
+ case ptColumnWidth:
+ name = "Column Width";
+ break;
+ case ptRowHeight:
+ name = "Row Height";
+ break;
+ case ptOverflow:
+ name = "Overflow Mode";
+ break;
+ case ptScaleTvX:
+ name = "Scale TV Picture X";
+ break;
+ case ptScaleTvY:
+ name = "Scale TV Picture Y";
+ break;
+ case ptScaleTvWidth:
+ name = "Scale TV Picture Width";
+ break;
+ case ptScaleTvHeight:
+ name = "Scale TV Picture Height";
+ break;
+ case ptCache:
+ name = "Cache Image";
+ break;
+ case ptDeterminateFont:
+ name = "Determinate Font";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+void cTemplateFunction::Debug(void) {
+ esyslog("skindesigner: Debugging %s, Container: x = %d, y = %d, Size: %dx%d", GetFuncName().c_str(), containerX, containerY, containerWidth, containerHeight);
+ esyslog("skindesigner: --- Native Parameters:");
+
+ if (condParam) {
+ condParam->Debug();
+ }
+ esyslog("skindesigner: --- Native Parameters:");
+ for (map<eParamType,string>::iterator it = nativeParameters.begin(); it != nativeParameters.end(); it++) {
+ esyslog("skindesigner: \"%s\" = \"%s\"", GetParamName(it->first).c_str(), (it->second).c_str());
+ }
+ if (numericParameters.size() > 0) {
+ esyslog("skindesigner: --- Integer Parameters: ");
+ for (map<eParamType,int>::iterator it = numericParameters.begin(); it != numericParameters.end(); it++) {
+ esyslog("skindesigner: %s = %d", GetParamName(it->first).c_str(), it->second);
+ }
+ }
+ if (numericDynamicParameters.size() > 0) {
+ esyslog("skindesigner: --- Dynamic Integer Parameters: ");
+ for (map<eParamType,string>::iterator it = numericDynamicParameters.begin(); it != numericDynamicParameters.end(); it++) {
+ esyslog("skindesigner: %s = %s", GetParamName(it->first).c_str(), (it->second).c_str());
+ }
+ }
+ if (colorParameters.size() > 0) {
+ esyslog("skindesigner: --- Color Parameters:");
+ for (map<eParamType,tColor>::iterator it = colorParameters.begin(); it != colorParameters.end(); it++) {
+ esyslog("skindesigner: %s = %x", GetParamName(it->first).c_str(), it->second);
+ }
+ }
+ if (textTokens.size() > 0) {
+ esyslog("skindesigner: --- Text Tokens:");
+ int i=0;
+ for (vector<cTextToken>::iterator it = textTokens.begin(); it != textTokens.end(); it++) {
+ eTextTokenType tokenType = (*it).type;
+ string tokType = "";
+ if (tokenType == ttConstString)
+ tokType = "Const: ";
+ else if (tokenType == ttToken)
+ tokType = "Token: ";
+ else if (tokenType == ttConditionalToken)
+ tokType = "Conditional Token: ";
+ else if (tokenType == ttPrintfToken)
+ tokType = "PrintF Token: ";
+ esyslog("skindesigner: %s %d = \"%s\"", tokType.c_str(), i++, (*it).value.c_str());
+ if (tokenType == ttConditionalToken) {
+ for (vector<cTextToken>::iterator it2 = (*it).subTokens.begin(); it2 != (*it).subTokens.end(); it2++) {
+ eTextTokenType tokenTypeCond = (*it2).type;
+ string tokTypeCond = "";
+ if (tokenTypeCond == ttConstString)
+ tokTypeCond = "Const: ";
+ else if (tokenTypeCond == ttToken)
+ tokTypeCond = "Token: ";
+ esyslog("skindesigner: %s \"%s\"", tokTypeCond.c_str(), (*it2).value.c_str());
+ }
+ }
+ if (tokenType == ttPrintfToken) {
+ for (vector<string>::iterator it2 = (*it).parameters.begin(); it2 != (*it).parameters.end(); it2++) {
+ esyslog("skindesigner: Printf parameter: %s", (*it2).c_str());
+ }
+ }
+ }
+ }
+ if (fontName.size() > 0) {
+ esyslog("skindesigner: --- Font Name: \"%s\"", fontName.c_str());
+ }
+ if (parsedText.size() > 0) {
+ esyslog("skindesigner: --- Parsed Text: \"%s\"", parsedText.c_str());
+ }
+ if (type == ftDrawText) {
+ esyslog("skindesigner: --- Cutted Text: \"%s\"", cuttedText.c_str());
+ esyslog("skindesigner: --- Parsed Text Width: %d", parsedTextWidth);
+ esyslog("skindesigner: --- Already Cutted: %s", alreadyCutted ? "true" : "false");
+ }
+ if (imgPath.size() > 0) {
+ esyslog("skindesigner: --- Image Path: \"%s\"", imgPath.c_str());
+ }
+}
diff --git a/libtemplate/templatefunction.h b/libtemplate/templatefunction.h
new file mode 100644
index 0000000..f7af25c
--- /dev/null
+++ b/libtemplate/templatefunction.h
@@ -0,0 +1,217 @@
+#ifndef __TEMPLATEFUNCTION_H
+#define __TEMPLATEFUNCTION_H
+
+#include <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+
+#include "globals.h"
+#include "parameter.h"
+
+using namespace std;
+
+// --- cTemplateFunction -------------------------------------------------------------
+
+enum eFuncType {
+ ftOsd,
+ ftView,
+ ftViewElement,
+ ftViewList,
+ ftPixmap,
+ ftPixmapScroll,
+ ftLoop,
+ ftFill,
+ ftDrawText,
+ ftDrawTextBox,
+ ftDrawImage,
+ ftDrawRectangle,
+ ftDrawEllipse,
+ ftDrawSlope,
+ ftNone
+};
+
+enum eParamType {
+ ptCond,
+ ptName,
+ ptX,
+ ptY,
+ ptWidth,
+ ptHeight,
+ ptMenuItemWidth,
+ ptFadeTime,
+ ptDelay,
+ ptImageType,
+ ptPath,
+ ptColor,
+ ptFont,
+ ptFontSize,
+ ptText,
+ ptLayer,
+ ptTransparency,
+ ptQuadrant,
+ ptType,
+ ptAlign,
+ ptValign,
+ ptScrollMode,
+ ptScrollSpeed,
+ ptOrientation,
+ ptNumElements,
+ ptScrollElement,
+ ptScrollHeight,
+ ptFloat,
+ ptFloatWidth,
+ ptFloatHeight,
+ ptMaxLines,
+ ptColumnWidth,
+ ptRowHeight,
+ ptOverflow,
+ ptScaleTvX,
+ ptScaleTvY,
+ ptScaleTvWidth,
+ ptScaleTvHeight,
+ ptCache,
+ ptDeterminateFont,
+ ptNone
+};
+
+enum eImageType {
+ itChannelLogo,
+ itSepLogo,
+ itSkinPart,
+ itMenuIcon,
+ itIcon,
+ itImage
+};
+
+enum eFloatType {
+ flNone,
+ flTopLeft,
+ flTopRight
+};
+
+enum eOverflowType {
+ otNone,
+ otWrap,
+ otCut
+};
+
+class cTemplateFunction {
+protected:
+ eFuncType type;
+ bool debug;
+ int containerX; //X of parent container
+ int containerY; //Y of parent container
+ int containerWidth; //width of parent container
+ int containerHeight; //height of parent container
+ int columnWidth; //if func is executed in a loop, width of loop column
+ int rowHeight; //if func is executed in a loop, height of loop row
+ cGlobals *globals; //globals
+ map< eParamType, string > nativeParameters; //native parameters directly from xml
+ map< eParamType, int > numericParameters; //sucessfully parsed numeric parameters
+ map< eParamType, string > numericDynamicParameters; //numeric parameters with dynamic tokens
+ bool parsedCompletely;
+ bool updated;
+ map< eParamType, tColor > colorParameters;
+ cConditionalParameter *condParam;
+ //drawimage parameters
+ string imgPath;
+ //drawtext parameters
+ string fontName;
+ vector<cTextToken> textTokens;
+ string parsedText;
+ int parsedTextWidth;
+ string cuttedText;
+ bool alreadyCutted;
+ //drawtextbox parameters
+ int textboxHeight;
+ //dynamic tokens
+ map < string, string > *stringTokens;
+ map < string, int > *intTokens;
+ //private functions
+ bool SetCondition(string cond);
+ bool SetNumericParameter(eParamType type, string value);
+ bool SetAlign(eParamType type, string value);
+ bool SetFont(eParamType type, string value);
+ bool SetImageType(eParamType type, string value);
+ bool SetColor(eParamType type, string value);
+ bool SetTextTokens(string value);
+ void ParseTextToken(string &value, size_t start, size_t end);
+ void ParseConditionalTextToken(string &value, size_t start, size_t end);
+ void ParsePrintfTextToken(string &value, size_t start, size_t end);
+ bool SetScrollMode(string value);
+ bool SetScrollSpeed(string value);
+ bool SetOrientation(string value);
+ bool SetFloating(string value);
+ bool SetOverflow(string value);
+ void ParseStringParameters(void);
+ void ParseNumericalParameters(void);
+ void CalculateAlign(int elementWidth, int elementHeight);
+ int CalculateTextBoxHeight(void);
+ int ReplaceIntToken(string intTok);
+public:
+ cTemplateFunction(eFuncType type);
+ virtual ~cTemplateFunction(void);
+ //Setter Functions
+ void SetParameters(vector<pair<string, string> > params);
+ void SetParameter(eParamType type, string value);
+ void SetContainer(int x, int y, int w, int h);
+ void SetLoopContainer(int columnWidth, int rowHeight);
+ void SetWidthManually(string width);
+ void SetHeightManually(string height);
+ void SetXManually(int newX);
+ void SetYManually(int newY);
+ void SetMaxTextWidth(int maxWidth);
+ void SetTextboxHeight(int boxHeight);
+ void SetGlobals(cGlobals *globals) { this->globals = globals; };
+ void SetTranslatedText(string translation);
+ //PreCache Parameters
+ bool CalculateParameters(void);
+ //Complete Parameters
+ bool ReCalculateParameters(void);
+ void CompleteParameters(void);
+ //Set and Unset Dynamic Tokens from view
+ void SetStringTokens(map < string, string > *tok) { stringTokens = tok; };
+ void SetIntTokens(map < string, int > *tok) { intTokens = tok; };
+ void UnsetIntTokens(void) { intTokens = NULL; };
+ void UnsetStringTokens(void) { stringTokens = NULL; };
+ //Clear dynamically parameters
+ void ClearDynamicParameters(void);
+ //Parse parameters with dynamically set Tokens
+ bool ParseParameters(void);
+ //Getter Functions
+ eFuncType GetType(void) { return type; };
+ bool DoDebug(void) { return debug; };
+ string GetParameter(eParamType type);
+ int GetNumericParameter(eParamType type);
+ string GetText(bool cut = true);
+ string GetImagePath(void) { return imgPath; };
+ tColor GetColorParameter(eParamType type);
+ string GetFontName(void) { return fontName; };
+ string GetFuncName(void);
+ string GetParamName(eParamType pt);
+ //Dynamic width or height parameter
+ int GetWidth(bool cutted = true);
+ int GetHeight(void);
+ void GetNeededWidths(multimap<eParamType,string> *widths);
+ void GetNeededHeights(multimap<eParamType,string> *heights);
+ void GetNeededPosX(multimap<eParamType,string> *posXs);
+ void GetNeededPosY(multimap<eParamType,string> *posYs);
+ void SetWidth(eParamType type, string label, int funcWidth);
+ void SetHeight(eParamType type, string label, int funcHeight);
+ void SetX(eParamType type, string label, int funcX);
+ void SetY(eParamType type, string label, int funcY);
+ //Status Functions
+ bool ParsedCompletely(void) { return parsedCompletely; };
+ bool DoExecute(void);
+ bool Updated(void) { return updated; };
+ //Debug
+ void Debug(void);
+};
+
+#endif //__TEMPLATEFUNCTION_H
\ No newline at end of file
diff --git a/libtemplate/templateloopfunction.c b/libtemplate/templateloopfunction.c
new file mode 100644
index 0000000..b0030d3
--- /dev/null
+++ b/libtemplate/templateloopfunction.c
@@ -0,0 +1,208 @@
+#include "templateloopfunction.h"
+#include "../libcore/helpers.h"
+
+using namespace std;
+
+// --- cTemplateFunction -------------------------------------------------------------
+
+cTemplateLoopFunction::cTemplateLoopFunction(void) : cTemplateFunction(ftLoop) {
+}
+
+cTemplateLoopFunction::~cTemplateLoopFunction(void) {
+}
+
+void cTemplateLoopFunction::InitIterator(void) {
+ funcIt = functions.begin();
+}
+
+void cTemplateLoopFunction::AddFunction(string name, vector<pair<string, string> > ¶ms) {
+ eFuncType type = ftNone;
+
+ if (!name.compare("drawtext")) {
+ type = ftDrawText;
+ } else if (!name.compare("drawtextbox")) {
+ type = ftDrawTextBox;
+ } else if (!name.compare("drawimage")) {
+ type = ftDrawImage;
+ } else if (!name.compare("drawrectangle")) {
+ type = ftDrawRectangle;
+ } else if (!name.compare("drawellipse")) {
+ type = ftDrawEllipse;
+ }
+
+ if (type == ftNone) {
+ return;
+ }
+
+ cTemplateFunction *f = new cTemplateFunction(type);
+ f->SetParameters(params);
+ functions.push_back(f);
+}
+
+void cTemplateLoopFunction::CalculateLoopFuncParameters(void) {
+ int columnWidth = GetNumericParameter(ptColumnWidth);
+ int rowHeight = GetNumericParameter(ptRowHeight);
+ for (vector<cTemplateFunction*>::iterator func = functions.begin(); func != functions.end(); func++) {
+ (*func)->SetGlobals(globals);
+ (*func)->SetContainer(0, 0, containerWidth, containerHeight);
+ (*func)->SetLoopContainer(columnWidth, rowHeight);
+ (*func)->CalculateParameters();
+ (*func)->CompleteParameters();
+ }
+}
+
+cTemplateFunction *cTemplateLoopFunction::GetNextFunction(void) {
+ if (funcIt == functions.end())
+ return NULL;
+ cTemplateFunction *func = *funcIt;
+ funcIt++;
+ return func;
+}
+
+void cTemplateLoopFunction::ClearDynamicParameters(void) {
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = GetNextFunction()) {
+ func->ClearDynamicParameters();
+ }
+}
+
+void cTemplateLoopFunction::ParseDynamicParameters(map <string,string> *tokens) {
+ if (!tokens)
+ return;
+ InitIterator();
+ cTemplateFunction *func = NULL;
+
+ map <string,int> intTokens;
+ for (map <string,string>::iterator it = tokens->begin(); it != tokens->end(); it++) {
+ if (isNumber(it->second))
+ intTokens.insert(pair<string, int>(it->first, atoi((it->second).c_str())));
+ }
+
+ bool completelyParsed = true;
+ while(func = GetNextFunction()) {
+ func->SetStringTokens(tokens);
+ func->SetIntTokens(&intTokens);
+ bool funcCompletelyParsed = func->ParseParameters();
+ if (!funcCompletelyParsed)
+ completelyParsed = false;
+ if (func->Updated())
+ func->CompleteParameters();
+ func->UnsetStringTokens();
+ func->UnsetIntTokens();
+ }
+ if (completelyParsed) {
+ return;
+ }
+
+ ReplaceWidthFunctions();
+ ReplaceHeightFunctions();
+}
+
+int cTemplateLoopFunction::GetLoopElementsWidth(void) {
+ int cW = GetNumericParameter(ptColumnWidth);
+ if (cW > 0) {
+ return cW;
+ }
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ int maxWidth = 1;
+ while(func = GetNextFunction()) {
+ int funcWidth = func->GetWidth(true);
+ if (funcWidth > maxWidth)
+ maxWidth = funcWidth;
+ }
+ return maxWidth;
+}
+
+int cTemplateLoopFunction::GetLoopElementsHeight(void) {
+ int rH = GetNumericParameter(ptRowHeight);
+ if (rH > 0)
+ return rH;
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ int maxHeight = 1;
+ while(func = GetNextFunction()) {
+ int funcY = func->GetNumericParameter(ptY);
+ int funcHeight = func->GetHeight();
+ int totalHeight = funcY + funcHeight;
+ if (totalHeight > maxHeight)
+ maxHeight = totalHeight;
+ }
+ return maxHeight;
+}
+
+void cTemplateLoopFunction::ReplaceWidthFunctions(void) {
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = GetNextFunction()) {
+ if (func->ParsedCompletely()) {
+ continue;
+ }
+ multimap<eParamType,string> widths;
+ func->GetNeededWidths(&widths);
+ for (map<eParamType, string>::iterator names = widths.begin(); names !=widths.end(); names++) {
+ eParamType type = names->first;
+ string label = names->second;
+ int funcWidth = 0;
+ for (vector<cTemplateFunction*>::iterator it = functions.begin(); it != functions.end(); it++) {
+ cTemplateFunction *myFunc = *it;
+ string myFuncName = myFunc->GetParameter(ptName);
+ if (!myFuncName.compare(label)) {
+ funcWidth = myFunc->GetWidth();
+ func->SetWidth(type, label, funcWidth);
+ if (func->Updated()) {
+ func->CompleteParameters();
+ }
+ }
+ }
+ }
+ }
+}
+
+void cTemplateLoopFunction::ReplaceHeightFunctions(void) {
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = GetNextFunction()) {
+ if (func->ParsedCompletely()) {
+ continue;
+ }
+ multimap<eParamType,string> heights;
+ func->GetNeededHeights(&heights);
+ for (map<eParamType, string>::iterator names = heights.begin(); names !=heights.end(); names++) {
+ eParamType type = names->first;
+ string label = names->second;
+ int funcHeight = 0;
+ for (vector<cTemplateFunction*>::iterator it = functions.begin(); it != functions.end(); it++) {
+ cTemplateFunction *myFunc = *it;
+ string myFuncName = myFunc->GetParameter(ptName);
+ if (!myFuncName.compare(label)) {
+ funcHeight = myFunc->GetHeight();
+ func->SetHeight(type, label, funcHeight);
+ if (func->Updated()) {
+ func->CompleteParameters();
+ }
+ }
+ }
+ }
+ }
+}
+
+bool cTemplateLoopFunction::Ready(void) {
+ bool isReady = true;
+ map< eParamType, string >::iterator hit = numericDynamicParameters.find(ptColumnWidth);
+ if (hit != numericDynamicParameters.end())
+ isReady = false;
+ hit = numericDynamicParameters.find(ptRowHeight);
+ if (hit != numericDynamicParameters.end())
+ isReady = false;
+ return isReady;
+}
+
+void cTemplateLoopFunction::Debug(void) {
+ cTemplateFunction::Debug();
+ esyslog("skindesigner: functions to be looped:");
+ for (vector<cTemplateFunction*>::iterator func = functions.begin(); func != functions.end(); func++) {
+ (*func)->Debug();
+ }
+}
\ No newline at end of file
diff --git a/libtemplate/templateloopfunction.h b/libtemplate/templateloopfunction.h
new file mode 100644
index 0000000..5335279
--- /dev/null
+++ b/libtemplate/templateloopfunction.h
@@ -0,0 +1,33 @@
+#ifndef __TEMPLATELOOPFUNCTION_H
+#define __TEMPLATELOOPFUNCTION_H
+
+#include "templatefunction.h"
+
+using namespace std;
+
+// --- cTemplateLoopFunction -------------------------------------------------------------
+
+class cTemplateLoopFunction : public cTemplateFunction {
+private:
+ vector<cTemplateFunction*> functions;
+ vector<cTemplateFunction*>::iterator funcIt;
+ void ReplaceWidthFunctions(void);
+ void ReplaceHeightFunctions(void);
+public:
+ cTemplateLoopFunction(void);
+ virtual ~cTemplateLoopFunction(void);
+ void AddFunction(string name, vector<pair<string, string> > ¶ms);
+ void CalculateLoopFuncParameters(void);
+ void InitIterator(void);
+ cTemplateFunction *GetNextFunction(void);
+ void ClearDynamicParameters(void);
+ void ParseDynamicParameters(map <string,string> *tokens);
+ int GetLoopElementsWidth(void);
+ int GetLoopElementsHeight(void);
+ int GetContainerWidth(void) { return containerWidth; };
+ int GetContainerHeight(void) { return containerHeight; };
+ bool Ready(void);
+ void Debug(void);
+};
+
+#endif //__TEMPLATELOOPFUNCTION_H
diff --git a/libtemplate/templatepixmap.c b/libtemplate/templatepixmap.c
new file mode 100644
index 0000000..a1d032b
--- /dev/null
+++ b/libtemplate/templatepixmap.c
@@ -0,0 +1,474 @@
+#include "templatepixmap.h"
+
+using namespace std;
+
+// --- cTemplatePixmap -------------------------------------------------------------
+
+cTemplatePixmap::cTemplatePixmap(void) {
+ parameters = NULL;
+ containerX = 0;
+ containerY = 0;
+ containerWidth = 0;
+ containerHeight = 0;
+ globals = NULL;
+ scrolling = false;
+}
+
+cTemplatePixmap::~cTemplatePixmap() {
+ for (vector<cTemplateFunction*>::iterator it = functions.begin(); it != functions.end(); it++) {
+ delete (*it);
+ }
+ if (parameters)
+ delete parameters;
+}
+
+void cTemplatePixmap::SetParameters(vector<pair<string, string> > ¶ms) {
+ parameters = new cTemplateFunction(ftPixmap);
+ parameters->SetGlobals(globals);
+ parameters->SetParameters(params);
+}
+
+void cTemplatePixmap::SetContainer(int x, int y, int w, int h) {
+ containerX = x;
+ containerY = y;
+ containerWidth = w;
+ containerHeight = h;
+}
+
+void cTemplatePixmap::SetWidth(int width) {
+ cString pWidth = cString::sprintf("%d", width);
+ parameters->SetWidthManually(*pWidth);
+}
+
+void cTemplatePixmap::SetHeight(int height) {
+ cString pHeight = cString::sprintf("%d", height);
+ parameters->SetHeightManually(*pHeight);
+}
+
+void cTemplatePixmap::SetX(int x) {
+ parameters->SetXManually(x);
+}
+
+void cTemplatePixmap::SetY(int y) {
+ parameters->SetYManually(y);
+}
+
+void cTemplatePixmap::ClearDynamicParameters(void) {
+ parameters->ClearDynamicParameters();
+}
+
+void cTemplatePixmap::ParseDynamicParameters(map <string,int> *intTokens, bool initFuncs) {
+ parameters->ClearDynamicParameters();
+ parameters->SetIntTokens(intTokens);
+ parameters->ParseParameters();
+ parameters->UnsetIntTokens();
+
+ if (!DoExecute()) {
+ parameters->ClearDynamicParameters();
+ return;
+ }
+
+ if (!initFuncs || !Ready())
+ return;
+
+ int x = parameters->GetNumericParameter(ptX);
+ int y = parameters->GetNumericParameter(ptY);
+ int width = parameters->GetNumericParameter(ptWidth);
+ int height = parameters->GetNumericParameter(ptHeight);
+
+ for (vector<cTemplateFunction*>::iterator func = functions.begin(); func != functions.end(); func++) {
+ (*func)->SetContainer(x, y, width, height);
+ (*func)->ReCalculateParameters();
+ (*func)->CompleteParameters();
+ if ((*func)->GetType() == ftLoop) {
+ cTemplateLoopFunction *loopFunc = dynamic_cast<cTemplateLoopFunction*>(*func);
+ if (!loopFunc->Ready()) {
+ loopFunc->CalculateParameters();
+ loopFunc->SetIntTokens(intTokens);
+ loopFunc->ParseParameters();
+ loopFunc->UnsetIntTokens();
+ }
+ loopFunc->CalculateLoopFuncParameters();
+ }
+ }
+}
+
+void cTemplatePixmap::AddFunction(string name, vector<pair<string, string> > ¶ms) {
+ eFuncType type = ftNone;
+
+ if (!name.compare("fill")) {
+ type = ftFill;
+ } else if (!name.compare("drawtext")) {
+ type = ftDrawText;
+ } else if (!name.compare("drawtextbox")) {
+ type = ftDrawTextBox;
+ } else if (!name.compare("drawimage")) {
+ type = ftDrawImage;
+ } else if (!name.compare("drawrectangle")) {
+ type = ftDrawRectangle;
+ } else if (!name.compare("drawellipse")) {
+ type = ftDrawEllipse;
+ } else if (!name.compare("drawslope")) {
+ type = ftDrawSlope;
+ }
+
+ if (type == ftNone) {
+ return;
+ }
+
+ cTemplateFunction *f = new cTemplateFunction(type);
+ f->SetParameters(params);
+ functions.push_back(f);
+}
+
+void cTemplatePixmap::AddLoopFunction(cTemplateLoopFunction *lf) {
+ functions.push_back(lf);
+}
+
+
+bool cTemplatePixmap::CalculateParameters(void) {
+ bool paramsValid = true;
+ //Calculate Pixmap Size
+ parameters->SetContainer(containerX, containerY, containerWidth, containerHeight);
+ parameters->SetGlobals(globals);
+ paramsValid = parameters->CalculateParameters();
+
+ int pixWidth = parameters->GetNumericParameter(ptWidth);
+ int pixHeight = parameters->GetNumericParameter(ptHeight);
+
+ for (vector<cTemplateFunction*>::iterator func = functions.begin(); func != functions.end(); func++) {
+ (*func)->SetGlobals(globals);
+ (*func)->SetContainer(0, 0, pixWidth, pixHeight);
+ paramsValid = (*func)->CalculateParameters();
+ (*func)->CompleteParameters();
+ if ((*func)->GetType() == ftLoop) {
+ cTemplateLoopFunction *loopFunc = dynamic_cast<cTemplateLoopFunction*>(*func);
+ loopFunc->CalculateLoopFuncParameters();
+ }
+ }
+
+ return paramsValid;
+}
+
+void cTemplatePixmap::ClearDynamicFunctionParameters(void) {
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = GetNextFunction()) {
+ func->ClearDynamicParameters();
+ }
+}
+
+void cTemplatePixmap::ParseDynamicFunctionParameters(map <string,string> *stringTokens, map <string,int> *intTokens) {
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ bool completelyParsed = true;
+ bool updated = false;
+ while(func = GetNextFunction()) {
+ func->SetStringTokens(stringTokens);
+ func->SetIntTokens(intTokens);
+ bool funcCompletelyParsed = func->ParseParameters();
+ if (!funcCompletelyParsed)
+ completelyParsed = false;
+ if (func->Updated())
+ func->CompleteParameters();
+ func->UnsetIntTokens();
+ func->UnsetStringTokens();
+ }
+
+ if (completelyParsed) {
+ return;
+ }
+
+ ReplaceWidthFunctions();
+ ReplaceHeightFunctions();
+ ReplacePosXFunctions();
+ ReplacePosYFunctions();
+}
+
+bool cTemplatePixmap::CalculateDrawPortSize(cSize &size, map < string, vector< map< string, string > > > *loopTokens) {
+ int pixWidth = parameters->GetNumericParameter(ptWidth);
+ int pixHeight = parameters->GetNumericParameter(ptHeight);
+ int orientation = parameters->GetNumericParameter(ptOrientation);
+ if (orientation < 0)
+ orientation = orVertical;
+ if (orientation == orHorizontal) {
+ //get function which determinates drawport width
+ cTemplateFunction *scrollFunc = GetScrollFunction();
+ if (!scrollFunc)
+ return false;
+ int drawportWidth = scrollFunc->GetWidth(false) + scrollFunc->GetNumericParameter(ptX) + 10;
+ if (drawportWidth > pixWidth) {
+ size.SetWidth(drawportWidth);
+ size.SetHeight(pixHeight);
+ return true;
+ }
+ } else if (orientation == orVertical) {
+ //check "last" element height
+ InitIterator();
+ cTemplateFunction *f = NULL;
+ int drawportHeight = 1;
+ while (f = GetNextFunction()) {
+ if (f->GetType() == ftLoop) {
+ cTemplateLoopFunction *loopFunc = dynamic_cast<cTemplateLoopFunction*>(f);
+ //get number of loop tokens
+ string loopTokenName = loopFunc->GetParameter(ptName);
+ int numLoopTokens = 0;
+ map < string, vector< map< string, string > > >::iterator hit = loopTokens->find(loopTokenName);
+ if (hit != loopTokens->end()) {
+ vector< map<string,string> > loopToken = hit->second;
+ numLoopTokens = loopToken.size();
+ //parse first loop token element to get correct height
+ vector< map<string,string> >::iterator firstLoopToken = loopToken.begin();
+ loopFunc->ClearDynamicParameters();
+ loopFunc->ParseDynamicParameters(&(*firstLoopToken));
+ }
+ int orientation = loopFunc->GetNumericParameter(ptOrientation);
+ int yFunc = loopFunc->GetNumericParameter(ptY);
+ int heightFunc = loopFunc->GetLoopElementsHeight();
+ if (loopTokens && orientation == orVertical) {
+ //height is height of loop elements times num loop elements
+ heightFunc = heightFunc * numLoopTokens;
+ } else if (loopTokens && orientation == orHorizontal) {
+ int overflow = loopFunc->GetNumericParameter(ptOverflow);
+ if (overflow == otCut) {
+ //do nothing, height is only height of one line
+ } else if (overflow == otWrap) {
+ int widthFunc = loopFunc->GetLoopElementsWidth();
+ if (widthFunc <= 0)
+ continue;
+ int loopWidth = loopFunc->GetNumericParameter(ptWidth);
+ if (loopWidth <= 0)
+ loopWidth = loopFunc->GetContainerWidth();
+ int elementsPerRow = loopWidth / widthFunc;
+ int rest = loopWidth % widthFunc;
+ if (rest > 0)
+ elementsPerRow++;
+ if (elementsPerRow <= 0)
+ continue;
+ int lines = numLoopTokens / elementsPerRow;
+ rest = numLoopTokens % elementsPerRow;
+ if (rest > 0)
+ lines++;
+ heightFunc = heightFunc * lines;
+ }
+ }
+ int neededHeight = heightFunc + yFunc;
+ if (neededHeight > drawportHeight)
+ drawportHeight = neededHeight;
+ } else {
+ int yFunc = f->GetNumericParameter(ptY);
+ int heightFunc = f->GetHeight();
+ int neededHeight = heightFunc + yFunc;
+ if (neededHeight > drawportHeight)
+ drawportHeight = neededHeight;
+ }
+ }
+ if (drawportHeight > pixHeight) {
+ size.SetWidth(pixWidth);
+ size.SetHeight(drawportHeight);
+ return true;
+ }
+ }
+ size.SetWidth(0);
+ size.SetHeight(0);
+ return false;
+}
+
+void cTemplatePixmap::SetScrollingTextWidth(void) {
+ int orientation = parameters->GetNumericParameter(ptOrientation);
+ if (orientation != orHorizontal)
+ return;
+ int pixWidth = parameters->GetNumericParameter(ptWidth);
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = GetNextFunction()) {
+ if (func->GetType() == ftDrawText) {
+ int offset = func->GetNumericParameter(ptX);
+ func->SetMaxTextWidth(pixWidth - offset);
+ }
+ }
+}
+
+
+cTemplateFunction *cTemplatePixmap::GetScrollFunction(void) {
+ string scrollElement = parameters->GetParameter(ptScrollElement);
+ if (scrollElement.size() == 0)
+ return NULL;
+ InitIterator();
+ cTemplateFunction *f = NULL;
+ bool foundElement = false;
+ while (f = GetNextFunction()) {
+ string funcName = f->GetParameter(ptName);
+ if (!funcName.compare(scrollElement)) {
+ return f;
+ }
+ }
+ return NULL;
+}
+
+cRect cTemplatePixmap::GetPixmapSize(void) {
+ cRect size;
+ size.SetX(GetNumericParameter(ptX));
+ size.SetY(GetNumericParameter(ptY));
+ size.SetWidth(GetNumericParameter(ptWidth));
+ size.SetHeight(GetNumericParameter(ptHeight));
+ return size;
+}
+
+int cTemplatePixmap::GetNumericParameter(eParamType type) {
+ if (!parameters)
+ return -1;
+ return parameters->GetNumericParameter(type);
+}
+
+void cTemplatePixmap::InitIterator(void) {
+ funcIt = functions.begin();
+}
+
+cTemplateFunction *cTemplatePixmap::GetNextFunction(void) {
+ if (funcIt == functions.end())
+ return NULL;
+ cTemplateFunction *func = *funcIt;
+ funcIt++;
+ return func;
+}
+
+bool cTemplatePixmap::Ready(void) {
+ int myX = parameters->GetNumericParameter(ptX);
+ if (myX < 0)
+ return false;
+ int myY = parameters->GetNumericParameter(ptY);
+ if (myY < 0)
+ return false;
+ int myWidth = parameters->GetNumericParameter(ptWidth);
+ if (myWidth < 1)
+ return false;
+ int myHeight = parameters->GetNumericParameter(ptHeight);
+ if (myHeight < 1)
+ return false;
+ return true;
+}
+
+void cTemplatePixmap::ReplaceWidthFunctions(void) {
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = GetNextFunction()) {
+ if (func->ParsedCompletely()) {
+ continue;
+ }
+ multimap<eParamType,string> widths;
+ func->GetNeededWidths(&widths);
+ for (map<eParamType, string>::iterator names = widths.begin(); names !=widths.end(); names++) {
+ eParamType type = names->first;
+ string label = names->second;
+ int funcWidth = 0;
+ for (vector<cTemplateFunction*>::iterator it = functions.begin(); it != functions.end(); it++) {
+ cTemplateFunction *myFunc = *it;
+ string myFuncName = myFunc->GetParameter(ptName);
+ if (!myFuncName.compare(label)) {
+ funcWidth = myFunc->GetWidth();
+ func->SetWidth(type, label, funcWidth);
+ if (func->Updated()) {
+ func->CompleteParameters();
+ }
+ }
+ }
+ }
+ }
+}
+
+void cTemplatePixmap::ReplaceHeightFunctions(void) {
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = GetNextFunction()) {
+ if (func->ParsedCompletely()) {
+ continue;
+ }
+ multimap<eParamType,string> heights;
+ func->GetNeededHeights(&heights);
+ for (map<eParamType, string>::iterator names = heights.begin(); names !=heights.end(); names++) {
+ eParamType type = names->first;
+ string label = names->second;
+ int funcHeight = 0;
+ for (vector<cTemplateFunction*>::iterator it = functions.begin(); it != functions.end(); it++) {
+ cTemplateFunction *myFunc = *it;
+ string myFuncName = myFunc->GetParameter(ptName);
+ if (!myFuncName.compare(label)) {
+ funcHeight = myFunc->GetHeight();
+ func->SetHeight(type, label, funcHeight);
+ if (func->Updated()) {
+ func->CompleteParameters();
+ }
+ }
+ }
+ }
+ }
+}
+
+void cTemplatePixmap::ReplacePosXFunctions(void) {
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = GetNextFunction()) {
+ if (func->ParsedCompletely()) {
+ continue;
+ }
+ multimap<eParamType,string> posXs;
+ func->GetNeededPosX(&posXs);
+ for (map<eParamType, string>::iterator names = posXs.begin(); names !=posXs.end(); names++) {
+ eParamType type = names->first;
+ string label = names->second;
+ int funcX = 0;
+ for (vector<cTemplateFunction*>::iterator it = functions.begin(); it != functions.end(); it++) {
+ cTemplateFunction *myFunc = *it;
+ string myFuncName = myFunc->GetParameter(ptName);
+ if (!myFuncName.compare(label)) {
+ funcX = myFunc->GetNumericParameter(ptX);
+ if (funcX > -1) {
+ func->SetX(type, label, funcX);
+ if (func->Updated()) {
+ func->CompleteParameters();
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void cTemplatePixmap::ReplacePosYFunctions(void) {
+ InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = GetNextFunction()) {
+ if (func->ParsedCompletely()) {
+ continue;
+ }
+ multimap<eParamType,string> posYs;
+ func->GetNeededPosY(&posYs);
+ for (map<eParamType, string>::iterator names = posYs.begin(); names !=posYs.end(); names++) {
+ eParamType type = names->first;
+ string label = names->second;
+ int funcY = 0;
+ for (vector<cTemplateFunction*>::iterator it = functions.begin(); it != functions.end(); it++) {
+ cTemplateFunction *myFunc = *it;
+ string myFuncName = myFunc->GetParameter(ptName);
+ if (!myFuncName.compare(label)) {
+ funcY = myFunc->GetNumericParameter(ptY);
+ if (funcY > -1) {
+ func->SetY(type, label, funcY);
+ if (func->Updated()) {
+ func->CompleteParameters();
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void cTemplatePixmap::Debug(void) {
+ esyslog("skindesigner: pixmap container size x: %d, y: %d, width: %d, height %d", containerX, containerY, containerWidth, containerHeight);
+ parameters->Debug();
+ for (vector<cTemplateFunction*>::iterator it = functions.begin(); it != functions.end(); it++) {
+ (*it)->Debug();
+ }
+}
diff --git a/libtemplate/templatepixmap.h b/libtemplate/templatepixmap.h
new file mode 100644
index 0000000..6cf3bd5
--- /dev/null
+++ b/libtemplate/templatepixmap.h
@@ -0,0 +1,82 @@
+#ifndef __TEMPLATEPIXMAP_H
+#define __TEMPLATEPIXMAP_H
+
+#include <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+
+#include "globals.h"
+#include "templateloopfunction.h"
+
+using namespace std;
+
+// --- cTemplatePixmap -------------------------------------------------------------
+
+class cTemplatePixmap {
+protected:
+ bool scrolling;
+ cTemplateFunction *parameters;
+ vector<cTemplateFunction*> functions;
+ vector<cTemplateFunction*>::iterator funcIt;
+ int containerX;
+ int containerY;
+ int containerWidth;
+ int containerHeight;
+ cGlobals *globals;
+ //functions replacing {width(label)} and {height(label)} tokens
+ void ReplaceWidthFunctions(void);
+ void ReplaceHeightFunctions(void);
+ //functions replacing {posx(label)} and {posy(label)} tokens
+ void ReplacePosXFunctions(void);
+ void ReplacePosYFunctions(void);
+ //Get Scrolling Function
+ cTemplateFunction *GetScrollFunction(void);
+public:
+ cTemplatePixmap(void);
+ virtual ~cTemplatePixmap(void);
+ //Setter Functions
+ void SetScrolling(void) { scrolling = true; };
+ void SetParameters(vector<pair<string, string> > ¶ms);
+ void SetWidth(int width);
+ void SetHeight(int height);
+ void SetX(int x);
+ void SetY(int y);
+ void SetContainer(int x, int y, int w, int h);
+ void SetGlobals(cGlobals *globals) { this->globals = globals; };
+ void AddFunction(string name, vector<pair<string, string> > ¶ms);
+ void AddLoopFunction(cTemplateLoopFunction *lf);
+ //PreCache Parameters
+ bool CalculateParameters(void);
+ //clear dynamically set function parameters
+ void ClearDynamicFunctionParameters(void);
+ //Clear dynamically set pixmap parameters
+ void ClearDynamicParameters(void);
+ //Parse pixmap parameters with dynamically set Tokens
+ void ParseDynamicParameters(map <string,int> *intTokens, bool initFuncs);
+ //Parse all function parameters with dynamically set Tokens
+ void ParseDynamicFunctionParameters(map <string,string> *stringTokens, map <string,int> *intTokens);
+ //Calculate size of drawport in case area scrolls
+ bool CalculateDrawPortSize(cSize &size, map < string, vector< map< string, string > > > *loopTokens = NULL);
+ //Set max width for text in scrollarea
+ void SetScrollingTextWidth(void);
+ //Getter Functions
+ cRect GetPixmapSize(void);
+ int GetNumericParameter(eParamType type);
+ bool Scrolling(void) { return scrolling; };
+ bool DoExecute(void) { return parameters->DoExecute(); };
+ bool DoDebug(void) { return parameters->DoDebug(); };
+ bool Ready(void);
+ //Traverse Functions
+ void InitIterator(void);
+ cTemplateFunction *GetNextFunction(void);
+ //Debug
+ void Debug(void);
+};
+
+#endif //__TEMPLATEPIXMAP_H
\ No newline at end of file
diff --git a/libtemplate/templateview.c b/libtemplate/templateview.c
new file mode 100644
index 0000000..4b1376a
--- /dev/null
+++ b/libtemplate/templateview.c
@@ -0,0 +1,1799 @@
+#include "templateview.h"
+
+// --- cTemplateView -------------------------------------------------------------
+
+cTemplateView::cTemplateView(void) {
+ globals = NULL;
+ parameters = NULL;
+ containerX = 0;
+ containerY = 0;
+ containerWidth = 0;
+ containerHeight = 0;
+ SetFunctionDefinitions();
+}
+
+cTemplateView::~cTemplateView() {
+
+ for (map < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
+ delete it->second;
+ }
+
+ for (map < eViewList, cTemplateViewList* >::iterator it = viewLists.begin(); it != viewLists.end(); it++) {
+ delete it->second;
+ }
+
+ for (vector < cTemplateViewTab* >::iterator it = viewTabs.begin(); it != viewTabs.end(); it++) {
+ delete *it;
+ }
+
+ for (map < eSubView, cTemplateView* >::iterator it = subViews.begin(); it != subViews.end(); it++) {
+ delete it->second;
+ }
+
+ for (map < string, map< int, cTemplateView*> >::iterator it = pluginViews.begin(); it != pluginViews.end(); it++) {
+ map< int, cTemplateView*> plugViews = it->second;
+ for (map< int, cTemplateView*>::iterator it2 = plugViews.begin(); it2 != plugViews.end(); it2++) {
+ delete it2->second;
+ }
+ }
+
+ if (parameters)
+ delete parameters;
+
+}
+
+/*******************************************************************
+* Public Functions
+*******************************************************************/
+
+void cTemplateView::SetParameters(vector<pair<string, string> > ¶ms) {
+ parameters = new cTemplateFunction(ftView);
+ parameters->SetGlobals(globals);
+ parameters->SetParameters(params);
+}
+
+void cTemplateView::SetContainer(int x, int y, int width, int height) {
+ containerX = x;
+ containerY = y;
+ containerWidth = width;
+ containerHeight = height;
+}
+
+cTemplateViewElement *cTemplateView::GetViewElement(eViewElement ve) {
+ map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
+ if (hit == viewElements.end())
+ return NULL;
+ return hit->second;
+}
+
+void cTemplateView::InitViewElementIterator(void) {
+ veIt = viewElements.begin();
+}
+
+cTemplateViewElement *cTemplateView::GetNextViewElement(void) {
+ if (veIt == viewElements.end())
+ return NULL;
+ cTemplateViewElement *viewElement = veIt->second;
+ veIt++;
+ return viewElement;
+}
+
+cTemplateViewList *cTemplateView::GetViewList(eViewList vl) {
+ map < eViewList, cTemplateViewList* >::iterator hit = viewLists.find(vl);
+ if (hit == viewLists.end())
+ return NULL;
+ return hit->second;
+}
+
+void cTemplateView::InitViewListIterator(void) {
+ vlIt = viewLists.begin();
+}
+
+cTemplateViewList *cTemplateView::GetNextViewList(void) {
+ if (vlIt == viewLists.end())
+ return NULL;
+ cTemplateViewList *viewList = vlIt->second;
+ vlIt++;
+ return viewList;
+}
+
+cTemplateView *cTemplateView::GetSubView(eSubView sv) {
+ map < eSubView, cTemplateView* >::iterator hit = subViews.find(sv);
+ if (hit == subViews.end())
+ return NULL;
+ return hit->second;
+}
+
+cTemplateView *cTemplateView::GetPluginView(string pluginName, int pluginMenu) {
+ map < string, map< int, cTemplateView*> >::iterator hit = pluginViews.find(pluginName);
+
+ if (hit == pluginViews.end())
+ return NULL;
+
+ map< int, cTemplateView*> plugViews = hit->second;
+ map< int, cTemplateView*>::iterator hit2 = plugViews.find(pluginMenu);
+
+ if (hit2 == plugViews.end())
+ return NULL;
+
+ return hit2->second;
+}
+
+
+void cTemplateView::InitViewTabIterator(void) {
+ vtIt = viewTabs.begin();
+}
+
+cTemplateViewTab *cTemplateView::GetNextViewTab(void) {
+ if (vtIt == viewTabs.end()) {
+ return NULL;
+ }
+ cTemplateViewTab *tab = *vtIt;
+ vtIt++;
+ return tab;
+}
+
+void cTemplateView::InitSubViewIterator(void) {
+ svIt = subViews.begin();
+}
+
+cTemplateView *cTemplateView::GetNextSubView(void) {
+ if (svIt == subViews.end())
+ return NULL;
+ cTemplateView *subView = svIt->second;
+ svIt++;
+ return subView;
+}
+
+int cTemplateView::GetNumericParameter(eParamType type) {
+ if (!parameters)
+ return 0;
+ return parameters->GetNumericParameter(type);
+}
+
+cRect cTemplateView::GetOsdSize(void) {
+ cRect osdSize;
+ if (!parameters) {
+ return osdSize;
+ }
+ osdSize.SetX(parameters->GetNumericParameter(ptX));
+ osdSize.SetY(parameters->GetNumericParameter(ptY));
+ osdSize.SetWidth(parameters->GetNumericParameter(ptWidth));
+ osdSize.SetHeight(parameters->GetNumericParameter(ptHeight));
+ return osdSize;
+}
+
+int cTemplateView::GetNumPixmaps(void) {
+ int numPixmaps = 0;
+ for (map < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
+ cTemplateViewElement *viewElement = it->second;
+ numPixmaps += viewElement->GetNumPixmaps();
+ }
+ return numPixmaps;
+}
+
+int cTemplateView::GetNumPixmapsViewElement(eViewElement ve) {
+ map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
+ if (hit == viewElements.end())
+ return 0;
+ cTemplateViewElement *viewElement = hit->second;
+ return viewElement->GetNumPixmaps();
+}
+
+int cTemplateView::GetNumListViewMenuItems(void) {
+ int numElements = 0;
+ cTemplateViewList *menuList = GetViewList(vlMenuItem);
+ if (!menuList)
+ return numElements;
+ return menuList->GetNumericParameter(ptNumElements);
+}
+
+bool cTemplateView::GetScalingWindow(cRect &scalingWindow) {
+ if (!parameters)
+ return false;
+ bool doScale = false;
+ int scaleX = parameters->GetNumericParameter(ptScaleTvX) + cOsd::OsdLeft();
+ int scaleY = parameters->GetNumericParameter(ptScaleTvY) + cOsd::OsdTop();
+ int scaleWidth = parameters->GetNumericParameter(ptScaleTvWidth);
+ int scaleHeight = parameters->GetNumericParameter(ptScaleTvHeight);
+ if (scaleX > -1 && scaleY > -1 && scaleWidth > -1 && scaleHeight > -1) {
+ cRect suggestedScaleWindow(scaleX, scaleY, scaleWidth, scaleHeight);
+ scalingWindow = cDevice::PrimaryDevice()->CanScaleVideo(suggestedScaleWindow);
+ doScale = true;
+ } else {
+ scalingWindow = cDevice::PrimaryDevice()->CanScaleVideo(cRect::Null);
+ }
+ return doScale;
+}
+
+bool cTemplateView::ValidViewElement(const char *viewElement) {
+ set<string>::iterator hit = viewElementsAllowed.find(viewElement);
+ if (hit == viewElementsAllowed.end())
+ return false;
+ return true;
+}
+
+bool cTemplateView::ValidSubView(const char *subView) {
+ set<string>::iterator hit = subViewsAllowed.find(subView);
+ if (hit == subViewsAllowed.end())
+ return false;
+ return true;
+}
+
+bool cTemplateView::ValidViewList(const char *viewList) {
+ set<string>::iterator hit = viewListsAllowed.find(viewList);
+ if (hit == viewListsAllowed.end())
+ return false;
+ return true;
+}
+
+bool cTemplateView::ValidFunction(const char *func) {
+ map < string, set < string > >::iterator hit = funcsAllowed.find(func);
+ if (hit == funcsAllowed.end())
+ return false;
+ return true;
+}
+
+bool cTemplateView::ValidAttribute(const char *func, const char *att) {
+ map < string, set < string > >::iterator hit = funcsAllowed.find(func);
+ if (hit == funcsAllowed.end())
+ return false;
+
+ set<string>::iterator hitAtt = (hit->second).find(att);
+ if (hitAtt == (hit->second).end())
+ return false;
+
+ return true;
+}
+
+void cTemplateView::Translate(void) {
+ //Translate ViewElements
+ InitViewElementIterator();
+ cTemplateViewElement *viewElement = NULL;
+ while(viewElement = GetNextViewElement()) {
+ viewElement->InitIterator();
+ cTemplatePixmap *pix = NULL;
+ while(pix = viewElement->GetNextPixmap()) {
+ pix->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = pix->GetNextFunction()) {
+ if (func->GetType() == ftDrawText || func->GetType() == ftDrawTextBox) {
+ string text = func->GetParameter(ptText);
+ string translation;
+ bool translated = globals->Translate(text, translation);
+ if (translated) {
+ func->SetTranslatedText(translation);
+ }
+ }
+ if (func->GetType() == ftLoop) {
+ cTemplateLoopFunction *funcsLoop = dynamic_cast<cTemplateLoopFunction*>(func);
+ funcsLoop->InitIterator();
+ cTemplateFunction *loopFunc = NULL;
+ while(loopFunc = funcsLoop->GetNextFunction()) {
+ if (loopFunc->GetType() == ftDrawText || loopFunc->GetType() == ftDrawTextBox) {
+ string text = loopFunc->GetParameter(ptText);
+ string translation;
+ bool translated = globals->Translate(text, translation);
+ if (translated) {
+ loopFunc->SetTranslatedText(translation);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ //Translate viewLists
+ InitViewListIterator();
+ cTemplateViewList *viewList = NULL;
+ while(viewList = GetNextViewList()) {
+ viewList->InitIterator();
+ cTemplatePixmap *pix = NULL;
+ while(pix = viewList->GetNextPixmap()) {
+ pix->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = pix->GetNextFunction()) {
+ if (func->GetType() == ftDrawText || func->GetType() == ftDrawTextBox) {
+ string text = func->GetParameter(ptText);
+ string translation;
+ bool translated = globals->Translate(text, translation);
+ if (translated) {
+ func->SetTranslatedText(translation);
+ }
+ }
+ }
+ }
+ cTemplateViewElement *listElement = viewList->GetListElement();
+ listElement->InitIterator();
+ while(pix = listElement->GetNextPixmap()) {
+ pix->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = pix->GetNextFunction()) {
+ if (func->GetType() == ftDrawText || func->GetType() == ftDrawTextBox) {
+ string text = func->GetParameter(ptText);
+ string translation;
+ bool translated = globals->Translate(text, translation);
+ if (translated) {
+ func->SetTranslatedText(translation);
+ }
+ }
+ }
+ }
+
+ cTemplateViewElement *listElementCurrent = viewList->GetListElementCurrent();
+ if (listElementCurrent) {
+ listElementCurrent->InitIterator();
+ while(pix = listElementCurrent->GetNextPixmap()) {
+ pix->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = pix->GetNextFunction()) {
+ if (func->GetType() == ftDrawText || func->GetType() == ftDrawTextBox) {
+ string text = func->GetParameter(ptText);
+ string translation;
+ bool translated = globals->Translate(text, translation);
+ if (translated) {
+ func->SetTranslatedText(translation);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //Translate viewTabs
+ InitViewTabIterator();
+ cTemplateViewTab *viewTab = NULL;
+ while(viewTab = GetNextViewTab()) {
+ string tabName = viewTab->GetName();
+ string tabTrans;
+ bool translated = globals->Translate(tabName, tabTrans);
+ if (translated) {
+ viewTab->SetName(tabTrans);
+ }
+ viewTab->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = viewTab->GetNextFunction()) {
+ if (func->GetType() == ftDrawText || func->GetType() == ftDrawTextBox) {
+ string text = func->GetParameter(ptText);
+ string translation;
+ translated = globals->Translate(text, translation);
+ if (translated) {
+ func->SetTranslatedText(translation);
+ }
+ }
+ if (func->GetType() == ftLoop) {
+ cTemplateLoopFunction *funcsLoop = dynamic_cast<cTemplateLoopFunction*>(func);
+ funcsLoop->InitIterator();
+ cTemplateFunction *loopFunc = NULL;
+ while(loopFunc = funcsLoop->GetNextFunction()) {
+ if (loopFunc->GetType() == ftDrawText || loopFunc->GetType() == ftDrawTextBox) {
+ string text = loopFunc->GetParameter(ptText);
+ string translation;
+ bool translated = globals->Translate(text, translation);
+ if (translated) {
+ loopFunc->SetTranslatedText(translation);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ //Translate Plugin Views
+ for (map < string, map< int, cTemplateView*> >::iterator it = pluginViews.begin(); it != pluginViews.end(); it++) {
+ map< int, cTemplateView*> plugViews = it->second;
+ for (map< int, cTemplateView*>::iterator it2 = plugViews.begin(); it2 != plugViews.end(); it2++) {
+ cTemplateView *pluginView = it2->second;
+ pluginView->Translate();
+ }
+ }
+
+ //Translate Subviews
+ InitSubViewIterator();
+ cTemplateView *subView = NULL;
+ while(subView = GetNextSubView()) {
+ subView->Translate();
+ }
+}
+
+void cTemplateView::PreCache(bool isSubview) {
+
+ if (!isSubview) {
+ int osdW = cOsd::OsdWidth();
+ int osdH = cOsd::OsdHeight();
+ parameters->SetContainer(0, 0, osdW, osdH);
+ } else {
+ parameters->SetContainer(containerX, containerY, containerWidth, containerHeight);
+ }
+ //Calculate OSD Size
+ parameters->CalculateParameters();
+
+ int osdX = parameters->GetNumericParameter(ptX);
+ int osdY = parameters->GetNumericParameter(ptY);
+ int osdWidth = parameters->GetNumericParameter(ptWidth);
+ int osdHeight = parameters->GetNumericParameter(ptHeight);
+ int pixOffset = 0;
+
+ //Cache ViewElements
+ for (map < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
+ cTemplateViewElement *viewElement = it->second;
+ viewElement->SetGlobals(globals);
+ if (!isSubview)
+ viewElement->SetContainer(0, 0, osdWidth, osdHeight);
+ else
+ viewElement->SetContainer(osdX, osdY, osdWidth, osdHeight);
+ viewElement->CalculateParameters();
+ viewElement->CalculatePixmapParameters();
+ viewElement->SetPixOffset(pixOffset);
+ pixOffset += viewElement->GetNumPixmaps();
+ }
+
+
+ //Cache ViewLists
+ for (map < eViewList, cTemplateViewList* >::iterator it = viewLists.begin(); it != viewLists.end(); it++) {
+ cTemplateViewList *viewList = it->second;
+ viewList->SetGlobals(globals);
+ //viewlists in subviews need complete container information
+ if (isSubview)
+ viewList->SetContainer(osdX, osdY, osdWidth, osdHeight);
+ else
+ viewList->SetContainer(0, 0, osdWidth, osdHeight);
+ viewList->CalculateParameters();
+ viewList->CalculateListParameters();
+ }
+
+ //Cache ViewTabs
+ for (vector<cTemplateViewTab*>::iterator tab = viewTabs.begin(); tab != viewTabs.end(); tab++) {
+ //viewtabs are only in subviews
+ (*tab)->SetContainer(osdX, osdY, osdWidth, osdHeight);
+ (*tab)->SetGlobals(globals);
+ (*tab)->CalculateParameters();
+ }
+
+ //Cache Subviews
+ for (map < eSubView, cTemplateView* >::iterator it = subViews.begin(); it != subViews.end(); it++) {
+ cTemplateView *subView = it->second;
+ subView->SetContainer(0, 0, osdWidth, osdHeight);
+ subView->PreCache(true);
+ }
+
+ //Cache Plugin Subviews
+ for (map < string, map< int, cTemplateView*> >::iterator it = pluginViews.begin(); it != pluginViews.end(); it++) {
+ map< int, cTemplateView*> plugViews = it->second;
+ for (map< int, cTemplateView*>::iterator it2 = plugViews.begin(); it2 != plugViews.end(); it2++) {
+ cTemplateView *plugView = it2->second;
+ plugView->SetContainer(0, 0, osdWidth, osdHeight);
+ plugView->PreCache(true);
+ }
+ }
+}
+
+void cTemplateView::Debug(void) {
+
+ esyslog("skindesigner: TemplateView %s", viewName.c_str());;
+
+ parameters->Debug();
+
+ for (map < eViewElement, cTemplateViewElement* >::iterator it = viewElements.begin(); it != viewElements.end(); it++) {
+ esyslog("skindesigner: ++++++++ ViewElement: %s", GetViewElementName(it->first).c_str());
+ cTemplateViewElement *viewElement = it->second;
+ viewElement->Debug();
+ }
+
+ for (map < eViewList, cTemplateViewList* >::iterator it = viewLists.begin(); it != viewLists.end(); it++) {
+ esyslog("skindesigner: ++++++++ ViewList: %s", GetViewListName(it->first).c_str());
+ cTemplateViewList *viewList = it->second;
+ viewList->Debug();
+ }
+
+ for (vector<cTemplateViewTab*>::iterator tab = viewTabs.begin(); tab != viewTabs.end(); tab++) {
+ esyslog("skindesigner: ++++++++ ViewTab");
+ (*tab)->Debug();
+ }
+
+ for (map < eSubView, cTemplateView* >::iterator it = subViews.begin(); it!= subViews.end(); it++) {
+ esyslog("skindesigner: ++++++++ SubView: %s", GetSubViewName(it->first).c_str());
+ cTemplateView *subView = it->second;
+ subView->Debug();
+ }
+
+ for (map < string, map< int, cTemplateView*> >::iterator it = pluginViews.begin(); it!= pluginViews.end(); it++) {
+ esyslog("skindesigner: ++++++++ Plugin: %s", it->first.c_str());
+ map< int, cTemplateView*> plugViews = it->second;
+ for (map< int, cTemplateView*>::iterator it2 = plugViews.begin(); it2 != plugViews.end(); it2++) {
+ esyslog("skindesigner: Tmpl %d", it2->first);
+ ((cTemplateView*)it2->second)->Debug();
+ }
+ }
+
+}
+
+
+void cTemplateView::SetFunctionDefinitions(void) {
+
+ string name = "viewelement";
+ set<string> attributes;
+ attributes.insert("debug");
+ attributes.insert("delay");
+ attributes.insert("fadetime");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+
+ name = "area";
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("condition");
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("layer");
+ attributes.insert("transparency");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+
+ name = "areascroll";
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("orientation");
+ attributes.insert("delay");
+ attributes.insert("mode");
+ attributes.insert("scrollspeed");
+ attributes.insert("condition");
+ attributes.insert("scrollelement");
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("layer");
+ attributes.insert("transparency");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+
+ name = "loop";
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("name");
+ attributes.insert("orientation");
+ attributes.insert("condition");
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("columnwidth");
+ attributes.insert("rowheight");
+ attributes.insert("overflow");
+ attributes.insert("maxitems");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+
+ name = "fill";
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("condition");
+ attributes.insert("color");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+
+ name = "drawtext";
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("condition");
+ attributes.insert("name");
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("align");
+ attributes.insert("valign");
+ attributes.insert("font");
+ attributes.insert("fontsize");
+ attributes.insert("color");
+ attributes.insert("text");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+
+ name = "drawtextbox";
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("condition");
+ attributes.insert("name");
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("align");
+ attributes.insert("maxlines");
+ attributes.insert("font");
+ attributes.insert("fontsize");
+ attributes.insert("color");
+ attributes.insert("text");
+ attributes.insert("float");
+ attributes.insert("floatwidth");
+ attributes.insert("floatheight");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+
+ name = "drawimage";
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("condition");
+ attributes.insert("name");
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("align");
+ attributes.insert("valign");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("imagetype");
+ attributes.insert("path");
+ attributes.insert("align");
+ attributes.insert("valign");
+ attributes.insert("cache");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+
+ name = "drawrectangle";
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("condition");
+ attributes.insert("name");
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("align");
+ attributes.insert("valign");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("color");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+
+ name = "drawellipse";
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("condition");
+ attributes.insert("name");
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("align");
+ attributes.insert("valign");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("color");
+ attributes.insert("quadrant");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+
+ name = "drawslope";
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("condition");
+ attributes.insert("name");
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("align");
+ attributes.insert("valign");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("color");
+ attributes.insert("type");
+ funcsAllowed.insert(pair< string, set<string> >(name, attributes));
+}
+
+/************************************************************************************
+* cTemplateViewChannel
+************************************************************************************/
+
+cTemplateViewChannel::cTemplateViewChannel(void) {
+
+ viewName = "displaychannel";
+ //definition of allowed parameters for class itself
+ set<string> attributes;
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(viewName, attributes));
+
+ SetViewElements();
+}
+
+cTemplateViewChannel::~cTemplateViewChannel() {
+}
+
+void cTemplateViewChannel::SetViewElements(void) {
+ viewElementsAllowed.insert("background");
+ viewElementsAllowed.insert("channelinfo");
+ viewElementsAllowed.insert("channelgroup");
+ viewElementsAllowed.insert("epginfo");
+ viewElementsAllowed.insert("progressbar");
+ viewElementsAllowed.insert("progressbarback");
+ viewElementsAllowed.insert("statusinfo");
+ viewElementsAllowed.insert("audioinfo");
+ viewElementsAllowed.insert("screenresolution");
+ viewElementsAllowed.insert("signalquality");
+ viewElementsAllowed.insert("signalqualityback");
+ viewElementsAllowed.insert("devices");
+ viewElementsAllowed.insert("currentweather");
+ viewElementsAllowed.insert("scrapercontent");
+ viewElementsAllowed.insert("datetime");
+ viewElementsAllowed.insert("time");
+ viewElementsAllowed.insert("message");
+ viewElementsAllowed.insert("customtokens");
+}
+
+string cTemplateViewChannel::GetViewElementName(eViewElement ve) {
+ string name;
+ switch (ve) {
+ case veBackground:
+ name = "Background";
+ break;
+ case veChannelInfo:
+ name = "ChannelInfo";
+ break;
+ case veChannelGroup:
+ name = "ChannelGroup";
+ break;
+ case veEpgInfo:
+ name = "EpgInfo";
+ break;
+ case veProgressBar:
+ name = "ProgressBar";
+ break;
+ case veProgressBarBack:
+ name = "ProgressBar Background";
+ break;
+ case veStatusInfo:
+ name = "StatusInfo";
+ break;
+ case veAudioInfo:
+ name = "AudioInfo";
+ break;
+ case veScreenResolution:
+ name = "Screen Resolution";
+ break;
+ case veSignalQuality:
+ name = "Signal Quality";
+ break;
+ case veSignalQualityBack:
+ name = "Signal Quality Background";
+ break;
+ case veDevices:
+ name = "Devices";
+ break;
+ case veCurrentWeather:
+ name = "Current Weather";
+ break;
+ case veScraperContent:
+ name = "Scraper Content";
+ break;
+ case veDateTime:
+ name = "DateTime";
+ break;
+ case veTime:
+ name = "Time";
+ break;
+ case veMessage:
+ name = "Message";
+ break;
+ case veCustomTokens:
+ name = "Custom Tokens";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+void cTemplateViewChannel::AddPixmap(string sViewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes) {
+ eViewElement ve = veUndefined;
+
+ if (!sViewElement.compare("background")) {
+ ve = veBackground;
+ } else if (!sViewElement.compare("channelinfo")) {
+ ve = veChannelInfo;
+ } else if (!sViewElement.compare("channelgroup")) {
+ ve = veChannelGroup;
+ } else if (!sViewElement.compare("epginfo")) {
+ ve = veEpgInfo;
+ } else if (!sViewElement.compare("progressbar")) {
+ ve = veProgressBar;
+ } else if (!sViewElement.compare("progressbarback")) {
+ ve = veProgressBarBack;
+ } else if (!sViewElement.compare("statusinfo")) {
+ ve = veStatusInfo;
+ } else if (!sViewElement.compare("audioinfo")) {
+ ve = veAudioInfo;
+ } else if (!sViewElement.compare("screenresolution")) {
+ ve = veScreenResolution;
+ } else if (!sViewElement.compare("signalquality")) {
+ ve = veSignalQuality;
+ } else if (!sViewElement.compare("signalqualityback")) {
+ ve = veSignalQualityBack;
+ } else if (!sViewElement.compare("devices")) {
+ ve = veDevices;
+ } else if (!sViewElement.compare("currentweather")) {
+ ve = veCurrentWeather;
+ } else if (!sViewElement.compare("scrapercontent")) {
+ ve = veScraperContent;
+ } else if (!sViewElement.compare("datetime")) {
+ ve = veDateTime;
+ } else if (!sViewElement.compare("time")) {
+ ve = veTime;
+ } else if (!sViewElement.compare("message")) {
+ ve = veMessage;
+ } else if (!sViewElement.compare("customtokens")) {
+ ve = veCustomTokens;
+ }
+
+ if (ve == veUndefined) {
+ esyslog("skindesigner: unknown ViewElement in displaychannel: %s", sViewElement.c_str());
+ return;
+ }
+
+ pix->SetGlobals(globals);
+
+ map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
+ if (hit == viewElements.end()) {
+ cTemplateViewElement *viewElement = new cTemplateViewElement();
+ viewElement->SetParameters(viewElementattributes);
+ viewElement->AddPixmap(pix);
+ viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
+ } else {
+ (hit->second)->AddPixmap(pix);
+ }
+}
+
+/************************************************************************************
+* cTemplateViewMenu
+************************************************************************************/
+
+cTemplateViewMenu::cTemplateViewMenu(void) {
+
+ viewName = "displaymenu";
+ //definition of allowed parameters for class itself
+ set<string> attributes;
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ funcsAllowed.insert(pair< string, set<string> >(viewName, attributes));
+
+ string subViewName = "menudefault";
+ //definition of allowed parameters for subtemplate menumain
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(subViewName, attributes));
+
+ subViewName = "menumain";
+ //definition of allowed parameters for subtemplate menumain
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(subViewName, attributes));
+
+ subViewName = "menusetup";
+ //definition of allowed parameters for subtemplate menumain
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(subViewName, attributes));
+
+ subViewName = "menuschedules";
+ //definition of allowed parameters for subtemplate menumain
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(subViewName, attributes));
+
+ subViewName = "menuchannels";
+ //definition of allowed parameters for subtemplate menumain
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(subViewName, attributes));
+
+ subViewName = "menutimers";
+ //definition of allowed parameters for subtemplate menumain
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(subViewName, attributes));
+
+ subViewName = "menurecordings";
+ //definition of allowed parameters for subtemplate menumain
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(subViewName, attributes));
+
+ subViewName = "menudetailedepg";
+ //definition of allowed parameters for subtemplate menumain
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(subViewName, attributes));
+
+ subViewName = "menudetailedrecording";
+ //definition of allowed parameters for subtemplate menumain
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(subViewName, attributes));
+
+ subViewName = "menudetailedtext";
+ //definition of allowed parameters for subtemplate menumain
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(subViewName, attributes));
+
+ //definition of allowed parameters for timerlist viewlist
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("orientation");
+ attributes.insert("align");
+ attributes.insert("numlistelements");
+ funcsAllowed.insert(pair< string, set<string> >("timerlist", attributes));
+
+ //definition of allowed parameters for menuitems viewlist
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("orientation");
+ attributes.insert("align");
+ attributes.insert("menuitemwidth");
+ attributes.insert("determinatefont");
+ attributes.insert("numlistelements");
+ funcsAllowed.insert(pair< string, set<string> >("menuitems", attributes));
+
+ //definition of allowed parameters for currentitems viewlist
+ attributes.clear();
+ attributes.insert("delay");
+ attributes.insert("fadetime");
+ funcsAllowed.insert(pair< string, set<string> >("currentelement", attributes));
+
+ //definition of allowed parameters for viewtab
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("name");
+ attributes.insert("condition");
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("layer");
+ attributes.insert("transparency");
+ attributes.insert("scrollheight");
+ funcsAllowed.insert(pair< string, set<string> >("tab", attributes));
+
+ //definition of allowed parameters for plugin menus
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >("menuplugin", attributes));
+
+ SetSubViews();
+ SetViewElements();
+ SetViewLists();
+
+}
+
+cTemplateViewMenu::~cTemplateViewMenu() {
+}
+
+void cTemplateViewMenu::SetSubViews(void) {
+ subViewsAllowed.insert("menudefault");
+ subViewsAllowed.insert("menumain");
+ subViewsAllowed.insert("menusetup");
+ subViewsAllowed.insert("menuschedules");
+ subViewsAllowed.insert("menutimers");
+ subViewsAllowed.insert("menurecordings");
+ subViewsAllowed.insert("menuchannels");
+ subViewsAllowed.insert("menudetailedepg");
+ subViewsAllowed.insert("menudetailedrecording");
+ subViewsAllowed.insert("menudetailedtext");
+}
+
+void cTemplateViewMenu::SetViewElements(void) {
+ viewElementsAllowed.insert("background");
+ viewElementsAllowed.insert("datetime");
+ viewElementsAllowed.insert("time");
+ viewElementsAllowed.insert("header");
+ viewElementsAllowed.insert("colorbuttons");
+ viewElementsAllowed.insert("message");
+ viewElementsAllowed.insert("discusage");
+ viewElementsAllowed.insert("systemload");
+ viewElementsAllowed.insert("temperatures");
+ viewElementsAllowed.insert("timers");
+ viewElementsAllowed.insert("devices");
+ viewElementsAllowed.insert("currentweather");
+ viewElementsAllowed.insert("currentschedule");
+ viewElementsAllowed.insert("customtokens");
+ viewElementsAllowed.insert("scrollbar");
+ viewElementsAllowed.insert("detailheader");
+ viewElementsAllowed.insert("tablabels");
+}
+
+void cTemplateViewMenu::SetViewLists(void) {
+ viewListsAllowed.insert("timerlist");
+ viewListsAllowed.insert("menuitems");
+}
+
+string cTemplateViewMenu::GetSubViewName(eSubView sv) {
+ string name;
+ switch (sv) {
+ case svMenuDefault:
+ name = "Default Menu";
+ break;
+ case svMenuMain:
+ name = "Main Menu";
+ break;
+ case svMenuSetup:
+ name = "Setup Menu";
+ break;
+ case svMenuSchedules:
+ name = "Schedules Menu";
+ break;
+ case svMenuTimers:
+ name = "Timers Menu";
+ break;
+ case svMenuRecordings:
+ name = "Recordings Menu";
+ break;
+ case svMenuChannels:
+ name = "Channels Menu";
+ break;
+ case svMenuDetailedEpg:
+ name = "Detailed EPG";
+ break;
+ case svMenuDetailedRecording:
+ name = "Detailed Recording";
+ break;
+ case svMenuDetailedText:
+ name = "Detailed Text";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+
+string cTemplateViewMenu::GetViewElementName(eViewElement ve) {
+ string name;
+ switch (ve) {
+ case veBackground:
+ name = "Background";
+ break;
+ case veDateTime:
+ name = "DateTime";
+ break;
+ case veTime:
+ name = "Time";
+ break;
+ case veHeader:
+ name = "Header";
+ break;
+ case veButtons:
+ name = "Color Buttons";
+ break;
+ case veMessage:
+ name = "Message";
+ break;
+ case veDiscUsage:
+ name = "Disc Usage";
+ break;
+ case veSystemLoad:
+ name = "System Load";
+ break;
+ case veTemperatures:
+ name = "Temperatures";
+ break;
+ case veTimers:
+ name = "Timers";
+ break;
+ case veCurrentSchedule:
+ name = "Current Schedule";
+ break;
+ case veCurrentWeather:
+ name = "Current Weather";
+ break;
+ case veCustomTokens:
+ name = "Custom Tokens";
+ break;
+ case veDevices:
+ name = "Devices";
+ break;
+ case veMenuItem:
+ name = "Menu Item";
+ break;
+ case veMenuCurrentItemDetail:
+ name = "Menu Current Item Detail";
+ break;
+ case veScrollbar:
+ name = "Scrollbar";
+ break;
+ case veDetailHeader:
+ name = "Detail header";
+ break;
+ case veTabLabels:
+ name = "tab labels";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+string cTemplateViewMenu::GetViewListName(eViewList vl) {
+ string name;
+ switch (vl) {
+ case vlTimerList:
+ name = "Timer List";
+ break;
+ case vlMenuItem:
+ name = "Menu Item";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+void cTemplateViewMenu::AddSubView(string sSubView, cTemplateView *subView) {
+ eSubView sv = svUndefined;
+
+ if (!sSubView.compare("menumain")) {
+ sv = svMenuMain;
+ } else if (!sSubView.compare("menudefault")) {
+ sv = svMenuDefault;
+ } else if (!sSubView.compare("menuschedules")) {
+ sv = svMenuSchedules;
+ } else if (!sSubView.compare("menusetup")) {
+ sv = svMenuSetup;
+ } else if (!sSubView.compare("menuschedules")) {
+ sv = svMenuSchedules;
+ } else if (!sSubView.compare("menutimers")) {
+ sv = svMenuTimers;
+ } else if (!sSubView.compare("menurecordings")) {
+ sv = svMenuRecordings;
+ } else if (!sSubView.compare("menuchannels")) {
+ sv = svMenuChannels;
+ } else if (!sSubView.compare("menudetailedepg")) {
+ sv = svMenuDetailedEpg;
+ } else if (!sSubView.compare("menudetailedrecording")) {
+ sv = svMenuDetailedRecording;
+ } else if (!sSubView.compare("menudetailedtext")) {
+ sv = svMenuDetailedText;
+ }
+
+ if (sv == svUndefined) {
+ esyslog("skindesigner: unknown SubView in displayMenu: %s", sSubView.c_str());
+ return;
+ }
+ subView->SetGlobals(globals);
+ subViews.insert(pair<eSubView, cTemplateView*>(sv, subView));
+}
+
+void cTemplateViewMenu::AddPluginView(string plugName, int templNo, cTemplateView *plugView) {
+ plugView->SetGlobals(globals);
+
+ map < string, map< int, cTemplateView*> >::iterator hit = pluginViews.find(plugName);
+
+ if (hit == pluginViews.end()) {
+ map< int, cTemplateView*> plugTemplates;
+ plugTemplates.insert(pair<int, cTemplateView*>(templNo, plugView));
+ pluginViews.insert(pair< string, map< int, cTemplateView*> >(plugName, plugTemplates));
+ } else {
+ hit->second.insert(pair<int, cTemplateView*>(templNo, plugView));
+ }
+}
+
+void cTemplateViewMenu::AddPixmap(string sViewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes) {
+ eViewElement ve = veUndefined;
+
+ if (!sViewElement.compare("background")) {
+ ve = veBackground;
+ } else if (!sViewElement.compare("datetime")) {
+ ve = veDateTime;
+ } else if (!sViewElement.compare("time")) {
+ ve = veTime;
+ } else if (!sViewElement.compare("header")) {
+ ve = veHeader;
+ } else if (!sViewElement.compare("colorbuttons")) {
+ ve = veButtons;
+ } else if (!sViewElement.compare("message")) {
+ ve = veMessage;
+ } else if (!sViewElement.compare("discusage")) {
+ ve = veDiscUsage;
+ } else if (!sViewElement.compare("systemload")) {
+ ve = veSystemLoad;
+ } else if (!sViewElement.compare("temperatures")) {
+ ve = veTemperatures;
+ } else if (!sViewElement.compare("timers")) {
+ ve = veTimers;
+ } else if (!sViewElement.compare("currentschedule")) {
+ ve = veCurrentSchedule;
+ } else if (!sViewElement.compare("customtokens")) {
+ ve = veCustomTokens;
+ } else if (!sViewElement.compare("devices")) {
+ ve = veDevices;
+ } else if (!sViewElement.compare("currentweather")) {
+ ve = veCurrentWeather;
+ } else if (!sViewElement.compare("scrollbar")) {
+ ve = veScrollbar;
+ } else if (!sViewElement.compare("detailheader")) {
+ ve = veDetailHeader;
+ } else if (!sViewElement.compare("tablabels")) {
+ ve = veTabLabels;
+ }
+
+ if (ve == veUndefined) {
+ esyslog("skindesigner: unknown ViewElement in displayMenu: %s", sViewElement.c_str());
+ return;
+ }
+
+ pix->SetGlobals(globals);
+
+ map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
+ if (hit == viewElements.end()) {
+ cTemplateViewElement *viewElement = new cTemplateViewElement();
+ viewElement->SetParameters(viewElementattributes);
+ if (viewElement->DebugTokens()) {
+ dsyslog("skindesigner: activating token debugging for view element %s", sViewElement.c_str());
+ }
+ viewElement->AddPixmap(pix);
+ viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
+ } else {
+ (hit->second)->AddPixmap(pix);
+ }
+}
+
+void cTemplateViewMenu::AddViewList(string sViewList, cTemplateViewList *viewList) {
+
+ eViewList vl = vlUndefined;
+ if (!sViewList.compare("timerlist")) {
+ vl = vlTimerList;
+ } else if (!sViewList.compare("menuitems")) {
+ vl = vlMenuItem;
+ }
+
+ if (vl == vlUndefined) {
+ esyslog("skindesigner: unknown ViewList in displaymenu: %s", sViewList.c_str());
+ return;
+ }
+
+ viewList->SetGlobals(globals);
+ viewLists.insert(pair< eViewList, cTemplateViewList*>(vl, viewList));
+}
+
+void cTemplateViewMenu::AddViewTab(cTemplateViewTab *viewTab) {
+ viewTabs.push_back(viewTab);
+}
+
+/************************************************************************************
+* cTemplateViewMessage
+************************************************************************************/
+
+cTemplateViewMessage::cTemplateViewMessage(void) {
+
+ viewName = "displaymessage";
+ //definition of allowed parameters for class itself
+ set<string> attributes;
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(viewName, attributes));
+
+ SetViewElements();
+}
+
+cTemplateViewMessage::~cTemplateViewMessage() {
+}
+
+void cTemplateViewMessage::SetViewElements(void) {
+ viewElementsAllowed.insert("background");
+ viewElementsAllowed.insert("message");
+}
+
+string cTemplateViewMessage::GetViewElementName(eViewElement ve) {
+ string name;
+ switch (ve) {
+ case veBackground:
+ name = "Background";
+ break;
+ case veMessage:
+ name = "Message";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+void cTemplateViewMessage::AddPixmap(string sViewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes) {
+ eViewElement ve = veUndefined;
+
+ if (!sViewElement.compare("background")) {
+ ve = veBackground;
+ } else if (!sViewElement.compare("message")) {
+ ve = veMessage;
+ }
+
+ if (ve == veUndefined) {
+ esyslog("skindesigner: unknown ViewElement in displaymessage: %s", sViewElement.c_str());
+ return;
+ }
+
+ pix->SetGlobals(globals);
+
+ map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
+ if (hit == viewElements.end()) {
+ cTemplateViewElement *viewElement = new cTemplateViewElement();
+ viewElement->SetParameters(viewElementattributes);
+ viewElement->AddPixmap(pix);
+ viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
+ } else {
+ (hit->second)->AddPixmap(pix);
+ }
+}
+
+/************************************************************************************
+* cTemplateViewReplay
+************************************************************************************/
+
+cTemplateViewReplay::cTemplateViewReplay(void) {
+
+ viewName = "displayreplay";
+ //definition of allowed parameters for class itself
+ set<string> attributes;
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(viewName, attributes));
+
+ //definition of allowed parameters for onpause and onpausemodeonly viewelement
+ attributes.clear();
+ attributes.insert("debug");
+ attributes.insert("delay");
+ attributes.insert("fadetime");
+ funcsAllowed.insert(pair< string, set<string> >("onpause", attributes));
+ funcsAllowed.insert(pair< string, set<string> >("onpausemodeonly", attributes));
+
+ SetViewElements();
+}
+
+cTemplateViewReplay::~cTemplateViewReplay() {
+}
+
+void cTemplateViewReplay::SetViewElements(void) {
+ viewElementsAllowed.insert("background");
+ viewElementsAllowed.insert("backgroundmodeonly");
+ viewElementsAllowed.insert("datetime");
+ viewElementsAllowed.insert("time");
+ viewElementsAllowed.insert("rectitle");
+ viewElementsAllowed.insert("recinfo");
+ viewElementsAllowed.insert("scrapercontent");
+ viewElementsAllowed.insert("currenttime");
+ viewElementsAllowed.insert("totaltime");
+ viewElementsAllowed.insert("progressbar");
+ viewElementsAllowed.insert("cutmarks");
+ viewElementsAllowed.insert("controlicons");
+ viewElementsAllowed.insert("controliconsmodeonly");
+ viewElementsAllowed.insert("jump");
+ viewElementsAllowed.insert("message");
+ viewElementsAllowed.insert("onpause");
+ viewElementsAllowed.insert("onpausemodeonly");
+ viewElementsAllowed.insert("customtokens");
+}
+
+string cTemplateViewReplay::GetViewElementName(eViewElement ve) {
+ string name;
+ switch (ve) {
+ case veBackground:
+ name = "Background";
+ break;
+ case veDateTime:
+ name = "DateTime";
+ break;
+ case veTime:
+ name = "DateTime";
+ break;
+ case veRecTitle:
+ name = "Recording Title";
+ break;
+ case veRecInfo:
+ name = "Recording Information";
+ break;
+ case veRecCurrent:
+ name = "Recording current Time";
+ break;
+ case veRecTotal:
+ name = "Recording total Time";
+ break;
+ case veRecProgressBar:
+ name = "Rec Progress Bar";
+ break;
+ case veCuttingMarks:
+ name = "Cutting Marks";
+ break;
+ case veControlIcons:
+ name = "Control Icons";
+ break;
+ case veControlIconsModeOnly:
+ name = "Control Icons Mode only";
+ break;
+ case veBackgroundModeOnly:
+ name = "Background Mode only";
+ break;
+ case veRecJump:
+ name = "Recording Jump";
+ break;
+ case veScraperContent:
+ name = "Scraper Content";
+ break;
+ case veOnPause:
+ name = "On Pause";
+ break;
+ case veOnPauseModeOnly:
+ name = "On Pause Mode Only";
+ break;
+ case veCustomTokens:
+ name = "Custom Tokens";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+void cTemplateViewReplay::AddPixmap(string sViewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes) {
+ eViewElement ve = veUndefined;
+
+ if (!sViewElement.compare("background")) {
+ ve = veBackground;
+ } else if (!sViewElement.compare("datetime")) {
+ ve = veDateTime;
+ } else if (!sViewElement.compare("time")) {
+ ve = veTime;
+ } else if (!sViewElement.compare("rectitle")) {
+ ve = veRecTitle;
+ } else if (!sViewElement.compare("recinfo")) {
+ ve = veRecInfo;
+ } else if (!sViewElement.compare("scrapercontent")) {
+ ve = veScraperContent;
+ } else if (!sViewElement.compare("currenttime")) {
+ ve = veRecCurrent;
+ } else if (!sViewElement.compare("totaltime")) {
+ ve = veRecTotal;
+ } else if (!sViewElement.compare("progressbar")) {
+ ve = veRecProgressBar;
+ } else if (!sViewElement.compare("cutmarks")) {
+ ve = veCuttingMarks;
+ } else if (!sViewElement.compare("controlicons")) {
+ ve = veControlIcons;
+ } else if (!sViewElement.compare("controliconsmodeonly")) {
+ ve = veControlIconsModeOnly;
+ } else if (!sViewElement.compare("backgroundmodeonly")) {
+ ve = veBackgroundModeOnly;
+ } else if (!sViewElement.compare("jump")) {
+ ve = veRecJump;
+ } else if (!sViewElement.compare("message")) {
+ ve = veMessage;
+ } else if (!sViewElement.compare("onpause")) {
+ ve = veOnPause;
+ } else if (!sViewElement.compare("onpausemodeonly")) {
+ ve = veOnPauseModeOnly;
+ } else if (!sViewElement.compare("customtokens")) {
+ ve = veCustomTokens;
+ }
+
+ if (ve == veUndefined) {
+ esyslog("skindesigner: unknown ViewElement in displayreplay: %s", sViewElement.c_str());
+ return;
+ }
+
+ pix->SetGlobals(globals);
+
+ map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
+ if (hit == viewElements.end()) {
+ cTemplateViewElement *viewElement = new cTemplateViewElement();
+ viewElement->SetParameters(viewElementattributes);
+ viewElement->AddPixmap(pix);
+ viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
+ } else {
+ (hit->second)->AddPixmap(pix);
+ }
+}
+
+
+/************************************************************************************
+* cTemplateViewVolume
+************************************************************************************/
+
+cTemplateViewVolume::cTemplateViewVolume(void) {
+
+ viewName = "displayvolume";
+ //definition of allowed parameters for class itself
+ set<string> attributes;
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(viewName, attributes));
+
+ SetViewElements();
+}
+
+cTemplateViewVolume::~cTemplateViewVolume() {
+}
+
+void cTemplateViewVolume::SetViewElements(void) {
+ viewElementsAllowed.insert("background");
+ viewElementsAllowed.insert("volume");
+}
+
+string cTemplateViewVolume::GetViewElementName(eViewElement ve) {
+ string name;
+ switch (ve) {
+ case veBackground:
+ name = "Background";
+ break;
+ case veVolume:
+ name = "Volume";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+void cTemplateViewVolume::AddPixmap(string sViewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes) {
+ eViewElement ve = veUndefined;
+
+ if (!sViewElement.compare("background")) {
+ ve = veBackground;
+ } else if (!sViewElement.compare("volume")) {
+ ve = veVolume;
+ }
+
+ if (ve == veUndefined) {
+ esyslog("skindesigner: unknown ViewElement in displayvolume: %s", sViewElement.c_str());
+ return;
+ }
+
+ pix->SetGlobals(globals);
+
+ map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
+ if (hit == viewElements.end()) {
+ cTemplateViewElement *viewElement = new cTemplateViewElement();
+ viewElement->SetParameters(viewElementattributes);
+ viewElement->AddPixmap(pix);
+ viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
+ } else {
+ (hit->second)->AddPixmap(pix);
+ }
+}
+
+/************************************************************************************
+* cTemplateViewAudioTracks
+************************************************************************************/
+
+cTemplateViewAudioTracks::cTemplateViewAudioTracks(void) {
+
+ viewName = "displayaudiotracks";
+ //definition of allowed parameters for class itself
+ set<string> attributes;
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("fadetime");
+ attributes.insert("scaletvx");
+ attributes.insert("scaletvy");
+ attributes.insert("scaletvwidth");
+ attributes.insert("scaletvheight");
+ funcsAllowed.insert(pair< string, set<string> >(viewName, attributes));
+
+ //definition of allowed parameters for menuitems viewlist
+ attributes.clear();
+ attributes.insert("x");
+ attributes.insert("y");
+ attributes.insert("width");
+ attributes.insert("height");
+ attributes.insert("orientation");
+ attributes.insert("align");
+ attributes.insert("menuitemwidth");
+ attributes.insert("numlistelements");
+ funcsAllowed.insert(pair< string, set<string> >("menuitems", attributes));
+
+ SetViewElements();
+ SetViewLists();
+}
+
+cTemplateViewAudioTracks::~cTemplateViewAudioTracks() {
+}
+
+void cTemplateViewAudioTracks::SetViewElements(void) {
+ viewElementsAllowed.insert("background");
+ viewElementsAllowed.insert("header");
+}
+
+void cTemplateViewAudioTracks::SetViewLists(void) {
+ viewListsAllowed.insert("menuitems");
+}
+
+string cTemplateViewAudioTracks::GetViewElementName(eViewElement ve) {
+ string name;
+ switch (ve) {
+ case veBackground:
+ name = "Background";
+ break;
+ case veHeader:
+ name = "Header";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+string cTemplateViewAudioTracks::GetViewListName(eViewList vl) {
+ string name;
+ switch (vl) {
+ case vlMenuItem:
+ name = "Menu Item";
+ break;
+ default:
+ name = "Unknown";
+ break;
+ };
+ return name;
+}
+
+void cTemplateViewAudioTracks::AddPixmap(string sViewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes) {
+ eViewElement ve = veUndefined;
+
+ if (!sViewElement.compare("background")) {
+ ve = veBackground;
+ } else if(!sViewElement.compare("header")) {
+ ve = veHeader;
+ }
+
+ if (ve == veUndefined) {
+ esyslog("skindesigner: unknown ViewElement in displayaudiotracks: %s", sViewElement.c_str());
+ return;
+ }
+
+ pix->SetGlobals(globals);
+
+ map < eViewElement, cTemplateViewElement* >::iterator hit = viewElements.find(ve);
+ if (hit == viewElements.end()) {
+ cTemplateViewElement *viewElement = new cTemplateViewElement();
+ viewElement->SetParameters(viewElementattributes);
+ viewElement->AddPixmap(pix);
+ viewElements.insert(pair< eViewElement, cTemplateViewElement*>(ve, viewElement));
+ } else {
+ (hit->second)->AddPixmap(pix);
+ }
+}
+
+void cTemplateViewAudioTracks::AddViewList(string sViewList, cTemplateViewList *viewList) {
+
+ eViewList vl = vlUndefined;
+ if (!sViewList.compare("menuitems")) {
+ vl = vlMenuItem;
+ }
+
+ if (vl == vlUndefined) {
+ esyslog("skindesigner: unknown ViewList in displaymenu: %s", sViewList.c_str());
+ return;
+ }
+
+ viewList->SetGlobals(globals);
+ viewLists.insert(pair< eViewList, cTemplateViewList*>(vl, viewList));
+}
diff --git a/libtemplate/templateview.h b/libtemplate/templateview.h
new file mode 100644
index 0000000..1cd4289
--- /dev/null
+++ b/libtemplate/templateview.h
@@ -0,0 +1,207 @@
+#ifndef __TEMPLATEVIEW_H
+#define __TEMPLATEVIEW_H
+
+#include <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+
+#include "templateviewelement.h"
+#include "templateviewlist.h"
+#include "templatepixmap.h"
+#include "templateviewtab.h"
+#include "templatefunction.h"
+
+using namespace std;
+
+// --- cTemplateView -------------------------------------------------------------
+
+enum eSubView {
+ svUndefined,
+ svMenuDefault,
+ svMenuMain,
+ svMenuSetup,
+ svMenuSchedules,
+ svMenuTimers,
+ svMenuRecordings,
+ svMenuChannels,
+ svMenuDetailedEpg,
+ svMenuDetailedRecording,
+ svMenuDetailedText,
+ svMenuPlugin,
+};
+
+class cTemplateView {
+private:
+protected:
+ cGlobals *globals;
+ //view parameters
+ string viewName;
+ cTemplateFunction *parameters;
+ int containerX;
+ int containerY;
+ int containerWidth;
+ int containerHeight;
+ //basic view data structures
+ map < eViewElement, cTemplateViewElement* > viewElements;
+ map < eViewList, cTemplateViewList* > viewLists;
+ map < eSubView, cTemplateView* > subViews;
+ vector< cTemplateViewTab* > viewTabs;
+ map < string, map< int, cTemplateView*> > pluginViews;
+ //helpers to iterate data structures
+ map < eViewElement, cTemplateViewElement* >::iterator veIt;
+ map < eViewList, cTemplateViewList* >::iterator vlIt;
+ map < eSubView, cTemplateView* >::iterator svIt;
+ vector< cTemplateViewTab* >::iterator vtIt;
+ //helpers to check valid xml templates
+ set<string> subViewsAllowed;
+ set<string> viewElementsAllowed;
+ set<string> viewListsAllowed;
+ map < string, set < string > > funcsAllowed;
+ void SetFunctionDefinitions(void);
+public:
+ cTemplateView(void);
+ virtual ~cTemplateView(void);
+ virtual string GetSubViewName(eSubView sv) { return ""; };
+ virtual string GetViewElementName(eViewElement ve) { return ""; };
+ virtual string GetViewListName(eViewList vl) { return ""; };
+ virtual void AddSubView(string sSubView, cTemplateView *subView) {};
+ virtual void AddPluginView(string plugName, int templNo, cTemplateView *plugView) {};
+ virtual void AddPixmap(string sViewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes) {};
+ virtual void AddViewList(string sViewList, cTemplateViewList *viewList) {};
+ virtual void AddViewTab(cTemplateViewTab *viewTab) {};
+ //Setter Functions
+ void SetGlobals(cGlobals *globals) { this->globals = globals; };
+ void SetParameters(vector<pair<string, string> > ¶ms);
+ void SetContainer(int x, int y, int width, int height);
+ //access view elements
+ cTemplateViewElement *GetViewElement(eViewElement ve);
+ void InitViewElementIterator(void);
+ cTemplateViewElement *GetNextViewElement(void);
+ //access list elements
+ cTemplateViewList *GetViewList(eViewList vl);
+ void InitViewListIterator(void);
+ cTemplateViewList *GetNextViewList(void);
+ bool IsListView(void) { return viewLists.size() > 0 ? true : false; };
+ //access tabs
+ void InitViewTabIterator(void);
+ cTemplateViewTab *GetNextViewTab(void);
+ //access sub views
+ cTemplateView *GetSubView(eSubView sv);
+ void InitSubViewIterator(void);
+ cTemplateView *GetNextSubView(void);
+ //access plugin views
+ cTemplateView *GetPluginView(string pluginName, int pluginMenu);
+ //Getter Functions
+ const char *GetViewName(void) { return viewName.c_str(); };
+ int GetNumericParameter(eParamType type);
+ cRect GetOsdSize(void);
+ int GetNumPixmaps(void);
+ int GetNumPixmapsViewElement(eViewElement ve);
+ int GetNumListViewMenuItems(void);
+ bool GetScalingWindow(cRect &scalingWindow);
+ map<string,string> GetCustomStringTokens(void) { return globals->GetCustomStringTokens(); };
+ map<string,int> GetCustomIntTokens(void) { return globals->GetCustomIntTokens(); };
+ //Checks for parsing template XML files
+ bool ValidSubView(const char *subView);
+ bool ValidViewElement(const char *viewElement);
+ bool ValidViewList(const char *viewList);
+ bool ValidFunction(const char *func);
+ bool ValidAttribute(const char *func, const char *att);
+ //Caching
+ void Translate(void);
+ void PreCache(bool isSubview);
+ //Debug
+ void Debug(void);
+};
+
+// --- cTemplateViewChannel -------------------------------------------------------------
+
+class cTemplateViewChannel : public cTemplateView {
+private:
+ void SetViewElements(void);
+ void SetViewLists(void);
+public:
+ cTemplateViewChannel(void);
+ virtual ~cTemplateViewChannel(void);
+ string GetViewElementName(eViewElement ve);
+ void AddPixmap(string viewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes);
+};
+
+// --- cTemplateViewMenu -------------------------------------------------------------
+
+class cTemplateViewMenu : public cTemplateView {
+private:
+ void SetSubViews(void);
+ void SetViewElements(void);
+ void SetViewLists(void);
+public:
+ cTemplateViewMenu(void);
+ virtual ~cTemplateViewMenu(void);
+ string GetSubViewName(eSubView sv);
+ string GetViewElementName(eViewElement ve);
+ string GetViewListName(eViewList vl);
+ void AddSubView(string sSubView, cTemplateView *subView);
+ void AddPluginView(string plugName, int templNo, cTemplateView *plugView);
+ void AddPixmap(string viewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes);
+ void AddViewList(string sViewList, cTemplateViewList *viewList);
+ void AddViewTab(cTemplateViewTab *viewTab);
+};
+
+// --- cTemplateViewMessage -------------------------------------------------------------
+
+class cTemplateViewMessage : public cTemplateView {
+private:
+ void SetViewElements(void);
+public:
+ cTemplateViewMessage(void);
+ virtual ~cTemplateViewMessage(void);
+ string GetViewElementName(eViewElement ve);
+ void AddPixmap(string viewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes);
+};
+
+// --- cTemplateViewReplay -------------------------------------------------------------
+
+class cTemplateViewReplay : public cTemplateView {
+private:
+ void SetViewElements(void);
+public:
+ cTemplateViewReplay(void);
+ virtual ~cTemplateViewReplay(void);
+ string GetViewElementName(eViewElement ve);
+ void AddPixmap(string viewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes);
+};
+
+// --- cTemplateViewVolume -------------------------------------------------------------
+
+class cTemplateViewVolume : public cTemplateView {
+private:
+ void SetViewElements(void);
+public:
+ cTemplateViewVolume(void);
+ virtual ~cTemplateViewVolume(void);
+ string GetViewElementName(eViewElement ve);
+ void AddPixmap(string viewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes);
+};
+
+// --- cTemplateViewAudioTracks -------------------------------------------------------------
+
+class cTemplateViewAudioTracks : public cTemplateView {
+private:
+ void SetViewElements(void);
+ void SetViewLists(void);
+public:
+ cTemplateViewAudioTracks(void);
+ virtual ~cTemplateViewAudioTracks(void);
+ string GetViewElementName(eViewElement ve);
+ string GetViewListName(eViewList vl);
+ void AddPixmap(string viewElement, cTemplatePixmap *pix, vector<pair<string, string> > &viewElementattributes);
+ void AddViewList(string sViewList, cTemplateViewList *viewList);
+};
+
+#endif //__TEMPLATEVIEW_H
diff --git a/libtemplate/templateviewelement.c b/libtemplate/templateviewelement.c
new file mode 100644
index 0000000..1a2ef6e
--- /dev/null
+++ b/libtemplate/templateviewelement.c
@@ -0,0 +1,135 @@
+#include "templateviewelement.h"
+#include "../config.h"
+
+cTemplateViewElement::cTemplateViewElement(void) {
+ debugTokens = false;
+ parameters = NULL;
+ containerX = 0;
+ containerY = 0;
+ containerWidth = 0;
+ containerHeight = 0;
+ pixOffset = -1;
+}
+
+cTemplateViewElement::~cTemplateViewElement(void) {
+ if (parameters)
+ delete parameters;
+ for (vector<cTemplatePixmap*>::iterator it = viewPixmaps.begin(); it != viewPixmaps.end(); it++) {
+ delete (*it);
+ }
+}
+
+void cTemplateViewElement::SetContainer(int x, int y, int width, int height) {
+ containerX = x;
+ containerY = y;
+ containerWidth = width;
+ containerHeight = height;
+}
+
+void cTemplateViewElement::SetGlobals(cGlobals *globals) {
+ this->globals = globals;
+ for (vector<cTemplatePixmap*>::iterator pix = viewPixmaps.begin(); pix != viewPixmaps.end(); pix++) {
+ (*pix)->SetGlobals(globals);
+ }
+}
+
+void cTemplateViewElement::SetParameters(vector<pair<string, string> > ¶ms) {
+ parameters = new cTemplateFunction(ftViewElement);
+ parameters->SetGlobals(globals);
+ parameters->SetParameters(params);
+}
+
+bool cTemplateViewElement::CalculateParameters(void) {
+ if (!parameters)
+ return true;
+ bool paramsValid = true;
+ parameters->SetContainer(containerX, containerY, containerWidth, containerHeight);
+ parameters->SetGlobals(globals);
+ paramsValid = parameters->CalculateParameters();
+
+ return paramsValid;
+}
+
+bool cTemplateViewElement::CalculatePixmapParameters(void) {
+ bool paramsValid = true;
+ for (vector<cTemplatePixmap*>::iterator pix = viewPixmaps.begin(); pix != viewPixmaps.end(); pix++) {
+ (*pix)->SetContainer(containerX, containerY, containerWidth, containerHeight);
+ (*pix)->SetGlobals(globals);
+ paramsValid = paramsValid && (*pix)->CalculateParameters();
+ }
+ return paramsValid;
+}
+
+bool cTemplateViewElement::CalculatePixmapParametersList(int orientation, int numElements) {
+ bool paramsValid = true;
+ for (vector<cTemplatePixmap*>::iterator pix = viewPixmaps.begin(); pix != viewPixmaps.end(); pix++) {
+ (*pix)->SetContainer(containerX, containerY, containerWidth, containerHeight);
+ (*pix)->SetGlobals(globals);
+ if (orientation == orHorizontal) {
+ if (numElements > 0) {
+ int width = containerWidth / numElements;
+ (*pix)->SetWidth(width);
+ }
+ } else if (orientation == orVertical) {
+ if (numElements > 0) {
+ int height = containerHeight / numElements;
+ (*pix)->SetHeight(height);
+ }
+ }
+ paramsValid = paramsValid && (*pix)->CalculateParameters();
+ }
+ return paramsValid;
+}
+
+int cTemplateViewElement::GetNumericParameter(eParamType type) {
+ if (!parameters)
+ return -1;
+ return parameters->GetNumericParameter(type);
+}
+
+void cTemplateViewElement::InitIterator(void) {
+ pixIterator = viewPixmaps.begin();
+}
+
+cTemplatePixmap *cTemplateViewElement::GetNextPixmap(void) {
+ if (pixIterator == viewPixmaps.end())
+ return NULL;
+ cTemplatePixmap *pix = *pixIterator;
+ pixIterator++;
+ return pix;
+}
+
+cTemplateFunction *cTemplateViewElement::GetFunction(string name) {
+ InitIterator();
+ cTemplatePixmap *pix = NULL;
+ while (pix = GetNextPixmap()) {
+ pix->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = pix->GetNextFunction()) {
+ if (func->GetType() == ftDrawText) {
+ string funcName = func->GetParameter(ptName);
+ if (!funcName.compare(name))
+ return func;
+ } else {
+ continue;
+ }
+ }
+ }
+ return NULL;
+}
+
+bool cTemplateViewElement::DebugTokens(void) {
+ if (!parameters)
+ return false;
+ return parameters->DoDebug();
+}
+
+
+void cTemplateViewElement::Debug(void) {
+ esyslog("skindesigner: viewelement container size x: %d, y: %d, width: %d, height %d", containerX, containerY, containerWidth, containerHeight);
+ if (parameters)
+ parameters->Debug();
+ for (vector<cTemplatePixmap*>::iterator it = viewPixmaps.begin(); it != viewPixmaps.end(); it++) {
+ (*it)->Debug();
+ }
+}
\ No newline at end of file
diff --git a/libtemplate/templateviewelement.h b/libtemplate/templateviewelement.h
new file mode 100644
index 0000000..744c87a
--- /dev/null
+++ b/libtemplate/templateviewelement.h
@@ -0,0 +1,106 @@
+#ifndef __TEMPLATEVIEWELEMENT_H
+#define __TEMPLATEVIEWELEMENT_H
+
+#include <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+
+#include "templatepixmap.h"
+#include "templatefunction.h"
+
+using namespace std;
+
+// --- cTemplateViewElement -------------------------------------------------------------
+
+enum eViewElement {
+ //Common ViewElements
+ veUndefined,
+ veBackground,
+ veDateTime,
+ veTime,
+ veMessage,
+ veDevices,
+ veCurrentWeather,
+ veCustomTokens,
+ //DisplayChannel ViewElements
+ veChannelInfo,
+ veChannelGroup,
+ veEpgInfo,
+ veProgressBar,
+ veProgressBarBack,
+ veStatusInfo,
+ veAudioInfo,
+ veScreenResolution,
+ veSignalQuality,
+ veSignalQualityBack,
+ veScraperContent,
+ //DisplayMenu ViewElements
+ veHeader,
+ veButtons,
+ veDiscUsage,
+ veSystemLoad,
+ veTemperatures,
+ veTimers,
+ veCurrentSchedule,
+ veMenuItem,
+ veMenuCurrentItemDetail,
+ veScrollbar,
+ veDetailHeader,
+ veTabLabels,
+ //DisplayReplay ViewElements
+ veRecTitle,
+ veRecInfo,
+ veRecCurrent,
+ veRecTotal,
+ veRecProgressBar,
+ veCuttingMarks,
+ veControlIcons,
+ veControlIconsModeOnly,
+ veBackgroundModeOnly,
+ veRecJump,
+ veOnPause,
+ veOnPauseModeOnly,
+ //DisplayVolume ViewElements
+ veVolume
+};
+
+class cTemplateViewElement {
+protected:
+ bool debugTokens;
+ cGlobals *globals;
+ cTemplateFunction *parameters;
+ int containerX;
+ int containerY;
+ int containerWidth;
+ int containerHeight;
+ vector<cTemplatePixmap*> viewPixmaps;
+ vector<cTemplatePixmap*>::iterator pixIterator;
+ int pixOffset;
+public:
+ cTemplateViewElement(void);
+ virtual ~cTemplateViewElement(void);
+ void SetParameters(vector<pair<string, string> > ¶ms);
+ bool CalculateParameters(void);
+ bool CalculatePixmapParameters(void);
+ bool CalculatePixmapParametersList(int orientation, int numElements);
+ int GetNumericParameter(eParamType type);
+ void AddPixmap(cTemplatePixmap *pix) { viewPixmaps.push_back(pix); };
+ virtual void SetGlobals(cGlobals *globals);
+ void SetContainer(int x, int y, int width, int height);
+ void SetPixOffset(int offset) { pixOffset = offset; };
+ int GetPixOffset(void) { return pixOffset; };
+ virtual int GetNumPixmaps(void) { return viewPixmaps.size(); };
+ void InitIterator(void);
+ cTemplatePixmap *GetNextPixmap(void);
+ cTemplateFunction *GetFunction(string name);
+ bool DebugTokens(void);
+ virtual void Debug(void);
+};
+
+#endif //__TEMPLATEVIEWELEMENT_H
\ No newline at end of file
diff --git a/libtemplate/templateviewlist.c b/libtemplate/templateviewlist.c
new file mode 100644
index 0000000..0a6cabc
--- /dev/null
+++ b/libtemplate/templateviewlist.c
@@ -0,0 +1,177 @@
+#include "templateviewlist.h"
+#include "../config.h"
+#include "../libcore/helpers.h"
+
+cTemplateViewList::cTemplateViewList(void) : cTemplateViewElement() {
+ listElement = NULL;
+ currentElement = NULL;
+}
+
+cTemplateViewList::~cTemplateViewList(void) {
+ if (listElement)
+ delete listElement;
+ if (currentElement)
+ delete currentElement;
+}
+
+void cTemplateViewList::SetGlobals(cGlobals *globals) {
+ cTemplateViewElement::SetGlobals(globals);
+ if (listElement)
+ listElement->SetGlobals(globals);
+ if (currentElement)
+ currentElement->SetGlobals(globals);
+}
+
+bool cTemplateViewList::CalculateListParameters(void) {
+ if (!parameters)
+ return false;
+ parameters->SetContainer(containerX, containerY, containerWidth, containerHeight);
+ parameters->SetGlobals(globals);
+ bool paramsValid = parameters->CalculateParameters();
+ if (!listElement)
+ return false;
+ listElement->SetContainer(parameters->GetNumericParameter(ptX),
+ parameters->GetNumericParameter(ptY),
+ parameters->GetNumericParameter(ptWidth),
+ parameters->GetNumericParameter(ptHeight));
+ paramsValid = listElement->CalculateParameters();
+ paramsValid = listElement->CalculatePixmapParametersList(parameters->GetNumericParameter(ptOrientation),
+ parameters->GetNumericParameter(ptNumElements));
+ if (!currentElement)
+ return paramsValid;
+ currentElement->SetContainer(parameters->GetNumericParameter(ptX),
+ parameters->GetNumericParameter(ptY),
+ parameters->GetNumericParameter(ptWidth),
+ parameters->GetNumericParameter(ptHeight));
+ paramsValid = currentElement->CalculateParameters();
+ paramsValid = currentElement->CalculatePixmapParameters();
+ currentElement->SetPixOffset(0);
+ return paramsValid;
+}
+
+bool cTemplateViewList::CalculateListParameters(map < string, int > *intTokens) {
+ if (!parameters)
+ return false;
+ parameters->ClearDynamicParameters();
+ parameters->SetIntTokens(intTokens);
+ parameters->ParseParameters();
+ parameters->UnsetIntTokens();
+
+ listElement->SetContainer(parameters->GetNumericParameter(ptX),
+ parameters->GetNumericParameter(ptY),
+ parameters->GetNumericParameter(ptWidth),
+ parameters->GetNumericParameter(ptHeight));
+ bool paramsValid = listElement->CalculateParameters();
+ paramsValid = listElement->CalculatePixmapParametersList(parameters->GetNumericParameter(ptOrientation),
+ parameters->GetNumericParameter(ptNumElements));
+ return paramsValid;
+}
+
+int cTemplateViewList::GetAverageFontWidth(void) {
+ int defaultAverageFontWidth = 20;
+
+ if (!listElement)
+ return defaultAverageFontWidth;
+
+ int numItems = GetNumericParameter(ptNumElements);
+ int listHeight = GetNumericParameter(ptHeight);
+ if (listHeight <= 0)
+ return defaultAverageFontWidth;
+ int itemHeight = (double)listHeight / (double)numItems;
+ string fontFuncName = parameters->GetParameter(ptDeterminateFont);
+
+ cTemplateFunction *fontFunc = listElement->GetFunction(fontFuncName);
+ if (!fontFunc)
+ return defaultAverageFontWidth;
+
+ string fontNameToken = fontFunc->GetParameter(ptFont);
+ string paramFontSize = fontFunc->GetParameter(ptFontSize);
+
+ string fontName = "";
+ if (IsToken(fontNameToken)) {
+ if (!globals->GetFont(fontNameToken, fontName)) {
+ if (!globals->GetFont("{vdrOsd}", fontName)) {
+ return defaultAverageFontWidth;
+ }
+ }
+ } else {
+ //if no token, directly use input
+ fontName = fontNameToken;
+ }
+
+ cNumericParameter pFontSize(paramFontSize);
+ pFontSize.SetGlobals(globals);
+ pFontSize.SetAreaSize(1000, itemHeight);
+ pFontSize.SetVertical();
+ int fontSize = pFontSize.Parse(paramFontSize);
+ if (!pFontSize.Valid())
+ return defaultAverageFontWidth;
+
+ int averageFontWidth = fontManager->Width(fontName, fontSize, "x") + 3;
+ return averageFontWidth;
+}
+
+cFont *cTemplateViewList::GetTextAreaFont(void) {
+ if (!listElement)
+ return NULL;
+
+ int fontWidth = 0;
+ int numItems = GetNumericParameter(ptNumElements);
+ int listHeight = GetNumericParameter(ptHeight);
+ if (listHeight <= 0)
+ return NULL;
+ int itemHeight = (double)listHeight / (double)numItems;
+ string fontFuncName = parameters->GetParameter(ptDeterminateFont);
+
+ cTemplateFunction *fontFunc = listElement->GetFunction(fontFuncName);
+ if (!fontFunc)
+ return NULL;
+
+ string fontNameToken = fontFunc->GetParameter(ptFont);
+ string paramFontSize = fontFunc->GetParameter(ptFontSize);
+
+ string fontName = "";
+ if (IsToken(fontNameToken)) {
+ if (!globals->GetFont(fontNameToken, fontName)) {
+ if (!globals->GetFont("{vdrOsd}", fontName)) {
+ return NULL;
+ }
+ }
+ } else {
+ //if no token, directly use input
+ fontName = fontNameToken;
+ }
+
+ cNumericParameter pFontSize(paramFontSize);
+ pFontSize.SetGlobals(globals);
+ pFontSize.SetAreaSize(1000, itemHeight);
+ pFontSize.SetVertical();
+ int fontSize = pFontSize.Parse(paramFontSize);
+ if (!pFontSize.Valid())
+ return NULL;
+
+ return fontManager->FontUncached(fontName, fontSize);
+}
+
+
+int cTemplateViewList::GetMenuItemWidth(void) {
+ return GetNumericParameter(ptMenuItemWidth);
+}
+
+
+int cTemplateViewList::GetNumPixmaps(void) {
+ if (!listElement)
+ return 0;
+ return listElement->GetNumPixmaps();
+}
+
+void cTemplateViewList::Debug(void) {
+ if (parameters)
+ parameters->Debug();
+ esyslog("skindesigner: --- listelement: ");
+ if (listElement)
+ listElement->Debug();
+ esyslog("skindesigner: --- currentelement: ");
+ if (currentElement)
+ currentElement->Debug();
+}
\ No newline at end of file
diff --git a/libtemplate/templateviewlist.h b/libtemplate/templateviewlist.h
new file mode 100644
index 0000000..b124a7c
--- /dev/null
+++ b/libtemplate/templateviewlist.h
@@ -0,0 +1,50 @@
+#ifndef __TEMPLATEVIEWLIST_H
+#define __TEMPLATEVIEWLIST_H
+
+#include <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+
+#include "templateviewelement.h"
+
+using namespace std;
+
+// --- cTemplateViewList -------------------------------------------------------------
+
+enum eViewList {
+ vlUndefined,
+ //DisplayChannel ViewLists
+ vlDvbDeviceInfoList,
+ //DisplayMenu ViewLists
+ vlTimerList,
+ vlMenuItem
+};
+
+class cTemplateViewList : public cTemplateViewElement {
+private:
+ cTemplateViewElement *listElement;
+ cTemplateViewElement *currentElement;
+public:
+ cTemplateViewList(void);
+ ~cTemplateViewList(void);
+ void SetGlobals(cGlobals *globals);
+ void AddListElement(cTemplateViewElement *listElement) { this->listElement = listElement; };
+ void AddCurrentElement(cTemplateViewElement *currentElement) { this->currentElement = currentElement; };
+ bool CalculateListParameters(void);
+ bool CalculateListParameters(map < string, int > *intTokens);
+ cTemplateViewElement *GetListElement(void) { return listElement; };
+ cTemplateViewElement *GetListElementCurrent(void) { return currentElement; };
+ int GetAverageFontWidth(void);
+ cFont *GetTextAreaFont(void);
+ int GetMenuItemWidth(void);
+ int GetNumPixmaps(void);
+ void Debug(void);
+};
+
+#endif //__TEMPLATEVIEWLIST_H
\ No newline at end of file
diff --git a/libtemplate/templateviewtab.c b/libtemplate/templateviewtab.c
new file mode 100644
index 0000000..1e9f463
--- /dev/null
+++ b/libtemplate/templateviewtab.c
@@ -0,0 +1,38 @@
+#include "templateviewtab.h"
+
+cTemplateViewTab::cTemplateViewTab(void) : cTemplatePixmap() {
+ scrollStep = -1;
+}
+
+cTemplateViewTab::~cTemplateViewTab(void) {
+}
+
+int cTemplateViewTab::GetScrollStep(void) {
+ if (scrollStep > 0)
+ return scrollStep;
+ int pixWidth = GetNumericParameter(ptWidth);
+ int pixHeight = GetNumericParameter(ptHeight);
+ string scrollHeight = parameters->GetParameter(ptScrollHeight);
+
+ cNumericParameter p(scrollHeight);
+ p.SetAreaSize(pixWidth, pixHeight);
+ string parsedValue = "";
+ scrollStep = p.Parse(parsedValue);
+ if (scrollStep < 1)
+ scrollStep = 50;
+ return scrollStep;
+}
+
+string cTemplateViewTab::GetName(void) {
+ return parameters->GetParameter(ptName);
+}
+
+void cTemplateViewTab::SetName(string trans) {
+ parameters->SetParameter(ptName, trans);
+}
+
+void cTemplateViewTab::Debug(void) {
+ esyslog("skindesigner: cTemplateViewTab Debug %s", GetName().c_str());
+ cTemplatePixmap::Debug();
+ esyslog("skindesigner: -------------------------------------------------------");
+}
diff --git a/libtemplate/templateviewtab.h b/libtemplate/templateviewtab.h
new file mode 100644
index 0000000..8514cad
--- /dev/null
+++ b/libtemplate/templateviewtab.h
@@ -0,0 +1,31 @@
+#ifndef __TEMPLATEVIEWTAB_H
+#define __TEMPLATEVIEWTAB_H
+
+#include <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+
+#include "templatepixmap.h"
+
+using namespace std;
+
+// --- cTemplateViewTab -------------------------------------------------------------
+
+class cTemplateViewTab : public cTemplatePixmap {
+private:
+ int scrollStep;
+public:
+ cTemplateViewTab(void);
+ ~cTemplateViewTab(void);
+ int GetScrollStep(void);
+ string GetName(void);
+ void SetName(string trans);
+ void Debug(void);
+};
+
+#endif //__TEMPLATEVIEWTAB_H
\ No newline at end of file
diff --git a/libtemplate/xmlparser.c b/libtemplate/xmlparser.c
new file mode 100644
index 0000000..dd5a39b
--- /dev/null
+++ b/libtemplate/xmlparser.c
@@ -0,0 +1,954 @@
+#include "xmlparser.h"
+#include "../config.h"
+#include "../libcore/helpers.h"
+
+using namespace std;
+
+void SkinDesignerXMLErrorHandler (void * userData, xmlErrorPtr error) {
+ esyslog("skindesigner: Error in XML: %s", error->message);
+}
+
+cXmlParser::cXmlParser(void) {
+ doc = NULL;
+ root = NULL;
+ ctxt = NULL;
+ globals = NULL;
+ skinSetup = NULL;
+
+ initGenericErrorDefaultFunc(NULL);
+ xmlSetStructuredErrorFunc(NULL, SkinDesignerXMLErrorHandler);
+ ctxt = xmlNewParserCtxt();
+}
+
+cXmlParser::~cXmlParser() {
+ DeleteDocument();
+ xmlFreeParserCtxt(ctxt);
+}
+
+/*********************************************************************
+* PUBLIC Functions
+*********************************************************************/
+bool cXmlParser::ReadView(cTemplateView *view, string xmlFile) {
+ this->view = view;
+
+ string xmlPath = GetPath(xmlFile);
+
+ if (ctxt == NULL) {
+ esyslog("skindesigner: Failed to allocate parser context");
+ return false;
+ }
+
+ doc = xmlCtxtReadFile(ctxt, xmlPath.c_str(), NULL, XML_PARSE_NOENT | XML_PARSE_DTDVALID);
+
+ if (doc == NULL) {
+ esyslog("skindesigner: ERROR: TemplateView %s not parsed successfully.", xmlPath.c_str());
+ return false;
+ }
+ if (ctxt->valid == 0) {
+ esyslog("skindesigner: Failed to validate %s", xmlPath.c_str());
+ return false;
+ }
+
+ root = xmlDocGetRootElement(doc);
+
+ if (root == NULL) {
+ esyslog("skindesigner: ERROR: TemplateView %s is empty", xmlPath.c_str());
+ return false;
+ }
+
+ if (xmlStrcmp(root->name, (const xmlChar *) view->GetViewName())) {
+ return false;
+ }
+ return true;
+}
+
+bool cXmlParser::ReadPluginView(string plugName, int templateNumber, string templateName) {
+
+ string xmlPath = GetPath(templateName);
+
+ if (!FileExists(xmlPath) || ctxt == NULL) {
+ return false;
+ }
+ DeleteDocument();
+ doc = xmlCtxtReadFile(ctxt, xmlPath.c_str(), NULL, XML_PARSE_NOENT | XML_PARSE_DTDVALID);
+
+ if (doc == NULL) {
+ return false;
+ }
+ if (ctxt->valid == 0) {
+ esyslog("skindesigner: Failed to validate %s", xmlPath.c_str());
+ return false;
+ }
+
+ root = xmlDocGetRootElement(doc);
+
+ if (root == NULL) {
+ return false;
+ }
+
+ return true;
+}
+
+bool cXmlParser::ReadGlobals(cGlobals *globals, string xmlFile, bool mandatory) {
+ this->globals = globals;
+
+ string xmlPath = GetPath(xmlFile);
+
+ if (ctxt == NULL) {
+ esyslog("skindesigner: Failed to allocate parser context");
+ return false;
+ }
+
+ doc = xmlCtxtReadFile(ctxt, xmlPath.c_str(), NULL, XML_PARSE_NOENT | XML_PARSE_DTDVALID);
+
+ if (doc == NULL) {
+ if (mandatory) {
+ esyslog("skindesigner: ERROR: Globals %s not parsed successfully.", xmlPath.c_str());
+ } else {
+ dsyslog("skindesigner: Globals %s not parsed successfully.", xmlPath.c_str());
+ }
+ return false;
+ }
+
+ root = xmlDocGetRootElement(doc);
+
+ if (ctxt->valid == 0) {
+ if (mandatory) {
+ esyslog("skindesigner: ERROR: Failed to validate %s", xmlPath.c_str());
+ } else {
+ dsyslog("skindesigner: Failed to validate %s", xmlPath.c_str());
+ }
+ return false;
+ }
+
+ if (root == NULL) {
+ if (mandatory) {
+ esyslog("skindesigner: ERROR: Globals %s is empty", xmlPath.c_str());
+ }
+ return false;
+ }
+
+ if (xmlStrcmp(root->name, (const xmlChar *) "globals")) {
+ return false;
+ }
+ return true;
+}
+
+bool cXmlParser::ReadSkinSetup(cSkinSetup *skinSetup, string xmlFile) {
+ this->skinSetup = skinSetup;
+
+ if (!FileExists(xmlFile))
+ return false;
+ if (ctxt == NULL) {
+ esyslog("skindesigner: Failed to allocate parser context");
+ return false;
+ }
+
+ doc = xmlCtxtReadFile(ctxt, xmlFile.c_str(), NULL, XML_PARSE_NOENT | XML_PARSE_DTDVALID);
+
+ if (doc == NULL ) {
+ esyslog("skindesigner: ERROR: skin setup %s not parsed successfully.", xmlFile.c_str());
+ return false;
+ }
+
+ root = xmlDocGetRootElement(doc);
+
+ if (ctxt->valid == 0) {
+ esyslog("skindesigner: Failed to validate %s", xmlFile.c_str());
+ return false;
+ }
+ if (root == NULL) {
+ return false;
+ }
+ if (xmlStrcmp(root->name, (const xmlChar *) "setup")) {
+ return false;
+ }
+
+ return true;
+}
+
+
+bool cXmlParser::ParseView(void) {
+ vector<pair<string, string> > rootAttribs;
+ ParseAttributes(root->properties, root, rootAttribs);
+
+ if (!view)
+ return false;
+
+ view->SetParameters(rootAttribs);
+
+ xmlNodePtr node = root->xmlChildrenNode;
+
+ while (node != NULL) {
+
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+ if (view->ValidSubView((const char*)node->name)) {
+ ParseSubView(node);
+ } else if (view->ValidViewElement((const char*)node->name)) {
+ xmlAttrPtr attr = node->properties;
+ vector<pair<string, string> > attribs;
+ ParseAttributes(attr, node, attribs);
+ ParseViewElement(node->name, node->xmlChildrenNode, attribs);
+ } else if (view->ValidViewList((const char*)node->name)) {
+ ParseViewList(node);
+ } else {
+ return false;
+ }
+
+ node = node->next;
+ }
+
+ return true;
+
+}
+
+bool cXmlParser::ParsePluginView(string plugName, int templateNumber) {
+
+ cTemplateView *plugView = new cTemplateViewMenu();
+ view->AddPluginView(plugName, templateNumber, plugView);
+
+ vector<pair<string, string> > attribs;
+ ParseAttributes(root->properties, root, attribs);
+
+ plugView->SetParameters(attribs);
+
+ xmlNodePtr childNode = root->xmlChildrenNode;
+
+ while (childNode != NULL) {
+
+ if (childNode->type != XML_ELEMENT_NODE) {
+ childNode = childNode->next;
+ continue;
+ }
+
+ if (plugView->ValidViewElement((const char*)childNode->name)) {
+ vector<pair<string, string> > attribs;
+ ParseViewElement(childNode->name, childNode->xmlChildrenNode, attribs, plugView);
+ } else if (plugView->ValidViewList((const char*)childNode->name)) {
+ ParseViewList(childNode, plugView);
+ } else if (!xmlStrcmp(childNode->name, (const xmlChar *) "tab")) {
+ ParseViewTab(childNode, plugView);
+ } else {
+ return false;
+ }
+
+ childNode = childNode->next;
+ }
+
+ return true;
+}
+
+bool cXmlParser::ParseGlobals(void) {
+ xmlNodePtr node = root->xmlChildrenNode;
+ while (node != NULL) {
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+ if (!xmlStrcmp(node->name, (const xmlChar *) "colors")) {
+ ParseGlobalColors(node->xmlChildrenNode);
+ node = node->next;
+ continue;
+ } else if (!xmlStrcmp(node->name, (const xmlChar *) "variables")) {
+ ParseGlobalVariables(node->xmlChildrenNode);
+ node = node->next;
+ continue;
+ } else if (!xmlStrcmp(node->name, (const xmlChar *) "fonts")) {
+ ParseGlobalFonts(node->xmlChildrenNode);
+ node = node->next;
+ continue;
+ } else if (!xmlStrcmp(node->name, (const xmlChar *) "translations")) {
+ ParseTranslations(node->xmlChildrenNode);
+ node = node->next;
+ continue;
+ }
+ node = node->next;
+ }
+
+ return true;
+
+}
+
+bool cXmlParser::ParseSkinSetup(string skin) {
+ xmlNodePtr node = root->xmlChildrenNode;
+
+ while (node != NULL) {
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+ if (!xmlStrcmp(node->name, (const xmlChar *) "menu")) {
+ ParseSetupMenu(node->xmlChildrenNode);
+ node = node->next;
+ continue;
+ } else if (!xmlStrcmp(node->name, (const xmlChar *) "translations")) {
+ ParseTranslations(node->xmlChildrenNode);
+ node = node->next;
+ continue;
+ }
+ node = node->next;
+ }
+
+ return true;
+
+}
+
+void cXmlParser::DeleteDocument(void) {
+ if (doc) {
+ xmlFreeDoc(doc);
+ doc = NULL;
+ }
+}
+
+/*********************************************************************
+* PRIVATE Functions
+*********************************************************************/
+
+string cXmlParser::GetPath(string xmlFile) {
+ string activeSkin = Setup.OSDSkin;
+ string activeTheme = Setup.OSDTheme;
+ string path = "";
+ if (!xmlFile.compare("globals.xml")) {
+ path = *cString::sprintf("%s%s/%s", *config.skinPath, activeSkin.c_str(), xmlFile.c_str());
+ } else if (!xmlFile.compare("theme.xml")) {
+ path = *cString::sprintf("%s%s/themes/%s/%s", *config.skinPath, activeSkin.c_str(), activeTheme.c_str(), xmlFile.c_str());
+ } else if (!xmlFile.compare("setup.xml")) {
+ path = *cString::sprintf("%s%s/%s", *config.skinPath, activeSkin.c_str(), xmlFile.c_str());
+ } else {
+ path = *cString::sprintf("%s%s/xmlfiles/%s", *config.skinPath, activeSkin.c_str(), xmlFile.c_str());
+ }
+ return path;
+}
+
+void cXmlParser::ParseSetupMenu(xmlNodePtr node) {
+ if (!node)
+ return;
+ if (!skinSetup)
+ return;
+
+ while (node != NULL) {
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+
+ if (!xmlStrcmp(node->name, (const xmlChar *) "parameter")) {
+ ParseSetupParameter(node);
+ } else if (!xmlStrcmp(node->name, (const xmlChar *) "submenu")) {
+ xmlAttrPtr attr = node->properties;
+ xmlChar *subMenuName = NULL;
+ xmlChar *subDisplayText = NULL;
+ while (NULL != attr) {
+ if (!xmlStrcmp(attr->name, (const xmlChar *) "name")) {
+ subMenuName = xmlGetProp(node, attr->name);
+ } else if (!xmlStrcmp(attr->name, (const xmlChar *) "displaytext")) {
+ subDisplayText = xmlGetProp(node, attr->name);
+ }
+ attr = attr->next;
+ }
+ skinSetup->SetSubMenu(subMenuName, subDisplayText);
+ ParseSetupMenu(node->xmlChildrenNode);
+ if (subMenuName)
+ xmlFree(subMenuName);
+ if (subDisplayText)
+ xmlFree(subDisplayText);
+ }
+ node = node->next;
+ }
+ skinSetup->SubMenuDone();
+}
+
+void cXmlParser::ParseSetupParameter(xmlNodePtr node) {
+ if (!node)
+ return;
+ if (!skinSetup)
+ return;
+
+ xmlAttrPtr attr = node->properties;
+ if (attr == NULL) {
+ return;
+ }
+ xmlChar *paramType = NULL;
+ xmlChar *paramName = NULL;
+ xmlChar *paramDisplayText = NULL;
+ xmlChar *paramMin = NULL;
+ xmlChar *paramMax = NULL;
+ xmlChar *paramValue = NULL;
+ while (NULL != attr) {
+ if (!xmlStrcmp(attr->name, (const xmlChar *) "type")) {
+ paramType = xmlGetProp(node, attr->name);
+ } else if (!xmlStrcmp(attr->name, (const xmlChar *) "name")) {
+ paramName = xmlGetProp(node, attr->name);
+ } else if (!xmlStrcmp(attr->name, (const xmlChar *) "displaytext")) {
+ paramDisplayText = xmlGetProp(node, attr->name);
+ } else if (!xmlStrcmp(attr->name, (const xmlChar *) "min")) {
+ paramMin = xmlGetProp(node, attr->name);
+ } else if (!xmlStrcmp(attr->name, (const xmlChar *) "max")) {
+ paramMax = xmlGetProp(node, attr->name);
+ }
+ attr = attr->next;
+ }
+ paramValue = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
+ skinSetup->SetParameter(paramType, paramName, paramDisplayText, paramMin, paramMax, paramValue);
+ if (paramType)
+ xmlFree(paramType);
+ if (paramName)
+ xmlFree(paramName);
+ if (paramDisplayText)
+ xmlFree(paramDisplayText);
+ if (paramMin)
+ xmlFree(paramMin);
+ if (paramMax)
+ xmlFree(paramMax);
+ if (paramValue)
+ xmlFree(paramValue);
+}
+
+void cXmlParser::ParseGlobalColors(xmlNodePtr node) {
+ if (!node)
+ return;
+
+ while (node != NULL) {
+
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+ if (xmlStrcmp(node->name, (const xmlChar *) "color")) {
+ node = node->next;
+ continue;
+ }
+ xmlAttrPtr attr = node->properties;
+ if (attr == NULL) {
+ node = node->next;
+ continue;
+ }
+ xmlChar *colName = NULL;
+ xmlChar *colValue = NULL;
+ bool ok = false;
+ while (NULL != attr) {
+ if (xmlStrcmp(attr->name, (const xmlChar *) "name")) {
+ attr = attr->next;
+ continue;
+ }
+ ok = true;
+ colName = xmlGetProp(node, attr->name);
+ attr = attr->next;
+ }
+ if (ok) {
+ colValue = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
+ if (colName && colValue)
+ InsertColor((const char*)colName, (const char*)colValue);
+ }
+ if (colName)
+ xmlFree(colName);
+ if (colValue)
+ xmlFree(colValue);
+ node = node->next;
+ }
+}
+
+void cXmlParser::InsertColor(string name, string value) {
+ if (value.size() != 8)
+ return;
+ std::stringstream str;
+ str << value;
+ tColor colVal;
+ str >> std::hex >> colVal;
+ globals->AddColor(name, colVal);
+}
+
+void cXmlParser::ParseGlobalVariables(xmlNodePtr node) {
+ if (!node)
+ return;
+
+ while (node != NULL) {
+
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+ if (xmlStrcmp(node->name, (const xmlChar *) "var")) {
+ node = node->next;
+ continue;
+ }
+ xmlAttrPtr attr = node->properties;
+ if (attr == NULL) {
+ node = node->next;
+ continue;
+ }
+ xmlChar *varName = NULL;
+ xmlChar *varType = NULL;
+ xmlChar *varValue = NULL;
+ while (NULL != attr) {
+ if (!xmlStrcmp(attr->name, (const xmlChar *) "name")) {
+ varName = xmlGetProp(node, attr->name);
+ } else if (!xmlStrcmp(attr->name, (const xmlChar *) "type")) {
+ varType = xmlGetProp(node, attr->name);
+ } else {
+ attr = attr->next;
+ continue;
+ }
+ attr = attr->next;
+ }
+ varValue = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
+ if (varName && varType && varValue)
+ InsertVariable((const char*)varName, (const char*)varType, (const char*)varValue);
+ if (varName)
+ xmlFree(varName);
+ if (varType)
+ xmlFree(varType);
+ if (varValue)
+ xmlFree(varValue);
+ node = node->next;
+ }
+}
+
+void cXmlParser::InsertVariable(string name, string type, string value) {
+ if (!type.compare("int")) {
+ int val = atoi(value.c_str());
+ globals->AddInt(name, val);
+ } else if (!type.compare("double")) {
+ globals->AddDouble(name, value);
+ } else if (!type.compare("string")) {
+ globals->AddString(name, value);
+ }
+}
+
+void cXmlParser::ParseGlobalFonts(xmlNodePtr node) {
+ if (!node)
+ return;
+
+ while (node != NULL) {
+
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+ if (xmlStrcmp(node->name, (const xmlChar *) "font")) {
+ node = node->next;
+ continue;
+ }
+ xmlAttrPtr attr = node->properties;
+ if (attr == NULL) {
+ node = node->next;
+ continue;
+ }
+ xmlChar *fontName = NULL;
+ xmlChar *fontValue = NULL;
+ bool ok = false;
+ while (NULL != attr) {
+ if (xmlStrcmp(attr->name, (const xmlChar *) "name")) {
+ attr = attr->next;
+ continue;
+ }
+ ok = true;
+ fontName = xmlGetProp(node, attr->name);
+ attr = attr->next;
+ }
+ if (ok) {
+ fontValue = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
+ if (fontName && fontValue) {
+ string fN = (const char*)fontName;
+ string fV = (const char*)fontValue;
+ globals->AddFont(fN, fV);
+ }
+ }
+ if (fontName)
+ xmlFree(fontName);
+ if (fontValue)
+ xmlFree(fontValue);
+ node = node->next;
+ }
+}
+
+void cXmlParser::ParseTranslations(xmlNodePtr node) {
+ if (!node)
+ return;
+
+ while (node != NULL) {
+
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+ if (xmlStrcmp(node->name, (const xmlChar *) "token")) {
+ node = node->next;
+ continue;
+ }
+ xmlAttrPtr attr = node->properties;
+ if (attr == NULL) {
+ node = node->next;
+ continue;
+ }
+ xmlChar *tokenName;
+ bool ok = false;
+ while (NULL != attr) {
+ if (xmlStrcmp(attr->name, (const xmlChar *) "name")) {
+ attr = attr->next;
+ continue;
+ }
+ ok = true;
+ tokenName = xmlGetProp(node, attr->name);
+ attr = attr->next;
+ }
+ if (!ok)
+ continue;
+ map < string, string > tokenTranslations;
+ xmlNodePtr nodeTrans = node->xmlChildrenNode;
+ while (nodeTrans != NULL) {
+ if (nodeTrans->type != XML_ELEMENT_NODE) {
+ nodeTrans = nodeTrans->next;
+ continue;
+ }
+ xmlChar *language = NULL;
+ if (xmlStrcmp(nodeTrans->name, (const xmlChar *) "trans")) {
+ nodeTrans = nodeTrans->next;
+ continue;
+ }
+ xmlAttrPtr attrTrans = nodeTrans->properties;
+ if (attrTrans == NULL) {
+ nodeTrans = nodeTrans->next;
+ continue;
+ }
+ ok = false;
+
+ while (NULL != attrTrans) {
+ if (!ok && xmlStrcmp(attrTrans->name, (const xmlChar *) "lang")) {
+ attrTrans = attrTrans->next;
+ continue;
+ }
+ ok = true;
+ language = xmlGetProp(nodeTrans, attrTrans->name);
+ attrTrans = attrTrans->next;
+ }
+ if (!ok)
+ continue;
+ xmlChar *value = NULL;
+ value = xmlNodeListGetString(doc, nodeTrans->xmlChildrenNode, 1);
+ if (language && value)
+ tokenTranslations.insert(pair<string, string>((const char*)language, (const char*)value));
+ if (language)
+ xmlFree(language);
+ if (value)
+ xmlFree(value);
+ nodeTrans = nodeTrans->next;
+ }
+ if (globals) {
+ globals->AddTranslation((const char*)tokenName, tokenTranslations);
+ } else if (skinSetup) {
+ skinSetup->SetTranslation((const char*)tokenName, tokenTranslations);
+ }
+ xmlFree(tokenName);
+ node = node->next;
+ }
+}
+
+bool cXmlParser::ParseSubView(xmlNodePtr node) {
+ if (!node)
+ return false;
+
+ if (!view)
+ return false;
+
+ cTemplateView *subView = new cTemplateViewMenu();
+ view->AddSubView((const char*)node->name, subView);
+
+ vector<pair<string, string> > subViewAttribs;
+ ParseAttributes(node->properties, node, subViewAttribs);
+
+ subView->SetParameters(subViewAttribs);
+
+ xmlNodePtr childNode = node->xmlChildrenNode;
+
+ while (childNode != NULL) {
+
+ if (childNode->type != XML_ELEMENT_NODE) {
+ childNode = childNode->next;
+ continue;
+ }
+
+ if (subView->ValidViewElement((const char*)childNode->name)) {
+ xmlAttrPtr attr = childNode->properties;
+ vector<pair<string, string> > attribs;
+ ParseAttributes(attr, childNode, attribs);
+ ParseViewElement(childNode->name, childNode->xmlChildrenNode, attribs, subView);
+ } else if (subView->ValidViewList((const char*)childNode->name)) {
+ ParseViewList(childNode, subView);
+ } else if (!xmlStrcmp(childNode->name, (const xmlChar *) "tab")) {
+ ParseViewTab(childNode, subView);
+ } else {
+ return false;
+ }
+
+ childNode = childNode->next;
+ }
+
+
+
+ return true;
+
+}
+
+void cXmlParser::ParseViewElement(const xmlChar * viewElement, xmlNodePtr node, vector<pair<string, string> > &attributes, cTemplateView *subView) {
+ if (!node)
+ return;
+
+ if (!view)
+ return;
+
+ while (node != NULL) {
+
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+
+ if (xmlStrcmp(node->name, (const xmlChar *) "area") && xmlStrcmp(node->name, (const xmlChar *) "areascroll")) {
+ esyslog("skindesigner: invalid tag \"%s\"", node->name);
+ node = node->next;
+ continue;
+ }
+
+ xmlAttrPtr attr = node->properties;
+ vector<pair<string, string> > attribs;
+ ParseAttributes(attr, node, attribs);
+
+ cTemplatePixmap *pix = new cTemplatePixmap();
+ if (!xmlStrcmp(node->name, (const xmlChar *) "areascroll")) {
+ pix->SetScrolling();
+ }
+ pix->SetParameters(attribs);
+ ParseFunctionCalls(node->xmlChildrenNode, pix);
+ if (subView)
+ subView->AddPixmap((const char*)viewElement, pix, attributes);
+ else
+ view->AddPixmap((const char*)viewElement, pix, attributes);
+
+ node = node->next;
+ }
+}
+
+void cXmlParser::ParseViewList(xmlNodePtr parentNode, cTemplateView *subView) {
+ if (!parentNode || !view)
+ return;
+
+ xmlAttrPtr attr = parentNode->properties;
+ vector<pair<string, string> > attribs;
+ ParseAttributes(attr, parentNode, attribs);
+
+ cTemplateViewList *viewList = new cTemplateViewList();
+ viewList->SetGlobals(globals);
+ viewList->SetParameters(attribs);
+
+ xmlNodePtr node = parentNode->xmlChildrenNode;
+
+ while (node != NULL) {
+
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+
+ if (!xmlStrcmp(node->name, (const xmlChar *) "currentelement")) {
+ xmlNodePtr childNode = node->xmlChildrenNode;
+ if (!childNode)
+ continue;
+ cTemplateViewElement *currentElement = new cTemplateViewElement();
+ xmlAttrPtr attrCur = node->properties;
+ vector<pair<string, string> > attribsCur;
+ ParseAttributes(attrCur, node, attribsCur);
+ currentElement->SetGlobals(globals);
+ currentElement->SetParameters(attribsCur);
+ while (childNode != NULL) {
+ if (childNode->type != XML_ELEMENT_NODE) {
+ childNode = childNode->next;
+ continue;
+ }
+ if ((!xmlStrcmp(childNode->name, (const xmlChar *) "area")) || (!xmlStrcmp(childNode->name, (const xmlChar *) "areascroll"))) {
+ xmlAttrPtr attrPix = childNode->properties;
+ vector<pair<string, string> > attribsPix;
+ ParseAttributes(attrPix, childNode, attribsPix);
+ cTemplatePixmap *pix = new cTemplatePixmap();
+ pix->SetParameters(attribsPix);
+ ParseFunctionCalls(childNode->xmlChildrenNode, pix);
+ if (!xmlStrcmp(childNode->name, (const xmlChar *) "areascroll")) {
+ pix->SetScrolling();
+ }
+ currentElement->AddPixmap(pix);
+ }
+ childNode = childNode->next;
+ }
+ viewList->AddCurrentElement(currentElement);
+ } else if (!xmlStrcmp(node->name, (const xmlChar *) "listelement")) {
+ xmlNodePtr childNode = node->xmlChildrenNode;
+ if (!childNode)
+ continue;
+ cTemplateViewElement *listElement = new cTemplateViewElement();
+ xmlAttrPtr attrList = node->properties;
+ vector<pair<string, string> > attribsList;
+ ParseAttributes(attrList, node, attribsList);
+ listElement->SetGlobals(globals);
+ listElement->SetParameters(attribsList);
+ while (childNode != NULL) {
+ if (childNode->type != XML_ELEMENT_NODE) {
+ childNode = childNode->next;
+ continue;
+ }
+ if ((!xmlStrcmp(childNode->name, (const xmlChar *) "area")) || (!xmlStrcmp(childNode->name, (const xmlChar *) "areascroll"))) {
+ xmlAttrPtr attrPix = childNode->properties;
+ vector<pair<string, string> > attribsPix;
+ ParseAttributes(attrPix, childNode, attribsPix);
+ cTemplatePixmap *pix = new cTemplatePixmap();
+ pix->SetParameters(attribsPix);
+ ParseFunctionCalls(childNode->xmlChildrenNode, pix);
+ if (!xmlStrcmp(childNode->name, (const xmlChar *) "areascroll")) {
+ pix->SetScrolling();
+ }
+ listElement->AddPixmap(pix);
+ }
+ childNode = childNode->next;
+ }
+ viewList->AddListElement(listElement);
+ } else {
+ node = node->next;
+ continue;
+ }
+ node = node->next;
+ }
+ if (subView)
+ subView->AddViewList((const char*)parentNode->name, viewList);
+ else
+ view->AddViewList((const char*)parentNode->name, viewList);
+}
+
+void cXmlParser::ParseViewTab(xmlNodePtr parentNode, cTemplateView *subView) {
+ if (!parentNode || !view || !subView)
+ return;
+
+ xmlAttrPtr attr = parentNode->properties;
+ vector<pair<string, string> > attribs;
+ ParseAttributes(attr, parentNode, attribs);
+
+ cTemplateViewTab *viewTab = new cTemplateViewTab();
+ viewTab->SetGlobals(globals);
+ viewTab->SetParameters(attribs);
+ viewTab->SetScrolling();
+ xmlNodePtr node = parentNode->xmlChildrenNode;
+ ParseFunctionCalls(node, viewTab);
+
+ subView->AddViewTab(viewTab);
+}
+
+void cXmlParser::ParseFunctionCalls(xmlNodePtr node, cTemplatePixmap *pix) {
+ if (!node)
+ return;
+
+ if (!view)
+ return;
+
+ while (node != NULL) {
+
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+
+ if (!xmlStrcmp(node->name, (const xmlChar *) "loop")) {
+ xmlNodePtr childNode = node->xmlChildrenNode;
+ if (!childNode)
+ continue;
+ xmlAttrPtr attr = node->properties;
+ vector<pair<string, string> > attribs;
+ ParseAttributes(attr, node, attribs);
+ cTemplateLoopFunction *loopFunc = new cTemplateLoopFunction();
+ loopFunc->SetParameters(attribs);
+ ParseLoopFunctionCalls(childNode, loopFunc);
+ pix->AddLoopFunction(loopFunc);
+ node = node->next;
+ } else if (view->ValidFunction((const char*)node->name)) {
+ xmlAttrPtr attr = node->properties;
+ vector<pair<string, string> > attribs;
+ ParseAttributes(attr, node, attribs);
+ pix->AddFunction((const char*)node->name, attribs);
+ node = node->next;
+ } else {
+ node = node->next;
+ continue;
+ }
+
+ }
+}
+
+void cXmlParser::ParseLoopFunctionCalls(xmlNodePtr node, cTemplateLoopFunction *loopFunc) {
+ if (!node)
+ return;
+
+ if (!view)
+ return;
+
+ while (node != NULL) {
+
+ if (node->type != XML_ELEMENT_NODE) {
+ node = node->next;
+ continue;
+ }
+ if (view->ValidFunction((const char*)node->name)) {
+ xmlAttrPtr attr = node->properties;
+ vector<pair<string, string> > attribs;
+ ParseAttributes(attr, node, attribs);
+ loopFunc->AddFunction((const char*)node->name, attribs);
+ node = node->next;
+ } else {
+ node = node->next;
+ continue;
+ }
+
+ }
+}
+
+bool cXmlParser::ParseAttributes(xmlAttrPtr attr, xmlNodePtr node, vector<pair<string, string> > &attribs) {
+ if (attr == NULL) {
+ return false;
+ }
+
+ if (!view)
+ return false;
+
+ while (NULL != attr) {
+
+ string name = (const char*)attr->name;
+ if (!name.compare("debug")) {
+ attribs.push_back(pair<string, string>((const char*)attr->name, "true"));
+ attr = attr->next;
+ continue;
+ }
+
+ xmlChar *value = NULL;
+ value = xmlGetProp(node, attr->name);
+ if (!view->ValidAttribute((const char*)node->name, (const char*)attr->name)) {
+ esyslog("skindesigner: unknown attribute %s in %s", (const char*)attr->name, (const char*)node->name);
+ attr = attr->next;
+ if (value)
+ xmlFree(value);
+ continue;
+ }
+ if (value)
+ attribs.push_back(pair<string, string>((const char*)attr->name, (const char*)value));
+ attr = attr->next;
+ if (value)
+ xmlFree(value);
+ }
+ return true;
+}
+
+void cXmlParser::InitLibXML() {
+ xmlInitParser();
+}
+
+void cXmlParser::CleanupLibXML() {
+ xmlCleanupParser();
+}
diff --git a/libtemplate/xmlparser.h b/libtemplate/xmlparser.h
new file mode 100644
index 0000000..20f6763
--- /dev/null
+++ b/libtemplate/xmlparser.h
@@ -0,0 +1,65 @@
+#ifndef __XMLPARSER_H
+#define __XMLPARSER_H
+
+#include <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xmlerror.h>
+#include <vdr/plugin.h>
+
+#include "templateview.h"
+#include "templateviewlist.h"
+#include "templateviewtab.h"
+#include "../libcore/skinsetup.h"
+
+using namespace std;
+
+// --- cXmlParser -------------------------------------------------------------
+
+class cXmlParser {
+private:
+ cTemplateView *view;
+ cGlobals *globals;
+ cSkinSetup *skinSetup;
+ xmlParserCtxtPtr ctxt;
+ xmlDocPtr doc;
+ xmlNodePtr root;
+ string GetPath(string xmlFile);
+ void ParseSetupMenu(xmlNodePtr node);
+ void ParseSetupParameter(xmlNodePtr node);
+ void ParseGlobalColors(xmlNodePtr node);
+ void InsertColor(string name, string value);
+ void ParseGlobalVariables(xmlNodePtr node);
+ void InsertVariable(string name, string type, string value);
+ void ParseGlobalFonts(xmlNodePtr node);
+ void ParseTranslations(xmlNodePtr node);
+ bool ParseSubView(xmlNodePtr node);
+ void ParseViewElement(const xmlChar * viewElement, xmlNodePtr node, vector<pair<string, string> > &attributes, cTemplateView *subView = NULL);
+ void ParseViewList(xmlNodePtr parentNode, cTemplateView *subView = NULL);
+ void ParseViewTab(xmlNodePtr parentNode, cTemplateView *subView);
+ void ParseFunctionCalls(xmlNodePtr node, cTemplatePixmap *pix);
+ void ParseLoopFunctionCalls(xmlNodePtr node, cTemplateLoopFunction *loopFunc);
+ bool ParseAttributes(xmlAttrPtr attr, xmlNodePtr node, vector<pair<string, string> > &attribs);
+public:
+ cXmlParser(void);
+ virtual ~cXmlParser(void);
+ bool ReadView(cTemplateView *view, string xmlFile);
+ bool ReadPluginView(string plugName, int templateNumber, string templateName);
+ bool ReadGlobals(cGlobals *globals, string xmlFile, bool mandatory);
+ bool ReadSkinSetup(cSkinSetup *skinSetup, string xmlFile);
+ bool ParseView(void);
+ bool ParsePluginView(string plugName, int templateNumber);
+ bool ParseGlobals(void);
+ bool ParseSkinSetup(string skin);
+ void DeleteDocument(void);
+ static void InitLibXML();
+ static void CleanupLibXML();
+};
+
+#endif //__XMLPARSER_H
diff --git a/po/de_DE.po b/po/de_DE.po
new file mode 100644
index 0000000..d3bc9d2
--- /dev/null
+++ b/po/de_DE.po
@@ -0,0 +1,91 @@
+# Copyright (C) 2014
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <louis.braun at gmx.de>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: vdr-skindesigner 0.0.1\n"
+"Report-Msgid-Bugs-To: <see README>\n"
+"POT-Creation-Date: 2015-01-19 17:09+0100\n"
+"PO-Revision-Date: 2014-09-27 11:02+0200\n"
+"Last-Translator: Louis Braun <louis.braun at gmx.de>\n"
+"Language-Team: \n"
+"Language: de_DE \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "after one another"
+msgstr "eines nach dem anderen"
+
+msgid "at one go"
+msgstr "alle auf einmal"
+
+msgid "Skin"
+msgstr ""
+
+msgid "Plugin Setup"
+msgstr ""
+
+msgid "Menu Item display method"
+msgstr "Art der Ausgabe der Menüelemente"
+
+msgid "Reruns"
+msgstr "Wiederholungen"
+
+msgid "Maximum number of reruns to display"
+msgstr "Anzahl anzuzeigender Wiederholungen"
+
+msgid "Minimum timely distance of rerun (in hours)"
+msgstr "Zeitl. Abstand der Wiederholung (in h)"
+
+msgid "Limit Channel Numbers"
+msgstr "Kanalnummern begrenzen"
+
+msgid "no limit"
+msgstr "unbegrenzt"
+
+msgid "Image Loading"
+msgstr "Bilder"
+
+msgid "Debug Image Loading"
+msgstr "Debugausgabe für das Laden der Bilder"
+
+msgid "Limit Channel Logo Cache"
+msgstr "Größe des Kanallogo Caches bechränken"
+
+msgid "Number to cache initially (per size)"
+msgstr "Anzahl der initial zu cachenden Logos"
+
+msgid "Number to cache in maximum"
+msgstr "Maximale Anzahl zu cachender Logos"
+
+msgid "Skin Setup"
+msgstr ""
+
+msgid "has no setup"
+msgstr "hat kein Setup"
+
+msgid "Cache Statistics"
+msgstr "Cache Statistik"
+
+msgid "cached"
+msgstr "cached"
+
+msgid "icons"
+msgstr "Icons"
+
+msgid "size"
+msgstr "Größe"
+
+msgid "byte"
+msgstr "Byte"
+
+msgid "logos"
+msgstr "Logos"
+
+msgid "skinparts"
+msgstr "Skinparts"
+
+msgid "Skin Designer"
+msgstr "Skin Designer"
diff --git a/po/fi_FI.po b/po/fi_FI.po
new file mode 100644
index 0000000..93872ef
--- /dev/null
+++ b/po/fi_FI.po
@@ -0,0 +1,91 @@
+# Copyright (C) 2014-2015
+# This file is distributed under the same license as the PACKAGE package.
+# Rolf Ahrenberg <rolf.ahrenberg at sci.fi>, 2015.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: vdr-skindesigner 0.2.0\n"
+"Report-Msgid-Bugs-To: <see README>\n"
+"POT-Creation-Date: 2015-01-25 01:25+0200\n"
+"PO-Revision-Date: 2015-01-25 01:25+0200\n"
+"Last-Translator: Rolf Ahrenberg\n"
+"Language-Team: Finnish\n"
+"Language: fi\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "after one another"
+msgstr "yksi kerrallaan"
+
+msgid "at one go"
+msgstr "kaikki kerralla"
+
+msgid "Skin"
+msgstr "Ulkoasu"
+
+msgid "Plugin Setup"
+msgstr "Yleiset"
+
+msgid "Menu Item display method"
+msgstr "Valikkorivien esitystapa"
+
+msgid "Reruns"
+msgstr "Uusinnat"
+
+msgid "Maximum number of reruns to display"
+msgstr "Maksimissaan näytettävät uusinnat"
+
+msgid "Minimum timely distance of rerun (in hours)"
+msgstr "Minimikesto uusintojen välillä [h]"
+
+msgid "Limit Channel Numbers"
+msgstr "Aseta rajoitus kanavanumeroille"
+
+msgid "no limit"
+msgstr "ei rajoitusta"
+
+msgid "Image Loading"
+msgstr "Kuvat"
+
+msgid "Debug Image Loading"
+msgstr "Debuggaa kuvien latausta"
+
+msgid "Limit Channel Logo Cache"
+msgstr "Rajoita kanavalogojen välimuistia"
+
+msgid "Number to cache initially (per size)"
+msgstr "Oletuksena välimuistissa pidettävät logot"
+
+msgid "Number to cache in maximum"
+msgstr "Maksimissaan välimuistissa pidettävät logot"
+
+msgid "Skin Setup"
+msgstr "Ulkoasut"
+
+msgid "has no setup"
+msgstr "ei asetuksia"
+
+msgid "Cache Statistics"
+msgstr "Välimuisti"
+
+msgid "cached"
+msgstr "välimuistissa"
+
+msgid "icons"
+msgstr "ikoni(a)"
+
+msgid "size"
+msgstr "koko"
+
+msgid "byte"
+msgstr "tavu(a)"
+
+msgid "logos"
+msgstr "logo(a)"
+
+msgid "skinparts"
+msgstr "osasta"
+
+msgid "Skin Designer"
+msgstr "Skin Designer -ulkoasu"
diff --git a/scripts/README b/scripts/README
new file mode 100644
index 0000000..5f22c35
--- /dev/null
+++ b/scripts/README
@@ -0,0 +1,10 @@
+This Widget provide information about the system temperatures.
+
+You must manually create a link to the corresponding script, for example:
+ln -s temperatures.default temperatures
+
+The command "temperatures" will be executed every time the widget is drawn, so please keep it short and fast.
+The command can provide three temperatures: cpu, pc case and gpu temperature
+The command can also be called from system information widget. So the output files must also begin with 01_ - 99_ for sort/position.
+
+Please install lm-sensors and configure it for your system. See the default script for an example.
diff --git a/scripts/temperatures.default b/scripts/temperatures.default
new file mode 100755
index 0000000..7ebff69
--- /dev/null
+++ b/scripts/temperatures.default
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+# please update this script to fit your needs
+# this script is call every time the widget will be drawn, so keep it short and fast ;)
+
+OUTPUTFLDR="/tmp/skindesigner/"
+mkdir -p ${OUTPUTFLDR}
+
+# if the script is executed from system_information script set the locale back for "°C"
+LANG=de_DE.UTF-8
+
+# there can be 4 files, cpu, gpu, pccase, motherboard
+
+rm -f ${OUTPUTFLDR}/cpu ${OUTPUTFLDR}/pccase ${OUTPUTFLDR}/gpu ${OUTPUTFLDR}/motherboard
+
+# intel core-i cpu temp
+sensors -A coretemp-isa-0000 | grep "Core 0" | awk '{print $3}' | tr -d "+" > ${OUTPUTFLDR}/cpu
+
+# pc case temp
+#sensors -A acpitz-virtual-0 | grep "temp1" | awk '{print $2}' | tr -d "+" > ${OUTPUTFLDR}/pccase
+
+# motherboard temp
+sensors -A acpitz-virtual-0 | grep "temp1" | awk '{print $2}' | tr -d "+" > ${OUTPUTFLDR}/motherboard
+
+# nvidia gpu temp
+# nvidia-settings must be run as the user of the x server
+# GPU=`nvidia-settings -c :0 -t -query GPUCoreTemp | head -n 1`
+GPU=`nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader`
+echo "${GPU}°C" > ${OUTPUTFLDR}/gpu
diff --git a/scripts/temperatures.g2v b/scripts/temperatures.g2v
new file mode 100644
index 0000000..79d0774
--- /dev/null
+++ b/scripts/temperatures.g2v
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+# please update this script to fit your needs
+# this script is call every time the widget will be drawn, so keep it short and fast ;)
+
+OUTPUTFLDR="/tmp/skindesigner"
+mkdir -p ${OUTPUTFLDR}
+
+# if the script is executed from system_information script set the locale back for "°C"
+LANG=de_DE.UTF-8
+
+# there can be 4 files, cpu, gpu, pccase, motherboard
+
+rm -f ${OUTPUTFLDR}/cpu ${OUTPUTFLDR}/gpu
+
+# intel core-i cpu temp
+#sensors -A coretemp-isa-0000 | grep "Core 0" | awk '{print $3}' | tr -d "+" > ./cpu
+
+# cpu temp
+CPUTEMP=($(sensors -A | grep "Core"))
+CPUTEMP[2]=${CPUTEMP[2]/+} # +36.0°C -> 36.0°C
+echo "${CPUTEMP[2]/./,}" > ${OUTPUTFLDR}/cpu # 36,0°C
+echo "${CPUTEMP[2]%.*}°C" > ${OUTPUTFLDR}/cpu # 36°C
+
+# pc case temp
+#sensors -A acpitz-virtual-0 | grep "temp1" | awk '{print $2}' | tr -d "+" > ${OUTPUTFLDR}/pccase
+
+# nvidia gpu temp
+# nvidia-settings must be run as the user of the x server
+GPU=$(nvidia-settings -c :0 -t -query GPUCoreTemp | head -n 1)
+echo "${GPU}°C" > ${OUTPUTFLDR}/gpu
diff --git a/services.h b/services.h
new file mode 100644
index 0000000..3c477b2
--- /dev/null
+++ b/services.h
@@ -0,0 +1,38 @@
+#ifndef __SKINDESIGNERSERVICES_H
+#define __SKINDESIGNERSERVICES_H
+
+using namespace std;
+
+#include <string>
+#include <map>
+
+/*********************************************************************
+* Data Structures for Service Calls
+*********************************************************************/
+
+// Data structure for service "RegisterPlugin"
+class RegisterPlugin {
+public:
+ RegisterPlugin(void) {
+ name = "";
+ };
+ void SetMenu(int key, string templateName) {
+ menus.insert(pair<int, string>(key, templateName));
+ }
+// in
+ string name; //name of plugin
+ map< int, string > menus; //menus as key -> templatename hashmap
+//out
+};
+
+// Data structure for service "GetDisplayMenu"
+class GetDisplayMenu {
+public:
+ GetDisplayMenu(void) {
+ displayMenu = NULL;
+ };
+// in
+//out
+ cSDDisplayMenu *displayMenu;
+};
+#endif //__SKINDESIGNERSERVICES_H
\ No newline at end of file
diff --git a/services/epgsearch.h b/services/epgsearch.h
new file mode 100644
index 0000000..0c38793
--- /dev/null
+++ b/services/epgsearch.h
@@ -0,0 +1,167 @@
+/*
+Copyright (C) 2004-2007 Christian Wieninger
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+
+The author can be reached at cwieninger at gmx.de
+
+The project's page is at http://winni.vdr-developer.org/epgsearch
+*/
+
+#ifndef EPGSEARCHSERVICES_INC
+#define EPGSEARCHSERVICES_INC
+
+// Added by Andreas Mair (mail _AT_ andreas _DOT_ vdr-developer _DOT_ org)
+#define EPGSEARCH_SEARCHRESULTS_SERVICE_STRING_ID "Epgsearch-searchresults-v1.0"
+#define EPGSEARCH_LASTCONFLICTINFO_SERVICE_STRING_ID "Epgsearch-lastconflictinfo-v1.0"
+
+#include <string>
+#include <list>
+#include <memory>
+#include <set>
+#include <vdr/osdbase.h>
+
+// Data structure for service "Epgsearch-search-v1.0"
+struct Epgsearch_search_v1_0
+{
+// in
+ char* query; // search term
+ int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression)
+ int channelNr; // channel number to search in (0=any)
+ bool useTitle; // search in title
+ bool useSubTitle; // search in subtitle
+ bool useDescription; // search in description
+// out
+ cOsdMenu* pResultMenu; // pointer to the menu of results
+};
+
+// Data structure for service "Epgsearch-exttimeredit-v1.0"
+struct Epgsearch_exttimeredit_v1_0
+{
+// in
+ cTimer* timer; // pointer to the timer to edit
+ bool bNew; // flag that indicates, if this is a new timer or an existing one
+ const cEvent* event; // pointer to the event corresponding to this timer (may be NULL)
+// out
+ cOsdMenu* pTimerMenu; // pointer to the menu of results
+};
+
+// Data structure for service "Epgsearch-updatesearchtimers-v1.0"
+struct Epgsearch_updatesearchtimers_v1_0
+{
+// in
+ bool showMessage; // inform via osd when finished?
+};
+
+// Data structure for service "Epgsearch-osdmessage-v1.0"
+struct Epgsearch_osdmessage_v1_0
+{
+// in
+ char* message; // the message to display
+ eMessageType type;
+};
+
+// Data structure for service "EpgsearchMenu-v1.0"
+struct EpgSearchMenu_v1_0
+{
+// in
+// out
+ cOsdMenu* Menu; // pointer to the menu
+};
+
+// Data structure for service "Epgsearch-lastconflictinfo-v1.0"
+struct Epgsearch_lastconflictinfo_v1_0
+{
+// in
+// out
+ time_t nextConflict; // next conflict date, 0 if none
+ int relevantConflicts; // number of relevant conflicts
+ int totalConflicts; // total number of conflicts
+};
+
+// Data structure for service "Epgsearch-searchresults-v1.0"
+struct Epgsearch_searchresults_v1_0
+{
+// in
+ char* query; // search term
+ int mode; // search mode (0=phrase, 1=and, 2=or, 3=regular expression)
+ int channelNr; // channel number to search in (0=any)
+ bool useTitle; // search in title
+ bool useSubTitle; // search in subtitle
+ bool useDescription; // search in description
+// out
+
+ class cServiceSearchResult : public cListObject
+ {
+ public:
+ const cEvent* event;
+ cServiceSearchResult(const cEvent* Event) : event(Event) {}
+ };
+
+ cList<cServiceSearchResult>* pResultList; // pointer to the results
+};
+
+// Data structure for service "Epgsearch-switchtimer-v1.0"
+struct Epgsearch_switchtimer_v1_0
+{
+// in
+ const cEvent* event;
+ int mode; // mode (0=query existance, 1=add/modify, 2=delete)
+// in/out
+ int switchMinsBefore;
+ int announceOnly;
+// out
+ bool success; // result
+};
+
+// Data structures for service "Epgsearch-services-v1.0"
+class cServiceHandler
+{
+ public:
+ virtual std::list<std::string> SearchTimerList() = 0;
+ // returns a list of search timer entries in the same format as used in epgsearch.conf
+ virtual int AddSearchTimer(const std::string&) = 0;
+ // adds a new search timer and returns its ID (-1 on error)
+ virtual bool ModSearchTimer(const std::string&) = 0;
+ // edits an existing search timer and returns success
+ virtual bool DelSearchTimer(int) = 0;
+ // deletes search timer with given ID and returns success
+ virtual std::list<std::string> QuerySearchTimer(int) = 0;
+ // returns the search result of the searchtimer with given ID in the same format as used in SVDRP command 'QRYS' (->MANUAL)
+ virtual std::list<std::string> QuerySearch(std::string) = 0;
+ // returns the search result of the searchtimer with given settings in the same format as used in SVDRP command 'QRYS' (->MANUAL)
+ virtual std::list<std::string> ExtEPGInfoList() = 0;
+ // returns a list of extended EPG categories in the same format as used in epgsearchcats.conf
+ virtual std::list<std::string> ChanGrpList() = 0;
+ // returns a list of channel groups maintained by epgsearch
+ virtual std::list<std::string> BlackList() = 0;
+ // returns a list of blacklists in the same format as used in epgsearchblacklists.conf
+ virtual std::set<std::string> DirectoryList() = 0;
+ // List of all recording directories used in recordings, timers, search timers or in epgsearchdirs.conf
+ virtual ~cServiceHandler() {}
+ // Read a setup value
+ virtual std::string ReadSetupValue(const std::string& entry) = 0;
+ // Write a setup value
+ virtual bool WriteSetupValue(const std::string& entry, const std::string& value) = 0;
+};
+
+struct Epgsearch_services_v1_0
+{
+// in/out
+ std::auto_ptr<cServiceHandler> handler;
+};
+
+#endif
diff --git a/services/remotetimers.h b/services/remotetimers.h
new file mode 100644
index 0000000..2dc8a97
--- /dev/null
+++ b/services/remotetimers.h
@@ -0,0 +1,141 @@
+/*
+ * remotetimers.h: Public interface of the plugin's services
+ *
+ * Copyright (C) 2008-2011 Frank Schmirler <vdr at schmirler.de>
+ *
+ * This file is part of VDR Plugin remotetimers.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ */
+
+#ifndef _SERVICE__H
+#define _SERVICE__H
+
+#ifndef __TIMERS_H
+#include <vdr/timers.h>
+#include <vdr/epg.h>
+#endif
+
+/*
+ * If the Data argument is NULL, all service calls return true.
+ * Otherwise the return value indicates success or failure of the service call.
+ *
+ * The service calls are not thread safe and must be called from the VDR main loop.
+ */
+
+/*
+ * RemoteTimers::InstantRecording-v1.0
+ * Start an instant recording or pause live TV. VDR needs to be patched to support this.
+ * The service returns false if a local timer should be used. An error occured if true is returned but the out parameters name and fileName are NULL.
+ * Data points to the following structure where pause indicates if it is an instant recording or an attempt to pause live TV.
+ */
+
+struct RemoteTimers_InstantRecording_v1_0 {
+//in
+ const cTimer *timer;
+ bool pause;
+ const cEvent *event;
+//out
+ cString name;
+ cString fileName;
+};
+
+/*
+ * RemoteTimers::RefreshTimers-v1.0
+ * Fetch timer list from remote VDR. You must call this service before you can use one of the service calls below.
+ * Data points to a cString which in case of failure (service call returns false) contains an error message.
+ */
+
+//out
+// cString errorMsg;
+
+/*
+ * RemoteTimers::ForEach-v1.0
+ * Iterates the list of remote timers.
+ * The service call always returns true.
+ * Data points to a cTimer* which must be NULL to return the first timer. Pass the previously returned timer to get the next one until cTimer* is NULL.
+ *
+ * RemoteTimers::GetTimer-v1.0
+ * Test if the timer exists as either a remote or a local timer.
+ * The service call always returns true.
+ * Data points to a cTimer* which points to the timer you are looking for. If found, cTimer* will point to the timer, otherwise it will be NULL.
+ */
+
+//in+out
+// cTimer* timer;
+
+/*
+ * RemoteTimers::GetMatch-v1.0
+ * Find the remote or local timer which matches the event best.
+ * The service call always returns true.
+ * Data points to the following structure:
+ */
+
+struct RemoteTimers_GetMatch_v1_0 {
+//in
+ const cEvent *event;
+//out
+ cTimer *timer;
+ int timerMatch;
+ int timerType;
+ bool isRemote;
+};
+
+/*
+ * RemoteTimers::GetTimerByEvent-v1.0
+ * Find the remote or local timer matching the event.
+ * If no timer matches, the service call returns false.
+ * Data points to a RemoteTimers_Event_v1_0 struct.
+ *
+ * RemoteTimers::NewTimerByEvent-v1.0
+ * Add a new timer for an event.
+ * In case of an error, the service call returns false and the structure includes an error message.
+ * Data points to a RemoteTimers_Event_v1_0 struct.
+ */
+
+struct RemoteTimers_Event_v1_0 {
+//in
+ const cEvent *event;
+//out
+ cTimer *timer;
+ cString errorMsg;
+};
+
+/*
+ * RemoteTimers::NewTimer-v1.0
+ * Add a new timer.
+ * In case of an error, the service call returns false and the structure includes an error message.
+ * Data points to a RemoteTimers_Timer_v1_0 struct.
+ *
+ * RemoteTimers::ModTimer-v1.0
+ * Change an existing timer.
+ * In case of an error, the service call returns false and the structure includes an error message.
+ * Data points to a RemoteTimers_Timer_v1_0 struct.
+ *
+ * RemoteTimers::DelTimer-v1.0
+ * Delete an existing timer.
+ * In case of an error, the service call returns false and the structure includes an error message.
+ * Data points to a RemoteTimers_Timer_v1_0 struct.
+ */
+
+struct RemoteTimers_Timer_v1_0 {
+//in+out
+ cTimer *timer;
+//out
+ cString errorMsg;
+};
+
+#endif //_SERVICE__H
diff --git a/services/scraper2vdr.h b/services/scraper2vdr.h
new file mode 100644
index 0000000..a5d6043
--- /dev/null
+++ b/services/scraper2vdr.h
@@ -0,0 +1,214 @@
+#ifndef __SCRAPER2VDRSERVICES_H
+#define __SCRAPER2VDRSERVICES_H
+
+#include <string>
+#include <vector>
+#include <vdr/epg.h>
+#include <vdr/recording.h>
+
+enum tvType {
+ tSeries,
+ tMovie,
+ tNone,
+};
+
+/*********************************************************************
+* Helper Structures
+*********************************************************************/
+class cTvMedia {
+public:
+ cTvMedia(void) {
+ path = "";
+ width = height = 0;
+ };
+ std::string path;
+ int width;
+ int height;
+};
+
+class cEpisode {
+public:
+ cEpisode(void) {
+ number = 0;
+ season = 0;
+ name = "";
+ firstAired = "";
+ guestStars = "";
+ overview = "";
+ rating = 0.0;
+ };
+ int number;
+ int season;
+ std::string name;
+ std::string firstAired;
+ std::string guestStars;
+ std::string overview;
+ float rating;
+ cTvMedia episodeImage;
+};
+
+class cActor {
+public:
+ cActor(void) {
+ name = "";
+ role = "";
+ };
+ std::string name;
+ std::string role;
+ cTvMedia actorThumb;
+};
+
+/*********************************************************************
+* Data Structures for Service Calls
+*********************************************************************/
+
+// Data structure for service "GetEventType"
+class ScraperGetEventType {
+public:
+ ScraperGetEventType(void) {
+ event = NULL;
+ recording = NULL;
+ type = tNone;
+ movieId = 0;
+ seriesId = 0;
+ episodeId = 0;
+ };
+// in
+ const cEvent *event; // check type for this event
+ const cRecording *recording; // or for this recording
+//out
+ tvType type; //typeSeries or typeMovie
+ int movieId;
+ int seriesId;
+ int episodeId;
+};
+
+//Data structure for full series and episode information
+class cMovie {
+public:
+ cMovie(void) {
+ title = "";
+ originalTitle = "";
+ tagline = "";
+ overview = "";
+ adult = false;
+ collectionName = "";
+ budget = 0;
+ revenue = 0;
+ genres = "";
+ homepage = "";
+ releaseDate = "";
+ runtime = 0;
+ popularity = 0.0;
+ voteAverage = 0.0;
+ };
+//IN
+ int movieId; // movieId fetched from ScraperGetEventType
+//OUT
+ std::string title;
+ std::string originalTitle;
+ std::string tagline;
+ std::string overview;
+ bool adult;
+ std::string collectionName;
+ int budget;
+ int revenue;
+ std::string genres;
+ std::string homepage;
+ std::string releaseDate;
+ int runtime;
+ float popularity;
+ float voteAverage;
+ cTvMedia poster;
+ cTvMedia fanart;
+ cTvMedia collectionPoster;
+ cTvMedia collectionFanart;
+ std::vector<cActor> actors;
+};
+
+//Data structure for full series and episode information
+class cSeries {
+public:
+ cSeries(void) {
+ seriesId = 0;
+ episodeId = 0;
+ name = "";
+ overview = "";
+ firstAired = "";
+ network = "";
+ genre = "";
+ rating = 0.0;
+ status = "";
+ };
+//IN
+ int seriesId; // seriesId fetched from ScraperGetEventType
+ int episodeId; // episodeId fetched from ScraperGetEventType
+//OUT
+ std::string name;
+ std::string overview;
+ std::string firstAired;
+ std::string network;
+ std::string genre;
+ float rating;
+ std::string status;
+ cEpisode episode;
+ std::vector<cActor> actors;
+ std::vector<cTvMedia> posters;
+ std::vector<cTvMedia> banners;
+ std::vector<cTvMedia> fanarts;
+ cTvMedia seasonPoster;
+};
+
+// Data structure for service "GetPosterBanner"
+class ScraperGetPosterBanner {
+public:
+ ScraperGetPosterBanner(void) {
+ type = tNone;
+ event = NULL;
+ };
+// in
+ const cEvent *event; // check type for this event
+//out
+ tvType type; //typeSeries or typeMovie
+ cTvMedia poster;
+ cTvMedia banner;
+};
+
+// Data structure for service "GetPosterBannerV2"
+class ScraperGetPosterBannerV2 {
+public:
+ ScraperGetPosterBannerV2(void) {
+ type = tNone;
+ event = NULL;
+ recording = NULL;
+ };
+// in
+ const cEvent *event; // check type for this event
+ const cRecording *recording; // check type for this recording
+//out
+ tvType type; //typeSeries or typeMovie
+ cTvMedia poster;
+ cTvMedia banner;
+};
+
+// Data structure for service "GetPoster"
+class ScraperGetPoster {
+public:
+// in
+ const cEvent *event; // check type for this event
+ const cRecording *recording; // or for this recording
+//out
+ cTvMedia poster;
+};
+
+// Data structure for service "GetPosterThumb"
+class ScraperGetPosterThumb {
+public:
+// in
+ const cEvent *event; // check type for this event
+ const cRecording *recording; // or for this recording
+//out
+ cTvMedia poster;
+};
+
+#endif //__SCRAPER2VDRSERVICES_H
\ No newline at end of file
diff --git a/services/weatherforecast.h b/services/weatherforecast.h
new file mode 100644
index 0000000..13f3c1e
--- /dev/null
+++ b/services/weatherforecast.h
@@ -0,0 +1,49 @@
+#ifndef __WEATHERFORECASTSERVICES_H
+#define __WEATHERFORECASTSERVICES_H
+
+#include <string>
+
+class cServiceCurrentWeather {
+public:
+ cServiceCurrentWeather(void) {
+ timeStamp = "";
+ temperature = "";
+ minTemperature = "";
+ maxTemperature = "";
+ apparentTemperature = "";
+ summary = "";
+ icon = "";
+ precipitationIntensity = "";
+ precipitationProbability = 0;
+ precipitationType = "";
+ humidity = 0;
+ windSpeed = "";
+ windBearing = 0;
+ windBearingString = "";
+ visibility = "";
+ cloudCover = 0;
+ pressure = "";
+ ozone = "";
+ };
+ std::string timeStamp;
+ std::string temperature;
+ std::string apparentTemperature;
+ std::string minTemperature;
+ std::string maxTemperature;
+ std::string summary;
+ std::string icon;
+ std::string precipitationIntensity;
+ int precipitationProbability;
+ std::string precipitationType;
+ int humidity;
+ std::string windSpeed;
+ int windBearing;
+ std::string windBearingString;
+ std::string visibility;
+ int cloudCover;
+ std::string pressure;
+ std::string ozone;
+};
+
+#endif //__WEATHERFORECASTSERVICES_H
+
diff --git a/setup.c b/setup.c
new file mode 100644
index 0000000..611cc69
--- /dev/null
+++ b/setup.c
@@ -0,0 +1,219 @@
+#include "setup.h"
+
+cSkinDesignerSetup::cSkinDesignerSetup() {
+ numLogosPerSizeInitial = config.numLogosPerSizeInitial;
+ limitLogoCache = config.limitLogoCache;
+ numLogosMax = config.numLogosMax;
+ debugImageLoading = config.debugImageLoading;
+ rerunAmount = config.rerunAmount;
+ rerunDistance = config.rerunDistance;
+ rerunMaxChannel = config.rerunMaxChannel;
+ blockFlush = config.blockFlush;
+ menuDisplayStyle[0] = tr("after one another");
+ menuDisplayStyle[1] = tr("at one go");
+ Setup();
+}
+
+cSkinDesignerSetup::~cSkinDesignerSetup() {
+ config.setupCloseDoReload = true;
+}
+
+
+void cSkinDesignerSetup::Setup(void) {
+ int current = Current();
+ Clear();
+
+ SkinSetup();
+ PluginSetup();
+ ImageCacheStatistics();
+
+ SetCurrent(Get(current));
+ Display();
+}
+
+eOSState cSkinDesignerSetup::ProcessKey(eKeys Key) {
+ bool hadSubMenu = HasSubMenu();
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+ if (hadSubMenu && Key == kOk) {
+ Store();
+ }
+ if (!hadSubMenu && (state == osUnknown || Key == kOk)) {
+ if ((Key == kOk && !hadSubMenu)) {
+ switch (Key) {
+ case kOk: {
+ string itemText = Get(Current())->Text();
+ size_t hit = itemText.find(tr("Skin"));
+ if (hit == 0) {
+ string skin = itemText.substr(strlen(tr("Skin"))+1);
+ state = AddSubMenu(new cSkindesignerSkinSetup(skin, ""));
+ }
+ break;
+ } default:
+ break;
+ }
+ }
+ }
+ return state;
+}
+
+void cSkinDesignerSetup::Store(void) {
+ config.numLogosPerSizeInitial = numLogosPerSizeInitial;
+ config.limitLogoCache = limitLogoCache;
+ config.numLogosMax = numLogosMax;
+ config.debugImageLoading = debugImageLoading;
+ config.rerunAmount = rerunAmount;
+ config.rerunDistance = rerunDistance;
+ config.rerunMaxChannel = rerunMaxChannel;
+ config.blockFlush = blockFlush;
+
+ config.InitSetupIterator();
+ cSkinSetup *skinSetup = NULL;
+ while (skinSetup = config.GetNextSkinSetup()) {
+ string skin = skinSetup->GetSkin();
+ skinSetup->InitParameterIterator();
+ cSkinSetupParameter *param = NULL;
+ while (param = skinSetup->GetNextParameter()) {
+ cString paramName = cString::sprintf("%s.%s", skin.c_str(), param->name.c_str());
+ SetupStore(*paramName, param->value);
+ config.UpdateSkinSetupParameter(*paramName, param->value);
+ }
+ }
+ config.UpdateGlobals();
+
+ SetupStore("DebugImageLoading", debugImageLoading);
+ SetupStore("LimitChannelLogoCache", limitLogoCache);
+ SetupStore("NumberLogosInitially", numLogosPerSizeInitial);
+ SetupStore("NumberLogosMax", numLogosMax);
+ SetupStore("RerunAmount", rerunAmount);
+ SetupStore("RerunDistance", rerunDistance);
+ SetupStore("RerunMaxChannel", rerunMaxChannel);
+ SetupStore("BlockFlush", blockFlush);
+}
+
+cOsdItem *cSkinDesignerSetup::InfoItem(const char *label) {
+ cOsdItem *item;
+ item = new cOsdItem(cString::sprintf("---------------- %s ----------------", tr(label)));
+ item->SetSelectable(false);
+ return item;
+}
+
+void cSkinDesignerSetup::PluginSetup(void) {
+ Add(InfoItem(tr("Plugin Setup")));
+
+ Add(new cMenuEditStraItem(tr("Menu Item display method"), &blockFlush, 2, menuDisplayStyle));
+
+ Add(InfoItem(tr("Reruns")));
+ Add(new cMenuEditIntItem(tr("Maximum number of reruns to display"), &rerunAmount, 1, 100));
+ Add(new cMenuEditIntItem(tr("Minimum timely distance of rerun (in hours)"), &rerunDistance, 0, 1000));
+ Add(new cMenuEditIntItem(tr("Limit Channel Numbers"), &rerunMaxChannel, 0, 1000, tr("no limit")));
+
+ Add(InfoItem(tr("Image Loading")));
+ Add(new cMenuEditBoolItem(tr("Debug Image Loading"), &debugImageLoading));
+ Add(new cMenuEditBoolItem(tr("Limit Channel Logo Cache"), &limitLogoCache));
+ Add(new cMenuEditIntItem(tr("Number to cache initially (per size)"), &numLogosPerSizeInitial, 0, 1000));
+ Add(new cMenuEditIntItem(tr("Number to cache in maximum"), &numLogosMax, 0, 1000));
+}
+
+void cSkinDesignerSetup::SkinSetup(void) {
+ Add(InfoItem(tr("Skin Setup")));
+
+ config.InitSkinIterator();
+ string skin = "";
+ while (config.GetSkin(skin)) {
+ cSkinSetup *skinSetup = config.GetSkinSetup(skin);
+ if (!skinSetup) {
+ Add(new cOsdItem(cString::sprintf("%s %s\t%s", tr("Skin"), skin.c_str(), tr("has no setup"))));
+ cList<cOsdItem>::Last()->SetSelectable(false);
+ } else {
+ Add(new cOsdItem(cString::sprintf("%s %s", tr("Skin"), skin.c_str())));
+ }
+ }
+}
+
+void cSkinDesignerSetup::ImageCacheStatistics(void) {
+ if (!imgCache) {
+ return;
+ }
+
+ Add(InfoItem(tr("Cache Statistics")));
+ int sizeIconCache = 0;
+ int numIcons = 0;
+ imgCache->GetIconCacheSize(numIcons, sizeIconCache);
+ cString iconCacheInfo = cString::sprintf("%s %d %s - %s %d %s", tr("cached"), numIcons, tr("icons"), tr("size"), sizeIconCache, tr("byte"));
+ Add(new cOsdItem(*iconCacheInfo));
+ cList<cOsdItem>::Last()->SetSelectable(false);
+
+ int sizeLogoCache = 0;
+ int numLogos = 0;
+ imgCache->GetLogoCacheSize(numLogos, sizeLogoCache);
+ cString logoCacheInfo = cString::sprintf("%s %d %s - %s %d %s", tr("cached"), numLogos, tr("logos"), tr("size"), sizeLogoCache, tr("byte"));
+ Add(new cOsdItem(*logoCacheInfo));
+ cList<cOsdItem>::Last()->SetSelectable(false);
+
+ int sizeSkinpartCache = 0;
+ int numSkinparts = 0;
+ imgCache->GetSkinpartsCacheSize(numSkinparts, sizeSkinpartCache);
+ cString skinpartCacheInfo = cString::sprintf("%s %d %s - %s %d %s", tr("cached"), numSkinparts, tr("skinparts"), tr("size"), sizeSkinpartCache, tr("byte"));
+ Add(new cOsdItem(*skinpartCacheInfo));
+ cList<cOsdItem>::Last()->SetSelectable(false);
+}
+
+// --- cSkinSetupSubMenu -----------------------------------------------------------
+
+cSkinSetupSubMenu::cSkinSetupSubMenu(string name, string displayText) : cOsdItem(displayText.c_str()) {
+ this->name = name;
+}
+
+// --- cSkindesignerSkinSetup -----------------------------------------------------------
+
+cSkindesignerSkinSetup::cSkindesignerSkinSetup(string skin, string name) :
+cOsdMenu(*cString::sprintf("%s: %s \"%s\" %s", trVDR("Setup"), tr("Skin"), skin.c_str(), name.c_str()), 30) {
+ this->skin = skin;
+ this->name = name;
+ Set();
+}
+
+cSkindesignerSkinSetup::~cSkindesignerSkinSetup() {
+}
+
+eOSState cSkindesignerSkinSetup::ProcessKey(eKeys Key) {
+ eOSState state = cOsdMenu::ProcessKey(Key);
+ if (state == osUnknown) {
+ switch (Key) {
+ case kOk: {
+ cOsdItem *current = Get(Current());
+ cSkinSetupSubMenu *subMenuItem = dynamic_cast<cSkinSetupSubMenu*>(current);
+ if (subMenuItem) {
+ state = AddSubMenu(new cSkindesignerSkinSetup(skin, subMenuItem->GetName()));
+ break;
+ } else {
+ return osBack;
+ }
+ } default:
+ break;
+ }
+ }
+ return state;
+}
+
+void cSkindesignerSkinSetup::Set(void) {
+ cSkinSetupMenu *menu = config.GetSkinSetupMenu(skin, name);
+ if (!menu) {
+ return;
+ }
+ menu->InitParameterIterator();
+ cSkinSetupParameter *param = NULL;
+ while (param = menu->GetNextParameter(false)) {
+ if (param->type == sptInt) {
+ Add(new cMenuEditIntItem(param->displayText.c_str(), ¶m->value, param->min, param->max));
+ } else if (param->type == sptBool) {
+ Add(new cMenuEditBoolItem(param->displayText.c_str(), ¶m->value));
+ }
+ }
+
+ menu->InitSubmenuIterator();
+ cSkinSetupMenu *subMenu = NULL;
+ while (subMenu = menu->GetNextSubMenu(false)) {
+ Add(new cSkinSetupSubMenu(subMenu->GetName(), subMenu->GetDisplayText()));
+ }
+}
diff --git a/setup.h b/setup.h
new file mode 100644
index 0000000..c06a5cf
--- /dev/null
+++ b/setup.h
@@ -0,0 +1,57 @@
+#ifndef __SKINDESIGNER_SETUP_H
+#define __SKINDESIGNER_SETUP_H
+
+#include "config.h"
+
+// --- cSkinDesignerSetup -----------------------------------------------------------
+
+class cSkinDesignerSetup : public cMenuSetupPage {
+private:
+ int numLogosPerSizeInitial;
+ int limitLogoCache;
+ int numLogosMax;
+ int debugImageLoading;
+ int rerunAmount;
+ int rerunDistance;
+ int rerunMaxChannel;
+ int blockFlush;
+ const char *menuDisplayStyle[2];
+
+ void Setup(void);
+ virtual void Store(void);
+ virtual eOSState ProcessKey(eKeys Key);
+ cOsdItem *InfoItem(const char *label);
+ void PluginSetup(void);
+ void SkinSetup(void);
+ void ImageCacheStatistics(void);
+public:
+ cSkinDesignerSetup(void);
+ virtual ~cSkinDesignerSetup();
+};
+
+// --- cSkinSetupSubMenu -----------------------------------------------------------
+
+class cSkinSetupSubMenu : public cOsdItem {
+private:
+ string name;
+public:
+ cSkinSetupSubMenu(string name, string displayText);
+ virtual ~cSkinSetupSubMenu() {};
+ string GetName(void) { return name; };
+};
+
+// --- cSkindesignerSkinSetup -----------------------------------------------------------
+
+class cSkindesignerSkinSetup : public cOsdMenu {
+private:
+ string skin;
+ string name;
+protected:
+ virtual eOSState ProcessKey(eKeys Key);
+ void Set(void);
+public:
+ cSkindesignerSkinSetup(string skin, string menu);
+ virtual ~cSkindesignerSkinSetup();
+};
+
+#endif //__SKINDESIGNER_SETUP_H
\ No newline at end of file
diff --git a/skindesclient-0.0.1/COPYING b/skindesclient-0.0.1/COPYING
new file mode 100644
index 0000000..f90922e
--- /dev/null
+++ b/skindesclient-0.0.1/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/skindesclient-0.0.1/Makefile b/skindesclient-0.0.1/Makefile
new file mode 100644
index 0000000..7e19d59
--- /dev/null
+++ b/skindesclient-0.0.1/Makefile
@@ -0,0 +1,123 @@
+#
+# Makefile for a Video Disk Recorder plugin
+#
+# $Id$
+
+# The official name of this plugin.
+# This name will be used in the '-P...' option of VDR to load the plugin.
+# By default the main source file also carries this name.
+
+PLUGIN = skindesclient
+
+### The version number of this plugin (taken from the main source file):
+
+VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
+
+### The directory environment:
+
+# Use package data if installed...otherwise assume we're under the VDR source directory:
+PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc))
+LIBDIR = $(call PKGCFG,libdir)
+LOCDIR = $(call PKGCFG,locdir)
+PLGCFG = $(call PKGCFG,plgcfg)
+#
+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 \
+ libskindesigner/skindesignerosdbase.o
+
+### The main target:
+
+all: $(SOFILE) i18n
+
+### Implicit rules:
+
+%.o: %.c
+ $(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
+ msgfmt -c -o $@ $<
+
+$(I18Npot): $(wildcard *.c)
+ xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
+
+%.po: $(I18Npot)
+ msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
+ @touch $@
+
+$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
+ install -D -m644 $< $@
+
+.PHONY: i18n
+i18n: $(I18Nmo) $(I18Npot)
+
+install-i18n: $(I18Nmsgs)
+
+### Targets:
+
+$(SOFILE): $(OBJS)
+ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -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* *~
diff --git a/skindesclient-0.0.1/README b/skindesclient-0.0.1/README
new file mode 100644
index 0000000..3b270ac
--- /dev/null
+++ b/skindesclient-0.0.1/README
@@ -0,0 +1,16 @@
+This is a "plugin" for the Video Disk Recorder (VDR).
+
+Written by: Louis Braun <louis.braun at gmx.de>
+
+Project's homepage: ---
+
+Latest version available at: ---
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+See the file COPYING for more information.
+
+Description: This is just an example how to use the skindesigner
+template engine with a VDR plugin
diff --git a/skindesclient-0.0.1/libskindesigner/services.h b/skindesclient-0.0.1/libskindesigner/services.h
new file mode 100644
index 0000000..0a016fa
--- /dev/null
+++ b/skindesclient-0.0.1/libskindesigner/services.h
@@ -0,0 +1,52 @@
+#ifndef __SKINDESIGNERSERVICES_H
+#define __SKINDESIGNERSERVICES_H
+
+using namespace std;
+
+#include <string>
+#include <vector>
+#include <map>
+
+enum eMenuType {
+ mtList,
+ mtText
+};
+
+class cSDDisplayMenu : public cSkinDisplayMenu {
+public:
+ virtual void SetTitle(const char *Title);
+ virtual void SetPluginMenu(string name, int menu, int type, bool init);
+ virtual bool SetItemPlugin(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens, int Index, bool Current, bool Selectable);
+ virtual bool SetPluginText(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens);
+};
+
+/*********************************************************************
+* Data Structures for Service Calls
+*********************************************************************/
+
+// Data structure for service "RegisterPlugin"
+class RegisterPlugin {
+public:
+ RegisterPlugin(void) {
+ name = "";
+ };
+ void SetMenu(int key, string templateName) {
+ menus.insert(pair<int, string>(key, templateName));
+ }
+// in
+ string name; //name of plugin
+ map< int, string > menus; //menus as key -> templatename hashmap
+//out
+};
+
+// Data structure for service "GetDisplayMenu"
+class GetDisplayMenu {
+public:
+ GetDisplayMenu(void) {
+ displayMenu = NULL;
+ };
+// in
+//out
+ cSDDisplayMenu *displayMenu;
+};
+#endif //__SKINDESIGNERSERVICES_H
\ No newline at end of file
diff --git a/skindesclient-0.0.1/libskindesigner/skindesignerosdbase.c b/skindesclient-0.0.1/libskindesigner/skindesignerosdbase.c
new file mode 100644
index 0000000..821efdc
--- /dev/null
+++ b/skindesclient-0.0.1/libskindesigner/skindesignerosdbase.c
@@ -0,0 +1,172 @@
+#include "skindesignerosdbase.h"
+
+/**********************************************************************
+* cSkindesignerOsdItem
+**********************************************************************/
+cSkindesignerOsdItem::cSkindesignerOsdItem(eOSState State) : cOsdItem(State) {
+ sdDisplayMenu = NULL;
+}
+
+cSkindesignerOsdItem::cSkindesignerOsdItem(const char *Text, eOSState State, bool Selectable) : cOsdItem(Text, State, Selectable) {
+ sdDisplayMenu = NULL;
+}
+
+cSkindesignerOsdItem::~cSkindesignerOsdItem() {
+
+}
+
+void cSkindesignerOsdItem::SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable) {
+ if (sdDisplayMenu) {
+ if (!sdDisplayMenu->SetItemPlugin(&stringTokens, &intTokens, &loopTokens, Index, Current, Selectable)) {
+ DisplayMenu->SetItem(Text(), Index, Current, Selectable);
+ }
+ } else {
+ DisplayMenu->SetItem(Text(), Index, Current, Selectable);
+ }
+}
+
+void cSkindesignerOsdItem::AddStringToken(string key, string value) {
+ stringTokens.insert(pair<string,string>(key, value));
+}
+
+void cSkindesignerOsdItem::AddIntToken(string key, int value) {
+ intTokens.insert(pair<string,int>(key, value));
+}
+
+void cSkindesignerOsdItem::AddLoopToken(string loopName, map<string, string> &tokens) {
+ map<string, vector<map<string, string> > >::iterator hitLoop = loopTokens.find(loopName);
+ if (hitLoop == loopTokens.end()) {
+ vector<map<string, string> > tokenVector;
+ tokenVector.push_back(tokens);
+ loopTokens.insert(pair<string, vector<map<string, string> > >(loopName, tokenVector));
+ } else {
+ vector<map<string, string> > *tokenVector = &hitLoop->second;
+ tokenVector->push_back(tokens);
+ }
+}
+
+
+/**********************************************************************
+* cSkindesignerOsdMenu
+**********************************************************************/
+cSkindesignerOsdMenu::cSkindesignerOsdMenu(const char *Title, int c0, int c1, int c2, int c3, int c4) : cOsdMenu(Title, c0, c1, c2, c3, c4) {
+ init = true;
+ displayText = false;
+ sdDisplayMenu = NULL;
+ pluginName = "";
+ SetMenuCategory(mcPlugin);
+ SetSkinDesignerDisplayMenu();
+}
+
+cSkindesignerOsdMenu::~cSkindesignerOsdMenu() {
+
+}
+
+void cSkindesignerOsdMenu::SetPluginMenu(int menu, eMenuType type) {
+ if (type == mtList)
+ displayText = false;
+ else if (type == mtText)
+ displayText = true;
+
+ if (sdDisplayMenu) {
+ sdDisplayMenu->SetPluginMenu(pluginName, menu, type, init);
+ }
+ init = false;
+}
+
+bool cSkindesignerOsdMenu::SetSkinDesignerDisplayMenu(void) {
+ static cPlugin *pSkinDesigner = cPluginManager::GetPlugin("skindesigner");
+ if (!pSkinDesigner) {
+ return false;
+ }
+ GetDisplayMenu call;
+ bool ok = pSkinDesigner->Service("GetDisplayMenu", &call);
+ if (ok && call.displayMenu) {
+ sdDisplayMenu = call.displayMenu;
+ return true;
+ }
+ return false;
+}
+
+void cSkindesignerOsdMenu::ClearTokens(void) {
+ text = "";
+ stringTokens.clear();
+ intTokens.clear();
+ loopTokens.clear();
+}
+
+void cSkindesignerOsdMenu::AddStringToken(string key, string value) {
+ stringTokens.insert(pair<string,string>(key, value));
+}
+
+void cSkindesignerOsdMenu::AddIntToken(string key, int value) {
+ intTokens.insert(pair<string,int>(key, value));
+}
+
+void cSkindesignerOsdMenu::AddLoopToken(string loopName, map<string, string> &tokens) {
+ map<string, vector<map<string, string> > >::iterator hitLoop = loopTokens.find(loopName);
+ if (hitLoop == loopTokens.end()) {
+ vector<map<string, string> > tokenVector;
+ tokenVector.push_back(tokens);
+ loopTokens.insert(pair<string, vector<map<string, string> > >(loopName, tokenVector));
+ } else {
+ vector<map<string, string> > *tokenVector = &hitLoop->second;
+ tokenVector->push_back(tokens);
+ }
+}
+
+void cSkindesignerOsdMenu::TextKeyLeft(void) {
+ if (!displayText)
+ return;
+ DisplayMenu()->Scroll(true, true);
+}
+
+void cSkindesignerOsdMenu::TextKeyRight(void) {
+ if (!displayText)
+ return;
+ DisplayMenu()->Scroll(false, true);
+}
+
+void cSkindesignerOsdMenu::TextKeyUp(void) {
+ if (!displayText)
+ return;
+ DisplayMenu()->Scroll(true, false);
+}
+
+void cSkindesignerOsdMenu::TextKeyDown(void) {
+ if (!displayText)
+ return;
+ DisplayMenu()->Scroll(false, false);
+}
+
+void cSkindesignerOsdMenu::Display(void) {
+ if (displayText) {
+ if (sdDisplayMenu) {
+ sdDisplayMenu->SetTitle(Title());
+ if (sdDisplayMenu->SetPluginText(&stringTokens, &intTokens, &loopTokens)) {
+ sdDisplayMenu->Flush();
+ } else {
+ DisplayMenu()->Clear();
+ DisplayMenu()->SetTitle(Title());
+ DisplayMenu()->SetText(text.c_str(), false);
+ DisplayMenu()->Flush();
+ }
+ } else {
+ DisplayMenu()->Clear();
+ DisplayMenu()->SetTitle(Title());
+ DisplayMenu()->SetText(text.c_str(), false);
+ DisplayMenu()->Flush();
+ }
+ return;
+ }
+ if (sdDisplayMenu) {
+ sdDisplayMenu->SetTitle(Title());
+ for (cOsdItem *item = First(); item; item = Next(item)) {
+ cSkindesignerOsdItem *sdItem = dynamic_cast<cSkindesignerOsdItem*>(item);
+ if (sdItem) {
+ sdItem->SetDisplayMenu(sdDisplayMenu);
+ }
+ }
+ }
+ cOsdMenu::Display();
+}
diff --git a/skindesclient-0.0.1/libskindesigner/skindesignerosdbase.h b/skindesclient-0.0.1/libskindesigner/skindesignerosdbase.h
new file mode 100644
index 0000000..88068af
--- /dev/null
+++ b/skindesclient-0.0.1/libskindesigner/skindesignerosdbase.h
@@ -0,0 +1,62 @@
+#ifndef __SKINDESIGNEROSDBASE_H
+#define __SKINDESIGNEROSDBASE_H
+
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+#include <vdr/osdbase.h>
+#include <vdr/plugin.h>
+#include "services.h"
+
+class cSkindesignerOsdItem : public cOsdItem {
+private:
+ cSDDisplayMenu *sdDisplayMenu;
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ map < string, vector< map< string, string > > > loopTokens;
+protected:
+public:
+ cSkindesignerOsdItem(eOSState State = osUnknown);
+ cSkindesignerOsdItem(const char *Text, eOSState State = osUnknown, bool Selectable = true);
+ virtual ~cSkindesignerOsdItem();
+ virtual void SetMenuItem(cSkinDisplayMenu *DisplayMenu, int Index, bool Current, bool Selectable);
+ void SetDisplayMenu(cSDDisplayMenu *sdDisplayMenu) { this->sdDisplayMenu = sdDisplayMenu; };
+ void AddStringToken(string key, string value);
+ void AddIntToken(string key, int value);
+ void AddLoopToken(string loopName, map<string, string> &tokens);
+};
+
+
+class cSkindesignerOsdMenu : public cOsdMenu {
+private:
+ bool init;
+ bool displayText;
+ string pluginName;
+ cSDDisplayMenu *sdDisplayMenu;
+ string text;
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ map < string, vector< map< string, string > > > loopTokens;
+ bool SetSkinDesignerDisplayMenu(void);
+protected:
+ void ClearTokens(void);
+ void SetPluginName(string name) {pluginName = name; };
+ void SetPluginMenu(int menu, eMenuType type);
+ void SetText(string text) { this->text = text; };
+ void AddStringToken(string key, string value);
+ void AddIntToken(string key, int value);
+ void AddLoopToken(string loopName, map<string, string> &tokens);
+ void TextKeyLeft(void);
+ void TextKeyRight(void);
+ void TextKeyUp(void);
+ void TextKeyDown(void);
+public:
+ cSkindesignerOsdMenu(const char *Title, int c0 = 0, int c1 = 0, int c2 = 0, int c3 = 0, int c4 = 0);
+ virtual ~cSkindesignerOsdMenu();
+ virtual void Display(void);
+};
+
+#endif // __SKINDESIGNEROSDBASE_H
+
diff --git a/skindesclient-0.0.1/osdmenu.c b/skindesclient-0.0.1/osdmenu.c
new file mode 100644
index 0000000..e32b2d1
--- /dev/null
+++ b/skindesclient-0.0.1/osdmenu.c
@@ -0,0 +1,148 @@
+#include <vdr/osdbase.h>
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+#include <sstream>
+#include "libskindesigner/skindesignerosdbase.h"
+
+enum eMenus {
+ meListMain,
+ meListSub,
+ meDetail
+};
+
+class cPlugOsdMenu : public cSkindesignerOsdMenu {
+private:
+ void SetMenu(int numItems, bool subfolder = false);
+ void SetDetailView(int element);
+public:
+ cPlugOsdMenu(void);
+ virtual ~cPlugOsdMenu();
+ virtual eOSState ProcessKey(eKeys key);
+};
+
+
+//***************************************************************************
+// Public Functions
+//***************************************************************************
+
+cPlugOsdMenu::cPlugOsdMenu(void) : cSkindesignerOsdMenu("Skindesigner Client") {
+ SetPluginName("skindesclient");
+ SetMenu(10);
+}
+
+cPlugOsdMenu::~cPlugOsdMenu(void) {
+
+}
+
+eOSState cPlugOsdMenu::ProcessKey(eKeys key) {
+ eOSState state = cOsdMenu::ProcessKey(key);
+ switch (key) {
+ case kOk: {
+ int element = Current();
+ if (element%2)
+ SetDetailView(element);
+ else
+ SetMenu(25, true);
+ state = osContinue;
+ break;
+ } case kLeft: {
+ TextKeyLeft();
+ state = osContinue;
+ break;
+ } case kRight: {
+ TextKeyRight();
+ state = osContinue;
+ break;
+ } case kUp: {
+ TextKeyUp();
+ state = osContinue;
+ break;
+ } case kDown: {
+ TextKeyDown();
+ state = osContinue;
+ break;
+ }
+ default:
+ break;
+ }
+ return state;
+}
+
+//***************************************************************************
+// Private Functions
+//***************************************************************************
+
+void cPlugOsdMenu::SetMenu(int numItems, bool subfolder) {
+ eMenus menu = subfolder ? meListSub : meListMain;
+ SetPluginMenu(menu, mtList);
+ Clear();
+
+ for (int i=0; i < numItems; i++) {
+ cSkindesignerOsdItem *item = new cSkindesignerOsdItem();
+ //add some tokens to the menu item
+ stringstream text;
+ if (i%2)
+ text << "DetailItem" << (i+1);
+ else
+ text << "FolderItem" << (i+1);
+ item->SetText(text.str().c_str());
+ item->AddIntToken("itemnumber", i);
+ item->AddStringToken("menuitemtext", text.str().c_str());
+
+ stringstream text2;
+ text2 << "CurrentItemText" << (i+1) << "\n";
+ text2 << "CurrentItemText" << (i+1) << "\n";
+ text2 << "CurrentItemText" << (i+1) << "\n";
+ text2 << "CurrentItemText" << (i+1) << "\n";
+ text2 << "CurrentItemText" << (i+1) << "\n";
+ text2 << "CurrentItemText" << (i+1) << "\n";
+ item->AddStringToken("currentitemtext", text2.str().c_str());
+
+ //Loop Token Example
+ for (int row=0; row<20; row++) {
+ map<string, string> tokens;
+ for (int col=0; col<3; col++) {
+ stringstream key;
+ stringstream value;
+ key << "loop1[" << "col" << col << "]";
+ value << "menuitem" << i << "-" << row << "x" << col;
+ tokens.insert(pair<string,string>(key.str(), value.str()));
+ }
+ item->AddLoopToken("loop1", tokens);
+ }
+ //Add item
+ bool current = (i==0)?true:false;
+ Add(item, current);
+ }
+ SetHelp("Red", "Green", "Yellow", "Blue");
+ Display();
+}
+
+void cPlugOsdMenu::SetDetailView(int element) {
+ SetPluginMenu(meDetail, mtText);
+ Clear();
+ ClearTokens();
+
+ SetText("Text to be displayed if skindesigner templates are not available");
+
+ AddIntToken("menuitem", element);
+ AddStringToken("tabtext", "String Token to be displayed if skindesigner template is available");
+
+ //Loop Token Example
+ for (int row=0; row<25; row++) {
+ map<string, string> tokens;
+ for (int col=0; col<10; col++) {
+ stringstream key;
+ stringstream value;
+ key << "loop1[" << "col" << col << "]";
+ value << "row" << row << "-" << "col" << "-" << col;
+ tokens.insert(pair<string,string>(key.str(), value.str()));
+ }
+ AddLoopToken("loop1", tokens);
+ }
+
+ SetHelp("Red", "Green", "Yellow", "Blue");
+ Display();
+}
diff --git a/skindesclient-0.0.1/skindesclient.c b/skindesclient-0.0.1/skindesclient.c
new file mode 100644
index 0000000..01bff96
--- /dev/null
+++ b/skindesclient-0.0.1/skindesclient.c
@@ -0,0 +1,147 @@
+/*
+ * skindesclient.c: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id$
+ */
+
+#include <vdr/plugin.h>
+#include "osdmenu.c"
+#include "libskindesigner/services.h"
+
+static const char *VERSION = "0.0.1";
+static const char *DESCRIPTION = "SkinDesigner Test Client";
+static const char *MAINMENUENTRY = "Skindesclient";
+
+class cPluginSkindesclient : public cPlugin {
+private:
+ // Add any member variables or functions you may need here.
+public:
+ cPluginSkindesclient(void);
+ virtual ~cPluginSkindesclient();
+ virtual const char *Version(void) { return VERSION; }
+ virtual const char *Description(void) { return DESCRIPTION; }
+ virtual const char *CommandLineHelp(void);
+ virtual bool ProcessArgs(int argc, char *argv[]);
+ virtual bool Initialize(void);
+ virtual bool Start(void);
+ virtual void Stop(void);
+ virtual void Housekeeping(void);
+ virtual void MainThreadHook(void);
+ virtual cString Active(void);
+ virtual time_t WakeupTime(void);
+ virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
+ virtual cOsdObject *MainMenuAction(void);
+ virtual cMenuSetupPage *SetupMenu(void);
+ virtual bool SetupParse(const char *Name, const char *Value);
+ virtual bool Service(const char *Id, void *Data = NULL);
+ virtual const char **SVDRPHelpPages(void);
+ virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode);
+ };
+
+cPluginSkindesclient::cPluginSkindesclient(void)
+{
+
+}
+
+cPluginSkindesclient::~cPluginSkindesclient()
+{
+}
+
+const char *cPluginSkindesclient::CommandLineHelp(void)
+{
+ return NULL;
+}
+
+bool cPluginSkindesclient::ProcessArgs(int argc, char *argv[])
+{
+ return true;
+}
+
+bool cPluginSkindesclient::Initialize(void)
+{
+ return true;
+}
+
+bool cPluginSkindesclient::Start(void)
+{
+ RegisterPlugin reg;
+ reg.name = "skindesclient";
+ reg.SetMenu(meListMain, "menulistmain.xml");
+ reg.SetMenu(meListSub, "menulistsub.xml");
+ reg.SetMenu(meDetail, "menudetail.xml");
+ static cPlugin *pSkinDesigner = cPluginManager::GetPlugin("skindesigner");
+ if (pSkinDesigner) {
+ bool ok = pSkinDesigner->Service("RegisterPlugin", ®);
+ } else {
+ esyslog("skindesclient: skindesigner not available");
+ }
+ return true;
+}
+
+void cPluginSkindesclient::Stop(void)
+{
+ // Stop any background activities the plugin is performing.
+}
+
+void cPluginSkindesclient::Housekeeping(void)
+{
+ // Perform any cleanup or other regular tasks.
+}
+
+void cPluginSkindesclient::MainThreadHook(void)
+{
+ // Perform actions in the context of the main program thread.
+ // WARNING: Use with great care - see PLUGINS.html!
+}
+
+cString cPluginSkindesclient::Active(void)
+{
+ // Return a message string if shutdown should be postponed
+ return NULL;
+}
+
+time_t cPluginSkindesclient::WakeupTime(void)
+{
+ // Return custom wakeup time for shutdown script
+ return 0;
+}
+
+cOsdObject *cPluginSkindesclient::MainMenuAction(void)
+{
+ cOsdObject *menu = new cPlugOsdMenu();
+ return menu;
+}
+
+cMenuSetupPage *cPluginSkindesclient::SetupMenu(void)
+{
+ // Return a setup menu in case the plugin supports one.
+ return NULL;
+}
+
+bool cPluginSkindesclient::SetupParse(const char *Name, const char *Value)
+{
+ // Parse your own setup parameters and store their values.
+ return false;
+}
+
+bool cPluginSkindesclient::Service(const char *Id, void *Data)
+{
+ // Handle custom service requests from other plugins
+ return false;
+}
+
+const char **cPluginSkindesclient::SVDRPHelpPages(void)
+{
+ // Return help text for SVDRP commands this plugin implements
+ return NULL;
+}
+
+cString cPluginSkindesclient::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
+{
+ // Process SVDRP commands this plugin implements
+ return NULL;
+}
+
+VDRPLUGINCREATOR(cPluginSkindesclient); // Don't touch this!
diff --git a/skindesclient-0.0.1/templates-metrixhd/plug-skindesclient-menudetail.xml b/skindesclient-0.0.1/templates-metrixhd/plug-skindesclient-menudetail.xml
new file mode 100644
index 0000000..82f13ab
--- /dev/null
+++ b/skindesclient-0.0.1/templates-metrixhd/plug-skindesclient-menudetail.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </background>
+ <!-- dummyheader -->
+ <header>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </header>
+ <datetime>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </datetime>
+ <colorbuttons>
+ </colorbuttons>
+ <!-- Available Variables in detail header:
+ {menuitem} Number of menu item element from list
+ {tabtext} Text for Tab
+ -->
+ <detailheader>
+ <area x="0" y="0" width="100%" height="20%" layer="2">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ <area x="0" y="0" width="100%" height="20%" layer="3">
+ <drawtext x="20" valign="center" font="{light}" fontsize="40%" color="{clrWhite}" text="Header for menuitem {menuitem} detailed information" />
+ </area>
+ </detailheader>
+ <!-- Available Variables scrollbar:
+ {height} height in one-tenth of a percent of total height
+ {offset} offset from top in one-tenth of a percent of total height
+ -->
+ <scrollbar>
+ <area x="98%" y="20%" width="2%" height="65%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+ <!-- Available Variables in tab elements:
+ {menuitem} Number of menu item element from list
+ {tabtext} Text for Tab
+ {loop1[]} test array
+ {loop1[col0]} test array first col
+ ...
+ {loop1[col3]} test array fourth col
+ -->
+ <!-- TAB TEST1 -->
+ <tab name="Test1" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtextbox x="0" y="0" width="96%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tabtext}" />
+ </tab>
+ <!-- TAB TEST2 -->
+ <tab name="Test2" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext x="10" y="0" width="96%" font="{light}" fontsize="8%" color="{clrWhite}" text="{tabtext}" />
+ <loop name="loop1" x="0" y="9%" width="{areawidth} - 40" orientation="vertical">
+ <drawtext x="20" y="0" width="{areawidth} - 20" font="{light}" fontsize="8%" color="{clrWhite}" text="{loop1[col0]} {loop1[col1]} {loop1[col2]} {loop1[col3]}" />
+ </loop>
+ </tab>
+ <!-- Available Variables tablabels:
+ {tabs[]} array with available tab labels
+ {tabs[title]} title of tab
+ {tabs[current]} true if tab is displayed currently
+ -->
+ <tablabels>
+ <area x="0" y="85%" width="98%" height="5%" layer="3">
+ <loop name="tabs" x="0" y="0" orientation="horizontal">
+ <drawrectangle condition="{tabs[current]}" x="0" y="0" width="{width(label)}" height="100%" color="{clrTransBlueLight}" />
+ <drawrectangle condition="not{tabs[current]}" x="0" y="0" width="{width(label)}" height="100%" color="{clrTransBlueLight}" />
+ <drawrectangle condition="not{tabs[current]}" x="2" y="2" width="{width(label)} - 4" height="{areaheight}-4" color="{clrTransparent}" />
+ <drawtext name="label" x="0" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text=" {tabs[title]} " />
+ </loop>
+ </area>
+ </tablabels>
+</menuplugin>
\ No newline at end of file
diff --git a/skindesclient-0.0.1/templates-metrixhd/plug-skindesclient-menulistmain.xml b/skindesclient-0.0.1/templates-metrixhd/plug-skindesclient-menulistmain.xml
new file mode 100644
index 0000000..2d88c32
--- /dev/null
+++ b/skindesclient-0.0.1/templates-metrixhd/plug-skindesclient-menulistmain.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ -->
+ <header>
+ </header>
+
+ <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="6">
+ <!-- Available Variables schedules menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {current}
+ {separator}
+ {itemnumber}
+ {menuitemtext}
+ {currentitemtext}
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="1%" width="58%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ </area>
+ <area x="1%" width="58%" layer="3">
+ <drawtext x="10" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{itemnumber} {menuitemtext}" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables schedules menu currentelement:
+ {itemnumber}
+ {menuitemtext}
+ {currentitemtext}
+ {loop1[]} test array
+ {loop1[col0]} test array first col
+ ...
+ {loop1[col2]} test array third col
+ -->
+ <currentelement delay="500" fadetime="0">
+ <area x="63%" y="0" width="36%" height="85%" layer="3">
+ <drawtext align="center" y="0" font="{semibold}" width="{areawidth}-20" fontsize="15%" color="{clrWhite}" text="{itemnumber}" />
+ <drawtext align="center" y="15%" font="{semibold}" width="{areawidth}-20" fontsize="8%" color="{clrWhite}" text="{menuitemtext}" />
+ <drawtextbox x="10" y="{areaheight}/3" width="{areawidth}-20" font="{light}" fontsize="{areaheight}/15" color="{clrWhite}" text="{currentitemtext}" />
+ </area>
+ <areascroll mode="carriagereturn" orientation="vertical" delay="1000" scrollspeed="medium" x="63%" y="85%" width="36%" height="15%" layer="3">
+ <loop name="loop1" x="0" y="0" orientation="vertical">
+ <drawtext x="10" font="{light}" width="{areawidth}-20" fontsize="20%" color="{clrWhite}" text="{loop1[col0]} {loop1[col1]} {loop1[col2]}" />
+ </loop>
+ </areascroll>
+ </currentelement>
+ </menuitems>
+ <!-- Available Variables scrollbar:
+ {height} height in one-tenth of a percent of total height
+ {offset} offset from top in one-tenth of a percent of total height
+ -->
+ <scrollbar>
+ <area x="60%" y="10%" width="2%" height="82%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+</menuplugin>
\ No newline at end of file
diff --git a/skindesclient-0.0.1/templates-metrixhd/plug-skindesclient-menulistsub.xml b/skindesclient-0.0.1/templates-metrixhd/plug-skindesclient-menulistsub.xml
new file mode 100644
index 0000000..acc3341
--- /dev/null
+++ b/skindesclient-0.0.1/templates-metrixhd/plug-skindesclient-menulistsub.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ -->
+ <header>
+ </header>
+
+ <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="12">
+ <!-- Available Variables schedules menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {current}
+ {separator}
+ {itemnumber}
+ {menuitemtext}
+ {currentitemtext}
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="1%" width="58%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ </area>
+ <area x="1%" width="58%" layer="3">
+ <drawtext x="10" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{itemnumber} {menuitemtext}" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables schedules menu currentelement:
+ {itemnumber}
+ {menuitemtext}
+ {currentitemtext}
+ {loop1[]} test array
+ {loop1[col0]} test array first col
+ ...
+ {loop1[col2]} test array third col
+ -->
+ <currentelement delay="500" fadetime="0">
+ <area x="63%" y="0" width="36%" height="85%" layer="3">
+ <drawtext align="center" y="0" font="{semibold}" width="{areawidth}-20" fontsize="15%" color="{clrWhite}" text="{itemnumber}" />
+ <drawtext align="center" y="15%" font="{semibold}" width="{areawidth}-20" fontsize="8%" color="{clrWhite}" text="{menuitemtext}" />
+ <drawtextbox x="10" y="{areaheight}/3" width="{areawidth}-20" font="{light}" fontsize="{areaheight}/15" color="{clrWhite}" text="{currentitemtext}" />
+ </area>
+ <areascroll mode="carriagereturn" orientation="vertical" delay="1000" scrollspeed="medium" x="63%" y="85%" width="36%" height="15%" layer="3">
+ <loop name="loop1" x="0" y="0" orientation="vertical">
+ <drawtext x="10" font="{light}" width="{areawidth}-20" fontsize="20%" color="{clrWhite}" text="{loop1[col0]} {loop1[col1]} {loop1[col2]}" />
+ </loop>
+ </areascroll>
+ </currentelement>
+ </menuitems>
+ <!-- Available Variables scrollbar:
+ {height} height in one-tenth of a percent of total height
+ {offset} offset from top in one-tenth of a percent of total height
+ -->
+ <scrollbar>
+ <area x="60%" y="10%" width="2%" height="82%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+</menuplugin>
\ No newline at end of file
diff --git a/skindesigner.c b/skindesigner.c
new file mode 100644
index 0000000..b641cd8
--- /dev/null
+++ b/skindesigner.c
@@ -0,0 +1,262 @@
+/*
+ * skindesigner.c: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id$
+ */
+#include <getopt.h>
+#include <vdr/plugin.h>
+
+#define DEFINE_CONFIG 1
+#include "config.h"
+#include "designer.h"
+#include "setup.h"
+#include "services.h"
+
+#if defined(APIVERSNUM) && APIVERSNUM < 20000
+#error "VDR-2.0.0 API version or greater is required!"
+#endif
+
+
+static const char *VERSION = "0.2.2";
+static const char *DESCRIPTION = trNOOP("Skin Designer");
+
+class cPluginSkinDesigner : public cPlugin {
+private:
+ vector<cSkinDesigner*> skins;
+public:
+ cPluginSkinDesigner(void);
+ virtual ~cPluginSkinDesigner();
+ virtual const char *Version(void) { return VERSION; }
+ virtual const char *Description(void) { return tr(DESCRIPTION); }
+ virtual const char *CommandLineHelp(void);
+ virtual bool ProcessArgs(int argc, char *argv[]);
+ virtual bool Initialize(void);
+ virtual bool Start(void);
+ virtual void Stop(void);
+ virtual void Housekeeping(void);
+ virtual void MainThreadHook(void);
+ virtual cString Active(void);
+ virtual time_t WakeupTime(void);
+ virtual const char *MainMenuEntry(void) {return NULL;}
+ virtual cOsdObject *MainMenuAction(void);
+ virtual cMenuSetupPage *SetupMenu(void);
+ virtual bool SetupParse(const char *Name, const char *Value);
+ virtual bool Service(const char *Id, void *Data = NULL);
+ virtual const char **SVDRPHelpPages(void);
+ virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode);
+};
+
+cPluginSkinDesigner::cPluginSkinDesigner(void) {
+}
+
+cPluginSkinDesigner::~cPluginSkinDesigner() {
+}
+
+const char *cPluginSkinDesigner::CommandLineHelp(void) {
+ return
+ " -s <SKINPATH>, --skinpath=<SKINPATH> Set directory where xml skins are stored\n"
+ " -l <LOGOPATH>, --logopath=<LOGOPATH> Set directory where a common logo set for all skins is stored\n"
+ " -e <EPGIMAGESPATH>, --epgimages=<IMAGESPATH> Set directory where epgimages are stored\n";
+}
+
+bool cPluginSkinDesigner::ProcessArgs(int argc, char *argv[]) {
+ // Implement command line argument processing here if applicable.
+ static const struct option long_options[] = {
+ { "epgimages", required_argument, NULL, 'e' },
+ { "logopath", required_argument, NULL, 'l' },
+ { "skinpath", required_argument, NULL, 's' },
+ { 0, 0, 0, 0 }
+ };
+
+ int c;
+ while ((c = getopt_long(argc, argv, "e:s:l:", long_options, NULL)) != -1) {
+ switch (c) {
+ case 'e':
+ config.SetEpgImagePath(cString(optarg));
+ break;
+ case 'l':
+ config.SetLogoPath(cString(optarg));
+ break;
+ case 's':
+ config.SetSkinPath(cString(optarg));
+ break;
+ default:
+ return false;
+ }
+ }
+ return true;
+}
+
+bool cPluginSkinDesigner::Initialize(void) {
+ return true;
+}
+
+bool cPluginSkinDesigner::Start(void) {
+ cXmlParser::InitLibXML();
+ cImageImporterSVG::InitLibRSVG();
+ bool trueColorAvailable = true;
+
+ if (!cOsdProvider::SupportsTrueColor()) {
+ esyslog("skindesigner: No TrueColor OSD found! Using default Skin LCARS!");
+ trueColorAvailable = false;
+ } else
+ dsyslog("skindesigner: TrueColor OSD found");
+ config.SetOsdLanguage();
+ config.SetPathes();
+ config.ReadSkins();
+ config.InitSkinIterator();
+ string skin = "";
+ while (config.GetSkin(skin)) {
+ config.ReadSkinSetup(skin);
+ cSkinDesigner *newSkin = new cSkinDesigner(skin);
+ skins.push_back(newSkin);
+ if (!trueColorAvailable) {
+ newSkin->ActivateBackupSkin();
+ }
+ }
+ config.TranslateSetup();
+ config.SetSkinSetupParameters();
+
+ if (skins.size() == 0) {
+ esyslog("skindesigner: no skins found! Using default Skin LCARS!");
+ }
+ return true;
+}
+
+void cPluginSkinDesigner::Stop(void) {
+ delete imgCache;
+ delete fontManager;
+ cXmlParser::CleanupLibXML();
+}
+
+void cPluginSkinDesigner::Housekeeping(void) {
+}
+
+void cPluginSkinDesigner::MainThreadHook(void) {
+}
+
+cString cPluginSkinDesigner::Active(void) {
+ return NULL;
+}
+
+time_t cPluginSkinDesigner::WakeupTime(void) {
+ return 0;
+}
+
+cOsdObject *cPluginSkinDesigner::MainMenuAction(void) {
+ return NULL;
+}
+
+cMenuSetupPage *cPluginSkinDesigner::SetupMenu(void) {
+ return new cSkinDesignerSetup();
+}
+
+bool cPluginSkinDesigner::SetupParse(const char *Name, const char *Value) {
+ return config.SetupParse(Name, Value);
+}
+
+bool cPluginSkinDesigner::Service(const char *Id, void *Data) {
+ if (Data == NULL)
+ return false;
+
+ if (strcmp(Id, "RegisterPlugin") == 0) {
+ RegisterPlugin* call = (RegisterPlugin*) Data;
+ if (call->menus.size() < 1) {
+ esyslog("skindesigner: error - plugin without menus registered");
+ return false;
+ }
+ config.AddPlugin(call->name, call->menus);
+ dsyslog("skindesigner: plugin %s has registered %ld templates", call->name.c_str(), call->menus.size());
+ return true;
+ } else if (strcmp(Id, "GetDisplayMenu") == 0) {
+ GetDisplayMenu* call = (GetDisplayMenu*) Data;
+ cSkin *current = Skins.Current();
+ for (vector<cSkinDesigner*>::iterator skin = skins.begin(); skin != skins.end(); skin++) {
+ if (*skin == current) {
+ cSDDisplayMenu *displayMenu = (*skin)->GetDisplayMenu();
+ if (displayMenu) {
+ call->displayMenu = displayMenu;
+ return true;
+ } else
+ return false;
+ }
+ }
+ return false;
+ }
+
+ return false;
+}
+
+const char **cPluginSkinDesigner::SVDRPHelpPages(void) {
+ static const char *HelpPages[] = {
+ "RELD\n"
+ " force reload of templates and caches",
+ "SCTK\n"
+ " Set custom Token name = value",
+ "LCTK\n"
+ " List custom Tokens",
+ "LSTF\n"
+ " List available Fonts",
+ 0
+ };
+ return HelpPages;
+}
+
+cString cPluginSkinDesigner::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode) {
+
+ cSkinDesigner *activeSkin = NULL;
+ for (vector<cSkinDesigner*>::iterator skin = skins.begin(); skin != skins.end(); skin++) {
+ string activeSkinName = Setup.OSDSkin;
+ string currentSkinName = (*skin)->Description();
+ if (!currentSkinName.compare(activeSkinName)) {
+ activeSkin = *skin;
+ break;
+ }
+ }
+
+ if (!activeSkin) {
+ ReplyCode = 550;
+ return "";
+ }
+
+ if (strcasecmp(Command, "RELD") == 0) {
+ config.ClearSkinSetups();
+ config.InitSkinIterator();
+ string skin = "";
+ while (config.GetSkin(skin)) {
+ config.ReadSkinSetup(skin);
+ }
+ config.TranslateSetup();
+ config.SetSkinSetupParameters();
+ activeSkin->Reload();
+ ReplyCode = 250;
+ return "SKINDESIGNER reload of templates and caches forced.";
+ } else if (strcasecmp(Command, "LSTF") == 0) {
+ activeSkin->ListAvailableFonts();
+ ReplyCode = 250;
+ return "SKINDESIGNER available fonts listed in syslog.";
+ } else if (strcasecmp(Command, "SCTK") == 0) {
+ if (!Option) {
+ ReplyCode = 501;
+ return "SKINDESIGNER SCTK Error: no Token name = value set";
+ }
+ bool optionOk = activeSkin->SetCustomToken(Option);
+ if (optionOk) {
+ ReplyCode = 250;
+ return cString::sprintf("SKINDESIGNER Set custom Token %s", Option);
+ } else {
+ ReplyCode = 501;
+ return cString::sprintf("SKINDESIGNER Invalid custom Token %s", Option);
+ }
+ } else if (strcasecmp(Command, "LCTK") == 0) {
+ activeSkin->ListCustomTokens();
+ ReplyCode = 250;
+ return "SKINDESIGNER Custom Tokens listed in Log";
+ }
+ ReplyCode = 502;
+ return "";
+}
+
+VDRPLUGINCREATOR(cPluginSkinDesigner); // Don't touch this!
diff --git a/skins/blackhole/globals.xml b/skins/blackhole/globals.xml
new file mode 100644
index 0000000..9096212
--- /dev/null
+++ b/skins/blackhole/globals.xml
@@ -0,0 +1,269 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE globals SYSTEM "../../dtd/globals.dtd">
+
+<globals>
+ <!--
+ define all your needed colors here
+ -->
+ <colors>
+ </colors>
+ <!--
+ these variables can be used everywhere in the templates
+ variabls of type int can also be used as conditions, just
+ set such a variable to 1 for true and 0 for false
+ -->
+ <variables>
+ </variables>
+ <!--
+ translations used in the skin
+ -->
+ <translations>
+ <token name="tr(noactivetimers)">
+ <trans lang="en_EN">no active timers</trans>
+ <trans lang="de_DE">keine aktiven Timer</trans>
+ </token>
+ <token name="tr(transponder)">
+ <trans lang="en_EN">Transponder</trans>
+ <trans lang="de_DE">Transponder</trans>
+ </token>
+ <token name="tr(schedule)">
+ <trans lang="en_EN">Schedule</trans>
+ <trans lang="de_DE">Programm</trans>
+ </token>
+ <token name="tr(since)">
+ <trans lang="en_EN">since</trans>
+ <trans lang="de_DE">Seit</trans>
+ </token>
+ <token name="tr(reruns)">
+ <trans lang="en_EN">Reruns</trans>
+ <trans lang="de_DE">Wiederholungen</trans>
+ </token>
+ <token name="tr(rerunsof)">
+ <trans lang="en_EN">Reruns of</trans>
+ <trans lang="de_DE">Wiederholungen von</trans>
+ </token>
+ <token name="tr(actors)">
+ <trans lang="en_EN">Actors</trans>
+ <trans lang="de_DE">Schauspieler</trans>
+ </token>
+ <token name="tr(episode)">
+ <trans lang="en_EN">Episode</trans>
+ <trans lang="de_DE">Folge</trans>
+ </token>
+ <token name="tr(season)">
+ <trans lang="en_EN">Season</trans>
+ <trans lang="de_DE">Staffel</trans>
+ </token>
+ <token name="tr(gueststars)">
+ <trans lang="en_EN">Guest Stars</trans>
+ <trans lang="de_DE">Gaststars</trans>
+ </token>
+ <token name="tr(seriesfirstaired)">
+ <trans lang="en_EN">Series First Aired</trans>
+ <trans lang="de_DE">Erstausstrahlung der Serie</trans>
+ </token>
+ <token name="tr(episodefirstaired)">
+ <trans lang="en_EN">Episode First Aired</trans>
+ <trans lang="de_DE">Erstausstrahlung der Episode</trans>
+ </token>
+ <token name="tr(network)">
+ <trans lang="en_EN">Network</trans>
+ <trans lang="de_DE">TV Station</trans>
+ </token>
+ <token name="tr(genre)">
+ <trans lang="en_EN">Genre</trans>
+ <trans lang="de_DE">Genre</trans>
+ </token>
+ <token name="tr(status)">
+ <trans lang="en_EN">Status</trans>
+ <trans lang="de_DE">Status</trans>
+ </token>
+ <token name="tr(rating)">
+ <trans lang="en_EN">Rating</trans>
+ <trans lang="de_DE">Bewertung</trans>
+ </token>
+ <token name="tr(episoderating)">
+ <trans lang="en_EN">Episode Rating</trans>
+ <trans lang="de_DE">Bewertung der Folge</trans>
+ </token>
+ <token name="tr(recinfo)">
+ <trans lang="en_EN">Recording Information</trans>
+ <trans lang="de_DE">Aufnahme Informationen</trans>
+ </token>
+ <token name="tr(seriesgalery)">
+ <trans lang="en_EN">Series Galery</trans>
+ <trans lang="de_DE">Serien Galerie</trans>
+ </token>
+ <token name="tr(moviegalery)">
+ <trans lang="en_EN">Movie Galery</trans>
+ <trans lang="de_DE">Spielfilm Galerie</trans>
+ </token>
+ <token name="tr(originaltitle)">
+ <trans lang="en_EN">Original Title</trans>
+ <trans lang="de_DE">Originaltitel</trans>
+ </token>
+ <token name="tr(budget)">
+ <trans lang="en_EN">Budget</trans>
+ <trans lang="de_DE">Budget</trans>
+ </token>
+ <token name="tr(revenue)">
+ <trans lang="en_EN">Revenue</trans>
+ <trans lang="de_DE">Einnahmen</trans>
+ </token>
+ <token name="tr(adult)">
+ <trans lang="en_EN">Adult</trans>
+ <trans lang="de_DE">Nur für Erwachsene</trans>
+ </token>
+ <token name="tr(releasedate)">
+ <trans lang="en_EN">Release Date</trans>
+ <trans lang="de_DE">Erscheinungsdatum</trans>
+ </token>
+ <token name="tr(runtime)">
+ <trans lang="en_EN">Runtime</trans>
+ <trans lang="de_DE">Laufzeit</trans>
+ </token>
+ <token name="tr(popularity)">
+ <trans lang="en_EN">Popularity</trans>
+ <trans lang="de_DE">Popularität</trans>
+ </token>
+ <token name="tr(voteaverage)">
+ <trans lang="en_EN">Vote Average</trans>
+ <trans lang="de_DE">Durchschnittliche Wertung</trans>
+ </token>
+ <token name="tr(homepage)">
+ <trans lang="en_EN">Homepage</trans>
+ <trans lang="de_DE">Homepage</trans>
+ </token>
+ <token name="tr(recsize)">
+ <trans lang="en_EN">Recording size</trans>
+ <trans lang="de_DE">Größe der Aufnahme</trans>
+ </token>
+ <token name="tr(recsizecutted)">
+ <trans lang="en_EN">Cutted Recording Size</trans>
+ <trans lang="de_DE">Größe der geschnittenen Aufnahme</trans>
+ </token>
+ <token name="tr(reclength)">
+ <trans lang="en_EN">Recording Length</trans>
+ <trans lang="de_DE">Länge der Aufnahme</trans>
+ </token>
+ <token name="tr(reclengthcutted)">
+ <trans lang="en_EN">Cutted Recording Length</trans>
+ <trans lang="de_DE">Länge der geschnittenen Aufnahme</trans>
+ </token>
+ <token name="tr(bitrate)">
+ <trans lang="en_EN">Bit Rate</trans>
+ <trans lang="de_DE">Bitrate</trans>
+ </token>
+ <token name="tr(format)">
+ <trans lang="en_EN">Format</trans>
+ <trans lang="de_DE">Format</trans>
+ </token>
+ <token name="tr(searchtimer)">
+ <trans lang="en_EN">Searchtimer</trans>
+ <trans lang="de_DE">Suchtimer</trans>
+ </token>
+ <token name="tr(volume)">
+ <trans lang="en_EN">Volume</trans>
+ <trans lang="de_DE">Lautstärke</trans>
+ </token>
+ <token name="tr(pause)">
+ <trans lang="en_EN">Pause</trans>
+ <trans lang="de_DE">Pause</trans>
+ </token>
+ <token name="tr(temp)">
+ <trans lang="en_EN">Temperature</trans>
+ <trans lang="de_DE">Temperatur</trans>
+ </token>
+ <token name="tr(apparenttemp)">
+ <trans lang="en_EN">Felt Temperature</trans>
+ <trans lang="de_DE">Gefühlte Temperatur</trans>
+ </token>
+ <token name="tr(todaymin)">
+ <trans lang="en_EN">minimum today</trans>
+ <trans lang="de_DE">heutiges Minimum</trans>
+ </token>
+ <token name="tr(todaymax)">
+ <trans lang="en_EN">maximum today</trans>
+ <trans lang="de_DE">heutiges Maximum</trans>
+ </token>
+ <token name="tr(precipitationprobability)">
+ <trans lang="en_EN">Precipitation Prob.</trans>
+ <trans lang="de_DE">Regenwahrsch.</trans>
+ </token>
+ <token name="tr(precipitationintensity)">
+ <trans lang="en_EN">Precipitation Intensity</trans>
+ <trans lang="de_DE">Regenmenge</trans>
+ </token>
+ <token name="tr(humidity)">
+ <trans lang="en_EN">Humidity</trans>
+ <trans lang="de_DE">Luftfeuchtigkeit</trans>
+ </token>
+ <token name="tr(apparenttemp)">
+ <trans lang="en_EN">Felt Temperature</trans>
+ <trans lang="de_DE">Gefühlte Temperatur</trans>
+ </token>
+ <token name="tr(windbearing)">
+ <trans lang="en_EN">Wind Bearing</trans>
+ <trans lang="de_DE">Windrichtung</trans>
+ </token>
+ <token name="tr(windspeed)">
+ <trans lang="en_EN">Wind Speed</trans>
+ <trans lang="de_DE">Windgeschwindigkeit</trans>
+ </token>
+ <token name="tr(cloudcover)">
+ <trans lang="en_EN">Cloud Cover</trans>
+ <trans lang="de_DE">Bewölkung</trans>
+ </token>
+ <token name="tr(pressure)">
+ <trans lang="en_EN">Pressure</trans>
+ <trans lang="de_DE">Luftdruck</trans>
+ </token>
+ <token name="tr(ozone)">
+ <trans lang="en_EN">Ozone</trans>
+ <trans lang="de_DE">Ozon</trans>
+ </token>
+ <token name="tr(visibility)">
+ <trans lang="en_EN">visibility</trans>
+ <trans lang="de_DE">Sicht</trans>
+ </token>
+ <token name="tr(conditions)">
+ <trans lang="en_EN">Weather Conditions</trans>
+ <trans lang="de_DE">Wetterlage</trans>
+ </token>
+ <token name="tr(from)">
+ <trans lang="en_EN">from</trans>
+ <trans lang="de_DE">aus</trans>
+ </token>
+ <token name="tr(felt)">
+ <trans lang="en_EN">felt</trans>
+ <trans lang="de_DE">gefühlt</trans>
+ </token>
+ <token name="tr(min)">
+ <trans lang="en_EN">min</trans>
+ <trans lang="de_DE">min</trans>
+ </token>
+ <token name="tr(max)">
+ <trans lang="en_EN">max</trans>
+ <trans lang="de_DE">max</trans>
+ </token>
+ <token name="tr(for)">
+ <trans lang="en_EN">for</trans>
+ <trans lang="de_DE">für</trans>
+ </token>
+ </translations>
+ <!--
+ The three Fonts FontOSD, FontFix and FontSml configured in VDR
+ can be used in all template "font" attributes with this tokens:
+ {vdrOsd}
+ {vdrFix}
+ {vdrSml}
+ If you like to use further fonts, just define them below.
+ Syntax:
+ <font name="tokenname">fontname</font>
+ These fonts can then also be used in all templates in the "font"
+ attribute.
+ if an invalid font is used in a template, vdrOsd is used as default.
+ -->
+ <fonts>
+ </fonts>
+</globals>
diff --git a/skins/blackhole/setup.xml b/skins/blackhole/setup.xml
new file mode 100644
index 0000000..e590344
--- /dev/null
+++ b/skins/blackhole/setup.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE setup SYSTEM "../../dtd/setup.dtd">
+
+<setup>
+ <menu>
+ <parameter type="bool" name="showdevices" displaytext="{tr(showdevices)}">0</parameter>
+ <parameter type="bool" name="showposter" displaytext="{tr(showpostertext)}">1</parameter>
+ <parameter type="bool" name="showmainmenuicons" displaytext="{tr(showmainmenuicons)}">1</parameter>
+ <parameter type="int" name="fadetime" min="0" max="1000" displaytext="{tr(fadetext)}">300</parameter>
+ <parameter type="int" name="nummenuitemsmain" min="6" max="30" displaytext="{tr(nummenuitemsmain)}">10</parameter>
+ <parameter type="int" name="nummenuitems" min="6" max="30" displaytext="{tr(nummenuitems)}">10</parameter>
+ <parameter type="int" name="nummenuitemsdefault" min="6" max="30" displaytext="{tr(nummenuitemsdefault)}">16</parameter>
+ <parameter type="bool" name="showsubtitle" displaytext="{tr(showsubtitle)}">1</parameter>
+ </menu>
+
+ <translations>
+ <token name="tr(showdevices)">
+ <trans lang="en_EN">Show DVB device info when switching channel</trans>
+ <trans lang="de_DE">DVB Karten Info beim Umschalten anzeigen</trans>
+ <trans lang="fi_FI">Näytä DVB-tiedot kanavanvaihdossa</trans>
+ </token>
+ <token name="tr(showpostertext)">
+ <trans lang="en_EN">Show Poster when switching channel</trans>
+ <trans lang="de_DE">Poster beim Umschalten anzeigen</trans>
+ <trans lang="fi_FI">Näytä posterit kanavanvaihdossa</trans>
+ </token>
+ <token name="tr(showmainmenuicons)">
+ <trans lang="en_EN">Show Icons in Main Menu</trans>
+ <trans lang="de_DE">Icons im Hauptmenü anzeigen</trans>
+ <trans lang="fi_FI">Näytä ikonit päävalikossa</trans>
+ </token>
+ <token name="tr(fadetext)">
+ <trans lang="en_EN">Fade time in ms</trans>
+ <trans lang="de_DE">Einblendzeit in ms</trans>
+ <trans lang="fi_FI">Häivytyksen kesto [ms]</trans>
+ </token>
+ <token name="tr(nummenuitemsmain)">
+ <trans lang="en_EN">Items in main menu</trans>
+ <trans lang="de_DE">Elemente im Hauptmenü</trans>
+ <trans lang="fi_FI">Valinnat päävalikossa</trans>
+ </token>
+ <token name="tr(nummenuitems)">
+ <trans lang="en_EN">Items in schedules, timers, ... menus</trans>
+ <trans lang="de_DE">Elemente in Programm, Timer, ... Menüs</trans>
+ <trans lang="fi_FI">Valinnat alivalikoissa</trans>
+ </token>
+ <token name="tr(nummenuitemsdefault)">
+ <trans lang="en_EN">Items in default list menu</trans>
+ <trans lang="de_DE">Elemente im Standard ListenMenü</trans>
+ <trans lang="fi_FI">Valinnat valikkolistoissa</trans>
+ </token>
+ <token name="tr(showsubtitle)">
+ <trans lang="en_EN">Show shorttexts in schedules menus</trans>
+ <trans lang="de_DE">Kurztexte im Programm Menü anzeigen</trans>
+ <trans lang="fi_FI">Näytä lyhyet kuvaukset ohjelmaoppaassa</trans>
+ </token>
+ </translations>
+</setup>
diff --git a/skins/blackhole/themes/default/icons/clear-day.png b/skins/blackhole/themes/default/icons/clear-day.png
new file mode 100644
index 0000000..2b06a14
Binary files /dev/null and b/skins/blackhole/themes/default/icons/clear-day.png differ
diff --git a/skins/blackhole/themes/default/icons/clear-night.png b/skins/blackhole/themes/default/icons/clear-night.png
new file mode 100644
index 0000000..9bbe49f
Binary files /dev/null and b/skins/blackhole/themes/default/icons/clear-night.png differ
diff --git a/skins/blackhole/themes/default/icons/cloudy.png b/skins/blackhole/themes/default/icons/cloudy.png
new file mode 100644
index 0000000..9870c7f
Binary files /dev/null and b/skins/blackhole/themes/default/icons/cloudy.png differ
diff --git a/skins/blackhole/themes/default/icons/fog.png b/skins/blackhole/themes/default/icons/fog.png
new file mode 100644
index 0000000..9bc88d2
Binary files /dev/null and b/skins/blackhole/themes/default/icons/fog.png differ
diff --git a/skins/blackhole/themes/default/icons/ico_back_active.svg b/skins/blackhole/themes/default/icons/ico_back_active.svg
new file mode 100644
index 0000000..5c50a6a
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_back_active.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_back_active.svg"
+ width="100%"
+ height="100%"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient4140"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4146"
+ x1="8.4793415"
+ y1="92.956429"
+ x2="81.716125"
+ y2="5.6427336"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99379431,0,0,0.99783746,1.7413488,0.10780794)" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="5.7268259"
+ inkscape:cx="49.152542"
+ inkscape:cy="47.669492"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 88.154745,18.920038 -32.032972,20.992504 0,-17.000157 c 0,-4.370528 -3.064862,-6.157655 -6.845255,-3.99135 L 7.8352948,46.07818 c -3.7803931,2.166305 -3.7803931,5.677695 0,7.844 L 49.276518,81.079324 c 3.780393,2.166305 6.845255,0.379179 6.845255,-3.99135 l 0,-17.001154 32.032972,20.992504 C 91.935138,83.245629 95,81.458503 95,77.087974 l 0,-54.175589 c 0,-4.370528 -3.064862,-6.157655 -6.845255,-3.992347 z"
+ style="fill:url(#linearGradient4146);fill-opacity:1" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_back_active_x1.svg b/skins/blackhole/themes/default/icons/ico_back_active_x1.svg
new file mode 100644
index 0000000..bbda2ee
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_back_active_x1.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_back_active_x1.svg"
+ width="100%"
+ height="100%"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient4140"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4146"
+ x1="8.4793415"
+ y1="92.956429"
+ x2="81.716125"
+ y2="5.6427336"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99379431,0,0,0.99783746,1.7413488,0.10780794)" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4242"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751736,0,0,1.1149932,2.6257887,0.8137125)" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="5.7268259"
+ inkscape:cx="49.152542"
+ inkscape:cy="47.844109"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 88.154745,18.920038 -32.032972,20.992504 0,-17.000157 c 0,-4.370528 -3.064862,-6.157655 -6.845255,-3.99135 L 7.8352948,46.07818 c -3.7803931,2.166305 -3.7803931,5.677695 0,7.844 L 49.276518,81.079324 c 3.780393,2.166305 6.845255,0.379179 6.845255,-3.99135 l 0,-17.001154 32.032972,20.992504 C 91.935138,83.245629 95,81.458503 95,77.087974 l 0,-54.175589 c 0,-4.370528 -3.064862,-6.157655 -6.845255,-3.992347 z"
+ style="fill:url(#linearGradient4146);fill-opacity:1" /><rect
+ style="opacity:0.8;fill:url(#linearGradient4242);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4226"
+ width="26.665991"
+ height="9.9999895"
+ x="5.0000048"
+ y="5.0000057"
+ ry="2.2137191" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_back_active_x2.svg b/skins/blackhole/themes/default/icons/ico_back_active_x2.svg
new file mode 100644
index 0000000..7af4481
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_back_active_x2.svg
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_back_active_x2.svg"
+ width="100%"
+ height="100%"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient4140"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4146"
+ x1="8.4793415"
+ y1="92.956429"
+ x2="81.716125"
+ y2="5.6427336"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99379431,0,0,0.99783746,1.7413488,0.10780794)" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4242"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751736,0,0,1.1149932,2.6257887,0.8137125)" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4246"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751733,0,0,1.1149932,34.29179,0.8137125)"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="5.7268259"
+ inkscape:cx="49.152542"
+ inkscape:cy="47.669492"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 88.154745,18.920038 -32.032972,20.992504 0,-17.000157 c 0,-4.370528 -3.064862,-6.157655 -6.845255,-3.99135 L 7.8352948,46.07818 c -3.7803931,2.166305 -3.7803931,5.677695 0,7.844 L 49.276518,81.079324 c 3.780393,2.166305 6.845255,0.379179 6.845255,-3.99135 l 0,-17.001154 32.032972,20.992504 C 91.935138,83.245629 95,81.458503 95,77.087974 l 0,-54.175589 c 0,-4.370528 -3.064862,-6.157655 -6.845255,-3.992347 z"
+ style="fill:url(#linearGradient4146);fill-opacity:1" /><rect
+ style="opacity:0.8;fill:url(#linearGradient4242);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4226"
+ width="26.665991"
+ height="9.9999895"
+ x="5.0000048"
+ y="5.0000057"
+ ry="2.2137191" /><rect
+ ry="2.2137191"
+ y="5.0000057"
+ x="36.666004"
+ height="9.9999895"
+ width="26.665991"
+ id="rect4244"
+ style="opacity:0.8;fill:url(#linearGradient4246);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_back_active_x3.svg b/skins/blackhole/themes/default/icons/ico_back_active_x3.svg
new file mode 100644
index 0000000..d1bef47
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_back_active_x3.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_back_active_x3.svg"
+ width="100%"
+ height="100%"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient4140"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4146"
+ x1="8.4793415"
+ y1="92.956429"
+ x2="81.716125"
+ y2="5.6427336"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99379431,0,0,0.99783746,1.7413488,0.10780794)" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4242"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751736,0,0,1.1149932,2.6257887,0.8137125)" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4246"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751733,0,0,1.1149932,34.29179,0.8137125)"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4250"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751733,0,0,1.1149932,65.959791,0.8137125)"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="5.7268259"
+ inkscape:cx="49.152542"
+ inkscape:cy="47.669492"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 88.154745,18.920038 -32.032972,20.992504 0,-17.000157 c 0,-4.370528 -3.064862,-6.157655 -6.845255,-3.99135 L 7.8352948,46.07818 c -3.7803931,2.166305 -3.7803931,5.677695 0,7.844 L 49.276518,81.079324 c 3.780393,2.166305 6.845255,0.379179 6.845255,-3.99135 l 0,-17.001154 32.032972,20.992504 C 91.935138,83.245629 95,81.458503 95,77.087974 l 0,-54.175589 c 0,-4.370528 -3.064862,-6.157655 -6.845255,-3.992347 z"
+ style="fill:url(#linearGradient4146);fill-opacity:1" /><rect
+ style="opacity:0.8;fill:url(#linearGradient4242);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4226"
+ width="26.665991"
+ height="9.9999895"
+ x="5.0000048"
+ y="5.0000057"
+ ry="2.2137191" /><rect
+ ry="2.2137191"
+ y="5.0000057"
+ x="36.666004"
+ height="9.9999895"
+ width="26.665991"
+ id="rect4244"
+ style="opacity:0.8;fill:url(#linearGradient4246);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /><rect
+ style="opacity:0.8;fill:url(#linearGradient4250);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4248"
+ width="26.665991"
+ height="9.9999895"
+ x="68.334007"
+ y="5.0000057"
+ ry="2.2137191" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_back_inactive.svg b/skins/blackhole/themes/default/icons/ico_back_inactive.svg
new file mode 100644
index 0000000..68be369
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_back_inactive.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_back_inactive.svg"
+ width="100%"
+ height="100%"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient4140"><stop
+ style="stop-color:#001428;stop-opacity:1;"
+ offset="0"
+ id="stop4142" /><stop
+ style="stop-color:#003c5e;stop-opacity:1;"
+ offset="1"
+ id="stop4144" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4146"
+ x1="8.4793415"
+ y1="92.956429"
+ x2="81.716125"
+ y2="5.6427336"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99379431,0,0,0.99783746,1.7413488,0.10780794)" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="5.7268259"
+ inkscape:cx="49.152542"
+ inkscape:cy="47.669492"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 88.154745,18.920038 -32.032972,20.992504 0,-17.000157 c 0,-4.370528 -3.064862,-6.157655 -6.845255,-3.99135 L 7.8352948,46.07818 c -3.7803931,2.166305 -3.7803931,5.677695 0,7.844 L 49.276518,81.079324 c 3.780393,2.166305 6.845255,0.379179 6.845255,-3.99135 l 0,-17.001154 32.032972,20.992504 C 91.935138,83.245629 95,81.458503 95,77.087974 l 0,-54.175589 c 0,-4.370528 -3.064862,-6.157655 -6.845255,-3.992347 z"
+ style="fill:url(#linearGradient4146);fill-opacity:1" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_crypted.svg b/skins/blackhole/themes/default/icons/ico_crypted.svg
new file mode 100644
index 0000000..df8c2fc
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_crypted.svg
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="100"
+ height="50"
+ id="svg5311"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 99.999998 50.000001"
+ sodipodi:docname="ico_crypted.svg">
+ <defs
+ id="defs5313">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5915">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5917" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5919" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5897">
+ <stop
+ style="stop-color:#00284a;stop-opacity:1;"
+ offset="0"
+ id="stop5899" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop5901" />
+ </linearGradient>
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter7120">
+ <feGaussianBlur
+ stdDeviation="3.92425"
+ id="feGaussianBlur12" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter5893"
+ x="-0.0063413271"
+ width="1.0126827"
+ y="-0.11147067"
+ height="1.2229413">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.12034188"
+ id="feGaussianBlur5895" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5897"
+ id="linearGradient5903"
+ x1="70.15654"
+ y1="1028.686"
+ x2="102.21464"
+ y2="988.41858"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5915"
+ id="linearGradient5921"
+ x1="24.279434"
+ y1="1045.9269"
+ x2="137.19443"
+ y2="986.90466"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="9.0643817"
+ inkscape:cx="41.079163"
+ inkscape:cy="28.367353"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5316">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1002.3622)">
+ <rect
+ style="opacity:1;fill:url(#linearGradient5903);fill-opacity:1;stroke:#ffffff;stroke-width:1.9572556;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;"
+ id="rect5883"
+ width="98.042747"
+ height="48.042744"
+ x="0.97862577"
+ y="1003.3408"
+ ry="0.58335191" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m -150.86157,869.08162 c -63.87429,0 -115.71874,72.9778 -115.71874,162.87498 0,89.8971 51.84445,162.8437 115.71874,162.8437 50.82546,0 94.030674,-46.1785 109.562504,-110.3437 l 94.65626,0 32.375,-39.2188 21.343746,0 14.375,14.375 34.46875,0 5.71875,-9.875 33.21875,0 15.3125,26.5313 28.09375,0 18.21875,-18.2188 24.1875,0 21.03125,21.0313 26.40625,0 52.65625,-52.6563 0,-15.5312 -11.8125,-3.1563 -31.53125,-31.53118 -379.531256,0 c -16.1877,-62.464 -58.789514,-107.125 -108.750004,- [...]
+ style="opacity:0.56000001;stroke:#000000;stroke-width:4;filter:url(#filter7120)"
+ id="path17"
+ transform="matrix(0.12135861,0,0,0.12135861,46.172783,902.75355)" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 26.650848,1008.9523 c -7.751696,0 -14.043465,8.8565 -14.043465,19.7663 0,10.9097 6.291769,19.7624 14.043465,19.7624 6.168105,0 11.411428,-5.6041 13.296355,-13.3911 l 11.48735,0 3.928986,-4.7595 2.59025,0 1.74453,1.7445 4.183075,0 0.694022,-1.1984 4.03138,0 1.8583,3.2198 3.409423,0 2.210998,-2.211 2.935361,0 2.552323,2.5523 3.204629,0 6.390286,-6.3903 0,-1.8849 -1.433546,-0.383 -3.82659,-3.8266 -46.059387,0 c -1.964516,-7.5806 -7.13461,-13.0005 -13.197745,-13.0005 z m -5.37391 [...]
+ style="fill:url(#linearGradient5921);fill-opacity:1;stroke:#000000;stroke-width:0.48543447"
+ id="path19" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 89.73457,1025.7794 -2.591003,-2.591 0.186192,0.1186 c 0,0 -33.998038,0.3386 -38.197,0.3386 -4.198962,0 -4.943939,2.1338 -4.943939,2.1338 l 45.54575,0 z"
+ style="fill:#4d4d4d;stroke:#000000;stroke-width:0.23058137;filter:url(#filter5893)"
+ id="path21" />
+ <path
+ inkscape:connector-curvature="0"
+ d="m 26.650848,1008.9523 c -7.751696,0 -14.043465,8.8565 -14.043465,19.7663 0,10.9097 6.291769,19.7624 14.043465,19.7624 6.168105,0 11.411428,-5.6041 13.296355,-13.3911 l 11.48735,0 3.928986,-4.7595 2.59025,0 1.74453,1.7445 4.183075,0 0.694022,-1.1984 4.03138,0 1.8583,3.2198 3.409423,0 2.210998,-2.211 2.935361,0 2.552323,2.5523 3.204629,0 6.390286,-6.3903 0,-1.8849 -1.433546,-0.383 -3.82659,-3.8266 -46.059387,0 c -1.964516,-7.5806 -7.13461,-13.0005 -13.197745,-13.0005 z m -5.37391 [...]
+ style="fill:none;stroke:#000000;stroke-width:0.48543447"
+ id="path23" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/icons/ico_cutmark_start.svg b/skins/blackhole/themes/default/icons/ico_cutmark_start.svg
new file mode 100644
index 0000000..48c2ba7
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_cutmark_start.svg
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="20"
+ height="60"
+ id="svg4410"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ viewBox="0 0 20 60.000001"
+ sodipodi:docname="ico_cutmark_start.svg">
+ <defs
+ id="defs4412" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8.4666667"
+ inkscape:cx="3"
+ inkscape:cy="32.5"
+ inkscape:document-units="px"
+ inkscape:current-layer="g5165"
+ showgrid="false"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4415">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-992.3622)">
+ <g
+ id="g5165"
+ transform="matrix(0.99676644,0,0,1.0645673,-431.01827,27.839241)">
+ <g
+ id="g4982"
+ transform="matrix(1.0818105,0,0,0.94391562,-32.786305,51.651891)">
+ <rect
+ style="display:inline;opacity:1;fill:#800000;fill-opacity:1;stroke:#800000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5158"
+ width="5.9545999"
+ height="57.610737"
+ x="441.68228"
+ y="906.12573"
+ ry="0.35725299" />
+ <rect
+ style="opacity:1;fill:#800000;fill-opacity:1;stroke:#800000;stroke-width:1.74931276;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5161"
+ width="13.797397"
+ height="7.0984745"
+ x="431.28522"
+ y="906.00037"
+ ry="3.5492373" />
+ <rect
+ ry="3.5492373"
+ y="956.80945"
+ x="430.83862"
+ height="7.0984745"
+ width="13.797397"
+ id="rect5163"
+ style="opacity:1;fill:#800000;fill-opacity:1;stroke:#800000;stroke-width:1.74931276;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <path
+ style="fill:#aa0000"
+ d="m 3.519685,59.740436 c -2.83822384,-0.789744 -4.24837212,-3.695526 -2.9953,-6.172178 0.5947804,-1.175563 1.9241322,-2.128627 3.3448652,-2.398063 0.3451571,-0.06546 2.2147922,-0.119014 4.1547447,-0.119014 l 3.5271861,0 0,-21.082677 0,-21.0826772 -3.277559,-0.00205 C 3.9689183,8.8810825 3.2550989,8.7351141 1.9590647,7.5925166 1.3158013,7.0254087 0.72338554,5.9229248 0.59012999,5.0449332 0.30222385,3.1479828 1.3351839,1.3732383 3.2570871,0.46279302 L 4.0511811,0.08661428 11.4278 [...]
+ id="path2993"
+ inkscape:connector-curvature="0"
+ transform="matrix(1.0032441,0,0,0.9393488,432.41651,906.02347)" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/icons/ico_cutmark_stop.svg b/skins/blackhole/themes/default/icons/ico_cutmark_stop.svg
new file mode 100644
index 0000000..41d6096
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_cutmark_stop.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="20"
+ height="60"
+ id="svg4410"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ viewBox="0 0 20 60.000001"
+ sodipodi:docname="ico_cutmark_stop.svg">
+ <defs
+ id="defs4412" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="8.4666667"
+ inkscape:cx="3"
+ inkscape:cy="32.5"
+ inkscape:document-units="px"
+ inkscape:current-layer="g5165"
+ showgrid="false"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4415">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-992.3622)">
+ <g
+ id="g5165"
+ transform="matrix(0.99676644,0,0,1.0645673,-431.01827,27.839241)">
+ <g
+ id="g4982"
+ transform="matrix(-1.0818105,0,0,0.94391562,917.69332,51.651891)">
+ <rect
+ style="display:inline;opacity:1;fill:#800000;fill-opacity:1;stroke:#800000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5158"
+ width="5.9545999"
+ height="57.610737"
+ x="441.68228"
+ y="906.12573"
+ ry="0.35725299" />
+ <rect
+ style="opacity:1;fill:#800000;fill-opacity:1;stroke:#800000;stroke-width:1.74931276;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5161"
+ width="13.797397"
+ height="7.0984745"
+ x="431.28522"
+ y="906.00037"
+ ry="3.5492373" />
+ <rect
+ ry="3.5492373"
+ y="956.80945"
+ x="430.83862"
+ height="7.0984745"
+ width="13.797397"
+ id="rect5163"
+ style="opacity:1;fill:#800000;fill-opacity:1;stroke:#800000;stroke-width:1.74931276;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <path
+ style="fill:#aa0000"
+ d="M 0.85091519,59.729752 C 0.64982404,59.641517 0.38407601,59.419967 0.26036401,59.237418 0.04070838,58.913296 0.03543308,58.225468 0.03543308,29.909449 0.03543308,1.098751 0.03694318,0.91134105 0.27165355,0.59351129 0.40157481,0.41758023 0.6619666,0.21826921 0.85030197,0.1505979 1.4004033,-0.04706056 15.228276,-0.0127743 15.980315,0.18811282 c 1.408449,0.37622972 2.534731,1.27768338 3.085096,2.46925198 0.294992,0.6386724 0.340101,0.8773257 0.340101,1.7993282 0,0.9373467 -0.041 [...]
+ id="path2987"
+ inkscape:connector-curvature="0"
+ transform="matrix(1.0032441,0,0,0.9393488,432.41651,906.02347)" />
+ <path
+ style="fill:#aa0000"
+ d="M 3.9119451,59.797809 C 0.19680771,59.715951 0.30997061,59.765067 0.19557725,58.184801 0.0939909,56.781454 0.09298143,2.9742768 0.1945165,1.6439522 0.31082504,0.12006393 0.14135753,0.19082843 3.9262317,0.08570069 5.6202608,0.03864774 9.0520163,0.04798849 11.552355,0.1064579 l 4.54607,0.10630802 0.795398,0.39514232 c 0.951729,0.47280566 1.758455,1.29073706 2.178946,2.20921206 0.270512,0.5908743 0.295774,0.7697596 0.254353,1.8010521 -0.04037,1.005014 -0.08802,1.2167376 -0.38973 [...]
+ id="path2989"
+ inkscape:connector-curvature="0"
+ transform="matrix(1.0032441,0,0,0.9393488,432.41651,906.02347)" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/icons/ico_cutted.svg b/skins/blackhole/themes/default/icons/ico_cutted.svg
new file mode 100644
index 0000000..7938510
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_cutted.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="64px"
+ height="64px"
+ viewBox="0 0 64 64"
+ enable-background="new 0 0 64 64"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_cutted.svg"><metadata
+ id="metadata9"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs7" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ id="namedview5"
+ showgrid="false"
+ inkscape:zoom="3.6875"
+ inkscape:cx="-30.508475"
+ inkscape:cy="32"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><path
+ d="M54.624,47.446c-1.681-2.928-4.358-5.073-7.348-5.889c-2.034-0.556-4.099-0.452-5.896,0.28l-5.271-9.222 c4.684-8.6,11.623-21.324,12.499-22.854c2.141-3.744-1.374-7.9-1.525-8.074l-1.021-1.185l-14.156,24.76L17.749,0.504l-1.021,1.185 c-0.152,0.174-3.667,4.33-1.526,8.074c0.875,1.529,7.815,14.253,12.5,22.854l-5.272,9.222c-1.798-0.732-3.862-0.836-5.897-0.28 c-2.989,0.815-5.667,2.961-7.347,5.889c-3.157,5.519-1.884,12.207,2.836,14.908c1.318,0.758,2.779,1.143,4.342,1.143 c0.858,0,1.75-0.0 [...]
+ id="path3"
+ style="fill:#ffffff" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_dolby.svg b/skins/blackhole/themes/default/icons/ico_dolby.svg
new file mode 100644
index 0000000..90e087a
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_dolby.svg
@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="svg2"
+ x="0px"
+ y="0px"
+ width="150"
+ height="50"
+ viewBox="0 0 150 50"
+ enable-background="new 0 0 308.25 76.25"
+ xml:space="preserve"
+ inkscape:version="0.91pre3 r13670"
+ sodipodi:docname="ico_dolby.svg"><metadata
+ id="metadata21"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs19"><linearGradient
+ inkscape:collect="always"
+ id="linearGradient4162"><stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4164" /><stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="1"
+ id="stop4166" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ id="linearGradient4154"><stop
+ style="stop-color:#00284a;stop-opacity:1;"
+ offset="0"
+ id="stop4156" /><stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop4158" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4154"
+ id="linearGradient4160"
+ x1="50.476055"
+ y1="29.854862"
+ x2="93.398026"
+ y2="-33.420177"
+ gradientUnits="userSpaceOnUse" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4162"
+ id="linearGradient4168"
+ x1="63.584183"
+ y1="1.3730028"
+ x2="-15.027233"
+ y2="62.706097"
+ gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ id="namedview17"
+ showgrid="false"
+ inkscape:zoom="6.1793718"
+ inkscape:cx="102.46508"
+ inkscape:cy="26.935013"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2" /><g
+ inkscape:groupmode="layer"
+ id="layer1"
+ inkscape:label="Back"
+ style="display:inline" /><g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Text"><path
+ id="path257"
+ d="m 62.683935,43.514098 -8.117377,0 c -8.418361,0 -15.434099,-8.300983 -15.434099,-18.601312 0,-9.973769 7.015738,-18.4314746 15.434099,-18.4314746 l 8.116065,0 0.0013,37.0327866 0,0 z m -46.203279,0 -8.1009838,0 0,-37.0327866 8.1009838,0 c 8.402623,0 15.441967,8.4570486 15.441967,18.4308196 0.0013,10.300984 -7.038689,18.601967 -15.441967,18.601967 M 0,50 l 71.051148,0 0,-50 L 0,0 0,50 Z"
+ inkscape:connector-curvature="0"
+ style="display:inline;fill:url(#linearGradient4160);fill-opacity:1;stroke:url(#linearGradient4168);stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /><path
+ id="path239"
+ d="m 82.521982,33.643281 c 0,-0.619013 -0.201666,-0.851045 -0.806274,-0.851045 l -2.759085,0 0,6.25281 2.743123,0 c 0.553608,0 0.822236,-0.171688 0.822236,-0.825739 l 0,-4.576026 z m -0.562952,6.927108 -5.086029,0 0,-9.312449 5.178297,0 c 1.869498,0 2.544572,0.835083 2.544572,2.35731 l 0,4.366963 c 0,2.037683 -0.834693,2.588176 -2.63684,2.588176"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1" /><path
+ style="fill:#ffffff;fill-opacity:1"
+ d="m 86.756185,31.254824 2.072332,0 0,9.315563 -2.072332,0 z"
+ id="rect241"
+ inkscape:connector-curvature="0" /><path
+ id="path243"
+ d="m 97.305888,40.570389 -0.2153,-0.627968 c -0.30989,0.399828 -0.900484,0.790702 -2.328887,0.790702 l -1.022734,0 c -1.775672,0 -2.744292,-0.553608 -2.744292,-2.541069 l 0,-4.67024 c 0,-2.426219 1.819665,-2.454639 3.082219,-2.454639 l 2.432444,0 c 0.93203,0 1.7383,0.177917 2.14124,0.406057 l 0,1.194422 -4.69554,0 c -0.553609,0 -0.891146,0.137818 -0.891146,0.89426 l 0,4.85828 c 0,0.606165 0.38153,0.755662 0.878688,0.755662 l 1.440859,0 c 0.38776,0 1.125899,-0.165848 1.463439,-0.34 [...]
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1" /><path
+ style="fill:#ffffff;fill-opacity:1"
+ d="m 101.0951,31.254824 2.07272,0 0,9.315563 -2.07272,0 z"
+ id="rect245"
+ inkscape:connector-curvature="0" /><path
+ style="fill:#ffffff;fill-opacity:1"
+ d="m 109.19483,32.780168 0,7.790221 -2.0696,0 0,-7.790221 -2.80075,0 0,-1.525342 7.63995,0 0,1.525342 z"
+ id="polygon247"
+ inkscape:connector-curvature="0" /><path
+ id="path249"
+ d="m 116.32516,32.984169 -0.12186,-0.554387 -0.0432,0 -0.13159,0.554387 -1.15665,3.635436 2.63801,0 -1.1847,-3.635436 z m 2.47294,7.58622 -0.78175,-2.391571 -3.63232,0 -0.77552,2.391571 -1.8438,0 3.3197,-9.396931 2.46281,0 3.36409,9.396931 -2.11321,0 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1" /><path
+ style="fill:#ffffff;fill-opacity:1"
+ d="m 129.0453,38.985871 0,1.584518 -6.35248,0 0,-9.312449 2.06961,0 0,7.727931 z"
+ id="polygon251"
+ inkscape:connector-curvature="0" /><path
+ id="path255"
+ d="m 145.75631,11.891394 -3.8733,7.010421 -3.74211,-7.010421 -3.50774,0 c 0.65678,1.188194 5.24565,9.814277 5.24565,9.814277 l 0,5.691417 3.76391,0 c 0.003,-0.76812 0,-5.6665 0,-5.6665 0,0 4.76718,-8.64516 5.43953,-9.839194 l -3.32594,0 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1" /><path
+ id="path259"
+ d="m 105.21096,12.75451 c -1.06907,-0.743985 -2.86965,-1.130187 -5.20789,-1.130187 -2.281782,0 -3.938716,0.312621 -5.213338,1.136415 -1.331462,0.856496 -1.95943,2.294631 -1.95943,4.545268 l 0,4.88125 c 0,2.254142 0.653662,3.777927 1.944247,4.533201 1.042589,0.726853 2.746629,1.071787 5.228521,1.071787 2.45075,0 4.20151,-0.351163 5.20166,-1.0531 1.29409,-0.806274 1.96954,-2.367823 1.96954,-4.551499 l 0,-4.882027 c 0,-2.141241 -0.65599,-3.668528 -1.96331,-4.551109 m -1.54754,9.21550 [...]
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1" /><path
+ id="path261"
+ d="m 84.433915,11.891394 -7.764915,0 0,15.513092 8.313462,0 c 4.093663,0 5.617447,-1.674061 5.617447,-6.172223 l 0,-3.409244 c 0,-4.270022 -1.728565,-5.931625 -6.165994,-5.931625 m 2.696406,9.712667 c 0,2.717817 -1.450594,3.402625 -2.666818,3.402625 l -4.291823,0 0,-10.839347 4.291823,0 c 1.216224,0 2.666818,0.686364 2.666818,3.213806 l 0,4.222916 0,0 z"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1" /><path
+ style="fill:#ffffff;fill-opacity:1"
+ d="m 119.7091,24.820982 -6.46382,0 0,-12.929587 -3.50073,0 0,15.511534 9.96455,0 z"
+ id="polygon263"
+ inkscape:connector-curvature="0" /><path
+ id="path265"
+ d="m 147.31864,26.052389 0.29393,0 0.45005,0.739313 0.28732,0 -0.4812,-0.753717 c 0.25034,-0.03115 0.4411,-0.162345 0.4411,-0.46134 0,-0.33598 -0.19699,-0.485867 -0.60344,-0.485867 l -0.64393,0 0,1.700534 0.25617,0 0,-0.738923 0,0 z m 0,-0.743983 0.3496,0 c 0.30017,0 0.37881,0.08759 0.37881,0.25033 0,0.186093 -0.10356,0.275247 -0.41889,0.275247 l -0.30952,0 0,-0.525577 0,0 z m -1.17496,0.625242 c 0,0.858054 0.68131,1.475509 1.49109,1.475509 0.79693,0 1.48174,-0.617455 1.48174,-1.4 [...]
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1" /><path
+ id="path267"
+ d="m 128.28769,25.144504 -3.15697,0 0,-11.021158 0,-0.0094 3.44155,0 c 1.16601,0 1.89091,0.926961 1.89091,2.191461 0,1.94775 -0.93747,1.994468 -3.62336,2.094523 l 0,1.795916 c 2.39469,-0.0066 4.31752,-0.154558 4.31752,2.330059 3.9e-4,1.244644 -0.79343,2.618542 -2.86965,2.618542 m 1.85664,-5.950701 c 2.75053,-0.249942 3.34852,-1.600091 3.34852,-3.536939 0,-1.710268 -0.72179,-2.577275 -1.51678,-3.066647 -0.66262,-0.417347 -1.44747,-0.698822 -3.09468,-0.698822 l -7.25568,0 0,15.51309 [...]
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff;fill-opacity:1" /></g></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_folder.svg b/skins/blackhole/themes/default/icons/ico_folder.svg
new file mode 100644
index 0000000..879dafc
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_folder.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ width="1000px"
+ height="1000px"
+ viewBox="0 0 1000 1000"
+ enable-background="new 0 0 1000 1000"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_folder.svg"><metadata
+ id="metadata13"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs11" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ id="namedview9"
+ showgrid="false"
+ inkscape:zoom="0.236"
+ inkscape:cx="500"
+ inkscape:cy="500"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><g
+ id="g3"
+ style="fill:#ffffff"><path
+ d="M540,190.7c-12.9-24.8-38.6-40.4-66.5-40.4H129.2c-27.6,0-50,22.4-50,50v26.8h479.7L540,190.7z"
+ id="path5"
+ style="fill:#ffffff" /><path
+ d="M870.8,272.1H79.2v463.7c0,27.6,22.4,50,50,50h741.5c27.6,0,50-22.4,50-50V322.1C920.8,294.5,898.4,272.1,870.8,272.1z"
+ id="path7"
+ style="fill:#ffffff" /></g></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_fwd_active.svg b/skins/blackhole/themes/default/icons/ico_fwd_active.svg
new file mode 100644
index 0000000..d1cacb5
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_fwd_active.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_fwd_active_.svg"
+ width="100%"
+ height="100%"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient4140"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4146"
+ x1="83.682014"
+ y1="94.881378"
+ x2="25.314117"
+ y2="8.9676428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.99379431,0,0,0.99783746,98.258651,0.10780794)" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="5.7268259"
+ inkscape:cx="41.185188"
+ inkscape:cy="47.669492"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 11.845255,18.920038 32.032972,20.992504 0,-17.000157 c 0,-4.370528 3.064862,-6.157655 6.845255,-3.99135 L 92.164705,46.07818 c 3.780393,2.166305 3.780393,5.677695 0,7.844 L 50.723482,81.079324 c -3.780393,2.166305 -6.845255,0.379179 -6.845255,-3.99135 l 0,-17.001154 -32.032972,20.992504 C 8.064862,83.245629 5,81.458503 5,77.087974 L 5,22.912385 c 0,-4.370528 3.064862,-6.157655 6.845255,-3.992347 z"
+ style="fill:url(#linearGradient4146);fill-opacity:1" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_fwd_active_x1.svg b/skins/blackhole/themes/default/icons/ico_fwd_active_x1.svg
new file mode 100644
index 0000000..6e6b723
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_fwd_active_x1.svg
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_fwd_active_x1_.svg"
+ width="100%"
+ height="100%"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient4140"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4146"
+ x1="83.682014"
+ y1="94.881378"
+ x2="25.314117"
+ y2="8.9676428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.99379431,0,0,0.99783746,98.258651,0.10780794)" /><linearGradient
+ id="linearGradient4140-2"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142-6" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144-1" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140-2"
+ id="linearGradient4242"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751736,0,0,1.1149932,2.625789,0.81371249)" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="5.7268259"
+ inkscape:cx="41.185188"
+ inkscape:cy="48.018726"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 11.845255,18.920038 32.032972,20.992504 0,-17.000157 c 0,-4.370528 3.064862,-6.157655 6.845255,-3.99135 L 92.164705,46.07818 c 3.780393,2.166305 3.780393,5.677695 0,7.844 L 50.723482,81.079324 c -3.780393,2.166305 -6.845255,0.379179 -6.845255,-3.99135 l 0,-17.001154 -32.032972,20.992504 C 8.064862,83.245629 5,81.458503 5,77.087974 L 5,22.912385 c 0,-4.370528 3.064862,-6.157655 6.845255,-3.992347 z"
+ style="fill:url(#linearGradient4146);fill-opacity:1" /><rect
+ style="opacity:0.8;fill:url(#linearGradient4242);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4226"
+ width="26.665991"
+ height="9.9999895"
+ x="5.0000048"
+ y="5.0000057"
+ ry="2.2137191" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_fwd_active_x2.svg b/skins/blackhole/themes/default/icons/ico_fwd_active_x2.svg
new file mode 100644
index 0000000..2007221
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_fwd_active_x2.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_fwd_active_x2_.svg"
+ width="100%"
+ height="100%"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient4140"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4146"
+ x1="83.682014"
+ y1="94.881378"
+ x2="25.314117"
+ y2="8.9676428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.99379431,0,0,0.99783746,98.258651,0.10780794)" /><linearGradient
+ id="linearGradient4140-2"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142-6" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144-1" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140-2"
+ id="linearGradient4246"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751733,0,0,1.1149932,34.29179,0.81371249)"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140-2"
+ id="linearGradient4242"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751736,0,0,1.1149932,2.625789,0.81371249)" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="5.7268259"
+ inkscape:cx="41.185188"
+ inkscape:cy="48.018726"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 11.845255,18.920038 32.032972,20.992504 0,-17.000157 c 0,-4.370528 3.064862,-6.157655 6.845255,-3.99135 L 92.164705,46.07818 c 3.780393,2.166305 3.780393,5.677695 0,7.844 L 50.723482,81.079324 c -3.780393,2.166305 -6.845255,0.379179 -6.845255,-3.99135 l 0,-17.001154 -32.032972,20.992504 C 8.064862,83.245629 5,81.458503 5,77.087974 L 5,22.912385 c 0,-4.370528 3.064862,-6.157655 6.845255,-3.992347 z"
+ style="fill:url(#linearGradient4146);fill-opacity:1" /><rect
+ style="opacity:0.8;fill:url(#linearGradient4242);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4226"
+ width="26.665991"
+ height="9.9999895"
+ x="5.0000048"
+ y="5.0000057"
+ ry="2.2137191" /><rect
+ ry="2.2137191"
+ y="5.0000057"
+ x="36.666004"
+ height="9.9999895"
+ width="26.665991"
+ id="rect4244"
+ style="opacity:0.8;fill:url(#linearGradient4246);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_fwd_active_x3.svg b/skins/blackhole/themes/default/icons/ico_fwd_active_x3.svg
new file mode 100644
index 0000000..36b75c7
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_fwd_active_x3.svg
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_fwd_active_x3_.svg"
+ width="100%"
+ height="100%"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient4140"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4146"
+ x1="83.682014"
+ y1="94.881378"
+ x2="25.314117"
+ y2="8.9676428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.99379431,0,0,0.99783746,98.258651,0.10780794)" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140-2"
+ id="linearGradient4250"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751733,0,0,1.1149932,65.959791,0.81371249)"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182" /><linearGradient
+ id="linearGradient4140-2"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4142-6" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4144-1" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140-2"
+ id="linearGradient4246"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751733,0,0,1.1149932,34.29179,0.81371249)"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182" /><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140-2"
+ id="linearGradient4242"
+ x1="4.3004775"
+ y1="14.50319"
+ x2="31.460541"
+ y2="3.2274182"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.91751736,0,0,1.1149932,2.625789,0.81371249)" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="5.7268259"
+ inkscape:cx="41.185188"
+ inkscape:cy="48.018726"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 11.845255,18.920038 32.032972,20.992504 0,-17.000157 c 0,-4.370528 3.064862,-6.157655 6.845255,-3.99135 L 92.164705,46.07818 c 3.780393,2.166305 3.780393,5.677695 0,7.844 L 50.723482,81.079324 c -3.780393,2.166305 -6.845255,0.379179 -6.845255,-3.99135 l 0,-17.001154 -32.032972,20.992504 C 8.064862,83.245629 5,81.458503 5,77.087974 L 5,22.912385 c 0,-4.370528 3.064862,-6.157655 6.845255,-3.992347 z"
+ style="fill:url(#linearGradient4146);fill-opacity:1" /><rect
+ style="opacity:0.8;fill:url(#linearGradient4242);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4226"
+ width="26.665991"
+ height="9.9999895"
+ x="5.0000048"
+ y="5.0000057"
+ ry="2.2137191" /><rect
+ ry="2.2137191"
+ y="5.0000057"
+ x="36.666004"
+ height="9.9999895"
+ width="26.665991"
+ id="rect4244"
+ style="opacity:0.8;fill:url(#linearGradient4246);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /><rect
+ style="opacity:0.8;fill:url(#linearGradient4250);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4248"
+ width="26.665991"
+ height="9.9999895"
+ x="68.334007"
+ y="5.0000057"
+ ry="2.2137191" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_fwd_inactive.svg b/skins/blackhole/themes/default/icons/ico_fwd_inactive.svg
new file mode 100644
index 0000000..fd121a0
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_fwd_inactive.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 100 100"
+ style="enable-background:new 0 0 100 100;"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_fwd_inactive.svg"
+ width="100%"
+ height="100%"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient4140"><stop
+ style="stop-color:#001428;stop-opacity:1;"
+ offset="0"
+ id="stop4142" /><stop
+ style="stop-color:#003c5e;stop-opacity:1;"
+ offset="1"
+ id="stop4144" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4140"
+ id="linearGradient4146"
+ x1="83.682014"
+ y1="94.881378"
+ x2="25.314117"
+ y2="8.9676428"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.99379431,0,0,0.99783746,98.258651,0.10780794)" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="5.7268259"
+ inkscape:cx="49.152542"
+ inkscape:cy="47.669492"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ inkscape:connector-curvature="0"
+ id="path5"
+ d="m 11.845255,18.920038 32.032972,20.992504 0,-17.000157 c 0,-4.370528 3.064862,-6.157655 6.845255,-3.99135 L 92.164705,46.07818 c 3.780393,2.166305 3.780393,5.677695 0,7.844 L 50.723482,81.079324 c -3.780393,2.166305 -6.845255,0.379179 -6.845255,-3.99135 l 0,-17.001154 -32.032972,20.992504 C 8.064862,83.245629 5,81.458503 5,77.087974 L 5,22.912385 c 0,-4.370528 3.064862,-6.157655 6.845255,-3.992347 z"
+ style="fill:url(#linearGradient4146);fill-opacity:1" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_hd1080i.svg b/skins/blackhole/themes/default/icons/ico_hd1080i.svg
new file mode 100644
index 0000000..02ebf25
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_hd1080i.svg
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="50"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre3 r13670"
+ viewBox="0 0 150 50.000001"
+ sodipodi:docname="ico_hd1080i.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4172">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4174" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="1"
+ id="stop4176" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4162">
+ <stop
+ style="stop-color:#c3c3c3;stop-opacity:1"
+ offset="0"
+ id="stop4164" />
+ <stop
+ style="stop-color:#e71f1f;stop-opacity:1"
+ offset="1"
+ id="stop4166" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4192">
+ <stop
+ style="stop-color:#00284a;stop-opacity:1;"
+ offset="0"
+ id="stop4194" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop4196" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4192"
+ id="linearGradient4198"
+ x1="113.87164"
+ y1="1049.3083"
+ x2="137.99171"
+ y2="963.38702"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.4999999e-6,-4.6e-5)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4162"
+ id="linearGradient4168"
+ x1="35.610756"
+ y1="1064.6293"
+ x2="103.83022"
+ y2="996.30615"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4172"
+ id="linearGradient4178"
+ x1="89.026787"
+ y1="989.05988"
+ x2="75.258934"
+ y2="1062.7659"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.83"
+ inkscape:cx="34.416517"
+ inkscape:cy="55.966018"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1002.3622)">
+ <path
+ inkscape:connector-curvature="0"
+ style="opacity:1;fill:url(#linearGradient4198);fill-opacity:1;stroke:url(#linearGradient4168);stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 3.4999999e-6,1002.3622 0,50 L 150,1052.3622 l 0,-50 -149.9999965000001,0 z m 5.0000000000001,5 49.9999985,0 0,40 -49.9999985,0 0,-40 z"
+ id="rect4139" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4178);stroke-width:1.972;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4162"
+ width="148.02827"
+ height="48.028259"
+ x="0.98586887"
+ y="1003.3481"
+ ry="0.6197632" />
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text4180">
+ <path
+ d="m 65.441323,1039.2852 12.6,0 0,-2.38 -4.62,0 0,-19.95 -2.205,0 c -1.225,0.735 -2.695,1.295 -4.725,1.645 l 0,1.855 4.06,0 0,16.45 -5.11,0 0,2.38 z"
+ style=""
+ id="path4153" />
+ <path
+ d="m 88.754604,1039.7052 c 4.445,0 7.14,-4.165 7.14,-11.655 0,-7.49 -2.695,-11.515 -7.14,-11.515 -4.48,0 -7.175,4.025 -7.175,11.515 0,7.49 2.695,11.655 7.175,11.655 z m 0,-2.31 c -2.625,0 -4.375,-2.8 -4.375,-9.345 0,-6.545 1.75,-9.205 4.375,-9.205 2.59,0 4.34,2.66 4.34,9.205 0,6.545 -1.75,9.345 -4.34,9.345 z"
+ style=""
+ id="path4155" />
+ <path
+ d="m 101.42789,1033.3002 c 0,-2.03 1.33,-3.675 3.115,-4.865 3.22,1.295 6.055,2.345 6.055,5.215 0,2.31 -1.785,3.92 -4.375,3.92 -2.73,0 -4.795,-1.785 -4.795,-4.27 z m 6.3,-6.195 c -2.695,-1.05 -5.145,-2.17 -5.145,-4.83 0,-2.17 1.54,-3.605 3.605,-3.605 2.45,0 3.885,1.75 3.885,3.955 0,1.645 -0.84,3.15 -2.345,4.48 z m -8.890005,6.475 c 0,3.535 3.115005,6.125 7.315005,6.125 4.34,0 7.21,-2.625 7.21,-5.95 0,-3.01 -1.89,-4.585 -3.885,-5.74 l 0,-0.14 c 1.365,-1.05 3.08,-3.045 3.08,-5.39 0 [...]
+ style=""
+ id="path4157" />
+ <path
+ d="m 123.48117,1039.7052 c 4.445,0 7.14,-4.165 7.14,-11.655 0,-7.49 -2.695,-11.515 -7.14,-11.515 -4.48,0 -7.175,4.025 -7.175,11.515 0,7.49 2.695,11.655 7.175,11.655 z m 0,-2.31 c -2.625,0 -4.375,-2.8 -4.375,-9.345 0,-6.545 1.75,-9.205 4.375,-9.205 2.59,0 4.34,2.66 4.34,9.205 0,6.545 -1.75,9.345 -4.34,9.345 z"
+ style=""
+ id="path4159" />
+ <path
+ d="m 136.46945,1018.7752 c 1.12,0 1.995,-0.77 1.995,-1.855 0,-1.12 -0.875,-1.855 -1.995,-1.855 -1.12,0 -1.995,0.735 -1.995,1.855 0,1.085 0.875,1.855 1.995,1.855 z m -1.47,20.51 2.87,0 0,-17.01 -2.87,0 0,17.01 z"
+ style=""
+ id="path4161" />
+ </g>
+ <g
+ style="font-style:italic;font-variant:normal;font-weight:600;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Semi-Bold Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text4186">
+ <path
+ d="m 9.1945344,1039.5256 3.7799996,0 2.03,-10.325 9.065,0 -2.1,10.325 3.78,0 4.585,-22.89 -3.78,0 -1.855,9.275 -9.065,0 1.89,-9.275 -3.78,0 -4.5499996,22.89 z"
+ style="font-style:italic;font-variant:normal;font-weight:600;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Semi-Bold Italic';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff"
+ id="path4164" />
+ <path
+ d="m 31.54805,1039.5256 6.65,0 c 7.525,0 12.46,-5.25 12.46,-13.93 0,-5.81 -3.535,-8.96 -9.905,-8.96 l -4.655,0 -4.55,22.89 z m 4.375,-3.045 3.325,-16.8 1.4,0 c 3.885,0 6.16,2.1 6.16,6.16 0,6.755 -3.535,10.64 -8.68,10.64 l -2.205,0 z"
+ style="font-style:italic;font-variant:normal;font-weight:600;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Semi-Bold Italic';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff"
+ id="path4166" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/icons/ico_hd720p.svg b/skins/blackhole/themes/default/icons/ico_hd720p.svg
new file mode 100644
index 0000000..6e10a98
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_hd720p.svg
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="50"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre3 r13670"
+ viewBox="0 0 150 50.000001"
+ sodipodi:docname="ico_hd720p.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4172">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4174" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="1"
+ id="stop4176" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4162">
+ <stop
+ style="stop-color:#c3c3c3;stop-opacity:1"
+ offset="0"
+ id="stop4164" />
+ <stop
+ style="stop-color:#e71f1f;stop-opacity:1"
+ offset="1"
+ id="stop4166" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4192">
+ <stop
+ style="stop-color:#00284a;stop-opacity:1;"
+ offset="0"
+ id="stop4194" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop4196" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4192"
+ id="linearGradient4198"
+ x1="113.87164"
+ y1="1049.3083"
+ x2="137.99171"
+ y2="963.38702"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.4999999e-6,-4.6e-5)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4162"
+ id="linearGradient4168"
+ x1="35.610756"
+ y1="1064.6293"
+ x2="103.83022"
+ y2="996.30615"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4172"
+ id="linearGradient4178"
+ x1="89.026787"
+ y1="989.05988"
+ x2="75.258934"
+ y2="1062.7659"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.83"
+ inkscape:cx="34.416517"
+ inkscape:cy="55.966018"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1002.3622)">
+ <path
+ inkscape:connector-curvature="0"
+ style="opacity:1;fill:url(#linearGradient4198);fill-opacity:1;stroke:url(#linearGradient4168);stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 3.4999999e-6,1002.3622 0,50 L 150,1052.3622 l 0,-50 -149.9999965000001,0 z m 5.0000000000001,5 49.9999985,0 0,40 -49.9999985,0 0,-40 z"
+ id="rect4139" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4178);stroke-width:1.972;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4162"
+ width="148.02827"
+ height="48.028259"
+ x="0.98586887"
+ y="1003.3481"
+ ry="0.6197632" />
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text4180">
+ <path
+ d="m 72.871323,1039.2852 2.975,0 c 0.385,-8.715 1.47,-13.79 6.755,-20.545 l 0,-1.785 -14.385,0 0,2.485 11.13,0 c -4.41,6.125 -6.09,11.445 -6.475,19.845 z"
+ style=""
+ id="path4158" />
+ <path
+ d="m 85.439604,1039.2852 14.42,0 0,-2.485 -6.475,0 c -1.155,0 -2.52,0.105 -3.745,0.21 5.285,-5.53 9.1,-9.695 9.1,-13.895 0,-3.955 -2.555,-6.58 -6.685,-6.58 -2.905,0 -4.9,1.365 -6.755,3.395 l 1.645,1.645 c 1.295,-1.505 2.905,-2.695 4.76,-2.695 2.835,0 4.235,1.82 4.235,4.375 0,3.605 -3.78,7.63 -10.5,14.315 l 0,1.715 z"
+ style=""
+ id="path4160" />
+ <path
+ d="m 110.11789,1039.7052 c 4.445,0 7.14,-4.165 7.14,-11.655 0,-7.49 -2.695,-11.515 -7.14,-11.515 -4.48,0 -7.175,4.025 -7.175,11.515 0,7.49 2.695,11.655 7.175,11.655 z m 0,-2.31 c -2.625,0 -4.375,-2.8 -4.375,-9.345 0,-6.545 1.75,-9.205 4.375,-9.205 2.59,0 4.34,2.66 4.34,9.205 0,6.545 -1.75,9.345 -4.34,9.345 z"
+ style=""
+ id="path4162" />
+ <path
+ d="m 124.43617,1037.7452 c 1.575,1.225 3.15,1.96 4.725,1.96 3.885,0 7.35,-3.395 7.35,-9.17 0,-5.285 -2.345,-8.68 -6.72,-8.68 -1.995,0 -3.885,1.085 -5.425,2.38 l -0.105,0 -0.245,-1.96 -2.38,0 0,24.185 2.87,0 0,-5.74 -0.07,-2.975 z m 0.07,-2.24 0,-8.925 c 1.68,-1.505 3.115,-2.31 4.55,-2.31 3.22,0 4.48,2.52 4.48,6.265 0,4.2 -2.065,6.755 -4.865,6.755 -1.12,0 -2.625,-0.49 -4.165,-1.785 z"
+ style=""
+ id="path4164" />
+ </g>
+ <g
+ style="font-style:italic;font-variant:normal;font-weight:600;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Semi-Bold Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text4186">
+ <path
+ d="m 9.1945344,1039.5256 3.7799996,0 2.03,-10.325 9.065,0 -2.1,10.325 3.78,0 4.585,-22.89 -3.78,0 -1.855,9.275 -9.065,0 1.89,-9.275 -3.78,0 -4.5499996,22.89 z"
+ style="font-style:italic;font-variant:normal;font-weight:600;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Semi-Bold Italic';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff"
+ id="path4153" />
+ <path
+ d="m 31.54805,1039.5256 6.65,0 c 7.525,0 12.46,-5.25 12.46,-13.93 0,-5.81 -3.535,-8.96 -9.905,-8.96 l -4.655,0 -4.55,22.89 z m 4.375,-3.045 3.325,-16.8 1.4,0 c 3.885,0 6.16,2.1 6.16,6.16 0,6.755 -3.535,10.64 -8.68,10.64 l -2.205,0 z"
+ style="font-style:italic;font-variant:normal;font-weight:600;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Semi-Bold Italic';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff"
+ id="path4155" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/icons/ico_new_rec.svg b/skins/blackhole/themes/default/icons/ico_new_rec.svg
new file mode 100644
index 0000000..f3acaf5
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_new_rec.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="512px"
+ height="512px"
+ viewBox="0 0 512 512"
+ style="enable-background:new 0 0 512 512;"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_new_rec.svg"><metadata
+ id="metadata9"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs7" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="852"
+ inkscape:window-height="480"
+ id="namedview5"
+ showgrid="false"
+ inkscape:zoom="0.4609375"
+ inkscape:cx="-114.98305"
+ inkscape:cy="256"
+ inkscape:window-x="840"
+ inkscape:window-y="429"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="Layer_1" /><path
+ d="M450.352,256.508l35.405-36.292c4.403-4.513,6.224-10.947,4.838-17.097c-1.387-6.15-5.79-11.182-11.704-13.37 l-47.546-17.595l16.163-48.054c2.011-5.976,0.859-12.563-3.056-17.504c-3.917-4.94-10.07-7.572-16.344-6.971l-50.478,4.766 l-6.27-50.309c-0.779-6.257-4.672-11.694-10.345-14.448c-5.671-2.753-12.353-2.45-17.75,0.806l-43.818,26.427l-27.876-42.914 c-3.435-5.287-9.311-8.477-15.616-8.477c-6.304,0-12.182,3.19-15.617,8.478l-27.616,42.517L169.4,40.138 c-5.386-3.275-12.065-3.603-17.748 [...]
+ id="path3"
+ style="fill:#ffffff" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_pause_active.svg b/skins/blackhole/themes/default/icons/ico_pause_active.svg
new file mode 100644
index 0000000..8c20614
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_pause_active.svg
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ width="100"
+ height="100"
+ viewBox="0 0 100 100"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_pause_active.svg"><metadata
+ id="metadata45"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs43"><linearGradient
+ id="linearGradient4173"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4175" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4177" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4173"
+ id="linearGradient4179"
+ x1="-13.433744"
+ y1="86.582359"
+ x2="54.143299"
+ y2="-2.3079979"
+ gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview41"
+ showgrid="false"
+ inkscape:zoom="3.3714286"
+ inkscape:cx="26.5"
+ inkscape:cy="35"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><g
+ id="g3"
+ transform="matrix(1.0377358,0,0,0.91428571,22.5,18)"
+ style="fill:url(#linearGradient4179);fill-opacity:1"><g
+ id="g5"
+ style="fill:url(#linearGradient4179);fill-opacity:1"><path
+ d="m 44,0 c -4.972,0 -9,1.529 -9,6.5 l 0,57 c 0,4.971 4.028,6.5 9,6.5 4.971,0 9,-1.529 9,-6.5 l 0,-57 C 53,1.529 48.971,0 44,0 Z"
+ id="path7"
+ inkscape:connector-curvature="0"
+ style="fill:url(#linearGradient4179);fill-opacity:1" /><path
+ d="M 9,0 C 4.028,0 0,1.529 0,6.5 l 0,57 c 0,4.971 4.028,6.5 9,6.5 4.971,0 9,-1.529 9,-6.5 l 0,-57 C 18,1.529 13.971,0 9,0 Z"
+ id="path9"
+ inkscape:connector-curvature="0"
+ style="fill:url(#linearGradient4179);fill-opacity:1" /></g></g><g
+ id="g11"
+ transform="translate(0,30)" /><g
+ id="g13"
+ transform="translate(0,30)" /><g
+ id="g15"
+ transform="translate(0,30)" /><g
+ id="g17"
+ transform="translate(0,30)" /><g
+ id="g19"
+ transform="translate(0,30)" /><g
+ id="g21"
+ transform="translate(0,30)" /><g
+ id="g23"
+ transform="translate(0,30)" /><g
+ id="g25"
+ transform="translate(0,30)" /><g
+ id="g27"
+ transform="translate(0,30)" /><g
+ id="g29"
+ transform="translate(0,30)" /><g
+ id="g31"
+ transform="translate(0,30)" /><g
+ id="g33"
+ transform="translate(0,30)" /><g
+ id="g35"
+ transform="translate(0,30)" /><g
+ id="g37"
+ transform="translate(0,30)" /><g
+ id="g39"
+ transform="translate(0,30)" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_pause_inactive.svg b/skins/blackhole/themes/default/icons/ico_pause_inactive.svg
new file mode 100644
index 0000000..d67da95
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_pause_inactive.svg
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ width="100"
+ height="100"
+ viewBox="0 0 100 100"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_pause_inactive.svg"><metadata
+ id="metadata45"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs43"><linearGradient
+ id="linearGradient4173"><stop
+ style="stop-color:#001428;stop-opacity:1;"
+ offset="0"
+ id="stop4175" /><stop
+ style="stop-color:#003c5e;stop-opacity:1;"
+ offset="1"
+ id="stop4177" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4173"
+ id="linearGradient4179"
+ x1="-13.433744"
+ y1="86.582359"
+ x2="54.143299"
+ y2="-2.3079979"
+ gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview41"
+ showgrid="false"
+ inkscape:zoom="3.3714286"
+ inkscape:cx="26.5"
+ inkscape:cy="35"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><g
+ id="g3"
+ transform="matrix(1.0377358,0,0,0.91428571,22.5,18)"
+ style="fill:url(#linearGradient4179);fill-opacity:1"><g
+ id="g5"
+ style="fill:url(#linearGradient4179);fill-opacity:1"><path
+ d="m 44,0 c -4.972,0 -9,1.529 -9,6.5 l 0,57 c 0,4.971 4.028,6.5 9,6.5 4.971,0 9,-1.529 9,-6.5 l 0,-57 C 53,1.529 48.971,0 44,0 Z"
+ id="path7"
+ inkscape:connector-curvature="0"
+ style="fill:url(#linearGradient4179);fill-opacity:1" /><path
+ d="M 9,0 C 4.028,0 0,1.529 0,6.5 l 0,57 c 0,4.971 4.028,6.5 9,6.5 4.971,0 9,-1.529 9,-6.5 l 0,-57 C 18,1.529 13.971,0 9,0 Z"
+ id="path9"
+ inkscape:connector-curvature="0"
+ style="fill:url(#linearGradient4179);fill-opacity:1" /></g></g><g
+ id="g11"
+ transform="translate(0,30)" /><g
+ id="g13"
+ transform="translate(0,30)" /><g
+ id="g15"
+ transform="translate(0,30)" /><g
+ id="g17"
+ transform="translate(0,30)" /><g
+ id="g19"
+ transform="translate(0,30)" /><g
+ id="g21"
+ transform="translate(0,30)" /><g
+ id="g23"
+ transform="translate(0,30)" /><g
+ id="g25"
+ transform="translate(0,30)" /><g
+ id="g27"
+ transform="translate(0,30)" /><g
+ id="g29"
+ transform="translate(0,30)" /><g
+ id="g31"
+ transform="translate(0,30)" /><g
+ id="g33"
+ transform="translate(0,30)" /><g
+ id="g35"
+ transform="translate(0,30)" /><g
+ id="g37"
+ transform="translate(0,30)" /><g
+ id="g39"
+ transform="translate(0,30)" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_play_active.svg b/skins/blackhole/themes/default/icons/ico_play_active.svg
new file mode 100644
index 0000000..bcb7da2
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_play_active.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ width="100"
+ height="100"
+ viewBox="0 0 100 100"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_play_active.svg"><metadata
+ id="metadata41"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs39"><linearGradient
+ id="linearGradient4169"><stop
+ style="stop-color:#3c0000;stop-opacity:1;"
+ offset="0"
+ id="stop4171" /><stop
+ style="stop-color:#c80000;stop-opacity:1;"
+ offset="1"
+ id="stop4173" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4169"
+ id="linearGradient4175"
+ x1="17.103235"
+ y1="59.3172"
+ x2="26.194145"
+ y2="-7.658658"
+ gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview37"
+ showgrid="false"
+ inkscape:zoom="3.9333333"
+ inkscape:cx="25"
+ inkscape:cy="30"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><g
+ id="g3"
+ transform="matrix(1.1,0,0,1.0666631,22.5,17.999716)"
+ style="fill:url(#linearGradient4175);fill-opacity:1"><path
+ d="M 48.479,27.435 5.672,0.915 C 2.553,-1.132 0,0.374 0,4.261 l 0,51.48 c 0,3.885 2.553,5.391 5.672,3.346 l 42.807,-26.52 c 0,0 1.521,-1.07 1.521,-2.566 0,-1.496 -1.521,-2.566 -1.521,-2.566 z"
+ id="path5"
+ inkscape:connector-curvature="0"
+ style="fill:url(#linearGradient4175);fill-opacity:1" /></g><g
+ id="g7"
+ transform="translate(0,40)" /><g
+ id="g9"
+ transform="translate(0,40)" /><g
+ id="g11"
+ transform="translate(0,40)" /><g
+ id="g13"
+ transform="translate(0,40)" /><g
+ id="g15"
+ transform="translate(0,40)" /><g
+ id="g17"
+ transform="translate(0,40)" /><g
+ id="g19"
+ transform="translate(0,40)" /><g
+ id="g21"
+ transform="translate(0,40)" /><g
+ id="g23"
+ transform="translate(0,40)" /><g
+ id="g25"
+ transform="translate(0,40)" /><g
+ id="g27"
+ transform="translate(0,40)" /><g
+ id="g29"
+ transform="translate(0,40)" /><g
+ id="g31"
+ transform="translate(0,40)" /><g
+ id="g33"
+ transform="translate(0,40)" /><g
+ id="g35"
+ transform="translate(0,40)" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_play_inactive.svg b/skins/blackhole/themes/default/icons/ico_play_inactive.svg
new file mode 100644
index 0000000..5eee008
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_play_inactive.svg
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ width="100"
+ height="100"
+ viewBox="0 0 100 100"
+ xml:space="preserve"
+ inkscape:version="0.48.5 r10040"
+ sodipodi:docname="ico_play_inactive.svg"><metadata
+ id="metadata41"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs39"><linearGradient
+ id="linearGradient4169"><stop
+ style="stop-color:#001428;stop-opacity:1;"
+ offset="0"
+ id="stop4171" /><stop
+ style="stop-color:#003c5e;stop-opacity:1;"
+ offset="1"
+ id="stop4173" /></linearGradient><linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4169"
+ id="linearGradient4175"
+ x1="17.103235"
+ y1="59.3172"
+ x2="26.194145"
+ y2="-7.658658"
+ gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1400"
+ inkscape:window-height="998"
+ id="namedview37"
+ showgrid="false"
+ inkscape:zoom="3.9333333"
+ inkscape:cx="25"
+ inkscape:cy="30"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><g
+ id="g3"
+ transform="matrix(1.1,0,0,1.0666631,22.5,17.999716)"
+ style="fill:url(#linearGradient4175);fill-opacity:1"><path
+ d="M 48.479,27.435 5.672,0.915 C 2.553,-1.132 0,0.374 0,4.261 l 0,51.48 c 0,3.885 2.553,5.391 5.672,3.346 l 42.807,-26.52 c 0,0 1.521,-1.07 1.521,-2.566 0,-1.496 -1.521,-2.566 -1.521,-2.566 z"
+ id="path5"
+ inkscape:connector-curvature="0"
+ style="fill:url(#linearGradient4175);fill-opacity:1" /></g><g
+ id="g7"
+ transform="translate(0,40)" /><g
+ id="g9"
+ transform="translate(0,40)" /><g
+ id="g11"
+ transform="translate(0,40)" /><g
+ id="g13"
+ transform="translate(0,40)" /><g
+ id="g15"
+ transform="translate(0,40)" /><g
+ id="g17"
+ transform="translate(0,40)" /><g
+ id="g19"
+ transform="translate(0,40)" /><g
+ id="g21"
+ transform="translate(0,40)" /><g
+ id="g23"
+ transform="translate(0,40)" /><g
+ id="g25"
+ transform="translate(0,40)" /><g
+ id="g27"
+ transform="translate(0,40)" /><g
+ id="g29"
+ transform="translate(0,40)" /><g
+ id="g31"
+ transform="translate(0,40)" /><g
+ id="g33"
+ transform="translate(0,40)" /><g
+ id="g35"
+ transform="translate(0,40)" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_rec_on.svg b/skins/blackhole/themes/default/icons/ico_rec_on.svg
new file mode 100644
index 0000000..7dc41a6
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_rec_on.svg
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="50"
+ height="50"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre3 r13670"
+ viewBox="0 0 49.999999 50.000001"
+ sodipodi:docname="ico_rec_on.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4240">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4242" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4244" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4214">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="0"
+ id="stop4216" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop4218" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4173">
+ <stop
+ style="stop-color:#2c4255;stop-opacity:1;"
+ offset="0"
+ id="stop4175" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop4177" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4173"
+ id="linearGradient4179"
+ x1="6.1765633"
+ y1="1047.7924"
+ x2="39.66613"
+ y2="1009.4264"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4214"
+ id="linearGradient4220"
+ x1="8.7948284"
+ y1="1042.3796"
+ x2="43.393124"
+ y2="1014.2346"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4240"
+ id="radialGradient4246"
+ cx="42.006367"
+ cy="1003.2948"
+ fx="42.006367"
+ fy="1003.2948"
+ r="23.434333"
+ gradientTransform="translate(0,-8.3618257e-5)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4214"
+ id="linearGradient4155"
+ gradientUnits="userSpaceOnUse"
+ x1="8.7948284"
+ y1="1042.3796"
+ x2="43.393124"
+ y2="1014.2346"
+ gradientTransform="matrix(1.0231507,0,0,1.0231507,-0.57876763,-23.784214)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="10.055058"
+ inkscape:cx="21.134219"
+ inkscape:cy="23.850628"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1002.3622)">
+ <circle
+ style="opacity:1;fill:#aa0000;fill-opacity:1;stroke:url(#linearGradient4155);stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4196"
+ cy="1027.3622"
+ cx="25"
+ r="23.976849" />
+ <ellipse
+ cx="25"
+ cy="1027.3623"
+ rx="23.434328"
+ ry="23.43433"
+ id="ellipse4226"
+ style="opacity:1;fill:url(#radialGradient4246);fill-opacity:1;stroke:url(#linearGradient4220);stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:0.75;fill:#cccccc;fill-opacity:1;stroke:url(#linearGradient4179);stroke-width:2.0349884;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4137"
+ r="23.982506"
+ cy="1027.3622"
+ cx="24.999998" />
+ <ellipse
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#00ffff;stroke-width:2.0599978;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4164"
+ cx="24.99999"
+ cy="1027.3622"
+ r="23.970001" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/icons/ico_recording.svg b/skins/blackhole/themes/default/icons/ico_recording.svg
new file mode 100644
index 0000000..b519600
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_recording.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="512px"
+ height="512px"
+ viewBox="0 0 512 512"
+ style="enable-background:new 0 0 512 512;"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_recording.svg"><metadata
+ id="metadata9"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs7" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ id="namedview5"
+ showgrid="false"
+ inkscape:zoom="0.4609375"
+ inkscape:cx="256"
+ inkscape:cy="256"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><path
+ d="M59.727,431.163h28.07c3.17,0,5.739-2.569,5.739-5.739v-37.333h53.683v37.333c0,3.17,2.57,5.739,5.739,5.739h206.084 c3.169,0,5.739-2.569,5.739-5.739v-37.333h53.683v37.333c0,3.17,2.569,5.739,5.739,5.739h28.07c3.169,0,5.738-2.569,5.738-5.739 V86.576c0-3.17-2.569-5.739-5.738-5.739h-28.07c-3.17,0-5.739,2.569-5.739,5.739v37.333h-53.683V86.576 c0-3.17-2.57-5.739-5.739-5.739H152.958c-3.169,0-5.739,2.569-5.739,5.739v37.333H93.536V86.576c0-3.17-2.569-5.739-5.739-5.739 h-28.07c-3.169,0-5. [...]
+ id="path3"
+ style="fill:#ececec" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_sd576i.svg b/skins/blackhole/themes/default/icons/ico_sd576i.svg
new file mode 100644
index 0000000..934b24d
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_sd576i.svg
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="50"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre3 r13670"
+ viewBox="0 0 150 50.000001"
+ sodipodi:docname="ico_sd576i.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4172">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4174" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="1"
+ id="stop4176" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4162">
+ <stop
+ style="stop-color:#c3c3c3;stop-opacity:1"
+ offset="0"
+ id="stop4164" />
+ <stop
+ style="stop-color:#e71f1f;stop-opacity:1"
+ offset="1"
+ id="stop4166" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4192">
+ <stop
+ style="stop-color:#00284a;stop-opacity:1;"
+ offset="0"
+ id="stop4194" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop4196" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4192"
+ id="linearGradient4198"
+ x1="113.87164"
+ y1="1049.3083"
+ x2="137.99171"
+ y2="963.38702"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(4.4999999e-6,-4.6e-5)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4162"
+ id="linearGradient4168"
+ x1="35.610756"
+ y1="1064.6293"
+ x2="103.83022"
+ y2="996.30615"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4172"
+ id="linearGradient4178"
+ x1="89.026787"
+ y1="989.05988"
+ x2="75.258934"
+ y2="1062.7659"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.83"
+ inkscape:cx="82.139084"
+ inkscape:cy="55.966018"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1002.3622)">
+ <path
+ inkscape:connector-curvature="0"
+ style="opacity:1;fill:url(#linearGradient4198);fill-opacity:1;stroke:url(#linearGradient4168);stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 3.4999999e-6,1002.3622 0,50 L 150,1052.3622 l 0,-50 -149.9999965000001,0 z m 5.0000000000001,5 49.9999985,0 0,40 -49.9999985,0 0,-40 z"
+ id="rect4139" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:url(#linearGradient4178);stroke-width:1.972;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4162"
+ width="148.02827"
+ height="48.028259"
+ x="0.98586887"
+ y="1003.3481"
+ ry="0.6197632" />
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text4180">
+ <path
+ d="m 67.551323,1036.6602 c 1.54,1.54 3.745,3.045 7.315,3.045 3.885,0 7.525,-2.73 7.525,-7.56 0,-4.83 -3.115,-7 -6.93,-7 -1.365,0 -2.38,0.35 -3.43,0.91 l 0.595,-6.615 8.645,0 0,-2.485 -11.165,0 -0.735,10.745 1.54,0.98 c 1.33,-0.875 2.275,-1.365 3.815,-1.365 2.87,0 4.76,1.82 4.76,4.9 0,3.115 -2.17,5.11 -4.9,5.11 -2.625,0 -4.305,-1.225 -5.635,-2.555 l -1.4,1.89 z"
+ style=""
+ id="path4196" />
+ <path
+ d="m 90.234604,1039.2852 2.975,0 c 0.385,-8.715 1.47,-13.79 6.755,-20.545 l 0,-1.785 -14.385,0 0,2.485 11.13,0 c -4.41,6.125 -6.09,11.445 -6.475,19.845 z"
+ style=""
+ id="path4198" />
+ <path
+ d="m 110.78289,1037.4302 c -2.835,0 -4.55,-2.345 -4.9,-6.685 1.505,-2.1 3.255,-2.94 4.655,-2.94 2.765,0 4.13,1.82 4.13,4.725 0,2.94 -1.68,4.9 -3.885,4.9 z m 6.195,-18.515 c -1.26,-1.365 -2.975,-2.38 -5.39,-2.38 -4.445,0 -8.505,3.465 -8.505,12.425 0,7.175 3.325,10.745 7.7,10.745 3.605,0 6.615,-2.905 6.615,-7.175 0,-4.585 -2.52,-6.895 -6.37,-6.895 -1.82,0 -3.815,1.085 -5.215,2.8 0.14,-7.07 2.765,-9.485 5.88,-9.485 1.4,0 2.765,0.665 3.675,1.75 l 1.61,-1.785 z"
+ style=""
+ id="path4200" />
+ <path
+ d="m 123.10617,1018.7752 c 1.12,0 1.995,-0.77 1.995,-1.855 0,-1.12 -0.875,-1.855 -1.995,-1.855 -1.12,0 -1.995,0.735 -1.995,1.855 0,1.085 0.875,1.855 1.995,1.855 z m -1.47,20.51 2.87,0 0,-17.01 -2.87,0 0,17.01 z"
+ style=""
+ id="path4202" />
+ </g>
+ <g
+ style="font-style:italic;font-variant:normal;font-weight:600;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Semi-Bold Italic';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text4186">
+ <path
+ d="m 8.3545344,1035.7806 c 2.0649996,2.905 4.8649996,4.165 7.9099996,4.165 4.97,0 8.33,-3.115 8.33,-7.21 0,-2.625 -1.12,-4.13 -3.325,-5.425 l -2.45,-1.47 c -1.75,-1.05 -2.905,-1.82 -2.905,-3.29 0,-1.575 1.295,-3.08 3.5,-3.08 1.89,0 3.36,1.015 4.515,2.31 l 2.415,-2.205 c -1.61,-1.995 -3.99,-3.36 -6.72,-3.36 -4.305,0 -7.595,3.045 -7.595,6.72 0,2.695 1.47,4.34 3.465,5.565 l 2.415,1.47 c 1.68,1.015 2.765,1.855 2.765,3.29 0,2.135 -1.715,3.465 -4.095,3.465 -2.24,0 -4.165,-1.19 -5.495, [...]
+ style="font-style:italic;font-variant:normal;font-weight:600;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Semi-Bold Italic';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff"
+ id="path4191" />
+ <path
+ d="m 27.309769,1039.5256 6.65,0 c 7.525,0 12.46,-5.25 12.46,-13.93 0,-5.81 -3.535,-8.96 -9.905,-8.96 l -4.655,0 -4.55,22.89 z m 4.375,-3.045 3.325,-16.8 1.4,0 c 3.885,0 6.16,2.1 6.16,6.16 0,6.755 -3.535,10.64 -8.68,10.64 l -2.205,0 z"
+ style="font-style:italic;font-variant:normal;font-weight:600;font-stretch:normal;font-size:35px;line-height:125%;font-family:'Source Sans Pro';-inkscape-font-specification:'Source Sans Pro, Semi-Bold Italic';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff"
+ id="path4193" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/icons/ico_timer.svg b/skins/blackhole/themes/default/icons/ico_timer.svg
new file mode 100644
index 0000000..1e377b2
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_timer.svg
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="512px"
+ height="512px"
+ viewBox="0 0 512 512"
+ enable-background="new 0 0 512 512"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_timer.svg"><metadata
+ id="metadata9"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs7" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="852"
+ inkscape:window-height="480"
+ id="namedview5"
+ showgrid="false"
+ inkscape:zoom="0.4609375"
+ inkscape:cx="256"
+ inkscape:cy="256"
+ inkscape:window-x="555"
+ inkscape:window-y="210"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="Layer_1" /><path
+ d="M64,80V16c0-8.844,7.156-16,16-16s16,7.156,16,16v64c0,8.844-7.156,16-16,16S64,88.844,64,80z M336,96 c8.844,0,16-7.156,16-16V16c0-8.844-7.156-16-16-16s-16,7.156-16,16v64C320,88.844,327.156,96,336,96z M512,384 c0,70.688-57.313,128-128,128s-128-57.313-128-128s57.313-128,128-128S512,313.313,512,384z M480,384c0-52.938-43.063-96-96-96 s-96,43.063-96,96s43.063,96,96,96S480,436.938,480,384z M128,192H64v64h64V192z M64,352h64v-64H64V352z M160,256h64v-64h-64V256z M160,352h64v-64h-64V352 [...]
+ id="path3"
+ style="fill:#ececec" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_timer_active.svg b/skins/blackhole/themes/default/icons/ico_timer_active.svg
new file mode 100644
index 0000000..23a4c47
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_timer_active.svg
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ width="21.621px"
+ height="29.046px"
+ viewBox="0 0 21.621 29.046"
+ style="enable-background:new 0 0 21.621 29.046;"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_timer_active.svg"><metadata
+ id="metadata39"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs37" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ id="namedview35"
+ showgrid="false"
+ inkscape:zoom="8.1250432"
+ inkscape:cx="10.8105"
+ inkscape:cy="14.523"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ d="M21.621,17.932c0,1.291-1.193,2.104-2.486,2.104h-0.01c0.965,0.166,2.111,1.331,2.111,2.462c0,1.243-1.184,2.019-2.43,2.019 h-1.072c0.844,0.243,1.977,1.375,1.977,2.462c0,1.27-1.191,2.067-2.459,2.067H6.443C2.883,29.046,0,26.159,0,22.599 c0,0,0-6.872,0-6.88c0-2.522,1.395-5.189,3.59-6.042c1.711-1.126,5.15-3.133,5.883-6.85c0-1.449,0-2.809,0-2.809 s4.807-0.52,4.807,3.999c0,5.322-3.348,6.186-0.686,6.314h3.98c1.406,0,2.621,1.37,2.621,2.779c0,1.217-1.154,2.006-2.119,2.254 h1.059C20.428,1 [...]
+ id="path3"
+ style="fill:#2ca02c" /><g
+ id="g5" /><g
+ id="g7" /><g
+ id="g9" /><g
+ id="g11" /><g
+ id="g13" /><g
+ id="g15" /><g
+ id="g17" /><g
+ id="g19" /><g
+ id="g21" /><g
+ id="g23" /><g
+ id="g25" /><g
+ id="g27" /><g
+ id="g29" /><g
+ id="g31" /><g
+ id="g33" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_timer_inactive.svg b/skins/blackhole/themes/default/icons/ico_timer_inactive.svg
new file mode 100644
index 0000000..b826014
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_timer_inactive.svg
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ width="64px"
+ height="64px"
+ viewBox="0 0 64 64"
+ enable-background="new 0 0 64 64"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_timer_inactive.svg"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs9" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="3.6875"
+ inkscape:cx="32"
+ inkscape:cy="32"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" /><g
+ id="g3"
+ style="fill:#800000"><path
+ fill="#231F20"
+ d="M55.71,29.883c0.089-0.149,0.206-0.31,0.336-0.451c0.024-0.03,2.384-3.062,1.586-6.226 c-0.395-1.566-1.478-2.846-3.217-3.807c0.438-1.075,1.002-3.068,0.271-5.023c-0.596-1.592-1.905-2.803-3.892-3.598 c-0.206-1.243-0.917-4.161-3.184-6.056c-1.332-1.114-2.979-1.678-4.896-1.678c-0.303,0-0.603,0.014-0.837,0.042 c-0.412-0.05-2.626-0.289-5.701-0.289c-5.128,0-12.479,0.65-18.352,3.739l-4.07,1.208H7.932H5.846v1.765V33.4h2.065l6.229,0.094 c1.83,1.133,3.523,2.616,5.167,4.058c1.792,1.573 [...]
+ id="path5"
+ style="fill:#800000" /></g></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_videotext.svg b/skins/blackhole/themes/default/icons/ico_videotext.svg
new file mode 100644
index 0000000..f75a4e6
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_videotext.svg
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="50"
+ height="50"
+ id="svg4557"
+ version="1.1"
+ inkscape:version="0.91pre3 r13670"
+ viewBox="0 0 49.999999 50.000002"
+ sodipodi:docname="ico_videotext.svg">
+ <defs
+ id="defs4559">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4144">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4146" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="1"
+ id="stop4148" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5131">
+ <stop
+ style="stop-color:#00284a;stop-opacity:1;"
+ offset="0"
+ id="stop5133" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop5135" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5131"
+ id="linearGradient5137"
+ x1="25.232635"
+ y1="1025.8571"
+ x2="48.598396"
+ y2="1002.0261"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4144"
+ id="linearGradient4150"
+ x1="47.160355"
+ y1="1007.4194"
+ x2="-9.0758705"
+ y2="1061.2273"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="7.9727988"
+ inkscape:cx="17.389319"
+ inkscape:cy="26.264818"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4562">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1002.3622)">
+ <rect
+ style="opacity:1;fill:url(#linearGradient5137);fill-opacity:1;stroke:url(#linearGradient4150);stroke-width:1.94959891;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5113"
+ width="48.050404"
+ height="48.050404"
+ x="0.97479796"
+ y="1003.337"
+ ry="0.60414463" />
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:20px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text5105">
+ <path
+ d="m 11.844751,1014.0037 -0.490909,0.5091 -0.854545,-0.8545 0,-3.891 1.345454,-1.3636 0,5.6 z m -0.6,2 -4.4545454,4.4546 -0.9636363,0 0,-0.9637 4.4545457,-4.4727 1.072727,-0.018 -0.109091,1 z m -5.6545454,-2.3454 -0.8545454,0.8545 -0.5090909,-0.5091 0,-5.6 1.3636363,1.3636 0,3.891 z m -1.3636363,6.8 0.6727272,0.6727 0.6909091,-0.6727 0,-4.5819 -0.8545454,-0.8545 -0.5090909,0.5273 0,4.9091 z"
+ style=""
+ id="path4153" />
+ <path
+ d="m 16.231257,1014.0037 -0.509091,0.5091 -0.854546,-0.8545 0,-4.5819 0.672728,-0.6727 0.690909,0.6727 0,4.9273 z m 0,6.4546 -0.690909,0.6727 -0.672728,-0.6727 0,-4.5819 0.854546,-0.8545 0.509091,0.5273 0,4.9091 z"
+ style=""
+ id="path4155" />
+ <path
+ d="m 26.883814,1019.5128 -0.672728,0.6909 -0.672727,-0.6909 0,-3.6364 0.854545,-0.8545 0.49091,0.5273 0,3.9636 z m 0,-5.5091 -0.49091,0.5091 -0.854545,-0.8545 0,-3.6364 0.672727,-0.6909 0.672728,0.6909 0,3.9818 z m -0.927273,-4.9273 -0.672727,0.6909 -4.418182,0 -1.345455,-1.3636 5.763637,0 0.672727,0.6727 z m 0,11.3819 -0.672727,0.6727 -5.763637,0 1.345455,-1.3637 4.418182,0 0.672727,0.691 z m -5.327273,-6.8 -0.854545,0.8545 -0.509091,-0.5091 0,-5.3454 1.363636,1.3636 0,3.6364 z [...]
+ style=""
+ id="path4157" />
+ <path
+ d="m 36.688501,1008.4037 -1.345454,1.3636 -4.672728,0 -1.345454,-1.3636 7.363636,0 z m 0,12.7273 -7.363636,0 1.345454,-1.3637 4.672728,0 1.345454,1.3637 z m -6.254545,-5.2546 0,3.6364 -1.363637,1.3636 0,-5.3272 0.509091,-0.5273 0.854546,0.8545 z m -1.363637,-1.8727 0,-5.3454 1.363637,1.3636 0,3.6364 -0.854546,0.8545 -0.509091,-0.5091 z m 6.181818,0.091 0.69091,0.6727 -0.69091,0.6728 -4.745454,0 -0.672727,-0.6728 0.672727,-0.6727 4.745454,0 z"
+ style=""
+ id="path4159" />
+ <path
+ d="m 46.493189,1014.0037 -0.49091,0.5091 -0.854545,-0.8545 0,-3.6364 0.672727,-0.6909 0.672728,0.6909 0,3.9818 z m -0.927273,-4.9273 -0.672727,0.6909 -4.418182,0 -0.672728,-0.6909 0.672728,-0.6727 4.418182,0 0.672727,0.6727 z m 0.927273,10.4364 -0.672728,0.6909 -0.672727,-0.6909 0,-3.6364 0.854545,-0.8545 0.49091,0.5273 0,3.9636 z m -6.254546,-5.8545 -0.854545,0.8545 -0.509091,-0.5091 0,-3.9818 0.672727,-0.6909 0.690909,0.6909 0,3.6364 z m -1.363636,5.8545 0.672727,0.6909 0.6909 [...]
+ style=""
+ id="path4161" />
+ </g>
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:23.71295929px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text5109">
+ <path
+ d="m 12.277513,1029.2725 -1.595236,1.6168 -5.8204532,0 -1.6167927,-1.6168 9.0324819,0 z m -3.7078447,14.2924 -0.8191749,0.7976 -0.7976177,-0.7976 0,-4.6348 1.01319,-1.0132 0.6036026,0.6036 0,5.0444 z m 0,-6.8336 -0.6036026,0.582 -1.01319,-0.9916 0,-4.333 0.7976177,-0.7976 0.8191749,0.7976 0,4.7426 z"
+ style=""
+ id="path4164" />
+ <path
+ d="m 23.90242,1029.2725 -1.595235,1.6168 -5.54021,0 -1.595235,-1.6168 8.73068,0 z m 0,15.09 -8.73068,0 1.595235,-1.6167 5.54021,0 1.595235,1.6167 z m -7.415689,-6.23 0,4.3115 -1.616792,1.6167 0,-6.3162 0.603602,-0.6252 1.01319,1.0132 z m -1.616792,-2.2204 0,-6.3378 1.616792,1.6168 0,4.3114 -1.01319,1.0132 -0.603602,-0.6036 z m 7.32946,0.1078 0.819175,0.7976 -0.819175,0.7976 -5.626439,0 -0.797617,-0.7976 0.797617,-0.7976 5.626439,0 z"
+ style=""
+ id="path4166" />
+ <path
+ d="m 31.323667,1036.5157 0,-1.7677 3.2767,-5.4755 0.926961,0 0,1.5737 -3.384486,5.6695 -0.819175,0 z m -1.422778,0 -3.406043,-5.6695 0,-1.5737 0.926961,0 3.2767,5.4755 0,1.7677 -0.797618,0 z m 0.797618,0.6036 0,1.7677 -3.2767,5.4755 -0.926961,0 0,-1.5736 3.406043,-5.6696 0.797618,0 z m 1.422778,0 3.406043,5.6696 0,1.5736 -0.926961,0 -3.2767,-5.4755 0,-1.7677 0.797618,0 z"
+ style=""
+ id="path4168" />
+ <path
+ d="m 47.152234,1029.2725 -1.595235,1.6168 -5.820454,0 -1.616792,-1.6168 9.032481,0 z m -3.707844,14.2924 -0.819175,0.7976 -0.797618,-0.7976 0,-4.6348 1.01319,-1.0132 0.603603,0.6036 0,5.0444 z m 0,-6.8336 -0.603603,0.582 -1.01319,-0.9916 0,-4.333 0.797618,-0.7976 0.819175,0.7976 0,4.7426 z"
+ style=""
+ id="path4170" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/icons/ico_volume_full.svg b/skins/blackhole/themes/default/icons/ico_volume_full.svg
new file mode 100644
index 0000000..3dbfe7a
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_volume_full.svg
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ width="150"
+ height="150"
+ viewBox="0 0 150 150"
+ enable-background="new 0 0 128 128"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_volume_full.svg"><metadata
+ id="metadata13"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs11" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ id="namedview9"
+ showgrid="false"
+ inkscape:zoom="1.84375"
+ inkscape:cx="64"
+ inkscape:cy="64"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ d="m 55.484746,35.10678 -21.9,16.4 -20,0 c -3.3,0 -6.0000002,2.7 -6.0000002,6 l 0,41.8 c 0,3.3 2.7000002,6 6.0000002,6 l 20,0 21.9,16.4 c 4,3 9.6,0.2 9.6,-4.8 l 0,-77 c 0,-5 -5.7,-7.8 -9.6,-4.8 z"
+ id="path3"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 84.884746,44.90678 c -2.7,-2.7 -7.2,-2.7 -9.9,0 -2.7,2.7 -2.7,7.2 0,9.9 13,13 13,34.1 0,47.1 -2.7,2.7 -2.7,7.2 0,9.9 1.4,1.4 3.2,2 4.9,2 1.7,0 3.6,-0.7 4.9,-2.1 18.600004,-18.3 18.600004,-48.3 0.1,-66.8 z"
+ id="path5"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 92.684746,29.20678 c -2.7,2.7 -2.7,7.2 0,9.9 10.500004,10.5 16.300004,24.4 16.300004,39.3 0,14.9 -5.8,28.8 -16.300004,39.3 -2.7,2.7 -2.7,7.2 0,9.9 1.4,1.4 3.2,2.1 4.9,2.1 1.8,0 3.600004,-0.7 4.900004,-2 13.1,-13.1 20.4,-30.6 20.4,-49.2 0,-18.6 -7.2,-36 -20.4,-49.2 -2.600004,-2.8 -7.000004,-2.8 -9.800004,-0.1 z"
+ id="path7"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ inkscape:connector-curvature="0"
+ id="path4142"
+ d="m 116.58324,17.126202 c -2.74544,3.22855 -2.74544,8.609466 0,11.838016 10.67672,12.555472 16.57435,29.176524 16.57435,46.993336 0,17.816806 -5.89763,34.437866 -16.57435,46.993336 -2.74544,3.22855 -2.74544,8.60947 0,11.83802 1.42357,1.67406 3.25386,2.51109 4.98247,2.51109 1.8303,0 3.66059,-0.83703 4.98247,-2.39152 13.32049,-15.66444 20.74335,-36.59023 20.74335,-58.83135 0,-22.241121 -7.32118,-43.047331 -20.74335,-58.831352 -2.64376,-3.348126 -7.11781,-3.348126 -9.96494,-0.119576 z"
+ style="fill:#ffffff" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_volume_low.svg b/skins/blackhole/themes/default/icons/ico_volume_low.svg
new file mode 100644
index 0000000..6b4259d
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_volume_low.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ width="150"
+ height="150"
+ viewBox="0 0 150 150"
+ enable-background="new 0 0 128 128"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_volume_low.svg"><metadata
+ id="metadata13"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs11" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ id="namedview9"
+ showgrid="false"
+ inkscape:zoom="1.84375"
+ inkscape:cx="64"
+ inkscape:cy="64"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ d="m 55.484746,35.10678 -21.9,16.4 -20,0 c -3.3,0 -6.0000002,2.7 -6.0000002,6 l 0,41.8 c 0,3.3 2.7000002,6 6.0000002,6 l 20,0 21.9,16.4 c 4,3 9.6,0.2 9.6,-4.8 l 0,-77 c 0,-5 -5.7,-7.8 -9.6,-4.8 z"
+ id="path3"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 84.884746,44.90678 c -2.7,-2.7 -7.2,-2.7 -9.9,0 -2.7,2.7 -2.7,7.2 0,9.9 13,13 13,34.1 0,47.1 -2.7,2.7 -2.7,7.2 0,9.9 1.4,1.4 3.2,2 4.9,2 1.7,0 3.6,-0.7 4.9,-2.1 18.600004,-18.3 18.600004,-48.3 0.1,-66.8 z"
+ id="path5"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_volume_medium.svg b/skins/blackhole/themes/default/icons/ico_volume_medium.svg
new file mode 100644
index 0000000..24042fe
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_volume_medium.svg
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ width="150"
+ height="150"
+ viewBox="0 0 150 150"
+ enable-background="new 0 0 128 128"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_volume_medium.svg"><metadata
+ id="metadata13"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs11" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ id="namedview9"
+ showgrid="false"
+ inkscape:zoom="1.84375"
+ inkscape:cx="64"
+ inkscape:cy="64"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ d="m 55.484746,35.10678 -21.9,16.4 -20,0 c -3.3,0 -6.0000002,2.7 -6.0000002,6 l 0,41.8 c 0,3.3 2.7000002,6 6.0000002,6 l 20,0 21.9,16.4 c 4,3 9.6,0.2 9.6,-4.8 l 0,-77 c 0,-5 -5.7,-7.8 -9.6,-4.8 z"
+ id="path3"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 84.884746,44.90678 c -2.7,-2.7 -7.2,-2.7 -9.9,0 -2.7,2.7 -2.7,7.2 0,9.9 13,13 13,34.1 0,47.1 -2.7,2.7 -2.7,7.2 0,9.9 1.4,1.4 3.2,2 4.9,2 1.7,0 3.6,-0.7 4.9,-2.1 18.600004,-18.3 18.600004,-48.3 0.1,-66.8 z"
+ id="path5"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /><path
+ d="m 92.684746,29.20678 c -2.7,2.7 -2.7,7.2 0,9.9 10.500004,10.5 16.300004,24.4 16.300004,39.3 0,14.9 -5.8,28.8 -16.300004,39.3 -2.7,2.7 -2.7,7.2 0,9.9 1.4,1.4 3.2,2.1 4.9,2.1 1.8,0 3.600004,-0.7 4.900004,-2 13.1,-13.1 20.4,-30.6 20.4,-49.2 0,-18.6 -7.2,-36 -20.4,-49.2 -2.600004,-2.8 -7.000004,-2.8 -9.800004,-0.1 z"
+ id="path7"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_volume_mute.svg b/skins/blackhole/themes/default/icons/ico_volume_mute.svg
new file mode 100644
index 0000000..a2b915f
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_volume_mute.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Capa_1"
+ x="0px"
+ y="0px"
+ width="150"
+ height="150"
+ viewBox="0 0 150 150"
+ enable-background="new 0 0 128 128"
+ xml:space="preserve"
+ inkscape:version="0.91pre2 r13516"
+ sodipodi:docname="ico_volume_mute.svg"><metadata
+ id="metadata13"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs11" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ id="namedview9"
+ showgrid="false"
+ inkscape:zoom="1.84375"
+ inkscape:cx="64"
+ inkscape:cy="64"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Capa_1" /><path
+ d="m 55.484746,35.10678 -21.9,16.4 -20,0 c -3.3,0 -6.0000002,2.7 -6.0000002,6 l 0,41.8 c 0,3.3 2.7000002,6 6.0000002,6 l 20,0 21.9,16.4 c 4,3 9.6,0.2 9.6,-4.8 l 0,-77 c 0,-5 -5.7,-7.8 -9.6,-4.8 z"
+ id="path3"
+ inkscape:connector-curvature="0"
+ style="fill:#ffffff" /></svg>
\ No newline at end of file
diff --git a/skins/blackhole/themes/default/icons/ico_widescreen.svg b/skins/blackhole/themes/default/icons/ico_widescreen.svg
new file mode 100644
index 0000000..ed7d0c8
--- /dev/null
+++ b/skins/blackhole/themes/default/icons/ico_widescreen.svg
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="50"
+ id="svg4226"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 50.000001"
+ sodipodi:docname="ico_widescreen.svg">
+ <defs
+ id="defs4228">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4152">
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="0"
+ id="stop4154" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop4156" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4793">
+ <stop
+ style="stop-color:#00284a;stop-opacity:1;"
+ offset="0"
+ id="stop4795" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop4797" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4793"
+ id="linearGradient4799"
+ x1="74.292336"
+ y1="1044.8075"
+ x2="136.43808"
+ y2="1007.2992"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.98704728,0,0,0.95610511,0.97145448,45.091876)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="linearGradient4158"
+ x1="4.2645707"
+ y1="1057.3361"
+ x2="159.72176"
+ y2="984.17682"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.98704728,0,0,0.95610511,0.97145448,45.091876)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.5387454"
+ inkscape:cx="70.5"
+ inkscape:cy="24.5"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <metadata
+ id="metadata4231">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1002.3622)">
+ <path
+ style="fill:url(#linearGradient4799);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4158);stroke-width:1.94290602;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 0.97145301,1003.4554 c 48.96784399,5.0284 98.28055599,5.5469 148.05709699,0 l 0,47.8053 c -49.138948,-5.9953 -98.51387,-5.3615 -148.05709699,0 z"
+ id="path4774"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="text4801"
+ transform="translate(-0.3942576,1.101626)">
+ <path
+ d="m 56.21701,1036.2286 -10.822753,0 0,-2.041 4.162597,0 0,-13.4009 -4.162597,0 0,-1.8261 q 0.845947,0 1.812744,-0.1343 0.966797,-0.1477 1.463623,-0.4163 0.617676,-0.3357 0.966797,-0.8459 0.362548,-0.5237 0.416259,-1.3965 l 2.081299,0 0,18.02 4.082031,0 0,2.041 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="path4146"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 75.163544,1029.743 q 0,3.0481 -2.01416,4.9817 -2.000733,1.9202 -4.914551,1.9202 -1.477051,0 -2.685547,-0.4565 -1.208496,-0.4566 -2.13501,-1.3562 -1.154785,-1.1145 -1.785889,-2.9541 -0.617675,-1.8396 -0.617675,-4.4312 0,-2.6587 0.563965,-4.7131 0.577392,-2.0545 1.826171,-3.6524 1.181641,-1.5173 3.048096,-2.3633 1.866455,-0.8593 4.350586,-0.8593 0.792236,0 1.329346,0.067 0.537109,0.067 1.087646,0.2417 l 0,2.5647 -0.134277,0 q -0.375977,-0.2014 -1.141358,-0.376 -0.751953,-0.18 [...]
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="path4148"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 84.536102,1025.0568 -3.209228,0 0,-3.8269 3.209228,0 0,3.8269 z m 0,11.1718 -3.209228,0 0,-3.8269 3.209228,0 0,3.8269 z"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="path4150"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 104.86569,1025.0299 q 0,2.6184 -0.60425,4.7534 -0.59082,2.135 -1.79931,3.6389 -1.22193,1.5308 -3.061526,2.3633 -1.839599,0.8325 -4.32373,0.8325 -0.698242,0 -1.315918,-0.081 -0.617676,-0.067 -1.101074,-0.2283 l 0,-2.5647 0.134277,0 q 0.389404,0.2014 1.101074,0.3894 0.71167,0.1746 1.584473,0.1746 2.967529,0 4.645994,-1.7725 1.6919,-1.7859 1.96045,-4.9145 -1.24878,0.7519 -2.349852,1.0742 -1.101075,0.3222 -2.403565,0.3222 -1.235351,0 -2.242431,-0.2417 -0.993653,-0.2417 -2.00073 [...]
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:27.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start"
+ id="path4152"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/icons/partly-cloudy-day.png b/skins/blackhole/themes/default/icons/partly-cloudy-day.png
new file mode 100644
index 0000000..b6df179
Binary files /dev/null and b/skins/blackhole/themes/default/icons/partly-cloudy-day.png differ
diff --git a/skins/blackhole/themes/default/icons/partly-cloudy-night.png b/skins/blackhole/themes/default/icons/partly-cloudy-night.png
new file mode 100644
index 0000000..aa358fb
Binary files /dev/null and b/skins/blackhole/themes/default/icons/partly-cloudy-night.png differ
diff --git a/skins/blackhole/themes/default/icons/rain.png b/skins/blackhole/themes/default/icons/rain.png
new file mode 100644
index 0000000..8275003
Binary files /dev/null and b/skins/blackhole/themes/default/icons/rain.png differ
diff --git a/skins/blackhole/themes/default/icons/sleet.png b/skins/blackhole/themes/default/icons/sleet.png
new file mode 100644
index 0000000..1d99ae0
Binary files /dev/null and b/skins/blackhole/themes/default/icons/sleet.png differ
diff --git a/skins/blackhole/themes/default/icons/snow.png b/skins/blackhole/themes/default/icons/snow.png
new file mode 100644
index 0000000..939e22f
Binary files /dev/null and b/skins/blackhole/themes/default/icons/snow.png differ
diff --git a/skins/blackhole/themes/default/icons/wind.png b/skins/blackhole/themes/default/icons/wind.png
new file mode 100644
index 0000000..d92ec15
Binary files /dev/null and b/skins/blackhole/themes/default/icons/wind.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Applikationen.png b/skins/blackhole/themes/default/menuicons/customicons/Applikationen.png
new file mode 100644
index 0000000..3c3b616
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Applikationen.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Audio.png b/skins/blackhole/themes/default/menuicons/customicons/Audio.png
new file mode 100644
index 0000000..ff387fe
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Audio.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Aufnahmen-Liste aktualisieren.png b/skins/blackhole/themes/default/menuicons/customicons/Aufnahmen-Liste aktualisieren.png
new file mode 100644
index 0000000..3cdddc9
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Aufnahmen-Liste aktualisieren.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Dienstprogramme.png b/skins/blackhole/themes/default/menuicons/customicons/Dienstprogramme.png
new file mode 100644
index 0000000..793aba6
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Dienstprogramme.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/FireFox.png b/skins/blackhole/themes/default/menuicons/customicons/FireFox.png
new file mode 100644
index 0000000..192fadc
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/FireFox.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Info.png b/skins/blackhole/themes/default/menuicons/customicons/Info.png
new file mode 100644
index 0000000..6737431
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Info.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Internet.png b/skins/blackhole/themes/default/menuicons/customicons/Internet.png
new file mode 100644
index 0000000..f3db150
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Internet.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Medien.png b/skins/blackhole/themes/default/menuicons/customicons/Medien.png
new file mode 100644
index 0000000..0ce2360
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Medien.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Rechner neu starten.png b/skins/blackhole/themes/default/menuicons/customicons/Rechner neu starten.png
new file mode 100644
index 0000000..5783ccf
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Rechner neu starten.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Remote wakeup.png b/skins/blackhole/themes/default/menuicons/customicons/Remote wakeup.png
new file mode 100644
index 0000000..1cd2f6e
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Remote wakeup.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Spiele.png b/skins/blackhole/themes/default/menuicons/customicons/Spiele.png
new file mode 100644
index 0000000..8e07161
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Spiele.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/System herunterfahren.png b/skins/blackhole/themes/default/menuicons/customicons/System herunterfahren.png
new file mode 100644
index 0000000..e0234df
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/System herunterfahren.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/System.png b/skins/blackhole/themes/default/menuicons/customicons/System.png
new file mode 100644
index 0000000..81d100e
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/System.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Tools.png b/skins/blackhole/themes/default/menuicons/customicons/Tools.png
new file mode 100644
index 0000000..cf328ef
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Tools.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Tunderbird.png b/skins/blackhole/themes/default/menuicons/customicons/Tunderbird.png
new file mode 100644
index 0000000..5ae27e0
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Tunderbird.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/USB Massenspeicher sicher entfernen.png b/skins/blackhole/themes/default/menuicons/customicons/USB Massenspeicher sicher entfernen.png
new file mode 100644
index 0000000..cd7b81c
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/USB Massenspeicher sicher entfernen.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/VDR neu starten.png b/skins/blackhole/themes/default/menuicons/customicons/VDR neu starten.png
new file mode 100644
index 0000000..14904ca
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/VDR neu starten.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Video.png b/skins/blackhole/themes/default/menuicons/customicons/Video.png
new file mode 100644
index 0000000..490ca4b
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Video.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Web.png b/skins/blackhole/themes/default/menuicons/customicons/Web.png
new file mode 100644
index 0000000..20260e3
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Web.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/XBMC.png b/skins/blackhole/themes/default/menuicons/customicons/XBMC.png
new file mode 100644
index 0000000..c7c4c04
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/XBMC.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/Xterm.png b/skins/blackhole/themes/default/menuicons/customicons/Xterm.png
new file mode 100644
index 0000000..fa75282
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/Xterm.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/audiovideo.png b/skins/blackhole/themes/default/menuicons/customicons/audiovideo.png
new file mode 100644
index 0000000..726538d
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/audiovideo.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/markad_status.png b/skins/blackhole/themes/default/menuicons/customicons/markad_status.png
new file mode 100644
index 0000000..4fdc7a4
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/markad_status.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/schneiden_abbrechen.png b/skins/blackhole/themes/default/menuicons/customicons/schneiden_abbrechen.png
new file mode 100644
index 0000000..b2e0bd3
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/schneiden_abbrechen.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/tux.png b/skins/blackhole/themes/default/menuicons/customicons/tux.png
new file mode 100644
index 0000000..c5b4742
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/tux.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/usb.png b/skins/blackhole/themes/default/menuicons/customicons/usb.png
new file mode 100644
index 0000000..c4db1d4
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/usb.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/vdrlogo.png b/skins/blackhole/themes/default/menuicons/customicons/vdrlogo.png
new file mode 100644
index 0000000..037a191
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/vdrlogo.png differ
diff --git a/skins/blackhole/themes/default/menuicons/customicons/yaicon_blue.png b/skins/blackhole/themes/default/menuicons/customicons/yaicon_blue.png
new file mode 100644
index 0000000..2c49273
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/customicons/yaicon_blue.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/admin.png b/skins/blackhole/themes/default/menuicons/pluginicons/admin.png
new file mode 100644
index 0000000..cf328ef
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/admin.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/arghdirector.png b/skins/blackhole/themes/default/menuicons/pluginicons/arghdirector.png
new file mode 100644
index 0000000..bbd221a
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/arghdirector.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/autostart.png b/skins/blackhole/themes/default/menuicons/pluginicons/autostart.png
new file mode 100644
index 0000000..6fdb1bb
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/autostart.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/avahi4vdr.png b/skins/blackhole/themes/default/menuicons/pluginicons/avahi4vdr.png
new file mode 100644
index 0000000..044e71d
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/avahi4vdr.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/avards.png b/skins/blackhole/themes/default/menuicons/pluginicons/avards.png
new file mode 100644
index 0000000..cf8d037
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/avards.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/block.png b/skins/blackhole/themes/default/menuicons/pluginicons/block.png
new file mode 100644
index 0000000..86127c2
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/block.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/burn.png b/skins/blackhole/themes/default/menuicons/pluginicons/burn.png
new file mode 100644
index 0000000..305d7ff
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/burn.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/cdplayer.png b/skins/blackhole/themes/default/menuicons/pluginicons/cdplayer.png
new file mode 100644
index 0000000..89a6c19
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/cdplayer.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/chanman.png b/skins/blackhole/themes/default/menuicons/pluginicons/chanman.png
new file mode 100644
index 0000000..a73e83c
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/chanman.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/check.png b/skins/blackhole/themes/default/menuicons/pluginicons/check.png
new file mode 100644
index 0000000..d487a24
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/check.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/conflictcheckonly.png b/skins/blackhole/themes/default/menuicons/pluginicons/conflictcheckonly.png
new file mode 100644
index 0000000..7f832bd
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/conflictcheckonly.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/ddci.png b/skins/blackhole/themes/default/menuicons/pluginicons/ddci.png
new file mode 100644
index 0000000..4ad459c
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/ddci.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/devstatus.png b/skins/blackhole/themes/default/menuicons/pluginicons/devstatus.png
new file mode 100644
index 0000000..96c0ec1
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/devstatus.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/dummydevice.png b/skins/blackhole/themes/default/menuicons/pluginicons/dummydevice.png
new file mode 100644
index 0000000..11fd707
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/dummydevice.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/duplicates.png b/skins/blackhole/themes/default/menuicons/pluginicons/duplicates.png
new file mode 100644
index 0000000..dc1be57
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/duplicates.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/dvbapi.png b/skins/blackhole/themes/default/menuicons/pluginicons/dvbapi.png
new file mode 100644
index 0000000..b966461
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/dvbapi.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/dvbhddevice.png b/skins/blackhole/themes/default/menuicons/pluginicons/dvbhddevice.png
new file mode 100644
index 0000000..b874297
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/dvbhddevice.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/dvbsddevice.png b/skins/blackhole/themes/default/menuicons/pluginicons/dvbsddevice.png
new file mode 100644
index 0000000..106184e
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/dvbsddevice.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/dynamite.png b/skins/blackhole/themes/default/menuicons/pluginicons/dynamite.png
new file mode 100644
index 0000000..28ea35a
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/dynamite.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/eepg.png b/skins/blackhole/themes/default/menuicons/pluginicons/eepg.png
new file mode 100644
index 0000000..3938b96
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/eepg.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/epg2vdr.png b/skins/blackhole/themes/default/menuicons/pluginicons/epg2vdr.png
new file mode 100644
index 0000000..ac8757e
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/epg2vdr.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/epgsearch.png b/skins/blackhole/themes/default/menuicons/pluginicons/epgsearch.png
new file mode 100644
index 0000000..5eab415
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/epgsearch.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/epgsearchonly.png b/skins/blackhole/themes/default/menuicons/pluginicons/epgsearchonly.png
new file mode 100644
index 0000000..b5186e7
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/epgsearchonly.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/epgsync.png b/skins/blackhole/themes/default/menuicons/pluginicons/epgsync.png
new file mode 100644
index 0000000..5c14009
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/epgsync.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/externalplayer.png b/skins/blackhole/themes/default/menuicons/pluginicons/externalplayer.png
new file mode 100644
index 0000000..2bd67db
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/externalplayer.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/extrecmenu.png b/skins/blackhole/themes/default/menuicons/pluginicons/extrecmenu.png
new file mode 100644
index 0000000..6f613f1
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/extrecmenu.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/favorites.png b/skins/blackhole/themes/default/menuicons/pluginicons/favorites.png
new file mode 100644
index 0000000..409c852
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/favorites.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/femon.png b/skins/blackhole/themes/default/menuicons/pluginicons/femon.png
new file mode 100644
index 0000000..e87b711
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/femon.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/fepg.png b/skins/blackhole/themes/default/menuicons/pluginicons/fepg.png
new file mode 100644
index 0000000..65023ed
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/fepg.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/filebrowser.png b/skins/blackhole/themes/default/menuicons/pluginicons/filebrowser.png
new file mode 100644
index 0000000..d3f90e0
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/filebrowser.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/fritzbox.png b/skins/blackhole/themes/default/menuicons/pluginicons/fritzbox.png
new file mode 100644
index 0000000..7bfc229
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/fritzbox.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/graphlcd.png b/skins/blackhole/themes/default/menuicons/pluginicons/graphlcd.png
new file mode 100644
index 0000000..39ffd35
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/graphlcd.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/graphtft.png b/skins/blackhole/themes/default/menuicons/pluginicons/graphtft.png
new file mode 100644
index 0000000..39ffd35
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/graphtft.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/image.png b/skins/blackhole/themes/default/menuicons/pluginicons/image.png
new file mode 100644
index 0000000..33644e0
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/image.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/imonlcd.png b/skins/blackhole/themes/default/menuicons/pluginicons/imonlcd.png
new file mode 100644
index 0000000..3d34fc4
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/imonlcd.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/iptv.png b/skins/blackhole/themes/default/menuicons/pluginicons/iptv.png
new file mode 100644
index 0000000..4494ddc
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/iptv.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/lcdproc.png b/skins/blackhole/themes/default/menuicons/pluginicons/lcdproc.png
new file mode 100644
index 0000000..3d34fc4
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/lcdproc.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/mailbox.png b/skins/blackhole/themes/default/menuicons/pluginicons/mailbox.png
new file mode 100644
index 0000000..1bc76e8
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/mailbox.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/makemkv.png b/skins/blackhole/themes/default/menuicons/pluginicons/makemkv.png
new file mode 100644
index 0000000..41cddf1
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/makemkv.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/markad.png b/skins/blackhole/themes/default/menuicons/pluginicons/markad.png
new file mode 100644
index 0000000..b3defaf
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/markad.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/mlist.png b/skins/blackhole/themes/default/menuicons/pluginicons/mlist.png
new file mode 100644
index 0000000..19c367f
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/mlist.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/music.png b/skins/blackhole/themes/default/menuicons/pluginicons/music.png
new file mode 100644
index 0000000..abb012e
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/music.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/noepg.png b/skins/blackhole/themes/default/menuicons/pluginicons/noepg.png
new file mode 100644
index 0000000..eb9410d
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/noepg.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/nordlichtsepg.png b/skins/blackhole/themes/default/menuicons/pluginicons/nordlichtsepg.png
new file mode 100644
index 0000000..3ee3fa2
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/nordlichtsepg.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/osdteletext.png b/skins/blackhole/themes/default/menuicons/pluginicons/osdteletext.png
new file mode 100644
index 0000000..664e770
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/osdteletext.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/peer.png b/skins/blackhole/themes/default/menuicons/pluginicons/peer.png
new file mode 100644
index 0000000..998d568
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/peer.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/play.png b/skins/blackhole/themes/default/menuicons/pluginicons/play.png
new file mode 100644
index 0000000..2848fc6
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/play.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/pvrinput.png b/skins/blackhole/themes/default/menuicons/pluginicons/pvrinput.png
new file mode 100644
index 0000000..724f698
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/pvrinput.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/quickepgsearch.png b/skins/blackhole/themes/default/menuicons/pluginicons/quickepgsearch.png
new file mode 100644
index 0000000..76a31f4
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/quickepgsearch.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/radio.png b/skins/blackhole/themes/default/menuicons/pluginicons/radio.png
new file mode 100644
index 0000000..193b7d4
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/radio.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/remote.png b/skins/blackhole/themes/default/menuicons/pluginicons/remote.png
new file mode 100644
index 0000000..7f46b1b
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/remote.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/remotetimers.png b/skins/blackhole/themes/default/menuicons/pluginicons/remotetimers.png
new file mode 100644
index 0000000..fae3b79
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/remotetimers.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/rssreader.png b/skins/blackhole/themes/default/menuicons/pluginicons/rssreader.png
new file mode 100644
index 0000000..db538f0
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/rssreader.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/sc.png b/skins/blackhole/themes/default/menuicons/pluginicons/sc.png
new file mode 100644
index 0000000..2472d6c
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/sc.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/scraper2vdr.png b/skins/blackhole/themes/default/menuicons/pluginicons/scraper2vdr.png
new file mode 100644
index 0000000..a106cb5
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/scraper2vdr.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/screenshot.png b/skins/blackhole/themes/default/menuicons/pluginicons/screenshot.png
new file mode 100644
index 0000000..be9b4d5
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/screenshot.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/seduatmo.png b/skins/blackhole/themes/default/menuicons/pluginicons/seduatmo.png
new file mode 100644
index 0000000..4b5292f
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/seduatmo.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/skyselectfeeds.png b/skins/blackhole/themes/default/menuicons/pluginicons/skyselectfeeds.png
new file mode 100644
index 0000000..d81a024
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/skyselectfeeds.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/sleeptimer.png b/skins/blackhole/themes/default/menuicons/pluginicons/sleeptimer.png
new file mode 100644
index 0000000..cd4956f
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/sleeptimer.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/softhddevice.png b/skins/blackhole/themes/default/menuicons/pluginicons/softhddevice.png
new file mode 100644
index 0000000..df13f2c
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/softhddevice.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/streamdev-server.png b/skins/blackhole/themes/default/menuicons/pluginicons/streamdev-server.png
new file mode 100644
index 0000000..e89ed8b
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/streamdev-server.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/systeminfo.png b/skins/blackhole/themes/default/menuicons/pluginicons/systeminfo.png
new file mode 100644
index 0000000..b14763f
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/systeminfo.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/targavfd.png b/skins/blackhole/themes/default/menuicons/pluginicons/targavfd.png
new file mode 100644
index 0000000..e91b111
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/targavfd.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/trayopenng.png b/skins/blackhole/themes/default/menuicons/pluginicons/trayopenng.png
new file mode 100644
index 0000000..6ebd17d
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/trayopenng.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/tvguide.png b/skins/blackhole/themes/default/menuicons/pluginicons/tvguide.png
new file mode 100644
index 0000000..968a37c
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/tvguide.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/tvm2vdr.png b/skins/blackhole/themes/default/menuicons/pluginicons/tvm2vdr.png
new file mode 100644
index 0000000..47f9a91
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/tvm2vdr.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/tvscraper.png b/skins/blackhole/themes/default/menuicons/pluginicons/tvscraper.png
new file mode 100644
index 0000000..a106cb5
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/tvscraper.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/undelete.png b/skins/blackhole/themes/default/menuicons/pluginicons/undelete.png
new file mode 100644
index 0000000..a53d50a
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/undelete.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/weatherforecast.png b/skins/blackhole/themes/default/menuicons/pluginicons/weatherforecast.png
new file mode 100644
index 0000000..a88f11d
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/weatherforecast.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/weatherng.png b/skins/blackhole/themes/default/menuicons/pluginicons/weatherng.png
new file mode 100644
index 0000000..a88f11d
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/weatherng.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/xmltv2vdr.png b/skins/blackhole/themes/default/menuicons/pluginicons/xmltv2vdr.png
new file mode 100644
index 0000000..ea73c74
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/xmltv2vdr.png differ
diff --git a/skins/blackhole/themes/default/menuicons/pluginicons/yaepghg.png b/skins/blackhole/themes/default/menuicons/pluginicons/yaepghg.png
new file mode 100644
index 0000000..53ce443
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/pluginicons/yaepghg.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/CAM.png b/skins/blackhole/themes/default/menuicons/standardicons/CAM.png
new file mode 100644
index 0000000..a394877
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/CAM.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Channels.png b/skins/blackhole/themes/default/menuicons/standardicons/Channels.png
new file mode 100644
index 0000000..ba2ba78
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Channels.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Commands.png b/skins/blackhole/themes/default/menuicons/standardicons/Commands.png
new file mode 100644
index 0000000..c6a83ef
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Commands.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/DVB.png b/skins/blackhole/themes/default/menuicons/standardicons/DVB.png
new file mode 100644
index 0000000..3789145
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/DVB.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/EPG.png b/skins/blackhole/themes/default/menuicons/standardicons/EPG.png
new file mode 100644
index 0000000..e868b90
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/EPG.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/LNB.png b/skins/blackhole/themes/default/menuicons/standardicons/LNB.png
new file mode 100644
index 0000000..896dd99
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/LNB.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Miscellaneous.png b/skins/blackhole/themes/default/menuicons/standardicons/Miscellaneous.png
new file mode 100644
index 0000000..2a41c4d
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Miscellaneous.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/OSD.png b/skins/blackhole/themes/default/menuicons/standardicons/OSD.png
new file mode 100644
index 0000000..8f571c6
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/OSD.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Plugins.png b/skins/blackhole/themes/default/menuicons/standardicons/Plugins.png
new file mode 100644
index 0000000..3fcba70
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Plugins.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Recording.png b/skins/blackhole/themes/default/menuicons/standardicons/Recording.png
new file mode 100644
index 0000000..741b1af
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Recording.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Recordings.png b/skins/blackhole/themes/default/menuicons/standardicons/Recordings.png
new file mode 100644
index 0000000..79aeeb7
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Recordings.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Replay.png b/skins/blackhole/themes/default/menuicons/standardicons/Replay.png
new file mode 100644
index 0000000..621596c
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Replay.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Restart.png b/skins/blackhole/themes/default/menuicons/standardicons/Restart.png
new file mode 100644
index 0000000..aa23cd4
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Restart.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Schedule.png b/skins/blackhole/themes/default/menuicons/standardicons/Schedule.png
new file mode 100644
index 0000000..3a98cac
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Schedule.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Setup.png b/skins/blackhole/themes/default/menuicons/standardicons/Setup.png
new file mode 100644
index 0000000..d121148
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Setup.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/StopRecording.png b/skins/blackhole/themes/default/menuicons/standardicons/StopRecording.png
new file mode 100644
index 0000000..ed83fbb
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/StopRecording.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/StopReplay.png b/skins/blackhole/themes/default/menuicons/standardicons/StopReplay.png
new file mode 100644
index 0000000..9192760
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/StopReplay.png differ
diff --git a/skins/blackhole/themes/default/menuicons/standardicons/Timers.png b/skins/blackhole/themes/default/menuicons/standardicons/Timers.png
new file mode 100644
index 0000000..b866c36
Binary files /dev/null and b/skins/blackhole/themes/default/menuicons/standardicons/Timers.png differ
diff --git a/skins/blackhole/themes/default/skinparts/buttonblue.svg b/skins/blackhole/themes/default/skinparts/buttonblue.svg
new file mode 100644
index 0000000..fd3724f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/buttonblue.svg
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="400"
+ height="70"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 399.99999 70.000001"
+ sodipodi:docname="buttonblue.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4180">
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1;"
+ offset="0"
+ id="stop4182" />
+ <stop
+ style="stop-color:#cccccc;stop-opacity:0;"
+ offset="1"
+ id="stop4184" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4152">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4154" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4156" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4183">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4185" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4187" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4148"
+ x="-0.013382644"
+ width="1.0267653"
+ y="-0.11614827"
+ height="1.2322965">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.2304407"
+ id="feGaussianBlur4150" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4189"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200"
+ gradientTransform="matrix(1,0,0,0.00500002,0,978.44535)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4193"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,1048.4454)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4158"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200"
+ gradientTransform="matrix(1,0,0,0.00500002,0,978.44535)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4162"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,1046.4454)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4180"
+ id="linearGradient4222"
+ gradientUnits="userSpaceOnUse"
+ x1="210.71375"
+ y1="901.98651"
+ x2="199.81989"
+ y2="1036.3486" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.7722603"
+ inkscape:cx="46.297009"
+ inkscape:cy="37"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4206"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-982.3622)"
+ id="g4206"
+ inkscape:groupmode="layer"
+ inkscape:label="Blau"
+ style="display:inline">
+ <g
+ id="g4640">
+ <rect
+ style="opacity:1;fill:#0044aa;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4208"
+ width="400"
+ height="69.999992"
+ x="-2.857143e-006"
+ y="982.36218"
+ ry="0.42781609" />
+ <path
+ style="opacity:1;fill:#002255;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)"
+ d="m 55.347603,1000.9212 a 496.85897,57.329265 0 0 0 -51.3105474,0.2891 l 0,45.3711 c 0,0.237 0.1907242,0.4277 0.4277343,0.4277 l 399.1445401,0 c 0.23701,0 0.42773,-0.1907 0.42773,-0.4277 l 0,-28.8321 A 496.85897,57.329265 0 0 0 55.347603,1000.9212 Z"
+ id="path4210"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.97355433,0,0,1.0027745,1.2811918,-2.8409497)" />
+ <path
+ style="opacity:1;fill:url(#linearGradient4222);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)"
+ d="m -0.9179615,985.50214 c -0.23701,0 -0.427734,0.19072 -0.427734,0.42773 l 0,23.77343 a 496.85896,57.329264 0 0 1 51.3105475,-0.289 496.85896,57.329264 0 0 1 348.689448,16.8281 l 0,-40.31253 c 0,-0.23701 -0.19072,-0.42773 -0.42773,-0.42773 l -399.1445315,0 z"
+ id="path4212"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.97441791,0,0,0.93341814,6.350042,68.54286)" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4189);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4214"
+ width="400"
+ height="2"
+ x="-2.857143e-006"
+ y="982.36218"
+ ry="0.427816" />
+ <rect
+ ry="0.427816"
+ y="1052.3622"
+ x="-2.857143e-006"
+ height="2"
+ width="400"
+ id="rect4216"
+ style="opacity:1;fill:url(#radialGradient4193);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4158);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4218"
+ width="400"
+ height="1.9999976"
+ x="-2.857143e-006"
+ y="982.36218"
+ ry="0.023262138" />
+ <rect
+ ry="0.023262138"
+ y="1050.3622"
+ x="-2.857143e-006"
+ height="1.9999976"
+ width="400"
+ id="rect4220"
+ style="opacity:1;fill:url(#radialGradient4162);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/buttongreen.svg b/skins/blackhole/themes/default/skinparts/buttongreen.svg
new file mode 100644
index 0000000..02746ff
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/buttongreen.svg
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="400"
+ height="70"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 399.99999 70.000001"
+ sodipodi:docname="buttongreen.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4152">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4154" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4156" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4183">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4185" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4187" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4173">
+ <stop
+ style="stop-color:#ced659;stop-opacity:1;"
+ offset="0"
+ id="stop4175" />
+ <stop
+ style="stop-color:#ced659;stop-opacity:0;"
+ offset="1"
+ id="stop4177" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4148"
+ x="-0.013382644"
+ width="1.0267653"
+ y="-0.11614827"
+ height="1.2322965">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.2304407"
+ id="feGaussianBlur4150" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4173"
+ id="linearGradient4179"
+ x1="186.87177"
+ y1="-76.304359"
+ x2="168.72545"
+ y2="50.159344"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.3456955,985.50214)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4385"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,978.44535)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4387"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,1048.4454)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4389"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,978.44535)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4391"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,1046.4454)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.7722603"
+ inkscape:cx="46.297009"
+ inkscape:cy="37"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Grün"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-982.3622)"
+ style="display:inline">
+ <g
+ id="g4400"
+ transform="translate(0.17733523,0)">
+ <rect
+ ry="0.42781609"
+ y="982.36218"
+ x="-2.857143e-006"
+ height="69.999992"
+ width="400"
+ id="rect4137"
+ style="opacity:1;fill:#008000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ transform="matrix(0.97355433,0,0,1.0027745,1.2811918,-2.8409497)"
+ inkscape:connector-curvature="0"
+ id="path4139"
+ d="m 55.347603,1000.9212 a 496.85897,57.329265 0 0 0 -51.3105474,0.2891 l 0,45.3711 c 0,0.237 0.1907242,0.4277 0.4277343,0.4277 l 399.1445401,0 c 0.23701,0 0.42773,-0.1907 0.42773,-0.4277 l 0,-28.8321 A 496.85897,57.329265 0 0 0 55.347603,1000.9212 Z"
+ style="opacity:1;fill:#036403;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)" />
+ <path
+ transform="matrix(0.97441791,0,0,0.93341814,6.350042,68.54286)"
+ inkscape:connector-curvature="0"
+ id="path4154"
+ d="m -0.9179615,985.50214 c -0.23701,0 -0.427734,0.19072 -0.427734,0.42773 l 0,23.77343 a 496.85896,57.329264 0 0 1 51.3105475,-0.289 496.85896,57.329264 0 0 1 348.689448,16.8281 l 0,-40.31253 c 0,-0.23701 -0.19072,-0.42773 -0.42773,-0.42773 l -399.1445315,0 z"
+ style="opacity:1;fill:url(#linearGradient4179);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)" />
+ <rect
+ ry="0.427816"
+ y="982.36218"
+ x="-2.857143e-006"
+ height="2"
+ width="400"
+ id="rect4181"
+ style="opacity:1;fill:url(#radialGradient4385);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4387);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4191"
+ width="400"
+ height="2"
+ x="-2.857143e-006"
+ y="1052.3622"
+ ry="0.427816" />
+ <rect
+ ry="0.023262138"
+ y="982.36218"
+ x="-2.857143e-006"
+ height="1.9999976"
+ width="400"
+ id="rect4150"
+ style="opacity:1;fill:url(#radialGradient4389);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4391);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4160"
+ width="400"
+ height="1.9999976"
+ x="-2.857143e-006"
+ y="1050.3622"
+ ry="0.023262138" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/buttonred.svg b/skins/blackhole/themes/default/skinparts/buttonred.svg
new file mode 100644
index 0000000..1f1b756
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/buttonred.svg
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="400"
+ height="70"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 399.99999 70.000001"
+ sodipodi:docname="buttonred.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4180">
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1;"
+ offset="0"
+ id="stop4182" />
+ <stop
+ style="stop-color:#cccccc;stop-opacity:0;"
+ offset="1"
+ id="stop4184" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4152">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4154" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4156" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4183">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4185" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4187" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4148"
+ x="-0.013382644"
+ width="1.0267653"
+ y="-0.11614827"
+ height="1.2322965">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.2304407"
+ id="feGaussianBlur4150" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4189"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200"
+ gradientTransform="matrix(1,0,0,0.00500002,0.17733523,978.44535)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4193"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0.17733523,1048.4454)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4158"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200"
+ gradientTransform="matrix(1,0,0,0.00500002,0.17733523,978.44535)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4162"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0.17733523,1046.4454)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4180"
+ id="linearGradient4186"
+ x1="210.71375"
+ y1="901.98651"
+ x2="199.81989"
+ y2="1036.3486"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.7722603"
+ inkscape:cx="122.11533"
+ inkscape:cy="37"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4164"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-982.3622)"
+ id="g4164"
+ inkscape:groupmode="layer"
+ inkscape:label="Rot"
+ style="display:inline">
+ <rect
+ ry="0.42781609"
+ y="982.36218"
+ x="0.17733237"
+ height="69.999992"
+ width="400"
+ id="rect4166"
+ style="opacity:1;fill:#aa0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ transform="matrix(0.97355433,0,0,1.0027745,1.458527,-2.8409497)"
+ inkscape:connector-curvature="0"
+ id="path4168"
+ d="m 55.347603,1000.9212 a 496.85897,57.329265 0 0 0 -51.3105474,0.2891 l 0,45.3711 c 0,0.237 0.1907242,0.4277 0.4277343,0.4277 l 399.1445401,0 c 0.23701,0 0.42773,-0.1907 0.42773,-0.4277 l 0,-28.8321 A 496.85897,57.329265 0 0 0 55.347603,1000.9212 Z"
+ style="opacity:1;fill:#550000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)" />
+ <path
+ transform="matrix(0.97441791,0,0,0.93341814,6.5273772,68.54286)"
+ inkscape:connector-curvature="0"
+ id="path4170"
+ d="m -0.9179615,985.50214 c -0.23701,0 -0.427734,0.19072 -0.427734,0.42773 l 0,23.77343 a 496.85896,57.329264 0 0 1 51.3105475,-0.289 496.85896,57.329264 0 0 1 348.689448,16.8281 l 0,-40.31253 c 0,-0.23701 -0.19072,-0.42773 -0.42773,-0.42773 l -399.1445315,0 z"
+ style="opacity:1;fill:url(#linearGradient4186);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)" />
+ <rect
+ ry="0.427816"
+ y="982.36218"
+ x="0.17733237"
+ height="2"
+ width="400"
+ id="rect4172"
+ style="opacity:1;fill:url(#radialGradient4189);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4193);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4174"
+ width="400"
+ height="2"
+ x="0.17733237"
+ y="1052.3622"
+ ry="0.427816" />
+ <rect
+ ry="0.023262138"
+ y="982.36218"
+ x="0.17733237"
+ height="1.9999976"
+ width="400"
+ id="rect4176"
+ style="opacity:1;fill:url(#radialGradient4158);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4162);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4178"
+ width="400"
+ height="1.9999976"
+ x="0.17733237"
+ y="1050.3622"
+ ry="0.023262138" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/buttonyellow.svg b/skins/blackhole/themes/default/skinparts/buttonyellow.svg
new file mode 100644
index 0000000..063b113
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/buttonyellow.svg
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="400"
+ height="70"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 399.99999 70.000001"
+ sodipodi:docname="buttonyellow.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4152">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4154" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4156" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4183">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4185" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4187" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4148"
+ x="-0.013382644"
+ width="1.0267653"
+ y="-0.11614827"
+ height="1.2322965">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.2304407"
+ id="feGaussianBlur4150" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="linearGradient4204"
+ gradientUnits="userSpaceOnUse"
+ x1="210.71375"
+ y1="901.98651"
+ x2="200.39896"
+ y2="1020.6317" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4565"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,978.44535)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4567"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,1048.4454)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4569"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,978.44535)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4571"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,1046.4454)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.7722603"
+ inkscape:cx="139.77115"
+ inkscape:cy="37"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4188"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ style="display:inline"
+ inkscape:label="Gelb"
+ inkscape:groupmode="layer"
+ id="g4188"
+ transform="translate(0,-982.3622)">
+ <rect
+ style="opacity:1;fill:#806600;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4190"
+ width="400"
+ height="69.999992"
+ x="-2.857143e-006"
+ y="982.36218"
+ ry="0.42781609" />
+ <path
+ style="opacity:1;fill:#786721;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)"
+ d="m 55.347603,1000.9212 a 496.85897,57.329265 0 0 0 -51.3105474,0.2891 l 0,45.3711 c 0,0.237 0.1907242,0.4277 0.4277343,0.4277 l 399.1445401,0 c 0.23701,0 0.42773,-0.1907 0.42773,-0.4277 l 0,-28.8321 A 496.85897,57.329265 0 0 0 55.347603,1000.9212 Z"
+ id="path4192"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.97355433,0,0,1.0027745,1.2811918,-0.58394479)" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4565);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4196"
+ width="400"
+ height="2"
+ x="-2.857143e-006"
+ y="982.36218"
+ ry="0.427816" />
+ <rect
+ ry="0.427816"
+ y="1052.3622"
+ x="-2.857143e-006"
+ height="2"
+ width="400"
+ id="rect4198"
+ style="opacity:1;fill:url(#radialGradient4567);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4569);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4200"
+ width="400"
+ height="1.9999976"
+ x="-2.857143e-006"
+ y="982.36218"
+ ry="0.023262138" />
+ <rect
+ ry="0.023262138"
+ y="1050.3622"
+ x="-2.857143e-006"
+ height="1.9999976"
+ width="400"
+ id="rect4202"
+ style="opacity:1;fill:url(#radialGradient4571);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="opacity:1;fill:url(#linearGradient4204);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)"
+ d="m -0.9179615,985.50214 c -0.23701,0 -0.427734,0.19072 -0.427734,0.42773 l 0,23.77343 a 496.85896,57.329264 0 0 1 51.3105475,-0.289 496.85896,57.329264 0 0 1 348.689448,16.8281 l 0,-40.31253 c 0,-0.23701 -0.19072,-0.42773 -0.42773,-0.42773 l -399.1445315,0 z"
+ id="path4194"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.97441791,0,0,0.93341814,5.2215394,66.285855)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/displaychannelback.svg b/skins/blackhole/themes/default/skinparts/displaychannelback.svg
new file mode 100644
index 0000000..8a8d8a9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/displaychannelback.svg
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1920"
+ height="324"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1920 324"
+ sodipodi:docname="displaychannelback.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.77683186"
+ inkscape:cx="502.7572"
+ inkscape:cy="210.50666"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer2"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Background"
+ style="display:inline"
+ transform="translate(0,-756)">
+ <path
+ style="fill:#000000;fill-opacity:0.7254902;fill-rule:evenodd;stroke:#000000;stroke-width:1.00440681px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 0.5022034,1079.4978 0,-322.99561 199.8953666,0 c 1.61847,29.93978 18.19235,46.83581 49.97385,50.46807 l 949.50298,0 c 28.354,-2.64869 48.9217,-14.73328 49.9739,-50.46807 l 669.6495,0 0,322.99561 z"
+ id="path4162"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/displaychannelbackepg.svg b/skins/blackhole/themes/default/skinparts/displaychannelbackepg.svg
new file mode 100644
index 0000000..5803fdb
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/displaychannelbackepg.svg
@@ -0,0 +1,286 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1280"
+ height="130"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1280 130"
+ sodipodi:docname="displaychannelbackepg.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4794">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4796" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4798" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4778">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4780" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4782" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4759">
+ <stop
+ style="stop-color:#00284a;stop-opacity:1;"
+ offset="0"
+ id="stop4761" />
+ <stop
+ style="stop-color:#00284a;stop-opacity:0;"
+ offset="1"
+ id="stop4763" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4759"
+ id="linearGradient4766"
+ x1="935.20227"
+ y1="896.86908"
+ x2="935.20227"
+ y2="991.521"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0017221,0,0,1.0190265,-325.66949,54.937088)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4778"
+ id="radialGradient4786"
+ cx="965"
+ cy="876"
+ fx="965"
+ fy="876"
+ r="640"
+ gradientTransform="matrix(1,0,0,0.0015625,-324.99999,949.63124)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4778"
+ id="radialGradient4790"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.0015625,-324.99999,1077.6312)"
+ cx="965"
+ cy="876"
+ fx="965"
+ fy="876"
+ r="640" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4794"
+ id="radialGradient4800"
+ cx="326"
+ cy="940"
+ fx="326"
+ fy="940"
+ r="0.9999997"
+ gradientTransform="matrix(1.0000003,0,0,65.000017,-325.00009,-60085.016)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4794"
+ id="radialGradient4800-0"
+ cx="326"
+ cy="940"
+ fx="326"
+ fy="940"
+ r="0.9999997"
+ gradientTransform="matrix(0.9999995,0,0,65.000016,953.00041,-60085.015)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:label="Black Hole"
+ inkscape:menu="Morphology"
+ inkscape:menu-tooltip="Creates a black light inside and outside"
+ height="1.5"
+ width="1.5"
+ y="-0.25"
+ x="-0.25"
+ style="color-interpolation-filters:sRGB"
+ id="filter4448">
+ <feGaussianBlur
+ stdDeviation="5"
+ in="SourceAlpha"
+ result="result1"
+ id="feGaussianBlur4450" />
+ <feComposite
+ operator="arithmetic"
+ k2="3.2"
+ k1="-1"
+ k4="-2"
+ result="result3"
+ in2="result1"
+ id="feComposite4452"
+ k3="0" />
+ <feColorMatrix
+ values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 10 0 "
+ result="result2"
+ id="feColorMatrix4454" />
+ <feComposite
+ result="fbSourceGraphic"
+ in="SourceGraphic"
+ operator="out"
+ in2="result2"
+ id="feComposite4456" />
+ <feBlend
+ mode="multiply"
+ in="result1"
+ in2="fbSourceGraphic"
+ result="result91"
+ id="feBlend4458" />
+ <feBlend
+ mode="screen"
+ in="fbSourceGraphic"
+ in2="result91"
+ id="feBlend4460" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4759"
+ id="linearGradient4232"
+ x1="8.9874849"
+ y1="1027.2526"
+ x2="50.451012"
+ y2="1027.2526"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4759"
+ id="linearGradient4240"
+ x1="8.9874849"
+ y1="1027.2526"
+ x2="50.451012"
+ y2="1027.2526"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4759"
+ id="linearGradient4309"
+ x1="68.407776"
+ y1="985.8446"
+ x2="34.716022"
+ y2="1026.4244"
+ gradientUnits="userSpaceOnUse" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern" />
+ <filter
+ style="color-interpolation-filters:sRGB"
+ id="filter7120">
+ <feGaussianBlur
+ stdDeviation="3.92425"
+ id="feGaussianBlur12" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.64122727"
+ inkscape:cx="587.59957"
+ inkscape:cy="32.802006"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:showpageshadow="false" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="EPG"
+ transform="translate(0,-950)">
+ <rect
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4736"
+ width="1280"
+ height="129.99998"
+ x="5.0516455e-006"
+ y="950"
+ ry="0.35725296" />
+ <rect
+ ry="0.35725296"
+ y="950"
+ x="4.9999999e-006"
+ height="129.99998"
+ width="1280"
+ id="rect4749"
+ style="opacity:1;fill:url(#linearGradient4766);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4786);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4768"
+ width="1280"
+ height="1.9999907"
+ x="4.9999999e-006"
+ y="950"
+ ry="0.30650064" />
+ <rect
+ ry="0.30650064"
+ y="1078"
+ x="4.9999999e-006"
+ height="1.9999907"
+ width="1280"
+ id="rect4788"
+ style="opacity:1;fill:url(#radialGradient4790);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4800);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4792"
+ width="1.99999"
+ height="129.99998"
+ x="5.0000008e-006"
+ y="950"
+ ry="0.3036862" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4800-0);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4792-6"
+ width="1.9999883"
+ height="129.99998"
+ x="1278"
+ y="950"
+ ry="0.3036862" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/displaychannellogoback.svg b/skins/blackhole/themes/default/skinparts/displaychannellogoback.svg
new file mode 100644
index 0000000..02eca0f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/displaychannellogoback.svg
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="200"
+ viewBox="0 0 299.99998 200"
+ id="svg3615"
+ version="1.1"
+ inkscape:version="0.91pre3 r13670"
+ sodipodi:docname="displaychannellogoback.svg">
+ <defs
+ id="defs3617">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4451">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4453" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4455" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4437">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4439" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4441" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4425">
+ <stop
+ style="stop-color:#333333;stop-opacity:1;"
+ offset="0"
+ id="stop4427" />
+ <stop
+ style="stop-color:#444444;stop-opacity:1"
+ offset="1"
+ id="stop4429" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4425"
+ id="linearGradient4431"
+ x1="10.741395"
+ y1="1047.0458"
+ x2="296.81735"
+ y2="858.87219"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4437"
+ id="radialGradient4443"
+ cx="0.99998474"
+ cy="952.36224"
+ fx="0.99998474"
+ fy="952.36224"
+ r="0.99999934"
+ gradientTransform="matrix(1,0,0,100.00006,0,-94283.922)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4437"
+ id="radialGradient4447"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,100.00006,298,-94283.922)"
+ cx="0.99998474"
+ cy="952.36224"
+ fx="0.99998474"
+ fy="952.36224"
+ r="0.99999934" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4451"
+ id="radialGradient4457"
+ cx="149.99999"
+ cy="853.36224"
+ fx="149.99999"
+ fy="853.36224"
+ r="150"
+ gradientTransform="matrix(1,0,0,0.00666668,0,847.67315)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4451"
+ id="radialGradient4461"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00666668,0,1045.6732)"
+ cx="149.99999"
+ cy="853.36224"
+ fx="149.99999"
+ fy="853.36224"
+ r="150" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.5136364"
+ inkscape:cx="161.76342"
+ inkscape:cy="98.571429"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata3620">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-852.36225)">
+ <rect
+ style="opacity:1;fill:url(#linearGradient4431);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3623"
+ width="300"
+ height="199.99998"
+ x="-1.021635e-005"
+ y="852.36224" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4443);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4435"
+ width="1.9999887"
+ height="199.99998"
+ x="-9.5986316e-006"
+ y="852.36224" />
+ <rect
+ y="852.36224"
+ x="298"
+ height="199.99998"
+ width="1.9999887"
+ id="rect4445"
+ style="opacity:1;fill:url(#radialGradient4447);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4457);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4449"
+ width="300"
+ height="1.999995"
+ x="-1.2490499e-005"
+ y="852.36224" />
+ <rect
+ y="1050.3623"
+ x="-1.2490499e-005"
+ height="1.999995"
+ width="300"
+ id="rect4459"
+ style="opacity:1;fill:url(#radialGradient4461);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/displaymendetailback.svg b/skins/blackhole/themes/default/skinparts/displaymendetailback.svg
new file mode 100644
index 0000000..1f2f89a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/displaymendetailback.svg
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1000"
+ height="800"
+ id="svg4671"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1000 800.00002"
+ sodipodi:docname="displaymendetailback.svg">
+ <defs
+ id="defs4673">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5269">
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0"
+ id="stop5271" />
+ <stop
+ style="stop-color:#333333;stop-opacity:1"
+ offset="1"
+ id="stop5273" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5257">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5259" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5261" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5223">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5225" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5227" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5223"
+ id="radialGradient5229"
+ cx="0.99998975"
+ cy="862.36218"
+ fx="0.99998975"
+ fy="862.36218"
+ r="1"
+ gradientTransform="matrix(1.5,0,0,400.00001,5.1315787e-6,-344292.51)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5223"
+ id="radialGradient5229-7"
+ cx="0.99998975"
+ cy="862.36218"
+ fx="0.99998975"
+ fy="862.36218"
+ r="1"
+ gradientTransform="matrix(1.5,0,0,400.00001,998.00004,-344292.51)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5257"
+ id="radialGradient5263"
+ cx="390"
+ cy="673.86218"
+ fx="390"
+ fy="673.86218"
+ r="390"
+ gradientTransform="matrix(1.2820513,0,0,0.00384615,2.8947368e-6,251.2704)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5257"
+ id="radialGradient5267"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820513,0,0,0.00384615,2.8947368e-6,1048.2704)"
+ cx="390"
+ cy="673.86218"
+ fx="390"
+ fy="673.86218"
+ r="390" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5269"
+ id="linearGradient5275"
+ x1="6.5118446"
+ y1="1046.8645"
+ x2="777.75482"
+ y2="676.42383"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820513,0,0,2.1052632,2.8947368e-6,-1163.1372)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.97728979"
+ inkscape:cx="413.30878"
+ inkscape:cy="369.35647"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4676">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-252.36218)"
+ style="display:inline">
+ <rect
+ style="fill:url(#linearGradient5275);fill-opacity:1"
+ id="rect5219"
+ width="1000"
+ height="800"
+ x="-1.0263157e-005"
+ y="252.36217"
+ ry="0.84846574" />
+ <rect
+ style="fill:url(#radialGradient5229);fill-opacity:1"
+ id="rect5221"
+ width="3"
+ height="800"
+ x="-1.0263157e-005"
+ y="252.36217"
+ ry="0.86613488" />
+ <rect
+ style="fill:url(#radialGradient5229-7);fill-opacity:1"
+ id="rect5221-0"
+ width="3"
+ height="800"
+ x="998"
+ y="252.36217"
+ ry="0.86613488" />
+ <rect
+ style="fill:url(#radialGradient5263);fill-opacity:1"
+ id="rect5255"
+ width="1000"
+ height="3"
+ x="-1.0263157e-005"
+ y="252.36218"
+ ry="0.17231601" />
+ <rect
+ ry="0.17231601"
+ y="1049.3622"
+ x="-1.0263157e-005"
+ height="3"
+ width="1000"
+ id="rect5265"
+ style="fill:url(#radialGradient5267);fill-opacity:1" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/displaymenuback.svg b/skins/blackhole/themes/default/skinparts/displaymenuback.svg
new file mode 100644
index 0000000..5f3f51a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/displaymenuback.svg
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1920"
+ height="1080"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1920 1080"
+ sodipodi:docname="displaymenuback.svg"
+ enable-background="new">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker5387"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path5389"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Tail"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Tail"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <g
+ id="g4825"
+ transform="scale(-1.2)"
+ style="stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1">
+ <path
+ id="path4827"
+ d="M -3.8048674,-3.9585227 L 0.54352094,0"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4829"
+ d="M -1.2866832,-3.9585227 L 3.0617053,0"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4831"
+ d="M 1.3053582,-3.9585227 L 5.6537466,0"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4833"
+ d="M -3.8048674,4.1775838 L 0.54352094,0.21974226"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4835"
+ d="M -1.2866832,4.1775838 L 3.0617053,0.21974226"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4837"
+ d="M 1.3053582,4.1775838 L 5.6537466,0.21974226"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Sstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Sstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4819"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.3) translate(-2.3,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4810"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker5075"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path5077"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4807"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4789"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4450">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4452" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="1"
+ id="stop4454" />
+ </linearGradient>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1LendR3T"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1LendR3T">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ id="path6619" />
+ </marker>
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern-8" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern-0" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4450"
+ id="linearGradient4318"
+ x1="1118"
+ y1="1056.3619"
+ x2="1810"
+ y2="-437.638"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.5"
+ inkscape:cx="779.50211"
+ inkscape:cy="739.63369"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ showguides="false" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Background"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,27.638004)"
+ style="display:inline">
+ <rect
+ style="fill:url(#linearGradient4318);fill-opacity:1"
+ id="rect4310"
+ width="1920"
+ height="1080"
+ x="0"
+ y="-27.638004"
+ ry="0.24633798" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/displaymenubacktv.svg b/skins/blackhole/themes/default/skinparts/displaymenubacktv.svg
new file mode 100644
index 0000000..d205062
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/displaymenubacktv.svg
@@ -0,0 +1,348 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1920"
+ height="1080"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1920 1080"
+ sodipodi:docname="displaymenubacktv.svg"
+ enable-background="new">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker5387"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path5389"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Tail"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Tail"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <g
+ id="g4825"
+ transform="scale(-1.2)"
+ style="stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1">
+ <path
+ id="path4827"
+ d="M -3.8048674,-3.9585227 L 0.54352094,0"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4829"
+ d="M -1.2866832,-3.9585227 L 3.0617053,0"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4831"
+ d="M 1.3053582,-3.9585227 L 5.6537466,0"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4833"
+ d="M -3.8048674,4.1775838 L 0.54352094,0.21974226"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4835"
+ d="M -1.2866832,4.1775838 L 3.0617053,0.21974226"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ <path
+ id="path4837"
+ d="M 1.3053582,4.1775838 L 5.6537466,0.21974226"
+ style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.8;stroke-linecap:round;stroke-opacity:1;fill-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Sstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Sstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4819"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.3) translate(-2.3,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4810"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker5075"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path5077"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4807"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4789"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4540">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4542" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4544" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4466">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4468" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4470" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4450">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4452" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="1"
+ id="stop4454" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4450"
+ id="linearGradient4460"
+ x1="1176.0457"
+ y1="1054.5479"
+ x2="1823.0875"
+ y2="-448.90463"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(0,27.638004)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4466"
+ id="radialGradient4472"
+ cx="1103.0937"
+ cy="371.64835"
+ fx="1103.0937"
+ fy="371.64835"
+ r="3.5686478"
+ gradientTransform="matrix(0.86165038,0,0,58.870242,102.51887,-21588.737)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4466"
+ id="radialGradient4472-1"
+ cx="1103.0938"
+ cy="371.64835"
+ fx="1103.0938"
+ fy="371.64835"
+ r="3.5686479"
+ gradientTransform="matrix(1,0,0,58.870242,724.38795,-21585.884)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4540"
+ id="radialGradient4546"
+ cx="1466.9981"
+ cy="141.71147"
+ fx="1466.9981"
+ fy="141.71147"
+ r="355.26972"
+ gradientTransform="matrix(1.0808689,0,0,0.01088437,-145.63269,74.952665)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4540"
+ id="radialGradient4546-4"
+ cx="1466.998"
+ cy="141.71147"
+ fx="1466.998"
+ fy="141.71147"
+ r="355.26971"
+ gradientTransform="matrix(1.0808689,0,0,0.01088437,-145.63275,512.95268)"
+ gradientUnits="userSpaceOnUse" />
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1LendR3T"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1LendR3T">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ id="path6619" />
+ </marker>
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern-8" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern-0" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.5"
+ inkscape:cx="779.50211"
+ inkscape:cy="739.63369"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ showguides="false" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Background"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,27.638004)"
+ style="display:inline">
+ <path
+ style="opacity:1;fill:url(#linearGradient4460);fill-opacity:1;stroke:#000000;stroke-width:2.00882554;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 1.265625 1.0039062 C 1.1210041 1.0039062 1.0039062 1.1210041 1.0039062 1.265625 L 1.0039062 1078.7344 C 1.0039062 1078.879 1.1210041 1078.9961 1.265625 1078.9961 L 1918.7344 1078.9961 C 1918.879 1078.9961 1918.9961 1078.879 1918.9961 1078.7344 L 1918.9961 1.265625 C 1918.9961 1.1210041 1918.879 1.0039062 1918.7344 1.0039062 L 1.265625 1.0039062 z M 1056.2441 108 L 1823.7559 108 C 1823.8908 108 1824 108.1092 1824 108.24414 L 1824 539.75586 C 1824 539.8908 1823.8908 540 1823.75 [...]
+ id="rect4137"
+ transform="translate(0,-27.638004)" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4546-4);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4498-7"
+ width="768"
+ height="7.7337637"
+ x="1056"
+ y="510.62823"
+ ry="0.13052402" />
+ <rect
+ style="display:inline;opacity:1;fill:url(#radialGradient4546);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4498"
+ width="768"
+ height="7.7337637"
+ x="1056"
+ y="72.628227"
+ ry="0.13052402" />
+ <rect
+ style="display:inline;opacity:1;fill:url(#radialGradient4472-1);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4462-2"
+ width="6.9633703"
+ height="420"
+ x="1824"
+ y="83.144279"
+ ry="0.2262664" />
+ <rect
+ style="display:inline;opacity:1;fill:url(#radialGradient4472);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4462"
+ width="5.9999909"
+ height="420"
+ x="1050"
+ y="80.291176"
+ ry="0.2262664" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/displaymenucorner.svg b/skins/blackhole/themes/default/skinparts/displaymenucorner.svg
new file mode 100644
index 0000000..68f9285
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/displaymenucorner.svg
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="500"
+ height="500"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 500 500"
+ sodipodi:docname="displaymenucorner.svg"
+ style="enable-background:new">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5387"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path5389"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Tail"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Tail"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <g
+ id="g4825"
+ transform="scale(-1.2,-1.2)"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
+ <path
+ id="path4827"
+ d="M -3.8048674,-3.9585227 0.54352094,0"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4829"
+ d="M -1.2866832,-3.9585227 3.0617053,0"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4831"
+ d="M 1.3053582,-3.9585227 5.6537466,0"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4833"
+ d="M -3.8048674,4.1775838 0.54352094,0.21974226"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4835"
+ d="M -1.2866832,4.1775838 3.0617053,0.21974226"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4837"
+ d="M 1.3053582,4.1775838 5.6537466,0.21974226"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Sstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Sstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4819"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(0.3,0,0,0.3,-0.69,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4810"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5075"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path5077"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(1.1,0,0,1.1,1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4807"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(1.1,0,0,1.1,1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4789"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4429">
+ <stop
+ style="stop-color:#00284a;stop-opacity:1"
+ offset="0"
+ id="stop4431" />
+ <stop
+ style="stop-color:#0000ff;stop-opacity:0;"
+ offset="1"
+ id="stop4433" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4429"
+ id="linearGradient4435"
+ x1="1558.0786"
+ y1="1.9836823"
+ x2="2120.9976"
+ y2="490.82275"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1433.282,587.62747)" />
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1LendR3T"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1LendR3T">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ id="path6619" />
+ </marker>
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter5290"
+ x="-0.012"
+ width="1.024"
+ y="-0.012"
+ height="1.024">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.431137"
+ id="feGaussianBlur5292" />
+ </filter>
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern-8" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern-0" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.0180958"
+ inkscape:cx="269.48002"
+ inkscape:cy="152.49644"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer2"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ showguides="false" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Uhr"
+ style="display:inline"
+ transform="translate(0,-580)">
+ <path
+ style="fill:url(#linearGradient4435);fill-opacity:1;fill-rule:evenodd;stroke:#ececec;stroke-width:1.62075794px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter5290)"
+ d="m 5.8347289,587.93785 486.2274011,0 0,486.22735 C 359.62163,808.36538 189.20953,675.46709 5.8347289,587.93785 Z"
+ id="path4142"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ transform="matrix(1.0042232,0,0,1.0042755,8.804664,-12.51067)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/displaymenucurrentback.svg b/skins/blackhole/themes/default/skinparts/displaymenucurrentback.svg
new file mode 100644
index 0000000..a22368b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/displaymenucurrentback.svg
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="780"
+ height="380"
+ id="svg4671"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 780 380.00001"
+ sodipodi:docname="displaymenucurrentback.svg">
+ <defs
+ id="defs4673">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5269">
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0"
+ id="stop5271" />
+ <stop
+ style="stop-color:#555555;stop-opacity:1"
+ offset="1"
+ id="stop5273" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5257">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5259" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5261" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5223">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5225" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5227" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5223"
+ id="radialGradient5229"
+ cx="0.99998974"
+ cy="862.36218"
+ fx="0.99998974"
+ fy="862.36218"
+ r="1"
+ gradientTransform="matrix(1.5,0,0,190,5.1315787e-6,-162986.45)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5223"
+ id="radialGradient5229-7"
+ cx="0.99998975"
+ cy="862.36218"
+ fx="0.99998975"
+ fy="862.36218"
+ r="1"
+ gradientTransform="matrix(1.5,0,0,190,777.00003,-162986.45)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5257"
+ id="radialGradient5263"
+ cx="389.99999"
+ cy="673.86218"
+ fx="389.99999"
+ fy="673.86218"
+ r="390"
+ gradientTransform="matrix(1,0,0,0.00384615,0,671.2704)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5257"
+ id="radialGradient5267"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00384615,0,1048.2704)"
+ cx="389.99999"
+ cy="673.86218"
+ fx="389.99999"
+ fy="673.86218"
+ r="390" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5269"
+ id="linearGradient5275"
+ x1="6.5118446"
+ y1="1046.8645"
+ x2="778.55292"
+ y2="674.9657"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.3820965"
+ inkscape:cx="410.76441"
+ inkscape:cy="163.98606"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4676">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-672.36219)">
+ <rect
+ style="fill:url(#linearGradient5275);fill-opacity:1"
+ id="rect5219"
+ width="780"
+ height="380"
+ x="-1.0263157e-005"
+ y="672.36218"
+ ry="0.40302122" />
+ <rect
+ style="fill:url(#radialGradient5229);fill-opacity:1"
+ id="rect5221"
+ width="3"
+ height="380"
+ x="-1.0263157e-005"
+ y="672.36218"
+ ry="0.41141406" />
+ <rect
+ style="fill:url(#radialGradient5229-7);fill-opacity:1"
+ id="rect5221-0"
+ width="3"
+ height="380"
+ x="777"
+ y="672.36218"
+ ry="0.41141406" />
+ <rect
+ style="fill:url(#radialGradient5263);fill-opacity:1"
+ id="rect5255"
+ width="780"
+ height="3"
+ x="-1.0263157e-005"
+ y="672.36218"
+ ry="0.17231601" />
+ <rect
+ ry="0.17231601"
+ y="1049.3622"
+ x="-1.0263157e-005"
+ height="3"
+ width="780"
+ id="rect5265"
+ style="fill:url(#radialGradient5267);fill-opacity:1" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/displaymenuheader.svg b/skins/blackhole/themes/default/skinparts/displaymenuheader.svg
new file mode 100644
index 0000000..4945e5d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/displaymenuheader.svg
@@ -0,0 +1,292 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1600"
+ height="90"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1600 90"
+ sodipodi:docname="displaymenuheader.svg"
+ style="enable-background:new">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5254">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5256" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop5258" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5387"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path5389"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Tail"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Tail"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <g
+ id="g4825"
+ transform="scale(-1.2,-1.2)"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1">
+ <path
+ id="path4827"
+ d="M -3.8048674,-3.9585227 0.54352094,0"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4829"
+ d="M -1.2866832,-3.9585227 3.0617053,0"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4831"
+ d="M 1.3053582,-3.9585227 5.6537466,0"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4833"
+ d="M -3.8048674,4.1775838 0.54352094,0.21974226"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4835"
+ d="M -1.2866832,4.1775838 3.0617053,0.21974226"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4837"
+ d="M 1.3053582,4.1775838 5.6537466,0.21974226"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.80000001;stroke-linecap:round;stroke-opacity:1"
+ inkscape:connector-curvature="0" />
+ </g>
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Sstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Sstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4819"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(0.3,0,0,0.3,-0.69,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lend"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4810"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker5075"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path5077"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(1.1,0,0,1.1,1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4807"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="matrix(1.1,0,0,1.1,1.1,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4789"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4616">
+ <stop
+ style="stop-color:#999999;stop-opacity:1;"
+ offset="0"
+ id="stop4618" />
+ <stop
+ style="stop-color:#999999;stop-opacity:0;"
+ offset="1"
+ id="stop4620" />
+ </linearGradient>
+ <marker
+ inkscape:isstock="true"
+ style="overflow:visible"
+ id="Arrow1LendR3T"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1LendR3T">
+ <path
+ inkscape:connector-curvature="0"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
+ id="path6619" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5254"
+ id="linearGradient5264"
+ x1="-66.774536"
+ y1="240.60486"
+ x2="1889.1105"
+ y2="-344.51166"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0016968,0,0,0.97461117,-0.10886219,989.79215)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4616"
+ id="radialGradient4630-2"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5585614,0,0,0.00848631,-42.555463,1075.9798)"
+ cx="498.65219"
+ cy="238.05763"
+ fx="498.65219"
+ fy="238.05763"
+ r="471.34784" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern-8" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern-0" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.663227"
+ inkscape:cx="672.90397"
+ inkscape:cy="-15.696543"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ showguides="false" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Header"
+ style="display:inline"
+ transform="translate(0,-990)">
+ <path
+ style="fill:url(#linearGradient5264);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 5.0458157e-6,990.29951 1441.623,990 c 64.8515,31.398 111.8494,58.9377 158.377,90 L 0.81838346,1080 Z"
+ id="path5230"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <rect
+ style="display:inline;opacity:1;fill:url(#radialGradient4630-2);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4626-2"
+ width="1469.249"
+ height="7.99999"
+ x="4.964153e-006"
+ y="1074"
+ ry="0.069612704" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/displayvolumeback.svg b/skins/blackhole/themes/default/skinparts/displayvolumeback.svg
new file mode 100644
index 0000000..f3be2cc
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/displayvolumeback.svg
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="340"
+ height="425"
+ viewBox="0 0 340 425"
+ id="svg4261"
+ version="1.1"
+ inkscape:version="0.91pre3 r13670"
+ sodipodi:docname="displayvolume.svg">
+ <defs
+ id="defs4263" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.3236702"
+ inkscape:cx="167.14286"
+ inkscape:cy="224.50472"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4266">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-627.36222)">
+ <path
+ id="rect4811"
+ style="opacity:0.8;fill:#000000;fill-opacity:0.72549021;stroke:#ff0000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 26.633281,927.85907 286.733419,0 c 14.47956,0 26.13639,11.65683 26.13639,26.13639 l 0,71.73344 c 0,14.4796 -11.65683,26.1364 -26.13639,26.1364 l -286.733419,0 c -14.479558,0 -26.13638655,-11.6568 -26.13638655,-26.1364 l 0,-71.73344 c 0,-14.47956 11.65682855,-26.13639 26.13638655,-26.13639 z M 61.249034,666.96976 A 169.79109,169.79092 0 0 1 300.26253,688.45566 169.79109,169.79092 0 0 1 279.06238,927.49444 169.79109,169.79092 0 0 1 39.998187,906.5801 169.79109,169.79092 0 0 1 6 [...]
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/line_horizontal.svg b/skins/blackhole/themes/default/skinparts/line_horizontal.svg
new file mode 100644
index 0000000..ba9a692
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/line_horizontal.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1000"
+ height="2"
+ id="svg4149"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1000 2"
+ sodipodi:docname="line_horizontal.svg">
+ <defs
+ id="defs4151">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4699">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4701" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4703" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4699"
+ id="radialGradient4705"
+ cx="500.00001"
+ cy="1051.3621"
+ fx="500.00001"
+ fy="1051.3621"
+ r="500"
+ gradientTransform="matrix(1,0,0,0.00200001,0,1049.2593)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.9895833"
+ inkscape:cx="480"
+ inkscape:cy="-2.8421709e-014"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4154">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1050.3622)">
+ <rect
+ style="fill:url(#radialGradient4705);fill-opacity:1;stroke:#ececec;stroke-width:0;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4697"
+ width="1000"
+ height="1.9999974"
+ x="9.7061184e-006"
+ y="1050.3621"
+ ry="0" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/line_vertical.svg b/skins/blackhole/themes/default/skinparts/line_vertical.svg
new file mode 100644
index 0000000..1d049e3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/line_vertical.svg
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="2"
+ height="600"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 2 600.00001"
+ sodipodi:docname="line_vertical.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4139">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4141" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4143" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4139"
+ id="radialGradient4145"
+ cx="1"
+ cy="752.36218"
+ fx="1"
+ fy="752.36218"
+ r="0.99999159"
+ gradientTransform="matrix(1,0,0,300.00253,0,-224958.19)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="32.464618"
+ inkscape:cx="4.2628169"
+ inkscape:cy="426.0172"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-452.36219)">
+ <rect
+ style="fill:url(#radialGradient4145);fill-opacity:1;stroke:#ececec;stroke-width:0;stroke-miterlimit:5.69999981;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4137"
+ width="1.9999732"
+ height="600"
+ x="1.3416932e-005"
+ y="452.36218"
+ ry="0" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/menubutton.svg b/skins/blackhole/themes/default/skinparts/menubutton.svg
new file mode 100644
index 0000000..e05dab3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/menubutton.svg
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="960"
+ height="80"
+ id="svg4671"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 960 80.000001"
+ sodipodi:docname="menubutton.svg">
+ <defs
+ id="defs4673">
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5117"
+ id="linearGradient5123"
+ x1="563.71271"
+ y1="307.54962"
+ x2="565.81268"
+ y2="243.68301"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5117">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5119" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop5121" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5151"
+ id="radialGradient5157"
+ cx="530.15411"
+ cy="238.10101"
+ fx="530.15411"
+ fy="238.10101"
+ r="504.75729"
+ gradientTransform="matrix(1,0,0,0.0039919,0,237.15054)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5151">
+ <stop
+ style="stop-color:#808080;stop-opacity:1;"
+ offset="0"
+ id="stop5153" />
+ <stop
+ style="stop-color:#808080;stop-opacity:0;"
+ offset="1"
+ id="stop5155" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5151"
+ id="radialGradient5165"
+ cx="530.15411"
+ cy="310.10101"
+ fx="530.15411"
+ fy="310.10101"
+ r="504.75729"
+ gradientTransform="matrix(1,0,0,0.0039919,0,308.8631)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.1419098"
+ inkscape:cx="467.14286"
+ inkscape:cy="20"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4676">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-972.3622)">
+ <g
+ transform="matrix(0.95095209,0,0,1.0522181,-24.15114,723.94816)"
+ style="display:inline"
+ id="g5189">
+ <rect
+ style="opacity:1;fill:url(#linearGradient5123);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4598"
+ width="1008.7696"
+ height="70"
+ x="26"
+ y="239.99966"
+ ry="0.104419" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient5157);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect5085"
+ width="1009.5146"
+ height="4.0298715"
+ x="25.396799"
+ y="236.08607"
+ ry="0.035066329" />
+ <rect
+ ry="0.035066329"
+ y="308.08606"
+ x="25.396799"
+ height="4.0298715"
+ width="1009.5146"
+ id="rect5113"
+ style="opacity:1;fill:url(#radialGradient5165);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/menubuttonactive.svg b/skins/blackhole/themes/default/skinparts/menubuttonactive.svg
new file mode 100644
index 0000000..1edd668
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/menubuttonactive.svg
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="960"
+ height="80"
+ id="svg5278"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 960 80.000001"
+ sodipodi:docname="menubuttonactive.svg">
+ <defs
+ id="defs5280">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4146">
+ <stop
+ style="stop-color:#5f8dd3;stop-opacity:1;"
+ offset="0"
+ id="stop4148" />
+ <stop
+ style="stop-color:#5f8dd3;stop-opacity:0;"
+ offset="1"
+ id="stop4150" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4146"
+ id="radialGradient5083"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0464083,0,0,0.0039623,-76.850467,1049.7359)"
+ cx="532.15411"
+ cy="158.05797"
+ fx="532.15411"
+ fy="158.05797"
+ r="504.75729" />
+ <linearGradient
+ gradientTransform="matrix(0.95165438,0,0,1.142857,-24.74301,789.50506)"
+ inkscape:collect="always"
+ xlink:href="#linearGradient5073"
+ id="linearGradient5079"
+ x1="571.08295"
+ y1="223.60255"
+ x2="573.04272"
+ y2="164.76302"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5073">
+ <stop
+ style="stop-color:#00284a;stop-opacity:1;"
+ offset="0"
+ id="stop5075" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop5077" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4146"
+ id="radialGradient4152"
+ cx="480"
+ cy="974.36218"
+ fx="480"
+ fy="974.36218"
+ r="480"
+ gradientTransform="matrix(1,0,0,0.00416667,0,970.30234)"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.6493863"
+ inkscape:cx="438.84901"
+ inkscape:cy="32.058072"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5283">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-972.3622)">
+ <rect
+ style="display:inline;opacity:1;fill:url(#linearGradient5079);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4576"
+ width="960"
+ height="79.999992"
+ x="-1.0000001e-006"
+ y="972.36218"
+ ry="0.11933599" />
+ <rect
+ style="display:inline;opacity:1;fill:url(#radialGradient4152);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4572"
+ width="960"
+ height="3.99999"
+ x="-1.0000001e-006"
+ y="972.36218"
+ ry="0.034806311" />
+ <rect
+ ry="0.034806311"
+ y="1048.3622"
+ x="-1.0000001e-006"
+ height="3.99999"
+ width="960"
+ id="rect5081"
+ style="display:inline;opacity:1;fill:url(#radialGradient5083);fill-opacity:1.0;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/messageblue.svg b/skins/blackhole/themes/default/skinparts/messageblue.svg
new file mode 100644
index 0000000..1bdd0eb
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/messageblue.svg
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1728"
+ height="162"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1728 162"
+ sodipodi:docname="messageblue.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4180">
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1;"
+ offset="0"
+ id="stop4182" />
+ <stop
+ style="stop-color:#cccccc;stop-opacity:0;"
+ offset="1"
+ id="stop4184" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4152">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4154" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4156" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4183">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4185" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4187" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4148"
+ x="-0.013382644"
+ width="1.0267653"
+ y="-0.11614827"
+ height="1.2322965">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.2304407"
+ id="feGaussianBlur4150" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4189"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200"
+ gradientTransform="matrix(4.3178877,0,0,0.00750001,0.75138186,884.48694)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4193"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3178877,0,0,0.01125004,0.75138278,1039.0494)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4162"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3178876,0,0,0.00750002,1.7324077e-5,1043.487)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4180"
+ id="linearGradient4222"
+ gradientUnits="userSpaceOnUse"
+ x1="210.71375"
+ y1="901.98651"
+ x2="199.81989"
+ y2="1036.3486" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.85962546"
+ inkscape:cx="449.03608"
+ inkscape:cy="116.50387"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4206"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-890.3622)"
+ id="g4206"
+ inkscape:groupmode="layer"
+ inkscape:label="Blau"
+ style="display:inline">
+ <rect
+ ry="0.9900887"
+ y="890.36218"
+ x="5.0709259e-006"
+ height="161.99998"
+ width="1727.155"
+ id="rect4208"
+ style="opacity:1;fill:#0044aa;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ transform="matrix(4.2074416,0,0,2.2560334,5.5259383,-1321.8079)"
+ inkscape:connector-curvature="0"
+ id="path4210"
+ d="m 55.347603,1000.9212 a 496.85897,57.329265 0 0 0 -51.3105474,0.2891 l 0,45.3711 c 0,0.237 0.1907242,0.4277 0.4277343,0.4277 l 399.1445401,0 c 0.23701,0 0.42773,-0.1907 0.42773,-0.4277 l 0,-28.8321 A 496.85897,57.329265 0 0 0 55.347603,1000.9212 Z"
+ style="opacity:1;fill:#002255;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)" />
+ <path
+ transform="matrix(4.2074271,0,0,2.1001906,28.170151,-1165.7311)"
+ inkscape:connector-curvature="0"
+ id="path4212"
+ d="m -0.9179615,985.50214 c -0.23701,0 -0.427734,0.19072 -0.427734,0.42773 l 0,23.77343 a 496.85896,57.329264 0 0 1 51.3105475,-0.289 496.85896,57.329264 0 0 1 348.689448,16.8281 l 0,-40.31253 c 0,-0.23701 -0.19072,-0.42773 -0.42773,-0.42773 l -399.1445315,0 z"
+ style="opacity:1;fill:url(#linearGradient4222);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)" />
+ <rect
+ ry="0.64172226"
+ y="890.36218"
+ x="0.75136954"
+ height="2.9999919"
+ width="1727.155"
+ id="rect4214"
+ style="opacity:1;fill:url(#radialGradient4189);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4193);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4216"
+ width="1727.155"
+ height="4.4999995"
+ x="0.75137043"
+ y="1047.8622"
+ ry="0.96258593" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4162);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4220"
+ width="1727.155"
+ height="2.9999919"
+ x="4.9999999e-006"
+ y="1049.3622"
+ ry="0.034893151" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/messagegreen.svg b/skins/blackhole/themes/default/skinparts/messagegreen.svg
new file mode 100644
index 0000000..483ad23
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/messagegreen.svg
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1728"
+ height="162"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1728 162"
+ sodipodi:docname="messagegreen.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4152">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4154" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4156" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4183">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4185" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4187" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4173">
+ <stop
+ style="stop-color:#ced659;stop-opacity:1;"
+ offset="0"
+ id="stop4175" />
+ <stop
+ style="stop-color:#ced659;stop-opacity:0;"
+ offset="1"
+ id="stop4177" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4148"
+ x="-0.013382644"
+ width="1.0267653"
+ y="-0.11614827"
+ height="1.2322965">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.2304407"
+ id="feGaussianBlur4150" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4173"
+ id="linearGradient4179"
+ x1="186.87177"
+ y1="-76.304359"
+ x2="168.72545"
+ y2="50.159344"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-1.3456955,985.50214)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4387"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0.17733523,1048.4454)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4391"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3199999,0,0,0.0075,2.3864843e-5,1043.487)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4217"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3199999,0,0,0.0075,1.7348835e-5,884.48702)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.85962546"
+ inkscape:cx="717.17611"
+ inkscape:cy="116.50387"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Grün"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-890.3622)"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#008000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4137"
+ width="1728"
+ height="161.99998"
+ x="1.3048174e-005"
+ y="890.36218"
+ ry="0.99008864" />
+ <path
+ style="opacity:1;fill:#036403;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)"
+ d="m 55.347603,1000.9212 a 496.85897,57.329265 0 0 0 -51.3105474,0.2891 l 0,45.3711 c 0,0.237 0.1907242,0.4277 0.4277343,0.4277 l 399.1445401,0 c 0.23701,0 0.42773,-0.1907 0.42773,-0.4277 l 0,-28.8321 A 496.85897,57.329265 0 0 0 55.347603,1000.9212 Z"
+ id="path4139"
+ inkscape:connector-curvature="0"
+ transform="matrix(4.2085896,0,0,1.881705,4.590517,-930.16199)" />
+ <path
+ style="opacity:1;fill:url(#linearGradient4179);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)"
+ d="m -0.9179615,985.50214 c -0.23701,0 -0.427734,0.19072 -0.427734,0.42773 l 0,23.77343 a 496.85896,57.329264 0 0 1 51.3105475,-0.289 496.85896,57.329264 0 0 1 348.689448,16.8281 l 0,-40.31253 c 0,-0.23701 -0.19072,-0.42773 -0.42773,-0.42773 l -399.1445315,0 z"
+ id="path4154"
+ inkscape:connector-curvature="0"
+ transform="matrix(4.2125314,0,0,1.9743876,27.162466,-1045.6397)" />
+ <rect
+ ry="0.427816"
+ y="1052.3622"
+ x="0.17733237"
+ height="2"
+ width="400"
+ id="rect4191"
+ style="opacity:1;fill:url(#radialGradient4387);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ ry="0.034893107"
+ y="1049.3622"
+ x="1.1516008e-005"
+ height="2.9999878"
+ width="1728"
+ id="rect4160"
+ style="opacity:1;fill:url(#radialGradient4391);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4217);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4215"
+ width="1728"
+ height="2.9999878"
+ x="4.9999999e-006"
+ y="890.36218"
+ ry="0.034893107" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/messagered.svg b/skins/blackhole/themes/default/skinparts/messagered.svg
new file mode 100644
index 0000000..4c01d9b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/messagered.svg
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1728"
+ height="162"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1728 162"
+ sodipodi:docname="messagered.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4180">
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1;"
+ offset="0"
+ id="stop4182" />
+ <stop
+ style="stop-color:#cccccc;stop-opacity:0;"
+ offset="1"
+ id="stop4184" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4152">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4154" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4156" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4183">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4185" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4187" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4148"
+ x="-0.013382644"
+ width="1.0267653"
+ y="-0.11614827"
+ height="1.2322965">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.2304407"
+ id="feGaussianBlur4150" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4180"
+ id="linearGradient4186"
+ x1="210.71375"
+ y1="901.98651"
+ x2="199.81989"
+ y2="1036.3486"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4201"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00500002,0,1048.4454)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4203"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3199999,0,0,0.0075,1.6001723e-5,884.48697)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4228"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3199999,0,0,0.0075,1.6001723e-5,1043.487)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.85962546"
+ inkscape:cx="449.03608"
+ inkscape:cy="116.50387"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4164"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-890.3622)"
+ id="g4164"
+ inkscape:groupmode="layer"
+ inkscape:label="Rot"
+ style="display:inline">
+ <rect
+ ry="0.99008864"
+ y="890.36218"
+ x="5.1415495e-006"
+ height="161.99998"
+ width="1728"
+ id="rect4166"
+ style="opacity:1;fill:#aa0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ transform="matrix(4.2115011,0,0,1.7477339,4.6976628,-787.25101)"
+ inkscape:connector-curvature="0"
+ id="path4168"
+ d="m 55.347603,1000.9212 a 496.85897,57.329265 0 0 0 -51.3105474,0.2891 l 0,45.3711 c 0,0.237 0.1907242,0.4277 0.4277343,0.4277 l 399.1445401,0 c 0.23701,0 0.42773,-0.1907 0.42773,-0.4277 l 0,-28.8321 A 496.85897,57.329265 0 0 0 55.347603,1000.9212 Z"
+ style="opacity:1;fill:#550000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)" />
+ <path
+ transform="matrix(4.2125314,0,0,1.9743876,27.162466,-1045.6397)"
+ inkscape:connector-curvature="0"
+ id="path4170"
+ d="m -0.9179615,985.50214 c -0.23701,0 -0.427734,0.19072 -0.427734,0.42773 l 0,23.77343 a 496.85896,57.329264 0 0 1 51.3105475,-0.289 496.85896,57.329264 0 0 1 348.689448,16.8281 l 0,-40.31253 c 0,-0.23701 -0.19072,-0.42773 -0.42773,-0.42773 l -399.1445315,0 z"
+ style="opacity:1;fill:url(#linearGradient4186);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4201);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4174"
+ width="400"
+ height="2"
+ x="-2.857143e-006"
+ y="1052.3622"
+ ry="0.427816" />
+ <rect
+ ry="0.034893107"
+ y="890.36218"
+ x="3.6588654e-006"
+ height="2.9999878"
+ width="1728"
+ id="rect4176"
+ style="opacity:1;fill:url(#radialGradient4203);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4228);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4226"
+ width="1728"
+ height="2.9999878"
+ x="3.6588654e-006"
+ y="1049.3622"
+ ry="0.034893107" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/messageyellow.svg b/skins/blackhole/themes/default/skinparts/messageyellow.svg
new file mode 100644
index 0000000..51a1f43
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/messageyellow.svg
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1728"
+ height="162"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 1728 162"
+ sodipodi:docname="messageyellow.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4152">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4154" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4156" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4183">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4185" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4187" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4148"
+ x="-0.013382644"
+ width="1.0267653"
+ y="-0.11614827"
+ height="1.2322965">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="2.2304407"
+ id="feGaussianBlur4150" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="linearGradient4204"
+ gradientUnits="userSpaceOnUse"
+ x1="210.71375"
+ y1="901.98651"
+ x2="199.81989"
+ y2="1036.3486" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4565"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3178877,0,0,0.01125004,0.57403969,883.54934)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4183"
+ id="radialGradient4567"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3178877,0,0,0.01125004,0.57403969,1041.0494)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4569"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3178877,0,0,0.00750002,0.57403877,884.48695)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4152"
+ id="radialGradient4571"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.3178876,0,0,0.00750002,0.57403877,1043.487)"
+ cx="200"
+ cy="983.36218"
+ fx="200"
+ fy="983.36218"
+ r="200" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.85962546"
+ inkscape:cx="449.03608"
+ inkscape:cy="116.50387"
+ inkscape:document-units="px"
+ inkscape:current-layer="g4188"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ style="display:inline"
+ inkscape:label="Gelb"
+ inkscape:groupmode="layer"
+ id="g4188"
+ transform="translate(0,-890.3622)">
+ <rect
+ style="opacity:1;fill:#ffcc00;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4190"
+ width="1728"
+ height="161.99998"
+ x="5.0721487e-006"
+ y="890.36224"
+ ry="0.9900887" />
+ <path
+ style="opacity:1;fill:#aa8800;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)"
+ d="m 55.347603,1000.9212 a 496.85897,57.329265 0 0 0 -51.3105474,0.2891 l 0,45.3711 c 0,0.237 0.1907242,0.4277 0.4277343,0.4277 l 399.1445401,0 c 0.23701,0 0.42773,-0.1907 0.42773,-0.4277 l 0,-28.8321 A 496.85897,57.329265 0 0 0 55.347603,1000.9212 Z"
+ id="path4192"
+ inkscape:connector-curvature="0"
+ transform="matrix(4.2074416,0,0,2.2560334,5.5259383,-1321.8079)" />
+ <path
+ style="opacity:1;fill:url(#linearGradient4204);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter4148)"
+ d="m -0.9179615,985.50214 c -0.23701,0 -0.427734,0.19072 -0.427734,0.42773 l 0,23.77343 a 496.85896,57.329264 0 0 1 51.3105475,-0.289 496.85896,57.329264 0 0 1 348.689448,16.8281 l 0,-40.31253 c 0,-0.23701 -0.19072,-0.42773 -0.42773,-0.42773 l -399.1445315,0 z"
+ id="path4194"
+ inkscape:connector-curvature="0"
+ transform="matrix(4.2074271,0,0,2.1001906,27.992808,-1163.7311)" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4565);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4196"
+ width="1727.155"
+ height="4.4999995"
+ x="0.57402736"
+ y="892.36224"
+ ry="0.96258593" />
+ <rect
+ ry="0.96258593"
+ y="1049.8622"
+ x="0.57402736"
+ height="4.4999995"
+ width="1727.155"
+ id="rect4198"
+ style="opacity:1;fill:url(#radialGradient4567);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#radialGradient4569);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4200"
+ width="1727.155"
+ height="2.9999919"
+ x="0.57402647"
+ y="890.36218"
+ ry="0.034893151" />
+ <rect
+ ry="0.034893151"
+ y="1049.3622"
+ x="0.57402647"
+ height="2.9999919"
+ width="1727.155"
+ id="rect4202"
+ style="opacity:1;fill:url(#radialGradient4571);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/progressbar.svg b/skins/blackhole/themes/default/skinparts/progressbar.svg
new file mode 100644
index 0000000..77e5327
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/progressbar.svg
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="50"
+ height="30"
+ id="svg5635"
+ version="1.1"
+ inkscape:version="0.91pre3 r13670"
+ viewBox="0 0 49.999999 30"
+ sodipodi:docname="progressbar.svg">
+ <defs
+ id="defs5637">
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern" />
+ <pattern
+ y="0"
+ x="0"
+ height="6"
+ width="6"
+ patternUnits="userSpaceOnUse"
+ id="EMFhbasepattern-2" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient6185"
+ id="linearGradient6191"
+ x1="42.000378"
+ y1="1025.342"
+ x2="42.000378"
+ y2="1049.3121"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.62499992,0,0,0.64999977,1.7955524e-6,366.32701)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient6185">
+ <stop
+ style="stop-color:#00284a;stop-opacity:1"
+ offset="0"
+ id="stop6187" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop6189" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="16.542884"
+ inkscape:cx="26.283646"
+ inkscape:cy="14.817159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5640">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1022.3622)">
+ <rect
+ style="opacity:0.95;fill:url(#linearGradient6191);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect6183"
+ width="49.999992"
+ height="25.999985"
+ x="4.9999999e-006"
+ y="1024.3622"
+ rx="0"
+ ry="0" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/progressbarback.svg b/skins/blackhole/themes/default/skinparts/progressbarback.svg
new file mode 100644
index 0000000..8aa4552
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/progressbarback.svg
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="600"
+ height="30"
+ id="svg5061"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ viewBox="0 0 599.99999 30"
+ sodipodi:docname="progressbarback.svg">
+ <defs
+ id="defs5063">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4169">
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0"
+ id="stop4171" />
+ <stop
+ style="stop-color:#00284a;stop-opacity:1"
+ offset="1"
+ id="stop4173" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5627">
+ <stop
+ style="stop-color:#323232;stop-opacity:1;"
+ offset="0"
+ id="stop5629" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop5631" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5619">
+ <stop
+ style="stop-color:#323232;stop-opacity:1;"
+ offset="0"
+ id="stop5621" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop5623" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5619"
+ id="linearGradient5625"
+ x1="292"
+ y1="1049.1788"
+ x2="292"
+ y2="1018.4011"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0003642,0,0,1.5755257,-0.1092438,-604.90605)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5627"
+ id="linearGradient5633"
+ x1="269"
+ y1="1054.1072"
+ x2="269"
+ y2="1030.1171"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.0003642,0,0,1.5755257,-0.1092438,-604.90605)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4169"
+ id="linearGradient4179"
+ gradientUnits="userSpaceOnUse"
+ x1="589.40759"
+ y1="1047.4875"
+ x2="589.39136"
+ y2="1033.7078"
+ gradientTransform="translate(-600.00029,0)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5627"
+ id="linearGradient4181"
+ gradientUnits="userSpaceOnUse"
+ x1="592.67389"
+ y1="1053.8467"
+ x2="592.67389"
+ y2="1018.0886"
+ gradientTransform="translate(-600.00029,0)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.2678445"
+ inkscape:cx="277.67286"
+ inkscape:cy="-23.838292"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1600"
+ inkscape:window-height="1153"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5066">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1022.3622)">
+ <rect
+ style="opacity:1;fill:url(#linearGradient5625);fill-opacity:1;stroke:url(#linearGradient5633);stroke-width:2.02869797;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5609"
+ width="597.97125"
+ height="27.971302"
+ x="1.014344"
+ y="1023.3765"
+ rx="14.067764"
+ ry="13.985651" />
+ <path
+ sodipodi:open="true"
+ d="m -13.968908,1023.3526 c 7.1595473,-0.01 12.96902034,6.259 12.97582106,13.9963 0.006801,7.7372 -5.79164626,14.0155 -12.95119406,14.0228 -0.02051,10e-5 -0.04101,0 -0.06152,-10e-5"
+ sodipodi:end="1.5745921"
+ sodipodi:start="4.7114391"
+ sodipodi:ry="14.009566"
+ sodipodi:rx="12.963513"
+ sodipodi:cy="1037.3622"
+ sodipodi:cx="-13.956594"
+ sodipodi:type="arc"
+ id="path4177"
+ style="opacity:1;fill:url(#linearGradient4179);fill-opacity:1;stroke:url(#linearGradient4181);stroke-width:1.98086679;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/progressbarback_replay.svg b/skins/blackhole/themes/default/skinparts/progressbarback_replay.svg
new file mode 100644
index 0000000..4cfdbd3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/progressbarback_replay.svg
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1250"
+ height="90"
+ id="svg5061"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ viewBox="0 0 1250 90"
+ sodipodi:docname="progressbarback_replay.svg">
+ <defs
+ id="defs5063">
+ <linearGradient
+ id="linearGradient5627">
+ <stop
+ style="stop-color:#323232;stop-opacity:1;"
+ offset="0"
+ id="stop5629" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop5631" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5619">
+ <stop
+ style="stop-color:#323232;stop-opacity:1;"
+ offset="0"
+ id="stop5621" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop5623" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5619"
+ id="linearGradient5625"
+ x1="292"
+ y1="1049.1788"
+ x2="292"
+ y2="1018.4011"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0826315,0,0,4.7821383,0.21066728,-3977.3574)" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5627"
+ id="linearGradient5633"
+ x1="269"
+ y1="1054.1072"
+ x2="269"
+ y2="1030.1171"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.0826315,0,0,4.7821383,0.21066728,-3977.3574)" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.87774205"
+ inkscape:cx="570.58359"
+ inkscape:cy="78.787158"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1600"
+ inkscape:window-height="1153"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5066">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-962.3622)">
+ <rect
+ style="opacity:1;fill:url(#linearGradient5625);fill-opacity:1;stroke:url(#linearGradient5633);stroke-width:5;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5609"
+ width="1244.9003"
+ height="84.900314"
+ x="2.5498345"
+ y="964.91199"
+ rx="0"
+ ry="0" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/progressbarback_replay_left.svg b/skins/blackhole/themes/default/skinparts/progressbarback_replay_left.svg
new file mode 100644
index 0000000..17c639c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/progressbarback_replay_left.svg
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="45"
+ height="90"
+ id="svg4149"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 45 90.000001"
+ sodipodi:docname="progressbarback_replay_left.svg">
+ <defs
+ id="defs4151">
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4169"
+ id="linearGradient4179"
+ gradientUnits="userSpaceOnUse"
+ x1="589.40759"
+ y1="1047.4875"
+ x2="589.39136"
+ y2="1033.7078"
+ gradientTransform="matrix(3.0433093,0,0,2.8551909,-1827.9644,-1954.5046)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4169">
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0"
+ id="stop4171" />
+ <stop
+ style="stop-color:#00284a;stop-opacity:1"
+ offset="1"
+ id="stop4173" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5627"
+ id="linearGradient4181"
+ gradientUnits="userSpaceOnUse"
+ x1="592.67389"
+ y1="1053.8467"
+ x2="592.67389"
+ y2="1018.0886"
+ gradientTransform="matrix(3.0433093,0,0,2.8551909,-1827.9644,-1954.5046)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5627">
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0"
+ id="stop5629" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop5631" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.7945122"
+ inkscape:cx="75.714286"
+ inkscape:cy="25.714286"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4154">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-962.3622)">
+ <path
+ d="m -44.997844,967.36603 a 39.451977,39.999985 0 0 1 34.686991,19.95181 39.451977,39.999985 0 0 1 -0.199294,40.43366 39.451977,39.999985 0 0 1 -34.881936,19.5993"
+ sodipodi:end="1.5946277"
+ sodipodi:start="4.6985523"
+ sodipodi:ry="39.999985"
+ sodipodi:rx="39.451977"
+ sodipodi:cy="1007.3622"
+ sodipodi:cx="-44.451977"
+ sodipodi:type="arc"
+ id="path4177"
+ style="opacity:1;fill:url(#linearGradient4179);fill-opacity:1;stroke:url(#linearGradient4181);stroke-width:0;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(-1,1)"
+ sodipodi:open="true" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/progressbarend.svg b/skins/blackhole/themes/default/skinparts/progressbarend.svg
new file mode 100644
index 0000000..e0d86bf
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/progressbarend.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="15"
+ height="30"
+ id="svg4191"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ viewBox="0 0 15 30"
+ sodipodi:docname="progressbarend.svg">
+ <defs
+ id="defs4193">
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4169"
+ id="linearGradient4223"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-585.00008,-3.4468423e-5)"
+ x1="589.40759"
+ y1="1047.4875"
+ x2="589.39136"
+ y2="1033.7078" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4169">
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0"
+ id="stop4171" />
+ <stop
+ style="stop-color:#00284a;stop-opacity:1"
+ offset="1"
+ id="stop4173" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5627"
+ id="linearGradient4225"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-585.00008,-3.4468423e-5)"
+ x1="592.52893"
+ y1="1055.7797"
+ x2="592.62555"
+ y2="1017.992" />
+ <linearGradient
+ id="linearGradient5627">
+ <stop
+ style="stop-color:#323232;stop-opacity:1;"
+ offset="0"
+ id="stop5629" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1"
+ offset="1"
+ id="stop5631" />
+ </linearGradient>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="20.693842"
+ inkscape:cx="-0.27737725"
+ inkscape:cy="14.527028"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1600"
+ inkscape:window-height="1153"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4196">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1022.3622)">
+ <path
+ style="opacity:1;fill:url(#linearGradient4223);fill-opacity:1;stroke:url(#linearGradient4225);stroke-width:1.98086679000000010;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="path4221"
+ sodipodi:type="arc"
+ sodipodi:cx="1.0436943"
+ sodipodi:cy="1037.3622"
+ sodipodi:rx="12.963513"
+ sodipodi:ry="14.009566"
+ sodipodi:start="4.7114391"
+ sodipodi:end="1.5745921"
+ d="m 1.0313805,1023.3526 c 7.1595475,-0.01 12.9690205,6.259 12.9758215,13.9963 0.0068,7.7372 -5.7916464,14.0155 -12.951194,14.0228 -0.020507,10e-5 -0.041014,0 -0.0615202,-10e-5"
+ sodipodi:open="true" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/scrollbar.svg b/skins/blackhole/themes/default/skinparts/scrollbar.svg
new file mode 100644
index 0000000..0c6de52
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/scrollbar.svg
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="20"
+ height="300"
+ id="svg5360"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 20 300"
+ sodipodi:docname="scrollbar.svg">
+ <defs
+ id="defs5362">
+ <linearGradient
+ id="linearGradient5933"
+ inkscape:collect="always">
+ <stop
+ id="stop5935"
+ offset="0"
+ style="stop-color:#cccccc;stop-opacity:1" />
+ <stop
+ id="stop5937"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5236"
+ id="linearGradient5242"
+ x1="-1072.1458"
+ y1="554.61908"
+ x2="-1059.5234"
+ y2="554.61908"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2327116,0,0,0.37971031,1306.489,691.76762)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5236">
+ <stop
+ style="stop-color:#cccccc;stop-opacity:1"
+ offset="0"
+ id="stop5238" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0"
+ offset="1"
+ id="stop5240" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5933"
+ id="linearGradient5246"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2327116,0,0,0.37971031,1326.4889,691.76762)"
+ x1="-1069.5354"
+ y1="554.61908"
+ x2="-1058.8707"
+ y2="554.61908" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4860596"
+ inkscape:cx="-66.453039"
+ inkscape:cy="136.37059"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata5365">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-752.3622)">
+ <rect
+ transform="scale(-1,1)"
+ style="opacity:1;fill:url(#linearGradient5242);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect5232"
+ width="10.138358"
+ height="300"
+ x="-10.138315"
+ y="752.36218"
+ ry="0.19488853" />
+ <rect
+ ry="0.19488853"
+ y="752.36218"
+ x="9.8615866"
+ height="300"
+ width="10.138358"
+ id="rect5244"
+ style="opacity:1;fill:url(#linearGradient5246);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/scrollbarback.svg b/skins/blackhole/themes/default/skinparts/scrollbarback.svg
new file mode 100644
index 0000000..a0be373
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/scrollbarback.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="30"
+ height="800"
+ id="svg4741"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 30 800.00001"
+ sodipodi:docname="scrollbarback.svg">
+ <defs
+ id="defs4743">
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4616"
+ id="linearGradient4891"
+ x1="1034.0717"
+ y1="213.93652"
+ x2="1060.0741"
+ y2="213.93652"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.99999887,0,0,7.2676787,22.001189,-1000.2029)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4616">
+ <stop
+ style="stop-color:#999999;stop-opacity:1;"
+ offset="0"
+ id="stop4618" />
+ <stop
+ style="stop-color:#999999;stop-opacity:0;"
+ offset="1"
+ id="stop4620" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4616"
+ id="linearGradient4911"
+ x1="-1083.0437"
+ y1="554.61908"
+ x2="-1052.5197"
+ y2="554.61908"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.0511824"
+ inkscape:cx="20"
+ inkscape:cy="402.85714"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4746">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-252.36219)">
+ <g
+ transform="matrix(1.0344843,0,0,1.0125609,-1089.3886,90.776624)"
+ style="display:inline"
+ id="g4671">
+ <rect
+ ry="0.51325583"
+ y="159.58109"
+ x="1067.0741"
+ height="790.07593"
+ width="14.999974"
+ id="rect4883"
+ style="opacity:1;fill:url(#linearGradient4891);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ transform="scale(-1,1)"
+ style="opacity:1;fill:url(#linearGradient4911);fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4893"
+ width="14.999974"
+ height="790.07593"
+ x="-1068.0741"
+ y="159.58109"
+ ry="0.51325583" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tabback.svg b/skins/blackhole/themes/default/skinparts/tabback.svg
new file mode 100644
index 0000000..15e2a15
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tabback.svg
@@ -0,0 +1,242 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="800"
+ height="200"
+ id="svg4153"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 800 200"
+ sodipodi:docname="tabback.svg">
+ <defs
+ id="defs4155">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4160">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4162" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4164" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4146">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop4148" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop4150" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4703">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4705" />
+ <stop
+ style="stop-color:#333333;stop-opacity:1"
+ offset="1"
+ id="stop4707" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4709"
+ x1="13.839722"
+ y1="1040.7826"
+ x2="801.53772"
+ y2="853.17749"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4799"
+ x="-0.096"
+ width="1.192"
+ y="-0.0576"
+ height="1.1152">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.2"
+ id="feGaussianBlur4801" />
+ </filter>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4146"
+ id="radialGradient4152"
+ cx="400.00001"
+ cy="971.36218"
+ fx="400.00001"
+ fy="971.36218"
+ r="380"
+ gradientTransform="matrix(1,0,0,0.00263157,0,968.80596)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4146"
+ id="radialGradient4156"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.00263157,-3.417212e-6,1030.806)"
+ cx="400.00001"
+ cy="971.36218"
+ fx="400.00001"
+ fy="971.36218"
+ r="380" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4160"
+ id="radialGradient4166"
+ cx="19.000002"
+ cy="1002.3622"
+ fx="19.000002"
+ fy="1002.3622"
+ r="1.0000009"
+ gradientTransform="matrix(1,0,0,29.999973,0,-29068.476)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4160"
+ id="radialGradient4170"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,29.999973,382,-29068.476)"
+ cx="19.000002"
+ cy="1002.3622"
+ fx="19.000002"
+ fy="1002.3622"
+ r="1.0000009" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4160"
+ id="radialGradient4174"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,29.999973,762,-29068.476)"
+ cx="19.000002"
+ cy="1002.3622"
+ fx="19.000002"
+ fy="1002.3622"
+ r="1.0000009" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.3725434"
+ inkscape:cx="744.58182"
+ inkscape:cy="69.621951"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4158">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-852.3622)">
+ <rect
+ style="fill:url(#linearGradient4709);fill-opacity:1"
+ id="rect4701"
+ width="800"
+ height="200"
+ x="0"
+ y="852.36218"
+ ry="1.0185972" />
+ <rect
+ style="fill:#000000;fill-opacity:1;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke:#ececec;stroke-opacity:1"
+ id="rect4711"
+ width="760"
+ height="60"
+ x="20"
+ y="972.36218"
+ ry="0.95768344" />
+ <path
+ style="fill:#1957d1;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4799)"
+ d="m 380,977.3622 -30,25 30,25 z"
+ id="path4713"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ transform="matrix(1.1299389,0,0,0.99316334,-42.224391,6.8524135)" />
+ <path
+ transform="matrix(-1.1299389,0,0,0.99316334,842.63101,6.8524135)"
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path4803"
+ d="m 380,977.3622 -30,25 30,25 z"
+ style="fill:#1957d1;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4799)" />
+ <rect
+ style="fill:url(#radialGradient4152);fill-opacity:1;stroke:#ececec;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4144"
+ width="760"
+ height="1.9999858"
+ x="20.000008"
+ y="970.36218"
+ ry="0.99999291" />
+ <rect
+ ry="0.99999291"
+ y="1032.3622"
+ x="20.000006"
+ height="1.9999858"
+ width="760"
+ id="rect4154"
+ style="fill:url(#radialGradient4156);fill-opacity:1;stroke:#ececec;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:url(#radialGradient4166);fill-opacity:1;stroke:#ececec;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4158"
+ width="1.9999918"
+ height="59.999989"
+ x="18.000006"
+ y="972.36218"
+ ry="0.95897168" />
+ <rect
+ ry="0.95897168"
+ y="972.36218"
+ x="400"
+ height="59.999989"
+ width="1.9999918"
+ id="rect4168"
+ style="fill:url(#radialGradient4170);fill-opacity:1;stroke:#ececec;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="fill:url(#radialGradient4174);fill-opacity:1;stroke:#ececec;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4172"
+ width="1.9999918"
+ height="59.999989"
+ x="780"
+ y="972.36218"
+ ry="0.95897168" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tacho_load_back.svg b/skins/blackhole/themes/default/skinparts/tacho_load_back.svg
new file mode 100644
index 0000000..91107ec
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tacho_load_back.svg
@@ -0,0 +1,767 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="tacho_load_back.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4633">
+ <stop
+ style="stop-color:#e6e6e6;stop-opacity:1;"
+ offset="0"
+ id="stop4635" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="1"
+ id="stop4637" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4620">
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1;"
+ offset="0"
+ id="stop4622" />
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:0;"
+ offset="1"
+ id="stop4624" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4620"
+ id="radialGradient4626"
+ cx="110.27615"
+ cy="12.330762"
+ fx="110.27615"
+ fy="12.330762"
+ r="74.998166"
+ gradientTransform="matrix(-1.8628953,0.67964205,-0.52439662,-1.4373683,322.17528,-44.829535)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4633"
+ id="linearGradient4643"
+ x1="80.356987"
+ y1="68.492752"
+ x2="68.958046"
+ y2="80.47979"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.94150667,0,0,0.94152267,4.3869559,4.3857232)" />
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4263"
+ x="-0.05507957"
+ width="1.1101591"
+ y="-0.026737965"
+ height="1.0534759">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.39862517"
+ id="feGaussianBlur4265" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="71.263485"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Back"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-902.3622)"
+ style="display:inline" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Uhr"
+ style="display:inline" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="Ziffernblatt" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Ziffern">
+ <g
+ id="g4404">
+ <path
+ sodipodi:open="true"
+ d="M 28.394987,19.250286 A 72.763588,72.685867 0 0 1 130.82373,28.448256 72.763588,72.685867 0 0 1 121.73828,130.77851 72.763588,72.685867 0 0 1 19.28783,121.82499 72.763588,72.685867 0 0 1 28.128539,19.473353"
+ sodipodi:end="4.012464"
+ sodipodi:start="4.0172418"
+ sodipodi:ry="72.685867"
+ sodipodi:rx="72.763588"
+ sodipodi:cy="75.070084"
+ sodipodi:cx="74.999954"
+ sodipodi:type="arc"
+ id="path4618"
+ style="display:inline;opacity:0.75;fill:#000000;fill-opacity:1;stroke:url(#radialGradient4626);stroke-width:4.494;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ d="M 70.175796,69.215654 A 7.5318813,7.5319991 0 0 1 80.778362,70.168778 7.5318813,7.5319991 0 0 1 79.837929,80.772642 7.5318813,7.5319991 0 0 1 69.233115,79.844873 7.5318813,7.5319991 0 0 1 70.14819,69.23879"
+ sodipodi:open="true"
+ sodipodi:end="4.0124596"
+ sodipodi:start="4.0172418"
+ sodipodi:ry="7.5319991"
+ sodipodi:rx="7.5318813"
+ sodipodi:cy="74.999924"
+ sodipodi:cx="74.999954"
+ sodipodi:type="arc"
+ id="path4631"
+ style="display:inline;opacity:0.75;fill:url(#linearGradient4643);fill-opacity:1;stroke:#999999;stroke-width:0.94151461;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4245"
+ d="m 128.27004,104.31786 c 4.05369,-9.895602 6.31749,-18.412239 6.97609,-29.704639 l 10.35162,0 c -0.28964,12.8754 -3.86039,23.940773 -9.22644,35.780599 z"
+ style="display:inline;fill:#d40000;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4263)" />
+ <rect
+ inkscape:transform-center-y="63.763147"
+ inkscape:transform-center-x="-1.380587e-005"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4651"
+ width="1.999997"
+ height="14.240295"
+ x="74.000023"
+ y="131.489" />
+ <rect
+ inkscape:transform-center-y="55.220514"
+ inkscape:transform-center-x="31.881558"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4656"
+ width="1.999997"
+ height="14.240295"
+ x="101.37493"
+ y="83.961533"
+ transform="matrix(0.8660254,0.5,-0.5,0.8660254,0,0)" />
+ <rect
+ transform="matrix(0.5,0.8660254,-0.8660254,0.5,0,0)"
+ y="29.114088"
+ x="101.31856"
+ height="14.240295"
+ width="1.999997"
+ id="rect4658"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="55.220498"
+ inkscape:transform-center-y="31.881587" />
+ <rect
+ inkscape:transform-center-y="1.4955199e-005"
+ inkscape:transform-center-x="63.763147"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4660"
+ width="1.999997"
+ height="14.240295"
+ x="73.846016"
+ y="-18.357008"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="matrix(-0.5,0.8660254,-0.8660254,-0.5,0,0)"
+ y="-45.731911"
+ x="26.31855"
+ height="14.240295"
+ width="1.999997"
+ id="rect4662"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="55.220514"
+ inkscape:transform-center-y="-31.881561" />
+ <rect
+ inkscape:transform-center-y="-55.220498"
+ inkscape:transform-center-x="31.881587"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4664"
+ width="1.999997"
+ height="14.240295"
+ x="-28.528894"
+ y="-45.675541"
+ transform="matrix(-0.8660254,0.5,-0.5,-0.8660254,0,0)" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-18.203001"
+ x="-75.999992"
+ height="14.240295"
+ width="1.999997"
+ id="rect4666"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="1.2844736e-005"
+ inkscape:transform-center-y="-63.763147" />
+ <rect
+ inkscape:transform-center-y="-55.220513"
+ inkscape:transform-center-x="-31.881559"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4668"
+ width="1.999997"
+ height="14.240295"
+ x="-103.37489"
+ y="29.324465"
+ transform="matrix(-0.8660254,-0.5,0.5,-0.8660254,0,0)" />
+ <rect
+ transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,0,0)"
+ y="84.171913"
+ x="-103.31852"
+ height="14.240295"
+ width="1.999997"
+ id="rect4670"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-55.220498"
+ inkscape:transform-center-y="-31.881592" />
+ <rect
+ inkscape:transform-center-y="-2.044845e-005"
+ inkscape:transform-center-x="-63.763147"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4672"
+ width="1.999997"
+ height="14.240295"
+ x="-75.845978"
+ y="131.64301"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <rect
+ transform="matrix(0.5,-0.8660254,0.8660254,0.5,0,0)"
+ y="159.01791"
+ x="-28.318512"
+ height="14.240295"
+ width="1.999997"
+ id="rect4674"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-55.220518"
+ inkscape:transform-center-y="31.881558" />
+ <rect
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,0,0)"
+ y="126.76038"
+ x="81.426651"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4676"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="6.8351622"
+ inkscape:transform-center-y="65.032436" />
+ <rect
+ transform="matrix(0.9781476,0.20791169,-0.20791169,0.9781476,0,0)"
+ inkscape:transform-center-y="63.961713"
+ inkscape:transform-center-x="13.595462"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4688"
+ width="1.9999983"
+ height="10.718534"
+ x="87.950188"
+ y="117.77891" />
+ <rect
+ y="108.16473"
+ x="93.499168"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4690"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="20.206801"
+ inkscape:transform-center-y="62.190201"
+ transform="matrix(0.95105652,0.30901699,-0.30901699,0.95105652,0,0)" />
+ <rect
+ transform="matrix(0.91354546,0.40673664,-0.40673664,0.91354546,0,0)"
+ inkscape:transform-center-y="59.737327"
+ inkscape:transform-center-x="26.596754"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4692"
+ width="1.9999983"
+ height="10.718534"
+ x="98.012794"
+ y="98.023193" />
+ <rect
+ y="76.607063"
+ x="103.74807"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4694"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="38.435639"
+ inkscape:transform-center-y="52.902143"
+ transform="matrix(0.809017,0.58778525,-0.58778525,0.809017,0,0)" />
+ <rect
+ transform="matrix(0.74314483,0.6691306,-0.6691306,0.74314483,0,0)"
+ inkscape:transform-center-y="48.594723"
+ inkscape:transform-center-x="43.754863"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4696"
+ width="1.9999983"
+ height="10.718534"
+ x="104.90688"
+ y="65.567108" />
+ <rect
+ y="54.466499"
+ x="104.90536"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4698"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="48.5947"
+ inkscape:transform-center-y="43.754887"
+ transform="matrix(0.66913061,0.74314482,-0.74314482,0.66913061,0,0)" />
+ <rect
+ transform="matrix(0.58778526,0.80901699,-0.80901699,0.58778526,0,0)"
+ inkscape:transform-center-y="38.435662"
+ inkscape:transform-center-x="52.902125"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4700"
+ width="1.9999983"
+ height="10.718534"
+ x="103.74351"
+ y="43.426861" />
+ <rect
+ y="22.012312"
+ x="98.002342"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4702"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="59.737308"
+ inkscape:transform-center-y="26.596781"
+ transform="matrix(0.40673665,0.91354545,-0.91354545,0.40673665,0,0)" />
+ <rect
+ transform="matrix(0.309017,0.95105651,-0.95105651,0.309017,0,0)"
+ inkscape:transform-center-y="20.206832"
+ inkscape:transform-center-x="62.190182"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4704"
+ width="1.9999983"
+ height="10.718534"
+ x="93.485924"
+ y="11.872024" />
+ <rect
+ y="2.2593789"
+ x="87.934296"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4706"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="63.961687"
+ inkscape:transform-center-y="13.595491"
+ transform="matrix(0.2079117,0.9781476,-0.9781476,0.2079117,0,0)" />
+ <rect
+ transform="matrix(0.10452847,0.99452189,-0.99452189,0.10452847,0,0)"
+ inkscape:transform-center-y="6.8351958"
+ inkscape:transform-center-x="65.032414"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4708"
+ width="1.9999983"
+ height="10.718534"
+ x="81.408287"
+ y="-6.720304" />
+ <rect
+ y="-22.395264"
+ x="65.729012"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4710"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="65.032416"
+ inkscape:transform-center-y="-6.8351727"
+ transform="matrix(-0.10452846,0.9945219,-0.9945219,-0.10452846,0,0)" />
+ <rect
+ transform="matrix(-0.20791169,0.9781476,-0.9781476,-0.20791169,0,0)"
+ inkscape:transform-center-y="-13.595466"
+ inkscape:transform-center-x="63.961692"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4712"
+ width="1.9999983"
+ height="10.718534"
+ x="56.747536"
+ y="-28.918802" />
+ <rect
+ y="-34.467785"
+ x="47.133366"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4714"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="62.190189"
+ inkscape:transform-center-y="-20.206804"
+ transform="matrix(-0.30901699,0.95105652,-0.95105652,-0.30901699,0,0)" />
+ <rect
+ transform="matrix(-0.40673664,0.91354546,-0.91354546,-0.40673664,0,0)"
+ inkscape:transform-center-y="-26.596753"
+ inkscape:transform-center-x="59.737318"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4716"
+ width="1.9999983"
+ height="10.718534"
+ x="36.991837"
+ y="-38.981415" />
+ <rect
+ y="-44.716694"
+ x="15.575709"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4718"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="52.902137"
+ inkscape:transform-center-y="-38.435636"
+ transform="matrix(-0.58778525,0.809017,-0.809017,-0.58778525,0,0)" />
+ <rect
+ transform="matrix(-0.6691306,0.74314483,-0.74314483,-0.6691306,0,0)"
+ inkscape:transform-center-y="-43.754862"
+ inkscape:transform-center-x="48.594717"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4720"
+ width="1.9999983"
+ height="10.718534"
+ x="4.5357528"
+ y="-45.875504" />
+ <rect
+ y="-45.873978"
+ x="-6.5648546"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4722"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="43.754881"
+ inkscape:transform-center-y="-48.594699"
+ transform="matrix(-0.74314482,0.66913061,-0.66913061,-0.74314482,0,0)" />
+ <rect
+ transform="matrix(-0.80901699,0.58778526,-0.58778526,-0.80901699,0,0)"
+ inkscape:transform-center-y="-52.902122"
+ inkscape:transform-center-x="38.435657"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4724"
+ width="1.9999983"
+ height="10.718534"
+ x="-17.604492"
+ y="-44.712132" />
+ <rect
+ y="-38.970963"
+ x="-39.019043"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4726"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="26.596775"
+ inkscape:transform-center-y="-59.737308"
+ transform="matrix(-0.91354545,0.40673665,-0.40673665,-0.91354545,0,0)" />
+ <rect
+ transform="matrix(-0.95105651,0.309017,-0.309017,-0.95105651,0,0)"
+ inkscape:transform-center-y="-62.190181"
+ inkscape:transform-center-x="20.206825"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4728"
+ width="1.9999983"
+ height="10.718534"
+ x="-49.159332"
+ y="-34.454544" />
+ <rect
+ y="-28.902918"
+ x="-58.771976"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4730"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="13.595486"
+ inkscape:transform-center-y="-63.961685"
+ transform="matrix(-0.9781476,0.2079117,-0.2079117,-0.9781476,0,0)" />
+ <rect
+ transform="matrix(-0.99452189,0.10452847,-0.10452847,-0.99452189,0,0)"
+ inkscape:transform-center-y="-65.032411"
+ inkscape:transform-center-x="6.8351958"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4732"
+ width="1.9999983"
+ height="10.718534"
+ x="-67.751656"
+ y="-22.376909" />
+ <rect
+ y="2.2838387"
+ x="-89.95015"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4734"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-13.59546"
+ inkscape:transform-center-y="-63.961689"
+ transform="matrix(-0.9781476,-0.20791169,0.20791169,-0.9781476,0,0)" />
+ <rect
+ transform="matrix(-0.9945219,-0.10452846,0.10452846,-0.9945219,0,0)"
+ inkscape:transform-center-y="-65.032413"
+ inkscape:transform-center-x="-6.8351672"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4736"
+ width="1.9999983"
+ height="10.718534"
+ x="-83.426613"
+ y="-6.6976385" />
+ <rect
+ transform="matrix(-0.95105652,-0.30901699,0.30901699,-0.95105652,0,0)"
+ inkscape:transform-center-y="-62.190189"
+ inkscape:transform-center-x="-20.2068"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4738"
+ width="1.9999983"
+ height="10.718534"
+ x="-95.49913"
+ y="11.89801" />
+ <rect
+ y="22.039541"
+ x="-100.01276"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4740"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-26.596747"
+ inkscape:transform-center-y="-59.737321"
+ transform="matrix(-0.91354546,-0.40673664,0.40673664,-0.91354546,0,0)" />
+ <rect
+ transform="matrix(-0.74314483,-0.6691306,0.6691306,-0.74314483,0,0)"
+ inkscape:transform-center-y="-48.594714"
+ inkscape:transform-center-x="-43.75486"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4742"
+ width="1.9999983"
+ height="10.718534"
+ x="-106.90685"
+ y="54.495621" />
+ <rect
+ y="43.455666"
+ x="-105.74803"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4744"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-38.435629"
+ inkscape:transform-center-y="-52.902142"
+ transform="matrix(-0.809017,-0.58778525,0.58778525,-0.809017,0,0)" />
+ <rect
+ y="65.59623"
+ x="-106.90533"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4746"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-48.594699"
+ inkscape:transform-center-y="-43.754879"
+ transform="matrix(-0.66913061,-0.74314482,0.74314482,-0.66913061,0,0)" />
+ <rect
+ transform="matrix(-0.58778526,-0.80901699,0.80901699,-0.58778526,0,0)"
+ inkscape:transform-center-y="-38.435656"
+ inkscape:transform-center-x="-52.902119"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4748"
+ width="1.9999983"
+ height="10.718534"
+ x="-105.74348"
+ y="76.635864" />
+ <rect
+ y="98.050407"
+ x="-100.00231"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4750"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-59.737299"
+ inkscape:transform-center-y="-26.596772"
+ transform="matrix(-0.40673665,-0.91354545,0.91354545,-0.40673665,0,0)" />
+ <rect
+ transform="matrix(-0.309017,-0.95105651,0.95105651,-0.309017,0,0)"
+ inkscape:transform-center-y="-20.206824"
+ inkscape:transform-center-x="-62.190172"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4752"
+ width="1.9999983"
+ height="10.718534"
+ x="-95.485893"
+ y="108.1907" />
+ <rect
+ y="117.80334"
+ x="-89.934265"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4754"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-63.961672"
+ inkscape:transform-center-y="-13.595487"
+ transform="matrix(-0.2079117,-0.9781476,0.9781476,-0.2079117,0,0)" />
+ <rect
+ transform="matrix(-0.10452847,-0.99452189,0.99452189,-0.10452847,0,0)"
+ inkscape:transform-center-y="-6.8351946"
+ inkscape:transform-center-x="-65.032398"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4756"
+ width="1.9999983"
+ height="10.718534"
+ x="-83.408257"
+ y="126.78302" />
+ <rect
+ y="142.45798"
+ x="-67.728981"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4758"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-65.032401"
+ inkscape:transform-center-y="6.8351634"
+ transform="matrix(0.10452846,-0.9945219,0.9945219,0.10452846,0,0)" />
+ <rect
+ transform="matrix(0.20791169,-0.9781476,0.9781476,0.20791169,0,0)"
+ inkscape:transform-center-y="13.595459"
+ inkscape:transform-center-x="-63.961682"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4760"
+ width="1.9999983"
+ height="10.718534"
+ x="-58.747505"
+ y="148.98152" />
+ <rect
+ y="154.5305"
+ x="-49.133335"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4762"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-62.190181"
+ inkscape:transform-center-y="20.206799"
+ transform="matrix(0.30901699,-0.95105652,0.95105652,0.30901699,0,0)" />
+ <rect
+ transform="matrix(0.40673664,-0.91354546,0.91354546,0.40673664,0,0)"
+ inkscape:transform-center-y="26.596748"
+ inkscape:transform-center-x="-59.737308"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4764"
+ width="1.9999983"
+ height="10.718534"
+ x="-38.991806"
+ y="159.04413" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text4769"
+ y="129.64612"
+ x="69.422562"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ y="129.64612"
+ x="69.422562"
+ id="tspan4771"
+ sodipodi:role="line">0</tspan></text>
+ <g
+ id="text4769-3"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4316"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 38.200996,101.65682 -0.552273,0.57273 -0.961363,-0.96137 0,-4.090904 1.513636,-1.534091 0,6.013635 z m -0.286364,-6.299999 -1.513636,1.534091 -4.970454,0 -1.513637,-1.534091 7.997727,0 z m -6.75,5.911359 -0.961363,0.96137 -0.572727,-0.57273 0,-6.013635 1.53409,1.534091 0,4.090904 z m 7.036364,8.12046 -1.513636,-1.53409 0,-4.09091 0.961363,-0.96136 0.552273,0.59318 0,5.99318 z m -0.286364,0.28636 -7.997727,0 1.513637,-1.53409 4.970454,0 1.513636,1.53409 z m -6.75,-1.82045 [...]
+ <path
+ id="path4318"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 40.660815,109.675 0,-1.53409 1.534091,0 0,1.53409 -1.534091,0 z" />
+ <path
+ id="path4320"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 52.899984,95.356821 -1.513636,1.534091 -4.970455,0 -1.513636,-1.534091 7.997727,0 z m 0,14.318179 -7.997727,0 1.513636,-1.53409 4.970455,0 1.513636,1.53409 z m -8.284091,-8.01818 0,-6.013635 1.534091,1.534091 0,4.090904 -0.961364,0.96137 -0.572727,-0.57273 z m 8.570455,1.73864 0,5.99318 -1.513637,-1.53409 0,-4.09091 0.961364,-0.96136 0.552273,0.59318 z m -1.615909,-1.63637 0.777272,0.75682 -0.777272,0.75682 -5.338637,0 -0.756818,-0.75682 0.756818,-0.75682 5.338637,0 z" />
+ </g>
+ <g
+ id="text4769-3-3"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4323"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 29.331,54.935455 0,5.993182 -1.534091,-1.534091 0,-4.090909 0.961363,-0.961364 0.572728,0.593182 z m -1.534091,-2.127273 0,-4.090909 1.534091,-1.534091 0,6.013636 -0.572728,0.572728 -0.961363,-0.961364 z" />
+ <path
+ id="path4325"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 32.744672,61.215 0,-1.534091 1.53409,0 0,1.534091 -1.53409,0 z" />
+ <path
+ id="path4327"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 45.270204,53.196818 -0.552272,0.572728 -0.961364,-0.961364 0,-4.090909 1.513636,-1.534091 0,6.013636 z m -0.286363,-6.3 -1.513637,1.534091 -4.970454,0 -1.513637,-1.534091 7.997728,0 z m -6.75,5.911364 -0.961364,0.961364 -0.572727,-0.572728 0,-6.013636 1.534091,1.534091 0,4.090909 z m 7.036363,8.120455 -1.513636,-1.534091 0,-4.090909 0.961364,-0.961364 0.552272,0.593182 0,5.993182 z m -0.286363,0.286363 -7.997728,0 1.513637,-1.534091 4.970454,0 1.513637,1.534091 z m -6.75, [...]
+ </g>
+ <g
+ id="text4769-3-3-0"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4330"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 67.563719,28.791591 0,5.993182 -1.534091,-1.534091 0,-4.090909 0.961364,-0.961364 0.572727,0.593182 z m -1.534091,-2.127273 0,-4.090909 1.534091,-1.534091 0,6.013637 -0.572727,0.572727 -0.961364,-0.961364 z" />
+ <path
+ id="path4332"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 70.977391,35.071136 0,-1.53409 1.534091,0 0,1.53409 -1.534091,0 z" />
+ <path
+ id="path4334"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 83.21656,20.752955 -1.513636,1.534091 -4.970455,0 -1.513636,-1.534091 7.997727,0 z m 0,14.318181 -7.997727,0 1.513636,-1.53409 4.970455,0 1.513636,1.53409 z m -8.284091,-8.018181 0,-6.013637 1.534091,1.534091 0,4.090909 -0.961364,0.961364 -0.572727,-0.572727 z m 8.570455,1.738636 0,5.993182 -1.513637,-1.534091 0,-4.090909 0.961364,-0.961364 0.552273,0.593182 z m -1.615909,-1.636364 0.777272,0.756819 -0.777272,0.756818 -5.338637,0 -0.756818,-0.756818 0.756818,-0.756819 5.3 [...]
+ </g>
+ <g
+ id="text4769-3-3-0-9"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4337"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 107.67709,46.948088 -1.51364,1.534091 -4.97045,0 -1.513638,-1.534091 7.997728,0 z m 0,14.318182 -7.997728,0 1.513638,-1.534091 4.97045,0 1.51364,1.534091 z m -6.75,-5.911364 0,4.090909 -1.534092,1.534091 0,-5.993182 0.572728,-0.593182 0.961364,0.961364 z m 5.52273,-2.495454 0,-4.09091 1.51363,-1.53409 0,6.013636 -0.55227,0.572727 -0.96136,-0.961363 z m -0.10228,0.490909 0.77728,0.756818 -0.77728,0.756818 -5.33863,0 -0.75682,-0.756818 0.75682,-0.756818 5.33863,0 z" />
+ <path
+ id="path4339"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 110.42327,61.26627 0,-1.534091 1.53409,0 0,1.534091 -1.53409,0 z" />
+ <path
+ id="path4341"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 122.9488,53.248088 -0.55227,0.572727 -0.96136,-0.961363 0,-4.09091 1.51363,-1.53409 0,6.013636 z m -0.28636,-6.3 -1.51364,1.534091 -4.97045,0 -1.51364,-1.534091 7.99773,0 z m -6.75,5.911364 -0.96136,0.961363 -0.57273,-0.572727 0,-6.013636 1.53409,1.53409 0,4.09091 z m 7.03636,8.120454 -1.51363,-1.534091 0,-4.090909 0.96136,-0.961364 0.55227,0.593182 0,5.993182 z m -0.28636,0.286364 -7.99773,0 1.51364,-1.534091 4.97045,0 1.51364,1.534091 z m -6.75,-1.820455 -1.53409,1.5340 [...]
+ </g>
+ <g
+ id="text4769-3-3-0-9-9"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4344"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000"
+ d="m 107.00009,95.273119 -1.51364,1.534091 -4.97045,0 -1.51364,-1.534091 7.99773,0 z m 0,14.318181 -7.99773,0 1.51364,-1.53409 4.97045,0 1.51364,1.53409 z m -6.75,-5.91136 0,4.09091 -1.534094,1.53409 0,-5.99318 0.572728,-0.59319 0.961366,0.96137 z m 5.52272,-2.49546 0,-4.090906 1.51364,-1.534091 0,6.013637 -0.55227,0.57273 -0.96137,-0.96137 z m -0.10227,0.49091 0.77727,0.75682 -0.77727,0.75682 -5.33863,0 -0.756823,-0.75682 0.756823,-0.75682 5.33863,0 z" />
+ <path
+ id="path4346"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000"
+ d="m 109.74627,109.5913 0,-1.53409 1.53409,0 0,1.53409 -1.53409,0 z" />
+ <path
+ id="path4348"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000"
+ d="m 121.98544,95.273119 -1.51364,1.534091 -4.97045,0 -1.51364,-1.534091 7.99773,0 z m 0,14.318181 -7.99773,0 1.51364,-1.53409 4.97045,0 1.51364,1.53409 z m -8.28409,-8.01818 0,-6.013637 1.53409,1.534091 0,4.090906 -0.96136,0.96137 -0.57273,-0.57273 z m 8.57045,1.73864 0,5.99318 -1.51363,-1.53409 0,-4.09091 0.96136,-0.96137 0.55227,0.59319 z m -1.61591,-1.63637 0.77728,0.75682 -0.77728,0.75682 -5.33863,0 -0.75682,-0.75682 0.75682,-0.75682 5.33863,0 z" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tacho_percent_back.svg b/skins/blackhole/themes/default/skinparts/tacho_percent_back.svg
new file mode 100644
index 0000000..7541297
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tacho_percent_back.svg
@@ -0,0 +1,749 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="tacho_percent_back.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4633">
+ <stop
+ style="stop-color:#e6e6e6;stop-opacity:1;"
+ offset="0"
+ id="stop4635" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="1"
+ id="stop4637" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4620">
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1;"
+ offset="0"
+ id="stop4622" />
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:0;"
+ offset="1"
+ id="stop4624" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4620"
+ id="radialGradient4626"
+ cx="110.27615"
+ cy="12.330762"
+ fx="110.27615"
+ fy="12.330762"
+ r="74.998166"
+ gradientTransform="matrix(-1.8628953,0.67964205,-0.52439662,-1.4373683,322.17528,-44.829535)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4633"
+ id="linearGradient4643"
+ x1="80.356987"
+ y1="68.492752"
+ x2="68.958046"
+ y2="80.47979"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.94150667,0,0,0.94152267,4.3869559,4.3857232)" />
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4263"
+ x="-0.05507957"
+ width="1.1101591"
+ y="-0.026737965"
+ height="1.0534759">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.39862517"
+ id="feGaussianBlur4265" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="65.064049"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Uhr"
+ style="display:inline" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="Ziffernblatt" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Ziffern">
+ <g
+ id="g4406">
+ <path
+ sodipodi:open="true"
+ d="M 28.394987,19.250286 A 72.763588,72.685867 0 0 1 130.82373,28.448256 72.763588,72.685867 0 0 1 121.73828,130.77851 72.763588,72.685867 0 0 1 19.28783,121.82499 72.763588,72.685867 0 0 1 28.128539,19.473353"
+ sodipodi:end="4.012464"
+ sodipodi:start="4.0172418"
+ sodipodi:ry="72.685867"
+ sodipodi:rx="72.763588"
+ sodipodi:cy="75.070084"
+ sodipodi:cx="74.999954"
+ sodipodi:type="arc"
+ id="path4618"
+ style="display:inline;opacity:0.75;fill:#000000;fill-opacity:1;stroke:url(#radialGradient4626);stroke-width:4.494;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ d="M 70.175796,69.215654 A 7.5318813,7.5319991 0 0 1 80.778362,70.168778 7.5318813,7.5319991 0 0 1 79.837929,80.772642 7.5318813,7.5319991 0 0 1 69.233115,79.844873 7.5318813,7.5319991 0 0 1 70.14819,69.23879"
+ sodipodi:open="true"
+ sodipodi:end="4.0124596"
+ sodipodi:start="4.0172418"
+ sodipodi:ry="7.5319991"
+ sodipodi:rx="7.5318813"
+ sodipodi:cy="74.999924"
+ sodipodi:cx="74.999954"
+ sodipodi:type="arc"
+ id="path4631"
+ style="display:inline;opacity:0.75;fill:url(#linearGradient4643);fill-opacity:1;stroke:#999999;stroke-width:0.94151461;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4245"
+ d="m 128.27004,104.31786 c 4.05369,-9.895602 6.31749,-18.412239 6.97609,-29.704639 l 10.35162,0 c -0.28964,12.8754 -3.86039,23.940773 -9.22644,35.780599 z"
+ style="display:inline;fill:#d40000;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4263)" />
+ <rect
+ inkscape:transform-center-y="63.763147"
+ inkscape:transform-center-x="-1.380587e-005"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4651"
+ width="1.999997"
+ height="14.240295"
+ x="74.000023"
+ y="131.489" />
+ <rect
+ inkscape:transform-center-y="55.220514"
+ inkscape:transform-center-x="31.881558"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4656"
+ width="1.999997"
+ height="14.240295"
+ x="101.37493"
+ y="83.961533"
+ transform="matrix(0.8660254,0.5,-0.5,0.8660254,0,0)" />
+ <rect
+ transform="matrix(0.5,0.8660254,-0.8660254,0.5,0,0)"
+ y="29.114088"
+ x="101.31856"
+ height="14.240295"
+ width="1.999997"
+ id="rect4658"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="55.220498"
+ inkscape:transform-center-y="31.881587" />
+ <rect
+ inkscape:transform-center-y="1.4955199e-005"
+ inkscape:transform-center-x="63.763147"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4660"
+ width="1.999997"
+ height="14.240295"
+ x="73.846016"
+ y="-18.357008"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="matrix(-0.5,0.8660254,-0.8660254,-0.5,0,0)"
+ y="-45.731911"
+ x="26.31855"
+ height="14.240295"
+ width="1.999997"
+ id="rect4662"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="55.220514"
+ inkscape:transform-center-y="-31.881561" />
+ <rect
+ inkscape:transform-center-y="-55.220498"
+ inkscape:transform-center-x="31.881587"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4664"
+ width="1.999997"
+ height="14.240295"
+ x="-28.528894"
+ y="-45.675541"
+ transform="matrix(-0.8660254,0.5,-0.5,-0.8660254,0,0)" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-18.203001"
+ x="-75.999992"
+ height="14.240295"
+ width="1.999997"
+ id="rect4666"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="1.2844736e-005"
+ inkscape:transform-center-y="-63.763147" />
+ <rect
+ inkscape:transform-center-y="-55.220513"
+ inkscape:transform-center-x="-31.881559"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4668"
+ width="1.999997"
+ height="14.240295"
+ x="-103.37489"
+ y="29.324465"
+ transform="matrix(-0.8660254,-0.5,0.5,-0.8660254,0,0)" />
+ <rect
+ transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,0,0)"
+ y="84.171913"
+ x="-103.31852"
+ height="14.240295"
+ width="1.999997"
+ id="rect4670"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-55.220498"
+ inkscape:transform-center-y="-31.881592" />
+ <rect
+ inkscape:transform-center-y="-2.044845e-005"
+ inkscape:transform-center-x="-63.763147"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4672"
+ width="1.999997"
+ height="14.240295"
+ x="-75.845978"
+ y="131.64301"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <rect
+ transform="matrix(0.5,-0.8660254,0.8660254,0.5,0,0)"
+ y="159.01791"
+ x="-28.318512"
+ height="14.240295"
+ width="1.999997"
+ id="rect4674"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-55.220518"
+ inkscape:transform-center-y="31.881558" />
+ <rect
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,0,0)"
+ y="126.76038"
+ x="81.426651"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4676"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="6.8351622"
+ inkscape:transform-center-y="65.032436" />
+ <rect
+ transform="matrix(0.9781476,0.20791169,-0.20791169,0.9781476,0,0)"
+ inkscape:transform-center-y="63.961713"
+ inkscape:transform-center-x="13.595462"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4688"
+ width="1.9999983"
+ height="10.718534"
+ x="87.950188"
+ y="117.77891" />
+ <rect
+ y="108.16473"
+ x="93.499168"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4690"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="20.206801"
+ inkscape:transform-center-y="62.190201"
+ transform="matrix(0.95105652,0.30901699,-0.30901699,0.95105652,0,0)" />
+ <rect
+ transform="matrix(0.91354546,0.40673664,-0.40673664,0.91354546,0,0)"
+ inkscape:transform-center-y="59.737327"
+ inkscape:transform-center-x="26.596754"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4692"
+ width="1.9999983"
+ height="10.718534"
+ x="98.012794"
+ y="98.023193" />
+ <rect
+ y="76.607063"
+ x="103.74807"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4694"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="38.435639"
+ inkscape:transform-center-y="52.902143"
+ transform="matrix(0.809017,0.58778525,-0.58778525,0.809017,0,0)" />
+ <rect
+ transform="matrix(0.74314483,0.6691306,-0.6691306,0.74314483,0,0)"
+ inkscape:transform-center-y="48.594723"
+ inkscape:transform-center-x="43.754863"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4696"
+ width="1.9999983"
+ height="10.718534"
+ x="104.90688"
+ y="65.567108" />
+ <rect
+ y="54.466499"
+ x="104.90536"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4698"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="48.5947"
+ inkscape:transform-center-y="43.754887"
+ transform="matrix(0.66913061,0.74314482,-0.74314482,0.66913061,0,0)" />
+ <rect
+ transform="matrix(0.58778526,0.80901699,-0.80901699,0.58778526,0,0)"
+ inkscape:transform-center-y="38.435662"
+ inkscape:transform-center-x="52.902125"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4700"
+ width="1.9999983"
+ height="10.718534"
+ x="103.74351"
+ y="43.426861" />
+ <rect
+ y="22.012312"
+ x="98.002342"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4702"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="59.737308"
+ inkscape:transform-center-y="26.596781"
+ transform="matrix(0.40673665,0.91354545,-0.91354545,0.40673665,0,0)" />
+ <rect
+ transform="matrix(0.309017,0.95105651,-0.95105651,0.309017,0,0)"
+ inkscape:transform-center-y="20.206832"
+ inkscape:transform-center-x="62.190182"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4704"
+ width="1.9999983"
+ height="10.718534"
+ x="93.485924"
+ y="11.872024" />
+ <rect
+ y="2.2593789"
+ x="87.934296"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4706"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="63.961687"
+ inkscape:transform-center-y="13.595491"
+ transform="matrix(0.2079117,0.9781476,-0.9781476,0.2079117,0,0)" />
+ <rect
+ transform="matrix(0.10452847,0.99452189,-0.99452189,0.10452847,0,0)"
+ inkscape:transform-center-y="6.8351958"
+ inkscape:transform-center-x="65.032414"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4708"
+ width="1.9999983"
+ height="10.718534"
+ x="81.408287"
+ y="-6.720304" />
+ <rect
+ y="-22.395264"
+ x="65.729012"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4710"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="65.032416"
+ inkscape:transform-center-y="-6.8351727"
+ transform="matrix(-0.10452846,0.9945219,-0.9945219,-0.10452846,0,0)" />
+ <rect
+ transform="matrix(-0.20791169,0.9781476,-0.9781476,-0.20791169,0,0)"
+ inkscape:transform-center-y="-13.595466"
+ inkscape:transform-center-x="63.961692"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4712"
+ width="1.9999983"
+ height="10.718534"
+ x="56.747536"
+ y="-28.918802" />
+ <rect
+ y="-34.467785"
+ x="47.133366"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4714"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="62.190189"
+ inkscape:transform-center-y="-20.206804"
+ transform="matrix(-0.30901699,0.95105652,-0.95105652,-0.30901699,0,0)" />
+ <rect
+ transform="matrix(-0.40673664,0.91354546,-0.91354546,-0.40673664,0,0)"
+ inkscape:transform-center-y="-26.596753"
+ inkscape:transform-center-x="59.737318"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4716"
+ width="1.9999983"
+ height="10.718534"
+ x="36.991837"
+ y="-38.981415" />
+ <rect
+ y="-44.716694"
+ x="15.575709"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4718"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="52.902137"
+ inkscape:transform-center-y="-38.435636"
+ transform="matrix(-0.58778525,0.809017,-0.809017,-0.58778525,0,0)" />
+ <rect
+ transform="matrix(-0.6691306,0.74314483,-0.74314483,-0.6691306,0,0)"
+ inkscape:transform-center-y="-43.754862"
+ inkscape:transform-center-x="48.594717"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4720"
+ width="1.9999983"
+ height="10.718534"
+ x="4.5357528"
+ y="-45.875504" />
+ <rect
+ y="-45.873978"
+ x="-6.5648546"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4722"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="43.754881"
+ inkscape:transform-center-y="-48.594699"
+ transform="matrix(-0.74314482,0.66913061,-0.66913061,-0.74314482,0,0)" />
+ <rect
+ transform="matrix(-0.80901699,0.58778526,-0.58778526,-0.80901699,0,0)"
+ inkscape:transform-center-y="-52.902122"
+ inkscape:transform-center-x="38.435657"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4724"
+ width="1.9999983"
+ height="10.718534"
+ x="-17.604492"
+ y="-44.712132" />
+ <rect
+ y="-38.970963"
+ x="-39.019043"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4726"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="26.596775"
+ inkscape:transform-center-y="-59.737308"
+ transform="matrix(-0.91354545,0.40673665,-0.40673665,-0.91354545,0,0)" />
+ <rect
+ transform="matrix(-0.95105651,0.309017,-0.309017,-0.95105651,0,0)"
+ inkscape:transform-center-y="-62.190181"
+ inkscape:transform-center-x="20.206825"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4728"
+ width="1.9999983"
+ height="10.718534"
+ x="-49.159332"
+ y="-34.454544" />
+ <rect
+ y="-28.902918"
+ x="-58.771976"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4730"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="13.595486"
+ inkscape:transform-center-y="-63.961685"
+ transform="matrix(-0.9781476,0.2079117,-0.2079117,-0.9781476,0,0)" />
+ <rect
+ transform="matrix(-0.99452189,0.10452847,-0.10452847,-0.99452189,0,0)"
+ inkscape:transform-center-y="-65.032411"
+ inkscape:transform-center-x="6.8351958"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4732"
+ width="1.9999983"
+ height="10.718534"
+ x="-67.751656"
+ y="-22.376909" />
+ <rect
+ y="2.2838387"
+ x="-89.95015"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4734"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-13.59546"
+ inkscape:transform-center-y="-63.961689"
+ transform="matrix(-0.9781476,-0.20791169,0.20791169,-0.9781476,0,0)" />
+ <rect
+ transform="matrix(-0.9945219,-0.10452846,0.10452846,-0.9945219,0,0)"
+ inkscape:transform-center-y="-65.032413"
+ inkscape:transform-center-x="-6.8351672"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4736"
+ width="1.9999983"
+ height="10.718534"
+ x="-83.426613"
+ y="-6.6976385" />
+ <rect
+ transform="matrix(-0.95105652,-0.30901699,0.30901699,-0.95105652,0,0)"
+ inkscape:transform-center-y="-62.190189"
+ inkscape:transform-center-x="-20.2068"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4738"
+ width="1.9999983"
+ height="10.718534"
+ x="-95.49913"
+ y="11.89801" />
+ <rect
+ y="22.039541"
+ x="-100.01276"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4740"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-26.596747"
+ inkscape:transform-center-y="-59.737321"
+ transform="matrix(-0.91354546,-0.40673664,0.40673664,-0.91354546,0,0)" />
+ <rect
+ transform="matrix(-0.74314483,-0.6691306,0.6691306,-0.74314483,0,0)"
+ inkscape:transform-center-y="-48.594714"
+ inkscape:transform-center-x="-43.75486"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4742"
+ width="1.9999983"
+ height="10.718534"
+ x="-106.90685"
+ y="54.495621" />
+ <rect
+ y="43.455666"
+ x="-105.74803"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4744"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-38.435629"
+ inkscape:transform-center-y="-52.902142"
+ transform="matrix(-0.809017,-0.58778525,0.58778525,-0.809017,0,0)" />
+ <rect
+ y="65.59623"
+ x="-106.90533"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4746"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-48.594699"
+ inkscape:transform-center-y="-43.754879"
+ transform="matrix(-0.66913061,-0.74314482,0.74314482,-0.66913061,0,0)" />
+ <rect
+ transform="matrix(-0.58778526,-0.80901699,0.80901699,-0.58778526,0,0)"
+ inkscape:transform-center-y="-38.435656"
+ inkscape:transform-center-x="-52.902119"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4748"
+ width="1.9999983"
+ height="10.718534"
+ x="-105.74348"
+ y="76.635864" />
+ <rect
+ y="98.050407"
+ x="-100.00231"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4750"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-59.737299"
+ inkscape:transform-center-y="-26.596772"
+ transform="matrix(-0.40673665,-0.91354545,0.91354545,-0.40673665,0,0)" />
+ <rect
+ transform="matrix(-0.309017,-0.95105651,0.95105651,-0.309017,0,0)"
+ inkscape:transform-center-y="-20.206824"
+ inkscape:transform-center-x="-62.190172"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4752"
+ width="1.9999983"
+ height="10.718534"
+ x="-95.485893"
+ y="108.1907" />
+ <rect
+ y="117.80334"
+ x="-89.934265"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4754"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-63.961672"
+ inkscape:transform-center-y="-13.595487"
+ transform="matrix(-0.2079117,-0.9781476,0.9781476,-0.2079117,0,0)" />
+ <rect
+ transform="matrix(-0.10452847,-0.99452189,0.99452189,-0.10452847,0,0)"
+ inkscape:transform-center-y="-6.8351946"
+ inkscape:transform-center-x="-65.032398"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4756"
+ width="1.9999983"
+ height="10.718534"
+ x="-83.408257"
+ y="126.78302" />
+ <rect
+ y="142.45798"
+ x="-67.728981"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4758"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-65.032401"
+ inkscape:transform-center-y="6.8351634"
+ transform="matrix(0.10452846,-0.9945219,0.9945219,0.10452846,0,0)" />
+ <rect
+ transform="matrix(0.20791169,-0.9781476,0.9781476,0.20791169,0,0)"
+ inkscape:transform-center-y="13.595459"
+ inkscape:transform-center-x="-63.961682"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4760"
+ width="1.9999983"
+ height="10.718534"
+ x="-58.747505"
+ y="148.98152" />
+ <rect
+ y="154.5305"
+ x="-49.133335"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4762"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-62.190181"
+ inkscape:transform-center-y="20.206799"
+ transform="matrix(0.30901699,-0.95105652,0.95105652,0.30901699,0,0)" />
+ <rect
+ transform="matrix(0.40673664,-0.91354546,0.91354546,0.40673664,0,0)"
+ inkscape:transform-center-y="26.596748"
+ inkscape:transform-center-x="-59.737308"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4764"
+ width="1.9999983"
+ height="10.718534"
+ x="-38.991806"
+ y="159.04413" />
+ <g
+ id="text4769"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4320"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 79.220289,121.62794 -0.552273,0.57272 -0.961363,-0.96136 0,-4.09091 1.513636,-1.53409 0,6.01364 z m -0.286364,-6.3 -1.513636,1.53409 -4.970455,0 -1.513636,-1.53409 7.997727,0 z m -6.75,5.91136 -0.961363,0.96136 -0.572728,-0.57272 0,-6.01364 1.534091,1.53409 0,4.09091 z m 7.036364,8.12045 -1.513636,-1.53409 0,-4.09091 0.961363,-0.96136 0.552273,0.59318 0,5.99318 z m -0.286364,0.28637 -7.997727,0 1.513636,-1.53409 4.970455,0 1.513636,1.53409 z m -6.75,-1.82046 -1.534091,1.5 [...]
+ </g>
+ <g
+ id="text4769-3"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4323"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 37.914632,95.356821 -1.513636,1.534091 -4.970454,0 -1.513637,-1.534091 7.997727,0 z m 0,14.318179 -7.997727,0 1.513637,-1.53409 4.970454,0 1.513636,1.53409 z m -6.75,-5.91136 0,4.09091 -1.53409,1.53409 0,-5.99318 0.572727,-0.59318 0.961363,0.96136 z m 5.522728,-2.49546 0,-4.090904 1.513636,-1.534091 0,6.013635 -0.552273,0.57273 -0.961363,-0.96137 z m -0.102273,0.49091 0.777273,0.75682 -0.777273,0.75682 -5.338636,0 -0.756819,-0.75682 0.756819,-0.75682 5.338636,0 z" />
+ <path
+ id="path4325"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 49.23127,101.65682 -0.552273,0.57273 -0.961364,-0.96137 0,-4.090904 1.513637,-1.534091 0,6.013635 z m -0.286364,-6.299999 -1.513636,1.534091 -4.970455,0 -1.513636,-1.534091 7.997727,0 z m -6.75,5.911359 -0.961364,0.96137 -0.572727,-0.57273 0,-6.013635 1.534091,1.534091 0,4.090904 z m 7.036364,8.12046 -1.513637,-1.53409 0,-4.09091 0.961364,-0.96136 0.552273,0.59318 0,5.99318 z m -0.286364,0.28636 -7.997727,0 1.513636,-1.53409 4.970455,0 1.513636,1.53409 z m -6.75,-1.82045 [...]
+ </g>
+ <g
+ id="text4769-3-3"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4328"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 26.856,53.196818 0,-6.013636 1.534091,1.534091 0,4.090909 -0.961364,0.961364 L 26.856,53.196818 Z m 8.570454,1.738637 0,5.993182 -1.513636,-1.534091 0,-4.090909 0.961364,-0.961364 0.552272,0.593182 z m -1.513636,-2.127273 0,-4.090909 1.513636,-1.534091 0,6.013636 -0.552272,0.572728 -0.961364,-0.961364 z m -0.102273,0.490909 0.777273,0.756818 -0.777273,0.756818 -5.338636,0 -0.756818,-0.756818 0.756818,-0.756818 5.338636,0 z" />
+ <path
+ id="path4330"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 46.456728,53.196818 -0.552273,0.572728 -0.961364,-0.961364 0,-4.090909 1.513637,-1.534091 0,6.013636 z m -0.286364,-6.3 -1.513636,1.534091 -4.970455,0 -1.513636,-1.534091 7.997727,0 z m -6.75,5.911364 -0.961364,0.961364 -0.572727,-0.572728 0,-6.013636 1.534091,1.534091 0,4.090909 z m 7.036364,8.120455 -1.513637,-1.534091 0,-4.090909 0.961364,-0.961364 0.552273,0.593182 0,5.993182 z m -0.286364,0.286363 -7.997727,0 1.513636,-1.534091 4.970455,0 1.513636,1.534091 z m -6.75, [...]
+ </g>
+ <g
+ id="text4769-3-3-0"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4333"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 73.37281,20.752955 -1.513636,1.534091 -4.970455,0 -1.513636,-1.534091 7.997727,0 z m 0,14.318181 -7.997727,0 1.513636,-1.53409 4.970455,0 1.513636,1.53409 z m -6.75,-5.911363 0,4.090909 -1.534091,1.534091 0,-5.993182 0.572727,-0.593182 0.961364,0.961364 z m -1.534091,-2.106818 0,-6.013637 1.534091,1.534091 0,4.090909 -0.961364,0.961364 -0.572727,-0.572727 z m 8.570455,1.738636 0,5.993182 -1.513637,-1.534091 0,-4.090909 0.961364,-0.961364 0.552273,0.593182 z m -1.615909,-1 [...]
+ <path
+ id="path4335"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 84.689447,27.052955 -0.552273,0.572727 -0.961363,-0.961364 0,-4.090909 1.513636,-1.534091 0,6.013637 z m -0.286364,-6.3 -1.513636,1.534091 -4.970454,0 -1.513637,-1.534091 7.997727,0 z m -6.75,5.911363 -0.961363,0.961364 -0.572727,-0.572727 0,-6.013637 1.53409,1.534091 0,4.090909 z m 7.036364,8.120455 -1.513636,-1.534091 0,-4.090909 0.961363,-0.961364 0.552273,0.593182 0,5.993182 z m -0.286364,0.286363 -7.997727,0 1.513637,-1.53409 4.970454,0 1.513636,1.53409 z m -6.75,-1. [...]
+ </g>
+ <g
+ id="text4769-3-3-0-9"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4338"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 110.77677,46.948088 -1.51364,1.534091 -4.97045,0 -1.51364,-1.534091 7.99773,0 z m 0,14.318182 -7.99773,0 1.51364,-1.534091 4.97045,0 1.51364,1.534091 z m -6.75,-5.911364 0,4.090909 -1.53409,1.534091 0,-5.993182 0.57272,-0.593182 0.96137,0.961364 z m -1.53409,-2.106818 0,-6.013636 1.53409,1.53409 0,4.09091 -0.96137,0.961363 -0.57272,-0.572727 z m 8.57045,1.738636 0,5.993182 -1.51364,-1.534091 0,-4.090909 0.96137,-0.961364 0.55227,0.593182 z m -1.51364,-2.127272 0,-4.09091 [...]
+ <path
+ id="path4340"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 122.0934,53.248088 -0.55227,0.572727 -0.96136,-0.961363 0,-4.09091 1.51363,-1.53409 0,6.013636 z m -0.28636,-6.3 -1.51364,1.534091 -4.97045,0 -1.51364,-1.534091 7.99773,0 z m -6.75,5.911364 -0.96136,0.961363 -0.57273,-0.572727 0,-6.013636 1.53409,1.53409 0,4.09091 z m 7.03636,8.120454 -1.51363,-1.534091 0,-4.090909 0.96136,-0.961364 0.55227,0.593182 0,5.993182 z m -0.28636,0.286364 -7.99773,0 1.51364,-1.534091 4.97045,0 1.51364,1.534091 z m -6.75,-1.820455 -1.53409,1.5340 [...]
+ </g>
+ <g
+ id="text4769-3-3-0-9-9"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4343"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000"
+ d="m 98.490885,103.31176 0,5.99318 -1.534091,-1.53409 0,-4.09091 0.961364,-0.96137 0.572727,0.59319 z m -1.534091,-2.12728 0,-4.090906 1.534091,-1.534091 0,6.013637 -0.572727,0.57273 -0.961364,-0.96137 z" />
+ <path
+ id="path4345"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000"
+ d="m 110.47501,101.57312 -0.55227,0.57273 -0.96136,-0.96137 0,-4.090906 1.51363,-1.534091 0,6.013637 z m -0.28636,-6.300001 -1.51364,1.534091 -4.97045,0 -1.51364,-1.534091 7.99773,0 z m -6.75,5.911361 -0.96137,0.96137 -0.57272,-0.57273 0,-6.013637 1.53409,1.534091 0,4.090906 z m 7.03636,8.12046 -1.51363,-1.53409 0,-4.09091 0.96136,-0.96137 0.55227,0.59319 0,5.99318 z m -0.28636,0.28636 -7.99773,0 1.51364,-1.53409 4.97045,0 1.51364,1.53409 z m -6.75,-1.82045 -1.53409,1.53409 0, [...]
+ <path
+ id="path4347"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000"
+ d="m 121.50528,101.57312 -0.55227,0.57273 -0.96136,-0.96137 0,-4.090906 1.51363,-1.534091 0,6.013637 z m -0.28636,-6.300001 -1.51364,1.534091 -4.97045,0 -1.51364,-1.534091 7.99773,0 z m -6.75,5.911361 -0.96136,0.96137 -0.57273,-0.57273 0,-6.013637 1.53409,1.534091 0,4.090906 z m 7.03636,8.12046 -1.51363,-1.53409 0,-4.09091 0.96136,-0.96137 0.55227,0.59319 0,5.99318 z m -0.28636,0.28636 -7.99773,0 1.51364,-1.53409 4.97045,0 1.51364,1.53409 z m -6.75,-1.82045 -1.53409,1.53409 0, [...]
+ </g>
+ <g
+ id="text6300"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4350"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff"
+ d="m 96.274659,116.5055 -1.009091,1.03637 -2.181818,0 -1.009091,-1.03637 1.009091,-1.00909 2.181818,0 1.009091,1.00909 z m 0,6.62727 -1.009091,1.0091 -2.181818,0 -1.009091,-1.0091 1.009091,-1.03636 2.181818,0 1.009091,1.03636 z m -5.590909,-1.41818 1.009091,0.98182 1.036363,-0.98182 0,-3.79091 -1.036363,-1.03636 -1.009091,1.03636 0,3.79091 z m 4.936363,0 0,-3.79091 1.036364,-1.03636 1.009091,1.03636 0,3.79091 -1.009091,0.98182 -1.036364,-0.98182 z m 8.536367,5.42728 -1.00909,1 [...]
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tacho_temp_back.svg b/skins/blackhole/themes/default/skinparts/tacho_temp_back.svg
new file mode 100644
index 0000000..a7c544f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tacho_temp_back.svg
@@ -0,0 +1,640 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="tacho_temp_back.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4633">
+ <stop
+ style="stop-color:#e6e6e6;stop-opacity:1;"
+ offset="0"
+ id="stop4635" />
+ <stop
+ style="stop-color:#999999;stop-opacity:1"
+ offset="1"
+ id="stop4637" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4620">
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:1;"
+ offset="0"
+ id="stop4622" />
+ <stop
+ style="stop-color:#b3b3b3;stop-opacity:0;"
+ offset="1"
+ id="stop4624" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4620"
+ id="radialGradient4626"
+ cx="110.27615"
+ cy="12.330762"
+ fx="110.27615"
+ fy="12.330762"
+ r="74.998166"
+ gradientTransform="matrix(-1.8628953,0.67964205,-0.52439662,-1.4373683,322.17528,-44.829535)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4633"
+ id="linearGradient4643"
+ x1="80.356987"
+ y1="68.492752"
+ x2="68.958046"
+ y2="80.47979"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.94150667,0,0,0.94152267,4.3869559,4.3857232)" />
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4263"
+ x="-0.05507957"
+ width="1.1101591"
+ y="-0.026737965"
+ height="1.0534759">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.39862517"
+ id="feGaussianBlur4265" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Uhr"
+ style="display:inline" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="Ziffernblatt"
+ style="display:inline" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Ziffern"
+ style="display:inline">
+ <g
+ id="g4294">
+ <path
+ sodipodi:open="true"
+ d="M 28.394987,19.250286 A 72.763588,72.685867 0 0 1 130.82373,28.448256 72.763588,72.685867 0 0 1 121.73828,130.77851 72.763588,72.685867 0 0 1 19.28783,121.82499 72.763588,72.685867 0 0 1 28.128539,19.473353"
+ sodipodi:end="4.012464"
+ sodipodi:start="4.0172418"
+ sodipodi:ry="72.685867"
+ sodipodi:rx="72.763588"
+ sodipodi:cy="75.070084"
+ sodipodi:cx="74.999954"
+ sodipodi:type="arc"
+ id="path4618"
+ style="display:inline;opacity:0.75;fill:#000000;fill-opacity:1;stroke:url(#radialGradient4626);stroke-width:4.49399996;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ d="M 70.175796,69.215654 A 7.5318813,7.5319991 0 0 1 80.778362,70.168778 7.5318813,7.5319991 0 0 1 79.837929,80.772642 7.5318813,7.5319991 0 0 1 69.233115,79.844873 7.5318813,7.5319991 0 0 1 70.14819,69.23879"
+ sodipodi:open="true"
+ sodipodi:end="4.0124596"
+ sodipodi:start="4.0172418"
+ sodipodi:ry="7.5319991"
+ sodipodi:rx="7.5318813"
+ sodipodi:cy="74.999924"
+ sodipodi:cx="74.999954"
+ sodipodi:type="arc"
+ id="path4631"
+ style="display:inline;opacity:0.75;fill:url(#linearGradient4643);fill-opacity:1;stroke:#999999;stroke-width:0.94151461;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ inkscape:connector-curvature="0"
+ id="path4245"
+ d="m 128.27004,104.31786 c 4.05369,-9.895602 6.31749,-18.412239 6.97609,-29.704639 l 10.35162,0 c -0.28964,12.8754 -3.86039,23.940773 -9.22644,35.780599 z"
+ style="display:inline;fill:#d40000;fill-rule:evenodd;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4263)" />
+ <rect
+ transform="matrix(0.5,0.8660254,-0.8660254,0.5,0,0)"
+ y="29.114088"
+ x="101.31856"
+ height="14.240295"
+ width="1.999997"
+ id="rect4658"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="55.220498"
+ inkscape:transform-center-y="31.881587" />
+ <rect
+ inkscape:transform-center-y="1.4955199e-005"
+ inkscape:transform-center-x="63.763147"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4660"
+ width="1.999997"
+ height="14.240295"
+ x="73.846016"
+ y="-18.357008"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="matrix(-0.5,0.8660254,-0.8660254,-0.5,0,0)"
+ y="-45.731911"
+ x="26.31855"
+ height="14.240295"
+ width="1.999997"
+ id="rect4662"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="55.220514"
+ inkscape:transform-center-y="-31.881561" />
+ <rect
+ inkscape:transform-center-y="-55.220498"
+ inkscape:transform-center-x="31.881587"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4664"
+ width="1.999997"
+ height="14.240295"
+ x="-28.528894"
+ y="-45.675541"
+ transform="matrix(-0.8660254,0.5,-0.5,-0.8660254,0,0)" />
+ <rect
+ transform="scale(-1,-1)"
+ y="-18.203001"
+ x="-75.999992"
+ height="14.240295"
+ width="1.999997"
+ id="rect4666"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="1.2844736e-005"
+ inkscape:transform-center-y="-63.763147" />
+ <rect
+ inkscape:transform-center-y="-55.220513"
+ inkscape:transform-center-x="-31.881559"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4668"
+ width="1.999997"
+ height="14.240295"
+ x="-103.37489"
+ y="29.324465"
+ transform="matrix(-0.8660254,-0.5,0.5,-0.8660254,0,0)" />
+ <rect
+ transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,0,0)"
+ y="84.171913"
+ x="-103.31852"
+ height="14.240295"
+ width="1.999997"
+ id="rect4670"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-55.220498"
+ inkscape:transform-center-y="-31.881592" />
+ <rect
+ inkscape:transform-center-y="-2.044845e-005"
+ inkscape:transform-center-x="-63.763147"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4672"
+ width="1.999997"
+ height="14.240295"
+ x="-75.845978"
+ y="131.64301"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <rect
+ transform="matrix(0.5,-0.8660254,0.8660254,0.5,0,0)"
+ y="159.01791"
+ x="-28.318512"
+ height="14.240295"
+ width="1.999997"
+ id="rect4674"
+ style="display:inline;opacity:1;fill:#cccccc;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-55.220518"
+ inkscape:transform-center-y="31.881558" />
+ <rect
+ y="22.012312"
+ x="98.002342"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4702"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="59.737308"
+ inkscape:transform-center-y="26.596781"
+ transform="matrix(0.40673665,0.91354545,-0.91354545,0.40673665,0,0)" />
+ <rect
+ transform="matrix(0.309017,0.95105651,-0.95105651,0.309017,0,0)"
+ inkscape:transform-center-y="20.206832"
+ inkscape:transform-center-x="62.190182"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4704"
+ width="1.9999983"
+ height="10.718534"
+ x="93.485924"
+ y="11.872024" />
+ <rect
+ y="2.2593789"
+ x="87.934296"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4706"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="63.961687"
+ inkscape:transform-center-y="13.595491"
+ transform="matrix(0.2079117,0.9781476,-0.9781476,0.2079117,0,0)" />
+ <rect
+ transform="matrix(0.10452847,0.99452189,-0.99452189,0.10452847,0,0)"
+ inkscape:transform-center-y="6.8351958"
+ inkscape:transform-center-x="65.032414"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4708"
+ width="1.9999983"
+ height="10.718534"
+ x="81.408287"
+ y="-6.720304" />
+ <rect
+ y="-22.395264"
+ x="65.729012"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4710"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="65.032416"
+ inkscape:transform-center-y="-6.8351727"
+ transform="matrix(-0.10452846,0.9945219,-0.9945219,-0.10452846,0,0)" />
+ <rect
+ transform="matrix(-0.20791169,0.9781476,-0.9781476,-0.20791169,0,0)"
+ inkscape:transform-center-y="-13.595466"
+ inkscape:transform-center-x="63.961692"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4712"
+ width="1.9999983"
+ height="10.718534"
+ x="56.747536"
+ y="-28.918802" />
+ <rect
+ y="-34.467785"
+ x="47.133366"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4714"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="62.190189"
+ inkscape:transform-center-y="-20.206804"
+ transform="matrix(-0.30901699,0.95105652,-0.95105652,-0.30901699,0,0)" />
+ <rect
+ transform="matrix(-0.40673664,0.91354546,-0.91354546,-0.40673664,0,0)"
+ inkscape:transform-center-y="-26.596753"
+ inkscape:transform-center-x="59.737318"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4716"
+ width="1.9999983"
+ height="10.718534"
+ x="36.991837"
+ y="-38.981415" />
+ <rect
+ y="-44.716694"
+ x="15.575709"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4718"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="52.902137"
+ inkscape:transform-center-y="-38.435636"
+ transform="matrix(-0.58778525,0.809017,-0.809017,-0.58778525,0,0)" />
+ <rect
+ transform="matrix(-0.6691306,0.74314483,-0.74314483,-0.6691306,0,0)"
+ inkscape:transform-center-y="-43.754862"
+ inkscape:transform-center-x="48.594717"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4720"
+ width="1.9999983"
+ height="10.718534"
+ x="4.5357528"
+ y="-45.875504" />
+ <rect
+ y="-45.873978"
+ x="-6.5648546"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4722"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="43.754881"
+ inkscape:transform-center-y="-48.594699"
+ transform="matrix(-0.74314482,0.66913061,-0.66913061,-0.74314482,0,0)" />
+ <rect
+ transform="matrix(-0.80901699,0.58778526,-0.58778526,-0.80901699,0,0)"
+ inkscape:transform-center-y="-52.902122"
+ inkscape:transform-center-x="38.435657"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4724"
+ width="1.9999983"
+ height="10.718534"
+ x="-17.604492"
+ y="-44.712132" />
+ <rect
+ y="-38.970963"
+ x="-39.019043"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4726"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="26.596775"
+ inkscape:transform-center-y="-59.737308"
+ transform="matrix(-0.91354545,0.40673665,-0.40673665,-0.91354545,0,0)" />
+ <rect
+ transform="matrix(-0.95105651,0.309017,-0.309017,-0.95105651,0,0)"
+ inkscape:transform-center-y="-62.190181"
+ inkscape:transform-center-x="20.206825"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4728"
+ width="1.9999983"
+ height="10.718534"
+ x="-49.159332"
+ y="-34.454544" />
+ <rect
+ y="-28.902918"
+ x="-58.771976"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4730"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="13.595486"
+ inkscape:transform-center-y="-63.961685"
+ transform="matrix(-0.9781476,0.2079117,-0.2079117,-0.9781476,0,0)" />
+ <rect
+ transform="matrix(-0.99452189,0.10452847,-0.10452847,-0.99452189,0,0)"
+ inkscape:transform-center-y="-65.032411"
+ inkscape:transform-center-x="6.8351958"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4732"
+ width="1.9999983"
+ height="10.718534"
+ x="-67.751656"
+ y="-22.376909" />
+ <rect
+ y="2.2838387"
+ x="-89.95015"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4734"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-13.59546"
+ inkscape:transform-center-y="-63.961689"
+ transform="matrix(-0.9781476,-0.20791169,0.20791169,-0.9781476,0,0)" />
+ <rect
+ transform="matrix(-0.9945219,-0.10452846,0.10452846,-0.9945219,0,0)"
+ inkscape:transform-center-y="-65.032413"
+ inkscape:transform-center-x="-6.8351672"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4736"
+ width="1.9999983"
+ height="10.718534"
+ x="-83.426613"
+ y="-6.6976385" />
+ <rect
+ transform="matrix(-0.95105652,-0.30901699,0.30901699,-0.95105652,0,0)"
+ inkscape:transform-center-y="-62.190189"
+ inkscape:transform-center-x="-20.2068"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4738"
+ width="1.9999983"
+ height="10.718534"
+ x="-95.49913"
+ y="11.89801" />
+ <rect
+ y="22.039541"
+ x="-100.01276"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4740"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-26.596747"
+ inkscape:transform-center-y="-59.737321"
+ transform="matrix(-0.91354546,-0.40673664,0.40673664,-0.91354546,0,0)" />
+ <rect
+ transform="matrix(-0.74314483,-0.6691306,0.6691306,-0.74314483,0,0)"
+ inkscape:transform-center-y="-48.594714"
+ inkscape:transform-center-x="-43.75486"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4742"
+ width="1.9999983"
+ height="10.718534"
+ x="-106.90685"
+ y="54.495621" />
+ <rect
+ y="43.455666"
+ x="-105.74803"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4744"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-38.435629"
+ inkscape:transform-center-y="-52.902142"
+ transform="matrix(-0.809017,-0.58778525,0.58778525,-0.809017,0,0)" />
+ <rect
+ y="65.59623"
+ x="-106.90533"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4746"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-48.594699"
+ inkscape:transform-center-y="-43.754879"
+ transform="matrix(-0.66913061,-0.74314482,0.74314482,-0.66913061,0,0)" />
+ <rect
+ transform="matrix(-0.58778526,-0.80901699,0.80901699,-0.58778526,0,0)"
+ inkscape:transform-center-y="-38.435656"
+ inkscape:transform-center-x="-52.902119"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4748"
+ width="1.9999983"
+ height="10.718534"
+ x="-105.74348"
+ y="76.635864" />
+ <rect
+ y="98.050407"
+ x="-100.00231"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4750"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-59.737299"
+ inkscape:transform-center-y="-26.596772"
+ transform="matrix(-0.40673665,-0.91354545,0.91354545,-0.40673665,0,0)" />
+ <rect
+ transform="matrix(-0.309017,-0.95105651,0.95105651,-0.309017,0,0)"
+ inkscape:transform-center-y="-20.206824"
+ inkscape:transform-center-x="-62.190172"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4752"
+ width="1.9999983"
+ height="10.718534"
+ x="-95.485893"
+ y="108.1907" />
+ <rect
+ y="117.80334"
+ x="-89.934265"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4754"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-63.961672"
+ inkscape:transform-center-y="-13.595487"
+ transform="matrix(-0.2079117,-0.9781476,0.9781476,-0.2079117,0,0)" />
+ <rect
+ transform="matrix(-0.10452847,-0.99452189,0.99452189,-0.10452847,0,0)"
+ inkscape:transform-center-y="-6.8351946"
+ inkscape:transform-center-x="-65.032398"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4756"
+ width="1.9999983"
+ height="10.718534"
+ x="-83.408257"
+ y="126.78302" />
+ <rect
+ y="142.45798"
+ x="-67.728981"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4758"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-65.032401"
+ inkscape:transform-center-y="6.8351634"
+ transform="matrix(0.10452846,-0.9945219,0.9945219,0.10452846,0,0)" />
+ <rect
+ transform="matrix(0.20791169,-0.9781476,0.9781476,0.20791169,0,0)"
+ inkscape:transform-center-y="13.595459"
+ inkscape:transform-center-x="-63.961682"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4760"
+ width="1.9999983"
+ height="10.718534"
+ x="-58.747505"
+ y="148.98152" />
+ <rect
+ y="154.5305"
+ x="-49.133335"
+ height="10.718534"
+ width="1.9999983"
+ id="rect4762"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ inkscape:transform-center-x="-62.190181"
+ inkscape:transform-center-y="20.206799"
+ transform="matrix(0.30901699,-0.95105652,0.95105652,0.30901699,0,0)" />
+ <rect
+ transform="matrix(0.40673664,-0.91354546,0.91354546,0.40673664,0,0)"
+ inkscape:transform-center-y="26.596748"
+ inkscape:transform-center-x="-59.737308"
+ style="display:inline;opacity:1;fill:#808080;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4764"
+ width="1.9999983"
+ height="10.718534"
+ x="-38.991806"
+ y="159.04413" />
+ <g
+ id="text4769"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4222"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff"
+ d="m 73.930286,127.34366 q 0,1.8457 -1.274414,3.12012 -1.274414,1.27441 -3.131103,1.27441 -1.85669,0 -3.131104,-1.26343 -1.274414,-1.27441 -1.274414,-3.1311 0,-1.8457 1.274414,-3.12012 1.274414,-1.27441 3.131104,-1.27441 1.867676,0 3.131103,1.27441 1.274414,1.27442 1.274414,3.12012 z m -1.812744,0 q 0,-1.12061 -0.736084,-1.87866 -0.736084,-0.76905 -1.856689,-0.76905 -1.120606,0 -1.85669,0.76905 -0.736084,0.75805 -0.736084,1.87866 0,1.14258 0.747071,1.90063 0.758056,0.74707 1.8 [...]
+ <path
+ id="path4224"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff"
+ d="m 85.441881,125.28622 -1.513636,1.53409 -5.256819,0 -0.756818,-0.77727 0.756818,-0.75682 6.770455,0 z m -7.036364,5.91136 -0.961363,0.96137 -0.572728,-0.57273 0,-4.47955 0.756819,-0.77727 0.777272,0.77727 0,4.09091 z m 7.036364,8.40682 -6.770455,0 -0.756818,-0.75682 0.756818,-0.77727 5.256819,0 1.513636,1.53409 z m -7.036364,-1.82045 -0.777272,0.77727 -0.756819,-0.77727 0,-4.45909 0.572728,-0.59319 0.961363,0.96137 0,4.09091 z" />
+ </g>
+ <g
+ id="text4769-3-3-0-9-9"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4246"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000"
+ d="m 111.31015,100.62009 -1.26716,1.28429 -4.1611,0 -1.26717,-1.28429 6.69543,0 z m 0,11.98671 -6.69543,0 1.26717,-1.28429 4.1611,0 1.26716,1.28429 z m -5.65087,-4.9488 0,3.42477 -1.28429,1.28429 0,-5.01729 0.47947,-0.49659 0.80482,0.80482 z m -1.28429,-1.76376 0,-5.03441 1.28429,1.28429 0,3.42477 -0.80482,0.80482 -0.47947,-0.47947 z m 7.1749,1.45553 0,5.01729 -1.26717,-1.28429 0,-3.42477 0.80482,-0.80482 0.46235,0.49659 z m -1.26717,-1.78088 0,-3.42477 1.26717,-1.28429 0,5.03 [...]
+ <path
+ id="path4248"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ff0000"
+ d="m 120.78407,105.89424 -0.46235,0.47947 -0.80482,-0.80482 0,-3.42477 1.26717,-1.28429 0,5.03441 z m -0.23974,-5.27415 -1.26716,1.28429 -4.1611,0 -1.26717,-1.28429 6.69543,0 z m -5.65087,4.9488 -0.80483,0.80482 -0.47946,-0.47947 0,-5.03441 1.28429,1.28429 0,3.42477 z m 5.89061,6.79817 -1.26717,-1.28429 0,-3.42477 0.80482,-0.80482 0.46235,0.49659 0,5.01729 z m -0.23974,0.23974 -6.69543,0 1.26717,-1.28429 4.1611,0 1.26716,1.28429 z m -5.65087,-1.52403 -1.28429,1.28429 0,-5.0172 [...]
+ </g>
+ <g
+ id="text4769-3-3-0-9-9-1-9-3"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4240"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 112.20966,45.414296 -1.26717,1.28429 -4.1611,0 -1.26716,-1.28429 6.69543,0 z m 0,11.986705 -6.69543,0 1.26716,-1.28429 4.1611,0 1.26717,1.28429 z m -5.65088,-4.948797 0,3.424773 -1.28429,1.28429 0,-5.017292 0.47947,-0.496592 0.80482,0.804821 z m -1.28429,-1.763758 0,-5.034416 1.28429,1.28429 0,3.424773 -0.80482,0.804822 -0.47947,-0.479469 z m 7.1749,1.455529 0,5.017292 -1.26716,-1.28429 0,-3.424773 0.80482,-0.804821 0.46234,0.496592 z m -1.35278,-1.369909 0.65071,0.633583 [...]
+ <path
+ id="path4242"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 121.68357,50.688446 -0.46234,0.479469 -0.80482,-0.804822 0,-3.424773 1.26716,-1.28429 0,5.034416 z m -0.23973,-5.27415 -1.26717,1.28429 -4.1611,0 -1.26716,-1.28429 6.69543,0 z m -5.65088,4.948797 -0.80482,0.804822 -0.47947,-0.479469 0,-5.034416 1.28429,1.28429 0,3.424773 z m 5.89061,6.798174 -1.26716,-1.28429 0,-3.424773 0.80482,-0.804821 0.46234,0.496592 0,5.017292 z m -0.23973,0.239734 -6.69543,0 1.26716,-1.28429 4.1611,0 1.26717,1.28429 z m -5.65088,-1.524024 -1.28429, [...]
+ </g>
+ <g
+ id="text4769-3-3-0-9-9-1-9-4"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4235"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 66.393345,26.050339 0,-5.034416 1.28429,1.28429 0,3.424773 -0.804822,0.804821 -0.479468,-0.479468 z m 7.174899,1.455528 0,5.017293 -1.267166,-1.28429 0,-3.424773 0.804822,-0.804822 0.462344,0.496592 z m -1.267166,-1.780881 0,-3.424773 1.267166,-1.28429 0,5.034416 -0.462344,0.479468 -0.804822,-0.804821 z m -0.08562,0.410972 0.650707,0.633583 -0.650707,0.633583 -4.469329,0 -0.633582,-0.633583 0.633582,-0.633583 4.469329,0 z" />
+ <path
+ id="path4237"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffff00"
+ d="m 82.802422,26.050339 -0.462345,0.479468 -0.804821,-0.804821 0,-3.424773 1.267166,-1.28429 0,5.034416 z m -0.239734,-5.27415 -1.267166,1.28429 -4.161099,0 -1.267166,-1.28429 6.695431,0 z m -5.650875,4.948797 -0.804822,0.804821 -0.479468,-0.479468 0,-5.034416 1.28429,1.28429 0,3.424773 z m 5.890609,6.798174 -1.267166,-1.28429 0,-3.424773 0.804821,-0.804822 0.462345,0.496592 0,5.017293 z m -0.239734,0.239734 -6.695431,0 1.267166,-1.28429 4.161099,0 1.267166,1.28429 z m -5.650 [...]
+ </g>
+ <g
+ id="text4769-3-3-0-9-9-1-9-4-6-0"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4230"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 35.30512,45.660405 -1.267166,1.28429 -4.161099,0 -1.267165,-1.28429 6.69543,0 z m 0,11.986705 -6.69543,0 1.267165,-1.28429 4.161099,0 1.267166,1.28429 z m -5.650875,-4.948797 0,3.424773 -1.28429,1.28429 0,-5.017292 0.479469,-0.496592 0.804821,0.804821 z m 4.623443,-2.089111 0,-3.424773 1.267166,-1.28429 0,5.034416 -0.462344,0.479469 -0.804822,-0.804822 z m -0.08562,0.410973 0.650707,0.633583 -0.650707,0.633583 -4.469328,0 -0.633583,-0.633583 0.633583,-0.633583 4.469328,0 z" />
+ <path
+ id="path4232"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 44.779032,50.934555 -0.462344,0.479469 -0.804822,-0.804822 0,-3.424773 1.267166,-1.28429 0,5.034416 z m -0.239734,-5.27415 -1.267166,1.28429 -4.161099,0 -1.267166,-1.28429 6.695431,0 z m -5.650875,4.948797 -0.804822,0.804822 -0.479468,-0.479469 0,-5.034416 1.28429,1.28429 0,3.424773 z m 5.890609,6.798174 -1.267166,-1.28429 0,-3.424773 0.804822,-0.804821 0.462344,0.496592 0,5.017292 z m -0.239734,0.239734 -6.695431,0 1.267166,-1.28429 4.161099,0 1.267166,1.28429 z m -5.650 [...]
+ </g>
+ <g
+ id="text4769-3-3-0-9-9-1-9-4-6-0-3-0"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#008000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
+ <path
+ id="path4227"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:18.83625031px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#008000"
+ d="m 36.033065,103.95548 -0.462344,0.47947 -0.804822,-0.80482 0,-3.42477 1.267166,-1.284293 0,5.034413 z m -0.239734,-5.274147 -1.267166,1.284289 -4.161099,0 -1.267166,-1.284289 6.695431,0 z m -5.650875,4.948797 -0.804822,0.80482 -0.479468,-0.47947 0,-5.034413 1.28429,1.284293 0,3.42477 z m 5.890609,6.79817 -1.267166,-1.28429 0,-3.42477 0.804822,-0.80482 0.462344,0.49659 0,5.01729 z m -0.239734,0.23974 -6.695431,0 1.267166,-1.28429 4.161099,0 1.267166,1.28429 z m -5.650875,-1. [...]
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_0.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_0.svg
new file mode 100644
index 0000000..4d168fe
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_0.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_0.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="translate(-3.3580325e-5,2.3383546e-6)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="3.3694135e-005"
+ inkscape:transform-center-y="35.455306">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_100.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_100.svg
new file mode 100644
index 0000000..598d8ac
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_100.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_100.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.97814759,0.2079117,-0.2079117,0.97814759,17.241565,-13.95348)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="8.7643616"
+ inkscape:transform-center-y="34.655627">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1000.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1000.svg
new file mode 100644
index 0000000..990fa9b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1000.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1000.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.5,0.8660254,-0.8660254,-0.5,177.49066,47.615077)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="30.56512"
+ inkscape:transform-center-y="-17.227666">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1025.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1025.svg
new file mode 100644
index 0000000..b40b6a8
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1025.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1025.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.54463903,0.83867056,-0.83867056,-0.54463903,178.78576,53.016614)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="29.567617"
+ inkscape:transform-center-y="-18.848648">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1050.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1050.svg
new file mode 100644
index 0000000..47997af
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1050.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1050.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.58778525,0.80901699,-0.80901699,-0.58778525,179.79639,58.478528)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="28.486379"
+ inkscape:transform-center-y="-20.421353">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1075.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1075.svg
new file mode 100644
index 0000000..d0ed44d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1075.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1075.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.62932039,0.77714596,-0.77714596,-0.62932039,180.51978,63.985849)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="27.324364"
+ inkscape:transform-center-y="-21.935385">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1100.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1100.svg
new file mode 100644
index 0000000..d58d742
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1100.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1100.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.66913061,0.74314482,-0.74314482,-0.66913061,180.95394,69.523482)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="26.084761"
+ inkscape:transform-center-y="-23.386593">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1125.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1125.svg
new file mode 100644
index 0000000..81c65a3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1125.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1125.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.70710678,0.70710678,-0.70710678,-0.70710678,181.09769,75.076248)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="24.770956"
+ inkscape:transform-center-y="-24.770996">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1150.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1150.svg
new file mode 100644
index 0000000..e1ae54a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1150.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1150.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.74314482,0.66913061,-0.66913061,-0.74314482,180.95064,80.628927)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="23.386546"
+ inkscape:transform-center-y="-26.0848">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1175.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1175.svg
new file mode 100644
index 0000000..8be719c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1175.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1175.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.77714596,0.62932039,-0.62932039,-0.77714596,180.51318,86.166301)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="21.935338"
+ inkscape:transform-center-y="-27.324405">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1200.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1200.svg
new file mode 100644
index 0000000..bd6ff13
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1200.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1200.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.80901699,0.58778525,-0.58778525,-0.80901699,179.78652,91.673191)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="20.421301"
+ inkscape:transform-center-y="-28.486414">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1225.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1225.svg
new file mode 100644
index 0000000..5d78139
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1225.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1225.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.83867056,0.54463903,-0.54463903,-0.83867056,178.77265,97.134503)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="18.84859"
+ inkscape:transform-center-y="-29.567646">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_125.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_125.svg
new file mode 100644
index 0000000..4a1b44d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_125.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_125.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.96592582,0.25881905,-0.25881905,0.96592582,21.978525,-16.854355)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="9.8966225"
+ inkscape:transform-center-y="34.209401">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1250.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1250.svg
new file mode 100644
index 0000000..43afd57
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1250.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1250.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.8660254,0.5,-0.5,-0.8660254,177.47434,102.53527)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="17.227623"
+ inkscape:transform-center-y="-30.565139">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1275.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1275.svg
new file mode 100644
index 0000000..af80da7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1275.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1275.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.89100652,0.4539905,-0.4539905,-0.89100652,175.89516,107.86069)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="15.642348"
+ inkscape:transform-center-y="-31.476162">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1300.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1300.svg
new file mode 100644
index 0000000..499bde9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1300.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1300.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.91354545,0.40673664,-0.40673664,-0.91354545,174.03943,113.09616)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="14.014202"
+ inkscape:transform-center-y="-32.298228">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1325.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1325.svg
new file mode 100644
index 0000000..01302c1
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1325.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1325.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.93358042,0.35836795,-0.35836795,-0.93358042,171.91224,118.22733)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="12.347645"
+ inkscape:transform-center-y="-33.029086">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1350.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1350.svg
new file mode 100644
index 0000000..41b9568
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1350.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1350.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.95105651,0.309017,-0.309017,-0.95105651,169.51942,123.24014)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="10.999005"
+ inkscape:transform-center-y="-33.666729">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1375.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1375.svg
new file mode 100644
index 0000000..2b4c520
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1375.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1375.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.96592582,0.25881905,-0.25881905,-0.96592582,166.86753,128.12085)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="9.8965576"
+ inkscape:transform-center-y="-34.20941">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1400.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1400.svg
new file mode 100644
index 0000000..773836c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1400.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1400.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.97814759,0.2079117,-0.2079117,-0.97814759,163.96384,132.85608)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="8.764293"
+ inkscape:transform-center-y="-34.655637">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1425.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1425.svg
new file mode 100644
index 0000000..9a77b0a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1425.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1425.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.98768833,0.15643447,-0.15643447,-0.98768833,160.8163,137.43286)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="7.0325119"
+ inkscape:transform-center-y="-35.004172">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1450.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1450.svg
new file mode 100644
index 0000000..f829c2f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1450.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1450.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.99452189,0.10452847,-0.10452847,-0.99452189,157.43355,141.83864)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="4.6990596"
+ inkscape:transform-center-y="-35.25405">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1475.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1475.svg
new file mode 100644
index 0000000..45204bd
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1475.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1475.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.99862953,0.05233596,-0.05233596,-0.99862953,153.82485,146.06134)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="2.352732"
+ inkscape:transform-center-y="-35.404571">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_150.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_150.svg
new file mode 100644
index 0000000..8b05ccb
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_150.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_150.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.95105651,0.309017,-0.309017,0.95105651,26.860813,-19.503341)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="10.999069"
+ inkscape:transform-center-y="33.66672">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1500.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1500.svg
new file mode 100644
index 0000000..23ed0f3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1500.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1500.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1,0,0,-1,150.0001,150.08939)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-4.7393749e-005"
+ inkscape:transform-center-y="-35.455293">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1525.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1525.svg
new file mode 100644
index 0000000..8063be0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1525.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1525.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.99862953,-0.05233596,0.05233596,-0.99862953,145.96978,153.91174)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-2.3528274"
+ inkscape:transform-center-y="-35.404569">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1550.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1550.svg
new file mode 100644
index 0000000..bac31b1
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1550.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1550.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.99452189,-0.10452847,0.10452847,-0.99452189,141.74494,157.51793)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-4.6991612"
+ inkscape:transform-center-y="-35.254038">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1575.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1575.svg
new file mode 100644
index 0000000..6964b58
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1575.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1575.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.98768833,-0.15643447,0.15643447,-0.98768833,137.33715,160.89806)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-7.0326078"
+ inkscape:transform-center-y="-35.004154">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1600.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1600.svg
new file mode 100644
index 0000000..11c871a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1600.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1600.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.97814759,-0.2079117,0.2079117,-0.97814759,132.7585,164.04287)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-8.7643739"
+ inkscape:transform-center-y="-34.655617">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1625.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1625.svg
new file mode 100644
index 0000000..2cb0192
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1625.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1625.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.96592582,-0.25881905,0.25881905,-0.96592582,128.02154,166.94375)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-9.8966348"
+ inkscape:transform-center-y="-34.209386">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1650.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1650.svg
new file mode 100644
index 0000000..297c578
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1650.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1650.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.95105651,-0.309017,0.309017,-0.95105651,123.13925,169.59274)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-10.99908"
+ inkscape:transform-center-y="-33.666701">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1675.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1675.svg
new file mode 100644
index 0000000..353f3cc
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1675.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1675.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.93358042,-0.35836795,0.35836795,-0.93358042,118.12501,171.98258)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-12.347699"
+ inkscape:transform-center-y="-33.029053">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1700.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1700.svg
new file mode 100644
index 0000000..a4a5986
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1700.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1700.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.91354545,-0.40673664,0.40673664,-0.91354545,112.99257,174.10672)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-14.014254"
+ inkscape:transform-center-y="-32.298192">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1725.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1725.svg
new file mode 100644
index 0000000..4f64a5a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1725.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1725.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.89100652,-0.4539905,0.4539905,-0.89100652,107.756,175.95933)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-15.642402"
+ inkscape:transform-center-y="-31.476129">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_175.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_175.svg
new file mode 100644
index 0000000..d97b9bc
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_175.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_175.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.93358042,0.35836795,-0.35836795,0.93358042,31.875048,-21.893178)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="12.347693"
+ inkscape:transform-center-y="33.029075">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1750.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1750.svg
new file mode 100644
index 0000000..5512322
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1750.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1750.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.8660254,-0.5,0.5,-0.8660254,102.42965,177.53535)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-17.227677"
+ inkscape:transform-center-y="-30.565094">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1775.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1775.svg
new file mode 100644
index 0000000..ba4ef39
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1775.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1775.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.83867056,-0.54463903,0.54463903,-0.83867056,97.028112,178.83045)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-18.848658"
+ inkscape:transform-center-y="-29.567591">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1800.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1800.svg
new file mode 100644
index 0000000..57492d5
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1800.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1800.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.80901699,-0.58778525,0.58778525,-0.80901699,91.566196,179.84108)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-20.421361"
+ inkscape:transform-center-y="-28.486353">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1825.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1825.svg
new file mode 100644
index 0000000..7a9719b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1825.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1825.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.77714596,-0.62932039,0.62932039,-0.77714596,86.058873,180.56447)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-21.935391"
+ inkscape:transform-center-y="-27.324338">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1850.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1850.svg
new file mode 100644
index 0000000..b3bb135
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1850.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1850.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.74314482,-0.66913061,0.66913061,-0.74314482,80.521239,180.99863)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-23.386598"
+ inkscape:transform-center-y="-26.084735">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1875.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1875.svg
new file mode 100644
index 0000000..5eaa54f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1875.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1875.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.70710678,-0.70710678,0.70710678,-0.70710678,74.968472,181.14238)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-24.771"
+ inkscape:transform-center-y="-24.77093">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1900.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1900.svg
new file mode 100644
index 0000000..cf92c73
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1900.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1900.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.66913061,-0.74314482,0.74314482,-0.66913061,69.415791,180.99533)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-26.084802"
+ inkscape:transform-center-y="-23.38652">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1925.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1925.svg
new file mode 100644
index 0000000..36d59ca
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1925.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1925.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.62932039,-0.77714596,0.77714596,-0.62932039,63.878416,180.55787)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-27.324406"
+ inkscape:transform-center-y="-21.935312">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1950.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1950.svg
new file mode 100644
index 0000000..b7fd1e0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1950.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1950.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.58778525,-0.80901699,0.80901699,-0.58778525,58.371525,179.83121)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-28.486414"
+ inkscape:transform-center-y="-20.421275">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_1975.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_1975.svg
new file mode 100644
index 0000000..6b22a08
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_1975.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_1975.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.54463903,-0.83867056,0.83867056,-0.54463903,52.910211,178.81734)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-29.567644"
+ inkscape:transform-center-y="-18.848564">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_200.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_200.svg
new file mode 100644
index 0000000..70d1b6e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_200.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_200.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.91354545,0.40673664,-0.40673664,0.91354545,37.007485,-24.017315)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="14.014251"
+ inkscape:transform-center-y="32.298217">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2000.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2000.svg
new file mode 100644
index 0000000..ef13633
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2000.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2000.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,47.509444,177.51903)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-30.565137"
+ inkscape:transform-center-y="-17.227597">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2025.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2025.svg
new file mode 100644
index 0000000..8b4a838
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2025.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2025.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.4539905,-0.89100652,0.89100652,-0.4539905,42.184026,175.93985)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-31.476162"
+ inkscape:transform-center-y="-15.642322">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2050.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2050.svg
new file mode 100644
index 0000000..51f3d30
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2050.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2050.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.40673664,-0.91354545,0.91354545,-0.40673664,36.948555,174.08412)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-32.298227"
+ inkscape:transform-center-y="-14.014176">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2075.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2075.svg
new file mode 100644
index 0000000..0e6f35e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2075.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2075.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.35836795,-0.93358042,0.93358042,-0.35836795,31.81738,171.95693)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-33.02908"
+ inkscape:transform-center-y="-12.347619">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2100.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2100.svg
new file mode 100644
index 0000000..947578d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2100.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2100.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.309017,-0.95105651,0.95105651,-0.309017,26.804566,169.56411)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-33.666719"
+ inkscape:transform-center-y="-10.998979">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2125.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2125.svg
new file mode 100644
index 0000000..d929459
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2125.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2125.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.25881905,-0.96592582,0.96592582,-0.25881905,21.923852,166.91222)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-34.209396"
+ inkscape:transform-center-y="-9.8965316">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2150.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2150.svg
new file mode 100644
index 0000000..a34eb85
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2150.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2150.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.2079117,-0.97814759,0.97814759,-0.2079117,17.188616,164.00853)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-34.655617"
+ inkscape:transform-center-y="-8.764267">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2175.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2175.svg
new file mode 100644
index 0000000..f441cf8
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2175.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2175.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.15643447,-0.98768833,0.98768833,-0.15643447,12.611837,160.86099)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.004153"
+ inkscape:transform-center-y="-7.0324859">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2200.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2200.svg
new file mode 100644
index 0000000..c5b1607
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2200.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2200.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.10452847,-0.99452189,0.99452189,-0.10452847,8.2060599,157.47824)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.254034"
+ inkscape:transform-center-y="-4.6990336">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2225.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2225.svg
new file mode 100644
index 0000000..c321a2d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2225.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2225.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.05233596,-0.99862953,0.99862953,-0.05233596,3.9833602,153.86954)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.404555"
+ inkscape:transform-center-y="-2.352706">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_225.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_225.svg
new file mode 100644
index 0000000..868a25d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_225.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_225.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.89100652,0.4539905,-0.4539905,0.89100652,42.244057,-25.86993)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="15.642397"
+ inkscape:transform-center-y="31.476149">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2250.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2250.svg
new file mode 100644
index 0000000..3235836
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2250.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2250.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0,-1,1,0,-0.04468769,150.04479)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.455279"
+ inkscape:transform-center-y="7.3393749e-005">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2275.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2275.svg
new file mode 100644
index 0000000..d8687b5
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2275.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2275.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.05233596,-0.99862953,0.99862953,0.05233596,-3.8670433,146.01447)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.404549"
+ inkscape:transform-center-y="2.3528534">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2300.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2300.svg
new file mode 100644
index 0000000..7ca20b7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2300.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2300.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.10452847,-0.99452189,0.99452189,0.10452847,-7.4732299,141.78962)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.254022"
+ inkscape:transform-center-y="4.6991772">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2325.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2325.svg
new file mode 100644
index 0000000..b2b6dc5
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2325.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2325.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.15643447,-0.98768833,0.98768833,0.15643447,-10.853363,137.38183)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.004135"
+ inkscape:transform-center-y="7.0326238">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2350.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2350.svg
new file mode 100644
index 0000000..d35b6bc
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2350.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2350.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.2079117,-0.97814759,0.97814759,0.2079117,-13.998178,132.80318)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-34.655593"
+ inkscape:transform-center-y="8.7643899">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2375.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2375.svg
new file mode 100644
index 0000000..1be5d45
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2375.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2375.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.25881905,-0.96592582,0.96592582,0.25881905,-16.899055,128.06622)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-34.209365"
+ inkscape:transform-center-y="9.8966508">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2400.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2400.svg
new file mode 100644
index 0000000..073630d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2400.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2400.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.309017,-0.95105651,0.95105651,0.309017,-19.548043,123.18393)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-33.666682"
+ inkscape:transform-center-y="10.999096">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2425.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2425.svg
new file mode 100644
index 0000000..153d12d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2425.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2425.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.35836795,-0.93358042,0.93358042,0.35836795,-21.937881,118.16969)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-33.029036"
+ inkscape:transform-center-y="12.347715">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2450.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2450.svg
new file mode 100644
index 0000000..749a08d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2450.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2450.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.40673664,-0.91354545,0.91354545,0.40673664,-24.062019,113.03725)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-32.298177"
+ inkscape:transform-center-y="14.01427">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2475.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2475.svg
new file mode 100644
index 0000000..bb3fb91
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2475.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2475.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.4539905,-0.89100652,0.89100652,0.4539905,-25.914635,107.80068)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-31.476108"
+ inkscape:transform-center-y="15.642418">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_25.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_25.svg
new file mode 100644
index 0000000..4a28938
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_25.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_25.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.99862953,0.05233596,-0.05233596,0.99862953,4.0302867,-3.8223513)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="2.3528134"
+ inkscape:transform-center-y="35.404578">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_250.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_250.svg
new file mode 100644
index 0000000..cdcf41c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_250.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_250.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.8660254,0.5,-0.5,0.8660254,47.570411,-27.445945)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="17.227668"
+ inkscape:transform-center-y="30.565119">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2500.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2500.svg
new file mode 100644
index 0000000..877113c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2500.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2500.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.5,-0.8660254,0.8660254,0.5,-27.490651,102.47432)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-30.565077"
+ inkscape:transform-center-y="17.227683">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_2525.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_2525.svg
new file mode 100644
index 0000000..dd8fe5d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_2525.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_2525.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.54463903,-0.83867056,0.83867056,0.54463903,-28.785747,97.072781)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-29.567578"
+ inkscape:transform-center-y="18.848663">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_275.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_275.svg
new file mode 100644
index 0000000..eae0c73
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_275.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_275.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.83867056,0.54463903,-0.54463903,0.83867056,52.971948,-28.74104)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="18.84865"
+ inkscape:transform-center-y="29.567621">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_300.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_300.svg
new file mode 100644
index 0000000..904da77
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_300.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_300.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.80901699,0.58778525,-0.58778525,0.80901699,58.433862,-29.751666)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="20.421355"
+ inkscape:transform-center-y="28.486387">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_325.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_325.svg
new file mode 100644
index 0000000..1ebffbd
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_325.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_325.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.77714596,0.62932039,-0.62932039,0.77714596,63.941183,-30.475052)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="21.935387"
+ inkscape:transform-center-y="27.324376">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_350.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_350.svg
new file mode 100644
index 0000000..d821f9b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_350.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_350.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.74314482,0.66913061,-0.66913061,0.74314482,69.478815,-30.909216)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="23.386596"
+ inkscape:transform-center-y="26.084769">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_375.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_375.svg
new file mode 100644
index 0000000..8702d8f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_375.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_375.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,75.031581,-31.052968)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="24.770999"
+ inkscape:transform-center-y="24.770962">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_400.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_400.svg
new file mode 100644
index 0000000..af530ee
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_400.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_400.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.66913061,0.74314482,-0.74314482,0.66913061,80.58426,-30.905913)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="26.084803"
+ inkscape:transform-center-y="23.386557">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_425.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_425.svg
new file mode 100644
index 0000000..1a1a90a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_425.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_425.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.62932039,0.77714596,-0.77714596,0.62932039,86.121633,-30.468455)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="27.324409"
+ inkscape:transform-center-y="21.935347">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_450.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_450.svg
new file mode 100644
index 0000000..6a0eb9f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_450.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_450.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.58778525,0.80901699,-0.80901699,0.58778525,91.628522,-29.741793)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="28.486419"
+ inkscape:transform-center-y="20.421312">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_475.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_475.svg
new file mode 100644
index 0000000..389c10e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_475.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_475.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.54463903,0.83867056,-0.83867056,0.54463903,97.089834,-28.727918)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="29.567651"
+ inkscape:transform-center-y="18.848606">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_50.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_50.svg
new file mode 100644
index 0000000..c3fe331
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_50.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_50.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.99452189,0.10452847,-0.10452847,0.99452189,8.2551301,-7.4285358)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="4.6991438"
+ inkscape:transform-center-y="35.254053">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_500.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_500.svg
new file mode 100644
index 0000000..fd9e8f2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_500.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_500.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.5,0.8660254,-0.8660254,0.5,102.4906,-27.42961)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="30.565145"
+ inkscape:transform-center-y="17.227637">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_525.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_525.svg
new file mode 100644
index 0000000..1d8df0e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_525.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_525.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.4539905,0.89100652,-0.89100652,0.4539905,107.81602,-25.850427)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="31.476168"
+ inkscape:transform-center-y="15.642365">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_550.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_550.svg
new file mode 100644
index 0000000..78feb6c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_550.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_550.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.40673664,0.91354545,-0.91354545,0.40673664,113.05149,-23.994697)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="32.298234"
+ inkscape:transform-center-y="14.014219">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_575.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_575.svg
new file mode 100644
index 0000000..98a9008
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_575.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_575.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.35836795,0.93358042,-0.93358042,0.35836795,118.18266,-21.867507)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="33.029092"
+ inkscape:transform-center-y="12.347662">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_600.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_600.svg
new file mode 100644
index 0000000..e6d5a15
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_600.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_600.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.309017,0.95105651,-0.95105651,0.309017,123.19547,-19.474688)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="33.666735"
+ inkscape:transform-center-y="10.999021">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_625.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_625.svg
new file mode 100644
index 0000000..878ee6d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_625.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_625.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.25881905,0.96592582,-0.96592582,0.25881905,128.07618,-16.822798)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="34.209416"
+ inkscape:transform-center-y="9.8965736">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_650.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_650.svg
new file mode 100644
index 0000000..7b6977f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_650.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_650.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.2079117,0.97814759,-0.97814759,0.2079117,132.81141,-13.919106)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="34.655643"
+ inkscape:transform-center-y="8.764311">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_675.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_675.svg
new file mode 100644
index 0000000..e082a48
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_675.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_675.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.15643447,0.98768833,-0.98768833,0.15643447,137.38819,-10.77157)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.004178"
+ inkscape:transform-center-y="7.0325259">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_700.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_700.svg
new file mode 100644
index 0000000..20bad7e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_700.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_700.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.10452847,0.99452189,-0.99452189,0.10452847,141.79397,-7.3888176)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.254056"
+ inkscape:transform-center-y="4.699076">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_725.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_725.svg
new file mode 100644
index 0000000..ee2ff51
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_725.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_725.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.05233596,0.99862953,-0.99862953,0.05233596,146.01667,-3.7801205)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.404577"
+ inkscape:transform-center-y="2.3527455">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_75.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_75.svg
new file mode 100644
index 0000000..17d65c6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_75.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_75.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.98768833,0.15643447,-0.15643447,0.98768833,12.662917,-10.808667)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="7.0325935"
+ inkscape:transform-center-y="35.004167">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_750.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_750.svg
new file mode 100644
index 0000000..99307c6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_750.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_750.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0,1,-1,0,150.04472,0.04463005)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.455299"
+ inkscape:transform-center-y="-3.3343749e-005">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_775.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_775.svg
new file mode 100644
index 0000000..345bf28
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_775.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_775.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.05233596,0.99862953,-0.99862953,-0.05233596,153.86707,4.0749507)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.404575"
+ inkscape:transform-center-y="-2.3528127">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_800.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_800.svg
new file mode 100644
index 0000000..8beeb3d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_800.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_800.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.10452847,0.99452189,-0.99452189,-0.10452847,157.47325,8.2997943)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.254054"
+ inkscape:transform-center-y="-4.6991429">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_825.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_825.svg
new file mode 100644
index 0000000..b62c246
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_825.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_825.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.15643447,0.98768833,-0.98768833,-0.15643447,160.85338,12.707581)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.00417"
+ inkscape:transform-center-y="-7.0325928">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_850.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_850.svg
new file mode 100644
index 0000000..b1e9d70
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_850.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_850.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.2079117,0.97814759,-0.97814759,-0.2079117,163.99819,17.286229)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="34.655633"
+ inkscape:transform-center-y="-8.7643609">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_875.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_875.svg
new file mode 100644
index 0000000..1b083ec
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_875.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_875.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.25881905,0.96592582,-0.96592582,-0.25881905,166.89907,22.023189)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="34.209402"
+ inkscape:transform-center-y="-9.8966218">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_900.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_900.svg
new file mode 100644
index 0000000..a3665da
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_900.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_900.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.309017,0.95105651,-0.95105651,-0.309017,169.54806,26.905477)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="33.666717"
+ inkscape:transform-center-y="-10.999069">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_925.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_925.svg
new file mode 100644
index 0000000..98e4e66
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_925.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_925.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.35836795,0.93358042,-0.93358042,-0.35836795,171.9379,31.919712)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="33.029069"
+ inkscape:transform-center-y="-12.347693">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_950.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_950.svg
new file mode 100644
index 0000000..6f7de06
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_950.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_950.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.40673664,0.91354545,-0.91354545,-0.40673664,174.06204,37.05215)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="32.298208"
+ inkscape:transform-center-y="-14.01425">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/load_975.svg b/skins/blackhole/themes/default/skinparts/tachohands/load_975.svg
new file mode 100644
index 0000000..76430e7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/load_975.svg
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="load_975.svg">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4885"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4887"
+ style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#ff0000;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4587"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4589"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4236"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotL"
+ style="overflow:visible"
+ inkscape:isstock="true">
+ <path
+ id="path4297"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.8) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="marker4506"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4239"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4257"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;"
+ inkscape:isstock="true">
+ <path
+ id="path4157"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;stroke-opacity:1;fill:#aa0000;fill-opacity:1"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="61.135797"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.4539905,0.89100652,-0.89100652,-0.4539905,175.91465,42.288723)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="31.476145"
+ inkscape:transform-center-y="-15.642395">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_0.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_0.svg
new file mode 100644
index 0000000..6041ba0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_0.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_0.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="translate(-3.3231822e-5,3.1722513e-6)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="3.307229e-005"
+ inkscape:transform-center-y="35.455306">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_1.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_1.svg
new file mode 100644
index 0000000..0e59a32
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_1.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_1.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.99862953,0.05233596,-0.05233596,0.99862953,4.0302871,-3.8223504)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="2.3528127"
+ inkscape:transform-center-y="35.404578">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_10.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_10.svg
new file mode 100644
index 0000000..682d505
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_10.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_10.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.8660254,0.5,-0.5,0.8660254,47.570411,-27.445944)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="17.227668"
+ inkscape:transform-center-y="30.56512">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_100.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_100.svg
new file mode 100644
index 0000000..e027920
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_100.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_100.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.5,-0.8660254,0.8660254,0.5,-27.490651,102.47432)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-30.565076"
+ inkscape:transform-center-y="17.227683">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_11.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_11.svg
new file mode 100644
index 0000000..b6406b6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_11.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_11.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.83867056,0.54463903,-0.54463903,0.83867056,52.971948,-28.741039)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="18.84865"
+ inkscape:transform-center-y="29.567622">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_12.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_12.svg
new file mode 100644
index 0000000..ef49e35
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_12.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_12.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.80901699,0.58778525,-0.58778525,0.80901699,58.433862,-29.751665)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="20.421355"
+ inkscape:transform-center-y="28.486388">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_13.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_13.svg
new file mode 100644
index 0000000..2ba26c2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_13.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_13.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.77714596,0.62932039,-0.62932039,0.77714596,63.941183,-30.475051)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="21.935387"
+ inkscape:transform-center-y="27.324377">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_14.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_14.svg
new file mode 100644
index 0000000..2b0a14e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_14.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_14.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.74314482,0.66913061,-0.66913061,0.74314482,69.478815,-30.909215)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="23.386596"
+ inkscape:transform-center-y="26.08477">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_15.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_15.svg
new file mode 100644
index 0000000..a94b2f7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_15.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_15.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,75.03158,-31.052967)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="24.771"
+ inkscape:transform-center-y="24.770963">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_16.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_16.svg
new file mode 100644
index 0000000..85b0dba
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_16.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_16.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.66913061,0.74314482,-0.74314482,0.66913061,80.584259,-30.905912)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="26.084804"
+ inkscape:transform-center-y="23.386558">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_17.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_17.svg
new file mode 100644
index 0000000..1b817de
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_17.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_17.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.62932039,0.77714596,-0.77714596,0.62932039,86.121632,-30.468454)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="27.32441"
+ inkscape:transform-center-y="21.935348">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_18.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_18.svg
new file mode 100644
index 0000000..9c39b42
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_18.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_18.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.58778525,0.80901699,-0.80901699,0.58778525,91.628521,-29.741792)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="28.48642"
+ inkscape:transform-center-y="20.421313">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_19.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_19.svg
new file mode 100644
index 0000000..3937818
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_19.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_19.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.54463903,0.83867056,-0.83867056,0.54463903,97.089833,-28.727918)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="29.567652"
+ inkscape:transform-center-y="18.848606">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_2.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_2.svg
new file mode 100644
index 0000000..7257737
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_2.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.99452189,0.10452847,-0.10452847,0.99452189,8.2551305,-7.4285349)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="4.6991431"
+ inkscape:transform-center-y="35.254053">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_20.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_20.svg
new file mode 100644
index 0000000..6576b8f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_20.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_20.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.5,0.8660254,-0.8660254,0.5,102.4906,-27.42961)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="30.565145"
+ inkscape:transform-center-y="17.227637">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_21.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_21.svg
new file mode 100644
index 0000000..cb903b6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_21.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_21.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.4539905,0.89100652,-0.89100652,0.4539905,107.81602,-25.850427)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="31.476168"
+ inkscape:transform-center-y="15.642365">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_22.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_22.svg
new file mode 100644
index 0000000..eba9327
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_22.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_22.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.40673664,0.91354545,-0.91354545,0.40673664,113.05149,-23.994697)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="32.298234"
+ inkscape:transform-center-y="14.014219">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_23.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_23.svg
new file mode 100644
index 0000000..a6a2038
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_23.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_23.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.35836795,0.93358042,-0.93358042,0.35836795,118.18266,-21.867507)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="33.029092"
+ inkscape:transform-center-y="12.347662">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_24.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_24.svg
new file mode 100644
index 0000000..2b9fe5b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_24.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_24.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.309017,0.95105651,-0.95105651,0.309017,123.19547,-19.474688)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="33.666735"
+ inkscape:transform-center-y="10.999021">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_25.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_25.svg
new file mode 100644
index 0000000..3741900
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_25.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_25.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.25881905,0.96592582,-0.96592582,0.25881905,128.07618,-16.822798)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="34.209416"
+ inkscape:transform-center-y="9.8965736">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_26.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_26.svg
new file mode 100644
index 0000000..c849311
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_26.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_26.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.2079117,0.97814759,-0.97814759,0.2079117,132.81141,-13.919106)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="34.655643"
+ inkscape:transform-center-y="8.764311">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_27.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_27.svg
new file mode 100644
index 0000000..9e0dea6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_27.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_27.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.15643447,0.98768833,-0.98768833,0.15643447,137.38819,-10.77157)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.004178"
+ inkscape:transform-center-y="7.0325259">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_28.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_28.svg
new file mode 100644
index 0000000..e558758
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_28.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_28.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.10452847,0.99452189,-0.99452189,0.10452847,141.79397,-7.3888176)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.254056"
+ inkscape:transform-center-y="4.699076">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_29.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_29.svg
new file mode 100644
index 0000000..acf6df6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_29.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_29.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.05233596,0.99862953,-0.99862953,0.05233596,146.01667,-3.7801205)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.404577"
+ inkscape:transform-center-y="2.3527455">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_3.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_3.svg
new file mode 100644
index 0000000..f50d732
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_3.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_3.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.98768833,0.15643447,-0.15643447,0.98768833,12.662917,-10.808666)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="7.0325932"
+ inkscape:transform-center-y="35.004168">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_30.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_30.svg
new file mode 100644
index 0000000..f8a67f6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_30.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_30.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0,1,-1,0,150.04472,0.04463005)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.455299"
+ inkscape:transform-center-y="-3.3343749e-005">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_31.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_31.svg
new file mode 100644
index 0000000..a549aac
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_31.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_31.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.05233596,0.99862953,-0.99862953,-0.05233596,153.86707,4.0749507)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.404575"
+ inkscape:transform-center-y="-2.3528127">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_32.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_32.svg
new file mode 100644
index 0000000..57f681b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_32.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_32.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.10452847,0.99452189,-0.99452189,-0.10452847,157.47325,8.2997943)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.254054"
+ inkscape:transform-center-y="-4.6991429">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_33.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_33.svg
new file mode 100644
index 0000000..ce84f07
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_33.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_33.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.15643447,0.98768833,-0.98768833,-0.15643447,160.85338,12.707581)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="35.00417"
+ inkscape:transform-center-y="-7.0325928">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_34.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_34.svg
new file mode 100644
index 0000000..e915bef
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_34.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_34.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.2079117,0.97814759,-0.97814759,-0.2079117,163.99819,17.286229)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="34.655633"
+ inkscape:transform-center-y="-8.7643609">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_35.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_35.svg
new file mode 100644
index 0000000..97722f3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_35.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_35.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.25881905,0.96592582,-0.96592582,-0.25881905,166.89907,22.023189)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="34.209402"
+ inkscape:transform-center-y="-9.8966218">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_36.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_36.svg
new file mode 100644
index 0000000..1e44e9d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_36.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_36.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.309017,0.95105651,-0.95105651,-0.309017,169.54806,26.905477)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="33.666717"
+ inkscape:transform-center-y="-10.999069">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_37.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_37.svg
new file mode 100644
index 0000000..72c295e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_37.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_37.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.35836795,0.93358042,-0.93358042,-0.35836795,171.9379,31.919712)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="33.029069"
+ inkscape:transform-center-y="-12.347693">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_38.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_38.svg
new file mode 100644
index 0000000..c2236ce
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_38.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_38.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.40673664,0.91354545,-0.91354545,-0.40673664,174.06204,37.05215)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="32.298208"
+ inkscape:transform-center-y="-14.01425">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_39.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_39.svg
new file mode 100644
index 0000000..2c9ceab
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_39.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_39.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.4539905,0.89100652,-0.89100652,-0.4539905,175.91465,42.288723)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="31.476145"
+ inkscape:transform-center-y="-15.642395">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_4.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_4.svg
new file mode 100644
index 0000000..6a5ff90
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_4.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_4.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.97814759,0.2079117,-0.2079117,0.97814759,17.241565,-13.953479)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="8.7643613"
+ inkscape:transform-center-y="34.655628">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_40.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_40.svg
new file mode 100644
index 0000000..6b8b94b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_40.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_40.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.5,0.8660254,-0.8660254,-0.5,177.49066,47.615077)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="30.56512"
+ inkscape:transform-center-y="-17.227666">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_41.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_41.svg
new file mode 100644
index 0000000..93d438c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_41.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_41.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.54463903,0.83867056,-0.83867056,-0.54463903,178.78576,53.016614)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="29.567617"
+ inkscape:transform-center-y="-18.848648">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_42.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_42.svg
new file mode 100644
index 0000000..821d228
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_42.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_42.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.58778525,0.80901699,-0.80901699,-0.58778525,179.79639,58.478528)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="28.486379"
+ inkscape:transform-center-y="-20.421353">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_43.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_43.svg
new file mode 100644
index 0000000..c343676
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_43.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_43.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.62932039,0.77714596,-0.77714596,-0.62932039,180.51978,63.985849)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="27.324364"
+ inkscape:transform-center-y="-21.935385">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_44.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_44.svg
new file mode 100644
index 0000000..2fe2106
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_44.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_44.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.66913061,0.74314482,-0.74314482,-0.66913061,180.95394,69.523482)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="26.084761"
+ inkscape:transform-center-y="-23.386593">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_45.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_45.svg
new file mode 100644
index 0000000..f0709b2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_45.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_45.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.70710678,0.70710678,-0.70710678,-0.70710678,181.09769,75.076248)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="24.770956"
+ inkscape:transform-center-y="-24.770996">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_46.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_46.svg
new file mode 100644
index 0000000..2ea8cb7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_46.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_46.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.74314482,0.66913061,-0.66913061,-0.74314482,180.95064,80.628927)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="23.386546"
+ inkscape:transform-center-y="-26.0848">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_47.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_47.svg
new file mode 100644
index 0000000..8c3dc2a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_47.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_47.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.77714596,0.62932039,-0.62932039,-0.77714596,180.51318,86.166301)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="21.935338"
+ inkscape:transform-center-y="-27.324405">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_48.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_48.svg
new file mode 100644
index 0000000..d664d55
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_48.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_48.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.80901699,0.58778525,-0.58778525,-0.80901699,179.78652,91.673191)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="20.421301"
+ inkscape:transform-center-y="-28.486414">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_49.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_49.svg
new file mode 100644
index 0000000..b5471b4
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_49.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_49.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.83867056,0.54463903,-0.54463903,-0.83867056,178.77265,97.134503)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="18.84859"
+ inkscape:transform-center-y="-29.567646">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_5.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_5.svg
new file mode 100644
index 0000000..66d774f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_5.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_5.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.96592582,0.25881905,-0.25881905,0.96592582,21.978525,-16.854354)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="9.8966222"
+ inkscape:transform-center-y="34.209402">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_50.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_50.svg
new file mode 100644
index 0000000..a6012e8
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_50.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_50.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.8660254,0.5,-0.5,-0.8660254,177.47434,102.53527)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="17.227623"
+ inkscape:transform-center-y="-30.565139">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_51.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_51.svg
new file mode 100644
index 0000000..63a3074
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_51.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_51.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.89100652,0.4539905,-0.4539905,-0.89100652,175.89516,107.86069)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="15.642348"
+ inkscape:transform-center-y="-31.476162">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_52.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_52.svg
new file mode 100644
index 0000000..fe98f74
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_52.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_52.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.91354545,0.40673664,-0.40673664,-0.91354545,174.03943,113.09616)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="14.014202"
+ inkscape:transform-center-y="-32.298228">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_53.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_53.svg
new file mode 100644
index 0000000..e3a0fc4
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_53.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_53.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.93358042,0.35836795,-0.35836795,-0.93358042,171.91224,118.22733)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="12.347645"
+ inkscape:transform-center-y="-33.029086">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_54.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_54.svg
new file mode 100644
index 0000000..8d9f119
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_54.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_54.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.95105651,0.309017,-0.309017,-0.95105651,169.51942,123.24014)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="10.999005"
+ inkscape:transform-center-y="-33.666729">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_55.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_55.svg
new file mode 100644
index 0000000..377a6b3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_55.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_55.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.96592582,0.25881905,-0.25881905,-0.96592582,166.86753,128.12085)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="9.8965576"
+ inkscape:transform-center-y="-34.20941">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_56.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_56.svg
new file mode 100644
index 0000000..51aa033
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_56.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_56.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.97814759,0.2079117,-0.2079117,-0.97814759,163.96384,132.85608)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="8.764293"
+ inkscape:transform-center-y="-34.655637">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_57.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_57.svg
new file mode 100644
index 0000000..c1c706c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_57.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_57.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.98768833,0.15643447,-0.15643447,-0.98768833,160.8163,137.43286)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="7.0325119"
+ inkscape:transform-center-y="-35.004172">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_58.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_58.svg
new file mode 100644
index 0000000..4539158
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_58.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_58.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.99452189,0.10452847,-0.10452847,-0.99452189,157.43355,141.83864)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="4.6990596"
+ inkscape:transform-center-y="-35.25405">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_59.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_59.svg
new file mode 100644
index 0000000..c3533ac
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_59.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_59.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.99862953,0.05233596,-0.05233596,-0.99862953,153.82485,146.06134)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="2.352732"
+ inkscape:transform-center-y="-35.404571">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_6.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_6.svg
new file mode 100644
index 0000000..358b3b2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_6.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_6.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.95105651,0.309017,-0.309017,0.95105651,26.860813,-19.50334)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="10.999069"
+ inkscape:transform-center-y="33.666721">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_60.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_60.svg
new file mode 100644
index 0000000..db3aaa1
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_60.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_60.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1,0,0,-1,150.0001,150.08939)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-4.7393749e-005"
+ inkscape:transform-center-y="-35.455293">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_61.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_61.svg
new file mode 100644
index 0000000..4c09b06
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_61.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_61.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.99862953,-0.05233596,0.05233596,-0.99862953,145.96978,153.91174)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-2.3528274"
+ inkscape:transform-center-y="-35.404569">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_62.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_62.svg
new file mode 100644
index 0000000..e7cec7b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_62.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_62.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.99452189,-0.10452847,0.10452847,-0.99452189,141.74494,157.51793)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-4.6991612"
+ inkscape:transform-center-y="-35.254038">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_63.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_63.svg
new file mode 100644
index 0000000..fdb3829
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_63.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_63.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.98768833,-0.15643447,0.15643447,-0.98768833,137.33715,160.89806)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-7.0326078"
+ inkscape:transform-center-y="-35.004154">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_64.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_64.svg
new file mode 100644
index 0000000..521e82d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_64.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_64.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.97814759,-0.2079117,0.2079117,-0.97814759,132.7585,164.04287)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-8.7643739"
+ inkscape:transform-center-y="-34.655617">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_65.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_65.svg
new file mode 100644
index 0000000..3b91b2d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_65.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_65.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.96592582,-0.25881905,0.25881905,-0.96592582,128.02154,166.94375)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-9.8966348"
+ inkscape:transform-center-y="-34.209386">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_66.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_66.svg
new file mode 100644
index 0000000..cb28310
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_66.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_66.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.95105651,-0.309017,0.309017,-0.95105651,123.13925,169.59274)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-10.99908"
+ inkscape:transform-center-y="-33.666701">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_67.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_67.svg
new file mode 100644
index 0000000..aaaabdc
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_67.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_67.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.93358042,-0.35836795,0.35836795,-0.93358042,118.12501,171.98258)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-12.347699"
+ inkscape:transform-center-y="-33.029053">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_68.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_68.svg
new file mode 100644
index 0000000..ca1c93d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_68.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_68.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.91354545,-0.40673664,0.40673664,-0.91354545,112.99257,174.10672)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-14.014254"
+ inkscape:transform-center-y="-32.298192">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_69.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_69.svg
new file mode 100644
index 0000000..74f4479
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_69.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_69.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.89100652,-0.4539905,0.4539905,-0.89100652,107.756,175.95933)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-15.642402"
+ inkscape:transform-center-y="-31.476129">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_7.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_7.svg
new file mode 100644
index 0000000..6a2733a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_7.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_7.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.93358042,0.35836795,-0.35836795,0.93358042,31.875048,-21.893177)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="12.347693"
+ inkscape:transform-center-y="33.029076">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_70.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_70.svg
new file mode 100644
index 0000000..c6aa3c9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_70.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_70.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.8660254,-0.5,0.5,-0.8660254,102.42965,177.53535)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-17.227677"
+ inkscape:transform-center-y="-30.565094">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_71.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_71.svg
new file mode 100644
index 0000000..0b49abe
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_71.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_71.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.83867056,-0.54463903,0.54463903,-0.83867056,97.028112,178.83045)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-18.848658"
+ inkscape:transform-center-y="-29.567591">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_72.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_72.svg
new file mode 100644
index 0000000..a57dc7b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_72.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_72.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.80901699,-0.58778525,0.58778525,-0.80901699,91.566196,179.84108)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-20.421361"
+ inkscape:transform-center-y="-28.486353">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_73.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_73.svg
new file mode 100644
index 0000000..56dc382
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_73.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_73.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.77714596,-0.62932039,0.62932039,-0.77714596,86.058873,180.56447)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-21.935391"
+ inkscape:transform-center-y="-27.324338">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_74.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_74.svg
new file mode 100644
index 0000000..f562a38
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_74.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_74.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.74314482,-0.66913061,0.66913061,-0.74314482,80.521239,180.99863)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-23.386598"
+ inkscape:transform-center-y="-26.084735">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_75.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_75.svg
new file mode 100644
index 0000000..a7b1452
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_75.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_75.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.70710678,-0.70710678,0.70710678,-0.70710678,74.968472,181.14238)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-24.771"
+ inkscape:transform-center-y="-24.77093">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_76.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_76.svg
new file mode 100644
index 0000000..f31de9e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_76.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_76.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.66913061,-0.74314482,0.74314482,-0.66913061,69.415791,180.99533)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-26.084802"
+ inkscape:transform-center-y="-23.38652">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_77.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_77.svg
new file mode 100644
index 0000000..e2afdf2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_77.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_77.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.62932039,-0.77714596,0.77714596,-0.62932039,63.878416,180.55787)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-27.324406"
+ inkscape:transform-center-y="-21.935312">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_78.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_78.svg
new file mode 100644
index 0000000..631d4de
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_78.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_78.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.58778525,-0.80901699,0.80901699,-0.58778525,58.371525,179.83121)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-28.486414"
+ inkscape:transform-center-y="-20.421275">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_79.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_79.svg
new file mode 100644
index 0000000..49e4b90
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_79.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_79.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.54463903,-0.83867056,0.83867056,-0.54463903,52.910211,178.81734)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-29.567644"
+ inkscape:transform-center-y="-18.848564">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_8.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_8.svg
new file mode 100644
index 0000000..004fc51
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_8.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_8.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.91354545,0.40673664,-0.40673664,0.91354545,37.007485,-24.017314)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="14.014251"
+ inkscape:transform-center-y="32.298218">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_80.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_80.svg
new file mode 100644
index 0000000..6f23b2f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_80.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_80.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,47.509444,177.51903)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-30.565137"
+ inkscape:transform-center-y="-17.227597">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_81.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_81.svg
new file mode 100644
index 0000000..827bace
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_81.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_81.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.4539905,-0.89100652,0.89100652,-0.4539905,42.184026,175.93985)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-31.476162"
+ inkscape:transform-center-y="-15.642322">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_82.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_82.svg
new file mode 100644
index 0000000..71823e0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_82.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_82.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.40673664,-0.91354545,0.91354545,-0.40673664,36.948555,174.08412)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-32.298227"
+ inkscape:transform-center-y="-14.014176">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_83.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_83.svg
new file mode 100644
index 0000000..ff20447
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_83.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_83.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.35836795,-0.93358042,0.93358042,-0.35836795,31.81738,171.95693)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-33.02908"
+ inkscape:transform-center-y="-12.347619">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_84.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_84.svg
new file mode 100644
index 0000000..8dd67fa
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_84.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_84.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.309017,-0.95105651,0.95105651,-0.309017,26.804566,169.56411)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-33.666719"
+ inkscape:transform-center-y="-10.998979">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_85.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_85.svg
new file mode 100644
index 0000000..7a62631
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_85.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_85.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.25881905,-0.96592582,0.96592582,-0.25881905,21.923852,166.91222)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-34.209396"
+ inkscape:transform-center-y="-9.8965316">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_86.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_86.svg
new file mode 100644
index 0000000..6b73f31
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_86.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_86.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.2079117,-0.97814759,0.97814759,-0.2079117,17.188616,164.00853)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-34.655617"
+ inkscape:transform-center-y="-8.764267">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_87.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_87.svg
new file mode 100644
index 0000000..eeb0514
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_87.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_87.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.15643447,-0.98768833,0.98768833,-0.15643447,12.611837,160.86099)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.004153"
+ inkscape:transform-center-y="-7.0324859">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_88.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_88.svg
new file mode 100644
index 0000000..7fc1376
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_88.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_88.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.10452847,-0.99452189,0.99452189,-0.10452847,8.2060599,157.47824)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.254034"
+ inkscape:transform-center-y="-4.6990336">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_89.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_89.svg
new file mode 100644
index 0000000..5ad1e96
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_89.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_89.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.05233596,-0.99862953,0.99862953,-0.05233596,3.9833602,153.86954)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.404555"
+ inkscape:transform-center-y="-2.352706">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_9.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_9.svg
new file mode 100644
index 0000000..d118420
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_9.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_9.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.89100652,0.4539905,-0.4539905,0.89100652,42.244057,-25.869929)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="15.642397"
+ inkscape:transform-center-y="31.47615">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_90.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_90.svg
new file mode 100644
index 0000000..80ec2c6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_90.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_90.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0,-1,1,0,-0.04468769,150.04479)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.455279"
+ inkscape:transform-center-y="7.3393749e-005">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_91.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_91.svg
new file mode 100644
index 0000000..dc3edf9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_91.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_91.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.05233596,-0.99862953,0.99862953,0.05233596,-3.8670433,146.01447)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.404549"
+ inkscape:transform-center-y="2.3528534">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_92.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_92.svg
new file mode 100644
index 0000000..3dbe027
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_92.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_92.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.10452847,-0.99452189,0.99452189,0.10452847,-7.4732298,141.78962)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.254022"
+ inkscape:transform-center-y="4.6991772">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_93.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_93.svg
new file mode 100644
index 0000000..76076ac
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_93.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_93.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.15643447,-0.98768833,0.98768833,0.15643447,-10.853363,137.38183)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-35.004134"
+ inkscape:transform-center-y="7.0326238">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_94.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_94.svg
new file mode 100644
index 0000000..be16f08
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_94.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_94.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.2079117,-0.97814759,0.97814759,0.2079117,-13.998178,132.80318)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-34.655592"
+ inkscape:transform-center-y="8.7643899">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_95.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_95.svg
new file mode 100644
index 0000000..e86fb22
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_95.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_95.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.25881905,-0.96592582,0.96592582,0.25881905,-16.899055,128.06622)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-34.209364"
+ inkscape:transform-center-y="9.8966508">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_96.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_96.svg
new file mode 100644
index 0000000..29ae525
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_96.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_96.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.309017,-0.95105651,0.95105651,0.309017,-19.548043,123.18393)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-33.666681"
+ inkscape:transform-center-y="10.999096">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_97.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_97.svg
new file mode 100644
index 0000000..f95f36e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_97.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_97.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.35836795,-0.93358042,0.93358042,0.35836795,-21.937881,118.16969)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-33.029035"
+ inkscape:transform-center-y="12.347715">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_98.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_98.svg
new file mode 100644
index 0000000..dfc8c02
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_98.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_98.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.40673664,-0.91354545,0.91354545,0.40673664,-24.062019,113.03725)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-32.298176"
+ inkscape:transform-center-y="14.01427">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/perc_99.svg b/skins/blackhole/themes/default/skinparts/tachohands/perc_99.svg
new file mode 100644
index 0000000..d1e3a3c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/perc_99.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="perc_99.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.2556286"
+ inkscape:cx="23.300481"
+ inkscape:cy="72.768692"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.4539905,-0.89100652,0.89100652,0.4539905,-25.914635,107.80068)"
+ style="opacity:0.8"
+ inkscape:transform-center-x="-31.476107"
+ inkscape:transform-center-y="15.642418">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="89.047386"
+ y="134.77823"
+ id="text6300"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6302"
+ x="89.047386"
+ y="134.77823"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:30px;line-height:125%;font-family:DS-Digital;-inkscape-font-specification:'DS-Digital, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#ffffff">%</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_0.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_0.svg
new file mode 100644
index 0000000..583b664
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_0.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_0.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.51322343,0.88892912,-0.8612809,0.49726076,101.15454,-28.938284)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="30.389496"
+ inkscape:transform-center-y="17.13327">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_1.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_1.svg
new file mode 100644
index 0000000..319af2f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_1.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_1.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.46599712,0.91457091,-0.88612516,0.45150332,106.56095,-27.427568)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="31.29694"
+ inkscape:transform-center-y="15.556682">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_10.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_10.svg
new file mode 100644
index 0000000..a0eea0a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_10.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_10.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-3.4154506e-8,1.026447,-0.99452152,-1.5373359e-8,149.64533,-1.9353541)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="35.261071"
+ inkscape:transform-center-y="-1.9831535e-005">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_11.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_11.svg
new file mode 100644
index 0000000..4f8d1ca
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_11.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_11.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.05372012,1.0250403,-0.99315856,-0.05204925,153.57206,2.0761677)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="35.210504"
+ inkscape:transform-center-y="-2.3399082">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_12.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_12.svg
new file mode 100644
index 0000000..d97b402
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_12.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_12.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.10729296,1.020824,-0.98907342,-0.10395582,157.28346,6.2877009)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="35.060511"
+ inkscape:transform-center-y="-4.6733855">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_13.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_13.svg
new file mode 100644
index 0000000..128a04b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_13.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_13.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.16057172,1.0138097,-0.9822773,-0.15557746,160.76936,10.687702)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="34.811531"
+ inkscape:transform-center-y="-6.9940534">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_14.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_14.svg
new file mode 100644
index 0000000..0118cbb
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_14.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_14.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.21341036,1.0040166,-0.97278883,-0.20677267,164.0202,15.264111)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="34.464275"
+ inkscape:transform-center-y="-8.8419033">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_15.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_15.svg
new file mode 100644
index 0000000..f999097
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_15.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_15.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.26566406,0.99147157,-0.96063401,-0.25740113,167.02708,20.004384)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="34.019705"
+ inkscape:transform-center-y="-9.9667542">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_16.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_16.svg
new file mode 100644
index 0000000..29d77b1
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_16.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_16.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.31718959,0.97620901,-0.94584616,-0.30732407,169.78175,24.895529)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="33.479062"
+ inkscape:transform-center-y="-11.061676">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_17.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_17.svg
new file mode 100644
index 0000000..4e9ba30
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_17.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_17.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.36784572,0.95827073,-0.92846581,-0.35640466,172.27666,29.924139)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="32.84384"
+ inkscape:transform-center-y="-12.280037">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_18.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_18.svg
new file mode 100644
index 0000000..e45c278
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_18.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_18.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.41749362,0.9377059,-0.9085406,-0.40450837,174.50497,35.07643)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="32.115793"
+ inkscape:transform-center-y="-13.937465">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_19.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_19.svg
new file mode 100644
index 0000000..5ed9014
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_19.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_19.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.46599719,0.91457088,-0.88612514,-0.45150335,176.46058,40.338281)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="31.296915"
+ inkscape:transform-center-y="-15.556691">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_2.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_2.svg
new file mode 100644
index 0000000..8951e17
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_2.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.41749354,0.93770593,-0.90854061,0.40450834,111.88088,-25.635972)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="32.115817"
+ inkscape:transform-center-y="13.937456">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_20.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_20.svg
new file mode 100644
index 0000000..89fce58
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_20.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_20.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.5132235,0.88892908,-0.86128088,-0.49726079,178.13813,45.69527)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="30.38946"
+ inkscape:transform-center-y="-17.133277">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_21.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_21.svg
new file mode 100644
index 0000000..1fbed8a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_21.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_21.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.5590431,0.86085079,-0.83407591,-0.54165527,179.53301,51.132713)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="29.395935"
+ inkscape:transform-center-y="-18.722744">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_22.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_22.svg
new file mode 100644
index 0000000..3ca7200
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_22.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_22.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.6033304,0.83041297,-0.80458479,-0.58456511,180.64141,56.635707)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="28.319057"
+ inkscape:transform-center-y="-20.288373">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_23.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_23.svg
new file mode 100644
index 0000000..521f929
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_23.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_23.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.64596401,0.79769904,-0.77288836,-0.6258727,181.46028,62.189168)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="27.161799"
+ inkscape:transform-center-y="-21.795711">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_24.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_24.svg
new file mode 100644
index 0000000..d453f59
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_24.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_24.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.68682708,0.76279868,-0.7390735,-0.66546481,181.98739,67.777875)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="25.927331"
+ inkscape:transform-center-y="-23.240607">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_25.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_25.svg
new file mode 100644
index 0000000..a0c6803
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_25.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_25.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.72580761,0.72580754,-0.70323289,-0.70323293,182.22128,73.386509)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="24.619062"
+ inkscape:transform-center-y="-24.619088">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_26.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_26.svg
new file mode 100644
index 0000000..d03f1a0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_26.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_26.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.76279875,0.68682701,-0.66546477,-0.73907354,182.16132,78.999698)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="23.240581"
+ inkscape:transform-center-y="-25.92736">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_27.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_27.svg
new file mode 100644
index 0000000..ec8a536
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_27.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_27.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.79769911,0.64596394,-0.62587265,-0.7728884,181.80767,84.602056)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="21.795683"
+ inkscape:transform-center-y="-27.161824">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_28.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_28.svg
new file mode 100644
index 0000000..f7d67c1
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_28.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_28.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.83041303,0.60333032,-0.58456506,-0.80458483,181.1613,90.178228)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="20.288345"
+ inkscape:transform-center-y="-28.319085">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_29.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_29.svg
new file mode 100644
index 0000000..d0274b5
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_29.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_29.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.86085085,0.55904302,-0.54165522,-0.83407595,180.22398,95.712929)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="18.722717"
+ inkscape:transform-center-y="-29.39596">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_3.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_3.svg
new file mode 100644
index 0000000..749b283
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_3.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_3.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.36784564,0.95827076,-0.92846582,0.35640463,117.09976,-23.568408)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="32.843863"
+ inkscape:transform-center-y="12.280027">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_30.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_30.svg
new file mode 100644
index 0000000..c20ca1d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_30.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_30.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.88892913,0.51322342,-0.49726074,-0.86128092,178.99828,101.19099)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="17.133267"
+ inkscape:transform-center-y="-30.389487">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_31.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_31.svg
new file mode 100644
index 0000000..a41fe18
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_31.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_31.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.91457092,0.46599711,-0.4515033,-0.88612518,177.48756,106.59739)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="15.556683"
+ inkscape:transform-center-y="-31.296941">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_32.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_32.svg
new file mode 100644
index 0000000..01c0b8d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_32.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_32.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.93770594,0.41749353,-0.40450832,-0.90854063,175.69596,111.91732)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="13.937461"
+ inkscape:transform-center-y="-32.115818">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_33.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_33.svg
new file mode 100644
index 0000000..2803210
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_33.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_33.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.95827077,0.36784563,-0.35640461,-0.92846584,173.6284,117.1362)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="12.280028"
+ inkscape:transform-center-y="-32.843864">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_34.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_34.svg
new file mode 100644
index 0000000..ff26872
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_34.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_34.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.97620905,0.31718949,-0.30732402,-0.94584619,171.29053,122.23971)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="11.061655"
+ inkscape:transform-center-y="-33.47909">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_35.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_35.svg
new file mode 100644
index 0000000..0edc1af
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_35.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_35.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.9914716,0.26566396,-0.25740108,-0.96063404,168.68877,127.21388)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="9.9667321"
+ inkscape:transform-center-y="-34.019726">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_36.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_36.svg
new file mode 100644
index 0000000..4a0c025
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_36.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_36.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1.0040166,0.21341026,-0.20677262,-0.97278886,165.83025,132.04506)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="8.8418811"
+ inkscape:transform-center-y="-34.464295">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_37.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_37.svg
new file mode 100644
index 0000000..a0a3b2f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_37.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_37.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1.0138097,0.16057162,-0.15557741,-0.98227733,162.7228,136.72002)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="6.9940198"
+ inkscape:transform-center-y="-34.81155">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_38.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_38.svg
new file mode 100644
index 0000000..24a3a14
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_38.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_38.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1.020824,0.10729286,-0.10395577,-0.98907345,159.37494,141.22594)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="4.6733562"
+ inkscape:transform-center-y="-35.060528">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_39.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_39.svg
new file mode 100644
index 0000000..933217d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_39.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_39.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1.0250403,0.05372002,-0.0520492,-0.99315858,155.79585,145.55047)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="2.3398809"
+ inkscape:transform-center-y="-35.21052">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_4.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_4.svg
new file mode 100644
index 0000000..8327519
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_4.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_4.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.3171895,0.97620904,-0.94584617,0.30732404,122.20328,-21.230543)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="33.479079"
+ inkscape:transform-center-y="11.061649">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_40.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_40.svg
new file mode 100644
index 0000000..c6983a7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_40.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_40.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1.026447,-6.5708448e-8,3.5604836e-8,-0.99452154,151.99534,149.68176)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-1.4318327e-005"
+ inkscape:transform-center-y="-35.261083">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_41.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_41.svg
new file mode 100644
index 0000000..4d6a38a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_41.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_41.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1.0250403,-0.05372014,0.05204927,-0.99315858,147.98382,153.60849)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-2.3399045"
+ inkscape:transform-center-y="-35.210515">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_42.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_42.svg
new file mode 100644
index 0000000..a3ccf58
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_42.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_42.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1.020824,-0.10729298,0.10395584,-0.98907344,143.77229,157.31989)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-4.673385"
+ inkscape:transform-center-y="-35.060522">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_43.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_43.svg
new file mode 100644
index 0000000..66a5df9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_43.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_43.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1.0138097,-0.16057174,0.15557748,-0.98227732,139.37229,160.80579)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-6.994054"
+ inkscape:transform-center-y="-34.811542">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_44.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_44.svg
new file mode 100644
index 0000000..d21f36c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_44.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_44.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-1.0040166,-0.21341038,0.20677269,-0.97278885,134.79588,164.05663)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-8.8419025"
+ inkscape:transform-center-y="-34.464286">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_45.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_45.svg
new file mode 100644
index 0000000..70e2f55
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_45.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_45.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.99147159,-0.26566408,0.25740115,-0.96063403,130.05561,167.06351)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-9.966755"
+ inkscape:transform-center-y="-34.019716">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_46.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_46.svg
new file mode 100644
index 0000000..8e06c20
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_46.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_46.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.97620903,-0.31718961,0.30732409,-0.94584618,125.16447,169.81818)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-11.061682"
+ inkscape:transform-center-y="-33.479073">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_47.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_47.svg
new file mode 100644
index 0000000..9099236
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_47.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_47.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.95827075,-0.36784575,0.35640468,-0.92846583,120.13586,172.31309)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-12.280043"
+ inkscape:transform-center-y="-32.843852">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_48.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_48.svg
new file mode 100644
index 0000000..7513f95
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_48.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_48.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.93770591,-0.41749365,0.40450839,-0.90854062,114.98357,174.5414)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-13.937473"
+ inkscape:transform-center-y="-32.115805">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_49.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_49.svg
new file mode 100644
index 0000000..43e05bf
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_49.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_49.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.91457089,-0.46599722,0.45150337,-0.88612516,109.72172,176.49701)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-15.5567"
+ inkscape:transform-center-y="-31.296927">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_5.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_5.svg
new file mode 100644
index 0000000..3586d3a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_5.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_5.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.26566397,0.9914716,-0.96063402,0.2574011,127.17745,-18.628784)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="34.019715"
+ inkscape:transform-center-y="9.9667262">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_50.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_50.svg
new file mode 100644
index 0000000..2b0269f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_50.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_50.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.88892909,-0.51322353,0.49726081,-0.8612809,104.36473,178.17456)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-17.133285"
+ inkscape:transform-center-y="-30.389472">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_51.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_51.svg
new file mode 100644
index 0000000..d783688
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_51.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_51.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.8608508,-0.55904313,0.54165529,-0.83407592,98.927287,179.56944)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-18.722752"
+ inkscape:transform-center-y="-29.395946">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_52.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_52.svg
new file mode 100644
index 0000000..6ceb4dc
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_52.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_52.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.83041298,-0.60333043,0.58456513,-0.8045848,93.424294,180.67784)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-20.288382"
+ inkscape:transform-center-y="-28.319068">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_53.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_53.svg
new file mode 100644
index 0000000..92ffafa
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_53.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_53.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.79769905,-0.64596404,0.62587272,-0.77288837,87.870833,181.49671)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-21.79572"
+ inkscape:transform-center-y="-27.16181">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_54.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_54.svg
new file mode 100644
index 0000000..47eb891
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_54.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_54.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.76279869,-0.68682711,0.66546484,-0.73907351,82.282126,182.02382)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-23.240617"
+ inkscape:transform-center-y="-25.927342">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_55.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_55.svg
new file mode 100644
index 0000000..2416e10
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_55.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_55.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.72580755,-0.72580764,0.70323296,-0.7032329,76.673492,182.25771)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-24.619098"
+ inkscape:transform-center-y="-24.619073">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_56.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_56.svg
new file mode 100644
index 0000000..ca081c8
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_56.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_56.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.68682702,-0.76279878,0.73907357,-0.66546477,71.060303,182.19775)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-25.92737"
+ inkscape:transform-center-y="-23.240591">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_57.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_57.svg
new file mode 100644
index 0000000..a0a0c9e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_57.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_57.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.64596394,-0.79769914,0.77288843,-0.62587265,65.457945,181.8441)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-27.161834"
+ inkscape:transform-center-y="-21.795693">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_58.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_58.svg
new file mode 100644
index 0000000..91bb7e4
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_58.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_58.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.60333032,-0.83041306,0.80458486,-0.58456506,59.881774,181.19773)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-28.319096"
+ inkscape:transform-center-y="-20.288355">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_59.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_59.svg
new file mode 100644
index 0000000..a8b674b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_59.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_59.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.55904302,-0.86085088,0.83407598,-0.54165522,54.347073,180.26041)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-29.395971"
+ inkscape:transform-center-y="-18.722727">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_6.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_6.svg
new file mode 100644
index 0000000..68bf620
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_6.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_6.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.21341027,1.0040166,-0.97278884,0.20677264,132.00863,-15.770263)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="34.464284"
+ inkscape:transform-center-y="8.8418762">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_60.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_60.svg
new file mode 100644
index 0000000..f4ce105
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_60.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_60.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.51322342,-0.88892916,0.86128095,-0.49726074,48.869013,179.03471)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-30.389499"
+ inkscape:transform-center-y="-17.133277">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_61.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_61.svg
new file mode 100644
index 0000000..03d604a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_61.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_61.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.46599711,-0.91457095,0.88612521,-0.4515033,43.462608,177.52399)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-31.296948"
+ inkscape:transform-center-y="-15.556693">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_62.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_62.svg
new file mode 100644
index 0000000..8e8983f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_62.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_62.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.41749353,-0.93770597,0.90854066,-0.40450832,38.142678,175.73239)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-32.115825"
+ inkscape:transform-center-y="-13.937471">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_63.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_63.svg
new file mode 100644
index 0000000..cdafad6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_63.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_63.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.36784563,-0.9582708,0.92846587,-0.35640461,32.923803,173.66483)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-32.843876"
+ inkscape:transform-center-y="-12.280038">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_64.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_64.svg
new file mode 100644
index 0000000..896e5ae
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_64.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_64.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.31718949,-0.97620908,0.94584622,-0.30732402,27.820288,171.32696)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-33.479097"
+ inkscape:transform-center-y="-11.061665">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_65.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_65.svg
new file mode 100644
index 0000000..3f99928
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_65.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_65.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.26566396,-0.99147163,0.96063407,-0.25740108,22.846122,168.7252)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-34.019737"
+ inkscape:transform-center-y="-9.9667424">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_66.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_66.svg
new file mode 100644
index 0000000..d6c0a9d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_66.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_66.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.21341026,-1.0040166,0.97278889,-0.20677262,18.014939,165.86668)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-34.464303"
+ inkscape:transform-center-y="-8.8418891">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_67.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_67.svg
new file mode 100644
index 0000000..e6983e1
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_67.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_67.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.16057162,-1.0138097,0.98227736,-0.15557741,13.33998,162.75923)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-34.811559"
+ inkscape:transform-center-y="-6.9940278">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_68.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_68.svg
new file mode 100644
index 0000000..5246932
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_68.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_68.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.10729286,-1.020824,0.98907348,-0.10395577,8.8340594,159.41137)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-35.060536"
+ inkscape:transform-center-y="-4.6733642">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_69.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_69.svg
new file mode 100644
index 0000000..f7845d3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_69.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_69.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(-0.05372002,-1.0250403,0.99315861,-0.0520492,4.5095274,155.83228)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-35.210526"
+ inkscape:transform-center-y="-2.3398889">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_7.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_7.svg
new file mode 100644
index 0000000..b0daefe
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_7.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_7.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.16057163,1.0138097,-0.98227731,0.15557743,136.68359,-12.662815)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="34.811539"
+ inkscape:transform-center-y="6.9940133">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_70.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_70.svg
new file mode 100644
index 0000000..98d4b13
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_70.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_70.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(6.5708448e-8,-1.026447,0.99452157,3.7174915e-8,0.37823717,152.03177)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-35.261089">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_71.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_71.svg
new file mode 100644
index 0000000..83d4e32
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_71.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_71.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.05372015,-1.0250403,0.99315861,0.05204927,-3.5484876,148.02025)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-35.210527"
+ inkscape:transform-center-y="2.33989">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_72.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_72.svg
new file mode 100644
index 0000000..42a7bb2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_72.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_72.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.10729299,-1.020824,0.98907347,0.10395584,-7.2598842,143.80872)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-35.060537"
+ inkscape:transform-center-y="4.6733705">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_73.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_73.svg
new file mode 100644
index 0000000..4edc25e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_73.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_73.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.16057175,-1.0138097,0.98227735,0.15557748,-10.74578,139.40872)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-34.811561"
+ inkscape:transform-center-y="6.9940395">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_74.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_74.svg
new file mode 100644
index 0000000..57e0bf1
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_74.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_74.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.21341039,-1.0040166,0.97278888,0.20677269,-13.99662,134.83231)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-34.464305"
+ inkscape:transform-center-y="8.841888">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_75.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_75.svg
new file mode 100644
index 0000000..8eabc82
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_75.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_75.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.26566409,-0.99147159,0.96063406,0.25740115,-17.003494,130.09204)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-34.019741"
+ inkscape:transform-center-y="9.9667405">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_76.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_76.svg
new file mode 100644
index 0000000..75ba075
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_76.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_76.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.31718962,-0.97620903,0.94584621,0.30732409,-19.758161,125.2009)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-33.479101"
+ inkscape:transform-center-y="11.061667">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_77.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_77.svg
new file mode 100644
index 0000000..17638b3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_77.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_77.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.36784576,-0.95827075,0.92846586,0.35640468,-22.25307,120.17229)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-32.843881"
+ inkscape:transform-center-y="12.280028">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_78.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_78.svg
new file mode 100644
index 0000000..f222c82
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_78.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_78.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.41749366,-0.93770591,0.90854065,0.40450839,-24.481383,115.02)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-32.115831"
+ inkscape:transform-center-y="13.937458">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_79.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_79.svg
new file mode 100644
index 0000000..471e948
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_79.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_79.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.46599723,-0.91457089,0.88612519,0.45150337,-26.436992,109.75815)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-31.296954"
+ inkscape:transform-center-y="15.556685">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_8.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_8.svg
new file mode 100644
index 0000000..483a0f8
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_8.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_8.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.10729287,1.020824,-0.98907343,0.10395579,141.18951,-9.3149569)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="35.060517"
+ inkscape:transform-center-y="4.6733478">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_80.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_80.svg
new file mode 100644
index 0000000..3897a77
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_80.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_80.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.51322354,-0.88892909,0.86128093,0.49726081,-28.114537,104.40116)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-30.389504"
+ inkscape:transform-center-y="17.13327">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_81.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_81.svg
new file mode 100644
index 0000000..15c3157
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_81.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_81.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.55904314,-0.8608508,0.83407595,0.54165529,-29.50942,98.963719)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="-29.395975"
+ inkscape:transform-center-y="18.722739">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachohands/temp_9.svg b/skins/blackhole/themes/default/skinparts/tachohands/temp_9.svg
new file mode 100644
index 0000000..b1c8397
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachohands/temp_9.svg
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="150"
+ height="150"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 150 150"
+ sodipodi:docname="temp_9.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="4.1351511"
+ inkscape:cx="30.095283"
+ inkscape:cy="73.684984"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer6"
+ showgrid="false"
+ units="px"
+ showguides="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <g
+ id="g6296"
+ transform="matrix(0.05372003,1.0250403,-0.99315856,0.05204922,145.51404,-5.7358653)"
+ style="display:inline;opacity:0.8"
+ inkscape:transform-center-x="35.210509"
+ inkscape:transform-center-y="2.3398741">
+ <rect
+ ry="1.9714236"
+ inkscape:transform-center-y="34.553266"
+ inkscape:transform-center-x="-6.7619679e-005"
+ y="74.999992"
+ x="73.000046"
+ height="68.999992"
+ width="3.99999"
+ id="rect4647-0"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#999999;stroke-width:0;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path6288"
+ d="m 65.000024,119.99999 10,26 10,-26 z"
+ style="fill:#d40000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ </g>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/tachos_back.svg b/skins/blackhole/themes/default/skinparts/tachos_back.svg
new file mode 100644
index 0000000..1425edf
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/tachos_back.svg
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="600"
+ height="150"
+ id="svg4482"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 600 150"
+ sodipodi:docname="tachos_back.svg">
+ <defs
+ id="defs4484">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5043">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop5045" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop5047" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5032">
+ <stop
+ style="stop-color:#555555;stop-opacity:1"
+ offset="0"
+ id="stop5034" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1"
+ id="stop5036" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5032"
+ id="linearGradient5038"
+ x1="599.11041"
+ y1="750.20166"
+ x2="351.35126"
+ y2="1038.757"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5043"
+ id="radialGradient5049"
+ cx="150"
+ cy="75"
+ fx="150"
+ fy="75"
+ r="1"
+ gradientTransform="matrix(1,0,0,75,0,-5550)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5043"
+ id="radialGradient5053"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,75,150,-5550)"
+ cx="150"
+ cy="75"
+ fx="150"
+ fy="75"
+ r="1" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5043"
+ id="radialGradient5057"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,75,300,-5550)"
+ cx="150"
+ cy="75"
+ fx="150"
+ fy="75"
+ r="1" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.9545646"
+ inkscape:cx="304.59735"
+ inkscape:cy="74.034843"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata4487">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-902.3622)">
+ <rect
+ style="fill:url(#linearGradient5038);fill-opacity:1"
+ id="rect5030"
+ width="600"
+ height="150"
+ x="0"
+ y="902.36224"
+ ry="0.99071312" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Layer 2">
+ <rect
+ style="fill:url(#radialGradient5049);fill-opacity:1"
+ id="rect5041"
+ width="2"
+ height="150"
+ x="149"
+ y="4.4408921e-016"
+ ry="1.0120623" />
+ <rect
+ ry="1.0120623"
+ y="4.4408921e-016"
+ x="299"
+ height="150"
+ width="2"
+ id="rect5051"
+ style="fill:url(#radialGradient5053);fill-opacity:1" />
+ <rect
+ style="fill:url(#radialGradient5057);fill-opacity:1"
+ id="rect5055"
+ width="2"
+ height="150"
+ x="449"
+ y="4.4408921e-016"
+ ry="1.0120623" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchback.svg b/skins/blackhole/themes/default/skinparts/watchback.svg
new file mode 100644
index 0000000..297be69
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchback.svg
@@ -0,0 +1,950 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="watchback.svg">
+ <defs
+ id="defs4">
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4703">
+ <stop
+ style="stop-color:#0000ff;stop-opacity:1;"
+ offset="0"
+ id="stop4705" />
+ <stop
+ style="stop-color:#aaaaaa;stop-opacity:1"
+ offset="1"
+ id="stop4707" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4632">
+ <stop
+ style="stop-color:#111111;stop-opacity:1"
+ offset="0"
+ id="stop4634" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4636" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient4593">
+ <stop
+ style="stop-color:#000000;stop-opacity:1"
+ offset="0"
+ id="stop4595" />
+ <stop
+ style="stop-color:#555555;stop-opacity:1"
+ offset="1"
+ id="stop4597" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4593"
+ id="linearGradient4626"
+ gradientUnits="userSpaceOnUse"
+ x1="89.300102"
+ y1="278.60709"
+ x2="217.84399"
+ y2="22.412598"
+ gradientTransform="matrix(0.96551722,0,0,0.96551714,5.1724164,5.172439)" />
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4628"
+ x="-0.011999981"
+ width="1.024"
+ y="-0.012000019"
+ height="1.024">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.3999911"
+ id="feGaussianBlur4630" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4632"
+ id="linearGradient4638"
+ x1="34.089806"
+ y1="271.97308"
+ x2="260.29636"
+ y2="24.454491"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ style="color-interpolation-filters:sRGB"
+ id="filter4644"
+ x="-0.011999981"
+ width="1.024"
+ y="-0.012000019"
+ height="1.024">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="1.4499908"
+ id="feGaussianBlur4646" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4709"
+ x1="-204.95076"
+ y1="47.005383"
+ x2="-205.42775"
+ y2="82.237648"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4717"
+ x1="-205.8251"
+ y1="-185.34164"
+ x2="-205.59959"
+ y2="-140.44257"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4727"
+ x1="-205.18201"
+ y1="155.57944"
+ x2="-205.15691"
+ y2="192.12451"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4735"
+ x1="-204.42682"
+ y1="-73.98455"
+ x2="-203.19908"
+ y2="-28.186365"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4745"
+ x1="-151.936"
+ y1="248.05977"
+ x2="-144.57596"
+ y2="316.51266"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4755"
+ x1="-54.153198"
+ y1="308.10574"
+ x2="-55.242977"
+ y2="373.39899"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4765"
+ x1="55.686234"
+ y1="305.61441"
+ x2="65.469177"
+ y2="397.63538"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4775"
+ x1="150.30801"
+ y1="279.82416"
+ x2="154.18004"
+ y2="200.03514"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4783"
+ x1="-151.5"
+ y1="21.983833"
+ x2="-147.19199"
+ y2="77.792557"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4791"
+ x1="-54.690376"
+ y1="78.919342"
+ x2="-50.80159"
+ y2="132.77943"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4799"
+ x1="55.284603"
+ y1="105.08643"
+ x2="50.025658"
+ y2="40.91032"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4703"
+ id="linearGradient4807"
+ x1="149.87201"
+ y1="52.004196"
+ x2="152"
+ y2="4.0435781"
+ gradientUnits="userSpaceOnUse" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer4"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="Hintergrund"
+ style="display:inline">
+ <path
+ style="opacity:1;fill:url(#linearGradient4638);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4644)"
+ id="path4575"
+ sodipodi:type="arc"
+ sodipodi:cx="149.9996"
+ sodipodi:cy="149.9995"
+ sodipodi:rx="144.99931"
+ sodipodi:ry="144.99886"
+ sodipodi:start="3.1275602"
+ sodipodi:end="3.1002807"
+ sodipodi:open="true"
+ d="M 5.0145656,152.03412 A 144.99931,144.99886 0 0 1 146.97625,5.0321639 144.99931,144.99886 0 0 1 294.9434,145.98757 144.99931,144.99886 0 0 1 154.99994,294.91211 144.99931,144.99886 0 0 1 5.1240059,155.98798" />
+ <path
+ d="M 10.014058,151.96399 A 139.99933,139.99889 0 0 1 147.0805,10.031077 139.99933,139.99889 0 0 1 289.94533,146.12594 139.99933,139.99889 0 0 1 154.82751,289.91514 139.99933,139.99889 0 0 1 10.119725,155.78151"
+ sodipodi:open="true"
+ sodipodi:end="3.1002807"
+ sodipodi:start="3.1275602"
+ sodipodi:ry="139.99889"
+ sodipodi:rx="139.99933"
+ sodipodi:cy="149.99953"
+ sodipodi:cx="149.9996"
+ sodipodi:type="arc"
+ id="path4624"
+ style="opacity:1;fill:url(#linearGradient4626);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4628)" />
+ </g>
+ <g
+ inkscape:label="1 s Ticks"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-752.3622)"
+ style="display:inline">
+ <g
+ id="g4335"
+ transform="matrix(0.9945219,-0.10452846,0.10452846,0.9945219,-93.498077,20.674768)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4337"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4339"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ transform="matrix(0.97814761,-0.20791169,0.20791169,0.97814761,-184.32286,51.009487)"
+ id="g4341"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4343"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4345"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ id="g4347"
+ transform="matrix(0.95105653,-0.30901699,0.30901699,0.95105653,-271.47926,90.671805)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4349"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4351"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ transform="matrix(0.91354547,-0.40673664,0.40673664,0.91354547,-354.01236,139.22717)"
+ id="g4353"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4355"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4357"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ transform="matrix(0.80901701,-0.58778525,0.58778525,0.80901701,-501.65225,260.79751)"
+ id="g4365"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4367"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4369"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ id="g4371"
+ transform="matrix(0.74314484,-0.66913061,0.66913061,0.74314484,-565.14146,332.48054)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4373"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4375"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ transform="matrix(0.66913062,-0.74314483,0.74314483,0.66913062,-620.78995,410.40731)"
+ id="g4377"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4379"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4381"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ id="g4383"
+ transform="matrix(0.58778527,-0.809017,0.809017,0.58778527,-667.98803,493.72404)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4385"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4387"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ id="g4395"
+ transform="matrix(0.40673666,-0.91354547,0.91354547,0.40673666,-735.06275,672.827)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4397"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4399"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ transform="matrix(0.30901701,-0.95105653,0.95105653,0.30901701,-754.20451,766.65093)"
+ id="g4401"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4403"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4405"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ id="g4407"
+ transform="matrix(0.2079117,-0.97814762,0.97814762,0.2079117,-763.43413,861.96174)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4409"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4411"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ transform="matrix(0.10452847,-0.99452192,0.99452192,0.10452847,-762.6505,957.71519)"
+ id="g4413"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4415"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4417"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ transform="matrix(-0.10452846,-0.9945219,0.9945219,-0.10452846,-731.18743,1146.3603)"
+ id="g4425"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4427"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4429"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ id="g4431"
+ transform="matrix(-0.20791169,-0.97814761,0.97814761,-0.20791169,-700.85271,1237.1851)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4433"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4435"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ transform="matrix(-0.30901699,-0.95105653,0.95105653,-0.30901699,-661.19039,1324.3415)"
+ id="g4437"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4439"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4441"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ id="g4443"
+ transform="matrix(-0.40673664,-0.91354547,0.91354547,-0.40673664,-612.63502,1406.8746)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4445"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4447"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ id="g4455"
+ transform="matrix(-0.58778525,-0.80901701,0.80901701,-0.58778525,-491.06468,1554.5145)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4457"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4459"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ transform="matrix(-0.66913061,-0.74314484,0.74314484,-0.66913061,-419.38165,1618.0037)"
+ id="g4461"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4463"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4465"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ id="g4467"
+ transform="matrix(-0.74314483,-0.66913062,0.66913062,-0.74314483,-341.45488,1673.6522)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4469"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4471"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ transform="matrix(-0.809017,-0.58778527,0.58778527,-0.809017,-258.13815,1720.8503)"
+ id="g4473"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4475"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4477"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ transform="matrix(-0.91354547,-0.40673666,0.40673666,-0.91354547,-79.035195,1787.9251)"
+ id="g4485"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4487"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4489"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ id="g4491"
+ transform="matrix(-0.95105653,-0.30901701,0.30901701,-0.95105653,14.788736,1807.0669)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4493"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4495"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <g
+ transform="matrix(-0.97814762,-0.2079117,0.2079117,-0.97814762,110.09955,1816.2965)"
+ id="g4497"
+ style="fill:#cccccc">
+ <rect
+ ry="0.31718317"
+ y="772.36218"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4499"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4501"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="1012.3622"
+ ry="0.31718317" />
+ </g>
+ <g
+ id="g4503"
+ transform="matrix(-0.99452192,-0.10452847,0.10452847,-0.99452192,205.853,1815.5129)"
+ style="fill:#cccccc">
+ <rect
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4505"
+ width="2.9999945"
+ height="19.999998"
+ x="149"
+ y="772.36218"
+ ry="0.31718317" />
+ <rect
+ ry="0.31718317"
+ y="1012.3622"
+ x="149"
+ height="19.999998"
+ width="2.9999945"
+ id="rect4507"
+ style="opacity:1;fill:#cccccc;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="5 s Ticks 1"
+ style="display:inline">
+ <rect
+ ry="0.47577462"
+ y="19.999983"
+ x="149"
+ height="29.999989"
+ width="2.9999924"
+ id="rect4511"
+ style="opacity:1;fill:url(#linearGradient4807);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4775);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4513"
+ width="2.9999924"
+ height="29.999989"
+ x="149"
+ y="249.99998"
+ ry="0.47577462" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4799);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4523"
+ width="2.9999924"
+ height="29.999989"
+ x="53.836845"
+ y="75.153801"
+ ry="0.47577462"
+ transform="matrix(0.8660254,-0.5,0.5,0.8660254,0,0)" />
+ <rect
+ ry="0.47577462"
+ y="305.15381"
+ x="53.836845"
+ height="29.999989"
+ width="2.9999924"
+ id="rect4525"
+ style="opacity:1;fill:url(#linearGradient4765);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.8660254,-0.5,0.5,0.8660254,0,0)" />
+ <rect
+ ry="0.47577462"
+ y="75.336823"
+ x="-56.153786"
+ height="29.999989"
+ width="2.9999924"
+ id="rect4529"
+ style="opacity:1;fill:url(#linearGradient4791);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.5,-0.8660254,0.8660254,0.5,0,0)" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4755);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4531"
+ width="2.9999924"
+ height="29.999989"
+ x="-56.153786"
+ y="305.33682"
+ ry="0.47577462"
+ transform="matrix(0.5,-0.8660254,0.8660254,0.5,0,0)" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4783);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4535"
+ width="2.9999924"
+ height="29.999989"
+ x="-151.5"
+ y="20.500013"
+ ry="0.47577462"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <rect
+ ry="0.47577462"
+ y="250.50002"
+ x="-151.5"
+ height="29.999989"
+ width="2.9999924"
+ id="rect4537"
+ style="opacity:1;fill:url(#linearGradient4745);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <rect
+ ry="0.47577462"
+ y="-74.663162"
+ x="-206.65381"
+ height="29.999989"
+ width="2.9999924"
+ id="rect4541"
+ style="opacity:1;fill:url(#linearGradient4735);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,0,0)" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4727);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4543"
+ width="2.9999924"
+ height="29.999989"
+ x="-206.65381"
+ y="155.33684"
+ ry="0.47577462"
+ transform="matrix(-0.5,-0.8660254,0.8660254,-0.5,0,0)" />
+ <rect
+ style="opacity:1;fill:url(#linearGradient4717);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4547"
+ width="2.9999924"
+ height="29.999989"
+ x="-206.83685"
+ y="-184.65382"
+ ry="0.47577462"
+ transform="matrix(-0.8660254,-0.5,0.5,-0.8660254,0,0)" />
+ <rect
+ ry="0.47577462"
+ y="45.346169"
+ x="-206.83685"
+ height="29.999989"
+ width="2.9999924"
+ id="rect4549"
+ style="opacity:1;fill:url(#linearGradient4709);fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.8660254,-0.5,0.5,-0.8660254,0,0)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Ziffern"
+ style="display:inline">
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="136.77315"
+ y="69.322876"
+ id="text4602"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4604"
+ x="136.77315"
+ y="69.322876"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#b3b3b3">12</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4606"
+ y="158.63371"
+ x="233.22884"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#b3b3b3"
+ y="158.63371"
+ x="233.22884"
+ id="tspan4608"
+ sodipodi:role="line">3</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="143.40765"
+ y="245.39281"
+ id="text4610"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4612"
+ x="143.40765"
+ y="245.39281"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#b3b3b3">6</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4614"
+ y="158.63371"
+ x="53.07613"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ xml:space="preserve"><tspan
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#b3b3b3"
+ y="158.63371"
+ x="53.07613"
+ id="tspan4616"
+ sodipodi:role="line">9</tspan></text>
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_0.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_0.svg
new file mode 100644
index 0000000..fc79b4c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_0.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_0.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-35.102415"
+ inkscape:transform-center-x="-0.1600401"
+ ry="0.26296809"
+ y="80.000008"
+ x="148"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_1.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_1.svg
new file mode 100644
index 0000000..3a9be10
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_1.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_1.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-34.893393"
+ inkscape:transform-center-x="-3.828363"
+ ry="0.26296809"
+ y="63.462925"
+ x="162.86639"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_10.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_10.svg
new file mode 100644
index 0000000..2d36afd
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_10.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_10.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-17.412611"
+ inkscape:transform-center-x="-30.479598"
+ ry="0.26296809"
+ y="-125.24942"
+ x="202.82253"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.50000001,0.8660254,-0.8660254,0.50000001,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_11.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_11.svg
new file mode 100644
index 0000000..b3fd835
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_11.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_11.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-14.13124"
+ inkscape:transform-center-x="-32.13274"
+ ry="0.26296809"
+ y="-146.39264"
+ x="195.93419"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.40673665,0.91354545,-0.91354545,0.40673665,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_12.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_12.svg
new file mode 100644
index 0000000..8f6790e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_12.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_12.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-10.695045"
+ inkscape:transform-center-x="-33.433835"
+ ry="0.26296809"
+ y="-166.70001"
+ x="186.87352"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.309017,0.95105651,-0.95105651,0.309017,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_13.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_13.svg
new file mode 100644
index 0000000..cfc7738
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_13.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_13.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-7.1416669"
+ inkscape:transform-center-x="-34.368619"
+ ry="0.26296809"
+ y="-185.94904"
+ x="175.73979"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.2079117,0.9781476,-0.9781476,0.2079117,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_14.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_14.svg
new file mode 100644
index 0000000..3b9123d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_14.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_14.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-3.5100451"
+ inkscape:transform-center-x="-34.926849"
+ ry="0.26296809"
+ y="-203.92882"
+ x="162.65498"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.10452847,0.99452189,-0.99452189,0.10452847,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_15.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_15.svg
new file mode 100644
index 0000000..1ad0f29
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_15.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_15.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="0.16003096"
+ inkscape:transform-center-x="-35.102412"
+ ry="0.26296809"
+ y="-220.44237"
+ x="147.76245"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_16.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_16.svg
new file mode 100644
index 0000000..d25b200
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_16.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_16.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="3.8283579"
+ inkscape:transform-center-x="-34.893388"
+ ry="0.26296809"
+ y="-235.30876"
+ x="131.22537"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.10452846,0.9945219,-0.9945219,-0.10452846,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_17.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_17.svg
new file mode 100644
index 0000000..c8651ca
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_17.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_17.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="7.4547398"
+ inkscape:transform-center-x="-34.302069"
+ ry="0.26296809"
+ y="-248.36513"
+ x="113.22492"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.20791169,0.9781476,-0.9781476,-0.20791169,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_18.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_18.svg
new file mode 100644
index 0000000..594f0b2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_18.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_18.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="10.99945"
+ inkscape:transform-center-x="-33.334935"
+ ry="0.26296809"
+ y="-259.46841"
+ x="93.958321"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.30901699,0.95105652,-0.95105652,-0.30901699,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_19.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_19.svg
new file mode 100644
index 0000000..4c2813f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_19.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_19.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="14.423637"
+ inkscape:transform-center-x="-32.002558"
+ ry="0.26296809"
+ y="-268.49695"
+ x="73.63665"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.40673664,0.91354546,-0.91354546,-0.40673664,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_2.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_2.svg
new file mode 100644
index 0000000..f0c400d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_2.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-34.302069"
+ inkscape:transform-center-x="-7.4547463"
+ ry="0.26296809"
+ y="45.462475"
+ x="175.92276"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.9781476,0.20791169,-0.20791169,0.9781476,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_20.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_20.svg
new file mode 100644
index 0000000..7e0ce77
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_20.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_20.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="17.689801"
+ inkscape:transform-center-x="-30.319561"
+ ry="0.26296809"
+ y="-275.35184"
+ x="52.482567"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.5,0.86602541,-0.86602541,-0.5,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_21.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_21.svg
new file mode 100644
index 0000000..54230e0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_21.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_21.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="20.762154"
+ inkscape:transform-center-x="-28.304382"
+ ry="0.26296809"
+ y="-279.95798"
+ x="30.727837"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.58778525,0.809017,-0.809017,-0.58778525,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_22.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_22.svg
new file mode 100644
index 0000000..fd4b0c7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_22.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_22.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="23.607029"
+ inkscape:transform-center-x="-25.979092"
+ ry="0.26296809"
+ y="-282.26489"
+ x="8.6108074"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.6691306,0.74314483,-0.74314483,-0.6691306,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_23.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_23.svg
new file mode 100644
index 0000000..b025cd7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_23.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_23.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="26.193264"
+ inkscape:transform-center-x="-23.369171"
+ ry="0.26296809"
+ y="-282.24731"
+ x="-13.626201"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.74314482,0.66913061,-0.66913061,-0.74314482,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_24.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_24.svg
new file mode 100644
index 0000000..90db457
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_24.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_24.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="28.492515"
+ inkscape:transform-center-x="-20.503211"
+ ry="0.26296809"
+ y="-279.90543"
+ x="-35.739555"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.80901699,0.58778526,-0.58778526,-0.80901699,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_25.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_25.svg
new file mode 100644
index 0000000..82a04bf
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_25.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_25.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="30.479596"
+ inkscape:transform-center-x="-17.412613"
+ ry="0.26296809"
+ y="-275.26489"
+ x="-57.486977"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.8660254,0.50000001,-0.50000001,-0.8660254,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_26.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_26.svg
new file mode 100644
index 0000000..f189103
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_26.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_26.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="32.132736"
+ inkscape:transform-center-x="-14.131238"
+ ry="0.26296809"
+ y="-268.37656"
+ x="-78.630196"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.91354545,0.40673665,-0.40673665,-0.91354545,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_27.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_27.svg
new file mode 100644
index 0000000..851c98f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_27.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_27.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="33.433825"
+ inkscape:transform-center-x="-10.695038"
+ ry="0.26296809"
+ y="-259.31589"
+ x="-98.937561"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.95105651,0.309017,-0.309017,-0.95105651,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_28.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_28.svg
new file mode 100644
index 0000000..9bea225
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_28.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_28.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="34.368611"
+ inkscape:transform-center-x="-7.1416575"
+ ry="0.26296809"
+ y="-248.18216"
+ x="-118.18658"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.9781476,0.2079117,-0.2079117,-0.9781476,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_29.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_29.svg
new file mode 100644
index 0000000..eb325b7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_29.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_29.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="34.926842"
+ inkscape:transform-center-x="-3.510042"
+ ry="0.26296809"
+ y="-235.09735"
+ x="-136.16637"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.99452189,0.10452847,-0.10452847,-0.99452189,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_3.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_3.svg
new file mode 100644
index 0000000..0a3f9f4
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_3.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_3.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-33.334927"
+ inkscape:transform-center-x="-10.999445"
+ ry="0.26296809"
+ y="26.195871"
+ x="187.02603"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.95105652,0.30901699,-0.30901699,0.95105652,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_30.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_30.svg
new file mode 100644
index 0000000..d452484
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_30.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_30.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="35.102406"
+ inkscape:transform-center-x="0.16003948"
+ ry="0.26296809"
+ y="-220.20482"
+ x="-152.67992"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="scale(-1,-1)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_31.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_31.svg
new file mode 100644
index 0000000..20a0eb1
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_31.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_31.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="34.893385"
+ inkscape:transform-center-x="3.8283651"
+ ry="0.26296809"
+ y="-203.66774"
+ x="-167.54631"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.9945219,-0.10452846,0.10452846,-0.9945219,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_32.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_32.svg
new file mode 100644
index 0000000..719a270
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_32.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_32.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="34.302056"
+ inkscape:transform-center-x="7.4547404"
+ ry="0.26296809"
+ y="-185.66728"
+ x="-180.60268"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.9781476,-0.20791169,0.20791169,-0.9781476,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_33.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_33.svg
new file mode 100644
index 0000000..94ccc8c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_33.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_33.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="33.334914"
+ inkscape:transform-center-x="10.99945"
+ ry="0.26296809"
+ y="-166.40068"
+ x="-191.70595"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.95105652,-0.30901699,0.30901699,-0.95105652,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_34.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_34.svg
new file mode 100644
index 0000000..f0d1411
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_34.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_34.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="32.002546"
+ inkscape:transform-center-x="14.423637"
+ ry="0.26296809"
+ y="-146.07901"
+ x="-200.7345"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.91354546,-0.40673664,0.40673664,-0.91354546,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_35.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_35.svg
new file mode 100644
index 0000000..56cfc19
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_35.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_35.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="30.319552"
+ inkscape:transform-center-x="17.689803"
+ ry="0.26296809"
+ y="-124.92493"
+ x="-207.58939"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.86602541,-0.5,0.5,-0.86602541,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_36.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_36.svg
new file mode 100644
index 0000000..7527d65
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_36.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_36.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="28.304373"
+ inkscape:transform-center-x="20.76215"
+ ry="0.26296809"
+ y="-103.1702"
+ x="-212.19553"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.809017,-0.58778525,0.58778525,-0.809017,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_37.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_37.svg
new file mode 100644
index 0000000..a856d86
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_37.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_37.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="25.979083"
+ inkscape:transform-center-x="23.607026"
+ ry="0.26296809"
+ y="-81.053169"
+ x="-214.50244"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.74314483,-0.6691306,0.6691306,-0.74314483,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_38.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_38.svg
new file mode 100644
index 0000000..0f6298a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_38.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_38.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="23.369164"
+ inkscape:transform-center-x="26.193257"
+ ry="0.26296809"
+ y="-58.816162"
+ x="-214.48486"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.66913061,-0.74314482,0.74314482,-0.66913061,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_39.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_39.svg
new file mode 100644
index 0000000..f9f8135
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_39.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_39.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="20.503202"
+ inkscape:transform-center-x="28.492511"
+ ry="0.26296809"
+ y="-36.702808"
+ x="-212.14297"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.58778526,-0.80901699,0.80901699,-0.58778526,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_4.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_4.svg
new file mode 100644
index 0000000..36984ff
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_4.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_4.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-32.002558"
+ inkscape:transform-center-x="-14.423641"
+ ry="0.26296809"
+ y="5.8742027"
+ x="196.05458"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.91354546,0.40673664,-0.40673664,0.91354546,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_40.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_40.svg
new file mode 100644
index 0000000..f7112b9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_40.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_40.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="17.412603"
+ inkscape:transform-center-x="30.479595"
+ ry="0.26296809"
+ y="-14.955388"
+ x="-207.50244"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.50000001,-0.8660254,0.8660254,-0.50000001,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_41.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_41.svg
new file mode 100644
index 0000000..9c884d6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_41.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_41.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="14.131227"
+ inkscape:transform-center-x="32.132739"
+ ry="0.26296809"
+ y="6.18783"
+ x="-200.61411"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.40673665,-0.91354545,0.91354545,-0.40673665,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_42.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_42.svg
new file mode 100644
index 0000000..74f8bf4
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_42.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_42.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="10.695027"
+ inkscape:transform-center-x="33.433828"
+ ry="0.26296809"
+ y="26.495197"
+ x="-191.55344"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.309017,-0.95105651,0.95105651,-0.309017,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_43.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_43.svg
new file mode 100644
index 0000000..99ece4a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_43.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_43.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="7.1416542"
+ inkscape:transform-center-x="34.368607"
+ ry="0.26296809"
+ y="45.744221"
+ x="-180.41971"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.2079117,-0.9781476,0.9781476,-0.2079117,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_44.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_44.svg
new file mode 100644
index 0000000..8e32086
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_44.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_44.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="3.5100336"
+ inkscape:transform-center-x="34.92684"
+ ry="0.26296809"
+ y="63.724003"
+ x="-167.3349"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.10452847,-0.99452189,0.99452189,-0.10452847,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_45.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_45.svg
new file mode 100644
index 0000000..45c24f9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_45.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_45.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-0.16004645"
+ inkscape:transform-center-x="35.102406"
+ ry="0.26296809"
+ y="80.237556"
+ x="-152.44237"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0,-1,1,0,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_46.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_46.svg
new file mode 100644
index 0000000..aa998f0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_46.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_46.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-3.8283676"
+ inkscape:transform-center-x="34.893384"
+ ry="0.26296809"
+ y="95.103951"
+ x="-135.90529"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.10452846,-0.9945219,0.9945219,0.10452846,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_47.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_47.svg
new file mode 100644
index 0000000..40badec
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_47.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_47.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-7.4547472"
+ inkscape:transform-center-x="34.302065"
+ ry="0.26296809"
+ y="108.16031"
+ x="-117.90484"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.20791169,-0.9781476,0.9781476,0.20791169,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_48.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_48.svg
new file mode 100644
index 0000000..0ae50ab
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_48.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_48.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-10.999449"
+ inkscape:transform-center-x="33.33492"
+ ry="0.26296809"
+ y="119.26359"
+ x="-98.638237"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.30901699,-0.95105652,0.95105652,0.30901699,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_49.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_49.svg
new file mode 100644
index 0000000..34d499a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_49.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_49.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-14.423644"
+ inkscape:transform-center-x="32.002555"
+ ry="0.26296809"
+ y="128.29213"
+ x="-78.316566"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.40673664,-0.91354546,0.91354546,0.40673664,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_5.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_5.svg
new file mode 100644
index 0000000..67a8a19
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_5.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_5.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-30.319564"
+ inkscape:transform-center-x="-17.689802"
+ ry="0.26296809"
+ y="-15.279881"
+ x="202.90947"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.86602541,0.5,-0.5,0.86602541,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_50.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_50.svg
new file mode 100644
index 0000000..33489c2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_50.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_50.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-17.689808"
+ inkscape:transform-center-x="30.319563"
+ ry="0.26296809"
+ y="135.14702"
+ x="-57.162483"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.5,-0.86602541,0.86602541,0.5,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_51.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_51.svg
new file mode 100644
index 0000000..a144d3e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_51.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_51.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-20.762157"
+ inkscape:transform-center-x="28.304379"
+ ry="0.26296809"
+ y="139.75316"
+ x="-35.407753"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.58778525,-0.809017,0.809017,0.58778525,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_52.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_52.svg
new file mode 100644
index 0000000..a10ac1e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_52.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_52.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-23.607034"
+ inkscape:transform-center-x="25.979088"
+ ry="0.26296809"
+ y="142.06007"
+ x="-13.290724"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.6691306,-0.74314483,0.74314483,0.6691306,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_53.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_53.svg
new file mode 100644
index 0000000..cf7d1f3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_53.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_53.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-26.193264"
+ inkscape:transform-center-x="23.369163"
+ ry="0.26296809"
+ y="142.0425"
+ x="8.9462843"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.74314482,-0.66913061,0.66913061,0.74314482,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_54.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_54.svg
new file mode 100644
index 0000000..9819b1c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_54.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_54.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-28.492519"
+ inkscape:transform-center-x="20.503204"
+ ry="0.26296809"
+ y="139.70061"
+ x="31.059637"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.80901699,-0.58778526,0.58778526,0.80901699,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_55.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_55.svg
new file mode 100644
index 0000000..39e2072
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_55.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_55.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-30.479604"
+ inkscape:transform-center-x="17.412608"
+ ry="0.26296809"
+ y="135.06007"
+ x="52.807056"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.8660254,-0.50000001,0.50000001,0.8660254,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_56.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_56.svg
new file mode 100644
index 0000000..ed48711
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_56.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_56.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-32.132748"
+ inkscape:transform-center-x="14.131238"
+ ry="0.26296809"
+ y="128.17174"
+ x="73.950272"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.91354545,-0.40673665,0.40673665,0.91354545,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_57.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_57.svg
new file mode 100644
index 0000000..b3bb4cb
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_57.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_57.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-33.433839"
+ inkscape:transform-center-x="10.695041"
+ ry="0.26296809"
+ y="119.11107"
+ x="94.257637"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.95105651,-0.309017,0.309017,0.95105651,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_58.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_58.svg
new file mode 100644
index 0000000..02d9434
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_58.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_58.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-34.368619"
+ inkscape:transform-center-x="7.1416629"
+ ry="0.26296809"
+ y="107.97734"
+ x="113.50666"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.9781476,-0.2079117,0.2079117,0.9781476,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_59.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_59.svg
new file mode 100644
index 0000000..5a9e002
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_59.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_59.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.4694444"
+ inkscape:cx="144.5"
+ inkscape:cy="144"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-34.926852"
+ inkscape:transform-center-x="3.5100357"
+ ry="0.26296809"
+ y="94.892532"
+ x="131.48645"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.99452189,-0.10452847,0.10452847,0.99452189,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_6.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_6.svg
new file mode 100644
index 0000000..63dff34
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_6.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_6.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-28.30438"
+ inkscape:transform-center-x="-20.762155"
+ ry="0.26296809"
+ y="-37.034611"
+ x="207.51561"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.809017,0.58778525,-0.58778525,0.809017,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_7.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_7.svg
new file mode 100644
index 0000000..b7e04b6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_7.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_7.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-25.979089"
+ inkscape:transform-center-x="-23.60703"
+ ry="0.26296809"
+ y="-59.151638"
+ x="209.82253"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.74314483,0.6691306,-0.6691306,0.74314483,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_8.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_8.svg
new file mode 100644
index 0000000..6a1af52
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_8.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_8.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-23.369166"
+ inkscape:transform-center-x="-26.193266"
+ ry="0.26296809"
+ y="-81.388649"
+ x="209.80495"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.66913061,0.74314482,-0.74314482,0.66913061,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/h_9.svg b/skins/blackhole/themes/default/skinparts/watchhands/h_9.svg
new file mode 100644
index 0000000..af499e5
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/h_9.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="h_9.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="-80.75477"
+ inkscape:cy="190.98862"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ inkscape:transform-center-y="-20.503206"
+ inkscape:transform-center-x="-28.492515"
+ ry="0.26296809"
+ y="-103.502"
+ x="207.46306"
+ height="69.999992"
+ width="4.9999952"
+ id="rect4811"
+ style="opacity:1;fill:#b3b3b3;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.58778526,0.80901699,-0.80901699,0.58778526,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_0.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_0.svg
new file mode 100644
index 0000000..fe740c8
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_0.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_0.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="148.00002"
+ y="60.000004"
+ ry="0.33810186"
+ inkscape:transform-center-x="-0.16005756"
+ inkscape:transform-center-y="-45.131682" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_1.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_1.svg
new file mode 100644
index 0000000..cc7d420
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_1.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_1.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="162.86948"
+ y="43.462761"
+ ry="0.33810186"
+ inkscape:transform-center-x="-4.8767323"
+ inkscape:transform-center-y="-44.867716"
+ transform="matrix(0.9945219,0.10452846,-0.10452846,0.9945219,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_10.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_10.svg
new file mode 100644
index 0000000..27598d5
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_10.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_10.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="202.8479"
+ y="-145.26405"
+ ry="0.33810186"
+ inkscape:transform-center-x="-39.165217"
+ inkscape:transform-center-y="-22.427216"
+ transform="matrix(0.50000001,0.8660254,-0.8660254,0.50000001,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_11.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_11.svg
new file mode 100644
index 0000000..66ecef0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_11.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_11.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="195.96095"
+ y="-166.41"
+ ry="0.33810186"
+ inkscape:transform-center-x="-41.294947"
+ inkscape:transform-center-y="-18.210481"
+ transform="matrix(0.40673664,0.91354546,-0.91354546,0.40673664,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_12.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_12.svg
new file mode 100644
index 0000000..1657d4d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_12.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_12.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="186.90138"
+ y="-186.72023"
+ ry="0.33810186"
+ inkscape:transform-center-x="-42.972243"
+ inkscape:transform-center-y="-13.794225"
+ transform="matrix(0.30901699,0.95105652,-0.95105652,0.30901699,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_13.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_13.svg
new file mode 100644
index 0000000..0442293
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_13.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_13.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="175.76845"
+ y="-205.97221"
+ ry="0.33810186"
+ inkscape:transform-center-x="-44.178728"
+ inkscape:transform-center-y="-9.226836"
+ transform="matrix(0.20791169,0.9781476,-0.9781476,0.20791169,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_14.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_14.svg
new file mode 100644
index 0000000..bf78351
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_14.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_14.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="162.68411"
+ y="-223.95502"
+ ry="0.33810186"
+ inkscape:transform-center-x="-44.901174"
+ inkscape:transform-center-y="-4.55836"
+ transform="matrix(0.10452846,0.9945219,-0.9945219,0.10452846,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_15.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_15.svg
new file mode 100644
index 0000000..3e8c402
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_15.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_15.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="147.79175"
+ y="-240.47163"
+ ry="0.33810186"
+ inkscape:transform-center-x="-45.131684"
+ inkscape:transform-center-y="0.16006331"
+ transform="matrix(0,1,-1,0,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_16.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_16.svg
new file mode 100644
index 0000000..d2cd2af
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_16.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_16.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="131.2545"
+ y="-255.34109"
+ ry="0.33810186"
+ inkscape:transform-center-x="-44.867724"
+ inkscape:transform-center-y="4.8767272"
+ transform="matrix(-0.10452846,0.9945219,-0.9945219,-0.10452846,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_17.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_17.svg
new file mode 100644
index 0000000..0c719e8
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_17.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_17.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="113.25357"
+ y="-268.40048"
+ ry="0.33810186"
+ inkscape:transform-center-x="-44.112176"
+ inkscape:transform-center-y="9.5399651"
+ transform="matrix(-0.20791169,0.9781476,-0.9781476,-0.20791169,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_18.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_18.svg
new file mode 100644
index 0000000..32c72f6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_18.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_18.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="93.986176"
+ y="-279.50671"
+ ry="0.33810186"
+ inkscape:transform-center-x="-42.873323"
+ inkscape:transform-center-y="14.098682"
+ transform="matrix(-0.30901699,0.95105652,-0.95105652,-0.30901699,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_19.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_19.svg
new file mode 100644
index 0000000..b37c85c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_19.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_19.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="73.663406"
+ y="-288.53812"
+ ry="0.33810186"
+ inkscape:transform-center-x="-41.164744"
+ inkscape:transform-center-y="18.502927"
+ transform="matrix(-0.40673664,0.91354546,-0.91354546,-0.40673664,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_2.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_2.svg
new file mode 100644
index 0000000..52a594a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_2.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="175.92886"
+ y="25.46183"
+ ry="0.33810186"
+ inkscape:transform-center-x="-9.5399696"
+ inkscape:transform-center-y="-44.112169"
+ transform="matrix(0.9781476,0.20791169,-0.20791169,0.9781476,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_20.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_20.svg
new file mode 100644
index 0000000..e86a080
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_20.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_20.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="52.507931"
+ y="-295.39575"
+ ry="0.33810186"
+ inkscape:transform-center-x="-39.00517"
+ inkscape:transform-center-y="22.70446"
+ transform="matrix(-0.5,0.86602541,-0.86602541,-0.5,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_21.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_21.svg
new file mode 100644
index 0000000..92777ba
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_21.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_21.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="30.751532"
+ y="-300.00446"
+ ry="0.33810186"
+ inkscape:transform-center-x="-36.418231"
+ inkscape:transform-center-y="26.657231"
+ transform="matrix(-0.58778525,0.809017,-0.809017,-0.58778525,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_22.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_22.svg
new file mode 100644
index 0000000..ce8990f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_22.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_22.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="8.632576"
+ y="-302.31375"
+ ry="0.33810186"
+ inkscape:transform-center-x="-33.432288"
+ inkscape:transform-center-y="30.317941"
+ transform="matrix(-0.6691306,0.74314483,-0.74314483,-0.6691306,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_23.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_23.svg
new file mode 100644
index 0000000..775d19c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_23.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_23.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-13.606597"
+ y="-302.29834"
+ ry="0.33810186"
+ inkscape:transform-center-x="-30.080056"
+ inkscape:transform-center-y="33.646485"
+ transform="matrix(-0.74314482,0.66913061,-0.66913061,-0.74314482,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_24.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_24.svg
new file mode 100644
index 0000000..549c48f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_24.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_24.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-35.722332"
+ y="-299.95837"
+ ry="0.33810186"
+ inkscape:transform-center-x="-26.398256"
+ inkscape:transform-center-y="36.60638"
+ transform="matrix(-0.80901699,0.58778526,-0.58778526,-0.80901699,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_25.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_25.svg
new file mode 100644
index 0000000..bd016d3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_25.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_25.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-57.472321"
+ y="-295.31952"
+ ry="0.33810186"
+ inkscape:transform-center-x="-22.427239"
+ inkscape:transform-center-y="39.165222"
+ transform="matrix(-0.8660254,0.50000001,-0.50000001,-0.8660254,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_26.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_26.svg
new file mode 100644
index 0000000..d481659
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_26.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_26.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-78.618271"
+ y="-288.43259"
+ ry="0.33810186"
+ inkscape:transform-center-x="-18.210506"
+ inkscape:transform-center-y="41.294963"
+ transform="matrix(-0.91354545,0.40673665,-0.40673665,-0.91354545,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_27.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_27.svg
new file mode 100644
index 0000000..b6d8af5
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_27.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_27.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-98.928497"
+ y="-279.37302"
+ ry="0.33810186"
+ inkscape:transform-center-x="-13.794247"
+ inkscape:transform-center-y="42.97226"
+ transform="matrix(-0.95105651,0.309017,-0.309017,-0.95105651,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_28.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_28.svg
new file mode 100644
index 0000000..21122d4
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_28.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_28.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-118.18048"
+ y="-268.24008"
+ ry="0.33810186"
+ inkscape:transform-center-x="-9.2268599"
+ inkscape:transform-center-y="44.178747"
+ transform="matrix(-0.9781476,0.2079117,-0.2079117,-0.9781476,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_29.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_29.svg
new file mode 100644
index 0000000..ab99cc3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_29.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_29.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-136.16328"
+ y="-255.15575"
+ ry="0.33810186"
+ inkscape:transform-center-x="-4.5583706"
+ inkscape:transform-center-y="44.901194"
+ transform="matrix(-0.99452189,0.10452847,-0.10452847,-0.99452189,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_3.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_3.svg
new file mode 100644
index 0000000..033130d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_3.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_3.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="187.0351"
+ y="6.1944332"
+ ry="0.33810186"
+ inkscape:transform-center-x="-14.098682"
+ inkscape:transform-center-y="-42.873322"
+ transform="matrix(0.95105652,0.30901699,-0.30901699,0.95105652,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_30.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_30.svg
new file mode 100644
index 0000000..0de0ca7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_30.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_30.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-152.6799"
+ y="-240.26338"
+ ry="0.33810186"
+ inkscape:transform-center-x="0.16004943"
+ inkscape:transform-center-y="45.131705"
+ transform="scale(-1,-1)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_31.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_31.svg
new file mode 100644
index 0000000..1e9544e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_31.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_31.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-167.54936"
+ y="-223.72614"
+ ry="0.33810186"
+ inkscape:transform-center-x="4.8767134"
+ inkscape:transform-center-y="44.867735"
+ transform="matrix(-0.9945219,-0.10452846,0.10452846,-0.9945219,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_32.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_32.svg
new file mode 100644
index 0000000..644ee12
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_32.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_32.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-180.60875"
+ y="-205.7252"
+ ry="0.33810186"
+ inkscape:transform-center-x="9.5399546"
+ inkscape:transform-center-y="44.112188"
+ transform="matrix(-0.9781476,-0.20791169,0.20791169,-0.9781476,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_33.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_33.svg
new file mode 100644
index 0000000..10f1fe3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_33.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_33.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-191.71498"
+ y="-186.45781"
+ ry="0.33810186"
+ inkscape:transform-center-x="14.098677"
+ inkscape:transform-center-y="42.87334"
+ transform="matrix(-0.95105652,-0.30901699,0.30901699,-0.95105652,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_34.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_34.svg
new file mode 100644
index 0000000..b6b76dc
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_34.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_34.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-200.74638"
+ y="-166.13504"
+ ry="0.33810186"
+ inkscape:transform-center-x="18.502928"
+ inkscape:transform-center-y="41.164758"
+ transform="matrix(-0.91354546,-0.40673664,0.40673664,-0.91354546,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_35.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_35.svg
new file mode 100644
index 0000000..15db93b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_35.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_35.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-207.604"
+ y="-144.97957"
+ ry="0.33810186"
+ inkscape:transform-center-x="22.704458"
+ inkscape:transform-center-y="39.005173"
+ transform="matrix(-0.86602541,-0.5,0.5,-0.86602541,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_36.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_36.svg
new file mode 100644
index 0000000..406e0c2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_36.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_36.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-212.21271"
+ y="-123.22317"
+ ry="0.33810186"
+ inkscape:transform-center-x="26.657232"
+ inkscape:transform-center-y="36.418233"
+ transform="matrix(-0.809017,-0.58778525,0.58778525,-0.809017,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_37.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_37.svg
new file mode 100644
index 0000000..6d4808b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_37.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_37.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-214.522"
+ y="-101.10421"
+ ry="0.33810186"
+ inkscape:transform-center-x="30.317942"
+ inkscape:transform-center-y="33.432288"
+ transform="matrix(-0.74314483,-0.6691306,0.6691306,-0.74314483,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_38.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_38.svg
new file mode 100644
index 0000000..9b1c617
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_38.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_38.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-214.50659"
+ y="-78.865036"
+ ry="0.33810186"
+ inkscape:transform-center-x="33.64648"
+ inkscape:transform-center-y="30.080057"
+ transform="matrix(-0.66913061,-0.74314482,0.74314482,-0.66913061,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_39.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_39.svg
new file mode 100644
index 0000000..0ad3381
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_39.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_39.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-212.16664"
+ y="-56.749302"
+ ry="0.33810186"
+ inkscape:transform-center-x="36.606378"
+ inkscape:transform-center-y="26.398266"
+ transform="matrix(-0.58778526,-0.80901699,0.80901699,-0.58778526,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_4.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_4.svg
new file mode 100644
index 0000000..56429dc
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_4.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_4.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="196.0665"
+ y="-14.128333"
+ ry="0.33810186"
+ inkscape:transform-center-x="-18.502929"
+ inkscape:transform-center-y="-41.164745"
+ transform="matrix(0.91354546,0.40673664,-0.40673664,0.91354546,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_40.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_40.svg
new file mode 100644
index 0000000..0f50408
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_40.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_40.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-207.52779"
+ y="-34.999313"
+ ry="0.33810186"
+ inkscape:transform-center-x="39.165211"
+ inkscape:transform-center-y="22.427252"
+ transform="matrix(-0.50000001,-0.8660254,0.8660254,-0.50000001,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_41.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_41.svg
new file mode 100644
index 0000000..13d2cfe
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_41.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_41.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-200.64084"
+ y="-13.853366"
+ ry="0.33810186"
+ inkscape:transform-center-x="41.294948"
+ inkscape:transform-center-y="18.210509"
+ transform="matrix(-0.40673665,-0.91354545,0.91354545,-0.40673665,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_42.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_42.svg
new file mode 100644
index 0000000..604c4cb
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_42.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_42.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-191.58127"
+ y="6.4568601"
+ ry="0.33810186"
+ inkscape:transform-center-x="42.972247"
+ inkscape:transform-center-y="13.794251"
+ transform="matrix(-0.309017,-0.95105651,0.95105651,-0.309017,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_43.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_43.svg
new file mode 100644
index 0000000..3ce6918
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_43.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_43.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-180.44833"
+ y="25.708841"
+ ry="0.33810186"
+ inkscape:transform-center-x="44.178731"
+ inkscape:transform-center-y="9.2268642"
+ transform="matrix(-0.2079117,-0.9781476,0.9781476,-0.2079117,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_44.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_44.svg
new file mode 100644
index 0000000..f585fc8
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_44.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_44.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-167.364"
+ y="43.69165"
+ ry="0.33810186"
+ inkscape:transform-center-x="44.901186"
+ inkscape:transform-center-y="4.5583765"
+ transform="matrix(-0.10452847,-0.99452189,0.99452189,-0.10452847,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_45.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_45.svg
new file mode 100644
index 0000000..0db4bd6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_45.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_45.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-152.47163"
+ y="60.208263"
+ ry="0.33810186"
+ inkscape:transform-center-x="45.131692"
+ inkscape:transform-center-y="-0.16004275"
+ transform="matrix(0,-1,1,0,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_46.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_46.svg
new file mode 100644
index 0000000..4da739a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_46.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_46.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-135.93439"
+ y="75.077721"
+ ry="0.33810186"
+ inkscape:transform-center-x="44.867724"
+ inkscape:transform-center-y="-4.8767176"
+ transform="matrix(0.10452846,-0.9945219,0.9945219,0.10452846,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_47.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_47.svg
new file mode 100644
index 0000000..3a64bd9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_47.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_47.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-117.93346"
+ y="88.137108"
+ ry="0.33810186"
+ inkscape:transform-center-x="44.112179"
+ inkscape:transform-center-y="-9.5399581"
+ transform="matrix(0.20791169,-0.9781476,0.9781476,0.20791169,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_48.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_48.svg
new file mode 100644
index 0000000..1e327fb
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_48.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_48.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-98.666061"
+ y="99.243347"
+ ry="0.33810186"
+ inkscape:transform-center-x="42.873328"
+ inkscape:transform-center-y="-14.098673"
+ transform="matrix(0.30901699,-0.95105652,0.95105652,0.30901699,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_49.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_49.svg
new file mode 100644
index 0000000..a8ee213
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_49.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_49.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-78.3433"
+ y="108.27475"
+ ry="0.33810186"
+ inkscape:transform-center-x="41.164754"
+ inkscape:transform-center-y="-18.502919"
+ transform="matrix(0.40673664,-0.91354546,0.91354546,0.40673664,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_5.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_5.svg
new file mode 100644
index 0000000..0089db4
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_5.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_5.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="202.92412"
+ y="-35.283806"
+ ry="0.33810186"
+ inkscape:transform-center-x="-22.704454"
+ inkscape:transform-center-y="-39.005156"
+ transform="matrix(0.86602541,0.5,-0.5,0.86602541,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_50.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_50.svg
new file mode 100644
index 0000000..8054684
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_50.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_50.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-57.187824"
+ y="115.13237"
+ ry="0.33810186"
+ inkscape:transform-center-x="39.005168"
+ inkscape:transform-center-y="-22.704448"
+ transform="matrix(0.5,-0.86602541,0.86602541,0.5,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_51.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_51.svg
new file mode 100644
index 0000000..93aaf1c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_51.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_51.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-35.431427"
+ y="119.74107"
+ ry="0.33810186"
+ inkscape:transform-center-x="36.418235"
+ inkscape:transform-center-y="-26.657221"
+ transform="matrix(0.58778525,-0.809017,0.809017,0.58778525,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_52.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_52.svg
new file mode 100644
index 0000000..bb69fb3
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_52.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_52.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="-13.312471"
+ y="122.05037"
+ ry="0.33810186"
+ inkscape:transform-center-x="33.432294"
+ inkscape:transform-center-y="-30.317933"
+ transform="matrix(0.6691306,-0.74314483,0.74314483,0.6691306,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_53.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_53.svg
new file mode 100644
index 0000000..cc62002
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_53.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_53.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="8.9267015"
+ y="122.03496"
+ ry="0.33810186"
+ inkscape:transform-center-x="30.080059"
+ inkscape:transform-center-y="-33.646472"
+ transform="matrix(0.74314482,-0.66913061,0.66913061,0.74314482,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_54.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_54.svg
new file mode 100644
index 0000000..564ac1d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_54.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_54.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="31.042435"
+ y="119.695"
+ ry="0.33810186"
+ inkscape:transform-center-x="26.398263"
+ inkscape:transform-center-y="-36.606376"
+ transform="matrix(0.80901699,-0.58778526,0.58778526,0.80901699,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_55.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_55.svg
new file mode 100644
index 0000000..ad00b96
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_55.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_55.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="52.792423"
+ y="115.05614"
+ ry="0.33810186"
+ inkscape:transform-center-x="22.427242"
+ inkscape:transform-center-y="-39.165213"
+ transform="matrix(0.8660254,-0.50000001,0.50000001,0.8660254,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_56.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_56.svg
new file mode 100644
index 0000000..d4289ef
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_56.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_56.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="73.93837"
+ y="108.1692"
+ ry="0.33810186"
+ inkscape:transform-center-x="18.210504"
+ inkscape:transform-center-y="-41.294945"
+ transform="matrix(0.91354545,-0.40673665,0.40673665,0.91354545,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_57.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_57.svg
new file mode 100644
index 0000000..1bc4ad4
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_57.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_57.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="94.248596"
+ y="99.109627"
+ ry="0.33810186"
+ inkscape:transform-center-x="13.794248"
+ inkscape:transform-center-y="-42.972244"
+ transform="matrix(0.95105651,-0.309017,0.309017,0.95105651,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_58.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_58.svg
new file mode 100644
index 0000000..e93b706
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_58.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_58.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="113.50058"
+ y="87.976692"
+ ry="0.33810186"
+ inkscape:transform-center-x="9.2268556"
+ inkscape:transform-center-y="-44.178728"
+ transform="matrix(0.9781476,-0.2079117,0.2079117,0.9781476,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_59.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_59.svg
new file mode 100644
index 0000000..8680cce
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_59.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_59.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="131.48338"
+ y="74.892365"
+ ry="0.33810186"
+ inkscape:transform-center-x="4.5583813"
+ inkscape:transform-center-y="-44.90118"
+ transform="matrix(0.99452189,-0.10452847,0.10452847,0.99452189,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_6.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_6.svg
new file mode 100644
index 0000000..9dc0882
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_6.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_6.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="207.53282"
+ y="-57.040207"
+ ry="0.33810186"
+ inkscape:transform-center-x="-26.657225"
+ inkscape:transform-center-y="-36.418224"
+ transform="matrix(0.809017,0.58778525,-0.58778525,0.809017,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_7.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_7.svg
new file mode 100644
index 0000000..ae6dbd6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_7.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_7.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="209.84212"
+ y="-79.159164"
+ ry="0.33810186"
+ inkscape:transform-center-x="-30.317935"
+ inkscape:transform-center-y="-33.432285"
+ transform="matrix(0.74314483,0.6691306,-0.6691306,0.74314483,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_8.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_8.svg
new file mode 100644
index 0000000..284be20
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_8.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_8.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="209.82671"
+ y="-101.39834"
+ ry="0.33810186"
+ inkscape:transform-center-x="-33.646478"
+ inkscape:transform-center-y="-30.08005"
+ transform="matrix(0.66913061,0.74314482,-0.74314482,0.66913061,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/m_9.svg b/skins/blackhole/themes/default/skinparts/watchhands/m_9.svg
new file mode 100644
index 0000000..831d712
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/m_9.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="m_9.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.3897849"
+ inkscape:cx="145"
+ inkscape:cy="159"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect4809"
+ width="4.9999943"
+ height="89.999992"
+ x="207.48676"
+ y="-123.51407"
+ ry="0.33810186"
+ inkscape:transform-center-x="-36.606382"
+ inkscape:transform-center-y="-26.398246"
+ transform="matrix(0.58778526,0.80901699,-0.80901699,0.58778526,0,0)" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_0.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_0.svg
new file mode 100644
index 0000000..21cb0f7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_0.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_0.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="30.031693"
+ x="148.98105"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.99999998,-2.1071537e-4,2.1071537e-4,0.99999998,0,0)"
+ inkscape:transform-center-x="-0.22827304"
+ inkscape:transform-center-y="-59.824822" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_1.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_1.svg
new file mode 100644
index 0000000..1ee8c87
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_1.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_1.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="13.506389"
+ x="163.82228"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.9945439,0.1043189,-0.1043189,0.9945439,0,0)"
+ inkscape:transform-center-x="-6.4804172"
+ inkscape:transform-center-y="-59.473235" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_10.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_10.svg
new file mode 100644
index 0000000..4ea8b4a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_10.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_10.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-175.00835"
+ x="203.64046"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.50018246,0.86592003,-0.86592003,0.50018246,0,0)"
+ inkscape:transform-center-x="-51.92395"
+ inkscape:transform-center-y="-29.71473" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_11.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_11.svg
new file mode 100644
index 0000000..560667c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_11.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_11.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-196.12389"
+ x="196.74974"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.40692912,0.91345974,-0.91345974,0.40692912,0,0)"
+ inkscape:transform-center-x="-54.745543"
+ inkscape:transform-center-y="-24.12442" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_12.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_12.svg
new file mode 100644
index 0000000..90c20b9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_12.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_12.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-216.40347"
+ x="187.68961"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.30921738,0.95099138,-0.95099138,0.30921738,0,0)"
+ inkscape:transform-center-x="-56.96733"
+ inkscape:transform-center-y="-18.269791" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_13.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_13.svg
new file mode 100644
index 0000000..ce12797
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_13.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_13.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-235.62492"
+ x="176.5593"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.20811779,0.97810377,-0.97810377,0.20811779,0,0)"
+ inkscape:transform-center-x="-58.564969"
+ inkscape:transform-center-y="-12.215005" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_14.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_14.svg
new file mode 100644
index 0000000..2374b55
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_14.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_14.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-253.57765"
+ x="163.48077"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.10473802,0.99449985,-0.99449985,0.10473802,0,0)"
+ inkscape:transform-center-x="-59.520968"
+ inkscape:transform-center-y="-6.0263875" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_15.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_15.svg
new file mode 100644
index 0000000..7370a78
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_15.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_15.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-270.06494"
+ x="148.59734"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(2.1071313e-4,0.99999998,-0.99999998,2.1071313e-4,0,0)"
+ inkscape:transform-center-x="-59.824828"
+ inkscape:transform-center-y="0.22826732" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_16.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_16.svg
new file mode 100644
index 0000000..1c887f1
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_16.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_16.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-284.90619"
+ x="132.07205"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.1043189,0.9945439,-0.9945439,-0.1043189,0,0)"
+ inkscape:transform-center-x="-59.473252"
+ inkscape:transform-center-y="6.4804324" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_17.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_17.svg
new file mode 100644
index 0000000..24e8653
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_17.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_17.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-297.93875"
+ x="114.08595"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.20770558,0.97819139,-0.97819139,-0.20770558,0,0)"
+ inkscape:transform-center-x="-58.470054"
+ inkscape:transform-center-y="12.661587" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_18.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_18.svg
new file mode 100644
index 0000000..e69531b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_18.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_18.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-309.01987"
+ x="94.836098"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.30881659,0.95112161,-0.95112161,-0.30881659,0,0)"
+ inkscape:transform-center-x="-56.826255"
+ inkscape:transform-center-y="18.704008" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_19.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_19.svg
new file mode 100644
index 0000000..0b2a3a9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_19.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_19.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-318.02811"
+ x="74.533409"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.40654414,0.91363114,-0.91363114,-0.40654414,0,0)"
+ inkscape:transform-center-x="-54.55984"
+ inkscape:transform-center-y="24.541503" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_2.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_2.svg
new file mode 100644
index 0000000..a9e0bcd
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_2.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_2.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-4.4797187"
+ x="176.85484"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.97819139,0.20770558,-0.20770558,0.97819139,0,0)"
+ inkscape:transform-center-x="-12.661557"
+ inkscape:transform-center-y="-58.470047" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_20.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_20.svg
new file mode 100644
index 0000000..ff2f8df
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_20.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_20.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-324.86481"
+ x="53.400318"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.49981751,0.86613074,-0.86613074,-0.49981751,0,0)"
+ inkscape:transform-center-x="-51.695675"
+ inkscape:transform-center-y="30.11012" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_21.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_21.svg
new file mode 100644
index 0000000..e697370
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_21.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_21.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-329.45505"
+ x="31.668369"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.58761477,0.80914083,-0.80914083,-0.58761477,0,0)"
+ inkscape:transform-center-x="-48.265121"
+ inkscape:transform-center-y="35.348847" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_22.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_22.svg
new file mode 100644
index 0000000..15f97e2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_22.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_22.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-331.74854"
+ x="9.5756598"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.668974,0.7432858,-0.7432858,-0.668974,0,0)"
+ inkscape:transform-center-x="-44.305763"
+ inkscape:transform-center-y="40.200285" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_23.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_23.svg
new file mode 100644
index 0000000..10f9955
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_23.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_23.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-331.72012"
+ x="-12.635757"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.74300382,0.66928718,-0.66928718,-0.74300382,0,0)"
+ inkscape:transform-center-x="-39.860969"
+ inkscape:transform-center-y="44.61127" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_24.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_24.svg
new file mode 100644
index 0000000..3421f9b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_24.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_24.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-329.37015"
+ x="-34.72253"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.80889313,0.58795571,-0.58795571,-0.80889313,0,0)"
+ inkscape:transform-center-x="-34.979457"
+ inkscape:transform-center-y="48.533486" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_25.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_25.svg
new file mode 100644
index 0000000..7a658a7
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_25.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_25.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-324.72437"
+ x="-56.442673"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.86592003,0.50018247,-0.50018247,-0.86592003,0,0)"
+ inkscape:transform-center-x="-29.714712"
+ inkscape:transform-center-y="51.92397" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_26.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_26.svg
new file mode 100644
index 0000000..495212f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_26.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_26.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-317.83365"
+ x="-77.558212"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.91345973,0.40692913,-0.40692913,-0.91345973,0,0)"
+ inkscape:transform-center-x="-24.124401"
+ inkscape:transform-center-y="54.745555" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_27.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_27.svg
new file mode 100644
index 0000000..96d565f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_27.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_27.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-308.7735"
+ x="-97.837799"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.95099138,0.30921739,-0.30921739,-0.95099138,0,0)"
+ inkscape:transform-center-x="-18.269773"
+ inkscape:transform-center-y="56.967332" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_28.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_28.svg
new file mode 100644
index 0000000..ee39f1f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_28.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_28.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-297.64319"
+ x="-117.05925"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.97810377,0.2081178,-0.2081178,-0.97810377,0,0)"
+ inkscape:transform-center-x="-12.21498"
+ inkscape:transform-center-y="58.564964" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_29.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_29.svg
new file mode 100644
index 0000000..e58adf0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_29.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_29.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-284.56467"
+ x="-135.01198"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.99449985,0.10473802,-0.10473802,-0.99449985,0,0)"
+ inkscape:transform-center-x="-6.0263649"
+ inkscape:transform-center-y="59.52095" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_3.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_3.svg
new file mode 100644
index 0000000..c1b3b0c
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_3.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_3.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-23.72957"
+ x="187.93596"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.95112161,0.30881659,-0.30881659,0.95112161,0,0)"
+ inkscape:transform-center-x="-18.703982"
+ inkscape:transform-center-y="-56.826248" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_30.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_30.svg
new file mode 100644
index 0000000..6aded60
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_30.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_30.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-269.68121"
+ x="-151.49928"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.99999998,2.1071313e-4,-2.1071313e-4,-0.99999998,0,0)"
+ inkscape:transform-center-x="0.22827386"
+ inkscape:transform-center-y="59.824806" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_31.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_31.svg
new file mode 100644
index 0000000..a8b1998
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_31.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_31.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-253.15591"
+ x="-166.34052"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.9945439,-0.1043189,0.1043189,-0.9945439,0,0)"
+ inkscape:transform-center-x="6.4804204"
+ inkscape:transform-center-y="59.473222" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_32.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_32.svg
new file mode 100644
index 0000000..720797f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_32.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_32.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-235.16982"
+ x="-179.37308"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.97819139,-0.20770558,0.20770558,-0.97819139,0,0)"
+ inkscape:transform-center-x="12.661572"
+ inkscape:transform-center-y="58.47004" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_33.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_33.svg
new file mode 100644
index 0000000..becfb21
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_33.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_33.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-215.91997"
+ x="-190.45419"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.95112161,-0.30881659,0.30881659,-0.95112161,0,0)"
+ inkscape:transform-center-x="18.703994"
+ inkscape:transform-center-y="56.826245" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_34.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_34.svg
new file mode 100644
index 0000000..6026629
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_34.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_34.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-195.61728"
+ x="-199.46245"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.91363114,-0.40654414,0.40654414,-0.91363114,0,0)"
+ inkscape:transform-center-x="24.541491"
+ inkscape:transform-center-y="54.559847" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_35.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_35.svg
new file mode 100644
index 0000000..1d7d4f4
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_35.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_35.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-174.48419"
+ x="-206.29915"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.86613074,-0.49981751,0.49981751,-0.86613074,0,0)"
+ inkscape:transform-center-x="30.110104"
+ inkscape:transform-center-y="51.695683" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_36.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_36.svg
new file mode 100644
index 0000000..ab3120f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_36.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_36.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-152.75224"
+ x="-210.88939"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.80914083,-0.58761477,0.58761477,-0.80914083,0,0)"
+ inkscape:transform-center-x="35.348823"
+ inkscape:transform-center-y="48.265129" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_37.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_37.svg
new file mode 100644
index 0000000..c5e13b9
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_37.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_37.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-130.65953"
+ x="-213.18288"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.7432858,-0.668974,0.668974,-0.7432858,0,0)"
+ inkscape:transform-center-x="40.200252"
+ inkscape:transform-center-y="44.305771" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_38.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_38.svg
new file mode 100644
index 0000000..bf8ea2a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_38.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_38.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-108.44811"
+ x="-213.15448"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.66928718,-0.74300382,0.74300382,-0.66928718,0,0)"
+ inkscape:transform-center-x="44.611243"
+ inkscape:transform-center-y="39.860992" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_39.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_39.svg
new file mode 100644
index 0000000..7126aa6
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_39.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_39.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-86.361343"
+ x="-210.8045"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.58795571,-0.80889313,0.80889313,-0.58795571,0,0)"
+ inkscape:transform-center-x="48.533472"
+ inkscape:transform-center-y="34.979482" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_4.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_4.svg
new file mode 100644
index 0000000..4f22687
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_4.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_4.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-44.032261"
+ x="196.94421"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.91363114,0.40654414,-0.40654414,0.91363114,0,0)"
+ inkscape:transform-center-x="-24.541481"
+ inkscape:transform-center-y="-54.559848" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_40.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_40.svg
new file mode 100644
index 0000000..4fab092
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_40.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_40.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-64.641205"
+ x="-206.15871"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.50018247,-0.86592003,0.86592003,-0.50018247,0,0)"
+ inkscape:transform-center-x="51.923956"
+ inkscape:transform-center-y="29.714727" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_41.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_41.svg
new file mode 100644
index 0000000..34235c0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_41.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_41.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-43.525669"
+ x="-199.26799"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.40692913,-0.91345973,0.91345973,-0.40692913,0,0)"
+ inkscape:transform-center-x="54.745548"
+ inkscape:transform-center-y="24.124414" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_42.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_42.svg
new file mode 100644
index 0000000..415778b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_42.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_42.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-23.24608"
+ x="-190.20786"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.30921739,-0.95099138,0.95099138,-0.30921739,0,0)"
+ inkscape:transform-center-x="56.967331"
+ inkscape:transform-center-y="18.269797" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_43.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_43.svg
new file mode 100644
index 0000000..b011837
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_43.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_43.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-4.0246282"
+ x="-179.07755"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.2081178,-0.97810377,0.97810377,-0.2081178,0,0)"
+ inkscape:transform-center-x="58.564972"
+ inkscape:transform-center-y="12.214999" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_44.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_44.svg
new file mode 100644
index 0000000..dfe5902
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_44.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_44.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="13.928093"
+ x="-165.99902"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-0.10473802,-0.99449985,0.99449985,-0.10473802,0,0)"
+ inkscape:transform-center-x="59.520963"
+ inkscape:transform-center-y="6.0263756" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_45.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_45.svg
new file mode 100644
index 0000000..815d091
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_45.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_45.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="30.41539"
+ x="-151.11559"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(-2.1071313e-4,-0.99999998,0.99999998,-2.1071313e-4,0,0)"
+ inkscape:transform-center-x="59.824829"
+ inkscape:transform-center-y="-0.22826621" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_46.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_46.svg
new file mode 100644
index 0000000..904f469
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_46.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_46.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="45.256626"
+ x="-134.59029"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.1043189,-0.9945439,0.9945439,0.1043189,0,0)"
+ inkscape:transform-center-x="59.47324"
+ inkscape:transform-center-y="-6.4804095" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_47.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_47.svg
new file mode 100644
index 0000000..67136e0
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_47.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_47.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="58.289196"
+ x="-116.60418"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.20770558,-0.97819139,0.97819139,0.20770558,0,0)"
+ inkscape:transform-center-x="58.470051"
+ inkscape:transform-center-y="-12.661554" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_48.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_48.svg
new file mode 100644
index 0000000..63f5847
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_48.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_48.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="69.370308"
+ x="-97.354324"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.30881659,-0.95112161,0.95112161,0.30881659,0,0)"
+ inkscape:transform-center-x="56.826254"
+ inkscape:transform-center-y="-18.703981" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_49.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_49.svg
new file mode 100644
index 0000000..4c8d944
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_49.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_49.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="78.378563"
+ x="-77.051636"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.40654414,-0.91363114,0.91363114,0.40654414,0,0)"
+ inkscape:transform-center-x="54.559855"
+ inkscape:transform-center-y="-24.541477" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_5.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_5.svg
new file mode 100644
index 0000000..42466bb
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_5.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_5.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-65.165352"
+ x="203.78091"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.86613074,0.49981751,-0.49981751,0.86613074,0,0)"
+ inkscape:transform-center-x="-30.110102"
+ inkscape:transform-center-y="-51.695679" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_50.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_50.svg
new file mode 100644
index 0000000..622b614
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_50.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_50.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="85.215256"
+ x="-55.918545"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.49981751,-0.86613074,0.86613074,0.49981751,0,0)"
+ inkscape:transform-center-x="51.695689"
+ inkscape:transform-center-y="-30.110096" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_51.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_51.svg
new file mode 100644
index 0000000..4accac5
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_51.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_51.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="89.805489"
+ x="-34.186596"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.58761477,-0.80914083,0.80914083,0.58761477,0,0)"
+ inkscape:transform-center-x="48.265134"
+ inkscape:transform-center-y="-35.348821" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_52.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_52.svg
new file mode 100644
index 0000000..ed2155b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_52.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_52.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="92.098969"
+ x="-12.093886"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.668974,-0.7432858,0.7432858,0.668974,0,0)"
+ inkscape:transform-center-x="44.305776"
+ inkscape:transform-center-y="-40.200258" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_53.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_53.svg
new file mode 100644
index 0000000..e47e57a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_53.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_53.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="92.070572"
+ x="10.117531"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.74300382,-0.66928718,0.66928718,0.74300382,0,0)"
+ inkscape:transform-center-x="39.860991"
+ inkscape:transform-center-y="-44.611248" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_54.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_54.svg
new file mode 100644
index 0000000..1867c67
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_54.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_54.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="89.720604"
+ x="32.204304"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.80889313,-0.58795571,0.58795571,0.80889313,0,0)"
+ inkscape:transform-center-x="34.979481"
+ inkscape:transform-center-y="-48.53347" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_55.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_55.svg
new file mode 100644
index 0000000..d20310d
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_55.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_55.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="85.074814"
+ x="53.924442"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.86592003,-0.50018247,0.50018247,0.86592003,0,0)"
+ inkscape:transform-center-x="29.714731"
+ inkscape:transform-center-y="-51.923948" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_56.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_56.svg
new file mode 100644
index 0000000..c77f1e5
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_56.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_56.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="78.184097"
+ x="75.039978"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.91345973,-0.40692913,0.40692913,0.91345973,0,0)"
+ inkscape:transform-center-x="24.124422"
+ inkscape:transform-center-y="-54.74554" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_57.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_57.svg
new file mode 100644
index 0000000..ce5d81a
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_57.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_57.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="69.123955"
+ x="95.319565"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.95099138,-0.30921739,0.30921739,0.95099138,0,0)"
+ inkscape:transform-center-x="18.2698"
+ inkscape:transform-center-y="-56.967327" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_58.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_58.svg
new file mode 100644
index 0000000..7011250
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_58.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_58.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="57.993652"
+ x="114.54102"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.97810377,-0.2081178,0.2081178,0.97810377,0,0)"
+ inkscape:transform-center-x="12.215002"
+ inkscape:transform-center-y="-58.564969" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_59.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_59.svg
new file mode 100644
index 0000000..50d3798
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_59.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_59.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="43.692689"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1846"
+ inkscape:window-height="1058"
+ inkscape:window-x="66"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="44.915134"
+ x="132.49374"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.99449985,-0.10473802,0.10473802,0.99449985,0,0)"
+ inkscape:transform-center-x="6.0263817"
+ inkscape:transform-center-y="-59.520957" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_6.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_6.svg
new file mode 100644
index 0000000..f0b6c4e
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_6.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_6.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-86.897301"
+ x="208.37114"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.80914083,0.58761478,-0.58761478,0.80914083,0,0)"
+ inkscape:transform-center-x="-35.348818"
+ inkscape:transform-center-y="-48.265125" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_7.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_7.svg
new file mode 100644
index 0000000..39d480b
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_7.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_7.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-108.99001"
+ x="210.66463"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.7432858,0.66897401,-0.66897401,0.7432858,0,0)"
+ inkscape:transform-center-x="-40.200259"
+ inkscape:transform-center-y="-44.305764" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_8.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_8.svg
new file mode 100644
index 0000000..c6059c2
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_8.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_8.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-131.20143"
+ x="210.63623"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.66928717,0.74300382,-0.74300382,0.66928717,0,0)"
+ inkscape:transform-center-x="-44.611252"
+ inkscape:transform-center-y="-39.860979" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/skinparts/watchhands/s_9.svg b/skins/blackhole/themes/default/skinparts/watchhands/s_9.svg
new file mode 100644
index 0000000..9de138f
--- /dev/null
+++ b/skins/blackhole/themes/default/skinparts/watchhands/s_9.svg
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="300"
+ height="300"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.91pre2 r13516"
+ viewBox="0 0 299.99999 300"
+ sodipodi:docname="s_9.svg">
+ <defs
+ id="defs4" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="2.1480363"
+ inkscape:cx="151"
+ inkscape:cy="166.12166"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer5"
+ showgrid="false"
+ units="px"
+ inkscape:window-width="1531"
+ inkscape:window-height="878"
+ inkscape:window-x="61"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Zeiger"
+ style="display:inline">
+ <rect
+ ry="0.33689189"
+ y="-153.28821"
+ x="208.28625"
+ height="119.99999"
+ width="2.9999931"
+ id="rect4663"
+ style="opacity:1;fill:#ff0000;fill-opacity:1;stroke:#ffffff;stroke-width:0;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ transform="matrix(0.5879557,0.80889313,-0.80889313,0.5879557,0,0)"
+ inkscape:transform-center-x="-48.533475"
+ inkscape:transform-center-y="-34.979477" />
+ </g>
+</svg>
diff --git a/skins/blackhole/themes/default/theme.xml b/skins/blackhole/themes/default/theme.xml
new file mode 100644
index 0000000..753336b
--- /dev/null
+++ b/skins/blackhole/themes/default/theme.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE globals SYSTEM "../../../../dtd/globals.dtd">
+
+<globals>
+ <!--
+ define all your needed colors here
+ -->
+ <colors>
+ <color name="clrTransparent">00000000</color>
+ <color name="clrRed">FFFF0000</color>
+ <color name="clrGreen">FF5FE200</color>
+ <color name="clrYellow">FFE2DA00</color>
+ <color name="clrBlue">FF007FE2</color>
+ <color name="clrWhite">FFFFFFFF</color>
+ <color name="clrGray">FF999999</color>
+ <color name="clrRedTrans">55FF0000</color>
+ <color name="clrBlackTrans">99000000</color>
+ </colors>
+ <!--
+ these variables can be used everywhere in the templates
+ variabls of type int can also be used as conditions, just
+ set such a variable to 1 for true and 0 for false
+ -->
+ <variables>
+ </variables>
+ <!--
+ The three Fonts FontOSD, FontFix and FontSml configured in VDR
+ can be used in all template "font" attributes with this tokens:
+ {vdrOsd}
+ {vdrFix}
+ {vdrSml}
+ If you like to use further fonts, just define them below.
+ Syntax:
+ <font name="tokenname">fontname</font>
+ These fonts can then also be used in all templates in the "font"
+ attribute.
+ if an invalid font is used in a template, vdrOsd is used as default.
+ -->
+ <fonts>
+ <font name="light">Source Sans Pro:Light</font>
+ <font name="bold">Source Sans Pro:Bold</font>
+ <font name="semibold">Source Sans Pro:Semibold</font>
+ <font name="regular">Source Sans Pro:Regular</font>
+ <font name="digital">DS-Digital:Normal</font>
+ </fonts>
+</globals>
diff --git a/skins/blackhole/xmlfiles/displayaudiotracks.xml b/skins/blackhole/xmlfiles/displayaudiotracks.xml
new file mode 100644
index 0000000..86ab2e1
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displayaudiotracks.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayaudiotracks SYSTEM "../../../dtd/displayaudiotracks.dtd">
+
+<displayaudiotracks x="25%" y="0" width="50%" height="100%" fadetime="{fadetime}">
+ <!-- Available Variables background:
+ {numtracks} number of displayed tracks
+ -->
+ <background>
+ <area x="0" y="{areaheight} - {numtracks} * {areaheight} / 10 - {areaheight} / 10" width="100%" height="{areaheight} / 10 + {areaheight} / 10 * {numtracks}" layer="1">
+ <fill color="{clrBlackTrans}" />
+ </area>
+ </background>
+
+ <!-- Available Variables header:
+ {numtracks} number of displayed tracks
+ {title} title of menu
+ -->
+ <header>
+ <area x="0" y="{areaheight} - {numtracks} * {areaheight} / 10 - {areaheight} / 10" width="100%" height="{areaheight} / 10" layer="2">
+ <drawtext align="center" valign="center" font="{semibold}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ </area>
+ </header>
+
+ <!-- Available Variables header:
+ {numelements} number of displayed tracks
+ -->
+ <menuitems x="0" y="{areaheight} - {numelements} * {areaheight} / 10" orientation="vertical" width="100%" height="{numelements} * {areaheight} / 10" align="top" numlistelements="{numelements}">
+ <!-- Available Variables auidotrack listelement:
+ {current} true if item is currently selected
+ {title} title of auio track
+ -->
+ <listelement>
+ <area x="1%" width="98%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="0" width="{areawidth}" height="{areaheight}*0.98"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="0" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <area x="1%" width="98%" layer="3">
+ <drawtext x="10" valign="center" font="{regular}" fontsize="60%" color="{clrWhite}" text="{title}" />
+ </area>
+ </listelement>
+ </menuitems>
+
+</displayaudiotracks>
diff --git a/skins/blackhole/xmlfiles/displaychannel.xml b/skins/blackhole/xmlfiles/displaychannel.xml
new file mode 100644
index 0000000..83a7f7d
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaychannel.xml
@@ -0,0 +1,298 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaychannel SYSTEM "../../../dtd/displaychannel.dtd">
+
+<displaychannel x="0" y="0" width="100%" height="100%" fadetime="{fadetime}">
+
+ <background>
+ <!-- global background -->
+ <area x="0" y="70%" width="100%" height="30%" layer="1">
+ <drawimage imagetype="skinpart" path="displaychannelback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <!-- epg background -->
+ <area x="17%" y="80%" width="67%" height="14%" layer="2">
+ <drawimage imagetype="skinpart" path="displaychannelbackepg" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <!-- channel logo background -->
+ <area x="1%" y="77%" width="14%" height="20%" layer="2">
+ <drawimage imagetype="skinpart" path="displaychannellogoback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <!-- watch background -->
+ <area x="86%" y="77%" width="{areaheight}*0.18" height="{areaheight}*0.18" layer="2">
+ <drawimage imagetype="skinpart" path="watchback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+
+ <!-- Available Variables channelinfo:
+ {channelnumber} Number of Channel, with "-" in case of channel switching
+ {channelname} Name of current Channel
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {switching} true if a number is pressed on the remote to switch to a dedicated channel
+ -->
+ <channelinfo>
+ <area x="17%" y="74%" width="67%" height="6%" layer="2">
+ <drawtext x="0" y="0" font="{semibold}" fontsize="100%" color="{clrWhite}" text="{channelnumber} {channelname}" />
+ </area>
+ <area x="2%" y="78%" width="12%" height="18%" layer="3">
+ <drawimage cache="true" imagetype="channellogo" path="{channelid}" width="100%" height="100%" align="center" valign="center"/>
+ </area>
+ </channelinfo>
+
+ <!-- Available Variables epginfo:
+ {currenttitle} Title of the current Schedule
+ {currentsubtitle} Subtitle of the current Schedule
+ {currentstart} Start of current Schedule in hh:mm
+ {currentstop} End of current Schedule in hh:mm
+ {currentduration} Duration of current Schedule in min
+ {currentdurationhours} Duration, full hours
+ {currentdurationminutes} Duration, rest of minutes
+ {currentelapsed} Elapsed time of current Schedule in min
+ {currentremaining} Remaining time of current Schedule in min
+ {currentrecording} true if current Schedule is recorded
+ {hasVPS} true if current Schedule has VPS
+ {nexttitle} Title of next Schedule
+ {nextsubtitle} Subtitle of next Schedule
+ {nextstart} Start of next Schedule in hh:mm
+ {nextstop} Stop of next Schedule in hh:mm
+ {nextduration} Duration of next Schedule in min
+ {nextdurationhours} Duration, full hours
+ {nextdurationminutes} Duration, rest of minutes
+ {nextrecording} true if next Schedule will be recorded
+ -->
+ <epginfo>
+ <area x="17%" y="80%" width="66%" height="7%" layer="3">
+ <drawtext name="starttime" x="1%" valign="center" font="{regular}" fontsize="80%" color="{clrWhite}" text="{currentstart}" />
+ <drawtext align="right" name="elapsed" valign="center" font="{regular}" fontsize="75%" color="{clrWhite}" text="{currentelapsed}/{currentduration}min" />
+ <drawtext x="{width(starttime)} + 40" y="0" width="{areawidth} - {width(starttime)} - {width(elapsed)} - 45" font="{regular}" fontsize="70%" color="{clrWhite}" text="{currenttitle}" />
+ <drawtext x="{width(starttime)} + 40" y="56%" width="{areawidth} - {width(starttime)} - {width(elapsed)} - 45" font="{regular}" fontsize="45%" color="{clrWhite}" text="{currentsubtitle}" />
+ </area>
+ <area x="17%" y="87%" width="66%" height="7%" layer="3">
+ <drawtext name="starttime" x="1%" valign="center" font="{regular}" fontsize="80%" color="{clrGray}" text="{nextstart}" />
+ <drawtext align="right" name="duration" valign="center" font="{regular}" fontsize="75%" color="{clrGray}" text="{nextduration}min" />
+ <drawtext x="{width(starttime)} + 40" y="0" width="{areawidth} - {width(starttime)} - {width(duration)} - 45" font="{regular}" fontsize="70%" color="{clrGray}" text="{nexttitle}" />
+ <drawtext x="{width(starttime)} + 40" y="55%" width="{areawidth} - {width(starttime)} - {width(duration)} - 45" font="{regular}" fontsize="40%" color="{clrGray}" text="{nextsubtitle}" />
+ </area>
+ </epginfo>
+
+ <!-- Available Variables progressbar:
+ {start} Start of current Schedule in hh:mm
+ {stop} End of current Schedule in hh:mm
+ {duration} Total Duration of current Schedule in seconds
+ {elapsed} Elapsed time of current Schedule in seconds
+ {remaining} Remaining time of current Schedule in seconds
+ -->
+ <progressbar>
+ <area x="67%" y="72%" width="30%" height="2%" layer="4">
+ <drawimage imagetype="skinpart" path="progressbar" x="{areaheight}/2" y="0" width="{elapsed}/{duration}*{areawidth} - {elapsed}/{duration}*{areaheight}" height="100%"/>
+ </area>
+ <area x="67%" y="72%" width="30%" height="2%" layer="5">
+ <drawimage imagetype="skinpart" path="progressbarend" x="{areaheight}/2 + {elapsed}/{duration}*{areawidth} - {elapsed}/{duration}*{areaheight} - 1" y="0" width="{areaheight}/2" height="100%"/>
+ </area>
+ </progressbar>
+
+ <progressbarback>
+ <area x="67%" y="72%" width="30%" height="2%" layer="3">
+ <drawimage imagetype="skinpart" path="progressbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </progressbarback>
+
+ <!-- Available Variables statusinfo:
+ {isRadio} true if channel is a radio channel
+ {hasVT} true if channel has video text
+ {isStereo} true if a stereo audio trac is available
+ {isDolby} true if a dolby audio track is available
+ {isEncrypted} true if channel is encrypted
+ {isRecording} true if currently a recording is running on this channel
+ {newmails} true if mailbox plugin is installed and new mails are available
+ -->
+ <statusinfo>
+ <area x="17%" y="95%" width="67%" height="4%" layer="3">
+ <drawimage condition="{isDolby}" imagetype="icon" path="ico_dolby" x="{areaheight}*6 + 20" y="0" width="{areaheight}*3" height="{areaheight}"/>
+ <drawimage condition="{hasVT}" imagetype="icon" path="ico_videotext" x="{areaheight}*9 + 30" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{isEncrypted}" imagetype="icon" path="ico_crypted" x="{areaheight}*10 + 40" y="0" width="{areaheight}*2" height="{areaheight}"/>
+ <drawimage condition="{isRecording}" imagetype="icon" path="ico_rec_on" x="{areaheight}*12 + 50" y="0" width="{areaheight}" height="{areaheight}"/>
+ </area>
+ </statusinfo>
+
+ <!-- Available Variables audioinfo:
+ {numaudiotracks} number of available audio tracks for current channel
+ {audiochannel} 0 if current channel is stereo, 1 for left chanel only, 2 for right channel only
+ {trackdesc} description of the current audio track
+ {tracklang} language of the current audio track
+ -->
+ <audioinfo>
+ </audioinfo>
+
+ <!-- Available Variables screenresolution:
+ {screenwidth} width of currently displayed channel in px
+ {screenheight} height of currently displayed channel in px
+ {resolution} resolution: hd1080i, hd720p, sd576i
+ {aspect} screen aspect, each 4:3, 16:9 or 21:9
+ {isHD} true for hd1080i and hd720p
+ {isWideScreen} true if aspect is 16:9 or 21:9
+ -->
+ <screenresolution>
+ <area x="17%" y="95%" width="67%" height="4%" layer="4">
+ <drawimage imagetype="icon" path="ico_{resolution}" x="0" y="0" width="{areaheight}*3" height="{areaheight}"/>
+ <drawimage condition="{isWideScreen}" imagetype="icon" path="ico_widescreen" x="{areaheight}*3 + 10" y="0" width="{areaheight}*3" height="{areaheight}"/>
+ </area>
+ </screenresolution>
+
+ <!-- Available Variables dvbdeviceinfo:
+ {prevAvailable} true if previous Channel Group is avaialble
+ {nextAvailable} true if next Channel Group is avaialble
+ {group} Name of current Channel Group
+ {nextgroup} Name of next Channel Group
+ {prevgroup} Name of prev Channel Group
+ {sepexists} true if a channel separator logo exists
+ {seppath} path for separator logo to use in imagetype "seplogo"
+ -->
+ <channelgroup>
+ <area x="17%" y="82%" width="66%" height="10%" layer="3">
+ <drawtext x="1%" width="24%" valign="center" font="{semibold}" fontsize="40%" color="{clrWhite}" text="{prevgroup}" />
+ <drawtext x="30%" width="40%" valign="center" font="{semibold}" fontsize="60%" color="{clrWhite}" text="{group}" />
+ <drawtext align="right" width="25%" valign="center" font="{semibold}" fontsize="40%" color="{clrWhite}" text="{nextgroup}" />
+ </area>
+ </channelgroup>
+
+ <!-- Available Variables signalquality:
+ {signalstrength} STR value of currently displayed channel
+ {signalquality} SNR value of currently displayed channel
+ -->
+ <signalquality>
+ </signalquality>
+
+ <!-- background of signalmeter, will only be drawn if signalquality was deleted -->
+ <signalqualityback>
+ </signalqualityback>
+
+ <!-- Available Variables devices:
+ {numdevices} number of available devices
+ {devices[]} array with available devices
+ {devices[num]} number of current device
+ {devices[type]} type of device (DVB-S, DVB-C, ...)
+ {devices[istuned]} true if device is currently tuned to a transponder
+ {devices[livetv]} true if device is currently playing livetv
+ {devices[recording]} true if device is currently recording
+ {devices[hascam]} true if device has a CAM
+ {devices[cam]} number of CAM
+ {devices[signalstrength]} signalstrength of devcie
+ {devices[signalquality]} signalstrength of devcie
+ {devices[channelnumber]} number of the currently tuned channel
+ {devices[channelname]} name of the currently tuned channel
+ {devices[channellogoexists]} true if a channel logo exists
+ {devices[channelid]} ID of the currently tuned channel
+ {devices[source]} source of the currently tuned channel
+ -->
+ <devices>
+ <area condition="{showdevices}" x="56%" y="94%" width="28%" height="6%" layer="2">
+ <loop name="devices" x="0" y="0" orientation="horizontal" columnwidth="{areawidth}/{numdevices}" rowheight="{areaheight}">
+ <drawtext x="0" y="0" font="{regular}" fontsize="40%" color="{clrWhite}" text="{devices[num]}: {devices[type]}" />
+ <drawtext condition="{devices[hascam]}" align="right" y="0" font="{regular}" fontsize="40%" color="{clrWhite}" text="(CAM {devices[cam]})" />
+ <drawtext condition="{devices[recording]} ++ {devices[livetv]}" x="0" y="35%" font="{regular}" fontsize="30%" width="{columnwidth}" color="{clrRed}" text="LiveTV, Recording ({devices[channelname]}) " />
+ <drawtext condition="{devices[recording]} ++ not{devices[livetv]}" x="0" y="35%" font="{regular}" fontsize="30%" width="{columnwidth}" color="{clrRed}" text="Recording ({devices[channelname]}) " />
+ <drawtext condition="not{devices[recording]} ++ {devices[livetv]}" x="0" y="35%" font="{regular}" fontsize="30%" width="{columnwidth}" color="{clrWhite}" text="LiveTV ({devices[channelname]}) " />
+ <drawrectangle x="0" y="70%" width="{columnwidth} * {devices[signalstrength]} / 100 - 10 * {devices[signalstrength]} / 100" height="{rowheight}/15" color="{clrWhite}" />
+ <drawrectangle x="0" y="85%" width="{columnwidth} * {devices[signalquality]} / 100 - 10 * {devices[signalquality]} / 100" height="{rowheight}/15" color="{clrWhite}" />
+ </loop>
+ </area>
+ </devices>
+
+ <!-- Available Variables scrapercontent:
+ {posterpath} Full Path of Poster to use in image path attribute
+ {posterwidth} width of poster in pixel
+ {posterheight} height of poster in pixel
+ {hasPoster} true if poster is available
+ {bannerpath} Full Path of banner to use in image path attribute
+ {bannerwidth} width of banner in pixel
+ {bannerheight} height of banner in pixel
+ {hasBanner} true if banner is available
+
+ Use this tokens if you want to display a banner for series and a poster for movies:
+ {mediapath} Full Path of Poster or Banner to use in image path attribute
+ {mediawidth} width of image in pixel
+ {mediaheight} height of image in pixel
+ {isbanner} true if image is a banner, false if it is a poster
+ -->
+ <scrapercontent>
+ <area condition="{showposter}++{isbanner}" x="1%" y="3%" width="{areaheight}*0.13*{mediawidth}/{mediaheight}" height="13%" layer="7">
+ <drawimage imagetype="image" path="{mediapath}" align="center" valign="center" width="{areawidth}" height="{areaheight}"/>
+ </area>
+ <area condition="{showposter}++not{isbanner}" x="0" y="3%" width="{areaheight}*0.5*{mediawidth}/{mediaheight}" height="40%" layer="7">
+ <drawimage imagetype="image" path="{mediapath}" align="center" valign="center" width="{areawidth}" height="{areaheight}"/>
+ </area>
+ </scrapercontent>
+
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {monthnameshort} 3 letter abbrivation of month name
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="17%" y="74%" width="67%" height="6%" layer="3">
+ <drawtext align="right" valign="center" font="{semibold}" fontsize="90%" color="{clrWhite}" text="{dayname} {day}.{month}" />
+ </area>
+ <area x="86%" y="95%" width="{areaheight}*0.18" height="5%" layer="3">
+ <drawtext align="center" y="0" font="{digital}" fontsize="100%" color="{clrWhite}" text="{time}" />
+ </area>
+ </datetime>
+
+ <!-- Available Variables time:
+ {sec} current seconds
+ {min} current minutes
+ {hour} current hours
+ {hmins} current "hourminutes" to display an hour hand
+ -->
+ <time>
+ <area x="86%" y="77%" width="{areaheight}*0.18" height="{areaheight}*0.18" layer="5">
+ <drawimage imagetype="skinpart" path="watchhands/s_{sec}" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="86%" y="77%" width="{areaheight}*0.18" height="{areaheight}*0.18" layer="4">
+ <drawimage imagetype="skinpart" path="watchhands/m_{min}" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="86%" y="77%" width="{areaheight}*0.18" height="{areaheight}*0.18" layer="3">
+ <drawimage imagetype="skinpart" path="watchhands/h_{hmins}" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </time>
+
+ <currentweather>
+ <area x="0" y="70%" width="11%" height="5%" layer="3">
+ <drawimage name="weathericon" imagetype="icon" path="{icon}" x="{areawidth}/2 + {width(temperature)}/2 - {width(weathericon)}/2 + 5" valign="center" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
+ <drawtext name="temperature" x="{areawidth}/2 - {width(temperature)}/2 - {width(weathericon)}/2" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{temperature}°C" />
+ </area>
+ </currentweather>
+
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ <area x="5%" y="80%" width="90%" height="15%" layer="6">
+ <drawimage condition="{status}" imagetype="skinpart" path="messageblue" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{info}" imagetype="skinpart" path="messagegreen" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{warning}" imagetype="skinpart" path="messageyellow" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{error}" imagetype="skinpart" path="messagered" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="5%" y="80%" width="90%" height="15%" layer="6">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="40%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+
+ <!-- Available Variables customtokens:
+ all custom tokens set by the svdrp command SCTK are available in this viewelement
+ For instance, use an appropriate script which runs periodically as cronjob and
+ sets these custom tokens with svdrpsend or dbus2vdr
+ -->
+ <customtokens>
+ </customtokens>
+
+</displaychannel>
diff --git a/skins/blackhole/xmlfiles/displaymenu.xml b/skins/blackhole/xmlfiles/displaymenu.xml
new file mode 100644
index 0000000..04a3838
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenu.xml
@@ -0,0 +1,241 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaymenu SYSTEM "../../../dtd/displaymenu.dtd" [
+<!ENTITY displaymenudefault SYSTEM "displaymenudefault.xml">
+<!ENTITY displaymenumain SYSTEM "displaymenumain.xml">
+<!ENTITY displaymenusetup SYSTEM "displaymenusetup.xml">
+<!ENTITY displaymenuschedules SYSTEM "displaymenuschedules.xml">
+<!ENTITY displaymenutimers SYSTEM "displaymenutimers.xml">
+<!ENTITY displaymenuchannels SYSTEM "displaymenuchannels.xml">
+<!ENTITY displaymenurecordings SYSTEM "displaymenurecordings.xml">
+<!ENTITY displaymenudetailepg SYSTEM "displaymenudetailepg.xml">
+<!ENTITY displaymenudetailrecording SYSTEM "displaymenudetailrecording.xml">
+<!ENTITY displaymenudetailtext SYSTEM "displaymenudetailtext.xml">
+]>
+
+<displaymenu x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!--
+ The following background, header, datetime and colorbuttons definitions are default
+ implementations. If one or more of these elements are not implemented in the subview,
+ the default implementations are used.
+ -->
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <drawimage imagetype="skinpart" path="displaymenubacktv" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="0" y="0" width="83%" height="8%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenuheader" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="74%" y="0" width="26%" height="46%" layer="3">
+ <drawimage imagetype="skinpart" path="displaymenucorner" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="{areawidth}*0.865" y="{areawidth}*0.005" width="13%" height="{areawidth}*0.13" layer="4">
+ <drawimage imagetype="skinpart" path="watchback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ {freetime} available disc capacity in hh:mm
+ {freepercent} available disc capacity in percent
+ {usedpercent} used disc capacity in percent
+ {freegb} available disc capacity in gigabytes
+ {discalert} true if disc usage is > 95%
+ {vdrusagestring} localized VDR internal usage string
+ -->
+ <header>
+ <area x="0" y="0" width="83%" height="8%" layer="3">
+ <drawtext x="1%" width="100%" valign="center" font="{semibold}" fontsize="90%" color="{clrWhite}" text="{title}" />
+ </area>
+ </header>
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {monthnameshort} 3 letter abbrivation of month name
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="81%" y="0" width="7%" height="5%" layer="5">
+ <drawtext x="0" valign="center" font="{digital}" fontsize="90%" color="{clrWhite}" text="{time}" />
+ </area>
+ <area x="50%" y="0" width="27%" height="8%" layer="3">
+ <drawtext align="right" valign="center" font="{semibold}" fontsize="90%" color="{clrWhite}" text="{daynameshort} {day}.{month}" />
+ </area>
+ </datetime>
+
+ <!-- Available Variables time:
+ {sec} current seconds
+ {min} current minutes
+ {hour} current hours
+ {hmins} current "hourminutes" to display an hour hand
+ -->
+ <time>
+ <area x="{areawidth}*0.865" y="{areawidth}*0.005" width="13%" height="{areawidth}*0.13" layer="5">
+ <drawimage imagetype="skinpart" path="watchhands/s_{sec}" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="{areawidth}*0.865" y="{areawidth}*0.005" width="13%" height="{areawidth}*0.13" layer="6">
+ <drawimage imagetype="skinpart" path="watchhands/m_{min}" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="{areawidth}*0.865" y="{areawidth}*0.005" width="13%" height="{areawidth}*0.13" layer="7">
+ <drawimage imagetype="skinpart" path="watchhands/h_{hmins}" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </time>
+
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is an status message
+ {info} true if message is an info message
+ {warning} true if message is an warn message
+ {error} true if message is an error message
+ -->
+ <message>
+ <area x="5%" y="80%" width="90%" height="15%" layer="6">
+ <drawimage condition="{status}" imagetype="skinpart" path="messageblue" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{info}" imagetype="skinpart" path="messagegreen" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{warning}" imagetype="skinpart" path="messageyellow" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{error}" imagetype="skinpart" path="messagered" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="5%" y="80%" width="90%" height="15%" layer="7">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="40%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+ <!-- Available Variables colorbuttons:
+ {red1} true if red button is button 1
+ {red2} true if red button is button 2
+ {red3} true if red button is button 3
+ {red4} true if red button is button 4
+ {green1} true if green button is button 1
+ {green2} true if green button is button 2
+ {green3} true if green button is button 3
+ {green4} true if green button is button 4
+ {yellow1} true if yellow button is button 1
+ {yellow2} true if yellow button is button 2
+ {yellow3} true if yellow button is button 3
+ {yellow4} true if yellow button is button 4
+ {blue1} true if blue button is button 1
+ {blue2} true if blue button is button 2
+ {blue3} true if blue button is button 3
+ {blue4} true if blue button is button 4
+ {red} label of red button
+ {green} label of green button
+ {yellow} label of yellow button
+ {blue} label of blue button
+ -->
+ <colorbuttons>
+ <area condition="{red1}" x="0" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonred" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{red1}" x="0" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{red}" />
+ </area>
+ <area condition="{green1}" x="0" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttongreen" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{green1}" x="0" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{green}" />
+ </area>
+ <area condition="{yellow1}" x="0" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonyellow" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{yellow1}" x="0" y="90%" width="25%" height="10%" layer="4">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{yellow}" />
+ </area>
+ <area condition="{blue1}" x="0" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonblue" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{blue1}" x="0" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{blue}" />
+ </area>
+
+ <area condition="{red2}" x="25%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonred" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{red2}" x="25%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{red}" />
+ </area>
+ <area condition="{green2}" x="25%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttongreen" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{green2}" x="25%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{green}" />
+ </area>
+ <area condition="{yellow2}" x="25%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonyellow" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{yellow2}" x="25%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{yellow}" />
+ </area>
+ <area condition="{blue2}" x="25%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonblue" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{blue2}" x="25%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{blue}" />
+ </area>
+
+ <area condition="{red3}" x="50%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonred" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{red3}" x="50%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{red}" />
+ </area>
+ <area condition="{green3}" x="50%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttongreen" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{green3}" x="50%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{green}" />
+ </area>
+ <area condition="{yellow3}" x="50%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonyellow" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{yellow3}" x="50%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{yellow}" />
+ </area>
+ <area condition="{blue3}" x="50%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonblue" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{blue3}" x="50%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{blue}" />
+ </area>
+
+ <area condition="{red4}" x="75%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonred" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{red4}" x="75%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{red}" />
+ </area>
+ <area condition="{green4}" x="75%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttongreen" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{green4}" x="60%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{green}" />
+ </area>
+ <area condition="{yellow4}" x="75%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonyellow" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{yellow4}" x="75%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{yellow}" />
+ </area>
+ <area condition="{blue4}" x="75%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonblue" align="center" valign="center" width="90%" height="60%"/>
+ </area>
+ <area condition="{blue4}" x="75%" y="90%" width="25%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="50%" color="{clrWhite}" text="{blue}" />
+ </area>
+ </colorbuttons>
+ &displaymenudefault;
+ &displaymenumain;
+ &displaymenusetup;
+ &displaymenuschedules;
+ &displaymenutimers;
+ &displaymenuchannels;
+ &displaymenurecordings;
+ &displaymenudetailepg;
+ &displaymenudetailrecording;
+ &displaymenudetailtext;
+</displaymenu>
diff --git a/skins/blackhole/xmlfiles/displaymenuchannels.xml b/skins/blackhole/xmlfiles/displaymenuchannels.xml
new file mode 100644
index 0000000..e4fa353
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenuchannels.xml
@@ -0,0 +1,123 @@
+<menuchannels x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%">
+
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <menuitems x="1%" y="10%" orientation="vertical" width="98%" height="80%" align="center" numlistelements="{nummenuitems}">
+ <!-- Available Variables channels menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {number} number of the displayed channel
+ {name} name of the displayed channel
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {transponder} Transponder of channel
+ {frequency} Frequency of channel
+ {source} Source of channel (S, C, T)
+ {sourcedescription} Descriptin of source from sources.conf
+ {position} orbital position of the satellite in case this is a DVB-S source
+ {isAtsc} true if channel is a ATSC channel
+ {isCable} true if channel is cable channel
+ {isSat} true if channel is a satellite channel
+ {isTerr} true if channel is terrestrical
+ {presenteventtitle} title of present event on this channel
+ {presenteventstart} present event start time in hh::mm
+ {presenteventstop} present event event stop time in hh::mm
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ <area x="0" width="51%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="0" width="100%" height="100%"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area condition="not{separator}" x="1%" width="9%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" width="90%" height="90%" align="center" valign="center" />
+ </area>
+ <area condition="not{separator}" x="11%" width="39%" layer="3">
+ <drawtext condition="not{current}" x="0" y="5%" font="{regular}" fontsize="35%" color="{clrGray}" text="{sourcedescription}, Transp. {transponder}" />
+ <drawtext condition="{current}" x="0" y="5%" font="{regular}" fontsize="35%" color="{clrWhite}" text="{sourcedescription}, Transp. {transponder}" />
+ </area>
+ <area condition="not{separator}" x="11%" width="39%" layer="3">
+ <drawtext condition="not{current}" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrGray}" text="{number} {name}" />
+ <drawtext condition="{current}" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrWhite}" text="{number} {name}" />
+ </area>
+ <area condition="{separator}" x="1%" width="50%" layer="3">
+ <drawtext x="0" valign="center" font="{regular}" fontsize="70%" color="{clrWhite}" text="{name}" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {menuitemx} x position of according menu item
+ {menuitemy} y position of according menu item
+ {menuitemwidth} width of according menu item
+ {menuitemheight} height of according menu item
+ {number} number of the displayed channel
+ {name} name of the displayed channel
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {transponder} Transponder of channel
+ {frequency} Frequency of channel
+ {source} Source of channel (S, C, T)
+ {sourcedescription} Descriptin of source from sources.conf
+ {position} orbital position of the satellite in case this is a DVB-S source
+ {isAtsc} true if channel is a ATSC channel
+ {isCable} true if channel is cable channel
+ {isSat} true if channel is a satellite channel
+ {isTerr} true if channel is terrestrical
+ {presenteventtitle} title of present event on this channel
+ {presenteventstart} present event start time in hh::mm
+ {presenteventstop} present event stop time in hh::mm
+ {presenteventshorttext} present event short text
+ {presenteventdescription} present event description
+ {presenteventday} present event name of day
+ {presenteventdate} present event date in dd:mm:yy
+ {presenteventelapsed} present event elapsed time
+ {presenteventduration} present event duration
+ {presenteventdurationhours} duration, full hours
+ {presenteventdurationminutes} duration, rest of minutes
+ {hasposter} true if a scraped poster is available for this elements present evemt
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {nexteventtitle} title of next event on this channel
+ {nexteventstart} next event start time in hh::mm
+ {nexteventstop} next event event stop time in hh::mm
+ {nexteventshorttext} next event short text
+ {nexteventdescription} next event description
+ {nexteventday} next event name of day
+ {nexteventdate} next event date in dd:mm:yy
+ {nexteventduration} next event duration
+ {nexteventdurationhours} duration, full hours
+ {nexteventdurationminutes} duration, rest of minutes
+ {schedule[]} array with following 10 schedules
+ {schedule[title]} title of event
+ {schedule[shorttext]} shorttext of event
+ {schedule[start]} start time of event in hh:mm
+ {schedule[stop]} stop time of event in hh:mm
+ -->
+ <currentelement delay="500" fadetime="0">
+ <area x="55%" y="52%" width="45%" height="48%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="55%" y="53%" width="44%" height="47%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" width="30%" height="30%" align="right" y="0" />
+ </area>
+ <areascroll mode="forthandback" orientation="vertical" delay="1000" scrollspeed="medium" x="55%" y="52%" width="45%" height="48%" layer="4">
+ <drawtext x="10" y="0" font="{semibold}" fontsize="15%" color="{clrWhite}" text="{tr(schedule)}:" />
+ <drawtext x="10" y="16%" font="{regular}" width="{areawidth}-20" fontsize="12%" color="{clrWhite}" text="{tr(since)} {presenteventstart} - {presenteventtitle}" />
+ <drawtext x="10" y="26%" font="{regular}" width="{areawidth}-20" fontsize="12%" color="{clrWhite}" text="{nexteventstart} - {nexteventtitle}" />
+ <loop name="schedule" x="0" y="36%" orientation="vertical">
+ <drawtext x="10" font="{regular}" width="{areawidth}-20" fontsize="12%" color="{clrWhite}" text="{schedule[start]} - {schedule[title]}" />
+ </loop>
+ </areascroll>
+ </currentelement>
+
+ </menuitems>
+
+</menuchannels>
\ No newline at end of file
diff --git a/skins/blackhole/xmlfiles/displaymenudefault.xml b/skins/blackhole/xmlfiles/displaymenudefault.xml
new file mode 100644
index 0000000..766f02c
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenudefault.xml
@@ -0,0 +1,75 @@
+<menudefault x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <drawimage imagetype="skinpart" path="displaymenuback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="0" y="0" width="83%" height="8%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenuheader" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="74%" y="0" width="26%" height="46%" layer="3">
+ <drawimage imagetype="skinpart" path="displaymenucorner" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="{areawidth}*0.865" y="{areawidth}*0.005" width="13%" height="{areawidth}*0.13" layer="4">
+ <drawimage imagetype="skinpart" path="watchback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+
+ <scrollbar>
+ <area x="97%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="97%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <!-- IMPORTANT: menuitemwidth and determinatefont have to be defined here. menuitemwidth defines the total width of the
+ default menu items, determinatefont the function which sets the actual font to use. With that it is possible to determinate
+ the correct column widths -->
+ <menuitems x="1%" y="10%" orientation="vertical" width="95%" height="80%" align="center" menuitemwidth="94%" determinatefont="column1" numlistelements="{nummenuitemsdefault}">
+ <!-- Available Variables default menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {column1} text of column1
+ {column2} text of column2
+ {column3} text of column3
+ {column4} text of column4
+ {column5} text of column5
+ {column6} text of column6
+ {column2set} true if column2 is used
+ {column3set} true if column3 is used
+ {column4set} true if column4 is used
+ {column5set} true if column5 is used
+ {column6set} true if column6 is used
+ {column2x} proposed x value of column2
+ {column3x} proposed x value of column3
+ {column4x} proposed x value of column4
+ {column5x} proposed x value of column5
+ {column6x} proposed x value of column6
+ {column1width} proposed width of column1
+ {column2width} proposed width of column2
+ {column3width} proposed width of column3
+ {column4width} proposed width of column4
+ {column5width} proposed width of column5
+ {column6width} proposed width of column6
+ {current} true if column is currently selected
+ {separator} true if column is a list separator
+ -->
+ <listelement>
+ <area x="0" width="100%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="0" width="100%" height="100%"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <areascroll scrollelement="column1" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="{column1width}" layer="3">
+ <drawtext name="column1" x="{column1x}" width="{column1width}" valign="center" font="{regular}" fontsize="90%" color="{clrWhite}" text="{column1}" />
+ </areascroll>
+ <area x="1%" width="100%" layer="3">
+ <drawtext condition="{column2set}" x="{column2x}" valign="center" font="{regular}" fontsize="90%" width="{column2width}" color="{clrWhite}" text="{column2}" />
+ <drawtext condition="{column3set}" x="{column3x}" valign="center" font="{regular}" fontsize="90%" width="{column3width}" color="{clrWhite}" text="{column3}" />
+ <drawtext condition="{column4set}" x="{column4x}" valign="center" font="{regular}" fontsize="90%" width="{column4width}" color="{clrWhite}" text="{column4}" />
+ <drawtext condition="{column5set}" x="{column5x}" valign="center" font="{regular}" fontsize="90%" width="{column5width}" color="{clrWhite}" text="{column5}" />
+ <drawtext condition="{column6set}" x="{column6x}" valign="center" font="{regular}" fontsize="90%" width="{column6width}" color="{clrWhite}" text="{column6}" />
+ </area>
+ </listelement>
+
+ </menuitems>
+</menudefault>
diff --git a/skins/blackhole/xmlfiles/displaymenudetailepg.xml b/skins/blackhole/xmlfiles/displaymenudetailepg.xml
new file mode 100644
index 0000000..672938c
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenudetailepg.xml
@@ -0,0 +1,301 @@
+<menudetailedepg x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%" >
+ <header>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </header>
+
+
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <!-- Available Variables in detailheader elements:
+ {title} title of event
+ {shorttext} shorttext of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} Day of event as three letter abrivation
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {vps} vps description string
+ {channelname} Channelname of event
+ {channelnumber} Channelnumber of event
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {ismovie} true if event is scraped as a movie
+ {isseries} true if event is scraped as a series
+ {posteravailable} true if a poster is available
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {banneravailable} true if a banner is available
+ {bannerwidth} width of banner
+ {bannerheight} height of banner
+ {bannerpath} path of banner
+ {epgpicavailable} true if a epg picture is available
+ {epgpicpath} path of epg picture
+ -->
+ <detailheader>
+ <area x="0" y="0" width="83%" height="8%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="1%" width="5%" height="90%" align="left" valign="center" />
+ <drawtext x="{posx(logo)} + {width(logo)}+20" valign="center" font="{semibold}" fontsize="80%" color="{clrWhite}" text="{channelnumber} - {channelname}" />
+ </area>
+ <area x="1%" y="10%" width="50%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymendetailback" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="55%" y="52%" width="43%" height="38%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area condition="not{ismovie}++not{isseries}" x="55%" y="52%" width="43%" height="20%" layer="3">
+ <drawtext x="3%" y="15%" font="{regular}" fontsize="15%" color="{clrWhite}" text="{day} {date} {start} - {stop} ({duration} mins)" />
+ <drawtext x="3%" y="30%" width="96%" font="{semibold}" fontsize="30%" color="{clrWhite}" text="{title}" />
+ <drawtext x="3%" y="60%" width="96%" font="{regular}" fontsize="20%" color="{clrWhite}" text="{shorttext}" />
+ </area>
+ <area condition="{isseries}" x="55%" y="52%" width="43%" height="20%" layer="3">
+ <drawimage name="banner" imagetype="image" path="{bannerpath}" align="center" y="1%" width="70%" height="{areawidth} * 0.7 * {bannerheight} / {bannerwidth}"/>
+ <drawtext name="datetime" x="3%" y="{posy(banner)} + {height(banner)} + 5" font="{regular}" fontsize="15%" color="{clrWhite}" text="{day} {date} {start} - {stop} ({duration} mins)" />
+ <drawtext x="3%" y="{posy(datetime)} + {height(datetime)}" width="96%" font="{semibold}" fontsize="30%" color="{clrWhite}" text="{title} - {shorttext}" />
+ </area>
+ <area condition="{ismovie}" x="55%" y="52%" width="43%" height="20%" layer="3">
+ <drawimage name="poster" imagetype="image" path="{posterpath}" x="1%" valign="center" width="{areaheight} * {posterwidth} / {posterheight}" height="{areaheight}-20"/>
+ <drawtext x="{posx(poster)} + {width(poster)} + 10" y="15%" font="{regular}" fontsize="15%" color="{clrWhite}" text="{day} {date} {start} - {stop} ({duration} mins)" />
+ <drawtext x="{posx(poster)} + {width(poster)} + 10" y="30%" width="{areawidth} - {posx(poster)} - {width(poster)} - 20" font="{semibold}" fontsize="30%" color="{clrWhite}" text="{title}" />
+ <drawtext x="{posx(poster)} + {width(poster)} + 10" y="60%" width="{areawidth} - {posx(poster)} - {width(poster)} - 20" font="{regular}" fontsize="20%" color="{clrWhite}" text="{shorttext}" />
+ </area>
+ <area x="56%" y="72%" width="41%" height="17%" layer="2">
+ <drawimage imagetype="skinpart" path="tabback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </detailheader>
+
+ <!-- Available Variables in tab elements:
+ {title} title of event
+ {shorttext} shorttext of event
+ {description} description of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} Day of event as three letter abrivation
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {vps} vps description string
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {hasreruns} true if reruns of this event are found
+ {reruns[]} array with reruns
+ {reruns[title]} title of rerun
+ {reruns[shorttext]} shorttext of rerun
+ {reruns[date]} date of rerun in dd:mm
+ {reruns[day]} short dayname of rerun
+ {reruns[start]} start time of rerun in hh:mm
+ {reruns[stop]} stop time of rerun in hh:mm
+ {reruns[channelname]} name of channel on which rerun occurs
+ {reruns[channelnumber]} number of channel on which rerun occurs
+ {reruns[channelid]} id of channel on which rerun occurs to display channel logo
+ {reruns[channellogoexists]} true if channel logo exists
+ {epgpic1avaialble} true if first epg picture is available
+ {epgpic2avaialble} true if first epg picture is available
+ {epgpic3avaialble} true if first epg picture is available
+ {epgpic1path} path of first epg picture
+ {epgpic2path} path of second epg picture
+ {epgpic3path} path of third epg picture
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+
+ <!-- a tab is one scrolling area, just position and draw as inside a normal area -->
+ <!-- just define as many tabs as needed -->
+
+ <!-- TAB EPGINFO -->
+ <tab name="EPG Info" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawtext x="0" y="0" font="{semibold}" fontsize="6%" color="{clrWhite}" text="{day} {date} {start} - {stop} ({duration} mins)" />
+ <drawtext x="0" y="6%" width="100%" font="{semibold}" fontsize="9%" color="{clrWhite}" text="{title}" />
+ <drawtext x="0" y="14%" width="100%" font="{regular}" fontsize="7%" color="{clrWhite}" text="{shorttext}" />
+
+ <drawtextbox condition="not{isseries}++not{ismovie}" x="0" y="24%" width="96%" font="{regular}" fontsize="5%" color="{clrWhite}" text="{description}" />
+ <drawimage condition="{isseries}" name="seriesposter" imagetype="image" path="{seriesposter1path}" x="{areawidth}*0.7" y="20%" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage condition="{ismovie}" name="movieposter" imagetype="image" path="{posterpath}" x="{areawidth}*0.7" y="20%" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {posterheight} / {posterwidth}" />
+ <drawtextbox condition="{isseries}" x="0" y="24%" width="96%" float="topright" floatwidth="{width(seriesposter)} + 10" floatheight="{height(seriesposter)} + 20" font="{regular}" fontsize="5%" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="{ismovie}" x="0" y="24%" width="96%" float="topright" floatwidth="{width(movieposter)} + 10" floatheight="{height(movieposter)} + 20" font="{regular}" fontsize="5%" color="{clrWhite}" text="{description}" />
+
+ </tab>
+ <!-- TAB RERUNS -->
+ <tab name="{tr(reruns)}" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawtext align="center" y="0" width="100%" name="title" font="{semibold}" fontsize="6%" color="{clrWhite}" text="{tr(rerunsof)} '{title}'" />
+ <loop name="reruns" x="0" y="{height(title)} + 10" width="{areawidth}" orientation="vertical">
+ <drawimage name="logo" condition="{reruns[channellogoexists]}" imagetype="channellogo" path="{reruns[channelid]}" x="0" width="10%" height="10%" />
+ <drawtext name="channelname" condition="not{reruns[channellogoexists]}" x="0" y="2%" font="{regular}" fontsize="5%" color="{clrWhite}" text="{reruns[channelname]}" />
+ <drawtext condition="{reruns[channellogoexists]}" x="{width(logo)}+20" y="0" width="{areawidth} - {width(logo)} - 20" font="{regular}" fontsize="5%" color="{clrWhite}" text="{reruns[day]} {reruns[date]} {reruns[start]} - {reruns[stop]}" />
+ <drawtext condition="{reruns[channellogoexists]}" x="{width(logo)}+20" y="4%" width="{areawidth} - {width(logo)} - 20" font="{semibold}" fontsize="5%" color="{clrWhite}" text="{reruns[title]} {reruns[shorttext]}" />
+ <drawtext condition="not{reruns[channellogoexists]}" x="{width(channelname)}+20" y="0" width="{areawidth} - {width(logo)} - 20" font="{regular}" fontsize="5%" color="{clrWhite}" text="{reruns[day]} {reruns[date]} {reruns[start]} - {reruns[stop]}" />
+ <drawtext condition="not{reruns[channellogoexists]}" x="{width(channelname)}+20" y="4%" width="{areawidth} - {width(logo)} - 20" font="{semibold}" fontsize="5%" color="{clrWhite}" text="{reruns[title]} {reruns[shorttext]}" />
+ </loop>
+ </tab>
+ <!-- TAB ACTORS -->
+ <tab condition="{isseries}||{ismovie}" name="{tr(actors)}" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawtext align="center" name="title" y="0" font="{semibold}" fontsize="15%" color="{clrWhite}" text="{tr(actors)}" />
+ <loop name="actors" x="0" y="{height(title)} + 10" width="{areawidth}" orientation="horizontal" columnwidth="{areawidth}*0.3" rowheight="{areawidth}*0.3*1.8" overflow="linewrap">
+ <drawimage name="thumb" imagetype="image" path="{actors[thumb]}" x="20" y="0" width="{columnwidth}-40" height="{columnwidth} * {actors[thumbheight]} / {actors[thumbwidth]} - 40 * {actors[thumbheight]} / {actors[thumbwidth]}"/>
+ <drawtext align="center" y="{height(thumb)} + 10" width="{columnwidth}" name="actorname" font="{regular}" fontsize="7%" color="{clrWhite}" text="{actors[name]}" />
+ <drawtext align="center" y="{height(thumb)} + 10 + {height(actorname)}" width="{columnwidth}" font="{regular}" fontsize="7%" color="{clrWhite}" text="{actors[role]}" />
+ </loop>
+ </tab>
+ <!-- TAB TVDBINFO -->
+ <tab condition="{isseries}" name="TvDBInfo" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawimage name="banner" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="episodeimage" imagetype="image" path="{episodeimagepath}" x="{areawidth}*0.7" y="{height(banner)} + 20" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {episodeimageheight} / {episodeimagewidth}"/>
+ <drawimage name="seasonposter" imagetype="image" path="{seasonposterpath}" x="{areawidth}*0.7" y="{height(banner)} + {height(episodeimage)} + 30" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seasonposterheight} / {seasonposterwidth}"/>
+ <drawtextbox x="0" y="{height(banner)} + 20" width="96%" float="topright" floatwidth="{width(seasonposter)} + 10" floatheight="{height(episodeimage)} + {height(seasonposter)} + 30" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(episode)}: {episodetitle} ({tr(season)} {episodeseason}, {tr(episode)} {episodenumber})
{episodeoverview}|
{tr(gueststars)}: {episodegueststars}||
{tr(seriesfirstaired)}: {seriesfirstaired}||
{tr(episodefirstair [...]
+ </tab>
+ <!-- TAB SERIESGALERY -->
+ <tab condition="{isseries}" name="{tr(seriesgalery)}" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawimage name="banner1" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="fanart1" imagetype="image" path="{seriesfanart1path}" align="center" y="{posy(banner1)} + {height(banner1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart1height} / {seriesfanart1width}"/>
+ <drawimage name="banner2" imagetype="image" path="{seriesbanner2path}" align="center" y="{posy(fanart1)} + {height(fanart1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner2height} / {seriesbanner2width}"/>
+ <drawimage name="fanart2" imagetype="image" path="{seriesfanart2path}" align="center" y="{posy(banner2)} + {height(banner2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart2height} / {seriesfanart2width}"/>
+ <drawimage name="banner3" imagetype="image" path="{seriesbanner3path}" align="center" y="{posy(fanart2)} + {height(fanart2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner3height} / {seriesbanner3width}"/>
+ <drawimage name="fanart3" imagetype="image" path="{seriesfanart3path}" align="center" y="{posy(banner3)} + {height(banner3)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart3height} / {seriesfanart3width}"/>
+ <drawimage name="poster1" imagetype="image" path="{seriesposter1path}" align="center" y="{posy(fanart3)} + {height(fanart3)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage name="poster2" imagetype="image" path="{seriesposter2path}" align="center" y="{posy(poster1)} + {height(poster1)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter2height} / {seriesposter2width}"/>
+ <drawimage name="poster3" imagetype="image" path="{seriesposter3path}" align="center" y="{posy(poster2)} + {height(poster2)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter3height} / {seriesposter3width}"/>
+ </tab>
+ <!-- TAB MOVIEDBINFO -->
+ <tab condition="{ismovie}" name="MovieDBInfo" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawimage name="poster" imagetype="image" path="{posterpath}" x="70%" y="10" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {posterheight} / {posterwidth}"/>
+ <drawtextbox x="0" y="10" width="96%" float="topright" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 20" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(originaltitle)}: {movieoriginalTitle}
|{tr(genre)}: {moviegenres}
||{movietagline}
|{movieoverview}
|{tr(budget)}: {moviebudget}
||{tr(revenue)}: {movierevenue}
||{tr(adult)}: {movieadult}
||{tr(releasedate)}: {moviereleasedate}
||{tr(runtime [...]
+ </tab>
+ <!-- TAB MOVIEGALERY -->
+ <tab condition="{ismovie}" name="{tr(moviegalery)}" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawimage name="fanart" imagetype="image" path="{fanartpath}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {fanartheight} / {fanartwidth}"/>
+ <drawimage name="poster" imagetype="image" path="{posterpath}" align="center" y="{height(fanart)} + 30" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {posterheight} / {posterwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionfanart" imagetype="image" path="{collectionfanartpath}" align="center" y="{posy(poster)} + {height(poster)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {collectionfanartheight} / {collectionfanartwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionposter" imagetype="image" path="{collectionposterpath}" align="center" y="{posy(collectionfanart)} + {height(collectionfanart)} + 20" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {collectionposterheight} / {collectionposterwidth}"/>
+ </tab>
+ <!-- Available Variables tablabels:
+ {currenttab} name of currently active tab
+ {prevtab} name of prev tab
+ {nexttab} name of next tab
+ {tabs[]} array with available tab labels
+ {tabs[title]} title of tab
+ {tabs[current]} true if tab is displayed currently
+ -->
+ <tablabels>
+ <area x="56%" y="72%" width="41%" height="9%" layer="3">
+ <drawtext align="center" y="0" width="100%" font="{semibold}" fontsize="100%" color="{clrWhite}" text="{currenttab}" />
+ </area>
+ <area x="56%" y="81%" width="18%" height="8%" layer="3">
+ <drawtext align="center" valign="center" width="100%" font="{regular}" fontsize="60%" color="{clrGray}" text="{prevtab}" />
+ </area>
+ <area x="79%" y="81%" width="17%" height="8%" layer="3">
+ <drawtext align="center" valign="center" width="100%" font="{regular}" fontsize="60%" color="{clrGray}" text="{nexttab}" />
+ </area>
+ </tablabels>
+</menudetailedepg>
\ No newline at end of file
diff --git a/skins/blackhole/xmlfiles/displaymenudetailrecording.xml b/skins/blackhole/xmlfiles/displaymenudetailrecording.xml
new file mode 100644
index 0000000..ee663d5
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenudetailrecording.xml
@@ -0,0 +1,263 @@
+<menudetailedrecording x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%" >
+
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <!-- Available Variables in detailheader elements:
+ {name} full name of recording (including folders)
+ {epgname} Name of recording (Name from EPG)
+ {shorttext} shorttext of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of current recording in hh:mm
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+ {ismovie} true if event is scraped as a movie
+ {isseries} true if event is scraped as a series
+ {posteravailable} true if a poster is available
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {banneravailable} true if a banner is available
+ {bannerwidth} width of banner
+ {bannerheight} height of banner
+ {bannerpath} path of banner
+ {recimgavailable} true if a recording image is available in the recording path
+ {recimgpath} path of rec image
+ -->
+ <detailheader>
+ <area x="1%" y="10%" width="50%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymendetailback" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="55%" y="52%" width="43%" height="38%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area condition="not{ismovie}++not{isseries}" x="55%" y="52%" width="43%" height="20%" layer="3">
+ <drawtext x="3%" y="15%" font="{regular}" fontsize="15%" color="{clrWhite}" text="{date} {time} ({duration} mins)" />
+ <drawtext x="3%" y="30%" width="96%" font="{semibold}" fontsize="30%" color="{clrWhite}" text="{epgname}" />
+ <drawtext x="3%" y="60%" width="96%" font="{regular}" fontsize="20%" color="{clrWhite}" text="{shorttext}" />
+ </area>
+ <area condition="{isseries}" x="55%" y="52%" width="43%" height="20%" layer="3">
+ <drawimage name="banner" imagetype="image" path="{bannerpath}" align="center" y="1%" width="70%" height="{areawidth} * 0.7 * {bannerheight} / {bannerwidth}"/>
+ <drawtext name="datetime" x="3%" y="{posy(banner)} + {height(banner)}" font="{regular}" fontsize="15%" color="{clrWhite}" text="{date} {time} ({duration} mins)" />
+ <drawtext x="3%" y="{posy(datetime)} + {height(datetime)}" width="96%" font="{semibold}" fontsize="30%" color="{clrWhite}" text="{epgname} - {shorttext}" />
+ </area>
+ <area condition="{ismovie}" x="55%" y="52%" width="43%" height="20%" layer="3">
+ <drawimage name="poster" imagetype="image" path="{posterpath}" x="1%" valign="center" width="{areaheight} * {posterwidth} / {posterheight}" height="{areaheight}-20"/>
+ <drawtext x="{posx(poster)} + {width(poster)} + 10" y="15%" font="{regular}" fontsize="15%" color="{clrWhite}" text="{date} {time} ({duration} mins)" />
+ <drawtext x="{posx(poster)} + {width(poster)} + 10" y="30%" width="{areawidth} - {posx(poster)} - {width(poster)} - 20" font="{semibold}" fontsize="30%" color="{clrWhite}" text="{epgname}" />
+ <drawtext x="{posx(poster)} + {width(poster)} + 10" y="60%" width="{areawidth} - {posx(poster)} - {width(poster)} - 20" font="{regular}" fontsize="20%" color="{clrWhite}" text="{shorttext}" />
+ </area>
+ <area x="56%" y="72%" width="41%" height="17%" layer="2">
+ <drawimage imagetype="skinpart" path="tabback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </detailheader>
+ <!-- Available Variables in tab elements:
+ {name} full name of recording (including folders)
+ {epgname} Name of recording (Name from EPG)
+ {shorttext} shorttext of recording
+ {description} description of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of current recording in hh:mm
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+ {cutted} true if recording is cutted
+
+ {recordingsize} size of recording (automatically in GB / MB)
+ {recordingsizecutted} size of cutted recording (automatically in GB / MB)
+ {recordinglength} length of recording (in hh::mm:ss)
+ {recordinglengthcutted} length of cutted recording (in hh::mm:ss)
+ {recordingbitrate} bitrate of recording (in MBit/s)
+ {recordingformat} format of recording (TS / PS)
+ {searchtimer} name of accordign searchtimer (if available)
+
+ {recimg1avaialble} true if first recording image is available
+ {recimg2avaialble} true if first recording image is available
+ {recimg3avaialble} true if first recording image is available
+ {recimg1path} path of first recording image
+ {recimg2path} path of second recording image
+ {recimg3path} path of third recording image
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+
+ <!-- a tab is one scrolling area, just position and draw as inside a normal area -->
+ <!-- just define as many tabs as needed -->
+ <tab name="Info" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawtext x="0" y="0" font="{semibold}" fontsize="6%" color="{clrWhite}" text="{date} {time} ({duration} mins)" />
+ <drawtext x="0" y="6%" width="100%" font="{semibold}" fontsize="9%" color="{clrWhite}" text="{epgname}" />
+ <drawtext x="0" y="14%" width="100%" font="{regular}" fontsize="7%" color="{clrWhite}" text="{shorttext}" />
+ <drawtextbox condition="not{isseries}++not{ismovie}" x="0" y="24%" width="96%" font="{regular}" fontsize="5%" color="{clrWhite}" text="{description}" />
+ <drawimage condition="{isseries}" name="seriesposter" imagetype="image" path="{seriesposter1path}" x="{areawidth}*0.7" y="20%" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage condition="{ismovie}" name="movieposter" imagetype="image" path="{posterpath}" x="{areawidth}*0.7" y="20%" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {posterheight} / {posterwidth}" />
+ <drawtextbox condition="{isseries}" x="0" y="24%" width="96%" float="topright" floatwidth="{width(seriesposter)} + 10" floatheight="{height(seriesposter)} + 20" font="{regular}" fontsize="5%" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="{ismovie}" x="0" y="24%" width="96%" float="topright" floatwidth="{width(movieposter)} + 10" floatheight="{height(movieposter)} + 20" font="{regular}" fontsize="5%" color="{clrWhite}" text="{description}" />
+ </tab>
+ <tab name="{tr(recinfo)}" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawtext align="center" y="0" name="title" font="{regular}" fontsize="8%" color="{clrWhite}" text="{tr(recinfo)}" />
+ <drawtextbox x="0" y="{height(title)} + 20" width="96%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(recsize)}: {recordingsize}
{tr(recsizecutted)}: {recordingsizecutted}
{tr(reclength)}: {recordinglength}
{tr(reclengthcutted)}: {recordinglengthcutted}
{tr(bitrate)}: {recordingbitrate}
{tr(format)}: {recordingformat}
{tr(searchtimer)}: {searchtimer}
" />
+ </tab>
+ <tab condition="{isseries}||{ismovie}" name="{tr(actors)}" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawtext align="center" name="title" y="0" font="{semibold}" fontsize="10%" color="{clrWhite}" text="{tr(actors)}" />
+ <loop name="actors" x="0" y="{height(title)} + 10" width="{areawidth}" orientation="horizontal" columnwidth="{areawidth}*0.3" rowheight="{areawidth}*0.3*1.8" overflow="linewrap">
+ <drawimage name="thumb" imagetype="image" path="{actors[thumb]}" x="20" y="0" width="{columnwidth}-40" height="{columnwidth} * {actors[thumbheight]} / {actors[thumbwidth]} - 40 * {actors[thumbheight]} / {actors[thumbwidth]}"/>
+ <drawtext align="center" y="{height(thumb)} + 10" width="{columnwidth}" name="actorname" font="{regular}" fontsize="5%" color="{clrWhite}" text="{actors[name]}" />
+ <drawtext align="center" y="{height(thumb)} + 10 + {height(actorname)}" width="{columnwidth}" font="{regular}" fontsize="5%" color="{clrWhite}" text="{actors[role]}" />
+ </loop>
+ </tab>
+ <tab condition="{isseries}" name="TvDBInfo" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawimage name="banner" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="episodeimage" imagetype="image" path="{episodeimagepath}" x="{areawidth}*0.7" y="{height(banner)} + 20" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {episodeimageheight} / {episodeimagewidth}"/>
+ <drawimage name="seasonposter" imagetype="image" path="{seasonposterpath}" x="{areawidth}*0.7" y="{height(banner)} + {height(episodeimage)} + 30" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seasonposterheight} / {seasonposterwidth}"/>
+ <drawtextbox x="0" y="{height(banner)} + 20" width="96%" float="topright" floatwidth="{width(seasonposter)} + 10" floatheight="{height(episodeimage)} + {height(seasonposter)} + 30" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(episode)}: {episodetitle} ({tr(season)} {episodeseason}, {tr(episode)} {episodenumber})
{episodeoverview}|
{tr(gueststars)}: {episodegueststars}||
{tr(seriesfirstaired)}: {seriesfirstaired}||
{tr(episodefirstair [...]
+ </tab>
+ <tab condition="{isseries}" name="{tr(seriesgalery)}" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawimage name="banner1" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="fanart1" imagetype="image" path="{seriesfanart1path}" align="center" y="{posy(banner1)} + {height(banner1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart1height} / {seriesfanart1width}"/>
+ <drawimage name="banner2" imagetype="image" path="{seriesbanner2path}" align="center" y="{posy(fanart1)} + {height(fanart1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner2height} / {seriesbanner2width}"/>
+ <drawimage name="fanart2" imagetype="image" path="{seriesfanart2path}" align="center" y="{posy(banner2)} + {height(banner2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart2height} / {seriesfanart2width}"/>
+ <drawimage name="banner3" imagetype="image" path="{seriesbanner3path}" align="center" y="{posy(fanart2)} + {height(fanart2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner3height} / {seriesbanner3width}"/>
+ <drawimage name="fanart3" imagetype="image" path="{seriesfanart3path}" align="center" y="{posy(banner3)} + {height(banner3)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart3height} / {seriesfanart3width}"/>
+ <drawimage name="poster1" imagetype="image" path="{seriesposter1path}" align="center" y="{posy(fanart3)} + {height(fanart3)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage name="poster2" imagetype="image" path="{seriesposter2path}" align="center" y="{posy(poster1)} + {height(poster1)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter2height} / {seriesposter2width}"/>
+ <drawimage name="poster3" imagetype="image" path="{seriesposter3path}" align="center" y="{posy(poster2)} + {height(poster2)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter3height} / {seriesposter3width}"/>
+ </tab>
+ <tab condition="{ismovie}" name="MovieDBInfo" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawimage name="poster" imagetype="image" path="{posterpath}" x="70%" y="10" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {posterheight} / {posterwidth}"/>
+ <drawtextbox x="0" y="10" width="96%" float="topright" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 20" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(originaltitle)}: {movieoriginalTitle}
|{tr(genre)}: {moviegenres}
||{movietagline}
|{movieoverview}
|{tr(budget)}: {moviebudget}$
||{tr(revenue)}: {movierevenue}$
||{tr(adult)}: {movieadult}
||{tr(releasedate)}: {moviereleasedate}
||{tr(runti [...]
+ </tab>
+ <tab condition="{ismovie}" name="{tr(moviegalery)}" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawimage name="fanart" imagetype="image" path="{fanartpath}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {fanartheight} / {fanartwidth}"/>
+ <drawimage name="poster" imagetype="image" path="{posterpath}" align="center" y="{height(fanart)} + 30" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {posterheight} / {posterwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionfanart" imagetype="image" path="{collectionfanartpath}" align="center" y="{posy(poster)} + {height(poster)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {collectionfanartheight} / {collectionfanartwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionposter" imagetype="image" path="{collectionposterpath}" align="center" y="{posy(collectionfanart)} + {height(collectionfanart)} + 20" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {collectionposterheight} / {collectionposterwidth}"/>
+ </tab> <!-- Available Variables tablabels:
+ {currenttab} name of currently active tab
+ {prevtab} name of prev tab
+ {nexttab} name of next tab
+ {tabs[]} array with available tab labels
+ {tabs[title]} title of tab
+ {tabs[current]} true if tab is displayed currently
+ -->
+ <tablabels>
+ <area x="56%" y="72%" width="41%" height="9%" layer="3">
+ <drawtext align="center" y="0" width="100%" font="{semibold}" fontsize="100%" color="{clrWhite}" text="{currenttab}" />
+ </area>
+ <area x="56%" y="81%" width="18%" height="8%" layer="3">
+ <drawtext align="center" valign="center" width="100%" font="{regular}" fontsize="60%" color="{clrGray}" text="{prevtab}" />
+ </area>
+ <area x="79%" y="81%" width="17%" height="8%" layer="3">
+ <drawtext align="center" valign="center" width="100%" font="{regular}" fontsize="60%" color="{clrGray}" text="{nexttab}" />
+ </area>
+ </tablabels>
+
+</menudetailedrecording>
diff --git a/skins/blackhole/xmlfiles/displaymenudetailtext.xml b/skins/blackhole/xmlfiles/displaymenudetailtext.xml
new file mode 100644
index 0000000..84bf634
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenudetailtext.xml
@@ -0,0 +1,37 @@
+<menudetailedtext x="0" y="0" width="100%" height="100%" fadetime="0">
+
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <drawimage imagetype="skinpart" path="displaymenuback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="1%" y="10%" width="93%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymendetailback" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="0" y="0" width="83%" height="8%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenuheader" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="74%" y="0" width="26%" height="46%" layer="3">
+ <drawimage imagetype="skinpart" path="displaymenucorner" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="{areawidth}*0.865" y="{areawidth}*0.005" width="13%" height="{areawidth}*0.13" layer="4">
+ <drawimage imagetype="skinpart" path="watchback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+
+ <scrollbar>
+ <area x="97%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="97%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <!-- Available Variables in tab elements:
+ {text} detailed text
+ -->
+ <tab name="text" x="2%" y="11%" width="92%" height="79%" layer="3" scrollheight="{areaheight}/4">
+ <drawtextbox x="0" y="0" width="100%" font="{regular}" fontsize="5%" color="{clrWhite}" text="{text}" />
+ </tab>
+
+</menudetailedtext>
\ No newline at end of file
diff --git a/skins/blackhole/xmlfiles/displaymenumain.xml b/skins/blackhole/xmlfiles/displaymenumain.xml
new file mode 100644
index 0000000..90317d4
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenumain.xml
@@ -0,0 +1,228 @@
+<menumain x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%" >
+
+ <header>
+ <area x="0" y="0" width="83%" height="8%" layer="3">
+ <drawtext x="1%" width="100%" valign="center" font="{semibold}" fontsize="90%" color="{clrWhite}" text="{title} - {vdrversion}" />
+ </area>
+ </header>
+
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <drawimage imagetype="skinpart" path="displaymenubacktv" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="0" y="0" width="83%" height="8%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenuheader" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="74%" y="0" width="26%" height="46%" layer="3">
+ <drawimage imagetype="skinpart" path="displaymenucorner" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="{areawidth}*0.865" y="{areawidth}*0.005" width="13%" height="{areawidth}*0.13" layer="4">
+ <drawimage imagetype="skinpart" path="watchback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="55%" y="51%" width="44%" height="19%" layer="2">
+ <drawimage imagetype="skinpart" path="tachos_back" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <!-- tacho disc usage -->
+ <area x="55%" y="51%" width="44%" height="19%" layer="3">
+ <drawimage imagetype="skinpart" path="tacho_percent_back" x="{areawidth}*0.025" y="5%" width="20%" height="{areawidth}*0.2"/>
+ </area>
+ <!-- tacho load -->
+ <area x="55%" y="51%" width="44%" height="19%" layer="3">
+ <drawimage imagetype="skinpart" path="tacho_load_back" x="{areawidth}*0.28" y="5%" width="20%" height="{areawidth}*0.20"/>
+ </area>
+ <!-- tacho cpu temp -->
+ <area x="55%" y="51%" width="44%" height="19%" layer="3">
+ <drawimage imagetype="skinpart" path="tacho_temp_back" x="{areawidth}*0.530" y="5%" width="20%" height="{areawidth}*0.20"/>
+ </area>
+ <!-- tacho gpu temp -->
+ <area x="55%" y="51%" width="44%" height="19%" layer="3">
+ <drawimage imagetype="skinpart" path="tacho_temp_back" x="{areawidth}*0.78" y="5%" width="20%" height="{areawidth}*0.20"/>
+ </area>
+ <area x="55%" y="71%" width="44%" height="19%" layer="2">
+ <drawimage imagetype="skinpart" path="tachos_back" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <currentweather>
+ <area x="40%" y="0" width="15%" height="8%" layer="3">
+ <drawimage name="weathericon" imagetype="icon" path="{icon}" align="right" valign="center" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
+ <drawtext name="temperature" x="{areawidth} - {width(weathericon)} - {width(temperature)} - 10" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{temperature}°C" />
+ </area>
+ </currentweather>
+
+ <!-- Available Variables timers:
+ {numtimers} number of active timers (max. 15 timers will be displayed)
+ {numtimerconflicts} number of current timer conflicts
+ {timer1exists} true if timer 1 available
+ {timer2exists} true if timer 2 available
+ ...
+ {timer15exists} true if timer 15 available
+ {timers[]} array with active timers (local and remote if remotetimers plugin is in use)
+ {timers[title]} title of timer
+ {timers[datetime]} date and time of timer
+ {timers[recording]} true if timer is recording currently
+ {timers[channelname]} name of channel for which timer is created
+ {timers[channelnumber]} number of channel
+ {timers[channelid]} ChannelID of channel
+ {timers[channellogoexists]} true if channel logo exists
+ -->
+ <timers>
+ <area condition="not{numtimers}" x="55%" y="71%" width="44%" height="19%" layer="2">
+ <drawtext align="center" valign="center" font="{semibold}" fontsize="40%" color="{clrWhite}" text="{tr(noactivetimers)}" />
+ </area>
+ <area condition="{numtimers}" x="55%" y="71%" width="44%" height="19%" layer="2">
+ <loop name="timers" x="0" y="0" orientation="horizontal" columnwidth="{areawidth}/4" rowheight="{areaheight}" overflow="cut">
+ <drawimage cache="true" name="logo" imagetype="channellogo" path="{timers[channelid]}" width="{columnwidth}-15" height="40%" align="center" y="10" />
+ <drawrectangle condition="{timers[recording]}" x="0" y="{height(logo)}+10" width="{columnwidth}-5" height="{rowheight} - {height(logo)} - 20" color="{clrRedTrans}" />
+ <drawtextbox x="5" y="{height(logo)} + 10" width="{columnwidth}-10" align="center" maxlines="2" font="{regular}" fontsize="15%" color="{clrWhite}" text="{timers[title]}" />
+ <drawtext align="center" y="75%" font="{regular}" fontsize="20%" color="{clrWhite}" text="{timers[datetime]}" />
+ </loop>
+ </area>
+ </timers>
+
+ <!-- Available Variables discusage:
+ {freetime} available disc capacity in hh:mm
+ {freepercent} available disc capacity in percent
+ {usedpercent} used disc capacity in percent
+ {freegb} available disc capacity in gigabytes
+ {discalert} true if disc usage is > 95%
+ {vdrusagestring} localized VDR internal usage string
+ -->
+ <discusage>
+ <area x="55%" y="51%" width="44%" height="19%" layer="5">
+ <drawimage imagetype="skinpart" path="tachohands/perc_{usedpercent}" x="{areawidth}*0.025" y="5%" width="20%" height="{areawidth}*0.20"/>
+ </area>
+ <area x="55%" y="51%" width="11%" height="19%" layer="4">
+ <drawtext align="center" y="85%" font="{regular}" fontsize="15%" color="{clrWhite}" text="Disc Usage: {usedpercent}%" />
+ </area>
+ </discusage>
+
+ <!-- Available Variables devices:
+ {numdevices} number of available devices
+ {devices[]} array with available devices
+ {devices[num]} number of current device
+ {devices[type]} type of device (DVB-S, DVB-C, ...)
+ {devices[istuned]} true if device is currently tuned to a transponder
+ {devices[livetv]} true if device is currently playing livetv
+ {devices[recording]} true if device is currently recording
+ {devices[hascam]} true if device has a CAM
+ {devices[cam]} number of CAM
+ {devices[signalstrength]} signalstrength of devcie
+ {devices[signalquality]} signalstrength of devcie
+ {devices[channelnumber]} number of the currently tuned channel
+ {devices[channelname]} name of the currently tuned channel
+ {devices[channellogoexists]} true if a channel logo exists
+ {devices[channelid]} ID of the currently tuned channel
+ {devices[source]} source of the currently tuned channel
+ -->
+ <devices>
+ </devices>
+
+ <!-- Available Variables systemload:
+ {load} current system load
+ {loadhand} system load for tacho hand (between 0 and 2.5 in 0.025 steps multiplied by 1000, >2.5 is always 2525)
+ -->
+ <systemload>
+ <area x="55%" y="51%" width="44%" height="19%" layer="5">
+ <drawimage imagetype="skinpart" path="tachohands/load_{loadhand}" x="{areawidth}*0.28" y="5%" width="20%" height="{areawidth}*0.20"/>
+ </area>
+ <area x="66%" y="51%" width="11%" height="19%" layer="4">
+ <drawtext align="center" y="85%" font="{regular}" fontsize="15%" color="{clrWhite}" text="Load: {load}" />
+ </area>
+ </systemload>
+
+ <!-- Available Variables tempreatures:
+ {cputemp} current cpu temperature in °C
+ {gputemp} current gpu temperature in °C
+ -->
+ <temperatures>
+ <area x="55%" y="51%" width="44%" height="19%" layer="5">
+ <drawimage condition="gt({cputemp}, 80)" imagetype="skinpart" path="tachohands/temp_81" x="{areawidth}*0.53" y="5%" width="20%" height="{areawidth}*0.2"/>
+ <drawimage condition="lt({cputemp}, 81)" imagetype="skinpart" path="tachohands/temp_{cputemp}" x="{areawidth}*0.53" y="5%" width="20%" height="{areawidth}*0.2"/>
+ <drawimage condition="gt({gputemp}, 80)" imagetype="skinpart" path="tachohands/temp_81" x="{areawidth}*0.78" y="5%" width="20%" height="{areawidth}*0.2"/>
+ <drawimage condition="lt({cputemp}, 81)" imagetype="skinpart" path="tachohands/temp_{gputemp}" x="{areawidth}*0.78" y="5%" width="20%" height="{areawidth}*0.2"/>
+ </area>
+ <area x="77%" y="51%" width="11%" height="19%" layer="4">
+ <drawtext align="center" y="85%" font="{regular}" fontsize="15%" color="{clrWhite}" text="CPU Temp: {cputemp}°C" />
+ </area>
+ <area x="88%" y="51%" width="11%" height="19%" layer="4">
+ <drawtext align="center" y="85%" font="{regular}" fontsize="15%" color="{clrWhite}" text="GPU Temp: {gputemp}°C" />
+ </area>
+ </temperatures>
+
+ <!-- Available Variables currentschedule:
+ {title} Title of the current Schedule
+ {subtitle} Subtitle of the current Schedule
+ {start} Start of current Schedule in hh:mm
+ {stop} End of current Schedule in hh:mm
+ {duration} Duration of current Schedule in min
+ {durationhours} Duration, full hours
+ {minutes} Duration, rest of minutes
+ {elapsed} Elapsed time of current Schedule in min
+ {remaining} Remaining time of current Schedule in min
+ {hasPoster} true if poster is available
+ {posterpath} Full Path of Poster to use in image path attribute
+ {posterwidth} width of poster in pixel
+ {posterheight} height of poster in pixel
+ {hasBanner} true if banner is available
+ {bannerpath} Full Path of banner to use in image path attribute
+ {bannerwidth} width of banner in pixel
+ {bannerheight} height of banner in pixel
+ -->
+ <currentschedule>
+ </currentschedule>
+
+ <!-- Available Variables customtokens:
+ all custom tokens set by the svdrp command SCTK are available in this viewelement
+ For instance, use an appropriate script which runs periodically as cronjob and
+ sets these custom tokens with svdrpsend or dbus2vdr
+ -->
+ <customtokens>
+ </customtokens>
+
+ <menuitems x="1%" y="10%" orientation="vertical" width="50%" height="80%" align="center" numlistelements="{nummenuitemsmain}">
+ <!-- Available Variables main menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ <area x="0" width="100%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="0" width="100%" height="100%"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area condition="{showmainmenuicons}" x="1%" width="20%" layer="3">
+ <drawimage imagetype="menuicon" path="{icon}" x="1%" valign="center" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
+ </area>
+ <area condition="not{showmainmenuicons}" x="0" width="100%" layer="3">
+ <drawtext condition="not{current}" x="1%" width="98%" valign="center" font="{regular}" fontsize="80%" color="{clrGray}" text="{number} {label} " />
+ <drawtext condition="{current}" x="1%" width="98%" valign="center" font="{regular}" fontsize="80%" color="{clrWhite}" text="{number} {label} " />
+ </area>
+ <area condition="{showmainmenuicons}" x="0" width="100%" layer="3">
+ <drawtext condition="not{current}" x="{areaheight} + {areawidth}*0.02" width="{areawidth} - {areaheight}" valign="center" font="{regular}" fontsize="80%" color="{clrGray}" text="{number} {label} " />
+ <drawtext condition="{current}" x="{areaheight} + {areawidth}*0.02" width="{areawidth} - {areaheight}" valign="center" font="{regular}" fontsize="80%" color="{clrWhite}" text="{number} {label} " />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables main menu currentelement:
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ -->
+ <currentelement delay="50" fadetime="0">
+ </currentelement>
+ </menuitems>
+
+</menumain>
diff --git a/skins/blackhole/xmlfiles/displaymenurecordings.xml b/skins/blackhole/xmlfiles/displaymenurecordings.xml
new file mode 100644
index 0000000..f7e85b1
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenurecordings.xml
@@ -0,0 +1,120 @@
+<menurecordings x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%">
+
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <menuitems x="1%" y="10%" orientation="vertical" width="98%" height="80%" align="center" numlistelements="{nummenuitems}">
+ <!-- Available Variables recordings menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {name} Name of recording
+ {date} Date of recording
+ {time} Time of recording
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+ {current} true if item is currently selected
+ {new} true if recording is new
+ {cutted} true if recording is cutted
+ {folder} true if item is a folder
+ {numrecordingsfolder} if item is a folder, number of recordings in this folder
+ {newrecordingsfolder} if item is a folder, number of new recordings in this folder
+ {hasposterthumbnail} true if a scraped poster thumbnail is available for recording
+ {thumbnailbwidth} width of scraped poster thumbnail
+ {thumbnailheight} height of scraped poster thumbnail
+ {thumbnailpath} absolute path of scraped poster thumbnail
+ -->
+ <listelement>
+ <area x="0" width="51%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="0" width="100%" height="100%"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area condition="not{folder}" x="1%" width="50%" layer="3">
+ <drawtext condition="not{current}" x="0" y="5%" font="{regular}" fontsize="35%" color="{clrGray}" text="{date} - {time}, {duration} min" />
+ <drawtext condition="{current}" x="0" y="5%" font="{regular}" fontsize="35%" color="{clrWhite}" text="{date} - {time}, {duration} min" />
+ </area>
+ <area condition="not{folder}" x="1%" width="50%" layer="3">
+ <drawimage name="new" condition="{new}" imagetype="icon" path="ico_new_rec" align="right" y="8%" width="{areaheight}/2" height="{areaheight}/2" />
+ <drawimage name="cutted" condition="{new}++{cutted}" imagetype="icon" path="ico_cutted" x="{areawidth} - {areaheight} - 10" y="8%" width="{areaheight}/2" height="{areaheight}/2" />
+ <drawimage condition="not{new}++{cutted}" imagetype="icon" path="ico_cutted" align="right" y="8%" width="{areaheight}/2" height="{areaheight}/2" />
+ </area>
+ <areascroll condition="not{folder}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="50%" layer="3">
+ <drawtext condition="not{current}" name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrGray}" text="{name}" />
+ <drawtext condition="{current}" name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrWhite}" text="{name}" />
+ </areascroll>
+ <area condition="{folder}" x="1%" width="4%" layer="3">
+ <drawimage imagetype="icon" path="ico_folder" x="0" valign="center" width="{areaheight}*0.8" height="80%"/>
+ </area>
+ <areascroll condition="{folder}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="6%" width="45%" layer="3">
+ <drawtext condition="not{current}" name="menutext" x="0" valign="center" font="{regular}" fontsize="70%" color="{clrGray}" text="{name} ({numrecordingsfolder} rec., {newrecordingsfolder} new)" />
+ <drawtext condition="{current}" name="menutext" x="0" valign="center" font="{regular}" fontsize="70%" color="{clrWhite}" text="{name} ({numrecordingsfolder} rec., {newrecordingsfolder} new)" />
+ </areascroll>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {menuitemx} x position of according menu item
+ {menuitemy} y position of according menu item
+ {menuitemwidth} width of according menu item
+ {menuitemheight} height of according menu item
+ {name} Real Name of recording (Name of Recording Folder)
+ {epgname} Name of recording (Name from EPG)
+ {shorttext} Short Text of recording
+ {description} Descrption of recording
+ {date} Date of recording
+ {time} Time of recording
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes {new} true if recording is new
+ {cutted} true if recording is cutted
+ {folder} true if item is a folder
+ {numrecordingsfolder} if item is a folder, number of recordings in this folder
+ {newrecordingsfolder} if item is a folder, number of new recordings in this folder
+ {hasposter} true if a scraped poster is available for recording
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ -->
+ <currentelement delay="500" fadetime="0">
+ <area x="55%" y="52%" width="45%" height="48%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area condition="{folder}" x="55%" y="52%" width="45%" height="48%" layer="3">
+ <drawimage imagetype="icon" path="ico_folder" x="25%" y="3%" width="50%" height="{areawidth}*0.5"/>
+ <drawtext align="center" y="75%" font="{regular}" fontsize="20%" color="{clrWhite}" text="{numrecordingsfolder} recs, {newrecordingsfolder} new" />
+ </area>
+ <areascroll condition="not{folder}++not{hasposter}" orientation="vertical" mode="forthandback" delay="1000" scrollspeed="medium" x="56%" y="53%" width="43%" height="46%" layer="3">
+ <drawtext x="0" y="0" font="{semibold}" width="100%" fontsize="10%" color="{clrWhite}" text="{date} - {time}, {duration} min" />
+ <drawtext x="0" y="10%" font="{semibold}" width="100%" fontsize="12%" color="{clrWhite}" text="{epgname}" />
+ <drawtextbox name="shorttext" x="0" y="21%" width="100%" font="{regular}" fontsize="9%" color="{clrWhite}" text="{shorttext}" />
+ <drawtextbox x="0" y="{posy(shorttext)} + {height(shorttext)}" width="100%" font="{regular}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ </areascroll>
+ <area condition="not{folder}++{hasposter}" x="56%" y="53%" width="15%" height="46%" layer="3">
+ <drawimage imagetype="image" path="{posterpath}" align="center" valign="center" width="{areawidth}" height="{areawidth} * {posterheight} / {posterwidth}"/>
+ </area>
+ <areascroll condition="not{folder}++{hasposter}" orientation="vertical" mode="forthandback" delay="1000" scrollspeed="medium" x="72%" y="53%" width="27%" height="46%" layer="3">
+ <drawtext x="0" y="0" font="{semibold}" width="100%" fontsize="10%" color="{clrWhite}" text="{date} - {time}, {duration} min" />
+ <drawtext x="0" y="10%" font="{semibold}" width="100%" fontsize="12%" color="{clrWhite}" text="{epgname}" />
+ <drawtextbox name="shorttext" x="0" y="21%" width="100%" font="{regular}" fontsize="9%" color="{clrWhite}" text="{shorttext}" />
+ <drawtextbox x="0" y="{posy(shorttext)} + {height(shorttext)}" width="100%" font="{regular}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ </areascroll>
+ </currentelement>
+ </menuitems>
+
+</menurecordings>
\ No newline at end of file
diff --git a/skins/blackhole/xmlfiles/displaymenuschedules.xml b/skins/blackhole/xmlfiles/displaymenuschedules.xml
new file mode 100644
index 0000000..5eca045
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenuschedules.xml
@@ -0,0 +1,265 @@
+<menuschedules x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%" >
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ {channelnumber} Number of Channel of current event
+ {channelname} Name of current Channel of current event
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {whatsonfavorites} true if EPGSearch Favorites menu is displayed
+ -->
+ <header>
+ <area x="0" y="0" width="83%" height="8%" layer="3">
+ <drawtext condition="{whatsonnow}||{whatsonnext}||{whatsonfavorites}" x="5" valign="center" font="{semibold}" fontsize="100%" color="{clrWhite}" text="{title}" />
+ <drawimage name="logo" condition="{whatson}" imagetype="channellogo" path="{channelid}" x="1%" width="5%" height="90%" align="left" valign="center" />
+ <drawtext condition="{whatson}" x="{posx(logo)} + {width(logo)}+20" valign="center" font="{semibold}" fontsize="100%" color="{clrWhite}" text="{channelnumber} - {channelname}" />
+ </area>
+ </header>
+
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <menuitems x="1%" y="10%" orientation="vertical" width="98%" height="80%" align="center" numlistelements="{nummenuitems}">
+ <!-- Available Variables schedules menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {title} title of event
+ {shorttext} shorttext of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ {channelname} Channel Name
+ {channelnumber} Channel Number
+ {channelid} ChannelID as path to display channel logo
+ {channellogoexists} true if a channel logo exists
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {whatsonfavorites} true if EPGSearch Favorites menu is displayed
+ {timerpartitial} true if partitial timer is set for the event
+ {timerfull} true if full timer is set for the event
+ {hasVPS} true if event has VPS information
+ -->
+ <listelement>
+ <area x="0" width="51%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="0" width="100%" height="100%"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <!-- progress bar for running -->
+ <area condition="{running}" x="25%" width="25%" layer="4">
+ <drawimage imagetype="skinpart" path="progressbarback" x="0" y="10%" width="100%" height="20%"/>
+ </area>
+ <area condition="{running}" x="25%" width="25%" layer="5">
+ <drawimage imagetype="skinpart" path="progressbar" x="{areaheight}*0.1" y="10%" width="{elapsed}/{duration}*{areawidth} - {elapsed}/{duration}*{areaheight}*0.2" height="20%"/>
+ </area>
+ <area condition="{running}" x="25%" width="25%" layer="6">
+ <drawimage imagetype="skinpart" path="progressbarend" x="{areaheight}*0.1 + {elapsed}/{duration}*{areawidth} - {elapsed}/{duration}*{areaheight}*0.2 - 1" y="10%" width="{areaheight}*0.1" height="20%"/>
+ </area>
+ <!-- timer symbols-->
+ <area condition="{timerfull}||{timerpartitial}" x="47%" width="3%" layer="4">
+ <drawimage condition="{timerfull}" imagetype="icon" path="ico_timer" align="right" y="1%" width="{areaheight}/2" height="{areaheight}/2" />
+ <drawimage condition="{timerpartitial}" imagetype="icon" path="ico_timer" align="right" y="1%" width="{areaheight} * 0.35" height="{areaheight} * 0.35" />
+ </area>
+ <!-- element whatson -->
+ <area condition="not{separator}++{whatson}++not{current}" x="1%" width="50%" layer="3">
+ <drawtext x="0" y="5%" font="{regular}" fontsize="35%" color="{clrGray}" text="{start} - {stop}" />
+ </area>
+ <areascroll condition="{showsubtitle}++not{separator}++{whatson}++not{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="50%" layer="3">
+ <drawtext name="menutext" x="0" y="32%" font="{regular}" fontsize="45%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <area condition="{showsubtitle}++not{separator}++{whatson}++not{current}" x="1%" width="50%" layer="3">
+ <drawtext x="0" y="73%" width="98%" font="{regular}" fontsize="27%" color="{clrGray}" text="{shorttext}" />
+ </area>
+ <areascroll condition="not{showsubtitle}++not{separator}++{whatson}++not{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="50%" layer="3">
+ <drawtext name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <!-- current element whatson -->
+ <area condition="not{separator}++{whatson}++{current}" x="1%" width="50%" layer="3">
+ <drawtext x="0" y="5%" font="{regular}" fontsize="35%" color="{clrWhite}" text="{start} - {stop}" />
+ </area>
+ <areascroll condition="{showsubtitle}++not{separator}++{whatson}++{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="50%" layer="3">
+ <drawtext name="menutext" x="0" y="32%" font="{regular}" fontsize="45%" color="{clrWhite}" text="{title}" />
+ </areascroll>
+ <area condition="{showsubtitle}++not{separator}++{whatson}++{current}" x="1%" width="50%" layer="3">
+ <drawtext x="0" y="73%" width="98%" font="{regular}" fontsize="27%" color="{clrWhite}" text="{shorttext}" />
+ </area>
+ <areascroll condition="not{showsubtitle}++not{separator}++{whatson}++{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="50%" layer="3">
+ <drawtext name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrWhite}" text="{title}" />
+ </areascroll>
+ <!-- element whatsonnow -->
+ <area condition="not{separator}++{whatsonnow}" x="1%" width="9%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" width="90%" height="90%" align="center" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonnow}++not{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="5%" font="{regular}" fontsize="35%" color="{clrGray}" text="{start} - {stop}" />
+ </area>
+ <areascroll condition="{showsubtitle}++not{separator}++{whatsonnow}++not{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="32%" font="{regular}" fontsize="45%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <area condition="{showsubtitle}++not{separator}++{whatsonnow}++not{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="73%" width="98%" font="{regular}" fontsize="27%" color="{clrGray}" text="{shorttext}" />
+ </area>
+ <areascroll condition="not{showsubtitle}++not{separator}++{whatsonnow}++not{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <!-- current element whatsonnow -->
+ <area condition="not{separator}++{whatsonnow}++{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="5%" font="{regular}" fontsize="35%" color="{clrWhite}" text="{start} - {stop}" />
+ </area>
+ <areascroll condition="{showsubtitle}++not{separator}++{whatsonnow}++{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="32%" font="{regular}" fontsize="45%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <area condition="{showsubtitle}++not{separator}++{whatsonnow}++{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="73%" width="98%" font="{regular}" fontsize="27%" color="{clrGray}" text="{shorttext}" />
+ </area>
+ <areascroll condition="not{showsubtitle}++not{separator}++{whatsonnow}++{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <!-- element whatsonnext -->
+ <area condition="not{separator}++{whatsonnext}" x="1%" width="9%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" width="90%" height="90%" align="center" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonnext}++not{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="5%" font="{regular}" fontsize="35%" color="{clrGray}" text="{start} - {stop}" />
+ </area>
+ <areascroll condition="{showsubtitle}++not{separator}++{whatsonnext}++not{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="32%" font="{regular}" fontsize="45%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <area condition="{showsubtitle}++not{separator}++{whatsonnext}++not{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="73%" width="98%" font="{regular}" fontsize="27%" color="{clrGray}" text="{shorttext}" />
+ </area>
+ <areascroll condition="not{showsubtitle}++not{separator}++{whatsonnext}++not{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <!-- current element whatsonnext -->
+ <area condition="not{separator}++{whatsonnext}++{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="5%" font="{regular}" fontsize="35%" color="{clrWhite}" text="{start} - {stop}" />
+ </area>
+ <areascroll condition="{showsubtitle}++not{separator}++{whatsonnext}++{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="32%" font="{regular}" fontsize="45%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <area condition="{showsubtitle}++not{separator}++{whatsonnext}++{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="73%" width="98%" font="{regular}" fontsize="27%" color="{clrGray}" text="{shorttext}" />
+ </area>
+ <areascroll condition="not{showsubtitle}++not{separator}++{whatsonnext}++{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <!-- element whatsonfavorites -->
+ <area condition="not{separator}++{whatsonfavorites}" x="1%" width="9%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" width="90%" height="90%" align="center" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonfavorites}++not{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="5%" font="{regular}" fontsize="35%" color="{clrGray}" text="{start} - {stop}" />
+ </area>
+ <areascroll condition="{showsubtitle}++not{separator}++{whatsonfavorites}++not{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="32%" font="{regular}" fontsize="45%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <area condition="{showsubtitle}++not{separator}++{whatsonfavorites}++not{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="73%" width="98%" font="{regular}" fontsize="27%" color="{clrGray}" text="{shorttext}" />
+ </area>
+ <areascroll condition="not{showsubtitle}++not{separator}++{whatsonfavorites}++not{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <!-- current element whatsonfavorites -->
+ <area condition="not{separator}++{whatsonfavorites}++{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="5%" font="{regular}" fontsize="35%" color="{clrWhite}" text="{start} - {stop}" />
+ </area>
+ <areascroll condition="{showsubtitle}++not{separator}++{whatsonfavorites}++{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="32%" font="{regular}" fontsize="45%" color="{clrGray}" text="{title}" />
+ </areascroll>
+ <area condition="{showsubtitle}++not{separator}++{whatsonfavorites}++{current}" x="11%" width="39%" layer="3">
+ <drawtext x="0" y="73%" width="98%" font="{regular}" fontsize="27%" color="{clrGray}" text="{shorttext}" />
+ </area>
+ <areascroll condition="not{showsubtitle}++not{separator}++{whatsonfavorites}++{current}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="11%" width="39%" layer="3">
+ <drawtext name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrGray}" text="{title}" />
+ </areascroll>
+
+ <!-- day or channel separator -->
+ <area condition="{separator}" x="1%" width="50%" layer="3">
+ <drawtext x="0" valign="center" font="{regular}" fontsize="70%" color="{clrWhite}" text="{title}" />
+ </area>
+ </listelement>
+ <!-- Available Variables schedules menu currentelement:
+ {menuitemx} x position of according menu item
+ {menuitemy} y position of according menu item
+ {menuitemwidth} width of according menu item
+ {menuitemheight} height of according menu item
+ {title} title of event
+ {shorttext} shorttext of event
+ {description} detailed description of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {channelname} Channel Name
+ {channelnumber} Channel Number
+ {channelid} ChannelID as path to display channel logo
+ {channellogoexists} true if a channel logo exists
+ {hasposter} true if a scraped poster is available for this element
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {timerpartitial} true if partitial timer is set for the event
+ {timerfull} true if full timer is set for the event
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {whatsonfavorites} true if EPGSearch Favorites menu is displayed
+ {schedule[]} array with next 10 schedules, only for whatsonnow and whatsonnext
+ {schedule[title]} title of event
+ {schedule[shorttext]} shorttext of event
+ {schedule[start]} start time of event in hh:mm
+ {schedule[stop]} stop time of event in hh:mm
+ -->
+ <currentelement delay="200" fadetime="0">
+ <area x="55%" y="52%" width="45%" height="48%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <areascroll condition="not{hasposter}" orientation="vertical" mode="forthandback" delay="1000" scrollspeed="medium" x="56%" y="53%" width="43%" height="46%" layer="3">
+ <drawtext x="0" y="0" font="{semibold}" width="100%" fontsize="10%" color="{clrWhite}" text="{day} {daynumeric}.{month} {start} - {stop}" />
+ <drawtext x="0" y="10%" font="{semibold}" width="100%" fontsize="12%" color="{clrWhite}" text="{title}" />
+ <drawtextbox name="shorttext" x="0" y="21%" width="100%" font="{regular}" fontsize="9%" color="{clrWhite}" text="{shorttext}" />
+ <drawtextbox x="0" y="{posy(shorttext)} + {height(shorttext)}" width="100%" font="{regular}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ </areascroll>
+ <area condition="{hasposter}" x="56%" y="53%" width="15%" height="46%" layer="3">
+ <drawimage imagetype="image" path="{posterpath}" align="center" valign="center" width="{areawidth}" height="{areawidth} * {posterheight} / {posterwidth}"/>
+ </area>
+ <areascroll condition="{hasposter}" orientation="vertical" mode="forthandback" delay="1000" scrollspeed="medium" x="72%" y="53%" width="27%" height="46%" layer="3">
+ <drawtext x="0" y="0" font="{semibold}" width="100%" fontsize="10%" color="{clrWhite}" text="{day} {daynumeric}.{month} {start} - {stop}" />
+ <drawtext x="0" y="10%" font="{semibold}" width="100%" fontsize="12%" color="{clrWhite}" text="{title}" />
+ <drawtextbox name="shorttext" x="0" y="21%" width="100%" font="{regular}" fontsize="9%" color="{clrWhite}" text="{shorttext}" />
+ <drawtextbox x="0" y="{posy(shorttext)} + {height(shorttext)}" width="100%" font="{regular}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ </areascroll>
+ </currentelement>
+ </menuitems>
+
+</menuschedules>
\ No newline at end of file
diff --git a/skins/blackhole/xmlfiles/displaymenusetup.xml b/skins/blackhole/xmlfiles/displaymenusetup.xml
new file mode 100644
index 0000000..a86dfd4
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenusetup.xml
@@ -0,0 +1,51 @@
+<menusetup x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%" >
+
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <menuitems x="1%" y="10%" orientation="vertical" width="98%" height="80%" align="center" numlistelements="{nummenuitemsmain}">
+ <!-- Available Variables setup menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ <area x="0" width="51%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="0" width="100%" height="100%"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="0" width="51%" layer="3">
+ <drawtext condition="not{current}" x="1%" width="98%" valign="center" font="{regular}" fontsize="80%" color="{clrGray}" text="{number} {label} " />
+ <drawtext condition="{current}" x="1%" width="98%" valign="center" font="{regular}" fontsize="80%" color="{clrWhite}" text="{number} {label} " />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables main menu currentelement:
+ {menuitemx} x position of according menu item
+ {menuitemy} y position of according menu item
+ {menuitemwidth} width of according menu item
+ {menuitemheight} height of according menu item
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ -->
+ <currentelement delay="50" fadetime="0">
+ <area x="55%" y="52%" width="45%" height="48%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="55%" y="52%" width="45%" height="48%" layer="3">
+ <drawimage imagetype="menuicon" path="{icon}" align="center" valign="center" width="{areaheight}*0.9" height="{areaheight}*0.9"/>
+ </area>
+ </currentelement>
+ </menuitems>
+
+</menusetup>
diff --git a/skins/blackhole/xmlfiles/displaymenutimers.xml b/skins/blackhole/xmlfiles/displaymenutimers.xml
new file mode 100644
index 0000000..8805203
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymenutimers.xml
@@ -0,0 +1,117 @@
+<menutimers x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%" >
+
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <menuitems x="1%" y="10%" orientation="vertical" width="98%" height="80%" align="center" numlistelements="{nummenuitems}">
+ <!-- Available Variables channels menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {title} Title of Timer
+ {timerstart} Start Time of Timer in hh::mm
+ {timerstop} End Time of Timer in hh::mm
+ {day} Day (numerical)
+ {dayname} Day, for repeating timers days where timer is active
+ {month} Month (two digits)
+ {monthname} Month, three letter abbrevation
+ {year} Year (4 digits)
+ {channelname} Name of channel which is set for the timer
+ {channellogoexists} true if a channel logo exists
+ {channelid} ID of channel which is set for the timer (for dispalying channel logo)
+ {channelnumber} Number of channel which is set for the timer
+ {eventtitle} Title of corresponding event
+ {eventstart} Start Time of corresponding event in hh::mm
+ {eventstop} Stop Time of corresponding event in hh::mm
+ {current} true if item is currently selected
+ {flagactive} true if timer is active
+ {flaginstant} true if timer is an instant timer
+ {flagvps} true if timer uses VPS
+ {flagrecording} true if is recording currently
+ {flagpending} true if timer is pending
+ -->
+ <listelement>
+ <area x="0" width="51%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="0" width="100%" height="100%"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area condition="not{separator}" x="1%" width="9%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" width="90%" height="90%" align="center" valign="center" />
+ </area>
+ <area condition="not{separator}" x="11%" width="39%" layer="3">
+ <drawtext condition="not{current}" x="0" y="5%" font="{regular}" fontsize="35%" color="{clrGray}" text="{channelname}, {dayname} {day}.{month} {timerstart} - {timerstop}" />
+ <drawtext condition="{current}" x="0" y="5%" font="{regular}" fontsize="35%" color="{clrWhite}" text="{channelname}, {dayname} {day}.{month} {timerstart} - {timerstop}" />
+ </area>
+ <area condition="not{separator}" x="11%" width="39%" layer="4">
+ <drawimage condition="{flagactive}" imagetype="icon" path="ico_timer_active" align="right" y="8%" width="{areaheight}/3" height="{areaheight}/3" />
+ <drawimage condition="not{flagactive}" imagetype="icon" path="ico_timer_inactive" align="right" y="8%" width="{areaheight}/3" height="{areaheight}/3" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" condition="not{separator}" x="11%" width="39%" layer="3">
+ <drawtext condition="not{current}" name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrGray}" text="{title}" />
+ <drawtext condition="{current}" name="menutext" x="0" y="35%" font="{regular}" fontsize="60%" color="{clrWhite}" text="{title}" />
+ </areascroll>
+ <area condition="{separator}" x="1%" width="50%" layer="3">
+ <drawtext x="0" valign="center" font="{regular}" fontsize="70%" color="{clrWhite}" text="{title}" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {menuitemx} x position of according menu item
+ {menuitemy} y position of according menu item
+ {menuitemwidth} width of according menu item
+ {menuitemheight} height of according menu item
+ {title} Title of Timer
+ {timerstart} Start Time of Timer in hh::mm
+ {timerstop} End Time of Timer in hh::mm
+ {day} Day (numerical)
+ {dayname} Day, for repeating timers days where timer is active
+ {month} Month (two digits)
+ {monthname} Month, three letter abbrevation
+ {year} Year (4 digits)#
+ {channelname} Name of channel which is set for the timer
+ {channellogoexists} true if a channel logo exists
+ {channelid} ID of channel which is set for the timer (for dispalying channel logo)
+ {channelnumber} Number of channel which is set for the timer
+ {eventtitle} Title of corresponding event
+ {eventstart} Start Time of corresponding event in hh::mm
+ {eventstop} Stop Time of corresponding event in hh::mm
+ {eventshorttext} Short Text corresponding event
+ {eventdescription} Description corresponding event
+ {hasposter} true if a scraped poster is available for event
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {flagactive} true if timer is active
+ {flaginstant} true if timer is an instant timer
+ {flagvps} true if timer uses VPS
+ {flagrecording} true if is recording currently
+ {flagpending} true if timer is pending
+ -->
+ <currentelement delay="500" fadetime="0">
+ <area condition="{flagactive}" x="55%" y="52%" width="45%" height="48%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <areascroll condition="{flagactive} ++ not{hasposter}" orientation="vertical" mode="forthandback" delay="1000" scrollspeed="medium" x="56%" y="53%" width="43%" height="46%" layer="3">
+ <drawtext x="0" y="0" font="{semibold}" width="100%" fontsize="10%" color="{clrWhite}" text="{dayname} {day}.{month} {eventstart} - {eventstop}" />
+ <drawtext x="0" y="10%" font="{semibold}" width="100%" fontsize="12%" color="{clrWhite}" text="{eventtitle}" />
+ <drawtextbox name="shorttext" x="0" y="21%" width="100%" font="{regular}" fontsize="9%" color="{clrWhite}" text="{eventshorttext}" />
+ <drawtextbox x="0" y="{posy(shorttext)} + {height(shorttext)}" width="100%" font="{regular}" fontsize="8%" color="{clrWhite}" text="{eventdescription}" />
+ </areascroll>
+ <area condition="{flagactive} ++ {hasposter}" x="56%" y="53%" width="15%" height="46%" layer="3">
+ <drawimage imagetype="image" path="{posterpath}" align="center" valign="center" width="{areawidth}" height="{areawidth} * {posterheight} / {posterwidth}"/>
+ </area>
+ <areascroll condition="{flagactive} ++ {hasposter}" orientation="vertical" mode="forthandback" delay="1000" scrollspeed="medium" x="72%" y="53%" width="27%" height="46%" layer="3">
+ <drawtext x="0" y="0" font="{semibold}" width="100%" fontsize="10%" color="{clrWhite}" text="{dayname} {day}.{month} {eventstart} - {eventstop}" />
+ <drawtext x="0" y="10%" font="{semibold}" width="100%" fontsize="12%" color="{clrWhite}" text="{eventtitle}" />
+ <drawtextbox name="shorttext" x="0" y="21%" width="100%" font="{regular}" fontsize="9%" color="{clrWhite}" text="{eventshorttext}" />
+ <drawtextbox x="0" y="{posy(shorttext)} + {height(shorttext)}" width="100%" font="{regular}" fontsize="8%" color="{clrWhite}" text="{eventdescription}" />
+ </areascroll>
+ </currentelement>
+
+ </menuitems>
+
+</menutimers>
\ No newline at end of file
diff --git a/skins/blackhole/xmlfiles/displaymessage.xml b/skins/blackhole/xmlfiles/displaymessage.xml
new file mode 100644
index 0000000..1f18edf
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displaymessage.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaymessage SYSTEM "../../../dtd/displaymessage.dtd">
+
+<displaymessage x="0" y="0" width="100%" height="100%" fadetime="{fadetime}">
+
+ <background>
+ </background>
+
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ <area x="5%" y="80%" width="90%" height="15%" layer="6">
+ <drawimage condition="{status}" imagetype="skinpart" path="messageblue" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{info}" imagetype="skinpart" path="messagegreen" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{warning}" imagetype="skinpart" path="messageyellow" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{error}" imagetype="skinpart" path="messagered" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="5%" y="80%" width="90%" height="15%" layer="7">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="40%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+
+</displaymessage>
diff --git a/skins/blackhole/xmlfiles/displayreplay.xml b/skins/blackhole/xmlfiles/displayreplay.xml
new file mode 100644
index 0000000..4ea2577
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displayreplay.xml
@@ -0,0 +1,379 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayreplay SYSTEM "../../../dtd/displayreplay.dtd">
+
+<displayreplay x="0" y="0" width="100%" height="100%" fadetime="{fadetime}">
+
+ <background>
+ <!-- global background -->
+ <area x="0" y="70%" width="100%" height="30%" layer="2">
+ <drawimage imagetype="skinpart" path="displaychannelback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <!-- progressbar background -->
+ <area x="17%" y="81%" width="67%" height="12%" layer="3">
+ <drawimage imagetype="skinpart" path="displaychannelbackepg" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="18%" y="84%" width="65%" height="{areaheight}*0.024" layer="4">
+ <drawimage imagetype="skinpart" path="progressbarback_replay" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <!-- watch background -->
+ <area x="86%" y="76%" width="{areaheight}*0.18" height="{areaheight}*0.18" layer="3">
+ <drawimage imagetype="skinpart" path="watchback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+
+ <backgroundmodeonly>
+ <area x="{areawidth}/2 - 2.5*{areaheight}*0.1" y="82%" width="5*{areaheight}*0.1" height="10%" layer="2">
+ <fill color="{clrBlackTrans}" />
+ </area>
+ </backgroundmodeonly>
+
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {monthnameshort} 3 letter abbrivation of month name
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="86%" y="70%" width="{areaheight}*0.18" height="5%" layer="4">
+ <drawtext align="center" y="0" font="{semibold}" fontsize="100%" color="{clrWhite}" text="{daynameshort} {day}.{month}" />
+ </area>
+ <area x="86%" y="94%" width="{areaheight}*0.18" height="5%" layer="4">
+ <drawtext align="center" y="0" font="{digital}" fontsize="100%" color="{clrWhite}" text="{time}" />
+ </area>
+ </datetime>
+
+ <!-- Available Variables time:
+ {sec} current seconds
+ {min} current minutes
+ {hour} current hours
+ {hmins} current "hourminutes" to display an hour hand
+ -->
+ <time>
+ <area x="86%" y="76%" width="{areaheight}*0.18" height="{areaheight}*0.18" layer="6">
+ <drawimage imagetype="skinpart" path="watchhands/s_{sec}" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="86%" y="76%" width="{areaheight}*0.18" height="{areaheight}*0.18" layer="5">
+ <drawimage imagetype="skinpart" path="watchhands/m_{min}" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="86%" y="76%" width="{areaheight}*0.18" height="{areaheight}*0.18" layer="4">
+ <drawimage imagetype="skinpart" path="watchhands/h_{hmins}" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </time>
+
+ <!-- Available Variables scrapercontent:
+ {posterpath} Full Path of Poster to use in image path attribute
+ {posterwidth} width of poster in pixel
+ {posterheight} height of poster in pixel
+ {hasposter} true if poster is available
+ {bannerpath} Full Path of banner to use in image path attribute
+ {bannerwidth} width of banner in pixel
+ {bannerheight} height of banner in pixel
+ {hasBanner} true if banner is available
+
+ Use this tokens if you want to display a banner for series and a poster for movies:
+ {mediapath} Full Path of Poster or Banner to use in image path attribute
+ {mediawidth} width of image in pixel
+ {mediaheight} height of image in pixel
+ {isbanner} true if image is a banner, false if it is a poster
+ -->
+ <scrapercontent>
+ <area condition="{hasposter}" x="1%" y="75%" width="{areaheight}*0.21*{posterwidth}/{posterheight}" height="21%" layer="3">
+ <drawimage imagetype="image" path="{posterpath}" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area condition="not{hasposter}" x="1%" y="75%" width="14%" height="21%" layer="3">
+ <drawimage imagetype="icon" path="ico_recording" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </scrapercontent>
+
+ <!-- Available Variables rectitle:
+ {rectitle} Title of Recording
+ {recsubtitle} Subtitle of the Recording
+ {recdate} Date Recording in dd.mm.yy
+ {rectime} Time of Recording in hh:mm
+ -->
+ <rectitle>
+ <area x="17%" y="75%" width="67%" height="6%" layer="3">
+ <drawtext x="0" y="0" font="{semibold}" width="100%" fontsize="100%" color="{clrWhite}" text="{rectitle} - {recsubtitle}" />
+ </area>
+ </rectitle>
+
+ <!-- Available Variables recinfo:
+ {screenwidth} width of currently displayed recording in px
+ {screenheight} height of currently displayed recording in px
+ {resolution} resolution: hd1080i, hd720p, sd576i
+ {aspect} screen aspect, each 4:3, 16:9 or 21:9
+ {isHD} true for hd1080i and hd720p
+ {isWideScreen} true if aspect is 16:9 or 21:9
+ -->
+ <recinfo>
+ <area x="17%" y="94%" width="67%" height="5%" layer="5">
+ <drawimage imagetype="icon" path="ico_{resolution}" x="0" y="0" width="{areaheight}*3" height="{areaheight}"/>
+ <drawimage condition="{isWideScreen}" imagetype="icon" path="ico_widescreen" x="{areaheight}*3 + 10" y="0" width="{areaheight}*3" height="{areaheight}"/>
+ </area>
+ </recinfo>
+
+ <!-- Available Variables currenttime:
+ {reccurrent} Current Time in hh:mm:ss
+ -->
+ <currenttime>
+ <area x="18%" y="88%" width="30%" height="5%" layer="4">
+ <drawtext x="0" valign="center" font="{digital}" fontsize="80%" color="{clrWhite}" text="{reccurrent}" />
+ </area>
+ </currenttime>
+
+ <!-- Available Variables totaltime:
+ {rectotal} Total Time in hh:mm:ss
+ -->
+ <totaltime>
+ <area x="54%" y="88%" width="29%" height="5%" layer="4">
+ <drawtext align="right" valign="center" font="{digital}" fontsize="80%" color="{clrWhite}" text="{rectotal}" />
+ </area>
+ </totaltime>
+
+ <!-- Available Variables progressbar:
+ {current} current frame of recording
+ {total} total frames of recording
+ -->
+ <progressbar>
+ <area x="18%" y="84%" width="65%" height="{areaheight}*0.024" layer="5">
+ <drawimage imagetype="skinpart" path="progressbar" x="2" y="2" width="{current}/{total}*{areawidth} - {current}/{total}*4" height="{areaheight}-4"/>
+ </area>
+ </progressbar>
+
+ <!-- Available Variables cutmarks:
+ {marks[]} array of available marks
+ {marks[position]} frame of current mark
+ {marks[endposition]} frame where startmark ends
+ {marks[total]} total number of frames
+ {marks[active]} true if current replay position hits exactly the mark
+ {marks[startmark]} true if mark is start mark
+ -->
+ <cutmarks>
+ <area x="18%" y="83%" width="65%" height="{areaheight}*0.044" layer="6" transparency="40">
+ <loop name="marks" x="0" y="0" orientation="absolute">
+ <!-- draw mark -->
+ <drawimage condition="{marks[startmark]}" imagetype="icon" path="ico_cutmark_start" x="{marks[position]}/{marks[total]}*{areawidth} - {areaheight}/3" y="0" width="{areaheight}/3" height="{areaheight}" />
+ <drawimage condition="not{marks[startmark]}" imagetype="icon" path="ico_cutmark_stop" x="{marks[position]}/{marks[total]}*{areawidth}" y="0" width="{areaheight}/3" height="{areaheight}" />
+ <!-- draw bar to next mark if mark is startmark-->
+ <drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="40%" width="{marks[endposition]}/{marks[total]}*{areawidth} - {marks[position]}/{marks[total]}*{areawidth}" height="20%" color="{clrRed}" />
+ </loop>
+ </area>
+ </cutmarks>
+
+ <!-- Available Variables controlicons and controliconsmodeonly:
+ {play} true if recording is played currently
+ {pause} true if recording is paused
+ {forward} true if fast forwarding
+ {forward1x} true if fast forwarding 1x (with 3 trickspeeds)
+ {forward2x} true if fast forwarding 2x (with 3 trickspeeds)
+ {forward3x} true if fast forwarding 3x (with 3 trickspeeds)
+ {rewind} true if rewinding
+ {rewind1x} true if rewinding 1x (with 3 trickspeeds)
+ {rewind2x} true if rewinding 2x (with 3 trickspeeds)
+ {rewind3x} true if rewinding 3x (with 3 trickspeeds)
+ -->
+ <controlicons>
+ <area x="67%" y="70%" width="25%" height="6%" layer="4">
+ <drawimage condition="not{rewind} ++ not{rewind1x} ++ not{rewind2x} ++ not{rewind3x}" imagetype="icon" path="ico_back_inactive" x="0" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind}" imagetype="icon" path="ico_back_active" x="{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind1x}" imagetype="icon" path="ico_back_active_x1" x="0" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind2x}" imagetype="icon" path="ico_back_active_x2" x="0" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind3x}" imagetype="icon" path="ico_back_active_x3" x="0" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{pause}" imagetype="icon" path="ico_pause_inactive" x="{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{pause}" imagetype="icon" path="ico_pause_active" x="{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{play}" imagetype="icon" path="ico_play_inactive" x="2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{play}" imagetype="icon" path="ico_play_active" x="2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{forward} ++ not{forward1x} ++ not{forward2x} ++ not{forward3x}" imagetype="icon" path="ico_fwd_inactive" x="3*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward}" imagetype="icon" path="ico_fwd_active" x="3*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward1x}" imagetype="icon" path="ico_fwd_active_x1" x="3*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward2x}" imagetype="icon" path="ico_fwd_active_x2" x="3*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward3x}" imagetype="icon" path="ico_fwd_active_x3" x="3*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ </area>
+ </controlicons>
+
+ <controliconsmodeonly>
+ <area x="{areawidth}/2 - 2*{areaheight}*0.1" y="82%" width="4*{areaheight}*0.1" height="10%" layer="3">
+ <drawimage condition="not{rewind} ++ not{rewind1x} ++ not{rewind2x} ++ not{rewind3x}" imagetype="icon" path="ico_back_inactive" x="0" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind}" imagetype="icon" path="ico_back_active" x="{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind1x}" imagetype="icon" path="ico_back_active_x1" x="0" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind2x}" imagetype="icon" path="ico_back_active_x2" x="0" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind3x}" imagetype="icon" path="ico_back_active_x3" x="0" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{pause}" imagetype="icon" path="ico_pause_inactive" x="{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{pause}" imagetype="icon" path="ico_pause_active" x="{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{play}" imagetype="icon" path="ico_play_inactive" x="2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{play}" imagetype="icon" path="ico_play_active" x="2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{forward} ++ not{forward1x} ++ not{forward2x} ++ not{forward3x}" imagetype="icon" path="ico_fwd_inactive" x="3*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward}" imagetype="icon" path="ico_fwd_active" x="3*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward1x}" imagetype="icon" path="ico_fwd_active_x1" x="3*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward2x}" imagetype="icon" path="ico_fwd_active_x2" x="3*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward3x}" imagetype="icon" path="ico_fwd_active_x3" x="3*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ </area>
+ </controliconsmodeonly>
+
+ <!-- Available Variables jump:
+ {jump} time to jump to in hh:mm
+ -->
+ <jump>
+ <area x="50%" y="94%" width="30%" height="6%" layer="4">
+ <drawtext align="right" valign="center" font="{digital}" fontsize="60%" color="{clrWhite}" text="{jump}" />
+ </area>
+ </jump>
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ <area x="5%" y="78%" width="90%" height="15%" layer="6">
+ <drawimage condition="{status}" imagetype="skinpart" path="messageblue" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{info}" imagetype="skinpart" path="messagegreen" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{warning}" imagetype="skinpart" path="messageyellow" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{error}" imagetype="skinpart" path="messagered" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="5%" y="78%" width="90%" height="15%" layer="7">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="40%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+
+ <!-- Available Variables onpause and onpausemodeonly:
+ {name} title of recording
+ {shorttext} shorttext of recording
+ {description} description of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of recording in hh:mm
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+ <!-- delay (in seconds) defines the time to wait till viewelement is displayed
+ fadetime in ms -->
+ <onpause delay="30" fadetime="{fadetime}">
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrBlackTrans}" />
+ </area>
+ <area x="0" y="35%" width="100%" height="30%" layer="2">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="100%" color="{clrWhite}" text="{tr(pause)}" />
+ </area>
+ </onpause>
+
+ <onpausemodeonly delay="30" fadetime="{fadetime}">
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrBlackTrans}" />
+ </area>
+ <area x="0" y="35%" width="100%" height="30%" layer="2">
+ <drawtext align="center" valign="center" font="{regular}" fontsize="100%" color="{clrWhite}" text="{tr(pause)}" />
+ </area>
+ </onpausemodeonly>
+
+</displayreplay>
diff --git a/skins/blackhole/xmlfiles/displayvolume.xml b/skins/blackhole/xmlfiles/displayvolume.xml
new file mode 100644
index 0000000..7768aff
--- /dev/null
+++ b/skins/blackhole/xmlfiles/displayvolume.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayvolume SYSTEM "../../../dtd/displayvolume.dtd">
+
+<displayvolume x="79%" y="{areaheight} - {areawidth}*0.26" width="20%" height="{areawidth}*0.25" fadetime="{fadetime}">
+
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="2">
+ <drawimage imagetype="skinpart" path="displayvolumeback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="0" y="0" width="100%" height="100%" layer="3">
+ <drawimage imagetype="skinpart" path="tacho_percent_back" x="{areawidth}*0.059" y="{areawidth}*0.059" width="{areawidth}*0.882" height="{areawidth}*0.882"/>
+ </area>
+ </background>
+
+ <!-- Available Variables volume:
+ {volume} current volume, range from 0 to 255
+ {volpercent} current volume in %
+ {maxvolume} maximal volume
+ {mute} true if volume is muted
+ -->
+ <volume>
+ <area x="0" y="80%" width="100%" height="20%" layer="4">
+ <drawtext align="center" valign="center" color="{clrWhite}" font="{semibold}" fontsize="80%" text="{volume} / {maxvolume}" />
+ </area>
+ <area x="0" y="0" width="100%" height="100%" layer="5">
+ <drawimage imagetype="skinpart" path="tachohands/perc_{volpercent}" x="{areawidth}*0.059" y="{areawidth}*0.059" width="{areawidth}*0.882" height="{areawidth}*0.882"/>
+ </area>
+ <area x="0" y="80%" width="20%" height="20%" layer="5">
+ <drawimage condition="gt({volpercent}, 74)" imagetype="icon" path="ico_volume_full" align="center" valign="center" width="90%" height="90%"/>
+ <drawimage condition="gt({volpercent}, 34) ++ lt({volpercent}, 75)" imagetype="icon" path="ico_volume_medium" align="center" valign="center" width="90%" height="90%"/>
+ <drawimage condition="gt({volpercent}, 0) ++ lt({volpercent}, 35)" imagetype="icon" path="ico_volume_low" align="center" valign="center" width="90%" height="90%"/>
+ <drawimage condition="eq({volpercent}, 0)" imagetype="icon" path="ico_volume_mute" align="center" valign="center" width="90%" height="90%"/>
+ </area>
+ </volume>
+
+</displayvolume>
diff --git a/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecast.xml b/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecast.xml
new file mode 100644
index 0000000..4cccbaf
--- /dev/null
+++ b/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecast.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%" >
+
+ <menuitems x="1%" y="10%" orientation="vertical" width="98%" height="80%" align="center" numlistelements="8">
+ <!-- Available Variables:
+ {current}
+ {menuitemtext} "Current Weather", "Next 48 hours" or "Next 7 days"
+ {iscurrent} true if item is "Current Weather"
+ {ishourly} true if item is "Next 48 hours"
+ {isdaily} true if item is "Next 7 days"
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+
+ If {iscurrent} is true, the following tokens are set:
+ {timestamp} timestamp in hh:mm dd.mm of current forecast
+ {temperature} current temperature in °C
+ {apparenttemperature} apparent (felt) temperature in °C
+ {summary} short summary of current weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {precipitationintensity} precipitation intensity in l/qm
+ {precipitationprobability} precipitation probability in %
+ {precipitationtype} precipitation type (snow, ...)
+ {humidity} humidity in %
+ {windspeed} wind speed in km/h
+ {windbearing} wind bearing in degrees
+ {windbearingstring} wind bearing as human readable string (e.g NE, NNE, ...)
+ {visibility} visibility in km
+ {cloudcover} cloud cover in %
+ {pressure} pressure in HPa
+ {ozone} Ozone in DU (Dobson Unit)
+
+ If {ishourly} is true, the following tokens are set:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+
+ {hourly[]} array with up to 48 hourly forecasts
+ {hourly[num]} number of forecast, starting at 1
+ {hourly[timestamp]} timestamp in hh:mm
+ {hourly[temperature]} temperature in °C
+ {hourly[apparenttemperature]} apparent (felt) temperature in °C
+ {hourly[summary]} short summary
+ {hourly[icon]} path to use in <drawimage> to display appropriate weather icon
+ {hourly[precipitationintensity]} precipitation intensity in l/qm
+ {hourly[precipitationprobability]} precipitation probability in %
+ {hourly[precipitationtype]} precipitation type (snow, ...)
+ {hourly[humidity]} humidity in %
+ {hourly[windspeed]} wind speed in km/h
+ {hourly[windbearing]} wind bearing in degrees
+ {hourly[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {hourly[visibility]} visibility in km
+ {hourly[cloudcover]} cloud cover in %
+ {hourly[pressure]} pressure in HPa
+ {hourly[ozone]} Ozone in DU (Dobson Unit)
+
+ If {isdaily} is true, the following tokens are set:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+
+ {daily[day]} day of forecast in dd.mm
+ {daily[dayname]} three letter abbrivated day name
+ {daily[temperaturemin]} minimum temperature at this day in °C
+ {daily[temperaturemintime]} time of minimum temperature
+ {daily[temperaturemax]} maximum temperature at this day in °C
+ {daily[temperaturemaxtime]} time of maximum temperature
+ {daily[summary]} short summary
+ {daily[icon]} path to use in <drawimage> to display appropriate weather icon
+ {daily[precipitationintensity]} precipitation intensity in l/qm
+ {daily[precipitationprobability]} precipitation probability in %
+ {daily[precipitationtype]} precipitation type (snow, ...)
+ {daily[humidity]} humidity in %
+ {daily[windspeed]} wind speed in km/h
+ {daily[windbearing]} wind bearing in degrees
+ {daily[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {daily[visibility]} visibility in km
+ {daily[cloudcover]} cloud cover in %
+ {daily[pressure]} pressure in HPa
+ {daily[ozone]} Ozone in DU (Dobson Unit)
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="0" width="51%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="0" width="100%" height="100%"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="0" width="51%" layer="3">
+ <drawtext x="10" valign="center" font="{regular}" fontsize="80%" color="{clrWhite}" text="{menuitemtext}" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- All Tokens from listelement are available -->
+ <currentelement delay="100" fadetime="0">
+ <area x="0" y="52%" width="100%" height="48%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area condition="{iscurrent}" x="1%" y="53%" width="98%" height="46%" layer="3">
+ <drawtext x="0" y="0" font="{semibold}" fontsize="20%" color="{clrWhite}" text="{city} {timestamp}" />
+ <drawtext x="0" y="20%" font="{semibold}" fontsize="15%" color="{clrWhite}" text="{summary}" />
+ <drawimage name="weathericon" imagetype="icon" path="{icon}" align="right" y="0" width="{areaheight}*0.5" height="{areaheight}*0.5"/>
+ <drawtext name="temperature" x="{areawidth} - {width(weathericon)} - {width(temperature)} - 15" y="0" font="{regular}" fontsize="40%" color="{clrWhite}" text="{temperature}°C" />
+ <drawtext x="0" y="40%" font="{regular}" fontsize="15%" color="{clrWhite}" text="{tr(apparenttemp)}: {apparenttemperature} °C" />
+ <drawtext x="0" y="55%" font="{regular}" fontsize="15%" color="{clrWhite}" text="{tr(precipitationprobability)}: {precipitationprobability} %, {tr(precipitationintensity)}: {precipitationintensity} l/qm" />
+ <drawtext x="0" y="70%" font="{regular}" fontsize="15%" color="{clrWhite}" text="{tr(humidity)}: {humidity} %, {tr(cloudcover)}: {cloudcover} %" />
+ <drawtext x="0" y="85%" font="{regular}" fontsize="15%" color="{clrWhite}" text="{tr(windspeed)}: {windspeed} km/h, {tr(windbearing)}: {windbearingstring} ({windbearing} °)" />
+ </area>
+ <area condition="{ishourly}" x="1%" y="53%" width="98%" height="46%" layer="3">
+ <loop name="hourly" x="0" y="0" orientation="horizontal" columnwidth="{areawidth}/8" rowheight="{areaheight}" overflow="cut">
+ <drawtext align="center" y="0" font="{semibold}" fontsize="15%" color="{clrWhite}" text="{hourly[timestamp]}" />
+ <drawimage imagetype="icon" path="{hourly[icon]}" align="center" y="15%" width="{columnwidth}*0.8" height="{columnwidth}*0.8"/>
+ <drawtext align="center" y="{columnwidth}*0.8 + {rowheight}*0.15" font="{regular}" fontsize="15%" color="{clrWhite}" text="{hourly[temperature]}°C" />
+ <drawtextbox x="0" y="{columnwidth}*0.8 + {rowheight}*0.3" width="{columnwidth}" maxlines="2" align="center" font="{regular}" fontsize="10%" color="{clrWhite}" text="{hourly[summary]}" />
+ <drawimage imagetype="skinpart" path="line_vertical" x="{columnwidth}" y="0" width="2" height="{rowheight}"/>
+ </loop>
+ </area>
+ <area condition="{isdaily}" x="1%" y="53%" width="98%" height="46%" layer="3">
+ <loop name="daily" x="0" y="0" orientation="horizontal" columnwidth="{areawidth}/7" rowheight="{areaheight}" overflow="cut">
+ <drawtext align="center" y="0" font="{semibold}" fontsize="14%" color="{clrWhite}" text="{daily[dayname]}" />
+ <drawtext align="center" y="10%" font="{semibold}" fontsize="14%" color="{clrWhite}" text="{daily[day]}" />
+ <drawimage imagetype="icon" path="{daily[icon]}" align="center" y="25%" width="{columnwidth}*0.6" height="{columnwidth}*0.6"/>
+ <drawtext align="center" y="{rowheight}*0.65" font="{regular}" fontsize="13%" color="{clrWhite}" text="{daily[temperaturemin]}°C - {daily[temperaturemax]}°C" />
+ <drawtextbox x="{columnwidth}*0.02" y="{rowheight}*0.80" width="{columnwidth}*0.96" maxlines="2" align="center" font="{regular}" fontsize="8%" color="{clrWhite}" text="{daily[summary]}" />
+ <drawimage imagetype="skinpart" path="line_vertical" x="{columnwidth}" y="0" width="2" height="{rowheight}"/>
+ </loop>
+ </area>
+ </currentelement>
+ </menuitems>
+</menuplugin>
\ No newline at end of file
diff --git a/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml b/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml
new file mode 100644
index 0000000..8b73e9c
--- /dev/null
+++ b/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%">
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+ <!-- Available Variables in detailheader and tab:
+ {menuheader} "Current Weather"
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+ {timestamp} timestamp in hh:mm dd.mm of current forecast
+ {temperature} current temperature in °C
+ {apparenttemperature} apparent (felt) temperature in °C
+ {temperaturemin} minimum temperature the day in °C
+ {temperaturemax} maximum temperature the day in °C
+ {summary} short summary of current weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {precipitationintensity} precipitation intensity in l/qm
+ {precipitationprobability} precipitation probability in %
+ {precipitationtype} precipitation type (snow, ...)
+ {humidity} humidity in %
+ {windspeed} wind speed in km/h
+ {windbearing} wind bearing in degrees
+ {windbearingstring} wind bearing as human readable string (e.g NE, NNE, ...)
+ {visibility} visibility in km
+ {cloudcover} cloud cover in %
+ {pressure} pressure in HPa
+ {ozone} Ozone in DU (Dobson Unit)
+ -->
+ <detailheader>
+ <area x="1%" y="10%" width="50%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymendetailback" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="55%" y="52%" width="43%" height="38%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="55%" y="52%" width="43%" height="38%" layer="3">
+ <drawimage imagetype="icon" path="{icon}" x="5%" y="5%" width="{areaheight}/2" height="{areaheight}/2"/>
+ </area>
+ <area x="55%" y="52%" width="42%" height="37%" layer="4">
+ <drawtext align="right" valign="bottom" font="{regular}" fontsize="50%" color="{clrWhite}" text="{temperature}°C" />
+ </area>
+ </detailheader>
+
+ <tab name="current" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <drawtext x="0" y="0" font="{semibold}" fontsize="8%" color="{clrWhite}" text="{tr(conditions)} {tr(for)} {city}" />
+ <drawtext x="0" y="8%" font="{semibold}" fontsize="8%" color="{clrWhite}" text="({latitude}, {longitude})" />
+ <drawtext x="0" y="16%" font="{regular}" fontsize="8%" color="{clrWhite}" text="{summary}" />
+
+ <drawtext x="0" y="28%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(temp)}: {temperature}°C" />
+ <drawtext x="0" y="34%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(apparenttemp)}: {apparenttemperature}°C" />
+ <drawtext x="0" y="40%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(todaymin)}: {mintemperature}°C" />
+ <drawtext x="0" y="46%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(todaymax)}: {maxtemperature}°C" />
+ <drawtext x="0" y="52%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(precipitationprobability)}: {precipitationprobability} %" />
+ <drawtext x="0" y="58%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(precipitationintensity)}: {precipitationintensity} l/qm" />
+ <drawtext x="0" y="64%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(humidity)}: {humidity} %" />
+ <drawtext x="0" y="70%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(windspeed)}: {windspeed} km/h aus {windbearingstring}" />
+ <drawtext x="0" y="76%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(visibility)}: {visibility} km" />
+ <drawtext x="0" y="82%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(cloudcover)}: {cloudcover} %" />
+ <drawtext x="0" y="88%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(pressure)}: {pressure} HPa" />
+ <drawtext x="0" y="94%" font="{regular}" fontsize="6%" color="{clrWhite}" text="{tr(ozone)}: {ozone} DU" />
+ </tab>
+</menuplugin>
diff --git a/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml b/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml
new file mode 100644
index 0000000..e6b3d8c
--- /dev/null
+++ b/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%">
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+
+ <!-- Available Variables in detailheader and tab:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+
+ {daily[day]} day of forecast in dd.mm
+ {daily[dayname]} three letter abbrivated day name
+ {daily[temperaturemin]} minimum temperature at this day in °C
+ {daily[temperaturemintime]} time of minimum temperature
+ {daily[temperaturemax]} maximum temperature at this day in °C
+ {daily[temperaturemaxtime]} time of maximum temperature
+ {daily[summary]} short summary
+ {daily[icon]} path to use in <drawimage> to display appropriate weather icon
+ {daily[precipitationintensity]} precipitation intensity in l/qm
+ {daily[precipitationprobability]} precipitation probability in %
+ {daily[precipitationtype]} precipitation type (snow, ...)
+ {daily[humidity]} humidity in %
+ {daily[windspeed]} wind speed in km/h
+ {daily[windbearing]} wind bearing in degrees
+ {daily[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {daily[visibility]} visibility in km
+ {daily[cloudcover]} cloud cover in %
+ {daily[pressure]} pressure in HPa
+ {daily[ozone]} Ozone in DU (Dobson Unit)
+ -->
+
+ <detailheader>
+ <area x="1%" y="10%" width="50%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymendetailback" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="55%" y="52%" width="43%" height="38%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="55%" y="52%" width="43%" height="38%" layer="3">
+ <drawimage imagetype="icon" path="{icon}" align="center" y="10" width="{areaheight}/2" height="{areaheight}/2"/>
+ </area>
+ <area x="55%" y="52%" width="43%" height="38%" layer="4">
+ <drawtextbox name="summary" x="5" y="55%" width="{areawidth}-10" align="center" height="50%" font="{regular}" fontsize="12%" color="{clrWhite}" text="{summary}" />
+ </area>
+ </detailheader>
+
+ <tab name="current" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <loop name="daily" x="0" y="0" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/4">
+ <drawtext x="0" y="{rowheight}*0.15" font="{semibold}" fontsize="{rowheight}/3" color="{clrWhite}" text="{daily[dayname]} {daily[day]}" />
+ <drawimage imagetype="icon" path="{daily[icon]}" align="center" y="5" width="{rowheight}*0.5" height="{rowheight}*0.5"/>
+ <drawtext name="tempmin" x="0.7*{columnwidth} + 0.15*{columnwidth} - {width(tempmin)}/2" font="{light}" y="0" fontsize="{rowheight}*0.25" color="{clrWhite}" text="{tr(min)}. {daily[temperaturemin]}°C" />
+ <drawtext name="felt" x="0.7*{columnwidth} + 0.15*{columnwidth} - {width(felt)}/2" font="{light}" y="{rowheight}*0.25" fontsize="{rowheight}*0.25" color="{clrWhite}" text="{tr(max)}. {daily[temperaturemax]}°C" />
+ <drawtext x="0" y="{rowheight}*0.54" width="{columnwidth}" font="{regular}" fontsize="{rowheight}*0.14" color="{clrWhite}" text="{daily[summary]}" />
+ <drawtext x="0" y="{rowheight}*0.68" width="{columnwidth}" font="{regular}" fontsize="{rowheight}*0.14" color="{clrWhite}" text="{tr(precipitationprobability)} {daily[precipitationprobability]}%, {daily[precipitationintensity]} l/qm, {tr(windspeed)} {daily[windspeed]} km/h {tr(from)} {daily[windbearingstring]}" />
+ <drawtext x="0" y="{rowheight}*0.82" width="{columnwidth}" font="{regular}" fontsize="{rowheight}*0.14" color="{clrWhite}" text="{tr(cloudcover)} {daily[cloudcover]}%, {tr(visibility)} {daily[visibility]} km, {tr(pressure)} {daily[pressure]} HPa, {tr(ozone)} {daily[ozone]} DU" />
+ <drawimage imagetype="skinpart" path="line_horizontal" x="0" y="{rowheight} - 1" width="{columnwidth}" height="2"/>
+ </loop>
+ </tab>
+</menuplugin>
diff --git a/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml b/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml
new file mode 100644
index 0000000..ac68b82
--- /dev/null
+++ b/skins/blackhole/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="55%" scaletvy="10%" scaletvwidth="40%" scaletvheight="40%">
+ <scrollbar>
+ <area x="52%" y="10%" width="2%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="scrollbarback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="52%" y="10%" width="2%" height="80%" layer="3">
+ <drawimage imagetype="skinpart" path="scrollbar" x="0" y="{areaheight} * {offset} / 1000" width="100%" height="{areaheight} * {height} / 1000"/>
+ </area>
+ </scrollbar>
+ <!-- Available Variables in detailheader and tab:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+
+ {hourly[]} array with up to 48 hourly forecasts
+ {hourly[num]} number of forecast, starting at 1
+ {hourly[timestamp]} timestamp in hh:mm
+ {hourly[temperature]} temperature in °C
+ {hourly[apparenttemperature]} apparent (felt) temperature in °C
+ {hourly[summary]} short summary
+ {hourly[icon]} path to use in <drawimage> to display appropriate weather icon
+ {hourly[precipitationintensity]} precipitation intensity in l/qm
+ {hourly[precipitationprobability]} precipitation probability in %
+ {hourly[precipitationtype]} precipitation type (snow, ...)
+ {hourly[humidity]} humidity in %
+ {hourly[windspeed]} wind speed in km/h
+ {hourly[windbearing]} wind bearing in degrees
+ {hourly[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {hourly[visibility]} visibility in km
+ {hourly[cloudcover]} cloud cover in %
+ {hourly[pressure]} pressure in HPa
+ {hourly[ozone]} Ozone in DU (Dobson Unit)
+ -->
+ <detailheader>
+ <area x="1%" y="10%" width="50%" height="80%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymendetailback" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="55%" y="52%" width="43%" height="38%" layer="2">
+ <drawimage imagetype="skinpart" path="displaymenucurrentback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="55%" y="52%" width="43%" height="38%" layer="3">
+ <drawimage imagetype="icon" path="{icon}" align="center" y="10" width="{areaheight}/2" height="{areaheight}/2"/>
+ </area>
+ <area x="55%" y="52%" width="43%" height="38%" layer="4">
+ <drawtextbox name="summary" x="5" y="55%" width="{areawidth}-10" align="center" height="50%" font="{regular}" fontsize="12%" color="{clrWhite}" text="{summary}" />
+ </area>
+ </detailheader>
+
+ <tab name="current" x="2%" y="11%" width="48%" height="78%" layer="3" scrollheight="{areaheight}/4">
+ <loop name="hourly" x="0" y="0" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/4">
+ <drawtext x="0" y="0" font="{semibold}" fontsize="{rowheight}/2.5" color="{clrWhite}" text="{hourly[timestamp]}" />
+ <drawimage imagetype="icon" path="{hourly[icon]}" align="center" y="5" width="{rowheight}*0.5" height="{rowheight}*0.5"/>
+ <drawtext name="temp" x="0.7*{columnwidth} + 0.15*{columnwidth} - {width(temp)}/2" font="{light}" y="0" fontsize="{rowheight}*0.4" color="{clrWhite}" text="{hourly[temperature]}°C" />
+ <drawtext name="felt" x="0.7*{columnwidth} + 0.15*{columnwidth} - {width(felt)}/2" font="{light}" y="{rowheight}*0.35" fontsize="{rowheight}*0.15" color="{clrWhite}" text="{tr(felt)} {hourly[apparenttemperature]}°C" />
+ <drawtext x="0" y="{rowheight}*0.5" width="{columnwidth}" font="{regular}" fontsize="{rowheight}*0.14" color="{clrWhite}" text="{hourly[summary]}" />
+ <drawtext x="0" y="{rowheight}*0.64" width="{columnwidth}" font="{regular}" fontsize="{rowheight}*0.14" color="{clrWhite}" text="{tr(precipitationprobability)} {hourly[precipitationprobability]}%, {hourly[precipitationintensity]} l/qm" />
+ <drawtext x="0" y="{rowheight}*0.78" width="{columnwidth}" font="{regular}" fontsize="{rowheight}*0.14" color="{clrWhite}" text="{tr(windspeed)} {hourly[windspeed]} km/h {tr(from)} {hourly[windbearingstring]}" />
+ <drawimage imagetype="skinpart" path="line_horizontal" x="0" y="{rowheight} - 1" width="{columnwidth}" height="2"/>
+ </loop>
+ </tab>
+</menuplugin>
diff --git a/skins/metrixhd/globals.xml b/skins/metrixhd/globals.xml
new file mode 100644
index 0000000..1b2386c
--- /dev/null
+++ b/skins/metrixhd/globals.xml
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE globals SYSTEM "../../dtd/globals.dtd">
+
+<globals>
+ <!--
+ define all your needed colors here
+ -->
+ <colors>
+ </colors>
+ <!--
+ these variables can be used everywhere in the templates
+ variabls of type int can also be used as conditions, just
+ set such a variable to 1 for true and 0 for false
+ -->
+ <variables>
+ </variables>
+ <!--
+ translations used in the skin
+ -->
+ <translations>
+ <token name="tr(activetimers)">
+ <trans lang="en_EN">Active Timers</trans>
+ <trans lang="de_DE">Aktive Timer</trans>
+ </token>
+ <token name="tr(activetimer)">
+ <trans lang="en_EN">Active Timer</trans>
+ <trans lang="de_DE">Aktiver Timer</trans>
+ </token>
+ <token name="tr(conflicts)">
+ <trans lang="en_EN">Conflicts</trans>
+ <trans lang="de_DE">Konflikte</trans>
+ </token>
+ <token name="tr(disc)">
+ <trans lang="en_EN">Disc</trans>
+ <trans lang="de_DE">Disk</trans>
+ </token>
+ <token name="tr(free)">
+ <trans lang="en_EN">free</trans>
+ <trans lang="de_DE">frei</trans>
+ </token>
+ <token name="tr(hours)">
+ <trans lang="en_EN">hours</trans>
+ <trans lang="de_DE">Stunden</trans>
+ </token>
+ <token name="tr(reruns)">
+ <trans lang="en_EN">Reruns</trans>
+ <trans lang="de_DE">Wiederholungen</trans>
+ </token>
+ <token name="tr(rerunsof)">
+ <trans lang="en_EN">Reruns of</trans>
+ <trans lang="de_DE">Wiederholungen von</trans>
+ </token>
+ <token name="tr(actors)">
+ <trans lang="en_EN">Actors</trans>
+ <trans lang="de_DE">Schauspieler</trans>
+ </token>
+ <token name="tr(episode)">
+ <trans lang="en_EN">Episode</trans>
+ <trans lang="de_DE">Folge</trans>
+ </token>
+ <token name="tr(season)">
+ <trans lang="en_EN">Season</trans>
+ <trans lang="de_DE">Staffel</trans>
+ </token>
+ <token name="tr(gueststars)">
+ <trans lang="en_EN">Guest Stars</trans>
+ <trans lang="de_DE">Gaststars</trans>
+ </token>
+ <token name="tr(seriesfirstaired)">
+ <trans lang="en_EN">Series First Aired</trans>
+ <trans lang="de_DE">Erstausstrahlung der Serie</trans>
+ </token>
+ <token name="tr(episodefirstaired)">
+ <trans lang="en_EN">Episode First Aired</trans>
+ <trans lang="de_DE">Erstausstrahlung der Episode</trans>
+ </token>
+ <token name="tr(network)">
+ <trans lang="en_EN">Network</trans>
+ <trans lang="de_DE">TV Station</trans>
+ </token>
+ <token name="tr(genre)">
+ <trans lang="en_EN">Genre</trans>
+ <trans lang="de_DE">Genre</trans>
+ </token>
+ <token name="tr(status)">
+ <trans lang="en_EN">Status</trans>
+ <trans lang="de_DE">Status</trans>
+ </token>
+ <token name="tr(rating)">
+ <trans lang="en_EN">Rating</trans>
+ <trans lang="de_DE">Bewertung</trans>
+ </token>
+ <token name="tr(episoderating)">
+ <trans lang="en_EN">Episode Rating</trans>
+ <trans lang="de_DE">Bewertung der Folge</trans>
+ </token>
+ <token name="tr(recinfo)">
+ <trans lang="en_EN">Recording Information</trans>
+ <trans lang="de_DE">Aufnahme Informationen</trans>
+ </token>
+ <token name="tr(seriesgalery)">
+ <trans lang="en_EN">Series Galery</trans>
+ <trans lang="de_DE">Serien Galerie</trans>
+ </token>
+ <token name="tr(moviegalery)">
+ <trans lang="en_EN">Movie Galery</trans>
+ <trans lang="de_DE">Spielfilm Galerie</trans>
+ </token>
+ <token name="tr(originaltitle)">
+ <trans lang="en_EN">Original Title</trans>
+ <trans lang="de_DE">Originaltitel</trans>
+ </token>
+ <token name="tr(budget)">
+ <trans lang="en_EN">Budget</trans>
+ <trans lang="de_DE">Budget</trans>
+ </token>
+ <token name="tr(revenue)">
+ <trans lang="en_EN">Revenue</trans>
+ <trans lang="de_DE">Einnahmen</trans>
+ </token>
+ <token name="tr(adult)">
+ <trans lang="en_EN">Adult</trans>
+ <trans lang="de_DE">Nur für Erwachsene</trans>
+ </token>
+ <token name="tr(releasedate)">
+ <trans lang="en_EN">Release Date</trans>
+ <trans lang="de_DE">Erscheinungsdatum</trans>
+ </token>
+ <token name="tr(runtime)">
+ <trans lang="en_EN">Runtime</trans>
+ <trans lang="de_DE">Laufzeit</trans>
+ </token>
+ <token name="tr(popularity)">
+ <trans lang="en_EN">Popularity</trans>
+ <trans lang="de_DE">Popularität</trans>
+ </token>
+ <token name="tr(voteaverage)">
+ <trans lang="en_EN">Vote Average</trans>
+ <trans lang="de_DE">Durchschnittliche Wertung</trans>
+ </token>
+ <token name="tr(homepage)">
+ <trans lang="en_EN">Homepage</trans>
+ <trans lang="de_DE">Homepage</trans>
+ </token>
+ <token name="tr(recsize)">
+ <trans lang="en_EN">Recording size</trans>
+ <trans lang="de_DE">Größe der Aufnahme</trans>
+ </token>
+ <token name="tr(recsizecutted)">
+ <trans lang="en_EN">Cutted Recording Size</trans>
+ <trans lang="de_DE">Größe der geschnittenen Aufnahme</trans>
+ </token>
+ <token name="tr(reclength)">
+ <trans lang="en_EN">Recording Length</trans>
+ <trans lang="de_DE">Länge der Aufnahme</trans>
+ </token>
+ <token name="tr(reclengthcutted)">
+ <trans lang="en_EN">Cutted Recording Length</trans>
+ <trans lang="de_DE">Länge der geschnittenen Aufnahme</trans>
+ </token>
+ <token name="tr(bitrate)">
+ <trans lang="en_EN">Bit Rate</trans>
+ <trans lang="de_DE">Bitrate</trans>
+ </token>
+ <token name="tr(format)">
+ <trans lang="en_EN">Format</trans>
+ <trans lang="de_DE">Format</trans>
+ </token>
+ <token name="tr(searchtimer)">
+ <trans lang="en_EN">Searchtimer</trans>
+ <trans lang="de_DE">Suchtimer</trans>
+ </token>
+ <token name="tr(volume)">
+ <trans lang="en_EN">Volume</trans>
+ <trans lang="de_DE">Lautstärke</trans>
+ </token>
+ <token name="tr(pause)">
+ <trans lang="en_EN">Pause</trans>
+ <trans lang="de_DE">Pause</trans>
+ </token>
+ <token name="tr(temp)">
+ <trans lang="en_EN">Temperature</trans>
+ <trans lang="de_DE">Temperatur</trans>
+ </token>
+ <token name="tr(apparenttemp)">
+ <trans lang="en_EN">Felt Temperature</trans>
+ <trans lang="de_DE">Gefühlte Temperatur</trans>
+ </token>
+ <token name="tr(todaymin)">
+ <trans lang="en_EN">minimum today</trans>
+ <trans lang="de_DE">heutiges Minimum</trans>
+ </token>
+ <token name="tr(todaymax)">
+ <trans lang="en_EN">maximum today</trans>
+ <trans lang="de_DE">heutiges Maximum</trans>
+ </token>
+ <token name="tr(precipitationprobability)">
+ <trans lang="en_EN">Precipitation Prob.</trans>
+ <trans lang="de_DE">Regenwahrsch.</trans>
+ </token>
+ <token name="tr(precipitationintensity)">
+ <trans lang="en_EN">Precipitation Intensity</trans>
+ <trans lang="de_DE">Regenmenge</trans>
+ </token>
+ <token name="tr(humidity)">
+ <trans lang="en_EN">Humidity</trans>
+ <trans lang="de_DE">Luftfeuchtigkeit</trans>
+ </token>
+ <token name="tr(apparenttemp)">
+ <trans lang="en_EN">Felt Temperature</trans>
+ <trans lang="de_DE">Gefühlte Temperatur</trans>
+ </token>
+ <token name="tr(windbearing)">
+ <trans lang="en_EN">Wind Bearing</trans>
+ <trans lang="de_DE">Windrichtung</trans>
+ </token>
+ <token name="tr(windspeed)">
+ <trans lang="en_EN">Wind Speed</trans>
+ <trans lang="de_DE">Windgeschwindigkeit</trans>
+ </token>
+ <token name="tr(cloudcover)">
+ <trans lang="en_EN">Cloud Cover</trans>
+ <trans lang="de_DE">Bewölkung</trans>
+ </token>
+ <token name="tr(pressure)">
+ <trans lang="en_EN">Pressure</trans>
+ <trans lang="de_DE">Luftdruck</trans>
+ </token>
+ <token name="tr(ozone)">
+ <trans lang="en_EN">Ozone</trans>
+ <trans lang="de_DE">Ozon</trans>
+ </token>
+ <token name="tr(visibility)">
+ <trans lang="en_EN">visibility</trans>
+ <trans lang="de_DE">Sicht</trans>
+ </token>
+ <token name="tr(conditions)">
+ <trans lang="en_EN">Weather Conditions</trans>
+ <trans lang="de_DE">Wetterlage</trans>
+ </token>
+ <token name="tr(from)">
+ <trans lang="en_EN">from</trans>
+ <trans lang="de_DE">aus</trans>
+ </token>
+ <token name="tr(felt)">
+ <trans lang="en_EN">felt</trans>
+ <trans lang="de_DE">gefühlt</trans>
+ </token>
+ <token name="tr(min)">
+ <trans lang="en_EN">min</trans>
+ <trans lang="de_DE">min</trans>
+ </token>
+ <token name="tr(max)">
+ <trans lang="en_EN">max</trans>
+ <trans lang="de_DE">max</trans>
+ </token>
+ <token name="tr(for)">
+ <trans lang="en_EN">for</trans>
+ <trans lang="de_DE">für</trans>
+ </token>
+ </translations>
+ <!--
+ The three Fonts FontOSD, FontFix and FontSml configured in VDR
+ can be used in all template "font" attributes with this tokens:
+ {vdrOsd}
+ {vdrFix}
+ {vdrSml}
+ If you like to use further fonts, just define them below.
+ Syntax:
+ <font name="tokenname">fontname</font>
+ These fonts can then also be used in all templates in the "font"
+ attribute.
+ if an invalid font is used in a template, vdrOsd is used as default.
+ -->
+ <fonts>
+ </fonts>
+</globals>
diff --git a/skins/metrixhd/setup.xml b/skins/metrixhd/setup.xml
new file mode 100644
index 0000000..abaf1c6
--- /dev/null
+++ b/skins/metrixhd/setup.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE setup SYSTEM "../../dtd/setup.dtd">
+
+<setup>
+ <menu>
+ <parameter type="int" name="fadetime" min="0" max="1000" displaytext="{tr(fadetext)}">0</parameter>
+ <parameter type="bool" name="showdevices" displaytext="{tr(showdevices)}">0</parameter>
+ </menu>
+
+ <translations>
+ <token name="tr(fadetext)">
+ <trans lang="en_EN">Fade time in ms</trans>
+ <trans lang="de_DE">Einblendzeit in ms</trans>
+ <trans lang="fi_FI">Häivytyksen kesto [ms]</trans>
+ </token>
+ <token name="tr(showdevices)">
+ <trans lang="en_EN">Show DVB device info when switching channel</trans>
+ <trans lang="de_DE">DVB Karten Info beim Umschalten anzeigen</trans>
+ <trans lang="fi_FI">Näytä DVB-tiedot kanavanvaihdossa</trans>
+ </token>
+ </translations>
+</setup>
diff --git a/skins/metrixhd/themes/default/icons/clear-day.png b/skins/metrixhd/themes/default/icons/clear-day.png
new file mode 100644
index 0000000..2b06a14
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/clear-day.png differ
diff --git a/skins/metrixhd/themes/default/icons/clear-night.png b/skins/metrixhd/themes/default/icons/clear-night.png
new file mode 100644
index 0000000..9bbe49f
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/clear-night.png differ
diff --git a/skins/metrixhd/themes/default/icons/cloudy.png b/skins/metrixhd/themes/default/icons/cloudy.png
new file mode 100644
index 0000000..9870c7f
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/cloudy.png differ
diff --git a/skins/metrixhd/themes/default/icons/fog.png b/skins/metrixhd/themes/default/icons/fog.png
new file mode 100644
index 0000000..9bc88d2
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/fog.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_ac3.png b/skins/metrixhd/themes/default/icons/ico_ac3.png
new file mode 100644
index 0000000..5b8614a
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_ac3.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_activetimer.png b/skins/metrixhd/themes/default/icons/ico_activetimer.png
new file mode 100644
index 0000000..af4c33c
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_activetimer.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_channelsep.png b/skins/metrixhd/themes/default/icons/ico_channelsep.png
new file mode 100644
index 0000000..bf51238
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_channelsep.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_crypt_off.png b/skins/metrixhd/themes/default/icons/ico_crypt_off.png
new file mode 100644
index 0000000..b612aec
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_crypt_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_crypt_on.png b/skins/metrixhd/themes/default/icons/ico_crypt_on.png
new file mode 100644
index 0000000..55abed4
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_crypt_on.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_cutted.png b/skins/metrixhd/themes/default/icons/ico_cutted.png
new file mode 100644
index 0000000..b90c9c1
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_cutted.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_discusage.png b/skins/metrixhd/themes/default/icons/ico_discusage.png
new file mode 100644
index 0000000..f40fcd9
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_discusage.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_dolby_off.png b/skins/metrixhd/themes/default/icons/ico_dolby_off.png
new file mode 100644
index 0000000..17815f5
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_dolby_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_dolby_on.png b/skins/metrixhd/themes/default/icons/ico_dolby_on.png
new file mode 100644
index 0000000..c06c18e
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_dolby_on.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_ff.png b/skins/metrixhd/themes/default/icons/ico_ff.png
new file mode 100644
index 0000000..5ffbe4b
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_ff.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_ff_1x.png b/skins/metrixhd/themes/default/icons/ico_ff_1x.png
new file mode 100644
index 0000000..96a74bc
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_ff_1x.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_ff_2x.png b/skins/metrixhd/themes/default/icons/ico_ff_2x.png
new file mode 100644
index 0000000..54657bf
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_ff_2x.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_ff_3x.png b/skins/metrixhd/themes/default/icons/ico_ff_3x.png
new file mode 100644
index 0000000..ac21eca
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_ff_3x.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_ff_off.png b/skins/metrixhd/themes/default/icons/ico_ff_off.png
new file mode 100644
index 0000000..5a9ab50
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_ff_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_hd_off.png b/skins/metrixhd/themes/default/icons/ico_hd_off.png
new file mode 100644
index 0000000..cd0492a
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_hd_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_hd_off.svg b/skins/metrixhd/themes/default/icons/ico_hd_off.svg
new file mode 100644
index 0000000..897bdfc
--- /dev/null
+++ b/skins/metrixhd/themes/default/icons/ico_hd_off.svg
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ width="49"
+ height="24"
+ sodipodi:docname="ico_hd_off.svg">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1769"
+ inkscape:window-height="1195"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="6.9532167"
+ inkscape:cx="-12.199961"
+ inkscape:cy="10.824729"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <path
+ style="fill:#ffffff;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.50196081000000004;opacity:0.4;fill-opacity:1"
+ d="m 3.7627119,1.5762712 5.8474576,0 -1.220339,6.9661017 9.1525425,-0.050847 0.966102,-7.0677966 6.016389,0.014893 -2.965542,21.1376493 -5.993831,0.06883 1.20853,-8.712893 -9.3502922,0.08899 -1.6652543,8.491525 -5.30084738,0.06356 z"
+ id="path3759"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.50196078000000000;opacity:0.4"
+ d="m 28.398305,1.3728813 15.991526,0 C 46.277579,1.243275 49.255354,2.7574438 48.61017,8.0338983 47.616873,15.342244 46.343401,22.177506 41.288136,22.627119 L 24.915254,22.525424 27.20339,8.7966102 l 5.898305,-0.025424 -1.576271,9.5338988 7.677966,0 c 2.596312,0.118399 3.234177,-5.226757 3.457627,-7.90678 0.408058,-3.1501646 0.153706,-4.2577277 -1.420115,-4.3115034 L 27.61017,6.152542 z"
+ id="path3767"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+</svg>
diff --git a/skins/metrixhd/themes/default/icons/ico_hd_on.png b/skins/metrixhd/themes/default/icons/ico_hd_on.png
new file mode 100644
index 0000000..5f6cfa5
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_hd_on.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_hd_on.svg b/skins/metrixhd/themes/default/icons/ico_hd_on.svg
new file mode 100644
index 0000000..9c69401
--- /dev/null
+++ b/skins/metrixhd/themes/default/icons/ico_hd_on.svg
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ width="49"
+ height="24"
+ sodipodi:docname="ico_hd_on.svg">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1769"
+ inkscape:window-height="1195"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="6.9532167"
+ inkscape:cx="19.799617"
+ inkscape:cy="10.824729"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <path
+ style="fill:#ffffff;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.50196081000000004;opacity:1;fill-opacity:1"
+ d="m 3.7627119,1.5762712 5.8474576,0 -1.220339,6.9661017 9.1525425,-0.050847 0.966102,-7.0677966 6.016389,0.014893 -2.965542,21.1376493 -5.993831,0.06883 1.20853,-8.712893 -9.3502922,0.08899 -1.6652543,8.491525 -5.30084738,0.06356 z"
+ id="path3759"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.50196078000000000"
+ d="m 28.398305,1.3728813 15.991526,0 C 46.277579,1.243275 49.255354,2.7574438 48.61017,8.0338983 47.616873,15.342244 46.343401,22.177506 41.288136,22.627119 L 24.915254,22.525424 27.20339,8.7966102 l 5.898305,-0.025424 -1.576271,9.5338988 7.677966,0 c 2.596312,0.118399 3.234177,-5.226757 3.457627,-7.90678 0.408058,-3.1501646 0.153706,-4.2577277 -1.420115,-4.3115034 L 27.61017,6.152542 z"
+ id="path3767"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccccccc" />
+</svg>
diff --git a/skins/metrixhd/themes/default/icons/ico_line_off.png b/skins/metrixhd/themes/default/icons/ico_line_off.png
new file mode 100644
index 0000000..94591ee
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_line_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_line_on.png b/skins/metrixhd/themes/default/icons/ico_line_on.png
new file mode 100644
index 0000000..1584078
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_line_on.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_mute.png b/skins/metrixhd/themes/default/icons/ico_mute.png
new file mode 100644
index 0000000..4eefc75
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_mute.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_pause.png b/skins/metrixhd/themes/default/icons/ico_pause.png
new file mode 100644
index 0000000..405a097
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_pause.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_pause_off.png b/skins/metrixhd/themes/default/icons/ico_pause_off.png
new file mode 100644
index 0000000..6f02e39
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_pause_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_play.png b/skins/metrixhd/themes/default/icons/ico_play.png
new file mode 100644
index 0000000..02a01c0
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_play.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_play_off.png b/skins/metrixhd/themes/default/icons/ico_play_off.png
new file mode 100644
index 0000000..d87322a
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_play_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_rec_off.png b/skins/metrixhd/themes/default/icons/ico_rec_off.png
new file mode 100644
index 0000000..224baea
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_rec_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_rec_on.png b/skins/metrixhd/themes/default/icons/ico_rec_on.png
new file mode 100644
index 0000000..7bc18a7
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_rec_on.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_recfolder.png b/skins/metrixhd/themes/default/icons/ico_recfolder.png
new file mode 100644
index 0000000..e3df65b
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_recfolder.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_recnew.png b/skins/metrixhd/themes/default/icons/ico_recnew.png
new file mode 100644
index 0000000..b9166ba
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_recnew.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_rew.png b/skins/metrixhd/themes/default/icons/ico_rew.png
new file mode 100644
index 0000000..1505f79
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_rew.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_rew_1x.png b/skins/metrixhd/themes/default/icons/ico_rew_1x.png
new file mode 100644
index 0000000..6ddbde4
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_rew_1x.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_rew_2x.png b/skins/metrixhd/themes/default/icons/ico_rew_2x.png
new file mode 100644
index 0000000..9b7ee52
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_rew_2x.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_rew_3x.png b/skins/metrixhd/themes/default/icons/ico_rew_3x.png
new file mode 100644
index 0000000..4a3abeb
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_rew_3x.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_rew_off.png b/skins/metrixhd/themes/default/icons/ico_rew_off.png
new file mode 100644
index 0000000..a84a7f3
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_rew_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_stereo.png b/skins/metrixhd/themes/default/icons/ico_stereo.png
new file mode 100644
index 0000000..7f3610d
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_stereo.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_timer_active.png b/skins/metrixhd/themes/default/icons/ico_timer_active.png
new file mode 100644
index 0000000..28c2f81
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_timer_active.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_timer_inactive.png b/skins/metrixhd/themes/default/icons/ico_timer_inactive.png
new file mode 100644
index 0000000..c4b1860
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_timer_inactive.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_timer_recording.png b/skins/metrixhd/themes/default/icons/ico_timer_recording.png
new file mode 100644
index 0000000..86dc66b
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_timer_recording.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_txt_off.png b/skins/metrixhd/themes/default/icons/ico_txt_off.png
new file mode 100644
index 0000000..a445bc5
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_txt_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_txt_on.png b/skins/metrixhd/themes/default/icons/ico_txt_on.png
new file mode 100644
index 0000000..ad14ff7
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_txt_on.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_volume.png b/skins/metrixhd/themes/default/icons/ico_volume.png
new file mode 100644
index 0000000..3a72514
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_volume.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_widescreen_off.png b/skins/metrixhd/themes/default/icons/ico_widescreen_off.png
new file mode 100644
index 0000000..dffd6a5
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_widescreen_off.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_widescreen_off.svg b/skins/metrixhd/themes/default/icons/ico_widescreen_off.svg
new file mode 100644
index 0000000..dd91dad
--- /dev/null
+++ b/skins/metrixhd/themes/default/icons/ico_widescreen_off.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ width="43"
+ height="23"
+ sodipodi:docname="ico_widescreen_off.svg">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2048"
+ inkscape:window-height="1481"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="16"
+ inkscape:cx="-4.8693805"
+ inkscape:cy="19.882154"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" />
+ <path
+ id="path3834"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.10000000000000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;opacity:0.4"
+ d="M 26.31204,9.2549017 29.307138,8.946193 c 1.930719,-0.2361949 1.627499,7.01011 -0.03235,6.862976 L 26.236601,15.553807 z M 0,0 0,23 c 15.021262,-4.846203 26.918346,-4.787057 43,0 L 43,0 C 26.964088,7.5152881 15.064204,7.6359799 0,0 z m 41.5625,2.59375 0,2.90625 -3.96875,1.46875 0,3.6875 3.40625,-0.0625 0,2.4375 -3.40625,0 0,3.65625 4.15625,1.125 0,2.90625 -6.71875,-1.6875 0,-13.875 z M 1.90625,2.8125 4.59375,4.03125 6.375,14.5625 8.03125,5.3125 10.625,6.125 l 2.34375,8.5 1.5,-7.6 [...]
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccsccccsccccc" />
+</svg>
diff --git a/skins/metrixhd/themes/default/icons/ico_widescreen_on.png b/skins/metrixhd/themes/default/icons/ico_widescreen_on.png
new file mode 100644
index 0000000..876bb55
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/ico_widescreen_on.png differ
diff --git a/skins/metrixhd/themes/default/icons/ico_widescreen_on.svg b/skins/metrixhd/themes/default/icons/ico_widescreen_on.svg
new file mode 100644
index 0000000..e6a91e5
--- /dev/null
+++ b/skins/metrixhd/themes/default/icons/ico_widescreen_on.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.5 r10040"
+ width="43"
+ height="23"
+ sodipodi:docname="ico_widescreen_on.png">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2048"
+ inkscape:window-height="1481"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="16"
+ inkscape:cx="9.0368695"
+ inkscape:cy="19.882154"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" />
+ <path
+ id="path3834"
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.10000000000000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 26.31204,9.2549017 29.307138,8.946193 c 1.930719,-0.2361949 1.627499,7.01011 -0.03235,6.862976 L 26.236601,15.553807 z M 0,0 0,23 c 15.021262,-4.846203 26.918346,-4.787057 43,0 L 43,0 C 26.964088,7.5152881 15.064204,7.6359799 0,0 z m 41.5625,2.59375 0,2.90625 -3.96875,1.46875 0,3.6875 3.40625,-0.0625 0,2.4375 -3.40625,0 0,3.65625 4.15625,1.125 0,2.90625 -6.71875,-1.6875 0,-13.875 z M 1.90625,2.8125 4.59375,4.03125 6.375,14.5625 8.03125,5.3125 10.625,6.125 l 2.34375,8.5 1.5,-7.6 [...]
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccsccccsccccc" />
+</svg>
diff --git a/skins/metrixhd/themes/default/icons/partly-cloudy-day.png b/skins/metrixhd/themes/default/icons/partly-cloudy-day.png
new file mode 100644
index 0000000..b6df179
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/partly-cloudy-day.png differ
diff --git a/skins/metrixhd/themes/default/icons/partly-cloudy-night.png b/skins/metrixhd/themes/default/icons/partly-cloudy-night.png
new file mode 100644
index 0000000..aa358fb
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/partly-cloudy-night.png differ
diff --git a/skins/metrixhd/themes/default/icons/rain.png b/skins/metrixhd/themes/default/icons/rain.png
new file mode 100644
index 0000000..8275003
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/rain.png differ
diff --git a/skins/metrixhd/themes/default/icons/sleet.png b/skins/metrixhd/themes/default/icons/sleet.png
new file mode 100644
index 0000000..1d99ae0
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/sleet.png differ
diff --git a/skins/metrixhd/themes/default/icons/snow.png b/skins/metrixhd/themes/default/icons/snow.png
new file mode 100644
index 0000000..939e22f
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/snow.png differ
diff --git a/skins/metrixhd/themes/default/icons/wind.png b/skins/metrixhd/themes/default/icons/wind.png
new file mode 100644
index 0000000..d92ec15
Binary files /dev/null and b/skins/metrixhd/themes/default/icons/wind.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Applikationen.png b/skins/metrixhd/themes/default/menuicons/customicons/Applikationen.png
new file mode 100644
index 0000000..3c3b616
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Applikationen.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Audio.png b/skins/metrixhd/themes/default/menuicons/customicons/Audio.png
new file mode 100644
index 0000000..ff387fe
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Audio.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Aufnahmen-Liste aktualisieren.png b/skins/metrixhd/themes/default/menuicons/customicons/Aufnahmen-Liste aktualisieren.png
new file mode 100644
index 0000000..3cdddc9
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Aufnahmen-Liste aktualisieren.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Dienstprogramme.png b/skins/metrixhd/themes/default/menuicons/customicons/Dienstprogramme.png
new file mode 100644
index 0000000..793aba6
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Dienstprogramme.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/FireFox.png b/skins/metrixhd/themes/default/menuicons/customicons/FireFox.png
new file mode 100644
index 0000000..192fadc
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/FireFox.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Info.png b/skins/metrixhd/themes/default/menuicons/customicons/Info.png
new file mode 100644
index 0000000..6737431
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Info.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Internet.png b/skins/metrixhd/themes/default/menuicons/customicons/Internet.png
new file mode 100644
index 0000000..f3db150
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Internet.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Medien.png b/skins/metrixhd/themes/default/menuicons/customicons/Medien.png
new file mode 100644
index 0000000..0ce2360
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Medien.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Rechner neu starten.png b/skins/metrixhd/themes/default/menuicons/customicons/Rechner neu starten.png
new file mode 100644
index 0000000..5783ccf
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Rechner neu starten.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Remote wakeup.png b/skins/metrixhd/themes/default/menuicons/customicons/Remote wakeup.png
new file mode 100644
index 0000000..1cd2f6e
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Remote wakeup.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Spiele.png b/skins/metrixhd/themes/default/menuicons/customicons/Spiele.png
new file mode 100644
index 0000000..8e07161
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Spiele.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/System herunterfahren.png b/skins/metrixhd/themes/default/menuicons/customicons/System herunterfahren.png
new file mode 100644
index 0000000..e0234df
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/System herunterfahren.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/System.png b/skins/metrixhd/themes/default/menuicons/customicons/System.png
new file mode 100644
index 0000000..81d100e
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/System.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Tools.png b/skins/metrixhd/themes/default/menuicons/customicons/Tools.png
new file mode 100644
index 0000000..cf328ef
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Tools.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Tunderbird.png b/skins/metrixhd/themes/default/menuicons/customicons/Tunderbird.png
new file mode 100644
index 0000000..5ae27e0
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Tunderbird.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/USB Massenspeicher sicher entfernen.png b/skins/metrixhd/themes/default/menuicons/customicons/USB Massenspeicher sicher entfernen.png
new file mode 100644
index 0000000..cd7b81c
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/USB Massenspeicher sicher entfernen.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/VDR neu starten.png b/skins/metrixhd/themes/default/menuicons/customicons/VDR neu starten.png
new file mode 100644
index 0000000..14904ca
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/VDR neu starten.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Video.png b/skins/metrixhd/themes/default/menuicons/customicons/Video.png
new file mode 100644
index 0000000..490ca4b
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Video.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Web.png b/skins/metrixhd/themes/default/menuicons/customicons/Web.png
new file mode 100644
index 0000000..20260e3
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Web.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/XBMC.png b/skins/metrixhd/themes/default/menuicons/customicons/XBMC.png
new file mode 100644
index 0000000..c7c4c04
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/XBMC.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/Xterm.png b/skins/metrixhd/themes/default/menuicons/customicons/Xterm.png
new file mode 100644
index 0000000..fa75282
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/Xterm.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/audiovideo.png b/skins/metrixhd/themes/default/menuicons/customicons/audiovideo.png
new file mode 100644
index 0000000..726538d
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/audiovideo.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/markad_status.png b/skins/metrixhd/themes/default/menuicons/customicons/markad_status.png
new file mode 100644
index 0000000..4fdc7a4
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/markad_status.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/schneiden_abbrechen.png b/skins/metrixhd/themes/default/menuicons/customicons/schneiden_abbrechen.png
new file mode 100644
index 0000000..b2e0bd3
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/schneiden_abbrechen.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/tux.png b/skins/metrixhd/themes/default/menuicons/customicons/tux.png
new file mode 100644
index 0000000..c5b4742
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/tux.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/usb.png b/skins/metrixhd/themes/default/menuicons/customicons/usb.png
new file mode 100644
index 0000000..c4db1d4
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/usb.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/vdrlogo.png b/skins/metrixhd/themes/default/menuicons/customicons/vdrlogo.png
new file mode 100644
index 0000000..037a191
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/vdrlogo.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/customicons/yaicon_blue.png b/skins/metrixhd/themes/default/menuicons/customicons/yaicon_blue.png
new file mode 100644
index 0000000..2c49273
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/customicons/yaicon_blue.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/admin.png b/skins/metrixhd/themes/default/menuicons/pluginicons/admin.png
new file mode 100644
index 0000000..cf328ef
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/admin.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/arghdirector.png b/skins/metrixhd/themes/default/menuicons/pluginicons/arghdirector.png
new file mode 100644
index 0000000..bbd221a
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/arghdirector.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/autostart.png b/skins/metrixhd/themes/default/menuicons/pluginicons/autostart.png
new file mode 100644
index 0000000..6fdb1bb
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/autostart.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/avahi4vdr.png b/skins/metrixhd/themes/default/menuicons/pluginicons/avahi4vdr.png
new file mode 100644
index 0000000..044e71d
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/avahi4vdr.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/avards.png b/skins/metrixhd/themes/default/menuicons/pluginicons/avards.png
new file mode 100644
index 0000000..cf8d037
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/avards.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/block.png b/skins/metrixhd/themes/default/menuicons/pluginicons/block.png
new file mode 100644
index 0000000..86127c2
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/block.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/burn.png b/skins/metrixhd/themes/default/menuicons/pluginicons/burn.png
new file mode 100644
index 0000000..305d7ff
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/burn.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/cdplayer.png b/skins/metrixhd/themes/default/menuicons/pluginicons/cdplayer.png
new file mode 100644
index 0000000..89a6c19
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/cdplayer.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/chanman.png b/skins/metrixhd/themes/default/menuicons/pluginicons/chanman.png
new file mode 100644
index 0000000..a73e83c
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/chanman.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/check.png b/skins/metrixhd/themes/default/menuicons/pluginicons/check.png
new file mode 100644
index 0000000..d487a24
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/check.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/conflictcheckonly.png b/skins/metrixhd/themes/default/menuicons/pluginicons/conflictcheckonly.png
new file mode 100644
index 0000000..7f832bd
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/conflictcheckonly.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/ddci.png b/skins/metrixhd/themes/default/menuicons/pluginicons/ddci.png
new file mode 100644
index 0000000..4ad459c
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/ddci.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/devstatus.png b/skins/metrixhd/themes/default/menuicons/pluginicons/devstatus.png
new file mode 100644
index 0000000..96c0ec1
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/devstatus.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/dummydevice.png b/skins/metrixhd/themes/default/menuicons/pluginicons/dummydevice.png
new file mode 100644
index 0000000..11fd707
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/dummydevice.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/duplicates.png b/skins/metrixhd/themes/default/menuicons/pluginicons/duplicates.png
new file mode 100644
index 0000000..dc1be57
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/duplicates.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/dvbapi.png b/skins/metrixhd/themes/default/menuicons/pluginicons/dvbapi.png
new file mode 100644
index 0000000..b966461
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/dvbapi.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/dvbhddevice.png b/skins/metrixhd/themes/default/menuicons/pluginicons/dvbhddevice.png
new file mode 100644
index 0000000..b874297
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/dvbhddevice.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/dvbsddevice.png b/skins/metrixhd/themes/default/menuicons/pluginicons/dvbsddevice.png
new file mode 100644
index 0000000..106184e
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/dvbsddevice.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/dynamite.png b/skins/metrixhd/themes/default/menuicons/pluginicons/dynamite.png
new file mode 100644
index 0000000..28ea35a
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/dynamite.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/eepg.png b/skins/metrixhd/themes/default/menuicons/pluginicons/eepg.png
new file mode 100644
index 0000000..3938b96
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/eepg.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/epg2vdr.png b/skins/metrixhd/themes/default/menuicons/pluginicons/epg2vdr.png
new file mode 100644
index 0000000..ac8757e
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/epg2vdr.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/epgsearch.png b/skins/metrixhd/themes/default/menuicons/pluginicons/epgsearch.png
new file mode 100644
index 0000000..5eab415
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/epgsearch.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/epgsearchonly.png b/skins/metrixhd/themes/default/menuicons/pluginicons/epgsearchonly.png
new file mode 100644
index 0000000..b5186e7
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/epgsearchonly.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/epgsync.png b/skins/metrixhd/themes/default/menuicons/pluginicons/epgsync.png
new file mode 100644
index 0000000..5c14009
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/epgsync.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/externalplayer.png b/skins/metrixhd/themes/default/menuicons/pluginicons/externalplayer.png
new file mode 100644
index 0000000..2bd67db
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/externalplayer.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/extrecmenu.png b/skins/metrixhd/themes/default/menuicons/pluginicons/extrecmenu.png
new file mode 100644
index 0000000..6f613f1
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/extrecmenu.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/favorites.png b/skins/metrixhd/themes/default/menuicons/pluginicons/favorites.png
new file mode 100644
index 0000000..409c852
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/favorites.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/femon.png b/skins/metrixhd/themes/default/menuicons/pluginicons/femon.png
new file mode 100644
index 0000000..e87b711
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/femon.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/fepg.png b/skins/metrixhd/themes/default/menuicons/pluginicons/fepg.png
new file mode 100644
index 0000000..65023ed
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/fepg.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/filebrowser.png b/skins/metrixhd/themes/default/menuicons/pluginicons/filebrowser.png
new file mode 100644
index 0000000..d3f90e0
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/filebrowser.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/fritzbox.png b/skins/metrixhd/themes/default/menuicons/pluginicons/fritzbox.png
new file mode 100644
index 0000000..7bfc229
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/fritzbox.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/graphlcd.png b/skins/metrixhd/themes/default/menuicons/pluginicons/graphlcd.png
new file mode 100644
index 0000000..39ffd35
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/graphlcd.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/graphtft.png b/skins/metrixhd/themes/default/menuicons/pluginicons/graphtft.png
new file mode 100644
index 0000000..39ffd35
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/graphtft.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/image.png b/skins/metrixhd/themes/default/menuicons/pluginicons/image.png
new file mode 100644
index 0000000..33644e0
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/image.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/imonlcd.png b/skins/metrixhd/themes/default/menuicons/pluginicons/imonlcd.png
new file mode 100644
index 0000000..3d34fc4
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/imonlcd.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/iptv.png b/skins/metrixhd/themes/default/menuicons/pluginicons/iptv.png
new file mode 100644
index 0000000..4494ddc
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/iptv.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/lcdproc.png b/skins/metrixhd/themes/default/menuicons/pluginicons/lcdproc.png
new file mode 100644
index 0000000..3d34fc4
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/lcdproc.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/mailbox.png b/skins/metrixhd/themes/default/menuicons/pluginicons/mailbox.png
new file mode 100644
index 0000000..1bc76e8
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/mailbox.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/makemkv.png b/skins/metrixhd/themes/default/menuicons/pluginicons/makemkv.png
new file mode 100644
index 0000000..41cddf1
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/makemkv.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/markad.png b/skins/metrixhd/themes/default/menuicons/pluginicons/markad.png
new file mode 100644
index 0000000..b3defaf
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/markad.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/mlist.png b/skins/metrixhd/themes/default/menuicons/pluginicons/mlist.png
new file mode 100644
index 0000000..19c367f
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/mlist.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/music.png b/skins/metrixhd/themes/default/menuicons/pluginicons/music.png
new file mode 100644
index 0000000..abb012e
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/music.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/noepg.png b/skins/metrixhd/themes/default/menuicons/pluginicons/noepg.png
new file mode 100644
index 0000000..eb9410d
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/noepg.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/nordlichtsepg.png b/skins/metrixhd/themes/default/menuicons/pluginicons/nordlichtsepg.png
new file mode 100644
index 0000000..3ee3fa2
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/nordlichtsepg.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/osdteletext.png b/skins/metrixhd/themes/default/menuicons/pluginicons/osdteletext.png
new file mode 100644
index 0000000..664e770
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/osdteletext.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/peer.png b/skins/metrixhd/themes/default/menuicons/pluginicons/peer.png
new file mode 100644
index 0000000..998d568
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/peer.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/play.png b/skins/metrixhd/themes/default/menuicons/pluginicons/play.png
new file mode 100644
index 0000000..2848fc6
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/play.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/pvrinput.png b/skins/metrixhd/themes/default/menuicons/pluginicons/pvrinput.png
new file mode 100644
index 0000000..724f698
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/pvrinput.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/quickepgsearch.png b/skins/metrixhd/themes/default/menuicons/pluginicons/quickepgsearch.png
new file mode 100644
index 0000000..76a31f4
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/quickepgsearch.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/radio.png b/skins/metrixhd/themes/default/menuicons/pluginicons/radio.png
new file mode 100644
index 0000000..193b7d4
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/radio.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/remote.png b/skins/metrixhd/themes/default/menuicons/pluginicons/remote.png
new file mode 100644
index 0000000..7f46b1b
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/remote.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/remotetimers.png b/skins/metrixhd/themes/default/menuicons/pluginicons/remotetimers.png
new file mode 100644
index 0000000..fae3b79
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/remotetimers.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/rssreader.png b/skins/metrixhd/themes/default/menuicons/pluginicons/rssreader.png
new file mode 100644
index 0000000..db538f0
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/rssreader.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/sc.png b/skins/metrixhd/themes/default/menuicons/pluginicons/sc.png
new file mode 100644
index 0000000..2472d6c
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/sc.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/scraper2vdr.png b/skins/metrixhd/themes/default/menuicons/pluginicons/scraper2vdr.png
new file mode 100644
index 0000000..a106cb5
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/scraper2vdr.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/screenshot.png b/skins/metrixhd/themes/default/menuicons/pluginicons/screenshot.png
new file mode 100644
index 0000000..be9b4d5
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/screenshot.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/seduatmo.png b/skins/metrixhd/themes/default/menuicons/pluginicons/seduatmo.png
new file mode 100644
index 0000000..4b5292f
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/seduatmo.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/skyselectfeeds.png b/skins/metrixhd/themes/default/menuicons/pluginicons/skyselectfeeds.png
new file mode 100644
index 0000000..d81a024
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/skyselectfeeds.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/sleeptimer.png b/skins/metrixhd/themes/default/menuicons/pluginicons/sleeptimer.png
new file mode 100644
index 0000000..cd4956f
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/sleeptimer.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/softhddevice.png b/skins/metrixhd/themes/default/menuicons/pluginicons/softhddevice.png
new file mode 100644
index 0000000..df13f2c
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/softhddevice.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/streamdev-server.png b/skins/metrixhd/themes/default/menuicons/pluginicons/streamdev-server.png
new file mode 100644
index 0000000..e89ed8b
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/streamdev-server.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/systeminfo.png b/skins/metrixhd/themes/default/menuicons/pluginicons/systeminfo.png
new file mode 100644
index 0000000..b14763f
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/systeminfo.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/targavfd.png b/skins/metrixhd/themes/default/menuicons/pluginicons/targavfd.png
new file mode 100644
index 0000000..e91b111
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/targavfd.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/trayopenng.png b/skins/metrixhd/themes/default/menuicons/pluginicons/trayopenng.png
new file mode 100644
index 0000000..6ebd17d
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/trayopenng.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/tvguide.png b/skins/metrixhd/themes/default/menuicons/pluginicons/tvguide.png
new file mode 100644
index 0000000..968a37c
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/tvguide.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/tvm2vdr.png b/skins/metrixhd/themes/default/menuicons/pluginicons/tvm2vdr.png
new file mode 100644
index 0000000..47f9a91
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/tvm2vdr.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/tvscraper.png b/skins/metrixhd/themes/default/menuicons/pluginicons/tvscraper.png
new file mode 100644
index 0000000..a106cb5
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/tvscraper.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/undelete.png b/skins/metrixhd/themes/default/menuicons/pluginicons/undelete.png
new file mode 100644
index 0000000..a53d50a
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/undelete.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/weatherforecast.png b/skins/metrixhd/themes/default/menuicons/pluginicons/weatherforecast.png
new file mode 100644
index 0000000..a88f11d
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/weatherforecast.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/weatherng.png b/skins/metrixhd/themes/default/menuicons/pluginicons/weatherng.png
new file mode 100644
index 0000000..a88f11d
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/weatherng.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/xmltv2vdr.png b/skins/metrixhd/themes/default/menuicons/pluginicons/xmltv2vdr.png
new file mode 100644
index 0000000..ea73c74
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/xmltv2vdr.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/pluginicons/yaepghg.png b/skins/metrixhd/themes/default/menuicons/pluginicons/yaepghg.png
new file mode 100644
index 0000000..53ce443
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/pluginicons/yaepghg.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/CAM.png b/skins/metrixhd/themes/default/menuicons/standardicons/CAM.png
new file mode 100644
index 0000000..a394877
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/CAM.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Channels.png b/skins/metrixhd/themes/default/menuicons/standardicons/Channels.png
new file mode 100644
index 0000000..ba2ba78
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Channels.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Commands.png b/skins/metrixhd/themes/default/menuicons/standardicons/Commands.png
new file mode 100644
index 0000000..c6a83ef
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Commands.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/DVB.png b/skins/metrixhd/themes/default/menuicons/standardicons/DVB.png
new file mode 100644
index 0000000..3789145
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/DVB.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/EPG.png b/skins/metrixhd/themes/default/menuicons/standardicons/EPG.png
new file mode 100644
index 0000000..e868b90
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/EPG.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/LNB.png b/skins/metrixhd/themes/default/menuicons/standardicons/LNB.png
new file mode 100644
index 0000000..896dd99
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/LNB.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Miscellaneous.png b/skins/metrixhd/themes/default/menuicons/standardicons/Miscellaneous.png
new file mode 100644
index 0000000..2a41c4d
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Miscellaneous.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/OSD.png b/skins/metrixhd/themes/default/menuicons/standardicons/OSD.png
new file mode 100644
index 0000000..8f571c6
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/OSD.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Plugins.png b/skins/metrixhd/themes/default/menuicons/standardicons/Plugins.png
new file mode 100644
index 0000000..3fcba70
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Plugins.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Recording.png b/skins/metrixhd/themes/default/menuicons/standardicons/Recording.png
new file mode 100644
index 0000000..741b1af
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Recording.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Recordings.png b/skins/metrixhd/themes/default/menuicons/standardicons/Recordings.png
new file mode 100644
index 0000000..79aeeb7
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Recordings.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Replay.png b/skins/metrixhd/themes/default/menuicons/standardicons/Replay.png
new file mode 100644
index 0000000..621596c
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Replay.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Restart.png b/skins/metrixhd/themes/default/menuicons/standardicons/Restart.png
new file mode 100644
index 0000000..aa23cd4
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Restart.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Schedule.png b/skins/metrixhd/themes/default/menuicons/standardicons/Schedule.png
new file mode 100644
index 0000000..3a98cac
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Schedule.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Setup.png b/skins/metrixhd/themes/default/menuicons/standardicons/Setup.png
new file mode 100644
index 0000000..d121148
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Setup.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/StopRecording.png b/skins/metrixhd/themes/default/menuicons/standardicons/StopRecording.png
new file mode 100644
index 0000000..ed83fbb
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/StopRecording.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/StopReplay.png b/skins/metrixhd/themes/default/menuicons/standardicons/StopReplay.png
new file mode 100644
index 0000000..9192760
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/StopReplay.png differ
diff --git a/skins/metrixhd/themes/default/menuicons/standardicons/Timers.png b/skins/metrixhd/themes/default/menuicons/standardicons/Timers.png
new file mode 100644
index 0000000..b866c36
Binary files /dev/null and b/skins/metrixhd/themes/default/menuicons/standardicons/Timers.png differ
diff --git a/skins/metrixhd/themes/default/theme.xml b/skins/metrixhd/themes/default/theme.xml
new file mode 100644
index 0000000..9c65d2a
--- /dev/null
+++ b/skins/metrixhd/themes/default/theme.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE globals SYSTEM "../../../../dtd/globals.dtd">
+
+<globals>
+ <!--
+ define all your needed colors here
+ -->
+ <colors>
+ <color name="clrRed">FFFF0000</color>
+ <color name="clrGreen">FF5FE200</color>
+ <color name="clrYellow">FFE2DA00</color>
+ <color name="clrBlue">FF007FE2</color>
+ <color name="clrTransBlack">C0000000</color>
+ <color name="clrSemiTransBlack">D0000000</color>
+ <color name="clrBlueLight">FF1E8BD7</color>
+ <color name="clrTransBlueLight">C01E8BD7</color>
+ <color name="clrTransWhite">C0FFFFFF</color>
+ <color name="clrWhite">FFFFFFFF</color>
+ <color name="clrDarkGray">FF14141E</color>
+ <color name="clrTransparent">00000000</color>
+ </colors>
+ <!--
+ these variables can be used everywhere in the templates
+ variabls of type int can also be used as conditions, just
+ set such a variable to 1 for true and 0 for false
+ -->
+ <variables>
+ <var type="string" name="stringglobal">hützligrütz</var>
+ <var type="double" name="pi">3.14</var>
+ </variables>
+ <!--
+ translations used in the skin
+ -->
+ <translations>
+ </translations>
+ <!--
+ The three Fonts FontOSD, FontFix and FontSml configured in VDR
+ can be used in all template "font" attributes with this tokens:
+ {vdrOsd}
+ {vdrFix}
+ {vdrSml}
+ If you like to use further fonts, just define them below.
+ Syntax:
+ <font name="tokenname">fontname</font>
+ These fonts can then also be used in all templates in the "font"
+ attribute.
+ if an invalid font is used in a template, vdrOsd is used as default.
+ -->
+ <fonts>
+ <font name="light">VDROpen Sans Light:Light</font>
+ <font name="semibold">VDROpen Sans Semibold:Semibold</font>
+ </fonts>
+</globals>
diff --git a/skins/metrixhd/xmlfiles/displayaudiotracks.xml b/skins/metrixhd/xmlfiles/displayaudiotracks.xml
new file mode 100644
index 0000000..8c5af98
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displayaudiotracks.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayaudiotracks SYSTEM "../../../dtd/displayaudiotracks.dtd">
+
+<displayaudiotracks x="25%" y="0" width="50%" height="100%" fadetime="{fadetime}">
+ <!-- Available Variables background:
+ {numtracks} number of displayed tracks
+ -->
+ <background>
+ <area x="0" y="{areaheight} - {numtracks} * {areaheight} / 10 - {areaheight} / 10" width="100%" height="{areaheight} / 10 + {areaheight} / 10 * {numtracks}" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </background>
+
+ <!-- Available Variables header:
+ {numtracks} number of displayed tracks
+ {title} title of menu
+ -->
+ <header>
+ <area x="0" y="{areaheight} - {numtracks} * {areaheight} / 10 - {areaheight} / 10" width="100%" height="{areaheight} / 10" layer="2">
+ <drawtext x="10" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ <drawimage condition="{isstereo}" imagetype="icon" path="ico_stereo" x="{areawidth} - {areaheight}*0.9" valign="center" width="{areaheight}*0.9" height="{areaheight}*0.9"/>
+ <drawimage condition="{isac3}" imagetype="icon" path="ico_ac3" x="{areawidth} - {areaheight}*0.9" valign="center" width="{areaheight}*0.9" height="{areaheight}*0.9"/>
+ </area>
+ </header>
+
+ <!-- Available Variables header:
+ {numelements} number of displayed tracks
+ -->
+ <menuitems x="0" y="{areaheight} - {numelements} * {areaheight} / 10" orientation="vertical" width="100%" height="{numelements} * {areaheight} / 10" align="top" numlistelements="{numelements}">
+ <!-- Available Variables auidotrack listelement:
+ {current} true if item is currently selected
+ {title} title of auio track
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="1%" width="98%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ </area>
+ <area x="1%" width="98%" layer="3">
+ <drawtext x="10" valign="center" font="{light}" fontsize="60%" color="{clrWhite}" text="{title}" />
+ </area>
+ </listelement>
+ </menuitems>
+
+</displayaudiotracks>
diff --git a/skins/metrixhd/xmlfiles/displaychannel.xml b/skins/metrixhd/xmlfiles/displaychannel.xml
new file mode 100644
index 0000000..3c63a18
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaychannel.xml
@@ -0,0 +1,320 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaychannel SYSTEM "../../../dtd/displaychannel.dtd">
+
+<displaychannel x="0" y="0" width="100%" height="100%" fadetime="{fadetime}">
+ <background>
+ <!-- background infobar -->
+ <area x="0" y="80%" width="100%" height="20%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <!-- background datetime -->
+ <area x="70%" y="0" width="30%" height="13%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle x="0" y="0" width="45%" height="100%" color="{clrTransBlueLight}" />
+ </area>
+ <!-- background weather -->
+ <area x="70%" y="15%" width="30%" height="13%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle x="0" y="0" width="45%" height="100%" color="{clrTransBlueLight}" />
+ </area>
+ <!-- background channellogo -->
+ <area x="0" y="80%" width="20%" height="20%" layer="2">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ </background>
+
+ <!-- Available Variables channelinfo:
+ {channelnumber} Number of Channel, with "-" in case of channel switching
+ {channelname} Name of current Channel
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {switching} true if a number is pressed on the remote to switch to a dedicated channel
+ -->
+ <channelinfo>
+ <area x="22%" y="80%" width="76%" height="7%" layer="2">
+ <fill condition="not{switching}" color="{clrTransparent}" />
+ <drawtext condition="{switching}" x="0" y="-10" font="{light}" fontsize="99%" color="{clrWhite}" text="{channelnumber}: {channelname}" />
+ </area>
+ <area x="0" y="80%" width="20%" height="20%" layer="3">
+ <drawimage cache="true" condition="{channellogoexists}" imagetype="channellogo" path="{channelid}" width="98%" height="98%" align="center" valign="center" />
+ <drawtext condition="not{channellogoexists}" x="5" valign="center" font="{light}" fontsize="40%" color="{clrWhite}" text="{channelnumber}: {channelname}" />
+ </area>
+ </channelinfo>
+ <!-- Available Variables epginfo:
+ {currenttitle} Title of the current Schedule
+ {currentsubtitle} Subtitle of the current Schedule
+ {currentstart} Start of current Schedule in hh:mm
+ {currentstop} End of current Schedule in hh:mm
+ {currentduration} Duration of current Schedule in min
+ {currentdurationhours} Duration, full hours
+ {currentdurationminutes} Duration, rest of minutes
+ {currentelapsed} Elapsed time of current Schedule in min
+ {currentremaining} Remaining time of current Schedule in min
+ {currentrecording} true if current Schedule is recorded
+ {hasVPS} true if current Schedule has VPS
+ {nexttitle} Title of next Schedule
+ {nextsubtitle} Subtitle of next Schedule
+ {nextstart} Start of next Schedule in hh:mm
+ {nextstop} Stop of next Schedule in hh:mm
+ {nextduration} Duration of next Schedule in min
+ {nextdurationhours} Duration, full hours
+ {nextdurationminutes} Duration, rest of minutes
+ {nextrecording} true if next Schedule will be recorded
+ -->
+ <epginfo>
+ <area x="22%" y="80%" width="76%" height="7%" layer="2">
+ <drawtext name="title" x="0" valign="center" font="{light}" fontsize="99%" color="{clrWhite}" text="{currenttitle}" width="{areawidth} - {width(startstop)}"/>
+ <drawtext name="startstop" align="right" y="0" font="{light}" fontsize="60%" color="{clrWhite}" text="{currentstart} - {currentstop}" />
+ <drawtext align="right" y="45%" font="{light}" fontsize="60%" color="{clrWhite}" text="+ {currentremaining} min" />
+ </area>
+ <area x="22%" y="87%" width="76%" height="7%" layer="2">
+ <drawtext x="0" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{nexttitle}" width="{areawidth} - {width(startstop)}"/>
+ <drawtext name="startstop" align="right" y="0" font="{light}" fontsize="60%" color="{clrWhite}" text="{nextstart} - {nextstop}" />
+ <drawtext align="right" y="45%" font="{light}" fontsize="60%" color="{clrWhite}" text="{nextduration} min" />
+ </area>
+ </epginfo>
+
+ <!-- Available Variables progressbar:
+ {start} Start of current Schedule in hh:mm
+ {stop} End of current Schedule in hh:mm
+ {duration} Total Duration of current Schedule in seconds
+ {elapsed} Elapsed time of current Schedule in seconds
+ {remaining} Remaining time of current Schedule in seconds
+ -->
+ <progressbar>
+ <area x="22%" y="87%" width="76%" height="3" layer="2">
+ <drawrectangle x="0" y="1" width="100%" height="1" color="{clrWhite}" />
+ <drawrectangle x="0" y="0" width="{elapsed}/{duration}*{areawidth}" height="3" color="{clrTransBlueLight}" />
+ </area>
+ </progressbar>
+
+ <!-- Available Variables statusinfo:
+ {isRadio} true if channel is a radio channel
+ {hasVT} true if channel has video text
+ {isStereo} true if a stereo audio trac is available
+ {isDolby} true if a dolby audio track is available
+ {isEncrypted} true if channel is encrypted
+ {isRecording} true if currently a recording is running on this channel
+ {newmails} true if mailbox plugin is installed and new mails are available
+ -->
+ <statusinfo>
+ <area x="22%" y="94%" width="76%" height="6%" layer="2">
+ <!-- encrypted / decrypted icon -->
+ <drawimage name="enc" condition="{isEncrypted}" imagetype="icon" path="ico_crypt_on" x="{areawidth} - {width(enc)}" valign="center" width="{areaheight}*0.8*1.76" height="{areaheight}*0.8"/>
+ <drawimage condition="not{isEncrypted}" imagetype="icon" path="ico_crypt_off" x="{areawidth} - {width(enc)}" valign="center" width="{areaheight}*0.8*1.76" height="{areaheight}*0.8"/>
+ <!-- dolby icon -->
+ <drawimage name="dolby" condition="{isDolby}" imagetype="icon" path="ico_dolby_on" x="{posx(enc)} - 15 - {width(dolby)}" valign="center" width="{areaheight}*0.8*1.48" height="{areaheight}*0.8"/>
+ <drawimage condition="not{isDolby}" imagetype="icon" path="ico_dolby_off" x="{posx(enc)} - 15 - {width(dolby)}" valign="center" width="{areaheight}*0.8*1.48" height="{areaheight}*0.8"/>
+ <!-- videotext icon -->
+ <drawimage name="txt" condition="{hasVT}" imagetype="icon" path="ico_txt_on" x="{posx(dolby)} - 15 - {width(txt)}" valign="center" width="{areaheight}*0.8*1.3" height="{areaheight}*0.8"/>
+ <drawimage condition="not{hasVT}" imagetype="icon" path="ico_txt_off" x="{posx(dolby)} - 15 - {width(txt)}" valign="center" width="{areaheight}*0.8*1.3" height="{areaheight}*0.8"/>
+ <!-- recording icon -->
+ <drawimage name="rec" condition="{isRecording}" imagetype="icon" path="ico_rec_on" x="{posx(txt)} - 15 - {width(rec)}" valign="center" width="{areaheight}*0.8*1.96" height="{areaheight}*0.8"/>
+ <drawimage condition="not{isRecording}" imagetype="icon" path="ico_rec_off" x="{posx(txt)} - 15 - {width(rec)}" valign="center" width="{areaheight}*0.8*1.96" height="{areaheight}*0.8"/>
+ </area>
+ </statusinfo>
+
+ <!-- Available Variables audioinfo:
+ {numaudiotracks} number of available audio tracks for current channel
+ {audiochannel} 0 if current channel is stereo, 1 for left chanel only, 2 for right channel only
+ {trackdesc} description of the current audio track
+ {tracklang} language of the current audio track
+ -->
+ <audioinfo>
+ </audioinfo>
+
+ <!-- Available Variables screenresolution:
+ {screenwidth} width of currently displayed channel in px
+ {screenheight} height of currently displayed channel in px
+ {resolution} resolution: hd1080i, hd720p, sd576i
+ {aspect} screen aspect, each 4:3, 16:9 or 21:9
+ {isHD} true for hd1080i and hd720p
+ {isWideScreen} true if aspect is 16:9 or 21:9
+ -->
+ <screenresolution>
+ <area x="22%" y="94%" width="76%" height="6%" layer="2">
+ <!-- widescreen icon -->
+ <drawimage name="widescreen" condition="{isWideScreen}" imagetype="icon" path="ico_widescreen_on" x="{areawidth} - {areaheight}*0.8*1.76 - 15 - {areaheight}*0.8*1.48 - 15 - {areaheight}*0.8*1.3 - 15 - {areaheight}*0.8*1.96 - 15 - {width(widescreen)}" valign="center" width="{areaheight}*0.8*1.87" height="{areaheight}*0.8"/>
+ <drawimage condition="not{isWideScreen}" imagetype="icon" path="ico_widescreen_off" x="{areawidth} - {areaheight}*0.8*1.76 - 15 - {areaheight}*0.8*1.48 - 15 - {areaheight}*0.8*1.3 - 15 - {areaheight}*0.8*1.96 - 15 - {width(widescreen)}" valign="center" width="{areaheight}*0.8*1.87" height="{areaheight}*0.8"/>
+ <!-- hd/sd icon -->
+ <drawimage name="hd" condition="{isHD}" imagetype="icon" path="ico_hd_on" x="{posx(widescreen)} - 15 - {width(hd)}" valign="center" width="{areaheight}*0.8*2.04" height="{areaheight}*0.8"/>
+ <drawimage condition="not{isHD}" imagetype="icon" path="ico_hd_off" x="{posx(widescreen)} - 15 - {width(hd)}" valign="center" width="{areaheight}*0.8*2.04" height="{areaheight}*0.8"/>
+ <!-- screenresolution text -->
+ <drawtext name="reslabel" x="{posx(hd)} - 30 - {width(reslabel)}" valign="center" font="{light}" fontsize="70%" color="{clrWhite}" text="{screenwidth}x{screenheight}" />
+ </area>
+ </screenresolution>
+
+ <!-- Available Variables dvbdeviceinfo:
+ {prevAvailable} true if previous Channel Group is avaialble
+ {nextAvailable} true if next Channel Group is avaialble
+ {group} Name of current Channel Group
+ {nextgroup} Name of next Channel Group
+ {prevgroup} Name of prev Channel Group
+ {sepexists} true if a channel separator logo exists
+ {seppath} path for separator logo to use in imagetype "seplogo"
+ -->
+ <channelgroup>
+ <area x="0" y="80%" width="20%" height="20%" layer="2">
+ <drawimage condition="{sepexists}" imagetype="seplogo" path="{seppath}" width="98%" height="98%" align="center" valign="center" />
+ <drawimage condition="not{sepexists}" imagetype="icon" path="ico_channelsep" align="center" valign="center" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
+ </area>
+ <area x="22%" y="85%" width="76%" height="10%" layer="2">
+ <drawtext x="0" width="30%" valign="center" font="{light}" fontsize="60%" color="{clrWhite}" text="{prevgroup}" />
+ <drawtext x="30%" width="40%" valign="center" font="{semibold}" fontsize="80%" color="{clrWhite}" text="{group}" />
+ <drawtext align="right" width="30%" valign="center" font="{light}" fontsize="60%" color="{clrWhite}" text="{nextgroup}" />
+ </area>
+ </channelgroup>
+
+ <!-- Available Variables signalquality:
+ {signalstrength} STR value of currently displayed channel
+ {signalquality} SNR value of currently displayed channel
+ -->
+ <signalquality>
+ <area x="22%" y="94%" width="76%" height="6%" layer="3">
+ <drawtext x="0" valign="center" font="{light}" fontsize="70%" color="{clrWhite}" text="STR: {signalstrength}% SNR: {signalquality}%" />
+ </area>
+ </signalquality>
+
+ <!-- background of signalmeter, will only be drawn if signalquality was deleted -->
+ <signalqualityback>
+ </signalqualityback>
+
+ <!-- Available Variables devices:
+ {numdevices} number of available devices
+ {devices[]} array with available devices
+ {devices[num]} number of current device
+ {devices[type]} type of device (DVB-S, DVB-C, ...)
+ {devices[istuned]} true if device is currently tuned to a transponder
+ {devices[livetv]} true if device is currently playing livetv
+ {devices[recording]} true if device is currently recording
+ {devices[hascam]} true if device has a CAM
+ {devices[cam]} number of CAM
+ {devices[signalstrength]} signalstrength of devcie
+ {devices[signalquality]} signalstrength of devcie
+ {devices[channelnumber]} number of the currently tuned channel
+ {devices[channelname]} name of the currently tuned channel
+ {devices[channelid]} ID of the currently tuned channel
+ {devices[source]} source of the currently tuned channel
+ -->
+ <devices>
+ <area condition="{showdevices}" x="70%" y="30%" width="30%" height="{areaheight}/12 * {numdevices}" layer="1">
+ <fill color="{clrTransBlack}"/>
+ </area>
+ <area condition="{showdevices}" x="70%" y="30%" width="30%" height="{areaheight}/12 * {numdevices}" layer="2">
+ <loop name="devices" x="0" y="0" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight} / {numdevices}" overflow="cut">
+ <drawtext name="label" x="5" y="0" font="{light}" fontsize="{rowheight}*0.35" color="{clrWhite}" text="{devices[num]}: {devices[type]}" />
+ <drawtext condition="{devices[hascam]}" x="{width(label)} + 15" y="0" font="{light}" fontsize="{rowheight}*0.35" color="{clrWhite}" text="(CAM {devices[cam]})" />
+ <drawtext condition="{devices[recording]} ++ {devices[livetv]}" align="right" y="0" font="{light}" fontsize="{rowheight}*0.35" color="{clrRed}" text="LiveTV, Recording ({devices[channelname]}) " />
+ <drawtext condition="{devices[recording]} ++ not{devices[livetv]}" align="right" y="0" font="{light}" fontsize="{rowheight}*0.35" color="{clrRed}" text="Recording ({devices[channelname]}) " />
+ <drawtext condition="not{devices[recording]} ++ {devices[livetv]}" align="right" y="0" font="{light}" fontsize="{rowheight}*0.35" color="{clrWhite}" text="LiveTV ({devices[channelname]}) " />
+ <drawrectangle condition="{devices[istuned]}" x="5" y="{rowheight}/3 + 5" width="{areawidth} * {devices[signalstrength]} / 100 - 10 * {devices[signalstrength]} / 100" height="{rowheight}/3 - 10" color="{clrTransWhite}" />
+ <drawrectangle condition="{devices[istuned]}" x="5" y="2*{rowheight}/3 + 5" width="{areawidth} * {devices[signalquality]} / 100 - 10 * {devices[signalquality]} / 100" height="{rowheight}/3 - 10" color="{clrTransWhite}" />
+ <drawtext condition="not{devices[istuned]}" align="center" y="{rowheight}/2" font="{light}" fontsize="{rowheight}*0.40" color="{clrWhite}" text="not tuned" />
+ </loop>
+ </area>
+ </devices>
+
+ <!-- Available Variables currentweather:
+ {timestamp} timestamp of forecast in dd.mm hh:mm
+ {temperature} current temperature in °C
+ {apparenttemperature} apparent (feeled) temperature
+ {mintemperature} minimum temperature this day
+ {maxtemperature} maximum temperature this day
+ {summary} short weather summary
+ {icon} weather icon
+ {precipitationintensity} precipitation intensity in l/m2
+ {precipitationprobability} precipitation probability in %
+ {precipitationtype} precipitation type
+ {humidity} humidity in %
+ {windspeed} windspeed in km/h
+ {windbearing} wind bearing in °
+ {windbearingstring} wind bearing (N, NE, ...)
+ {visibility} visibility in km
+ {cloudcover} cloud cover in %
+ {pressure} pressure in HPo
+ {ozone} ozone value in DU
+ -->
+ <currentweather>
+ <area x="70%" y="15%" width="13%" height="13%" layer="2">
+ <drawimage imagetype="icon" path="{icon}" align="center" valign="center" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
+ </area>
+ <area x="85%" y="15%" width="13%" height="13%" layer="2">
+ <drawtext x="0" y="0" font="{light}" fontsize="25%" color="{clrWhite}" text="{mintemperature}°C" />
+ <drawtext x="0" y="75%" font="{light}" fontsize="25%" color="{clrWhite}" text="{maxtemperature}°C" />
+ </area>
+ <area x="85%" y="15%" width="13%" height="13%" layer="3">
+ <drawtext align="right" valign="center" font="{light}" fontsize="60%" color="{clrWhite}" text="{temperature}°C" />
+ </area>
+ </currentweather>
+
+ <!-- Available Variables scrapercontent:
+ {posterpath} Full Path of Poster to use in image path attribute
+ {posterwidth} width of poster in pixel
+ {posterheight} height of poster in pixel
+ {hasPoster} true if poster is available
+ {bannerpath} Full Path of banner to use in image path attribute
+ {bannerwidth} width of banner in pixel
+ {bannerheight} height of banner in pixel
+ {hasBanner} true if banner is available
+
+ Use this tokens if you want to display a banner for series and a poster for movies:
+ {mediapath} Full Path of Poster or Banner to use in image path attribute
+ {mediawidth} width of image in pixel
+ {mediaheight} height of image in pixel
+ {isbanner} true if image is a banner, false if it is a poster
+ -->
+ <scrapercontent>
+ <area condition="{isbanner}" x="0" y="0" width="{areaheight}*0.13*{mediawidth}/{mediaheight}" height="13%" layer="2">
+ <drawimage imagetype="image" path="{mediapath}" align="center" valign="center" width="{areawidth}" height="{areaheight}"/>
+ </area>
+ <area condition="not{isbanner}" x="0" y="0" width="{areaheight}*0.5*{mediawidth}/{mediaheight}" height="50%" layer="2">
+ <drawimage imagetype="image" path="{mediapath}" x="5" y="5" width="{areawidth}-10" height="{areaheight}-10"/>
+ </area>
+ </scrapercontent>
+
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {monthnameshort} 3 letter abbrivation of month name
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="70%" y="0" width="13%" height="13%" layer="2">
+ <drawtext align="right" y="0" font="{light}" fontsize="50%" color="{clrWhite}" text="{dayname}" />
+ <drawtext align="right" y="48%" font="{light}" fontsize="50%" color="{clrWhite}" text="{day}. {monthnameshort}" />
+ </area>
+ <area x="85%" y="0" width="13%" height="13%" layer="2">
+ <drawtext align="center" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{time}" />
+ </area>
+ </datetime>
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ <area x="10%" y="45%" width="80%" height="10%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle condition="{status}" x="20" y="0" width="20" height="100%" color="{clrGreen}" />
+ <drawrectangle condition="{info}" x="20" y="0" width="20" height="100%" color="{clrBlue}" />
+ <drawrectangle condition="{warning}" x="20" y="0" width="20" height="100%" color="{clrYellow}" />
+ <drawrectangle condition="{error}" x="20" y="0" width="20" height="100%" color="{clrRed}" />
+ <drawtext align="center" valign="center" width="{areawidth} - 80" font="{light}" fontsize="40%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+
+ <!-- Available Variables customtokens:
+ all custom tokens set by the svdrp command SCTK are available in this viewelement
+ For instance, use an appropriate script which runs periodically as cronjob and
+ sets these custom tokens with svdrpsend or dbus2vdr
+ -->
+ <customtokens>
+ </customtokens>
+</displaychannel>
diff --git a/skins/metrixhd/xmlfiles/displaymenu.xml b/skins/metrixhd/xmlfiles/displaymenu.xml
new file mode 100644
index 0000000..d51cfbf
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenu.xml
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaymenu SYSTEM "../../../dtd/displaymenu.dtd" [
+<!ENTITY displaymenudefault SYSTEM "displaymenudefault.xml">
+<!ENTITY displaymenumain SYSTEM "displaymenumain.xml">
+<!ENTITY displaymenusetup SYSTEM "displaymenusetup.xml">
+<!ENTITY displaymenuschedules SYSTEM "displaymenuschedules.xml">
+<!ENTITY displaymenutimers SYSTEM "displaymenutimers.xml">
+<!ENTITY displaymenuchannels SYSTEM "displaymenuchannels.xml">
+<!ENTITY displaymenurecordings SYSTEM "displaymenurecordings.xml">
+<!ENTITY displaymenudetailepg SYSTEM "displaymenudetailepg.xml">
+<!ENTITY displaymenudetailrecording SYSTEM "displaymenudetailrecording.xml">
+<!ENTITY displaymenudetailtext SYSTEM "displaymenudetailtext.xml">
+]>
+
+<displaymenu x="3%" y="5%" width="94%" height="90%" fadetime="0">
+ <!--
+ The following background, header, datetime and colorbuttons definitions are default
+ implementations. If one or more of these elements are not implemented in the subview,
+ the default implementations are used.
+ -->
+ <background>
+ <!-- background left Menu -->
+ <area x="0" y="0" width="63%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <!-- background right detail view -->
+ <area x="63%" y="3%" width="37%" height="94%" layer="1">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ </background>
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ {freetime} available disc capacity in hh:mm
+ {freepercent} available disc capacity in percent
+ {usedpercent} used disc capacity in percent
+ {freegb} available disc capacity in gigabytes
+ {discalert} true if disc usage is > 95%
+ {vdrusagestring} localized VDR internal usage string
+ -->
+ <header>
+ <area x="0" y="0" width="41%" height="10%" layer="2">
+ <drawtext condition="not{hasicon}" x="5" width="{areawidth}-10" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ <drawimage condition="{hasicon}" name="menuicon" imagetype="menuicon" path="{icon}" x="5" valign="center" width="{areaheight}*8/10" height="80%"/>
+ <drawtext condition="{hasicon}" x="{areaheight}" valign="center" width="{areawidth}-{areaheight}-10" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ </area>
+ </header>
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {monthnameshort} 3 letter abbrivation of month name
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="41%" y="0" width="12%" height="10%" layer="2">
+ <drawtext align="right" y="5%" font="{light}" fontsize="50%" color="{clrWhite}" text="{dayname}" />
+ <drawtext align="right" y="45%" font="{light}" fontsize="50%" color="{clrWhite}" text="{day}. {monthnameshort}" />
+ </area>
+ <area x="53%" y="0" width="10%" height="10%" layer="2">
+ <drawtext align="center" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{time}" />
+ </area>
+ </datetime>
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is an status message
+ {info} true if message is an info message
+ {warning} true if message is an warn message
+ {error} true if message is an error message
+ -->
+ <message>
+ <area x="5%" y="75%" width="90%" height="15%" layer="7">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle condition="{status}" x="10" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawrectangle condition="{info}" x="10" y="0" width="10" height="100%" color="{clrBlue}" />
+ <drawrectangle condition="{warning}" x="10" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawrectangle condition="{error}" x="10" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext align="center" valign="center" font="{light}" fontsize="50%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+ <!-- Available Variables colorbuttons:
+ {red1} true if red button is button 1
+ {red2} true if red button is button 2
+ {red3} true if red button is button 3
+ {red4} true if red button is button 4
+ {green1} true if green button is button 1
+ {green2} true if green button is button 2
+ {green3} true if green button is button 3
+ {green4} true if green button is button 4
+ {yellow1} true if yellow button is button 1
+ {yellow2} true if yellow button is button 2
+ {yellow3} true if yellow button is button 3
+ {yellow4} true if yellow button is button 4
+ {blue1} true if blue button is button 1
+ {blue2} true if blue button is button 2
+ {blue3} true if blue button is button 3
+ {blue4} true if blue button is button 4
+ {red} label of red button
+ {green} label of green button
+ {yellow} label of yellow button
+ {blue} label of blue button
+ -->
+ <colorbuttons>
+ <area x="0" y="92%" width="15%" height="8%" layer="2">
+ <drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red1}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green1}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow1}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue1}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="15%" y="92%" width="15%" height="8%" layer="2">
+ <drawtext condition="{red2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red2}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green2}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow2}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue2}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="30%" y="92%" width="15%" height="8%" layer="2">
+ <drawtext condition="{red3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red3}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green3}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow3}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue3}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="45%" y="92%" width="15%" height="8%" layer="2">
+ <drawtext condition="{red4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red4}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green4}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow4}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ </colorbuttons>
+ &displaymenudefault;
+ &displaymenumain;
+ &displaymenusetup;
+ &displaymenuschedules;
+ &displaymenutimers;
+ &displaymenuchannels;
+ &displaymenurecordings;
+ &displaymenudetailepg;
+ &displaymenudetailrecording;
+ &displaymenudetailtext;
+</displaymenu>
diff --git a/skins/metrixhd/xmlfiles/displaymenuchannels.xml b/skins/metrixhd/xmlfiles/displaymenuchannels.xml
new file mode 100644
index 0000000..3e6f771
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenuchannels.xml
@@ -0,0 +1,122 @@
+<menuchannels x="0" y="0" width="100%" height="100%" fadetime="0">
+ <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="16">
+ <!-- Available Variables channels menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {number} number of the displayed channel
+ {name} name of the displayed channel
+ {channelid} ChannelID as path to display channel logo
+ {transponder} Transponder of channel
+ {frequency} Frequency of channel
+ {source} Source of channel (S, C, T)
+ {sourcedescription} Descriptin of source from sources.conf
+ {position} orbital position of the satellite in case this is a DVB-S source
+ {isAtsc} true if channel is a ATSC channel
+ {isCable} true if channel is cable channel
+ {isSat} true if channel is a satellite channel
+ {isTerr} true if channel is terrestrical
+ {presenteventtitle} title of present event on this channel
+ {presenteventstart} present event start time in hh::mm
+ {presenteventstop} present event event stop time in hh::mm
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="1%" width="58%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ <fill condition="{separator}" color="{clrSemiTransBlack}" />
+ </area>
+ <area condition="not{separator}" x="1%" width="6%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="100%" height="100%" valign="center" />
+ </area>
+ <areascroll condition="not{separator}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="7%" width="52%" layer="3">
+ <drawtext name="menutext" x="20" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{number} {name} - {sourcedescription}, Transp. {transponder}" />
+ </areascroll>
+ <area condition="{separator}" x="7%" width="52%" layer="3">
+ <drawtext x="20" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{name}" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {number} number of the displayed channel
+ {name} name of the displayed channel
+ {channelid} ChannelID as path to display channel logo
+ {transponder} Transponder of channel
+ {frequency} Frequency of channel
+ {source} Source of channel (S, C, T)
+ {sourcedescription} Descriptin of source from sources.conf
+ {position} orbital position of the satellite in case this is a DVB-S source
+ {isAtsc} true if channel is a ATSC channel
+ {isCable} true if channel is cable channel
+ {isSat} true if channel is a satellite channel
+ {isTerr} true if channel is terrestrical
+ {presenteventtitle} title of present event on this channel
+ {presenteventstart} present event start time in hh::mm
+ {presenteventstop} present event stop time in hh::mm
+ {presenteventshorttext} present event short text
+ {presenteventdescription} present event description
+ {presenteventday} present event name of day
+ {presenteventdate} present event date in dd:mm:yy
+ {presenteventelapsed} present event elapsed time
+ {presenteventduration} present event duration
+ {presenteventdurationhours} duration, full hours
+ {presenteventdurationminutes} duration, rest of minutes
+ {hasposter} true if a scraped poster is available for this elements present evemt
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {nexteventtitle} title of next event on this channel
+ {nexteventstart} next event start time in hh::mm
+ {nexteventstop} next event event stop time in hh::mm
+ {nexteventshorttext} next event short text
+ {nexteventdescription} next event description
+ {nexteventday} next event name of day
+ {nexteventdate} next event date in dd:mm:yy
+ {nexteventduration} next event duration
+ {nexteventdurationhours} duration, full hours
+ {nexteventdurationminutes} duration, rest of minutes
+ {schedule[]} array with following 10 schedules
+ {schedule[title]} title of event
+ {schedule[shorttext]} shorttext of event
+ {schedule[start]} start time of event in hh:mm
+ {schedule[stop]} stop time of event in hh:mm
+ -->
+ <currentelement delay="500" fadetime="0">
+ <area x="63%" y="0" width="36%" height="85%" layer="2">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="10" y="0" width="30%" height="10%" />
+ <drawtext name="channame" align="right" y="{height(logo)}/2 - {height(channame)}/2" width="65%" font="{semibold}" fontsize="10%" color="{clrWhite}" text="{name}" />
+ <!-- now -->
+ <drawtext name="now" x="2%" y="{height(logo)}" width="96%" font="{semibold}" fontsize="8%" color="{clrWhite}" text="Now: {presenteventtitle}" />
+ <!--progressbar for now -->
+ <drawtext name="start" x="{areawidth}/4 - {width(start)}" y="{height(logo)} + {height(now)}" font="{light}" fontsize="7%" color="{clrWhite}" text="{presenteventstart}" />
+ <drawtext name="stop" x="{areawidth}*3/4" y="{height(logo)} + {height(now)}" font="{light}" fontsize="7%" color="{clrWhite}" text="{presenteventstop}" />
+ <drawrectangle x="{areawidth}/4+10" y="{height(logo)} + {height(now)} + {height(start)} / 2" width="{areawidth}/2 - 20" height="1" color="{clrWhite}" />
+ <drawrectangle x="{areawidth}/4+10" y="{height(logo)} + {height(now)} + {height(start)} / 2 - 2" width="{areawidth}/2 * {presenteventelapsed} / {presenteventduration} - 20 * {presenteventelapsed} / {presenteventduration}" height="5" color="{clrWhite}" />
+ <!-- shorttext and description -->
+ <drawtextbox name="nowshort" x="2%" y="{posy(start)} + {height(start)} + 10" width="96%" font="{light}" fontsize="6%" color="{clrWhite}" text="{presenteventshorttext}" />
+ <drawtextbox name="nowdesc" x="2%" y="{posy(nowshort)} + {height(nowshort)}" width="96%" height="36%" font="{light}" fontsize="6%" color="{clrWhite}" text="{presenteventdescription}" />
+ <!-- next -->
+ <drawtext name="next" x="2%" y="{posy(nowdesc)} + {height(nowdesc)}" width="96%" font="{semibold}" fontsize="7%" color="{clrWhite}" text="Next: {nexteventtitle}" />
+ <drawtext name="nexttime" x="2%" y="{posy(next)} + {height(next)}" width="96%" font="{light}" fontsize="6%" color="{clrWhite}" text="{nexteventstart} - {nexteventstop} ({presenteventduration} min)" />
+ </area>
+ <areascroll mode="forthandback" orientation="vertical" delay="1000" scrollspeed="medium" x="63%" y="85%" width="36%" height="15%" layer="2">
+ <drawtext x="10" y="0" font="{semibold}" fontsize="30%" color="{clrWhite}" text="Following Schedules:" />
+ <loop name="schedule" x="0" y="{areaheight}/4 + 5" orientation="vertical">
+ <drawtext x="10" font="{light}" width="{areawidth}-20" fontsize="30%" color="{clrWhite}" text="{schedule[start]} {schedule[title]}" />
+ </loop>
+ </areascroll>
+ </currentelement>
+ </menuitems>
+ <!-- Available Variables colorbuttons:
+ {height} height in one-tenth of a percent of total height
+ {offset} offset from top in one-tenth of a percent of total height
+ -->
+ <scrollbar>
+ <area x="60%" y="10%" width="2%" height="82%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+</menuchannels>
\ No newline at end of file
diff --git a/skins/metrixhd/xmlfiles/displaymenudefault.xml b/skins/metrixhd/xmlfiles/displaymenudefault.xml
new file mode 100644
index 0000000..20ac1ba
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenudefault.xml
@@ -0,0 +1,185 @@
+ <menudefault x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <!-- background Menu -->
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </background>
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ -->
+ <header>
+ <area x="0" y="0" width="75%" height="10%" layer="2">
+ <drawtext condition="not{hasicon}" x="5" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ <drawimage condition="{hasicon}" name="icon" imagetype="menuicon" path="{icon}" x="5" valign="center" width="{areaheight}*8/10" height="80%"/>
+ <drawtext condition="{hasicon}" x="{areaheight}" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ </area>
+ </header>
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="80%" y="0" width="10%" height="10%" layer="2">
+ <drawtext align="right" y="0%" font="{light}" fontsize="50%" color="{clrWhite}" text="{dayname}" />
+ <drawtext align="right" y="45%" font="{light}" fontsize="50%" color="{clrWhite}" text="{day}. {monthname}" />
+ </area>
+ <area x="90%" y="0" width="10%" height="10%" layer="2">
+ <drawtext align="center" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{time}" />
+ </area>
+ </datetime>
+
+ <!-- Available Variables colorbuttons:
+ {red1} true if red button is button 1
+ {red2} true if red button is button 2
+ {red3} true if red button is button 3
+ {red4} true if red button is button 4
+ {green1} true if green button is button 1
+ {green2} true if green button is button 2
+ {green3} true if green button is button 3
+ {green4} true if green button is button 4
+ {yellow1} true if yellow button is button 1
+ {yellow2} true if yellow button is button 2
+ {yellow3} true if yellow button is button 3
+ {yellow4} true if yellow button is button 4
+ {blue1} true if blue button is button 1
+ {blue2} true if blue button is button 2
+ {blue3} true if blue button is button 3
+ {blue4} true if blue button is button 4
+ {red} label of red button
+ {green} label of green button
+ {yellow} label of yellow button
+ {blue} label of blue button
+ -->
+ <colorbuttons>
+ <area x="0" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red1}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green1}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow1}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue1}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="25%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red2}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green2}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow2}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue2}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="50%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red3}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green3}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow3}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue3}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="75%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red4}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green4}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow4}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ </colorbuttons>
+
+ <scrollbar>
+ <area x="96%" y="10%" width="2%" height="82%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+ <!-- IMPORTANT: menuitemwidth and determinatefont have to be defined here. menuitemwidth defines the total width of the
+ default menu items, determinatefont the function which sets the actual font to use. With that it is possible to determinate
+ the correct column widths -->
+ <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" menuitemwidth="94%" determinatefont="column1" numlistelements="16">
+ <!-- Available Variables default menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {column1} text of column1
+ {column2} text of column2
+ {column3} text of column3
+ {column4} text of column4
+ {column5} text of column5
+ {column6} text of column6
+ {column2set} true if column2 is used
+ {column3set} true if column3 is used
+ {column4set} true if column4 is used
+ {column5set} true if column5 is used
+ {column6set} true if column6 is used
+ {column2x} proposed x value of column2
+ {column3x} proposed x value of column3
+ {column4x} proposed x value of column4
+ {column5x} proposed x value of column5
+ {column6x} proposed x value of column6
+ {column1width} proposed width of column1
+ {column2width} proposed width of column2
+ {column3width} proposed width of column3
+ {column4width} proposed width of column4
+ {column5width} proposed width of column5
+ {column6width} proposed width of column6
+ {columnscroll} number of column which should have scrollable text
+ {current} true if column is currently selected
+ {separator} true if column is a list separator
+ -->
+ <listelement>
+ <area x="0" width="95%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ </area>
+
+ <areascroll scrollelement="column1" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="{column1width}" layer="3">
+ <drawtext name="column1" x="{column1x}" width="{column1width}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column1}" />
+ </areascroll>
+ <area x="1%" width="100%" layer="3">
+ <drawtext condition="{column2set}" x="{column2x}" valign="center" font="{light}" fontsize="90%" width="{column2width}" color="{clrWhite}" text="{column2}" />
+ <drawtext condition="{column3set}" x="{column3x}" valign="center" font="{light}" fontsize="90%" width="{column3width}" color="{clrWhite}" text="{column3}" />
+ <drawtext condition="{column4set}" x="{column4x}" valign="center" font="{light}" fontsize="90%" width="{column4width}" color="{clrWhite}" text="{column4}" />
+ <drawtext condition="{column5set}" x="{column5x}" valign="center" font="{light}" fontsize="90%" width="{column5width}" color="{clrWhite}" text="{column5}" />
+ <drawtext condition="{column6set}" x="{column6x}" valign="center" font="{light}" fontsize="90%" width="{column6width}" color="{clrWhite}" text="{column6}" />
+ </area>
+ <!--
+ <areascroll condition="not{separator}++eq({columnscroll},1)" scrollelement="column1" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="{column1width}" layer="3">
+ <drawtext name="column1" x="{column1x}" width="{column1width}" valign="center" font="{vdrOsd}" fontsize="90%" color="{clrWhite}" text="{column1}" />
+ </areascroll>
+ <area condition="not{separator}++eq({columnscroll},1)" x="1%" width="100%" layer="3">
+ <drawtext condition="{column2set}" x="{column2x}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column2}" />
+ <drawtext condition="{column3set}" x="{column3x}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column3}" />
+ <drawtext condition="{column4set}" x="{column4x}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column4}" />
+ <drawtext condition="{column5set}" x="{column5x}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column5}" />
+ <drawtext condition="{column6set}" x="{column6x}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column6}" />
+ </area>
+ <areascroll condition="not{separator}++gt({columnscroll},1)" scrollelement="column2" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="{column2x}" width="{column2width}" layer="3">
+ <drawtext name="column2" x="0" width="{column2width}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column2}" />
+ </areascroll>
+ <area condition="not{separator}++gt({columnscroll},1)" x="1%" width="100%" layer="3">
+ <drawtext condition="{column1set}" x="{column1x}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column1}" />
+ <drawtext condition="{column3set}" x="{column3x}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column3}" />
+ <drawtext condition="{column4set}" x="{column4x}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column4}" />
+ <drawtext condition="{column5set}" x="{column5x}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column5}" />
+ <drawtext condition="{column6set}" x="{column6x}" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{column6}" />
+ </area>
+ -->
+ </listelement>
+ </menuitems>
+</menudefault>
diff --git a/skins/metrixhd/xmlfiles/displaymenudetailepg.xml b/skins/metrixhd/xmlfiles/displaymenudetailepg.xml
new file mode 100644
index 0000000..39bd991
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenudetailepg.xml
@@ -0,0 +1,349 @@
+<menudetailedepg x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area x="0" y="0" width="100%" height="20%" layer="2">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ <area x="0" y="85%" width="100%" height="2" layer="3">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ </background>
+ <!-- dummyheader -->
+ <header>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </header>
+ <datetime>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </datetime>
+ <!-- Available Variables colorbuttons:
+ {red1} true if red button is button 1
+ {red2} true if red button is button 2
+ {red3} true if red button is button 3
+ {red4} true if red button is button 4
+ {green1} true if green button is button 1
+ {green2} true if green button is button 2
+ {green3} true if green button is button 3
+ {green4} true if green button is button 4
+ {yellow1} true if yellow button is button 1
+ {yellow2} true if yellow button is button 2
+ {yellow3} true if yellow button is button 3
+ {yellow4} true if yellow button is button 4
+ {blue1} true if blue button is button 1
+ {blue2} true if blue button is button 2
+ {blue3} true if blue button is button 3
+ {blue4} true if blue button is button 4
+ {red} label of red button
+ {green} label of green button
+ {yellow} label of yellow button
+ {blue} label of blue button
+ -->
+ <colorbuttons>
+ <area x="0" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red1}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green1}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow1}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue1}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="25%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red2}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green2}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow2}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue2}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="50%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red3}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green3}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow3}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue3}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="75%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red4}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green4}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow4}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ </colorbuttons>
+ <!-- Available Variables in detailheader elements:
+ {title} title of event
+ {shorttext} shorttext of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {vps} vps description string
+ {channelname} Channelname of event
+ {channelnumber} Channelnumber of event
+ {channelid} ChannelID as path to display channel logo
+ {ismovie} true if event is scraped as a movie
+ {isseries} true if event is scraped as a series
+ {posteravailable} true if a poster is available
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {banneravailable} true if a banner is available
+ {bannerwidth} width of banner
+ {bannerheight} height of banner
+ {bannerpath} path of banner
+ {epgpicavailable} true if a epg picture is available
+ {epgpicpath} path of epg picture
+ -->
+ <detailheader>
+ <area x="1%" y="0" width="98%" height="20%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="15%" height="80%" valign="center" />
+ <drawimage condition="{isseries}++{banneravailable}++not{epgpicavailable}" imagetype="image" path="{bannerpath}" x="{areawidth} - {areawidth}/3 - 10" valign="center" width="{areawidth}/3" height="{areawidth}/3 * {bannerheight} / {bannerwidth}"/>
+ <drawimage condition="{ismovie}++{posteravailable}++not{epgpicavailable}" imagetype="image" path="{posterpath}" x="{areawidth} - {areaheight}*8/10" valign="center" width="{areaheight}*8 / 10 * {posterheight} / {posterwidth}" height="{areaheight}*8 / 10"/>
+ <drawimage condition="{epgpicavailable}" imagetype="image" path="{epgpicpath}" x="{areawidth} - {areaheight}*8/10 * 174 / 130" valign="center" width="{areaheight}*8/10 * 174 / 130" height="{areaheight}*8 / 10"/>
+
+ <drawtext name="title" x="{width(logo)} + 20" valign="center" font="{semibold}" fontsize="35%" color="{clrWhite}" text="{title}" />
+ <drawtext name="datetime" x="{width(logo)} + 20" y="{posy(title)} - {height(datetime)}" font="{light}" fontsize="25%" color="{clrWhite}" text="{day} {date} {start} - {stop} ({duration} mins)" />
+ <drawtext name="shorttext" x="{width(logo)} + 20" y="{posy(title)} + {height(title)}" font="{light}" fontsize="25%" color="{clrWhite}" text="{shorttext}" />
+ </area>
+ </detailheader>
+ <!-- Available Variables scrollbar:
+ {height} height in one-tenth of a percent of total height
+ {offset} offset from top in one-tenth of a percent of total height
+ -->
+ <scrollbar>
+ <area x="98%" y="20%" width="2%" height="65%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+ <!-- Available Variables in tab elements:
+ {title} title of event
+ {shorttext} shorttext of event
+ {description} description of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} Day of event as three letter abrivation
+ {date} Date of event
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {vps} vps description string
+ {channelid} ChannelID as path to display channel logo
+ {hasreruns} true if reruns of this event are found
+ {reruns[]} array with reruns
+ {reruns[title]} title of rerun
+ {reruns[shorttext]} shorttext of rerun
+ {reruns[date]} date of rerun in dd:mm
+ {reruns[day]} short dayname of rerun
+ {reruns[start]} start time of rerun in hh:mm
+ {reruns[stop]} stop time of rerun in hh:mm
+ {reruns[channelname]} name of channel on which rerun occurs
+ {reruns[channelnumber]} number of channel on which rerun occurs
+ {reruns[channelid]} id of channel on which rerun occurs to display channel logo
+ {reruns[channellogoexists]} true if channel logo exists
+ {epgpic1avaialble} true if first epg picture is available
+ {epgpic2avaialble} true if first epg picture is available
+ {epgpic3avaialble} true if first epg picture is available
+ {epgpic1path} path of first epg picture
+ {epgpic2path} path of second epg picture
+ {epgpic3path} path of third epg picture
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+
+ <!-- a tab is one scrolling area, just position and draw as inside a normal area -->
+
+ <!-- TAB EPGINFO -->
+ <tab name="EPG Info" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtextbox condition="not{isseries}++not{ismovie}" x="0" y="0" width="96%" font="{light}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ <drawimage condition="{isseries}" name="seriesposter" imagetype="image" path="{seriesposter1path}" x="{areawidth}*0.75" y="0" width="{areawidth}*0.25" height="{areawidth} * 0.25 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage condition="{ismovie}" name="movieposter" imagetype="image" path="{posterpath}" x="{areawidth}*0.75" y="0" width="{areawidth}*0.25" height="{areawidth} * 0.25 * {posterheight} / {posterwidth}" />
+ <drawtextbox condition="{isseries}" x="0" y="0" width="96%" float="topright" floatwidth="{width(seriesposter)} + 10" floatheight="{height(seriesposter)} + 20" font="{light}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="{ismovie}" x="0" y="0" width="96%" float="topright" floatwidth="{width(movieposter)} + 10" floatheight="{height(movieposter)} + 20" font="{light}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ </tab>
+ <!-- TAB RERUNS -->
+ <tab condition="{hasreruns}" name="{tr(reruns)}" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext align="center" y="0" name="title" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(rerunsof)} '{title}'" />
+ <loop name="reruns" x="0" y="{height(title)} + 10" width="{areawidth}" orientation="vertical">
+ <drawimage name="logo" condition="{reruns[channellogoexists]}" imagetype="channellogo" path="{reruns[channelid]}" x="0" width="10%" height="10%" />
+ <drawtext name="channelname" condition="not{reruns[channellogoexists]}" x="-5" font="{light}" fontsize="10%" color="{clrWhite}" text="{reruns[channelname]}" />
+ <drawtext condition="{reruns[channellogoexists]}" x="{width(logo)}+20" y="-5" width="{areawidth} - {width(logo)} - 20" font="{light}" fontsize="8%" color="{clrWhite}" text="{reruns[day]} {reruns[date]} {reruns[start]} - {reruns[stop]}: {reruns[title]} {reruns[shorttext]}" />
+ <drawtext condition="not{reruns[channellogoexists]}" x="{width(channelname)}+20" y="-5" width="{areawidth} - {width(logo)} - 20" font="{light}" fontsize="8%" color="{clrWhite}" text="{reruns[day]} {reruns[date]} {reruns[start]} - {reruns[stop]}: {reruns[title]} {reruns[shorttext]}" />
+ </loop>
+ </tab>
+ <!-- TAB ACTORS -->
+ <tab condition="{isseries}||{ismovie}" name="{tr(actors)}" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext align="center" name="title" y="0" font="{semibold}" fontsize="15%" color="{clrWhite}" text="{tr(actors)}" />
+ <loop name="actors" x="0" y="{height(title)} + 10" width="{areawidth}" orientation="horizontal" columnwidth="{areawidth}/5" rowheight="{areawidth}/5*1.8" overflow="linewrap">
+ <drawimage name="thumb" imagetype="image" path="{actors[thumb]}" x="20" y="0" width="{columnwidth}-40" height="{columnwidth} * {actors[thumbheight]} / {actors[thumbwidth]} - 40 * {actors[thumbheight]} / {actors[thumbwidth]}"/>
+ <drawtext align="center" y="{height(thumb)} + 10" width="{columnwidth}" name="actorname" font="{light}" fontsize="7%" color="{clrWhite}" text="{actors[name]}" />
+ <drawtext align="center" y="{height(thumb)} + 10 + {height(actorname)}" width="{columnwidth}" font="{light}" fontsize="7%" color="{clrWhite}" text="{actors[role]}" />
+ </loop>
+ </tab>
+ <!-- TAB TVDBINFO -->
+ <tab condition="{isseries}" name="TvDBInfo" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="banner" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="episodeimage" imagetype="image" path="{episodeimagepath}" x="{areawidth}*0.7" y="{height(banner)} + 20" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {episodeimageheight} / {episodeimagewidth}"/>
+ <drawimage name="seasonposter" imagetype="image" path="{seasonposterpath}" x="{areawidth}*0.7" y="{height(banner)} + {height(episodeimage)} + 30" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seasonposterheight} / {seasonposterwidth}"/>
+ <drawtextbox x="0" y="{height(banner)} + 20" width="96%" float="topright" floatwidth="{width(seasonposter)} + 10" floatheight="{height(episodeimage)} + {height(seasonposter)} + 30" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(episode)}: {episodetitle} ({tr(season)} {episodeseason}, {tr(episode)} {episodenumber})
{episodeoverview}|
{tr(gueststars)}: {episodegueststars}||
{tr(seriesfirstaired)}: {seriesfirstaired}||
{tr(episodefirstaired [...]
+ </tab>
+ <!-- TAB SERIESGALERY -->
+ <tab condition="{isseries}" name="{tr(seriesgalery)}" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="banner1" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="fanart1" imagetype="image" path="{seriesfanart1path}" align="center" y="{posy(banner1)} + {height(banner1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart1height} / {seriesfanart1width}"/>
+ <drawimage name="banner2" imagetype="image" path="{seriesbanner2path}" align="center" y="{posy(fanart1)} + {height(fanart1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner2height} / {seriesbanner2width}"/>
+ <drawimage name="fanart2" imagetype="image" path="{seriesfanart2path}" align="center" y="{posy(banner2)} + {height(banner2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart2height} / {seriesfanart2width}"/>
+ <drawimage name="banner3" imagetype="image" path="{seriesbanner3path}" align="center" y="{posy(fanart2)} + {height(fanart2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner3height} / {seriesbanner3width}"/>
+ <drawimage name="fanart3" imagetype="image" path="{seriesfanart3path}" align="center" y="{posy(banner3)} + {height(banner3)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart3height} / {seriesfanart3width}"/>
+ <drawimage name="poster1" imagetype="image" path="{seriesposter1path}" align="center" y="{posy(fanart3)} + {height(fanart3)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage name="poster2" imagetype="image" path="{seriesposter2path}" align="center" y="{posy(poster1)} + {height(poster1)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter2height} / {seriesposter2width}"/>
+ <drawimage name="poster3" imagetype="image" path="{seriesposter3path}" align="center" y="{posy(poster2)} + {height(poster2)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter3height} / {seriesposter3width}"/>
+ </tab>
+ <!-- TAB MOVIEDBINFO -->
+ <tab condition="{ismovie}" name="MovieDBInfo" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="poster" imagetype="image" path="{posterpath}" x="70%" y="10" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {posterheight} / {posterwidth}"/>
+ <drawtextbox x="0" y="10" width="96%" float="topright" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 20" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(originaltitle)}: {movieoriginalTitle}
|{tr(genre)}: {moviegenres}
||{movietagline}
|{movieoverview}
|{tr(budget)}: {moviebudget}
||{tr(revenue)}: {movierevenue}
||{tr(adult)}: {movieadult}
||{tr(releasedate)}: {moviereleasedate}
||{tr(runtime)} [...]
+ </tab>
+ <!-- TAB MOVIEGALERY -->
+ <tab condition="{ismovie}" name="{tr(moviegalery)}" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="fanart" imagetype="image" path="{fanartpath}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {fanartheight} / {fanartwidth}"/>
+ <drawimage name="poster" imagetype="image" path="{posterpath}" align="center" y="{height(fanart)} + 30" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {posterheight} / {posterwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionfanart" imagetype="image" path="{collectionfanartpath}" align="center" y="{posy(poster)} + {height(poster)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {collectionfanartheight} / {collectionfanartwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionposter" imagetype="image" path="{collectionposterpath}" align="center" y="{posy(collectionfanart)} + {height(collectionfanart)} + 20" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {collectionposterheight} / {collectionposterwidth}"/>
+ </tab>
+
+ <!-- Available Variables tablabels:
+ {tabs[]} array with available tab labels
+ {tabs[title]} title of tab
+ {tabs[current]} true if tab is displayed currently
+ -->
+ <tablabels>
+ <area x="0" y="85%" width="98%" height="5%" layer="3">
+ <loop name="tabs" x="0" y="0" orientation="horizontal">
+ <drawrectangle condition="{tabs[current]}" x="0" y="0" width="{width(label)}" height="100%" color="{clrTransBlueLight}" />
+ <drawrectangle condition="not{tabs[current]}" x="0" y="0" width="{width(label)}" height="100%" color="{clrTransBlueLight}" />
+ <drawrectangle condition="not{tabs[current]}" x="2" y="2" width="{width(label)} - 4" height="{areaheight}-4" color="{clrTransparent}" />
+ <drawtext name="label" x="0" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text=" {tabs[title]} " />
+ </loop>
+ </area>
+ </tablabels>
+</menudetailedepg>
\ No newline at end of file
diff --git a/skins/metrixhd/xmlfiles/displaymenudetailrecording.xml b/skins/metrixhd/xmlfiles/displaymenudetailrecording.xml
new file mode 100644
index 0000000..47f096d
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenudetailrecording.xml
@@ -0,0 +1,326 @@
+<menudetailedrecording x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area x="0" y="0" width="100%" height="20%" layer="2">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ <area x="0" y="85%" width="100%" height="2" layer="3">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ </background>
+ <!-- dummyheader -->
+ <header>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </header>
+ <datetime>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </datetime>
+ <!-- Available Variables colorbuttons:
+ {red1} true if red button is button 1
+ {red2} true if red button is button 2
+ {red3} true if red button is button 3
+ {red4} true if red button is button 4
+ {green1} true if green button is button 1
+ {green2} true if green button is button 2
+ {green3} true if green button is button 3
+ {green4} true if green button is button 4
+ {yellow1} true if yellow button is button 1
+ {yellow2} true if yellow button is button 2
+ {yellow3} true if yellow button is button 3
+ {yellow4} true if yellow button is button 4
+ {blue1} true if blue button is button 1
+ {blue2} true if blue button is button 2
+ {blue3} true if blue button is button 3
+ {blue4} true if blue button is button 4
+ {red} label of red button
+ {green} label of green button
+ {yellow} label of yellow button
+ {blue} label of blue button
+ -->
+ <colorbuttons>
+ <area x="0" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red1}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green1}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow1}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue1}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="25%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red2}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green2}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow2}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue2}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="50%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red3}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green3}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow3}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue3}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="75%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red4}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green4}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow4}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ </colorbuttons>
+ <!-- Available Variables in detailheader elements:
+ {name} full name of recording (including folders)
+ {epgname} Name of recording (Name from EPG)
+ {shorttext} shorttext of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of current recording in hh:mm
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+ {ismovie} true if event is scraped as a movie
+ {isseries} true if event is scraped as a series
+ {posteravailable} true if a poster is available
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {banneravailable} true if a banner is available
+ {bannerwidth} width of banner
+ {bannerheight} height of banner
+ {bannerpath} path of banner
+ {recimgavailable} true if a recording image is available in the recording path
+ {recimgpath} path of rec image
+ -->
+ <detailheader>
+ <area x="1%" y="0" width="98%" height="20%" layer="3">
+ <drawimage condition="{isseries}++{banneravailable}++not{recimgavailable}" imagetype="image" path="{bannerpath}" x="{areawidth} - {areawidth}/3 - 10" valign="center" width="{areawidth}/3" height="{areawidth}/3 * {bannerheight} / {bannerwidth}"/>
+ <drawimage condition="{ismovie}++{posteravailable}++not{recimgavailable}" imagetype="image" path="{posterpath}" x="{areawidth} - {areaheight}*8/10" valign="center" width="{areaheight}*8 / 10 * {posterheight} / {posterwidth}" height="{areaheight}*8 / 10"/>
+ <drawimage condition="{recimgavailable}" imagetype="image" path="{recimgpath}" x="{areawidth} - {areaheight}*8/10 * 174 / 130" valign="center" width="{areaheight}*8/10 * 174 / 130" height="{areaheight}*8 / 10"/>
+
+ <drawtext name="title" x="20" valign="center" font="{semibold}" fontsize="35%" color="{clrWhite}" text="{epgname}" />
+ <drawtext name="datetime" x="20" y="{posy(title)} - {height(datetime)}" font="{light}" fontsize="25%" color="{clrWhite}" text="{date} {time} ({duration} mins)" />
+ <drawtext name="shorttext" x="20" y="{posy(title)} + {height(title)}" font="{light}" fontsize="25%" color="{clrWhite}" text="{shorttext}" />
+ </area>
+ </detailheader>
+ <!-- Available Variables scrollbar:
+ {height} height in one-tenth of a percent of total height
+ {offset} offset from top in one-tenth of a percent of total height
+ -->
+ <scrollbar>
+ <area x="98%" y="20%" width="2%" height="65%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+ <!-- Available Variables in tab elements:
+ {name} full name of recording (including folders)
+ {epgname} Name of recording (Name from EPG)
+ {shorttext} shorttext of recording
+ {description} description of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of recording in hh:mm
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+
+ {recordingsize} size of recording (automatically in GB / MB)
+ {recordingsizecutted} size of cutted recording (automatically in GB / MB)
+ {recordinglength} length of recording (in hh::mm:ss)
+ {recordinglengthcutted} length of cutted recording (in hh::mm:ss)
+ {recordingbitrate} bitrate of recording (in MBit/s)
+ {recordingformat} format of recording (TS / PS)
+ {searchtimer} name of accordign searchtimer (if available)
+
+ {recimg1avaialble} true if first recording image is available
+ {recimg2avaialble} true if first recording image is available
+ {recimg3avaialble} true if first recording image is available
+ {recimg1path} path of first recording image
+ {recimg2path} path of second recording image
+ {recimg3path} path of third recording image
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+
+ <!-- a tab is one scrolling area, just position and draw as inside a normal area -->
+ <tab name="Info" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtextbox condition="not{isseries}++not{ismovie}" x="0" y="0" width="96%" font="{light}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ <drawimage condition="{isseries}" name="seriesposter" imagetype="image" path="{seriesposter1path}" x="{areawidth}*0.7" y="0" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage condition="{ismovie}" name="movieposter" imagetype="image" path="{posterpath}" x="{areawidth}*0.7" y="0" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {posterheight} / {posterwidth}" />
+ <drawtextbox condition="{isseries}" x="0" y="0" width="96%" float="topright" floatwidth="{width(seriesposter)} + 10" floatheight="{height(seriesposter)} + 20" font="{light}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="{ismovie}" x="0" y="0" width="96%" float="topright" floatwidth="{width(movieposter)} + 10" floatheight="{height(movieposter)} + 20" font="{light}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ </tab>
+ <tab name="{tr(recinfo)}" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext align="center" y="0" name="title" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(recinfo)}" />
+ <drawtextbox x="0" y="{height(title)} + 20" width="96%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(recsize)}: {recordingsize}
{tr(recsizecutted)}: {recordingsizecutted}
{tr(reclength)}: {recordinglength}
{tr(reclengthcutted)}: {recordinglengthcutted}
{tr(bitrate)}: {recordingbitrate}
{tr(format)}: {recordingformat}
{tr(searchtimer)}: {searchtimer}
" />
+ </tab>
+ <tab condition="{isseries}||{ismovie}" name="{tr(actors)}" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext align="center" name="title" y="0" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(actors)}" />
+ <loop name="actors" x="0" y="{height(title)} + 10" width="{areawidth}" orientation="horizontal" columnwidth="{areawidth}/5" rowheight="{areawidth}/5*1.8" overflow="linewrap">
+ <drawimage name="thumb" imagetype="image" path="{actors[thumb]}" x="20" y="0" width="{columnwidth}-40" height="{columnwidth} * {actors[thumbheight]} / {actors[thumbwidth]} - 40 * {actors[thumbheight]} / {actors[thumbwidth]}"/>
+ <drawtext align="center" y="{height(thumb)} + 10" width="{columnwidth}" name="actorname" font="{light}" fontsize="7%" color="{clrWhite}" text="{actors[name]}" />
+ <drawtext align="center" y="{height(thumb)} + 10 + {height(actorname)}" width="{columnwidth}" font="{light}" fontsize="7%" color="{clrWhite}" text="{actors[role]}" />
+ </loop>
+ </tab>
+ <tab condition="{isseries}" name="TvDBInfo" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="banner" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="episodeimage" imagetype="image" path="{episodeimagepath}" x="{areawidth}*0.7" y="{height(banner)} + 20" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {episodeimageheight} / {episodeimagewidth}"/>
+ <drawimage name="seasonposter" imagetype="image" path="{seasonposterpath}" x="{areawidth}*0.7" y="{height(banner)} + {height(episodeimage)} + 30" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seasonposterheight} / {seasonposterwidth}"/>
+ <drawtextbox x="0" y="{height(banner)} + 20" width="96%" float="topright" floatwidth="{width(seasonposter)} + 10" floatheight="{height(episodeimage)} + {height(seasonposter)} + 30" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(episode)}: {episodetitle} ({tr(season)} {episodeseason}, {tr(episode)} {episodenumber})
{episodeoverview}|
{tr(gueststars)}: {episodegueststars}||
{tr(seriesfirstaired)}: {seriesfirstaired}||
{tr(episodefirstaired [...]
+ </tab>
+ <tab condition="{isseries}" name="{tr(seriesgalery)}" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="banner1" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="fanart1" imagetype="image" path="{seriesfanart1path}" align="center" y="{posy(banner1)} + {height(banner1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart1height} / {seriesfanart1width}"/>
+ <drawimage name="banner2" imagetype="image" path="{seriesbanner2path}" align="center" y="{posy(fanart1)} + {height(fanart1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner2height} / {seriesbanner2width}"/>
+ <drawimage name="fanart2" imagetype="image" path="{seriesfanart2path}" align="center" y="{posy(banner2)} + {height(banner2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart2height} / {seriesfanart2width}"/>
+ <drawimage name="banner3" imagetype="image" path="{seriesbanner3path}" align="center" y="{posy(fanart2)} + {height(fanart2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner3height} / {seriesbanner3width}"/>
+ <drawimage name="fanart3" imagetype="image" path="{seriesfanart3path}" align="center" y="{posy(banner3)} + {height(banner3)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart3height} / {seriesfanart3width}"/>
+ <drawimage name="poster1" imagetype="image" path="{seriesposter1path}" align="center" y="{posy(fanart3)} + {height(fanart3)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage name="poster2" imagetype="image" path="{seriesposter2path}" align="center" y="{posy(poster1)} + {height(poster1)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter2height} / {seriesposter2width}"/>
+ <drawimage name="poster3" imagetype="image" path="{seriesposter3path}" align="center" y="{posy(poster2)} + {height(poster2)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter3height} / {seriesposter3width}"/>
+ </tab>
+ <tab condition="{ismovie}" name="MovieDBInfo" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="poster" imagetype="image" path="{posterpath}" x="70%" y="10" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {posterheight} / {posterwidth}"/>
+ <drawtextbox x="0" y="10" width="96%" float="topright" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 20" font="{light}" fontsize="8%" color="{clrWhite}" text="{tr(originaltitle)}: {movieoriginalTitle}
|{tr(genre)}: {moviegenres}
||{movietagline}
|{movieoverview}
|{tr(budget)}: {moviebudget}$
||{tr(revenue)}: {movierevenue}$
||{tr(adult)}: {movieadult}
||{tr(releasedate)}: {moviereleasedate}
||{tr(runtime [...]
+ </tab>
+ <tab condition="{ismovie}" name="{tr(moviegalery)}" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="fanart" imagetype="image" path="{fanartpath}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {fanartheight} / {fanartwidth}"/>
+ <drawimage name="poster" imagetype="image" path="{posterpath}" align="center" y="{height(fanart)} + 30" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {posterheight} / {posterwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionfanart" imagetype="image" path="{collectionfanartpath}" align="center" y="{posy(poster)} + {height(poster)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {collectionfanartheight} / {collectionfanartwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionposter" imagetype="image" path="{collectionposterpath}" align="center" y="{posy(collectionfanart)} + {height(collectionfanart)} + 20" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {collectionposterheight} / {collectionposterwidth}"/>
+ </tab>
+
+ <!-- Available Variables tablabels:
+ {tabs[]} array with available tab labels
+ {tabs[title]} title of tab
+ {tabs[current]} true if tab is displayed currently
+ -->
+ <tablabels>
+ <area x="0" y="85%" width="98%" height="5%" layer="3">
+ <loop name="tabs" x="0" y="0" orientation="horizontal">
+ <drawrectangle condition="{tabs[current]}" x="0" y="0" width="{width(label)}" height="100%" color="{clrTransBlueLight}" />
+ <drawrectangle condition="not{tabs[current]}" x="0" y="0" width="{width(label)}" height="100%" color="{clrTransBlueLight}" />
+ <drawrectangle condition="not{tabs[current]}" x="2" y="2" width="{width(label)} - 4" height="{areaheight}-4" color="{clrTransparent}" />
+ <drawtext name="label" x="0" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text=" {tabs[title]} " />
+ </loop>
+ </area>
+ </tablabels>
+</menudetailedrecording>
diff --git a/skins/metrixhd/xmlfiles/displaymenudetailtext.xml b/skins/metrixhd/xmlfiles/displaymenudetailtext.xml
new file mode 100644
index 0000000..5fd8997
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenudetailtext.xml
@@ -0,0 +1,99 @@
+<menudetailedtext x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </background>
+ <header>
+ <area x="0" y="0" width="75%" height="10%" layer="2">
+ <drawtext x="5" valign="center" font="{light}" fontsize="50%" color="{clrWhite}" text="{title}" />
+ </area>
+ </header>
+ <datetime>
+ <area x="75%" y="0" width="12%" height="10%" layer="2">
+ <drawtext align="right" y="15%" font="{light}" fontsize="30%" color="{clrWhite}" text="{dayname}" />
+ <drawtext align="right" y="45%" font="{light}" fontsize="30%" color="{clrWhite}" text="{day}. {monthname}" />
+ </area>
+ <area x="87%" y="0" width="13%" height="10%" layer="2">
+ <drawtext align="center" valign="center" font="{light}" fontsize="60%" color="{clrWhite}" text="{time}" />
+ </area>
+ </datetime>
+ <!-- Available Variables colorbuttons:
+ {red1} true if red button is button 1
+ {red2} true if red button is button 2
+ {red3} true if red button is button 3
+ {red4} true if red button is button 4
+ {green1} true if green button is button 1
+ {green2} true if green button is button 2
+ {green3} true if green button is button 3
+ {green4} true if green button is button 4
+ {yellow1} true if yellow button is button 1
+ {yellow2} true if yellow button is button 2
+ {yellow3} true if yellow button is button 3
+ {yellow4} true if yellow button is button 4
+ {blue1} true if blue button is button 1
+ {blue2} true if blue button is button 2
+ {blue3} true if blue button is button 3
+ {blue4} true if blue button is button 4
+ {red} label of red button
+ {green} label of green button
+ {yellow} label of yellow button
+ {blue} label of blue button
+ -->
+ <colorbuttons>
+ <area x="0" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red1}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green1}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow1}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue1}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="25%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red2}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green2}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow2}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue2}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="50%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red3}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green3}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow3}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue3}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="75%" y="92%" width="25%" height="8%" layer="2">
+ <drawtext condition="{red4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red4}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green4}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow4}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ </colorbuttons>
+ <scrollbar>
+ <area x="98%" y="10%" width="2%" height="80%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+
+ <!-- Available Variables in tab elements:
+ {text} detailed text
+ -->
+ <tab name="text" x="2%" y="10%" width="94%" height="80%" layer="2" scrollheight="{areaheight}/4">
+ <drawtextbox x="0" y="0" width="96%" font="{light}" fontsize="5%" color="{clrWhite}" text="{text}" />
+ </tab>
+</menudetailedtext>
\ No newline at end of file
diff --git a/skins/metrixhd/xmlfiles/displaymenumain.xml b/skins/metrixhd/xmlfiles/displaymenumain.xml
new file mode 100644
index 0000000..ef588a6
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenumain.xml
@@ -0,0 +1,322 @@
+<menumain x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!--
+ static content of main menu, is only drawn once at main menu startup
+ -->
+ <background>
+ <!-- main menu background -->
+ <area x="0" y="0" width="71%" height="70%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <!-- datetime background -->
+ <area x="75%" y="0" width="25%" height="10%" layer="2">
+ <drawrectangle x="0" y="0" width="53%" height="100%" color="{clrTransBlueLight}" />
+ <drawrectangle x="53%" y="0" width="47%" height="100%" color="{clrTransBlack}" />
+ </area>
+ </background>
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ -->
+ <header>
+ <area x="0" y="0" width="70%" height="7%" layer="2">
+ <drawtext x="10" valign="center" font="{light}" fontsize="100%" color="{clrWhite}" text="{title} {vdrversion}" />
+ </area>
+ </header>
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {monthnameshort} 3 letter abbrivation of month name
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="75%" y="0" width="13%" height="10%" layer="3">
+ <drawtext align="right" y="0%" font="{light}" fontsize="55%" color="{clrWhite}" text="{dayname}" />
+ <drawtext align="right" y="45%" font="{light}" fontsize="55%" color="{clrWhite}" text="{day}. {monthnameshort}" />
+ </area>
+ <area x="88%" y="0" width="12%" height="10%" layer="3">
+ <drawtext align="center" valign="center" font="{light}" fontsize="100%" color="{clrWhite}" text="{time}" />
+ </area>
+ </datetime>
+
+ <!-- Available Variables colorbuttons:
+ {red1} true if red button is button 1
+ {red2} true if red button is button 2
+ {red3} true if red button is button 3
+ {red4} true if red button is button 4
+ {green1} true if green button is button 1
+ {green2} true if green button is button 2
+ {green3} true if green button is button 3
+ {green4} true if green button is button 4
+ {yellow1} true if yellow button is button 1
+ {yellow2} true if yellow button is button 2
+ {yellow3} true if yellow button is button 3
+ {yellow4} true if yellow button is button 4
+ {blue1} true if blue button is button 1
+ {blue2} true if blue button is button 2
+ {blue3} true if blue button is button 3
+ {blue4} true if blue button is button 4
+ {red} label of red button
+ {green} label of green button
+ {yellow} label of yellow button
+ {blue} label of blue button
+ -->
+ <colorbuttons>
+ <area x="0" y="63%" width="18%" height="7%" layer="2">
+ <drawtext condition="{red1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red1}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green1}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow1}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue1}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue1}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="18%" y="63%" width="17%" height="7%" layer="2">
+ <drawtext condition="{red2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red2}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green2}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow2}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue2}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue2}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="35%" y="63%" width="18%" height="7%" layer="2">
+ <drawtext condition="{red3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red3}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green3}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow3}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue3}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue3}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ <area x="53%" y="63%" width="17%" height="7%" layer="2">
+ <drawtext condition="{red4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle condition="{red4}" x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ <drawtext condition="{green4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle condition="{green4}" x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ <drawtext condition="{yellow4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle condition="{yellow4}" x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ <drawtext condition="{blue4}" x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle condition="{blue4}" x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ </colorbuttons>
+ <!-- Available Variables timers:
+ {numtimers} number of active timers (max. 15 timers will be displayed)
+ {numtimerconflicts} number of current timer conflicts
+
+ {timers[]} array with active timers (local and remote if remotetimers plugin is in use)
+ {timers[title]} title of timer
+ {timers[datetime]} date and time of timer
+ {timers[recording]} true if timer is recording currently
+ {timers[channelname]} name of channel for which timer is created
+ {timers[channelnumber]} number of channel
+ {timers[channelid]} ChannelID of channel
+ {timers[channellogoexists]} true if channel logo exists
+ -->
+ <timers>
+ <area x="0" y="75%" width="{areawidth}/8 - 5" height="25%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area condition="not{numtimerconflicts}" x="0" y="75%" width="{areawidth}/8 - 5" height="25%" layer="2">
+ <drawtext align="center" y="15%" font="{light}" fontsize="50%" color="{clrWhite}" text="{numtimers}" />
+ <drawtext condition="eq({numtimers}, 0)||gt({numtimers}, 1)" name="timersheader" align="center" y="60%" font="{light}" fontsize="20%" color="{clrWhite}" text="{tr(activetimers)}" />
+ <drawtext condition="eq({numtimers}, 1)" name="timersheader" align="center" y="60%" font="{light}" fontsize="20%" color="{clrWhite}" text="{tr(activetimer)}" />
+ </area>
+ <area condition="{numtimerconflicts}" x="0" y="75%" width="{areawidth}/8 - 5" height="25%" layer="2">
+ <drawtext align="center" y="0" font="{light}" fontsize="50%" color="{clrWhite}" text="{numtimers}" />
+ <drawtext name="timersheader" align="center" y="45%" font="{light}" fontsize="20%" color="{clrWhite}" text="{tr(activetimers)}" />
+ <drawtext align="center" y="65%" font="{semibold}" fontsize="20%" color="{clrRed}" text="{numtimerconflicts} {tr(conflicts)}!" />
+ </area>
+
+ <area condition="gt({numtimers}, 0)" x="{areawidth}/8" y="75%" width="{areawidth}/8 - 5" height="25%" layer="1">
+ <fill color="{clrTransBlack}"/>
+ </area>
+ <area condition="gt({numtimers}, 1)" x="2*{areawidth}/8" y="75%" width="{areawidth}/8 - 5" height="25%" layer="1">
+ <fill color="{clrTransBlack}"/>
+ </area>
+ <area condition="gt({numtimers}, 2)" x="3*{areawidth}/8" y="75%" width="{areawidth}/8 - 5" height="25%" layer="1">
+ <fill color="{clrTransBlack}"/>
+ </area>
+ <area condition="gt({numtimers}, 3)" x="4*{areawidth}/8" y="75%" width="{areawidth}/8 - 5" height="25%" layer="1">
+ <fill color="{clrTransBlack}"/>
+ </area>
+ <area condition="gt({numtimers}, 4)" x="5*{areawidth}/8" y="75%" width="{areawidth}/8 - 5" height="25%" layer="1">
+ <fill color="{clrTransBlack}"/>
+ </area>
+ <area condition="gt({numtimers}, 5)" x="6*{areawidth}/8" y="75%" width="{areawidth}/8 - 5" height="25%" layer="1">
+ <fill color="{clrTransBlack}"/>
+ </area>
+ <area condition="gt({numtimers}, 6)" x="7*{areawidth}/8" y="75%" width="{areawidth}/8 - 5" height="25%" layer="1">
+ <fill color="{clrTransBlack}"/>
+ </area>
+ <area x="{areawidth}/8" y="75%" width="{areawidth}*0.875" height="25%" layer="2">
+ <loop name="timers" x="0" y="0" orientation="horizontal" columnwidth="{areawidth}/7" rowheight="{areaheight}" overflow="cut">
+ <drawrectangle condition="{timers[recording]}" x="0" y="0" width="{columnwidth}-5" height="{rowheight}" color="{clrRed}" />
+ <drawimage cache="true" name="logo" imagetype="channellogo" path="{timers[channelid]}" width="{columnwidth}-15" height="40%" align="center" y="10" />
+ <drawtextbox x="5" y="{height(logo)} + 10" width="{columnwidth}-10" align="center" maxlines="2" font="{light}" fontsize="15%" color="{clrWhite}" text="{timers[title]}" />
+ <drawtext align="center" y="75%" font="{light}" fontsize="20%" color="{clrWhite}" text="{timers[datetime]}" />
+ </loop>
+ </area>
+ </timers>
+
+ <!-- Available Variables discusage:
+ {freetime} available disc capacity in hh:mm
+ {freepercent} available disc capacity in percent
+ {usedpercent} used disc capacity in percent
+ {freegb} available disc capacity in gigabytes
+ {discalert} true if disc usage is > 95%
+ {vdrusagestring} localized VDR internal usage string
+ -->
+ <discusage>
+ <area x="75%" y="26%" width="25%" height="10%" layer="1">
+ <fill condition="not{discalert}" color="{clrTransBlack}"/>
+ <fill condition="{discalert}" color="{clrRed}"/>
+ </area>
+ <area x="75%" y="26%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="icon" path="ico_discusage" x="1%" valign="center" width="{areaheight}*0.9" height="{areaheight}*0.9"/>
+ <drawtext x="{areaheight}+10" y="0" font="{light}" fontsize="55%" color="{clrWhite}" text="{tr(disc)}: {freepercent}% {tr(free)}" />
+ <drawtext x="{areaheight}+10" y="45%" font="{light}" fontsize="55%" color="{clrWhite}" text="{freetime} {tr(hours)}" />
+ </area>
+ </discusage>
+
+ <!-- Available Variables currentweather:
+ {timestamp} timestamp of forecast in dd.mm hh:mm
+ {temperature} current temperature in °C
+ {apparenttemperature} apparent (feeled) temperature
+ {mintemperature} minimum daily temperature in °C
+ {maxtemperature} maximum daily temperature in °C
+ {summary} short weather summary
+ {icon} weather icon
+ {precipitationintensity} precipitation intensity in l/m2
+ {precipitationprobability} precipitation probability in %
+ {precipitationtype} precipitation type
+ {humidity} humidity in %
+ {windspeed} windspeed in km/h
+ {windbearing} wind bearing in °
+ {windbearingstring} wind bearing (N, NE, ...)
+ {visibility} visibility in km
+ {cloudcover} cloud cover in %
+ {pressure} pressure in HPo
+ {ozone} ozone value in DU
+ -->
+ <currentweather>
+ <area x="75%" y="13%" width="25%" height="10%" layer="2">
+ <drawrectangle x="0" y="0" width="53%" height="100%" color="{clrTransBlueLight}" />
+ <drawrectangle x="53%" y="0" width="47%" height="100%" color="{clrTransBlack}" />
+ </area>
+ <area x="75%" y="13%" width="12%" height="10%" layer="2">
+ <drawimage imagetype="icon" path="{icon}" align="center" valign="center" width="{areaheight}*0.9" height="{areaheight}*0.9"/>
+ </area>
+ <area x="89%" y="13%" width="10%" height="10%" layer="2">
+ <drawtext x="0" y="0" font="{light}" fontsize="25%" color="{clrWhite}" text="{mintemperature}°C" />
+ <drawtext x="0" y="75%" font="{light}" fontsize="25%" color="{clrWhite}" text="{maxtemperature}°C" />
+ </area>
+ <area x="89%" y="13%" width="10%" height="10%" layer="3">
+ <drawtext align="right" valign="center" font="{light}" fontsize="60%" color="{clrWhite}" text="{temperature}°C" />
+ </area>
+ </currentweather>
+
+ <!-- Available Variables devices:
+ {numdevices} number of available devices
+ {devices[]} array with available devices
+ {devices[num]} number of current device
+ {devices[type]} type of device (DVB-S, DVB-C, ...)
+ {devices[istuned]} true if device is currently tuned to a transponder
+ {devices[livetv]} true if device is currently playing livetv
+ {devices[recording]} true if device is currently recording
+ {devices[hascam]} true if device has a CAM
+ {devices[cam]} number of CAM
+ {devices[signalstrength]} signalstrength of devcie
+ {devices[signalquality]} signalstrength of devcie
+ {devices[channelnumber]} number of the currently tuned channel
+ {devices[channelname]} name of the currently tuned channel
+ {devices[channelid]} ID of the currently tuned channel
+ {devices[source]} source of the currently tuned channel
+ -->
+ <devices>
+ <area x="75%" y="48%" width="25%" height="{areaheight}/12 * {numdevices}" layer="1">
+ <fill color="{clrTransBlack}"/>
+ </area>
+ <area x="75%" y="48%" width="25%" height="{areaheight}/12 * {numdevices}" layer="2">
+ <loop name="devices" x="0" y="0" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight} / {numdevices}" overflow="cut">
+ <drawtext name="label" x="5" y="0" font="{light}" fontsize="{rowheight}*0.4" color="{clrWhite}" text="{devices[num]}: {devices[type]}" />
+ <drawtext condition="{devices[hascam]}" x="{width(label)} + 15" y="0" font="{light}" fontsize="{rowheight}*0.40" color="{clrWhite}" text="(CAM {devices[cam]})" />
+ <drawtext condition="{devices[recording]} ++ {devices[livetv]}" align="right" y="0" font="{light}" fontsize="{rowheight}*0.40" color="{clrRed}" text="LiveTV, Recording ({devices[channelname]}) " />
+ <drawtext condition="{devices[recording]} ++ not{devices[livetv]}" align="right" y="0" font="{light}" fontsize="{rowheight}*0.40" color="{clrRed}" text="Recording ({devices[channelname]}) " />
+ <drawtext condition="not{devices[recording]} ++ {devices[livetv]}" align="right" y="0" font="{light}" fontsize="{rowheight}*0.40" color="{clrWhite}" text="LiveTV ({devices[channelname]}) " />
+ <drawrectangle condition="{devices[istuned]}" x="5" y="{rowheight}/3 + 5" width="{areawidth} * {devices[signalstrength]} / 100 - 10 * {devices[signalstrength]} / 100" height="{rowheight}/3 - 10" color="{clrTransWhite}" />
+ <drawrectangle condition="{devices[istuned]}" x="5" y="2*{rowheight}/3 + 5" width="{areawidth} * {devices[signalquality]} / 100 - 10 * {devices[signalquality]} / 100" height="{rowheight}/3 - 10" color="{clrTransWhite}" />
+ <drawtext condition="not{devices[istuned]}" align="center" y="{rowheight}/2" font="{light}" fontsize="{rowheight}*0.40" color="{clrWhite}" text="not tuned" />
+ </loop>
+ </area>
+ </devices>
+
+ <!-- Available Variables systemload:
+ {load} current system load
+ -->
+ <systemload>
+ <area x="75%" y="40%" width="25%" height="5%" layer="1">
+ <fill color="{clrTransBlack}"/>
+ </area>
+ <area x="75%" y="40%" width="25%" height="5%" layer="2">
+ <drawtext x="5" valign="center" font="{light}" fontsize="100%" color="{clrWhite}" text="System Load: {load}" />
+ </area>
+ </systemload>
+
+ <!-- Available Variables customtokens:
+ all custom tokens set by the svdrp command SCTK are available in this viewelement
+ For instance, use an appropriate script which runs periodically as cronjob and
+ sets these custom tokens with svdrpsend or dbus2vdr
+ -->
+ <customtokens>
+ </customtokens>
+
+ <menuitems x="0" y="7%" orientation="vertical" width="70%" height="56%" align="center" numlistelements="8">
+ <!-- Available Variables main menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ <area x="0" width="60%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="0" width="60%" layer="3">
+ <drawtext name="menutext" x="20" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{number} {label}" />
+ </areascroll>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables main menu currentelement:
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ -->
+ <currentelement delay="50" fadetime="0">
+ <area x="61%" y="22%" width="36%" height="52%" layer="2">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ <area x="61%" y="23%" width="36%" height="50%" layer="3">
+ <drawimage imagetype="menuicon" path="{icon}" align="center" valign="center" width="{areaheight} - 10" height="{areaheight} - 10"/>
+ </area>
+ </currentelement>
+ </menuitems>
+
+ <scrollbar>
+ <area x="68%" y="7%" width="2%" height="56%" layer="2">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+</menumain>
diff --git a/skins/metrixhd/xmlfiles/displaymenurecordings.xml b/skins/metrixhd/xmlfiles/displaymenurecordings.xml
new file mode 100644
index 0000000..f0bf9aa
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenurecordings.xml
@@ -0,0 +1,101 @@
+<menurecordings x="0" y="0" width="100%" height="100%" fadetime="0">
+ <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="16">
+ <!-- Available Variables recordings menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {name} Name of recording
+ {date} Date of recording (day dd.mm.yyyy)
+ {time} Time of recording
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+ {current} true if item is currently selected
+ {new} true if recording is new
+ {cutted} true if recording is cutted
+ {folder} true if item is a folder
+ {numrecordingsfolder} if item is a folder, number of recordings in this folder
+ {newrecordingsfolder} if item is a folder, number of new recordings in this folder
+ {hasposterthumbnail} true if a scraped poster thumbnail is available for recording
+ {thumbnailbwidth} width of scraped poster thumbnail
+ {thumbnailheight} height of scraped poster thumbnail
+ {thumbnailpath} absolute path of scraped poster thumbnail
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="1%" width="58%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ <fill condition="{separator}" color="{clrSemiTransBlack}" />
+ </area>
+ <!-- recording folder -->
+ <area condition="{folder}" x="1%" width="58%" layer="2">
+ <drawimage name="foldericon" imagetype="icon" path="ico_recfolder" x="10" width="0.9*{areaheight} * 92 / 136" height="0.9*{areaheight}" valign="center" />
+ <drawtext x="{width(foldericon)} + 20" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{name} ({numrecordingsfolder}, {newrecordingsfolder} new)" />
+ </area>
+ <!-- recording item -->
+ <area condition="not{folder}" x="1%" width="58%" layer="2">
+ <drawtext x="10" valign="center" font="{light}" fontsize="85%" color="{clrWhite}" text="{printf('%02d.%02d.%d', daynumeric, month, year)} {time}" />
+ <drawtext x="35%" width="60%" valign="center" font="{light}" fontsize="85%" color="{clrWhite}" text="{name}" />
+ <drawimage condition="{new}" name="new" imagetype="icon" path="ico_recnew" x="{areawidth} - {areaheight}" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
+ <drawimage condition="{new}++{cutted}" imagetype="icon" path="ico_cutted" x="{areawidth} - 2*{areaheight}" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
+ <drawimage condition="not{new}++{cutted}" imagetype="icon" path="ico_cutted" x="{areawidth} - {areaheight}" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {name} Real Name of recording (Name of Recording Folder)
+ {epgname} Name of recording (Name from EPG)
+ {shorttext} Short Text of recording
+ {description} Descrption of recording
+ {date} Date of recording
+ {time} Time of recording
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+ {new} true if recording is new
+ {cutted} true if recording is cutted
+ {folder} true if item is a folder
+ {numrecordingsfolder} if item is a folder, number of recordings in this folder
+ {newrecordingsfolder} if item is a folder, number of new recordings in this folder
+ {hasposter} true if a scraped poster is available for recording
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ -->
+ <currentelement delay="500" fadetime="0">
+ <area x="63%" y="0" width="36%" height="100%" layer="2">
+ <!-- header -->
+ <drawtext name="title" x="1%" y="0" width="98%" font="{semibold}" fontsize="8%" color="{clrWhite}" text="{epgname}" />
+ <drawtext name="shorttext" x="1%" y="{height(title)}" width="98%" font="{semibold}" fontsize="6%" color="{clrWhite}" text="{shorttext}" />
+ <drawtext name="datetime" x="1%" y="{posy(shorttext)} + {height(shorttext)}" font="{light}" fontsize="5%" color="{clrWhite}" text="{date} {time}, {duration} min" />
+ <!-- scraper poster -->
+ <drawimage condition="{hasposter}" name="poster" imagetype="image" path="{posterpath}" x="1%" y="{posy(datetime)} + {height(datetime)} + 20" width="{areawidth}/3" height="{areawidth}/3 * {posterheight} / {posterwidth}"/>
+ <!-- description -->
+ <drawtextbox condition="{hasposter}" x="1%" y="{posy(poster)}" width="98%" height="{areaheight} - {posy(poster)}" float="topleft" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 10" font="{light}" fontsize="6%" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="not{hasposter}" x="1%" y="{posy(poster)}" width="98%" height="{areaheight} - {posy(poster)}" font="{light}" fontsize="6%" color="{clrWhite}" text="{description}" />
+ </area>
+ </currentelement>
+ </menuitems>
+ <!-- Available Variables colorbuttons:
+ {height} height in one-tenth of a percent of total height
+ {offset} offset from top in one-tenth of a percent of total height
+ -->
+ <scrollbar>
+ <area x="60%" y="10%" width="2%" height="82%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+</menurecordings>
\ No newline at end of file
diff --git a/skins/metrixhd/xmlfiles/displaymenuschedules.xml b/skins/metrixhd/xmlfiles/displaymenuschedules.xml
new file mode 100644
index 0000000..58300c6
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenuschedules.xml
@@ -0,0 +1,215 @@
+<menuschedules x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ {channelnumber} Number of Channel of current event
+ {channelname} Name of current Channel of current event
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {whatsonfavorites} true if EPGSearch Favorites menu is displayed
+ -->
+ <header>
+ <area x="0" y="0" width="38%" height="10%" layer="2">
+ <drawimage condition="{whatsonnow}||{whatsonnext}||{whatsonfavorites}" name="menuicon" imagetype="menuicon" path="{icon}" x="5" valign="center" width="{areaheight}*8/10" height="80%"/>
+ <drawtext condition="{whatsonnow}||{whatsonnext}||{whatsonfavorites}" x="{width(menuicon)} + 15" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ <drawimage name="logo" condition="{whatson}" imagetype="channellogo" path="{channelid}" x="0" width="15%" height="100%" align="left" valign="center" />
+ <drawtext condition="{whatson}" x="{width(logo)}+20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{channelnumber} - {channelname}" />
+ </area>
+ </header>
+
+ <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="16">
+ <!-- Available Variables schedules menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {title} title of event
+ {shorttext} shorttext of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event as three letter abrivation
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ {channelname} Channel Name
+ {channelnumber} Channel Number
+ {channelid} ChannelID as path to display channel logo
+ {channellogoexists} true if a channel logo exists
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {whatsonfavorites} true if EPGSearch Favorites menu is displayed
+ {timerpartitial} true if partitial timer is set for the event
+ {timerfull} true if full timer is set for the event
+ {hasVPS} true if event has VPS information
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="1%" width="58%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ <fill condition="{separator}" color="{clrSemiTransBlack}" />
+ </area>
+ <!-- WHATSON -->
+ <areascroll condition="not{separator}++{whatson}++not{running}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="58%" layer="3">
+ <drawtext name="menutext" x="20" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{start} {title}" />
+ </areascroll>
+ <areascroll condition="not{separator}++{whatson}++{running}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="48%" layer="3">
+ <drawtext name="menutext" x="20" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{start} {title}" />
+ </areascroll>
+ <area condition="not{separator}++{whatson}" x="1%" width="58%" layer="3">
+ <drawimage condition="{timerfull}" imagetype="icon" path="ico_activetimer" x="{areawidth} - 0.9*{areaheight} - 10" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
+ <drawimage condition="{timerpartitial}" imagetype="icon" path="ico_activetimer" x="{areawidth} - 0.5*{areaheight} - 10" width="0.5*{areaheight}" height="0.5*{areaheight}" valign="center" />
+ <drawrectangle condition="{running}" x="{areawidth}*0.85 - 10" y="{areaheight}/3" width="{areawidth}*0.15" height="{areaheight}/3" color="{clrWhite}" />
+ <drawrectangle condition="{running}" x="{areawidth}*0.85 - 8" y="{areaheight}/3 + 2" width="{areawidth}*0.15 - 4" height="{areaheight}/3 - 4" color="{clrTransparent}" />
+ <drawrectangle condition="{running}" x="{areawidth}*0.85 - 6" y="{areaheight}/3 + 4" width="{areawidth}*0.15 * {elapsed} / {duration} - 8" height="{areaheight}/3 - 8" color="{clrWhite}" />
+ </area>
+ <!-- WHATSONNOW -->
+ <area condition="not{separator}++{whatsonnow}" x="1%" width="6%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="100%" height="100%" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonnow}++{running}" x="8%" width="7%" layer="3">
+ <drawrectangle condition="{current}" x="0" y="{areaheight}/3" width="{areawidth}" height="{areaheight}/3" color="{clrWhite}" />
+ <drawrectangle condition="not{current}" x="0" y="{areaheight}/3" width="{areawidth}" height="{areaheight}/3" color="{clrTransBlueLight}" />
+ <drawrectangle x="2" y="{areaheight}/3 + 2" width="{areawidth} - 4" height="{areaheight}/3 - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="{areaheight}/3 + 4" width="{areawidth} * {elapsed} / {duration} - 8" height="{areaheight}/3 - 8" color="{clrWhite}" />
+ </area>
+ <area condition="not{separator}++{whatsonnow}++{timerfull}" x="53%" width="6%" layer="4">
+ <drawimage imagetype="icon" path="ico_activetimer" x="{areawidth} - 0.9*{areaheight} - 10" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonnow}++{timerpartitial}" x="53%" width="6%" layer="5">
+ <drawimage imagetype="icon" path="ico_activetimer" x="{areawidth} - 0.5*{areaheight} - 10" width="0.5*{areaheight}" height="0.5*{areaheight}" valign="center" />
+ </area>
+ <areascroll condition="not{separator}++{whatsonnow}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="15%" width="44%" layer="4">
+ <drawtext name="menutext" x="10" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{start} {title}" />
+ </areascroll>
+ <!-- WHATSONNEXT -->
+ <area condition="not{separator}++{whatsonnext}" x="1%" width="6%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="100%" height="100%" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonnext}++{timerfull}" x="53%" width="6%" layer="4">
+ <drawimage imagetype="icon" path="ico_activetimer" x="{areawidth} - 0.9*{areaheight} - 10" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonnext}++{timerpartitial}" x="53%" width="6%" layer="5">
+ <drawimage imagetype="icon" path="ico_activetimer" x="{areawidth} - 0.5*{areaheight} - 10" width="0.5*{areaheight}" height="0.5*{areaheight}" valign="center" />
+ </area>
+ <areascroll condition="not{separator}++{whatsonnext}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="7%" width="52%" layer="4">
+ <drawtext name="menutext" x="10" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{start} {title}" />
+ </areascroll>
+ <!-- WHATSONFAVORITES -->
+ <area condition="not{separator}++{whatsonfavorites}" x="1%" width="6%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="100%" height="100%" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonfavorites}++{timerfull}" x="53%" width="6%" layer="4">
+ <drawimage imagetype="icon" path="ico_activetimer" x="{areawidth} - 0.9*{areaheight} - 10" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonfavorites}++{timerpartitial}" x="53%" width="6%" layer="5">
+ <drawimage imagetype="icon" path="ico_activetimer" x="{areawidth} - 0.5*{areaheight} - 10" width="0.5*{areaheight}" height="0.5*{areaheight}" valign="center" />
+ </area>
+ <areascroll condition="not{separator}++{whatsonfavorites}" scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="7%" width="52%" layer="4">
+ <drawtext name="menutext" x="10" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{start} {title}" />
+ </areascroll>
+ <!-- Separator -->
+ <area condition="{separator}" x="0" width="68%" layer="3">
+ <drawtext x="20" valign="center" font="{light}" fontsize="95%" color="{clrBlueLight}" text="{title}" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables schedules menu currentelement:
+ {title} title of event
+ {shorttext} shorttext of event
+ {description} detailed description of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {channelname} Channel Name
+ {channelnumber} Channel Number
+ {channelid} ChannelID as path to display channel logo
+ {channellogoexists} true if a channel logo exists
+ {hasposter} true if a scraped poster is available for this element
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {timerpartitial} true if partitial timer is set for the event
+ {timerfull} true if full timer is set for the event
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {schedule[]} array with next 10 schedules, only for whatsonnow and whatsonnext
+ {schedule[title]} title of event
+ {schedule[shorttext]} shorttext of event
+ {schedule[start]} start time of event in hh:mm
+ {schedule[stop]} stop time of event in hh:mm
+ -->
+ <currentelement delay="500" fadetime="0">
+ <area condition="{whatson}" x="63%" y="0" width="36%" height="100%" layer="2">
+ <!-- title -->
+ <drawtext align="center" y="0" font="{semibold}" width="{areawidth}-20" fontsize="8%" color="{clrWhite}" text="{title}" />
+ <!-- progress bar if event is running -->
+ <drawtext condition="{running}" name="start" x="{areawidth}/4 - {width(start)}" y="{areaheight}/16 + 20" font="{light}" fontsize="{areaheight}/18" color="{clrWhite}" text="{start}" />
+ <drawtext condition="{running}" name="stop" x="{areawidth}*3/4" y="{areaheight}/16 + 20" font="{light}" fontsize="{areaheight}/18" color="{clrWhite}" text="{stop}" />
+ <drawrectangle condition="{running}" x="{areawidth}/4+10" y="{areaheight}/16 + 20 + {areaheight}/36" width="{areawidth}/2 - 20" height="1" color="{clrWhite}" />
+ <drawrectangle condition="{running}" x="{areawidth}/4+10" y="{areaheight}/16 + 20 + {areaheight}/36 -2" width="{areawidth}/2 * {elapsed} / {duration} - 20 * {elapsed} / {duration}" height="5" color="{clrWhite}" />
+ <!-- start and stop if event is not running -->
+ <drawtext condition="not{running}" x="10" y="{areaheight}/18 + 20" font="{light}" fontsize="{areaheight}/20" color="{clrWhite}" text="{start} - {stop} ({duration} min)" />
+ <!-- scraper poster -->
+ <drawimage condition="{hasposter}" name="poster" imagetype="image" path="{posterpath}" x="10" y="{posy(start)} + {height(start)} + 20" width="{areawidth}/3" height="{areawidth}/3 * {posterheight} / {posterwidth}"/>
+ <!-- description -->
+ <drawtextbox condition="{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" float="topleft" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 20" font="{light}" fontsize="{areaheight}/20" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="not{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" font="{light}" fontsize="{areaheight}/20" color="{clrWhite}" text="{description}" />
+ </area>
+ <area condition="{whatsonnow}||{whatsonnext}" x="63%" y="0" width="36%" height="85%" layer="2">
+ <!-- title -->
+ <drawtext align="center" y="0" font="{semibold}" width="{areawidth}-20" fontsize="10%" color="{clrWhite}" text="{title}" />
+ <!-- progress bar if event is running -->
+ <drawtext condition="{running}" name="start" x="{areawidth}/4 - {width(start)}" y="{areaheight}/16 + 15" font="{light}" fontsize="{areaheight}/15" color="{clrWhite}" text="{start}" />
+ <drawtext condition="{running}" name="stop" x="{areawidth}*3/4" y="{areaheight}/16 + 15" font="{light}" fontsize="{areaheight}/15" color="{clrWhite}" text="{stop}" />
+ <drawrectangle condition="{running}" x="{areawidth}/4+10" y="{areaheight}/16 + 15 + {areaheight}/30" width="{areawidth}/2 - 20" height="1" color="{clrWhite}" />
+ <drawrectangle condition="{running}" x="{areawidth}/4+10" y="{areaheight}/16 + 15 + {areaheight}/30 -2" width="{areawidth}/2 * {elapsed} / {duration} - 20 * {elapsed} / {duration}" height="5" color="{clrWhite}" />
+ <!-- start and stop if event is not running -->
+ <drawtext condition="not{running}" x="10" y="{areaheight}/18 + 15" font="{light}" fontsize="{areaheight}/20" color="{clrWhite}" text="{start} - {stop} ({duration} min)" />
+ <!-- scraper poster -->
+ <drawimage condition="{hasposter}" name="poster" imagetype="image" path="{posterpath}" x="10" y="{posy(start)} + {height(start)} + 10" width="{areawidth}/3" height="{areawidth}/3 * {posterheight} / {posterwidth}"/>
+ <!-- description -->
+ <drawtextbox condition="{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" float="topleft" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 10" font="{light}" fontsize="{areaheight}/18" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="not{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" font="{light}" fontsize="{areaheight}/18" color="{clrWhite}" text="{description}" />
+ </area>
+ <areascroll condition="{whatsonnow}||{whatsonnext}" mode="forthandback" orientation="vertical" delay="1000" scrollspeed="medium" x="63%" y="85%" width="36%" height="15%" layer="2">
+ <drawtext x="10" y="0" font="{semibold}" fontsize="30%" color="{clrWhite}" text="Next Schedules:" />
+ <loop name="schedule" x="0" y="{areaheight}/4 + 5" orientation="vertical">
+ <drawtext x="10" font="{light}" width="{areawidth}-20" fontsize="30%" color="{clrWhite}" text="{schedule[start]} {schedule[title]}" />
+ </loop>
+ </areascroll>
+ </currentelement>
+ </menuitems>
+ <!-- Available Variables scrollbar:
+ {height} height in one-tenth of a percent of total height
+ {offset} offset from top in one-tenth of a percent of total height
+ -->
+ <scrollbar>
+ <area x="60%" y="10%" width="2%" height="82%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+</menuschedules>
\ No newline at end of file
diff --git a/skins/metrixhd/xmlfiles/displaymenusetup.xml b/skins/metrixhd/xmlfiles/displaymenusetup.xml
new file mode 100644
index 0000000..d2fc400
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenusetup.xml
@@ -0,0 +1,110 @@
+<menusetup x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!--
+ static content of main menu, is only drawn once at main menu startup
+ -->
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area x="84%" y="0" width="16%" height="7%" layer="2">
+ <drawrectangle x="0" y="0" width="52%" height="100%" color="{clrTransBlueLight}" />
+ </area>
+ </background>
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {icon} icon path
+ -->
+ <header>
+ <area x="0" y="0" width="70%" height="7%" layer="2">
+ <drawimage name="menuicon" imagetype="menuicon" path="{icon}" x="5" valign="center" width="{areaheight}*8/10" height="80%"/>
+ <drawtext x="{areaheight}" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ </area>
+ </header>
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="84%" y="0" width="8%" height="7%" layer="3">
+ <drawtext align="right" y="0%" font="{light}" fontsize="55%" color="{clrWhite}" text="{dayname}" />
+ <drawtext align="right" y="45%" font="{light}" fontsize="55%" color="{clrWhite}" text="{day}. {monthname}" />
+ </area>
+ <area x="92%" y="0" width="8%" height="7%" layer="3">
+ <drawtext align="center" valign="center" font="{light}" fontsize="100%" color="{clrWhite}" text="{time}" />
+ </area>
+ </datetime>
+
+ <!-- Available Variables colorbuttons:
+ {red} label of red button
+ {green} label of green button
+ {yellow} label of yellow button
+ {blue} label of blue button
+ -->
+ <colorbuttons>
+ <area x="0" y="93%" width="25%" height="7%" layer="2">
+ <drawtext x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{red}" />
+ <drawrectangle x="0" y="0" width="10" height="100%" color="{clrRed}" />
+ </area>
+ <area x="25%" y="93%" width="25%" height="7%" layer="2">
+ <drawtext x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{green}" />
+ <drawrectangle x="0" y="0" width="10" height="100%" color="{clrGreen}" />
+ </area>
+ <area x="50%" y="93%" width="25%" height="7%" layer="2">
+ <drawtext x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{yellow}" />
+ <drawrectangle x="0" y="0" width="10" height="100%" color="{clrYellow}" />
+ </area>
+ <area x="75%" y="93%" width="25%" height="7%" layer="2">
+ <drawtext x="20" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{blue}" />
+ <drawrectangle x="0" y="0" width="10" height="100%" color="{clrBlue}" />
+ </area>
+ </colorbuttons>
+
+ <menuitems x="0" y="7%" orientation="vertical" width="98%" height="86%" align="center" numlistelements="10">
+ <!-- Available Variables setup menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ <area x="0" width="60%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="0" width="60%" layer="3">
+ <drawtext name="menutext" x="20" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{number} {label}" />
+ </areascroll>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables main menu currentelement:
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ -->
+ <currentelement delay="50" fadetime="0">
+ <area x="61%" y="30%" width="37%" height="36%" layer="2">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ <area x="61%" y="30%" width="37%" height="36%" layer="3">
+ <drawimage imagetype="menuicon" path="{icon}" align="center" valign="center" width="{areaheight} - 10" height="{areaheight} - 10"/>
+ </area>
+ </currentelement>
+ </menuitems>
+
+ <scrollbar>
+ <area x="98%" y="7%" width="2%" height="86%" layer="2">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+</menusetup>
diff --git a/skins/metrixhd/xmlfiles/displaymenutimers.xml b/skins/metrixhd/xmlfiles/displaymenutimers.xml
new file mode 100644
index 0000000..607de90
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymenutimers.xml
@@ -0,0 +1,97 @@
+<menutimers x="0" y="0" width="100%" height="100%" fadetime="0">
+ <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="16">
+ <!-- Available Variables channels menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {title} Title of Timer
+ {timerstart} Start Time of Timer in hh::mm
+ {timerstop} End Time of Timer in hh::mm
+ {day} Day (numerical)
+ {dayname} Day, for repeating timers days where timer is active
+ {month} Month (two digits)
+ {monthname} Month, three letter abbrevation
+ {year} Year (4 digits)
+ {channelname} Name of channel which is set for the timer
+ {channelid} ID of channel which is set for the timer (for dispalying channel logo)
+ {channelnumber} Number of channel which is set for the timer
+ {eventtitle} Title of corresponding event
+ {eventstart} Start Time of corresponding event in hh::mm
+ {eventstop} Stop Time of corresponding event in hh::mm
+ {current} true if item is currently selected
+ {flagactive} true if timer is active
+ {flaginstant} true if timer is an instant timer
+ {flagvps} true if timer uses VPS
+ {flagrecording} true if is recording currently
+ {flagpending} true if timer is pending
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="1%" width="58%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ </area>
+ <area x="1%" width="58%" layer="2">
+ <drawimage condition="{flagactive}" name="active" imagetype="icon" path="ico_timer_active" x="0" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
+ <drawimage condition="not{flagactive}" name="active" imagetype="icon" path="ico_timer_inactive" x="0" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
+ <drawimage condition="{flagrecording}" name="active" imagetype="icon" path="ico_timer_recording" x="0" width="0.9*{areaheight}" height="0.9*{areaheight}" valign="center" />
+ </area>
+ <areascroll scrollelement="timertext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="5%" width="54%" layer="3">
+ <drawtext name="timertext" x="10" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{dayname} {day}. {timerstart} - {timerstop}: {title}" />
+ </areascroll>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {title} Title of Timer
+ {timerstart} Start Time of Timer in hh::mm
+ {timerstop} End Time of Timer in hh::mm
+ {day} Day (numerical)
+ {dayname} Day, for repeating timers days where timer is active
+ {month} Month (two digits)
+ {monthname} Month, three letter abbrevation
+ {year} Year (4 digits)
+ {channelname} Name of channel which is set for the timer
+ {channelid} ID of channel which is set for the timer (for dispalying channel logo)
+ {channelnumber} Number of channel which is set for the timer
+ {eventtitle} Title of corresponding event
+ {eventstart} Start Time of corresponding event in hh::mm
+ {eventstop} Stop Time of corresponding event in hh::mm
+ {eventshorttext} Short Text corresponding event
+ {eventdescription} Description corresponding event
+ {hasposter} true if a scraped poster is available for event
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {flagactive} true if timer is active
+ {flaginstant} true if timer is an instant timer
+ {flagvps} true if timer uses VPS
+ {flagrecording} true if is recording currently
+ {flagpending} true if timer is pending
+ -->
+ <currentelement delay="500" fadetime="0">
+ <area x="63%" y="0" width="36%" height="15%" layer="2">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="10" y="0" width="30%" height="100%" />
+ <drawtext name="channum" x="{width(logo)} + 20" y="{areaheight}/6" width="{areawidth} - {width(logo)} - 30" font="{light}" fontsize="40%" color="{clrWhite}" text="Channel No. {channelnumber}" />
+ <drawtext name="channame" x="{width(logo)} + 20" y="{areaheight}/3 + {areaheight}/6" width="{areawidth} - {width(logo)} - 30" font="{semibold}" fontsize="40%" color="{clrWhite}" text="{channelname}" />
+ </area>
+ <area x="63%" y="15%" width="36%" height="70%" layer="2">
+ <!-- title -->
+ <drawtext name="title" align="center" y="0" font="{semibold}" width="{areawidth}-20" fontsize="{areaheight}/10" color="{clrWhite}" text="{eventtitle}" />
+ <!-- scraper poster -->
+ <drawimage condition="{hasposter}" name="poster" imagetype="image" path="{posterpath}" x="10" y="{posy(title)} + {height(title)} + 10" width="{areawidth}/3" height="{areawidth}/3 * {posterheight} / {posterwidth}"/>
+ <!-- description -->
+ <drawtextbox condition="{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" float="topleft" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 20" font="{light}" fontsize="{areaheight}/14" color="{clrWhite}" text="{eventdescription}" />
+ <drawtextbox condition="not{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" font="{light}" fontsize="{areaheight}/14" color="{clrWhite}" text="{eventdescription}" />
+ </area>
+ </currentelement>
+ </menuitems>
+ <!-- Available Variables colorbuttons:
+ {height} height in one-tenth of a percent of total height
+ {offset} offset from top in one-tenth of a percent of total height
+ -->
+ <scrollbar>
+ <area x="60%" y="10%" width="2%" height="82%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+</menutimers>
\ No newline at end of file
diff --git a/skins/metrixhd/xmlfiles/displaymessage.xml b/skins/metrixhd/xmlfiles/displaymessage.xml
new file mode 100644
index 0000000..0ff98b2
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displaymessage.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaymessage SYSTEM "../../../dtd/displaymessage.dtd">
+
+<displaymessage x="5%" y="80%" width="90%" height="15%" fadetime="{fadetime}">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </background>
+
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ <area x="0" y="0" width="100%" height="100%" layer="2">
+ <drawrectangle condition="{status}" x="20" y="0" width="20" height="100%" color="{clrGreen}" />
+ <drawrectangle condition="{info}" x="20" y="0" width="20" height="100%" color="{clrBlue}" />
+ <drawrectangle condition="{warning}" x="20" y="0" width="20" height="100%" color="{clrYellow}" />
+ <drawrectangle condition="{error}" x="20" y="0" width="20" height="100%" color="{clrRed}" />
+ <drawtext align="center" valign="center" width="{areawidth} - 80" font="{light}" fontsize="50%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+</displaymessage>
diff --git a/skins/metrixhd/xmlfiles/displayreplay.xml b/skins/metrixhd/xmlfiles/displayreplay.xml
new file mode 100644
index 0000000..8853fad
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displayreplay.xml
@@ -0,0 +1,372 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayreplay SYSTEM "../../../dtd/displayreplay.dtd">
+
+<displayreplay x="0" y="0" width="100%" height="100%" fadetime="{fadetime}">
+ <background>
+ <!-- background infobar -->
+ <area x="0" y="80%" width="100%" height="20%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <!-- background datetime -->
+ <area x="70%" y="0" width="30%" height="13%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle x="0" y="0" width="45%" height="100%" color="{clrTransBlueLight}" />
+ </area>
+ </background>
+
+ <backgroundmodeonly>
+ <!-- background small infobar -->
+ <area x="25%" y="85%" width="50%" height="10%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </backgroundmodeonly>
+
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {monthnameshort} 3 letter abbrivation of month name
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="70%" y="0" width="13%" height="13%" layer="2">
+ <drawtext align="right" y="0" font="{light}" fontsize="50%" color="{clrWhite}" text="{dayname}" />
+ <drawtext align="right" y="48%" font="{light}" fontsize="50%" color="{clrWhite}" text="{day}. {monthnameshort}" />
+ </area>
+ <area x="85%" y="0" width="13%" height="13%" layer="2">
+ <drawtext align="center" valign="center" font="{light}" fontsize="100%" color="{clrWhite}" text="{time}" />
+ </area>
+ </datetime>
+
+ <!-- Available Variables scrapercontent:
+ {posterpath} Full Path of Poster to use in image path attribute
+ {posterwidth} width of poster in pixel
+ {posterheight} height of poster in pixel
+ {hasPoster} true if poster is available
+ {bannerpath} Full Path of banner to use in image path attribute
+ {bannerwidth} width of banner in pixel
+ {bannerheight} height of banner in pixel
+ {hasBanner} true if banner is available
+
+ Use this tokens if you want to display a banner for series and a poster for movies:
+ {mediapath} Full Path of Poster or Banner to use in image path attribute
+ {mediawidth} width of image in pixel
+ {mediaheight} height of image in pixel
+ {isbanner} true if image is a banner, false if it is a poster
+ -->
+ <scrapercontent>
+ <area condition="{isbanner}" x="0" y="0" width="{areaheight}*0.13*{mediawidth}/{mediaheight}" height="13%" layer="2">
+ <drawimage imagetype="image" path="{mediapath}" align="center" valign="center" width="{areawidth}" height="{areaheight}"/>
+ </area>
+ <area condition="not{isbanner}" x="0" y="0" width="{areaheight}*0.5*{mediawidth}/{mediaheight}" height="50%" layer="2">
+ <drawimage imagetype="image" path="{mediapath}" x="5" y="5" width="{areawidth}-10" height="{areaheight}-10"/>
+ </area>
+ </scrapercontent>
+
+ <!-- Available Variables rectitle:
+ {rectitle} Title of Recording
+ {recsubtitle} Subtitle of the Recording
+ {recdate} Date Recording in dd.mm.yy
+ {rectime} Time of Recording in hh:mm
+ -->
+ <rectitle>
+ <area x="1%" y="80%" width="69%" height="8%" layer="2">
+ <drawtext x="0" name="title" valign="center" width="{areawidth}" font="{semibold}" fontsize="85%" color="{clrBlueLight}" text="{rectitle}" />
+ <drawtext x="{width(title)}+10" valign="center" width="{areawidth}-{width(title)}-10" font="{light}" fontsize="85%" color="{clrWhite}" text="{recsubtitle}" />
+ </area>
+ </rectitle>
+
+ <!-- Available Variables recinfo:
+ {screenwidth} width of currently displayed recording in px
+ {screenheight} height of currently displayed recording in px
+ {resolution} resolution: hd1080i, hd720p, sd576i
+ {aspect} screen aspect, each 4:3, 16:9 or 21:9
+ {isHD} true for hd1080i and hd720p
+ {isWideScreen} true if aspect is 16:9 or 21:9
+ -->
+ <recinfo>
+ <area x="70%" y="80%" width="29%" height="8%" layer="2">
+ <!-- widescreen icon -->
+ <drawimage name="widescreen" condition="{isWideScreen}" imagetype="icon" path="ico_widescreen_on" x="{areawidth} - {width(widescreen)}" valign="center" width="{areaheight}*0.8*1.87" height="{areaheight}*0.8"/>
+ <drawimage condition="not{isWideScreen}" imagetype="icon" path="ico_widescreen_off" x="{areawidth} - {width(widescreen)}" valign="center" width="{areaheight}*0.8*1.87" height="{areaheight}*0.8"/>
+ <!-- hd/sd icon -->
+ <drawimage name="hd" condition="{isHD}" imagetype="icon" path="ico_hd_on" x="{posx(widescreen)} - 15 - {width(hd)}" valign="center" width="{areaheight}*0.8*2.04" height="{areaheight}*0.8"/>
+ <drawimage condition="not{isHD}" imagetype="icon" path="ico_hd_off" x="{posx(widescreen)} - 15 - {width(hd)}" valign="center" width="{areaheight}*0.8*2.04" height="{areaheight}*0.8"/>
+ <!-- screenresolution text -->
+ <drawtext name="reslabel" x="{posx(hd)} - 30 - {width(reslabel)}" valign="center" font="{light}" fontsize="60%" color="{clrWhite}" text="{screenwidth}x{screenheight}" />
+ </area>
+ </recinfo>
+
+ <!-- Available Variables currenttime:
+ {reccurrent} Current Time in hh:mm:ss
+ -->
+ <currenttime>
+ <area x="1%" y="92%" width="30%" height="7%" layer="2">
+ <drawtext x="0" valign="center" font="{light}" fontsize="100%" color="{clrTransBlueLight}" text="{reccurrent}" />
+ </area>
+ </currenttime>
+
+ <!-- Available Variables totaltime:
+ {rectotal} Total Time in hh:mm:ss
+ -->
+ <totaltime>
+ <area x="69%" y="92%" width="30%" height="7%" layer="2">
+ <drawtext align="right" valign="center" font="{light}" fontsize="100%" color="{clrWhite}" text="{rectotal}" />
+ </area>
+ </totaltime>
+
+ <!-- Available Variables progressbar:
+ {current} current frame of recording
+ {total} total frames of recording
+ -->
+ <progressbar>
+ <area x="5%" y="89%" width="90%" height="3%" layer="2">
+ <fill color="{clrDarkGray}" />
+ <drawrectangle x="0" y="0" width="{current}/{total}*{areawidth}" height="100%" color="{clrTransBlueLight}" />
+ </area>
+ </progressbar>
+
+ <!-- Available Variables cutmarks:
+ {marks[]} array of available marks
+ {marks[position]} frame of current mark
+ {marks[endposition]} frame where startmark ends
+ {marks[total]} total number of frames
+ {marks[active]} true if current replay position hits exactly the mark
+ {marks[startmark]} true if mark is start mark
+ -->
+ <cutmarks>
+ <area x="5%" y="89%" width="90%" height="3%" layer="3">
+ <loop name="marks" x="0" y="0" orientation="absolute">
+ <!-- draw mark -->
+ <drawrectangle condition="not{marks[active]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="0" width="1" height="100%" color="{clrWhite}" />
+ <drawrectangle condition="not{marks[active]} ++ {marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="0" width="5" height="1" color="{clrWhite}" />
+ <drawrectangle condition="not{marks[active]} ++ {marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="{areaheight}-1" width="5" height="1" color="{clrWhite}" />
+ <drawrectangle condition="not{marks[active]} ++ not{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth} - 5" y="0" width="5" height="1" color="{clrWhite}" />
+ <drawrectangle condition="not{marks[active]} ++ not{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth} - 5" y="{areaheight}-1" width="5" height="1" color="{clrWhite}" />
+ <!-- draw active mark -->
+ <drawrectangle condition="{marks[active]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="0" width="1" height="100%" color="{clrRed}" />
+ <drawrectangle condition="{marks[active]} ++ {marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="0" width="5" height="1" color="{clrRed}" />
+ <drawrectangle condition="{marks[active]} ++ {marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="{areaheight}-1" width="5" height="1" color="{clrRed}" />
+ <drawrectangle condition="{marks[active]} ++ not{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth} - 5" y="0" width="5" height="1" color="{clrRed}" />
+ <drawrectangle condition="{marks[active]} ++ not{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth} - 5" y="{areaheight}-1" width="5" height="1" color="{clrRed}" />
+ <!-- draw bar to next mark if mark is startmark-->
+ <drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="30%" width="{marks[endposition]}/{marks[total]}*{areawidth} - {marks[position]}/{marks[total]}*{areawidth}" height="40%" color="{clrWhite}" />
+ </loop>
+ </area>
+ </cutmarks>
+
+ <!-- Available Variables controlicons and controliconsmodeonly:
+ {play} true if recording is played currently
+ {pause} true if recording is paused
+ {forward} true if fast forwarding
+ {forward1x} true if fast forwarding 1x (with 3 trickspeeds)
+ {forward2x} true if fast forwarding 2x (with 3 trickspeeds)
+ {forward3x} true if fast forwarding 3x (with 3 trickspeeds)
+ {rewind} true if rewinding
+ {rewind1x} true if rewinding 1x (with 3 trickspeeds)
+ {rewind2x} true if rewinding 2x (with 3 trickspeeds)
+ {rewind3x} true if rewinding 3x (with 3 trickspeeds)
+ -->
+ <controlicons>
+ <area x="30%" y="93%" width="40%" height="7%" layer="3">
+ <drawimage condition="not{rewind} ++ not{rewind1x} ++ not{rewind2x} ++ not{rewind3x}" imagetype="icon" path="ico_rew_off" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind}" imagetype="icon" path="ico_rew" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind1x}" imagetype="icon" path="ico_rew_1x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind2x}" imagetype="icon" path="ico_rew_2x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind3x}" imagetype="icon" path="ico_rew_3x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{pause}" imagetype="icon" path="ico_pause_off" x="{areawidth}/2 - {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{pause}" imagetype="icon" path="ico_pause" x="{areawidth}/2 - {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{play}" imagetype="icon" path="ico_play_off" x="{areawidth}/2" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{play}" imagetype="icon" path="ico_play" x="{areawidth}/2" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{forward} ++ not{forward1x} ++ not{forward2x} ++ not{forward3x}" imagetype="icon" path="ico_ff_off" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward}" imagetype="icon" path="ico_ff" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward1x}" imagetype="icon" path="ico_ff_1x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward2x}" imagetype="icon" path="ico_ff_2x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward3x}" imagetype="icon" path="ico_ff_3x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ </area>
+ </controlicons>
+
+ <controliconsmodeonly>
+ <area x="25%" y="85%" width="50%" height="10%" layer="3">
+ <drawimage condition="not{rewind} ++ not{rewind1x} ++ not{rewind2x} ++ not{rewind3x}" imagetype="icon" path="ico_rew_off" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind}" imagetype="icon" path="ico_rew" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind1x}" imagetype="icon" path="ico_rew_1x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind2x}" imagetype="icon" path="ico_rew_2x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind3x}" imagetype="icon" path="ico_rew_3x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{pause}" imagetype="icon" path="ico_pause_off" x="{areawidth}/2 - {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{pause}" imagetype="icon" path="ico_pause" x="{areawidth}/2 - {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{play}" imagetype="icon" path="ico_play_off" x="{areawidth}/2" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{play}" imagetype="icon" path="ico_play" x="{areawidth}/2" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{forward} ++ not{forward1x} ++ not{forward2x} ++ not{forward3x}" imagetype="icon" path="ico_ff_off" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward}" imagetype="icon" path="ico_ff" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward1x}" imagetype="icon" path="ico_ff_1x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward2x}" imagetype="icon" path="ico_ff_2x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward3x}" imagetype="icon" path="ico_ff_3x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ </area>
+ </controliconsmodeonly>
+
+ <!-- Available Variables jump:
+ {jump} time to jump to in hh:mm
+ -->
+ <jump>
+ <area x="35%" y="45%" width="30%" height="10%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area x="35%" y="45%" width="30%" height="10%" layer="2">
+ <drawtext align="center" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{jump}" />
+ </area>
+ </jump>
+
+ <!-- Available Variables onpause and onpausemodeonly:
+ {name} title of recording
+ {shorttext} shorttext of recording
+ {description} description of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of recording in hh:mm
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+ <onpause delay="60" fadetime="{fadeTime}">
+ <area x="0" y="0" width="100%" height="100%" layer="7">
+ <fill color="{clrSemiTransBlack}" />
+ </area>
+ </onpause>
+
+ <onpausemodeonly delay="20" fadetime="{fadeTime}">
+ <area x="0" y="0" width="100%" height="100%" layer="7">
+ <fill color="{clrSemiTransBlack}" />
+ </area>
+ <area x="0" y="0" width="100%" height="100%" layer="6">
+ <drawtext align="center" valign="center" font="{semibold}" fontsize="25%" color="{clrWhite}" text="{tr(pause)}" />
+ <drawimage condition="{isseries}" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage condition="{ismovie}" imagetype="image" path="{posterpath}" x="10" y="10" width="{areaheight} * 0.4 * {posterwidth} / {posterheight}" height="{areaheight} * 0.4"/>
+ </area>
+ </onpausemodeonly>
+
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ <area x="10%" y="45%" width="80%" height="10%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle condition="{status}" x="20" y="0" width="20" height="100%" color="{clrGreen}" />
+ <drawrectangle condition="{info}" x="20" y="0" width="20" height="100%" color="{clrBlue}" />
+ <drawrectangle condition="{warning}" x="20" y="0" width="20" height="100%" color="{clrYellow}" />
+ <drawrectangle condition="{error}" x="20" y="0" width="20" height="100%" color="{clrRed}" />
+ <drawtext align="center" valign="center" width="{areawidth} - 80" font="{light}" fontsize="40%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+</displayreplay>
diff --git a/skins/metrixhd/xmlfiles/displayvolume.xml b/skins/metrixhd/xmlfiles/displayvolume.xml
new file mode 100644
index 0000000..604f7e5
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/displayvolume.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayvolume SYSTEM "../../../dtd/displayvolume.dtd">
+
+<displayvolume x="20%" y="75%" width="60%" height="20%" fadetime="{fadetime}">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </background>
+
+ <!-- Available Variables volume:
+ {volume} current volume, range from 0 to 255
+ {volpercent} current volume in %
+ {maxvolume} maximal volume
+ {mute} true if volume is muted
+ -->
+ <volume>
+ <area x="0" y="0" width="100%" height="50%" layer="2">
+ <drawtext x="10" valign="center" font="{light}" fontsize="100%" color="{clrWhite}" text="{tr(volume)}: {volpercent}%" />
+ <drawimage condition="not{mute}" imagetype="icon" path="ico_volume" x="{areawidth} - {areaheight} - 5" y="5" width="{areaheight}-5" height="{areaheight}-5"/>
+ <drawimage condition="{mute}" imagetype="icon" path="ico_mute" x="{areawidth} - {areaheight} - 5" y="5" width="{areaheight}-5" height="{areaheight}-5"/>
+ </area>
+ <area x="5%" y="60%" width="90%" height="30%" layer="2">
+ <fill color="{clrDarkGray}" />
+ <drawrectangle x="0" y="0" width="{volume}/{maxvolume}*{areawidth}" height="100%" color="{clrTransBlueLight}" />
+ </area>
+ </volume>
+
+</displayvolume>
diff --git a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecast.xml b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecast.xml
new file mode 100644
index 0000000..e4f4960
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecast.xml
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <!-- background left Menu -->
+ <area x="0" y="0" width="50%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <!-- background right detail view -->
+ <area x="50%" y="3%" width="50%" height="94%" layer="1">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ </background>
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ -->
+ <header>
+ <area x="0" y="0" width="50%" height="10%" layer="2">
+ <drawtext condition="not{hasicon}" x="5" width="{areawidth}-10" valign="center" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ <drawimage condition="{hasicon}" name="menuicon" imagetype="menuicon" path="{icon}" x="5" valign="center" width="{areaheight}*8/10" height="80%"/>
+ <drawtext condition="{hasicon}" x="{areaheight}" valign="center" width="{areawidth}-{areaheight}-10" font="{light}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ </area>
+ </header>
+
+ <datetime>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </datetime>
+
+ <colorbuttons>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </colorbuttons>
+
+ <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="10">
+ <!-- Available Variables:
+ {current}
+ {menuitemtext} "Current Weather", "Next 48 hours" or "Next 7 days"
+ {iscurrent} true if item is "Current Weather"
+ {ishourly} true if item is "Next 48 hours"
+ {isdaily} true if item is "Next 7 days"
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+
+ If {iscurrent} is true, the following tokens are set:
+ {timestamp} timestamp in hh:mm dd.mm of current forecast
+ {temperature} current temperature in °C
+ {apparenttemperature} apparent (felt) temperature in °C
+ {summary} short summary of current weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {precipitationintensity} precipitation intensity in l/qm
+ {precipitationprobability} precipitation probability in %
+ {precipitationtype} precipitation type (snow, ...)
+ {humidity} humidity in %
+ {windspeed} wind speed in km/h
+ {windbearing} wind bearing in degrees
+ {windbearingstring} wind bearing as human readable string (e.g NE, NNE, ...)
+ {visibility} visibility in km
+ {cloudcover} cloud cover in %
+ {pressure} pressure in HPa
+ {ozone} Ozone in DU (Dobson Unit)
+
+ If {ishourly} is true, the following tokens are set:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+
+ {hourly[]} array with up to 48 hourly forecasts
+ {hourly[num]} number of forecast, starting at 1
+ {hourly[timestamp]} timestamp in hh:mm
+ {hourly[temperature]} temperature in °C
+ {hourly[apparenttemperature]} apparent (felt) temperature in °C
+ {hourly[summary]} short summary
+ {hourly[icon]} path to use in <drawimage> to display appropriate weather icon
+ {hourly[precipitationintensity]} precipitation intensity in l/qm
+ {hourly[precipitationprobability]} precipitation probability in %
+ {hourly[precipitationtype]} precipitation type (snow, ...)
+ {hourly[humidity]} humidity in %
+ {hourly[windspeed]} wind speed in km/h
+ {hourly[windbearing]} wind bearing in degrees
+ {hourly[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {hourly[visibility]} visibility in km
+ {hourly[cloudcover]} cloud cover in %
+ {hourly[pressure]} pressure in HPa
+ {hourly[ozone]} Ozone in DU (Dobson Unit)
+
+ If {isdaily} is true, the following tokens are set:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+
+ {daily[day]} day of forecast in dd.mm
+ {daily[dayname]} three letter abbrivated day name
+ {daily[temperaturemin]} minimum temperature at this day in °C
+ {daily[temperaturemintime]} time of minimum temperature
+ {daily[temperaturemax]} maximum temperature at this day in °C
+ {daily[temperaturemaxtime]} time of maximum temperature
+ {daily[summary]} short summary
+ {daily[icon]} path to use in <drawimage> to display appropriate weather icon
+ {daily[precipitationintensity]} precipitation intensity in l/qm
+ {daily[precipitationprobability]} precipitation probability in %
+ {daily[precipitationtype]} precipitation type (snow, ...)
+ {daily[humidity]} humidity in %
+ {daily[windspeed]} wind speed in km/h
+ {daily[windbearing]} wind bearing in degrees
+ {daily[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {daily[visibility]} visibility in km
+ {daily[cloudcover]} cloud cover in %
+ {daily[pressure]} pressure in HPa
+ {daily[ozone]} Ozone in DU (Dobson Unit)
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="1%" width="46%" layer="2">
+ <fill condition="not{current}" color="{clrTransparent}" />
+ <fill condition="{current}" color="{clrTransBlueLight}" />
+ </area>
+ <area x="1%" width="46%" layer="3">
+ <drawtext x="10" valign="center" font="{light}" fontsize="95%" color="{clrWhite}" text="{menuitemtext}" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- All Tokens from listelement are available -->
+ <currentelement delay="100" fadetime="0">
+ <area condition="{iscurrent}" x="51%" y="0" width="48%" height="100%" layer="3">
+ <drawimage name="weathericon" imagetype="icon" path="{icon}" x="2%" y="0" width="{areawidth}*0.3" height="{areawidth}*0.3"/>
+ <drawtext align="right" y="0" font="{semibold}" fontsize="8%" color="{clrWhite}" text="{city}" />
+ <drawtext align="right" y="7%" font="{light}" fontsize="8%" color="{clrWhite}" text="{timestamp}" />
+ <drawtext align="right" y="13%" font="{light}" fontsize="18%" color="{clrWhite}" text="{temperature}°C" />
+ <drawtext align="right" y="28%" font="{light}" fontsize="8%" color="{clrWhite}" text="{summary}" />
+ <drawtext x="0" y="40%" font="{light}" fontsize="6%" color="{clrWhite}" text="{tr(apparenttemp)}: {apparenttemperature} °C" />
+ <drawtext x="0" y="46%" font="{light}" fontsize="6%" color="{clrWhite}" text="{tr(precipitationprobability)}: {precipitationprobability} %" />
+ <drawtext x="0" y="52%" font="{light}" fontsize="6%" color="{clrWhite}" text="{tr(precipitationintensity)}: {precipitationintensity} l/qm" />
+ <drawtext x="0" y="58%" font="{light}" fontsize="6%" color="{clrWhite}" text="{tr(humidity)}: {humidity} %" />
+ <drawtext x="0" y="64%" font="{light}" fontsize="6%" color="{clrWhite}" text="{tr(windspeed)}: {windspeed} km/h" />
+ <drawtext x="0" y="70%" font="{light}" fontsize="6%" color="{clrWhite}" text="{tr(windbearing)}: {windbearingstring} ({windbearing} °)" />
+ <drawtext x="0" y="76%" font="{light}" fontsize="6%" color="{clrWhite}" text="{tr(cloudcover)}: {cloudcover} %" />
+ </area>
+ <area condition="{ishourly}" x="51%" y="0" width="48%" height="100%" layer="3">
+ <loop name="hourly" x="0" y="0" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/12" overflow="cut">
+ <drawtext x="0" font="{semibold}" fontsize="7%" valign="center" color="{clrWhite}" text="{hourly[timestamp]}" />
+ <drawimage imagetype="icon" path="{hourly[icon]}" x="18%" valign="center" width="{rowheight}*0.8" height="{rowheight}*0.8"/>
+ <drawtext x="30%" font="{light}" fontsize="7%" valign="center" color="{clrWhite}" text="{hourly[temperature]}°C" />
+ <drawtext x="48%" font="{light}" fontsize="5%" valign="center" width="52%" color="{clrWhite}" text="{hourly[summary]}" />
+ <drawrectangle x="0" y="{rowheight} - 1" width="{columnwidth}" height="1" color="{clrWhite}" />
+ </loop>
+ </area>
+ <area condition="{isdaily}" x="51%" y="0" width="48%" height="100%" layer="3">
+ <loop name="daily" x="0" y="0" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/7" overflow="cut">
+ <drawtext x="0" font="{semibold}" fontsize="{rowheight}/2" y="5" color="{clrWhite}" text="{daily[dayname]} {daily[day]}" />
+ <drawtext x="35%" font="{light}" fontsize="{rowheight}/2" y="5" color="{clrWhite}" text="{daily[temperaturemin]}°C - {daily[temperaturemax]}°C" />
+ <drawtext x="0" font="{light}" fontsize="{rowheight}*0.3" width="{columnwidth} - {rowheight}*0.7" y="{rowheight}*0.6" color="{clrWhite}" text="{daily[summary]}" />
+ <drawimage imagetype="icon" path="{daily[icon]}" x="{columnwidth} - {rowheight}*0.7" valign="center" width="{rowheight}*0.7" height="{rowheight}*0.7"/>
+ <drawrectangle x="0" y="{rowheight} - 1" width="{columnwidth}" height="1" color="{clrWhite}" />
+ </loop>
+ </area>
+ </currentelement>
+ </menuitems>
+</menuplugin>
diff --git a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml
new file mode 100644
index 0000000..4932759
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </background>
+
+ <header>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </header>
+
+ <datetime>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </datetime>
+
+ <colorbuttons>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </colorbuttons>
+
+ <scrollbar>
+ <area x="98%" y="20%" width="2%" height="65%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+ <!-- Available Variables in detailheader and tab:
+ {menuheader} "Current Weather"
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+ {timestamp} timestamp in hh:mm dd.mm of current forecast
+ {temperature} current temperature in °C
+ {apparenttemperature} apparent (felt) temperature in °C
+ {temperaturemin} minimum temperature the day in °C
+ {temperaturemax} maximum temperature the day in °C
+ {summary} short summary of current weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {precipitationintensity} precipitation intensity in l/qm
+ {precipitationprobability} precipitation probability in %
+ {precipitationtype} precipitation type (snow, ...)
+ {humidity} humidity in %
+ {windspeed} wind speed in km/h
+ {windbearing} wind bearing in degrees
+ {windbearingstring} wind bearing as human readable string (e.g NE, NNE, ...)
+ {visibility} visibility in km
+ {cloudcover} cloud cover in %
+ {pressure} pressure in HPa
+ {ozone} Ozone in DU (Dobson Unit)
+ -->
+ <detailheader>
+ <area x="0" y="0" width="100%" height="20%" layer="2">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ <area x="0" y="0" width="100%" height="20%" layer="3">
+ <drawtext x="20" valign="center" font="{light}" fontsize="40%" color="{clrWhite}" text="{menuheader}" />
+ </area>
+ <area x="{areawidth} - {areaheight}*0.2" y="0" width="{areaheight}*0.2" height="20%" layer="4">
+ <drawimage imagetype="icon" path="{icon}" align="center" valign="center" width="90%" height="90%"/>
+ </area>
+ <area x="{areawidth} - {areaheight}*0.6" y="0" width="{areaheight}*0.35" height="20%" layer="4">
+ <drawtext align="right" valign="center" font="{light}" fontsize="90%" color="{clrWhite}" text="{temperature}°C" />
+ </area>
+ </detailheader>
+
+ <tab name="current" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext x="0" y="0" font="{semibold}" fontsize="10%" color="{clrWhite}" text="{tr(conditions)} {tr(for)} {city} ({latitude}, {longitude}):" />
+ <drawtext x="0" y="10%" font="{semibold}" fontsize="10%" color="{clrWhite}" text="{summary}" />
+ <drawtext x="0" y="25%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(temp)}: {temperature}°C" />
+ <drawtext x="0" y="35%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(apparenttemp)}: {apparenttemperature}°C" />
+ <drawtext x="0" y="45%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(todaymin)}: {mintemperature}°C, {tr(todaymax)}: {maxtemperature}°C" />
+ <drawtext x="0" y="55%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(precipitationprobability)}: {precipitationprobability} %" />
+ <drawtext x="0" y="65%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(precipitationintensity)}: {precipitationintensity} l/qm" />
+ <drawtext x="0" y="75%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(humidity)}: {humidity} %" />
+ <drawtext x="0" y="85%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(windspeed)}: {windspeed} km/h aus {windbearingstring}" />
+ <drawtext x="0" y="95%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(visibility)}: {visibility} km" />
+ <drawtext x="0" y="105%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(cloudcover)}: {cloudcover} %" />
+ <drawtext x="0" y="115%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(pressure)}: {pressure} HPa" />
+ <drawtext x="0" y="125%" font="{light}" fontsize="10%" color="{clrWhite}" text="{tr(ozone)}: {ozone} DU" />
+ </tab>
+</menuplugin>
diff --git a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml
new file mode 100644
index 0000000..10b588c
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </background>
+
+ <header>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </header>
+
+ <datetime>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </datetime>
+
+ <colorbuttons>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </colorbuttons>
+
+ <scrollbar>
+ <area x="98%" y="20%" width="2%" height="65%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+
+ <!-- Available Variables in detailheader and tab:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+
+ {daily[day]} day of forecast in dd.mm
+ {daily[dayname]} three letter abbrivated day name
+ {daily[temperaturemin]} minimum temperature at this day in °C
+ {daily[temperaturemintime]} time of minimum temperature
+ {daily[temperaturemax]} maximum temperature at this day in °C
+ {daily[temperaturemaxtime]} time of maximum temperature
+ {daily[summary]} short summary
+ {daily[icon]} path to use in <drawimage> to display appropriate weather icon
+ {daily[precipitationintensity]} precipitation intensity in l/qm
+ {daily[precipitationprobability]} precipitation probability in %
+ {daily[precipitationtype]} precipitation type (snow, ...)
+ {daily[humidity]} humidity in %
+ {daily[windspeed]} wind speed in km/h
+ {daily[windbearing]} wind bearing in degrees
+ {daily[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {daily[visibility]} visibility in km
+ {daily[cloudcover]} cloud cover in %
+ {daily[pressure]} pressure in HPa
+ {daily[ozone]} Ozone in DU (Dobson Unit)
+ -->
+
+ <detailheader>
+ <area x="0" y="0" width="100%" height="20%" layer="2">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ <area x="0" y="0" width="100%" height="20%" layer="3">
+ <drawtext x="20" valign="center" font="{light}" fontsize="40%" color="{clrWhite}" text="{menuheader}" />
+ </area>
+ <area x="{areawidth} - {areaheight}*0.2" y="0" width="{areaheight}*0.2" height="20%" layer="4">
+ <drawimage imagetype="icon" path="{icon}" align="center" valign="center" width="90%" height="90%"/>
+ </area>
+ </detailheader>
+
+ <tab name="current" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtextbox name="summary" x="0" y="5%" width="{areawidth}" font="{semibold}" fontsize="10%" color="{clrWhite}" text="{summary}" />
+ <drawrectangle x="0" y="{height(summary)}" width="{areawidth}" height="1" color="{clrWhite}" />
+ <loop name="daily" x="0" y="{height(summary)}" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/5">
+ <drawtext x="0" font="{semibold}" fontsize="9%" valign="center" color="{clrWhite}" text="{daily[dayname]} {daily[day]}" />
+ <drawimage imagetype="icon" path="{daily[icon]}" x="2*{rowheight}" valign="center" width="{rowheight}*0.8" height="{rowheight}*0.8"/>
+ <drawtext x="3.5*{rowheight}" font="{light}" fontsize="{rowheight}*0.3" y="0" color="{clrWhite}" text="{daily[temperaturemin]}°C - {daily[temperaturemax]}°C ({tr(max)} {daily[temperaturemaxtime]}, {tr(min)} {daily[temperaturemintime]})" />
+ <drawtext x="3.5*{rowheight}" font="{light}" fontsize="{rowheight}/4" y="{rowheight}*0.25" width="{columnwidth} - 3.5*{rowheight}" color="{clrWhite}" text="{daily[summary]}" />
+ <drawtext x="3.5*{rowheight}" font="{light}" fontsize="{rowheight}/4" y="{rowheight}*0.5" width="{columnwidth} - 3.5*{rowheight}" color="{clrWhite}" text="{tr(precipitationprobability)} {daily[precipitationprobability]}%, {daily[precipitationintensity]} l/qm, {tr(windspeed)} {daily[windspeed]} km/h {tr(from)} {daily[windbearingstring]}" />
+ <drawtext x="3.5*{rowheight}" font="{light}" fontsize="{rowheight}/4" y="{rowheight}*0.75" width="{columnwidth} - 3.5*{rowheight}" color="{clrWhite}" text="{tr(cloudcover)} {daily[cloudcover]}%, {tr(visibility)} {daily[visibility]} km, {tr(pressure)} {daily[pressure]} HPa, {tr(ozone)} {daily[ozone]} DU" />
+ <drawrectangle x="0" y="{rowheight} - 1" width="{columnwidth}" height="1" color="{clrWhite}" />
+ </loop>
+ </tab>
+</menuplugin>
diff --git a/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml
new file mode 100644
index 0000000..c21c62a
--- /dev/null
+++ b/skins/metrixhd/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </background>
+
+ <header>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </header>
+
+ <datetime>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </datetime>
+
+ <colorbuttons>
+ <area x="0" y="0" width="1" height="1" layer="1">
+ <fill color="{clrTransparent}" />
+ </area>
+ </colorbuttons>
+
+ <scrollbar>
+ <area x="98%" y="20%" width="2%" height="65%" layer="3">
+ <fill color="{clrWhite}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrWhite}" />
+ </area>
+ </scrollbar>
+
+ <!-- Available Variables in detailheader and tab:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+
+ {hourly[]} array with up to 48 hourly forecasts
+ {hourly[num]} number of forecast, starting at 1
+ {hourly[timestamp]} timestamp in hh:mm
+ {hourly[temperature]} temperature in °C
+ {hourly[apparenttemperature]} apparent (felt) temperature in °C
+ {hourly[summary]} short summary
+ {hourly[icon]} path to use in <drawimage> to display appropriate weather icon
+ {hourly[precipitationintensity]} precipitation intensity in l/qm
+ {hourly[precipitationprobability]} precipitation probability in %
+ {hourly[precipitationtype]} precipitation type (snow, ...)
+ {hourly[humidity]} humidity in %
+ {hourly[windspeed]} wind speed in km/h
+ {hourly[windbearing]} wind bearing in degrees
+ {hourly[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {hourly[visibility]} visibility in km
+ {hourly[cloudcover]} cloud cover in %
+ {hourly[pressure]} pressure in HPa
+ {hourly[ozone]} Ozone in DU (Dobson Unit)
+ -->
+ <detailheader>
+ <area x="0" y="0" width="100%" height="20%" layer="2">
+ <fill color="{clrTransBlueLight}" />
+ </area>
+ <area x="0" y="0" width="100%" height="20%" layer="3">
+ <drawtext x="20" valign="center" font="{light}" fontsize="40%" color="{clrWhite}" text="{menuheader}" />
+ </area>
+ <area x="{areawidth} - {areaheight}*0.2" y="0" width="{areaheight}*0.2" height="20%" layer="4">
+ <drawimage imagetype="icon" path="{icon}" align="center" valign="center" width="70%" height="70%"/>
+ </area>
+ </detailheader>
+
+ <tab name="current" x="2%" y="20%" width="94%" height="65%" layer="2" scrollheight="{areaheight}/4">
+ <drawtextbox name="summary" x="0" y="5%" width="{areawidth}" font="{semibold}" fontsize="10%" color="{clrWhite}" text="{summary}" />
+ <drawrectangle x="0" y="{height(summary)}" width="{areawidth}" height="1" color="{clrWhite}" />
+ <loop name="hourly" x="0" y="{height(summary)}" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/5">
+ <drawtext x="0" font="{semibold}" fontsize="9%" valign="center" color="{clrWhite}" text="{hourly[timestamp]}" />
+ <drawimage imagetype="icon" path="{hourly[icon]}" x="{rowheight}" valign="center" width="{rowheight}*0.8" height="{rowheight}*0.8"/>
+ <drawtext name="temp" x="2*{rowheight} + 0.75*{rowheight} - {width(temp)}/2" font="{light}" fontsize="13%" y="0" color="{clrWhite}" text="{hourly[temperature]}°C" />
+ <drawtext name="felt" x="2*{rowheight} + 0.75*{rowheight} - {width(felt)}/2" font="{light}" fontsize="6%" y="{rowheight}*0.6" color="{clrWhite}" text="{tr(felt)} {hourly[apparenttemperature]}°C" />
+ <drawtext x="4*{rowheight}" font="{light}" fontsize="{rowheight}/3" y="0" width="{columnwidth} - 4*{rowheight}" color="{clrWhite}" text="{hourly[summary]}" />
+ <drawtext x="4*{rowheight}" font="{light}" fontsize="{rowheight}/3" y="{rowheight}/3" width="{columnwidth} - 4*{rowheight}" color="{clrWhite}" text="{tr(precipitationprobability)} {hourly[precipitationprobability]}%, {hourly[precipitationintensity]} l/qm" />
+ <drawtext x="4*{rowheight}" font="{light}" fontsize="{rowheight}/3" y="{rowheight}*2/3" width="{columnwidth} - 4*{rowheight}" color="{clrWhite}" text="{tr(windspeed)} {hourly[windspeed]} km/h {tr(from)} {hourly[windbearingstring]}" />
+ <drawrectangle x="0" y="{rowheight} - 1" width="{columnwidth}" height="1" color="{clrWhite}" />
+ </loop>
+ </tab>
+</menuplugin>
diff --git a/skins/nopacity/globals.xml b/skins/nopacity/globals.xml
new file mode 100644
index 0000000..0a6e473
--- /dev/null
+++ b/skins/nopacity/globals.xml
@@ -0,0 +1,269 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE globals SYSTEM "../../dtd/globals.dtd">
+
+<globals>
+ <!--
+ define all your needed colors here
+ -->
+ <colors>
+ </colors>
+ <!--
+ these variables can be used everywhere in the templates
+ variabls of type int can also be used as conditions, just
+ set such a variable to 1 for true and 0 for false
+ -->
+ <variables>
+ </variables>
+ <!--
+ translations used in the skin
+ -->
+ <translations>
+ <token name="tr(free)">
+ <trans lang="en_EN">free</trans>
+ <trans lang="de_DE">frei</trans>
+ </token>
+ <token name="tr(transponder)">
+ <trans lang="en_EN">Transponder</trans>
+ <trans lang="de_DE">Transponder</trans>
+ </token>
+ <token name="tr(now)">
+ <trans lang="en_EN">Now</trans>
+ <trans lang="de_DE">Jetzt</trans>
+ </token>
+ <token name="tr(next)">
+ <trans lang="en_EN">Next</trans>
+ <trans lang="de_DE">Nachfolgend</trans>
+ </token>
+ <token name="tr(nextschedules)">
+ <trans lang="en_EN">Next Schedules</trans>
+ <trans lang="de_DE">Nachfolgende Sendungen</trans>
+ </token>
+ <token name="tr(reruns)">
+ <trans lang="en_EN">Reruns</trans>
+ <trans lang="de_DE">Wiederholungen</trans>
+ </token>
+ <token name="tr(rerunsof)">
+ <trans lang="en_EN">Reruns of</trans>
+ <trans lang="de_DE">Wiederholungen von</trans>
+ </token>
+ <token name="tr(actors)">
+ <trans lang="en_EN">Actors</trans>
+ <trans lang="de_DE">Schauspieler</trans>
+ </token>
+ <token name="tr(episode)">
+ <trans lang="en_EN">Episode</trans>
+ <trans lang="de_DE">Folge</trans>
+ </token>
+ <token name="tr(season)">
+ <trans lang="en_EN">Season</trans>
+ <trans lang="de_DE">Staffel</trans>
+ </token>
+ <token name="tr(gueststars)">
+ <trans lang="en_EN">Guest Stars</trans>
+ <trans lang="de_DE">Gaststars</trans>
+ </token>
+ <token name="tr(seriesfirstaired)">
+ <trans lang="en_EN">Series First Aired</trans>
+ <trans lang="de_DE">Erstausstrahlung der Serie</trans>
+ </token>
+ <token name="tr(episodefirstaired)">
+ <trans lang="en_EN">Episode First Aired</trans>
+ <trans lang="de_DE">Erstausstrahlung der Episode</trans>
+ </token>
+ <token name="tr(network)">
+ <trans lang="en_EN">Network</trans>
+ <trans lang="de_DE">TV Station</trans>
+ </token>
+ <token name="tr(genre)">
+ <trans lang="en_EN">Genre</trans>
+ <trans lang="de_DE">Genre</trans>
+ </token>
+ <token name="tr(status)">
+ <trans lang="en_EN">Status</trans>
+ <trans lang="de_DE">Status</trans>
+ </token>
+ <token name="tr(rating)">
+ <trans lang="en_EN">Rating</trans>
+ <trans lang="de_DE">Bewertung</trans>
+ </token>
+ <token name="tr(episoderating)">
+ <trans lang="en_EN">Episode Rating</trans>
+ <trans lang="de_DE">Bewertung der Folge</trans>
+ </token>
+ <token name="tr(recinfo)">
+ <trans lang="en_EN">Recording Information</trans>
+ <trans lang="de_DE">Aufnahme Informationen</trans>
+ </token>
+ <token name="tr(seriesgalery)">
+ <trans lang="en_EN">Series Galery</trans>
+ <trans lang="de_DE">Serien Galerie</trans>
+ </token>
+ <token name="tr(moviegalery)">
+ <trans lang="en_EN">Movie Galery</trans>
+ <trans lang="de_DE">Spielfilm Galerie</trans>
+ </token>
+ <token name="tr(originaltitle)">
+ <trans lang="en_EN">Original Title</trans>
+ <trans lang="de_DE">Originaltitel</trans>
+ </token>
+ <token name="tr(budget)">
+ <trans lang="en_EN">Budget</trans>
+ <trans lang="de_DE">Budget</trans>
+ </token>
+ <token name="tr(revenue)">
+ <trans lang="en_EN">Revenue</trans>
+ <trans lang="de_DE">Einnahmen</trans>
+ </token>
+ <token name="tr(adult)">
+ <trans lang="en_EN">Adult</trans>
+ <trans lang="de_DE">Nur für Erwachsene</trans>
+ </token>
+ <token name="tr(releasedate)">
+ <trans lang="en_EN">Release Date</trans>
+ <trans lang="de_DE">Erscheinungsdatum</trans>
+ </token>
+ <token name="tr(runtime)">
+ <trans lang="en_EN">Runtime</trans>
+ <trans lang="de_DE">Laufzeit</trans>
+ </token>
+ <token name="tr(popularity)">
+ <trans lang="en_EN">Popularity</trans>
+ <trans lang="de_DE">Popularität</trans>
+ </token>
+ <token name="tr(voteaverage)">
+ <trans lang="en_EN">Vote Average</trans>
+ <trans lang="de_DE">Durchschnittliche Wertung</trans>
+ </token>
+ <token name="tr(homepage)">
+ <trans lang="en_EN">Homepage</trans>
+ <trans lang="de_DE">Homepage</trans>
+ </token>
+ <token name="tr(recsize)">
+ <trans lang="en_EN">Recording size</trans>
+ <trans lang="de_DE">Größe der Aufnahme</trans>
+ </token>
+ <token name="tr(recsizecutted)">
+ <trans lang="en_EN">Cutted Recording Size</trans>
+ <trans lang="de_DE">Größe der geschnittenen Aufnahme</trans>
+ </token>
+ <token name="tr(reclength)">
+ <trans lang="en_EN">Recording Length</trans>
+ <trans lang="de_DE">Länge der Aufnahme</trans>
+ </token>
+ <token name="tr(reclengthcutted)">
+ <trans lang="en_EN">Cutted Recording Length</trans>
+ <trans lang="de_DE">Länge der geschnittenen Aufnahme</trans>
+ </token>
+ <token name="tr(bitrate)">
+ <trans lang="en_EN">Bit Rate</trans>
+ <trans lang="de_DE">Bitrate</trans>
+ </token>
+ <token name="tr(format)">
+ <trans lang="en_EN">Format</trans>
+ <trans lang="de_DE">Format</trans>
+ </token>
+ <token name="tr(searchtimer)">
+ <trans lang="en_EN">Searchtimer</trans>
+ <trans lang="de_DE">Suchtimer</trans>
+ </token>
+ <token name="tr(volume)">
+ <trans lang="en_EN">Volume</trans>
+ <trans lang="de_DE">Lautstärke</trans>
+ </token>
+ <token name="tr(pause)">
+ <trans lang="en_EN">Pause</trans>
+ <trans lang="de_DE">Pause</trans>
+ </token>
+ <token name="tr(apparenttemp)">
+ <trans lang="en_EN">Felt Temperature</trans>
+ <trans lang="de_DE">Gefühlte Temperatur</trans>
+ </token>
+ <token name="tr(todaymin)">
+ <trans lang="en_EN">minimum today</trans>
+ <trans lang="de_DE">heutiges Minimum</trans>
+ </token>
+ <token name="tr(todaymax)">
+ <trans lang="en_EN">maximum today</trans>
+ <trans lang="de_DE">heutiges Maximum</trans>
+ </token>
+ <token name="tr(precipitationprobability)">
+ <trans lang="en_EN">Precipitation Prob.</trans>
+ <trans lang="de_DE">Regenwahrsch.</trans>
+ </token>
+ <token name="tr(precipitationintensity)">
+ <trans lang="en_EN">Precipitation Intensity</trans>
+ <trans lang="de_DE">Regenmenge</trans>
+ </token>
+ <token name="tr(humidity)">
+ <trans lang="en_EN">Humidity</trans>
+ <trans lang="de_DE">Luftfeuchtigkeit</trans>
+ </token>
+ <token name="tr(apparenttemp)">
+ <trans lang="en_EN">Felt Temperature</trans>
+ <trans lang="de_DE">Gefühlte Temperatur</trans>
+ </token>
+ <token name="tr(windbearing)">
+ <trans lang="en_EN">Wind Bearing</trans>
+ <trans lang="de_DE">Windrichtung</trans>
+ </token>
+ <token name="tr(windspeed)">
+ <trans lang="en_EN">Wind Speed</trans>
+ <trans lang="de_DE">Windgeschwindigkeit</trans>
+ </token>
+ <token name="tr(cloudcover)">
+ <trans lang="en_EN">Cloud Cover</trans>
+ <trans lang="de_DE">Bewölkung</trans>
+ </token>
+ <token name="tr(pressure)">
+ <trans lang="en_EN">Pressure</trans>
+ <trans lang="de_DE">Luftdruck</trans>
+ </token>
+ <token name="tr(ozone)">
+ <trans lang="en_EN">Ozone</trans>
+ <trans lang="de_DE">Ozon</trans>
+ </token>
+ <token name="tr(visibility)">
+ <trans lang="en_EN">visibility</trans>
+ <trans lang="de_DE">Sicht</trans>
+ </token>
+ <token name="tr(conditions)">
+ <trans lang="en_EN">Weather Conditions</trans>
+ <trans lang="de_DE">Wetterlage</trans>
+ </token>
+ <token name="tr(from)">
+ <trans lang="en_EN">from</trans>
+ <trans lang="de_DE">aus</trans>
+ </token>
+ <token name="tr(felt)">
+ <trans lang="en_EN">felt</trans>
+ <trans lang="de_DE">gefühlt</trans>
+ </token>
+ <token name="tr(min)">
+ <trans lang="en_EN">min</trans>
+ <trans lang="de_DE">min</trans>
+ </token>
+ <token name="tr(max)">
+ <trans lang="en_EN">max</trans>
+ <trans lang="de_DE">max</trans>
+ </token>
+ <token name="tr(for)">
+ <trans lang="en_EN">for</trans>
+ <trans lang="de_DE">für</trans>
+ </token>
+ </translations>
+ <!--
+ The three Fonts FontOSD, FontFix and FontSml configured in VDR
+ can be used in all template "font" attributes with this tokens:
+ {vdrOsd}
+ {vdrFix}
+ {vdrSml}
+ If you like to use further fonts, just define them below.
+ Syntax:
+ <font name="tokenname">fontname</font>
+ These fonts can then also be used in all templates in the "font"
+ attribute.
+ if an invalid font is used in a template, vdrOsd is used as default.
+ -->
+ <fonts>
+ </fonts>
+</globals>
diff --git a/skins/nopacity/setup.xml b/skins/nopacity/setup.xml
new file mode 100644
index 0000000..6482021
--- /dev/null
+++ b/skins/nopacity/setup.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE setup SYSTEM "../../dtd/setup.dtd">
+
+<setup>
+ <menu>
+ <parameter type="bool" name="showposter" displaytext="{tr(showpostertext)}">1</parameter>
+ <parameter type="bool" name="showweather" displaytext="{tr(showweather)}">1</parameter>
+ <parameter type="int" name="fadeTime" min="0" max="1000" displaytext="{tr(fadeText)}">300</parameter>
+ <parameter type="int" name="transparency" min="0" max="30" displaytext="{tr(transparency)}">20</parameter>
+ </menu>
+
+ <translations>
+ <token name="tr(showpostertext)">
+ <trans lang="en_EN">Show Poster when switching channel</trans>
+ <trans lang="de_DE">Poster beim Umschalten anzeigen</trans>
+ </token>
+ <token name="tr(showweather)">
+ <trans lang="en_EN">Show Weather in infobar</trans>
+ <trans lang="de_DE">Wetter in Infobar anzeigen</trans>
+ </token>
+ <token name="tr(fadeText)">
+ <trans lang="en_EN">Fade time in ms</trans>
+ <trans lang="de_DE">Einblendzeit in ms</trans>
+ </token>
+ <token name="tr(transparency)">
+ <trans lang="en_EN">Transpareny channel, replay and volume</trans>
+ <trans lang="de_DE">Transparenz bei Kanal,Wiedergabe und Lautstärke</trans>
+ </token>
+ </translations>
+</setup>
diff --git a/skins/nopacity/themes/darkred/icons/clear-day.png b/skins/nopacity/themes/darkred/icons/clear-day.png
new file mode 100644
index 0000000..2b06a14
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/clear-day.png differ
diff --git a/skins/nopacity/themes/darkred/icons/clear-night.png b/skins/nopacity/themes/darkred/icons/clear-night.png
new file mode 100644
index 0000000..9bbe49f
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/clear-night.png differ
diff --git a/skins/nopacity/themes/darkred/icons/cloudy.png b/skins/nopacity/themes/darkred/icons/cloudy.png
new file mode 100644
index 0000000..9870c7f
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/cloudy.png differ
diff --git a/skins/nopacity/themes/darkred/icons/fog.png b/skins/nopacity/themes/darkred/icons/fog.png
new file mode 100644
index 0000000..9bc88d2
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/fog.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_ac3.png b/skins/nopacity/themes/darkred/icons/ico_ac3.png
new file mode 100644
index 0000000..5b8614a
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_ac3.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_activetimer.png b/skins/nopacity/themes/darkred/icons/ico_activetimer.png
new file mode 100644
index 0000000..af4c33c
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_activetimer.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_arrow_left_channelsep.png b/skins/nopacity/themes/darkred/icons/ico_arrow_left_channelsep.png
new file mode 100644
index 0000000..2c83c46
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_arrow_left_channelsep.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_arrow_right_channelsep.png b/skins/nopacity/themes/darkred/icons/ico_arrow_right_channelsep.png
new file mode 100644
index 0000000..6ae7e00
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_arrow_right_channelsep.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_channelsep.png b/skins/nopacity/themes/darkred/icons/ico_channelsep.png
new file mode 100644
index 0000000..bf51238
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_channelsep.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_cutted.png b/skins/nopacity/themes/darkred/icons/ico_cutted.png
new file mode 100644
index 0000000..b90c9c1
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_cutted.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_daydelimiter.png b/skins/nopacity/themes/darkred/icons/ico_daydelimiter.png
new file mode 100644
index 0000000..7ae6053
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_daydelimiter.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_discusage.png b/skins/nopacity/themes/darkred/icons/ico_discusage.png
new file mode 100644
index 0000000..de1dfbb
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_discusage.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_dolbyoff.png b/skins/nopacity/themes/darkred/icons/ico_dolbyoff.png
new file mode 100644
index 0000000..895bd94
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_dolbyoff.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_dolbyon.png b/skins/nopacity/themes/darkred/icons/ico_dolbyon.png
new file mode 100644
index 0000000..555b409
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_dolbyon.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_encrypted.png b/skins/nopacity/themes/darkred/icons/ico_encrypted.png
new file mode 100644
index 0000000..8c7c351
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_encrypted.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_ff.png b/skins/nopacity/themes/darkred/icons/ico_ff.png
new file mode 100644
index 0000000..b12409d
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_ff.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_ff_1x.png b/skins/nopacity/themes/darkred/icons/ico_ff_1x.png
new file mode 100644
index 0000000..f4ef710
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_ff_1x.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_ff_2x.png b/skins/nopacity/themes/darkred/icons/ico_ff_2x.png
new file mode 100644
index 0000000..344a243
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_ff_2x.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_ff_3x.png b/skins/nopacity/themes/darkred/icons/ico_ff_3x.png
new file mode 100644
index 0000000..05d29e8
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_ff_3x.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_ff_off.png b/skins/nopacity/themes/darkred/icons/ico_ff_off.png
new file mode 100644
index 0000000..cb551c2
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_ff_off.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_fta.png b/skins/nopacity/themes/darkred/icons/ico_fta.png
new file mode 100644
index 0000000..5e5a1c4
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_fta.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_hd1080i.png b/skins/nopacity/themes/darkred/icons/ico_hd1080i.png
new file mode 100644
index 0000000..8a44156
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_hd1080i.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_hd720p.png b/skins/nopacity/themes/darkred/icons/ico_hd720p.png
new file mode 100644
index 0000000..2fa9baf
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_hd720p.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_mute.png b/skins/nopacity/themes/darkred/icons/ico_mute.png
new file mode 100644
index 0000000..4eefc75
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_mute.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_pause.png b/skins/nopacity/themes/darkred/icons/ico_pause.png
new file mode 100644
index 0000000..fc9ce48
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_pause.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_pause_off.png b/skins/nopacity/themes/darkred/icons/ico_pause_off.png
new file mode 100644
index 0000000..f9a9d94
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_pause_off.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_play.png b/skins/nopacity/themes/darkred/icons/ico_play.png
new file mode 100644
index 0000000..0fa1c5a
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_play.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_play_off.png b/skins/nopacity/themes/darkred/icons/ico_play_off.png
new file mode 100644
index 0000000..7fb820a
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_play_off.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_recfolder.png b/skins/nopacity/themes/darkred/icons/ico_recfolder.png
new file mode 100644
index 0000000..e3df65b
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_recfolder.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_recnew.png b/skins/nopacity/themes/darkred/icons/ico_recnew.png
new file mode 100644
index 0000000..b9166ba
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_recnew.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_recoff.png b/skins/nopacity/themes/darkred/icons/ico_recoff.png
new file mode 100644
index 0000000..f7355aa
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_recoff.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_recon.png b/skins/nopacity/themes/darkred/icons/ico_recon.png
new file mode 100644
index 0000000..9dd4d10
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_recon.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_rew.png b/skins/nopacity/themes/darkred/icons/ico_rew.png
new file mode 100644
index 0000000..134da85
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_rew.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_rew_1x.png b/skins/nopacity/themes/darkred/icons/ico_rew_1x.png
new file mode 100644
index 0000000..ffb79b1
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_rew_1x.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_rew_2x.png b/skins/nopacity/themes/darkred/icons/ico_rew_2x.png
new file mode 100644
index 0000000..00bbedd
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_rew_2x.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_rew_3x.png b/skins/nopacity/themes/darkred/icons/ico_rew_3x.png
new file mode 100644
index 0000000..b683ed3
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_rew_3x.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_rew_off.png b/skins/nopacity/themes/darkred/icons/ico_rew_off.png
new file mode 100644
index 0000000..ce18386
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_rew_off.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_sd576i.png b/skins/nopacity/themes/darkred/icons/ico_sd576i.png
new file mode 100644
index 0000000..2e313aa
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_sd576i.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_stereo.png b/skins/nopacity/themes/darkred/icons/ico_stereo.png
new file mode 100644
index 0000000..7f3610d
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_stereo.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_stereooff.png b/skins/nopacity/themes/darkred/icons/ico_stereooff.png
new file mode 100644
index 0000000..abb2c80
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_stereooff.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_stereoon.png b/skins/nopacity/themes/darkred/icons/ico_stereoon.png
new file mode 100644
index 0000000..21c1b60
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_stereoon.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_timer_active.png b/skins/nopacity/themes/darkred/icons/ico_timer_active.png
new file mode 100644
index 0000000..28c2f81
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_timer_active.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_timer_inactive.png b/skins/nopacity/themes/darkred/icons/ico_timer_inactive.png
new file mode 100644
index 0000000..c4b1860
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_timer_inactive.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_timer_recording.png b/skins/nopacity/themes/darkred/icons/ico_timer_recording.png
new file mode 100644
index 0000000..86dc66b
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_timer_recording.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_txtoff.png b/skins/nopacity/themes/darkred/icons/ico_txtoff.png
new file mode 100644
index 0000000..e928a56
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_txtoff.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_txton.png b/skins/nopacity/themes/darkred/icons/ico_txton.png
new file mode 100644
index 0000000..0361835
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_txton.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_vdrlogo.png b/skins/nopacity/themes/darkred/icons/ico_vdrlogo.png
new file mode 100644
index 0000000..200cea7
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_vdrlogo.png differ
diff --git a/skins/nopacity/themes/darkred/icons/ico_volume.png b/skins/nopacity/themes/darkred/icons/ico_volume.png
new file mode 100644
index 0000000..3a72514
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/ico_volume.png differ
diff --git a/skins/nopacity/themes/darkred/icons/partly-cloudy-day.png b/skins/nopacity/themes/darkred/icons/partly-cloudy-day.png
new file mode 100644
index 0000000..b6df179
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/partly-cloudy-day.png differ
diff --git a/skins/nopacity/themes/darkred/icons/partly-cloudy-night.png b/skins/nopacity/themes/darkred/icons/partly-cloudy-night.png
new file mode 100644
index 0000000..aa358fb
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/partly-cloudy-night.png differ
diff --git a/skins/nopacity/themes/darkred/icons/rain.png b/skins/nopacity/themes/darkred/icons/rain.png
new file mode 100644
index 0000000..8275003
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/rain.png differ
diff --git a/skins/nopacity/themes/darkred/icons/sleet.png b/skins/nopacity/themes/darkred/icons/sleet.png
new file mode 100644
index 0000000..1d99ae0
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/sleet.png differ
diff --git a/skins/nopacity/themes/darkred/icons/snow.png b/skins/nopacity/themes/darkred/icons/snow.png
new file mode 100644
index 0000000..939e22f
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/snow.png differ
diff --git a/skins/nopacity/themes/darkred/icons/wind.png b/skins/nopacity/themes/darkred/icons/wind.png
new file mode 100644
index 0000000..d92ec15
Binary files /dev/null and b/skins/nopacity/themes/darkred/icons/wind.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Applikationen.png b/skins/nopacity/themes/darkred/menuicons/customicons/Applikationen.png
new file mode 100644
index 0000000..3c3b616
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Applikationen.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Audio.png b/skins/nopacity/themes/darkred/menuicons/customicons/Audio.png
new file mode 100644
index 0000000..ff387fe
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Audio.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Aufnahmen-Liste aktualisieren.png b/skins/nopacity/themes/darkred/menuicons/customicons/Aufnahmen-Liste aktualisieren.png
new file mode 100644
index 0000000..3cdddc9
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Aufnahmen-Liste aktualisieren.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Dienstprogramme.png b/skins/nopacity/themes/darkred/menuicons/customicons/Dienstprogramme.png
new file mode 100644
index 0000000..793aba6
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Dienstprogramme.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/FireFox.png b/skins/nopacity/themes/darkred/menuicons/customicons/FireFox.png
new file mode 100644
index 0000000..192fadc
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/FireFox.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Info.png b/skins/nopacity/themes/darkred/menuicons/customicons/Info.png
new file mode 100644
index 0000000..6737431
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Info.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Internet.png b/skins/nopacity/themes/darkred/menuicons/customicons/Internet.png
new file mode 100644
index 0000000..f3db150
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Internet.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Medien.png b/skins/nopacity/themes/darkred/menuicons/customicons/Medien.png
new file mode 100644
index 0000000..0ce2360
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Medien.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Rechner neu starten.png b/skins/nopacity/themes/darkred/menuicons/customicons/Rechner neu starten.png
new file mode 100644
index 0000000..5783ccf
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Rechner neu starten.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Remote wakeup.png b/skins/nopacity/themes/darkred/menuicons/customicons/Remote wakeup.png
new file mode 100644
index 0000000..1cd2f6e
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Remote wakeup.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Spiele.png b/skins/nopacity/themes/darkred/menuicons/customicons/Spiele.png
new file mode 100644
index 0000000..8e07161
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Spiele.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/System herunterfahren.png b/skins/nopacity/themes/darkred/menuicons/customicons/System herunterfahren.png
new file mode 100644
index 0000000..e0234df
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/System herunterfahren.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/System.png b/skins/nopacity/themes/darkred/menuicons/customicons/System.png
new file mode 100644
index 0000000..81d100e
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/System.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Tools.png b/skins/nopacity/themes/darkred/menuicons/customicons/Tools.png
new file mode 100644
index 0000000..cf328ef
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Tools.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Tunderbird.png b/skins/nopacity/themes/darkred/menuicons/customicons/Tunderbird.png
new file mode 100644
index 0000000..5ae27e0
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Tunderbird.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/USB Massenspeicher sicher entfernen.png b/skins/nopacity/themes/darkred/menuicons/customicons/USB Massenspeicher sicher entfernen.png
new file mode 100644
index 0000000..cd7b81c
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/USB Massenspeicher sicher entfernen.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/VDR neu starten.png b/skins/nopacity/themes/darkred/menuicons/customicons/VDR neu starten.png
new file mode 100644
index 0000000..14904ca
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/VDR neu starten.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Video.png b/skins/nopacity/themes/darkred/menuicons/customicons/Video.png
new file mode 100644
index 0000000..490ca4b
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Video.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Web.png b/skins/nopacity/themes/darkred/menuicons/customicons/Web.png
new file mode 100644
index 0000000..20260e3
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Web.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/XBMC.png b/skins/nopacity/themes/darkred/menuicons/customicons/XBMC.png
new file mode 100644
index 0000000..c7c4c04
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/XBMC.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/Xterm.png b/skins/nopacity/themes/darkred/menuicons/customicons/Xterm.png
new file mode 100644
index 0000000..fa75282
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/Xterm.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/audiovideo.png b/skins/nopacity/themes/darkred/menuicons/customicons/audiovideo.png
new file mode 100644
index 0000000..726538d
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/audiovideo.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/markad_status.png b/skins/nopacity/themes/darkred/menuicons/customicons/markad_status.png
new file mode 100644
index 0000000..4fdc7a4
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/markad_status.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/schneiden_abbrechen.png b/skins/nopacity/themes/darkred/menuicons/customicons/schneiden_abbrechen.png
new file mode 100644
index 0000000..b2e0bd3
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/schneiden_abbrechen.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/tux.png b/skins/nopacity/themes/darkred/menuicons/customicons/tux.png
new file mode 100644
index 0000000..c5b4742
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/tux.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/usb.png b/skins/nopacity/themes/darkred/menuicons/customicons/usb.png
new file mode 100644
index 0000000..c4db1d4
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/usb.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/vdrlogo.png b/skins/nopacity/themes/darkred/menuicons/customicons/vdrlogo.png
new file mode 100644
index 0000000..037a191
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/vdrlogo.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/customicons/yaicon_blue.png b/skins/nopacity/themes/darkred/menuicons/customicons/yaicon_blue.png
new file mode 100644
index 0000000..2c49273
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/customicons/yaicon_blue.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/admin.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/admin.png
new file mode 100644
index 0000000..cf328ef
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/admin.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/arghdirector.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/arghdirector.png
new file mode 100644
index 0000000..bbd221a
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/arghdirector.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/autostart.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/autostart.png
new file mode 100644
index 0000000..6fdb1bb
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/autostart.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/avahi4vdr.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/avahi4vdr.png
new file mode 100644
index 0000000..044e71d
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/avahi4vdr.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/avards.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/avards.png
new file mode 100644
index 0000000..cf8d037
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/avards.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/block.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/block.png
new file mode 100644
index 0000000..86127c2
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/block.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/burn.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/burn.png
new file mode 100644
index 0000000..305d7ff
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/burn.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/cdplayer.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/cdplayer.png
new file mode 100644
index 0000000..89a6c19
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/cdplayer.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/chanman.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/chanman.png
new file mode 100644
index 0000000..a73e83c
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/chanman.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/check.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/check.png
new file mode 100644
index 0000000..d487a24
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/check.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/conflictcheckonly.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/conflictcheckonly.png
new file mode 100644
index 0000000..7f832bd
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/conflictcheckonly.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/ddci.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/ddci.png
new file mode 100644
index 0000000..4ad459c
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/ddci.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/devstatus.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/devstatus.png
new file mode 100644
index 0000000..96c0ec1
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/devstatus.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/dummydevice.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/dummydevice.png
new file mode 100644
index 0000000..11fd707
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/dummydevice.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/duplicates.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/duplicates.png
new file mode 100644
index 0000000..dc1be57
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/duplicates.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/dvbapi.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/dvbapi.png
new file mode 100644
index 0000000..b966461
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/dvbapi.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/dvbhddevice.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/dvbhddevice.png
new file mode 100644
index 0000000..b874297
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/dvbhddevice.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/dvbsddevice.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/dvbsddevice.png
new file mode 100644
index 0000000..106184e
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/dvbsddevice.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/dynamite.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/dynamite.png
new file mode 100644
index 0000000..28ea35a
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/dynamite.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/eepg.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/eepg.png
new file mode 100644
index 0000000..3938b96
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/eepg.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/epg2vdr.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/epg2vdr.png
new file mode 100644
index 0000000..ac8757e
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/epg2vdr.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/epgsearch.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/epgsearch.png
new file mode 100644
index 0000000..5eab415
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/epgsearch.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/epgsearchonly.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/epgsearchonly.png
new file mode 100644
index 0000000..b5186e7
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/epgsearchonly.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/epgsync.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/epgsync.png
new file mode 100644
index 0000000..5c14009
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/epgsync.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/externalplayer.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/externalplayer.png
new file mode 100644
index 0000000..2bd67db
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/externalplayer.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/extrecmenu.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/extrecmenu.png
new file mode 100644
index 0000000..6f613f1
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/extrecmenu.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/favorites.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/favorites.png
new file mode 100644
index 0000000..409c852
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/favorites.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/femon.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/femon.png
new file mode 100644
index 0000000..e87b711
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/femon.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/fepg.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/fepg.png
new file mode 100644
index 0000000..65023ed
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/fepg.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/filebrowser.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/filebrowser.png
new file mode 100644
index 0000000..d3f90e0
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/filebrowser.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/fritzbox.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/fritzbox.png
new file mode 100644
index 0000000..7bfc229
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/fritzbox.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/graphlcd.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/graphlcd.png
new file mode 100644
index 0000000..39ffd35
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/graphlcd.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/graphtft.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/graphtft.png
new file mode 100644
index 0000000..39ffd35
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/graphtft.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/image.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/image.png
new file mode 100644
index 0000000..33644e0
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/image.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/imonlcd.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/imonlcd.png
new file mode 100644
index 0000000..3d34fc4
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/imonlcd.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/iptv.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/iptv.png
new file mode 100644
index 0000000..4494ddc
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/iptv.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/lcdproc.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/lcdproc.png
new file mode 100644
index 0000000..3d34fc4
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/lcdproc.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/mailbox.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/mailbox.png
new file mode 100644
index 0000000..1bc76e8
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/mailbox.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/makemkv.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/makemkv.png
new file mode 100644
index 0000000..41cddf1
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/makemkv.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/markad.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/markad.png
new file mode 100644
index 0000000..b3defaf
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/markad.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/mlist.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/mlist.png
new file mode 100644
index 0000000..19c367f
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/mlist.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/music.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/music.png
new file mode 100644
index 0000000..abb012e
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/music.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/noepg.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/noepg.png
new file mode 100644
index 0000000..eb9410d
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/noepg.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/nordlichtsepg.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/nordlichtsepg.png
new file mode 100644
index 0000000..3ee3fa2
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/nordlichtsepg.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/osdteletext.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/osdteletext.png
new file mode 100644
index 0000000..664e770
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/osdteletext.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/peer.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/peer.png
new file mode 100644
index 0000000..998d568
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/peer.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/play.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/play.png
new file mode 100644
index 0000000..2848fc6
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/play.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/pvrinput.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/pvrinput.png
new file mode 100644
index 0000000..724f698
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/pvrinput.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/quickepgsearch.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/quickepgsearch.png
new file mode 100644
index 0000000..76a31f4
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/quickepgsearch.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/radio.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/radio.png
new file mode 100644
index 0000000..193b7d4
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/radio.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/remote.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/remote.png
new file mode 100644
index 0000000..7f46b1b
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/remote.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/remotetimers.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/remotetimers.png
new file mode 100644
index 0000000..fae3b79
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/remotetimers.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/rssreader.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/rssreader.png
new file mode 100644
index 0000000..db538f0
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/rssreader.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/sc.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/sc.png
new file mode 100644
index 0000000..2472d6c
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/sc.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/screenshot.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/screenshot.png
new file mode 100644
index 0000000..be9b4d5
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/screenshot.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/seduatmo.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/seduatmo.png
new file mode 100644
index 0000000..4b5292f
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/seduatmo.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/skyselectfeeds.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/skyselectfeeds.png
new file mode 100644
index 0000000..d81a024
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/skyselectfeeds.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/sleeptimer.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/sleeptimer.png
new file mode 100644
index 0000000..cd4956f
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/sleeptimer.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/softhddevice.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/softhddevice.png
new file mode 100644
index 0000000..df13f2c
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/softhddevice.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/streamdev-server.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/streamdev-server.png
new file mode 100644
index 0000000..e89ed8b
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/streamdev-server.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/systeminfo.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/systeminfo.png
new file mode 100644
index 0000000..b14763f
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/systeminfo.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/targavfd.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/targavfd.png
new file mode 100644
index 0000000..e91b111
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/targavfd.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/trayopenng.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/trayopenng.png
new file mode 100644
index 0000000..6ebd17d
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/trayopenng.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/tvguide.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/tvguide.png
new file mode 100644
index 0000000..968a37c
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/tvguide.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/tvm2vdr.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/tvm2vdr.png
new file mode 100644
index 0000000..47f9a91
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/tvm2vdr.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/tvscraper.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/tvscraper.png
new file mode 100644
index 0000000..a106cb5
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/tvscraper.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/undelete.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/undelete.png
new file mode 100644
index 0000000..a53d50a
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/undelete.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/weatherforecast.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/weatherforecast.png
new file mode 100644
index 0000000..a88f11d
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/weatherforecast.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/weatherng.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/weatherng.png
new file mode 100644
index 0000000..a88f11d
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/weatherng.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/xmltv2vdr.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/xmltv2vdr.png
new file mode 100644
index 0000000..ea73c74
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/xmltv2vdr.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/pluginicons/yaepghg.png b/skins/nopacity/themes/darkred/menuicons/pluginicons/yaepghg.png
new file mode 100644
index 0000000..53ce443
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/pluginicons/yaepghg.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/CAM.png b/skins/nopacity/themes/darkred/menuicons/standardicons/CAM.png
new file mode 100644
index 0000000..a394877
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/CAM.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Channels.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Channels.png
new file mode 100644
index 0000000..ba2ba78
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Channels.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Commands.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Commands.png
new file mode 100644
index 0000000..c6a83ef
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Commands.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/DVB.png b/skins/nopacity/themes/darkred/menuicons/standardicons/DVB.png
new file mode 100644
index 0000000..3789145
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/DVB.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/EPG.png b/skins/nopacity/themes/darkred/menuicons/standardicons/EPG.png
new file mode 100644
index 0000000..e868b90
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/EPG.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/LNB.png b/skins/nopacity/themes/darkred/menuicons/standardicons/LNB.png
new file mode 100644
index 0000000..896dd99
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/LNB.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Miscellaneous.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Miscellaneous.png
new file mode 100644
index 0000000..2a41c4d
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Miscellaneous.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/OSD.png b/skins/nopacity/themes/darkred/menuicons/standardicons/OSD.png
new file mode 100644
index 0000000..8f571c6
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/OSD.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Plugins.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Plugins.png
new file mode 100644
index 0000000..3fcba70
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Plugins.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Recording.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Recording.png
new file mode 100644
index 0000000..741b1af
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Recording.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Recordings.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Recordings.png
new file mode 100644
index 0000000..79aeeb7
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Recordings.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Replay.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Replay.png
new file mode 100644
index 0000000..621596c
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Replay.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Restart.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Restart.png
new file mode 100644
index 0000000..aa23cd4
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Restart.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Schedule.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Schedule.png
new file mode 100644
index 0000000..3a98cac
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Schedule.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Setup.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Setup.png
new file mode 100644
index 0000000..d121148
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Setup.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/StopRecording.png b/skins/nopacity/themes/darkred/menuicons/standardicons/StopRecording.png
new file mode 100644
index 0000000..ed83fbb
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/StopRecording.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/StopReplay.png b/skins/nopacity/themes/darkred/menuicons/standardicons/StopReplay.png
new file mode 100644
index 0000000..9192760
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/StopReplay.png differ
diff --git a/skins/nopacity/themes/darkred/menuicons/standardicons/Timers.png b/skins/nopacity/themes/darkred/menuicons/standardicons/Timers.png
new file mode 100644
index 0000000..b866c36
Binary files /dev/null and b/skins/nopacity/themes/darkred/menuicons/standardicons/Timers.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/buttonblue.png b/skins/nopacity/themes/darkred/skinparts/buttonblue.png
new file mode 100644
index 0000000..82dc634
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/buttonblue.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/buttongreen.png b/skins/nopacity/themes/darkred/skinparts/buttongreen.png
new file mode 100644
index 0000000..ce8fe22
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/buttongreen.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/buttonred.png b/skins/nopacity/themes/darkred/skinparts/buttonred.png
new file mode 100644
index 0000000..9660a3e
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/buttonred.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/buttonyellow.png b/skins/nopacity/themes/darkred/skinparts/buttonyellow.png
new file mode 100644
index 0000000..a51ea7a
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/buttonyellow.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/channellogoback.png b/skins/nopacity/themes/darkred/skinparts/channellogoback.png
new file mode 100644
index 0000000..79357af
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/channellogoback.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/discpercent.png b/skins/nopacity/themes/darkred/skinparts/discpercent.png
new file mode 100644
index 0000000..cf32be2
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/discpercent.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/displaychannelback.png b/skins/nopacity/themes/darkred/skinparts/displaychannelback.png
new file mode 100644
index 0000000..672144f
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/displaychannelback.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/displaychanneltop.png b/skins/nopacity/themes/darkred/skinparts/displaychanneltop.png
new file mode 100644
index 0000000..38a99f8
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/displaychanneltop.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/displayreplayback.png b/skins/nopacity/themes/darkred/skinparts/displayreplayback.png
new file mode 100644
index 0000000..923dedb
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/displayreplayback.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/displayvolume.png b/skins/nopacity/themes/darkred/skinparts/displayvolume.png
new file mode 100644
index 0000000..8e81f14
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/displayvolume.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/header_mirroredback.png b/skins/nopacity/themes/darkred/skinparts/header_mirroredback.png
new file mode 100644
index 0000000..42919d9
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/header_mirroredback.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/header_mirroredtop.png b/skins/nopacity/themes/darkred/skinparts/header_mirroredtop.png
new file mode 100644
index 0000000..16053e9
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/header_mirroredtop.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/headerback.png b/skins/nopacity/themes/darkred/skinparts/headerback.png
new file mode 100644
index 0000000..dafff9e
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/headerback.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/headertop.png b/skins/nopacity/themes/darkred/skinparts/headertop.png
new file mode 100644
index 0000000..d6eb813
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/headertop.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/menubutton.png b/skins/nopacity/themes/darkred/skinparts/menubutton.png
new file mode 100644
index 0000000..4afbbbb
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/menubutton.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/menubuttonactive.png b/skins/nopacity/themes/darkred/skinparts/menubuttonactive.png
new file mode 100644
index 0000000..b461791
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/menubuttonactive.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/menubuttondefault.png b/skins/nopacity/themes/darkred/skinparts/menubuttondefault.png
new file mode 100644
index 0000000..9ef37ec
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/menubuttondefault.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/menubuttondefaultactive.png b/skins/nopacity/themes/darkred/skinparts/menubuttondefaultactive.png
new file mode 100644
index 0000000..09ab466
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/menubuttondefaultactive.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/messageError.png b/skins/nopacity/themes/darkred/skinparts/messageError.png
new file mode 100644
index 0000000..e6047f0
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/messageError.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/messageInfo.png b/skins/nopacity/themes/darkred/skinparts/messageInfo.png
new file mode 100644
index 0000000..d335003
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/messageInfo.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/messageStatus.png b/skins/nopacity/themes/darkred/skinparts/messageStatus.png
new file mode 100644
index 0000000..f455b5d
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/messageStatus.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/messageWarning.png b/skins/nopacity/themes/darkred/skinparts/messageWarning.png
new file mode 100644
index 0000000..32e1598
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/messageWarning.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/scrollbar.png b/skins/nopacity/themes/darkred/skinparts/scrollbar.png
new file mode 100644
index 0000000..2243776
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/scrollbar.png differ
diff --git a/skins/nopacity/themes/darkred/skinparts/signal.png b/skins/nopacity/themes/darkred/skinparts/signal.png
new file mode 100644
index 0000000..4f03c7a
Binary files /dev/null and b/skins/nopacity/themes/darkred/skinparts/signal.png differ
diff --git a/skins/nopacity/themes/darkred/theme.xml b/skins/nopacity/themes/darkred/theme.xml
new file mode 100644
index 0000000..56b7df4
--- /dev/null
+++ b/skins/nopacity/themes/darkred/theme.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE globals SYSTEM "../../../../dtd/globals.dtd">
+
+<globals>
+ <colors>
+ <color name="clrRed">FFFF0000</color>
+ <color name="clrGreen">FF5FE200</color>
+ <color name="clrYellow">FFE2DA00</color>
+ <color name="clrBlue">FF007FE2</color>
+ <color name="clrWhite">FFFFFFFF</color>
+ <color name="clrTransWhite">99FFFFFF</color>
+ <color name="clrBlack">FF000000</color>
+ <color name="clrProgressbar">FF3D0000</color>
+ <color name="clrScrollbar">FF3D0000</color>
+ <color name="clrBorder">FF2B0000</color>
+ <color name="clrGray">FF858585</color>
+ <color name="clrBackground">B0000000</color>
+ <color name="clrTransBlack">99000000</color>
+ <color name="clrTransBlackDark">DF000000</color>
+ <color name="clrTransRed">99FF0000</color>
+ <color name="clrFontMenuItem">FFFFFFFF</color>
+ <color name="clrFontMenuItemSelected">FFFFFFFF</color>
+ <color name="clrFontInactive">FF858585</color>
+ <color name="clrTransparent">00000000</color>
+ </colors>
+ <variables>
+ </variables>
+</globals>
diff --git a/skins/nopacity/themes/default/icons/clear-day.png b/skins/nopacity/themes/default/icons/clear-day.png
new file mode 100644
index 0000000..2b06a14
Binary files /dev/null and b/skins/nopacity/themes/default/icons/clear-day.png differ
diff --git a/skins/nopacity/themes/default/icons/clear-night.png b/skins/nopacity/themes/default/icons/clear-night.png
new file mode 100644
index 0000000..9bbe49f
Binary files /dev/null and b/skins/nopacity/themes/default/icons/clear-night.png differ
diff --git a/skins/nopacity/themes/default/icons/cloudy.png b/skins/nopacity/themes/default/icons/cloudy.png
new file mode 100644
index 0000000..9870c7f
Binary files /dev/null and b/skins/nopacity/themes/default/icons/cloudy.png differ
diff --git a/skins/nopacity/themes/default/icons/fog.png b/skins/nopacity/themes/default/icons/fog.png
new file mode 100644
index 0000000..9bc88d2
Binary files /dev/null and b/skins/nopacity/themes/default/icons/fog.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_ac3.png b/skins/nopacity/themes/default/icons/ico_ac3.png
new file mode 100644
index 0000000..5b8614a
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_ac3.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_activetimer.png b/skins/nopacity/themes/default/icons/ico_activetimer.png
new file mode 100644
index 0000000..af4c33c
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_activetimer.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_arrow_left_channelsep.png b/skins/nopacity/themes/default/icons/ico_arrow_left_channelsep.png
new file mode 100644
index 0000000..642cd78
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_arrow_left_channelsep.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_arrow_right_channelsep.png b/skins/nopacity/themes/default/icons/ico_arrow_right_channelsep.png
new file mode 100644
index 0000000..1418671
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_arrow_right_channelsep.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_channelsep.png b/skins/nopacity/themes/default/icons/ico_channelsep.png
new file mode 100644
index 0000000..bf51238
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_channelsep.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_cutted.png b/skins/nopacity/themes/default/icons/ico_cutted.png
new file mode 100644
index 0000000..b90c9c1
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_cutted.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_daydelimiter.png b/skins/nopacity/themes/default/icons/ico_daydelimiter.png
new file mode 100644
index 0000000..7ae6053
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_daydelimiter.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_discusage.png b/skins/nopacity/themes/default/icons/ico_discusage.png
new file mode 100644
index 0000000..f40fcd9
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_discusage.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_dolbyoff.png b/skins/nopacity/themes/default/icons/ico_dolbyoff.png
new file mode 100644
index 0000000..ef4f17c
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_dolbyoff.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_dolbyon.png b/skins/nopacity/themes/default/icons/ico_dolbyon.png
new file mode 100644
index 0000000..1278abe
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_dolbyon.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_encrypted.png b/skins/nopacity/themes/default/icons/ico_encrypted.png
new file mode 100644
index 0000000..2b6345a
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_encrypted.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_ff.png b/skins/nopacity/themes/default/icons/ico_ff.png
new file mode 100644
index 0000000..3dea9d3
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_ff.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_ff_1x.png b/skins/nopacity/themes/default/icons/ico_ff_1x.png
new file mode 100644
index 0000000..599256e
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_ff_1x.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_ff_2x.png b/skins/nopacity/themes/default/icons/ico_ff_2x.png
new file mode 100644
index 0000000..3eec356
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_ff_2x.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_ff_3x.png b/skins/nopacity/themes/default/icons/ico_ff_3x.png
new file mode 100644
index 0000000..f686658
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_ff_3x.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_ff_off.png b/skins/nopacity/themes/default/icons/ico_ff_off.png
new file mode 100644
index 0000000..cb551c2
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_ff_off.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_fta.png b/skins/nopacity/themes/default/icons/ico_fta.png
new file mode 100644
index 0000000..55e3789
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_fta.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_hd1080i.png b/skins/nopacity/themes/default/icons/ico_hd1080i.png
new file mode 100644
index 0000000..27b85ab
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_hd1080i.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_hd720p.png b/skins/nopacity/themes/default/icons/ico_hd720p.png
new file mode 100644
index 0000000..47317d8
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_hd720p.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_mute.png b/skins/nopacity/themes/default/icons/ico_mute.png
new file mode 100644
index 0000000..4eefc75
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_mute.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_pause.png b/skins/nopacity/themes/default/icons/ico_pause.png
new file mode 100644
index 0000000..cd8cad8
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_pause.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_pause_off.png b/skins/nopacity/themes/default/icons/ico_pause_off.png
new file mode 100644
index 0000000..f9a9d94
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_pause_off.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_play.png b/skins/nopacity/themes/default/icons/ico_play.png
new file mode 100644
index 0000000..4cc0541
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_play.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_play_off.png b/skins/nopacity/themes/default/icons/ico_play_off.png
new file mode 100644
index 0000000..7fb820a
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_play_off.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_recfolder.png b/skins/nopacity/themes/default/icons/ico_recfolder.png
new file mode 100644
index 0000000..e3df65b
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_recfolder.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_recnew.png b/skins/nopacity/themes/default/icons/ico_recnew.png
new file mode 100644
index 0000000..b9166ba
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_recnew.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_recoff.png b/skins/nopacity/themes/default/icons/ico_recoff.png
new file mode 100644
index 0000000..4f59218
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_recoff.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_recon.png b/skins/nopacity/themes/default/icons/ico_recon.png
new file mode 100644
index 0000000..14fe7be
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_recon.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_rew.png b/skins/nopacity/themes/default/icons/ico_rew.png
new file mode 100644
index 0000000..72408d0
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_rew.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_rew_1x.png b/skins/nopacity/themes/default/icons/ico_rew_1x.png
new file mode 100644
index 0000000..333c30d
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_rew_1x.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_rew_2x.png b/skins/nopacity/themes/default/icons/ico_rew_2x.png
new file mode 100644
index 0000000..c5d1084
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_rew_2x.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_rew_3x.png b/skins/nopacity/themes/default/icons/ico_rew_3x.png
new file mode 100644
index 0000000..6ab7a8d
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_rew_3x.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_rew_off.png b/skins/nopacity/themes/default/icons/ico_rew_off.png
new file mode 100644
index 0000000..ce18386
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_rew_off.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_sd576i.png b/skins/nopacity/themes/default/icons/ico_sd576i.png
new file mode 100644
index 0000000..994a7a2
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_sd576i.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_stereo.png b/skins/nopacity/themes/default/icons/ico_stereo.png
new file mode 100644
index 0000000..7f3610d
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_stereo.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_stereooff.png b/skins/nopacity/themes/default/icons/ico_stereooff.png
new file mode 100644
index 0000000..569a342
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_stereooff.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_stereoon.png b/skins/nopacity/themes/default/icons/ico_stereoon.png
new file mode 100644
index 0000000..eb838b9
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_stereoon.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_timer_active.png b/skins/nopacity/themes/default/icons/ico_timer_active.png
new file mode 100644
index 0000000..28c2f81
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_timer_active.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_timer_inactive.png b/skins/nopacity/themes/default/icons/ico_timer_inactive.png
new file mode 100644
index 0000000..c4b1860
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_timer_inactive.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_timer_recording.png b/skins/nopacity/themes/default/icons/ico_timer_recording.png
new file mode 100644
index 0000000..86dc66b
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_timer_recording.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_txtoff.png b/skins/nopacity/themes/default/icons/ico_txtoff.png
new file mode 100644
index 0000000..3b2eac3
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_txtoff.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_txton.png b/skins/nopacity/themes/default/icons/ico_txton.png
new file mode 100644
index 0000000..148f9ef
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_txton.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_vdrlogo.png b/skins/nopacity/themes/default/icons/ico_vdrlogo.png
new file mode 100644
index 0000000..200cea7
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_vdrlogo.png differ
diff --git a/skins/nopacity/themes/default/icons/ico_volume.png b/skins/nopacity/themes/default/icons/ico_volume.png
new file mode 100644
index 0000000..3a72514
Binary files /dev/null and b/skins/nopacity/themes/default/icons/ico_volume.png differ
diff --git a/skins/nopacity/themes/default/icons/partly-cloudy-day.png b/skins/nopacity/themes/default/icons/partly-cloudy-day.png
new file mode 100644
index 0000000..b6df179
Binary files /dev/null and b/skins/nopacity/themes/default/icons/partly-cloudy-day.png differ
diff --git a/skins/nopacity/themes/default/icons/partly-cloudy-night.png b/skins/nopacity/themes/default/icons/partly-cloudy-night.png
new file mode 100644
index 0000000..aa358fb
Binary files /dev/null and b/skins/nopacity/themes/default/icons/partly-cloudy-night.png differ
diff --git a/skins/nopacity/themes/default/icons/rain.png b/skins/nopacity/themes/default/icons/rain.png
new file mode 100644
index 0000000..8275003
Binary files /dev/null and b/skins/nopacity/themes/default/icons/rain.png differ
diff --git a/skins/nopacity/themes/default/icons/sleet.png b/skins/nopacity/themes/default/icons/sleet.png
new file mode 100644
index 0000000..1d99ae0
Binary files /dev/null and b/skins/nopacity/themes/default/icons/sleet.png differ
diff --git a/skins/nopacity/themes/default/icons/snow.png b/skins/nopacity/themes/default/icons/snow.png
new file mode 100644
index 0000000..939e22f
Binary files /dev/null and b/skins/nopacity/themes/default/icons/snow.png differ
diff --git a/skins/nopacity/themes/default/icons/wind.png b/skins/nopacity/themes/default/icons/wind.png
new file mode 100644
index 0000000..d92ec15
Binary files /dev/null and b/skins/nopacity/themes/default/icons/wind.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Applikationen.png b/skins/nopacity/themes/default/menuicons/customicons/Applikationen.png
new file mode 100644
index 0000000..3c3b616
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Applikationen.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Audio.png b/skins/nopacity/themes/default/menuicons/customicons/Audio.png
new file mode 100644
index 0000000..ff387fe
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Audio.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Aufnahmen-Liste aktualisieren.png b/skins/nopacity/themes/default/menuicons/customicons/Aufnahmen-Liste aktualisieren.png
new file mode 100644
index 0000000..3cdddc9
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Aufnahmen-Liste aktualisieren.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Dienstprogramme.png b/skins/nopacity/themes/default/menuicons/customicons/Dienstprogramme.png
new file mode 100644
index 0000000..793aba6
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Dienstprogramme.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/FireFox.png b/skins/nopacity/themes/default/menuicons/customicons/FireFox.png
new file mode 100644
index 0000000..192fadc
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/FireFox.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Info.png b/skins/nopacity/themes/default/menuicons/customicons/Info.png
new file mode 100644
index 0000000..6737431
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Info.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Internet.png b/skins/nopacity/themes/default/menuicons/customicons/Internet.png
new file mode 100644
index 0000000..f3db150
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Internet.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Medien.png b/skins/nopacity/themes/default/menuicons/customicons/Medien.png
new file mode 100644
index 0000000..0ce2360
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Medien.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Rechner neu starten.png b/skins/nopacity/themes/default/menuicons/customicons/Rechner neu starten.png
new file mode 100644
index 0000000..5783ccf
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Rechner neu starten.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Remote wakeup.png b/skins/nopacity/themes/default/menuicons/customicons/Remote wakeup.png
new file mode 100644
index 0000000..1cd2f6e
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Remote wakeup.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Spiele.png b/skins/nopacity/themes/default/menuicons/customicons/Spiele.png
new file mode 100644
index 0000000..8e07161
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Spiele.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/System herunterfahren.png b/skins/nopacity/themes/default/menuicons/customicons/System herunterfahren.png
new file mode 100644
index 0000000..e0234df
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/System herunterfahren.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/System.png b/skins/nopacity/themes/default/menuicons/customicons/System.png
new file mode 100644
index 0000000..81d100e
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/System.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Tools.png b/skins/nopacity/themes/default/menuicons/customicons/Tools.png
new file mode 100644
index 0000000..cf328ef
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Tools.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Tunderbird.png b/skins/nopacity/themes/default/menuicons/customicons/Tunderbird.png
new file mode 100644
index 0000000..5ae27e0
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Tunderbird.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/USB Massenspeicher sicher entfernen.png b/skins/nopacity/themes/default/menuicons/customicons/USB Massenspeicher sicher entfernen.png
new file mode 100644
index 0000000..cd7b81c
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/USB Massenspeicher sicher entfernen.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/VDR neu starten.png b/skins/nopacity/themes/default/menuicons/customicons/VDR neu starten.png
new file mode 100644
index 0000000..14904ca
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/VDR neu starten.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Video.png b/skins/nopacity/themes/default/menuicons/customicons/Video.png
new file mode 100644
index 0000000..490ca4b
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Video.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Web.png b/skins/nopacity/themes/default/menuicons/customicons/Web.png
new file mode 100644
index 0000000..20260e3
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Web.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/XBMC.png b/skins/nopacity/themes/default/menuicons/customicons/XBMC.png
new file mode 100644
index 0000000..c7c4c04
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/XBMC.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/Xterm.png b/skins/nopacity/themes/default/menuicons/customicons/Xterm.png
new file mode 100644
index 0000000..fa75282
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/Xterm.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/audiovideo.png b/skins/nopacity/themes/default/menuicons/customicons/audiovideo.png
new file mode 100644
index 0000000..726538d
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/audiovideo.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/markad_status.png b/skins/nopacity/themes/default/menuicons/customicons/markad_status.png
new file mode 100644
index 0000000..4fdc7a4
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/markad_status.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/schneiden_abbrechen.png b/skins/nopacity/themes/default/menuicons/customicons/schneiden_abbrechen.png
new file mode 100644
index 0000000..b2e0bd3
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/schneiden_abbrechen.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/tux.png b/skins/nopacity/themes/default/menuicons/customicons/tux.png
new file mode 100644
index 0000000..c5b4742
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/tux.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/usb.png b/skins/nopacity/themes/default/menuicons/customicons/usb.png
new file mode 100644
index 0000000..c4db1d4
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/usb.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/vdrlogo.png b/skins/nopacity/themes/default/menuicons/customicons/vdrlogo.png
new file mode 100644
index 0000000..037a191
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/vdrlogo.png differ
diff --git a/skins/nopacity/themes/default/menuicons/customicons/yaicon_blue.png b/skins/nopacity/themes/default/menuicons/customicons/yaicon_blue.png
new file mode 100644
index 0000000..2c49273
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/customicons/yaicon_blue.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/admin.png b/skins/nopacity/themes/default/menuicons/pluginicons/admin.png
new file mode 100644
index 0000000..cf328ef
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/admin.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/arghdirector.png b/skins/nopacity/themes/default/menuicons/pluginicons/arghdirector.png
new file mode 100644
index 0000000..bbd221a
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/arghdirector.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/autostart.png b/skins/nopacity/themes/default/menuicons/pluginicons/autostart.png
new file mode 100644
index 0000000..6fdb1bb
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/autostart.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/avahi4vdr.png b/skins/nopacity/themes/default/menuicons/pluginicons/avahi4vdr.png
new file mode 100644
index 0000000..044e71d
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/avahi4vdr.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/avards.png b/skins/nopacity/themes/default/menuicons/pluginicons/avards.png
new file mode 100644
index 0000000..cf8d037
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/avards.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/block.png b/skins/nopacity/themes/default/menuicons/pluginicons/block.png
new file mode 100644
index 0000000..86127c2
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/block.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/burn.png b/skins/nopacity/themes/default/menuicons/pluginicons/burn.png
new file mode 100644
index 0000000..305d7ff
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/burn.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/cdplayer.png b/skins/nopacity/themes/default/menuicons/pluginicons/cdplayer.png
new file mode 100644
index 0000000..89a6c19
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/cdplayer.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/chanman.png b/skins/nopacity/themes/default/menuicons/pluginicons/chanman.png
new file mode 100644
index 0000000..a73e83c
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/chanman.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/check.png b/skins/nopacity/themes/default/menuicons/pluginicons/check.png
new file mode 100644
index 0000000..d487a24
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/check.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/conflictcheckonly.png b/skins/nopacity/themes/default/menuicons/pluginicons/conflictcheckonly.png
new file mode 100644
index 0000000..7f832bd
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/conflictcheckonly.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/ddci.png b/skins/nopacity/themes/default/menuicons/pluginicons/ddci.png
new file mode 100644
index 0000000..4ad459c
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/ddci.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/devstatus.png b/skins/nopacity/themes/default/menuicons/pluginicons/devstatus.png
new file mode 100644
index 0000000..96c0ec1
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/devstatus.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/dummydevice.png b/skins/nopacity/themes/default/menuicons/pluginicons/dummydevice.png
new file mode 100644
index 0000000..11fd707
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/dummydevice.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/duplicates.png b/skins/nopacity/themes/default/menuicons/pluginicons/duplicates.png
new file mode 100644
index 0000000..dc1be57
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/duplicates.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/dvbapi.png b/skins/nopacity/themes/default/menuicons/pluginicons/dvbapi.png
new file mode 100644
index 0000000..b966461
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/dvbapi.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/dvbhddevice.png b/skins/nopacity/themes/default/menuicons/pluginicons/dvbhddevice.png
new file mode 100644
index 0000000..b874297
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/dvbhddevice.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/dvbsddevice.png b/skins/nopacity/themes/default/menuicons/pluginicons/dvbsddevice.png
new file mode 100644
index 0000000..106184e
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/dvbsddevice.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/dynamite.png b/skins/nopacity/themes/default/menuicons/pluginicons/dynamite.png
new file mode 100644
index 0000000..28ea35a
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/dynamite.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/eepg.png b/skins/nopacity/themes/default/menuicons/pluginicons/eepg.png
new file mode 100644
index 0000000..3938b96
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/eepg.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/epg2vdr.png b/skins/nopacity/themes/default/menuicons/pluginicons/epg2vdr.png
new file mode 100644
index 0000000..ac8757e
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/epg2vdr.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/epgsearch.png b/skins/nopacity/themes/default/menuicons/pluginicons/epgsearch.png
new file mode 100644
index 0000000..5eab415
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/epgsearch.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/epgsearchonly.png b/skins/nopacity/themes/default/menuicons/pluginicons/epgsearchonly.png
new file mode 100644
index 0000000..b5186e7
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/epgsearchonly.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/epgsync.png b/skins/nopacity/themes/default/menuicons/pluginicons/epgsync.png
new file mode 100644
index 0000000..5c14009
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/epgsync.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/externalplayer.png b/skins/nopacity/themes/default/menuicons/pluginicons/externalplayer.png
new file mode 100644
index 0000000..2bd67db
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/externalplayer.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/extrecmenu.png b/skins/nopacity/themes/default/menuicons/pluginicons/extrecmenu.png
new file mode 100644
index 0000000..6f613f1
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/extrecmenu.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/favorites.png b/skins/nopacity/themes/default/menuicons/pluginicons/favorites.png
new file mode 100644
index 0000000..409c852
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/favorites.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/femon.png b/skins/nopacity/themes/default/menuicons/pluginicons/femon.png
new file mode 100644
index 0000000..e87b711
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/femon.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/fepg.png b/skins/nopacity/themes/default/menuicons/pluginicons/fepg.png
new file mode 100644
index 0000000..65023ed
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/fepg.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/filebrowser.png b/skins/nopacity/themes/default/menuicons/pluginicons/filebrowser.png
new file mode 100644
index 0000000..d3f90e0
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/filebrowser.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/fritzbox.png b/skins/nopacity/themes/default/menuicons/pluginicons/fritzbox.png
new file mode 100644
index 0000000..7bfc229
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/fritzbox.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/graphlcd.png b/skins/nopacity/themes/default/menuicons/pluginicons/graphlcd.png
new file mode 100644
index 0000000..39ffd35
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/graphlcd.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/graphtft.png b/skins/nopacity/themes/default/menuicons/pluginicons/graphtft.png
new file mode 100644
index 0000000..39ffd35
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/graphtft.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/image.png b/skins/nopacity/themes/default/menuicons/pluginicons/image.png
new file mode 100644
index 0000000..33644e0
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/image.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/imonlcd.png b/skins/nopacity/themes/default/menuicons/pluginicons/imonlcd.png
new file mode 100644
index 0000000..3d34fc4
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/imonlcd.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/iptv.png b/skins/nopacity/themes/default/menuicons/pluginicons/iptv.png
new file mode 100644
index 0000000..4494ddc
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/iptv.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/lcdproc.png b/skins/nopacity/themes/default/menuicons/pluginicons/lcdproc.png
new file mode 100644
index 0000000..3d34fc4
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/lcdproc.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/mailbox.png b/skins/nopacity/themes/default/menuicons/pluginicons/mailbox.png
new file mode 100644
index 0000000..1bc76e8
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/mailbox.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/makemkv.png b/skins/nopacity/themes/default/menuicons/pluginicons/makemkv.png
new file mode 100644
index 0000000..41cddf1
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/makemkv.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/markad.png b/skins/nopacity/themes/default/menuicons/pluginicons/markad.png
new file mode 100644
index 0000000..b3defaf
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/markad.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/mlist.png b/skins/nopacity/themes/default/menuicons/pluginicons/mlist.png
new file mode 100644
index 0000000..19c367f
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/mlist.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/music.png b/skins/nopacity/themes/default/menuicons/pluginicons/music.png
new file mode 100644
index 0000000..abb012e
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/music.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/noepg.png b/skins/nopacity/themes/default/menuicons/pluginicons/noepg.png
new file mode 100644
index 0000000..eb9410d
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/noepg.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/nordlichtsepg.png b/skins/nopacity/themes/default/menuicons/pluginicons/nordlichtsepg.png
new file mode 100644
index 0000000..3ee3fa2
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/nordlichtsepg.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/osdteletext.png b/skins/nopacity/themes/default/menuicons/pluginicons/osdteletext.png
new file mode 100644
index 0000000..664e770
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/osdteletext.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/peer.png b/skins/nopacity/themes/default/menuicons/pluginicons/peer.png
new file mode 100644
index 0000000..998d568
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/peer.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/play.png b/skins/nopacity/themes/default/menuicons/pluginicons/play.png
new file mode 100644
index 0000000..2848fc6
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/play.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/pvrinput.png b/skins/nopacity/themes/default/menuicons/pluginicons/pvrinput.png
new file mode 100644
index 0000000..724f698
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/pvrinput.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/quickepgsearch.png b/skins/nopacity/themes/default/menuicons/pluginicons/quickepgsearch.png
new file mode 100644
index 0000000..76a31f4
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/quickepgsearch.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/radio.png b/skins/nopacity/themes/default/menuicons/pluginicons/radio.png
new file mode 100644
index 0000000..193b7d4
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/radio.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/remote.png b/skins/nopacity/themes/default/menuicons/pluginicons/remote.png
new file mode 100644
index 0000000..7f46b1b
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/remote.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/remotetimers.png b/skins/nopacity/themes/default/menuicons/pluginicons/remotetimers.png
new file mode 100644
index 0000000..fae3b79
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/remotetimers.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/rssreader.png b/skins/nopacity/themes/default/menuicons/pluginicons/rssreader.png
new file mode 100644
index 0000000..db538f0
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/rssreader.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/sc.png b/skins/nopacity/themes/default/menuicons/pluginicons/sc.png
new file mode 100644
index 0000000..2472d6c
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/sc.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/screenshot.png b/skins/nopacity/themes/default/menuicons/pluginicons/screenshot.png
new file mode 100644
index 0000000..be9b4d5
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/screenshot.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/seduatmo.png b/skins/nopacity/themes/default/menuicons/pluginicons/seduatmo.png
new file mode 100644
index 0000000..4b5292f
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/seduatmo.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/skyselectfeeds.png b/skins/nopacity/themes/default/menuicons/pluginicons/skyselectfeeds.png
new file mode 100644
index 0000000..d81a024
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/skyselectfeeds.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/sleeptimer.png b/skins/nopacity/themes/default/menuicons/pluginicons/sleeptimer.png
new file mode 100644
index 0000000..cd4956f
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/sleeptimer.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/softhddevice.png b/skins/nopacity/themes/default/menuicons/pluginicons/softhddevice.png
new file mode 100644
index 0000000..df13f2c
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/softhddevice.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/streamdev-server.png b/skins/nopacity/themes/default/menuicons/pluginicons/streamdev-server.png
new file mode 100644
index 0000000..e89ed8b
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/streamdev-server.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/systeminfo.png b/skins/nopacity/themes/default/menuicons/pluginicons/systeminfo.png
new file mode 100644
index 0000000..b14763f
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/systeminfo.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/targavfd.png b/skins/nopacity/themes/default/menuicons/pluginicons/targavfd.png
new file mode 100644
index 0000000..e91b111
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/targavfd.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/trayopenng.png b/skins/nopacity/themes/default/menuicons/pluginicons/trayopenng.png
new file mode 100644
index 0000000..6ebd17d
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/trayopenng.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/tvguide.png b/skins/nopacity/themes/default/menuicons/pluginicons/tvguide.png
new file mode 100644
index 0000000..968a37c
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/tvguide.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/tvm2vdr.png b/skins/nopacity/themes/default/menuicons/pluginicons/tvm2vdr.png
new file mode 100644
index 0000000..47f9a91
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/tvm2vdr.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/tvscraper.png b/skins/nopacity/themes/default/menuicons/pluginicons/tvscraper.png
new file mode 100644
index 0000000..a106cb5
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/tvscraper.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/undelete.png b/skins/nopacity/themes/default/menuicons/pluginicons/undelete.png
new file mode 100644
index 0000000..a53d50a
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/undelete.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/weatherforecast.png b/skins/nopacity/themes/default/menuicons/pluginicons/weatherforecast.png
new file mode 100644
index 0000000..a88f11d
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/weatherforecast.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/weatherng.png b/skins/nopacity/themes/default/menuicons/pluginicons/weatherng.png
new file mode 100644
index 0000000..a88f11d
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/weatherng.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/xmltv2vdr.png b/skins/nopacity/themes/default/menuicons/pluginicons/xmltv2vdr.png
new file mode 100644
index 0000000..ea73c74
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/xmltv2vdr.png differ
diff --git a/skins/nopacity/themes/default/menuicons/pluginicons/yaepghg.png b/skins/nopacity/themes/default/menuicons/pluginicons/yaepghg.png
new file mode 100644
index 0000000..53ce443
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/pluginicons/yaepghg.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/CAM.png b/skins/nopacity/themes/default/menuicons/standardicons/CAM.png
new file mode 100644
index 0000000..a394877
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/CAM.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Channels.png b/skins/nopacity/themes/default/menuicons/standardicons/Channels.png
new file mode 100644
index 0000000..ba2ba78
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Channels.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Commands.png b/skins/nopacity/themes/default/menuicons/standardicons/Commands.png
new file mode 100644
index 0000000..c6a83ef
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Commands.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/DVB.png b/skins/nopacity/themes/default/menuicons/standardicons/DVB.png
new file mode 100644
index 0000000..3789145
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/DVB.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/EPG.png b/skins/nopacity/themes/default/menuicons/standardicons/EPG.png
new file mode 100644
index 0000000..e868b90
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/EPG.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/LNB.png b/skins/nopacity/themes/default/menuicons/standardicons/LNB.png
new file mode 100644
index 0000000..896dd99
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/LNB.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Miscellaneous.png b/skins/nopacity/themes/default/menuicons/standardicons/Miscellaneous.png
new file mode 100644
index 0000000..2a41c4d
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Miscellaneous.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/OSD.png b/skins/nopacity/themes/default/menuicons/standardicons/OSD.png
new file mode 100644
index 0000000..8f571c6
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/OSD.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Plugins.png b/skins/nopacity/themes/default/menuicons/standardicons/Plugins.png
new file mode 100644
index 0000000..3fcba70
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Plugins.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Recording.png b/skins/nopacity/themes/default/menuicons/standardicons/Recording.png
new file mode 100644
index 0000000..741b1af
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Recording.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Recordings.png b/skins/nopacity/themes/default/menuicons/standardicons/Recordings.png
new file mode 100644
index 0000000..79aeeb7
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Recordings.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Replay.png b/skins/nopacity/themes/default/menuicons/standardicons/Replay.png
new file mode 100644
index 0000000..621596c
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Replay.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Restart.png b/skins/nopacity/themes/default/menuicons/standardicons/Restart.png
new file mode 100644
index 0000000..aa23cd4
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Restart.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Schedule.png b/skins/nopacity/themes/default/menuicons/standardicons/Schedule.png
new file mode 100644
index 0000000..3a98cac
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Schedule.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Setup.png b/skins/nopacity/themes/default/menuicons/standardicons/Setup.png
new file mode 100644
index 0000000..d121148
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Setup.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/StopRecording.png b/skins/nopacity/themes/default/menuicons/standardicons/StopRecording.png
new file mode 100644
index 0000000..ed83fbb
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/StopRecording.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/StopReplay.png b/skins/nopacity/themes/default/menuicons/standardicons/StopReplay.png
new file mode 100644
index 0000000..9192760
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/StopReplay.png differ
diff --git a/skins/nopacity/themes/default/menuicons/standardicons/Timers.png b/skins/nopacity/themes/default/menuicons/standardicons/Timers.png
new file mode 100644
index 0000000..b866c36
Binary files /dev/null and b/skins/nopacity/themes/default/menuicons/standardicons/Timers.png differ
diff --git a/skins/nopacity/themes/default/skinparts/buttonblue.png b/skins/nopacity/themes/default/skinparts/buttonblue.png
new file mode 100644
index 0000000..d00e4d2
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/buttonblue.png differ
diff --git a/skins/nopacity/themes/default/skinparts/buttongreen.png b/skins/nopacity/themes/default/skinparts/buttongreen.png
new file mode 100644
index 0000000..8c05c08
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/buttongreen.png differ
diff --git a/skins/nopacity/themes/default/skinparts/buttonred.png b/skins/nopacity/themes/default/skinparts/buttonred.png
new file mode 100644
index 0000000..9367c9b
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/buttonred.png differ
diff --git a/skins/nopacity/themes/default/skinparts/buttonyellow.png b/skins/nopacity/themes/default/skinparts/buttonyellow.png
new file mode 100644
index 0000000..aff8758
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/buttonyellow.png differ
diff --git a/skins/nopacity/themes/default/skinparts/channellogoback.png b/skins/nopacity/themes/default/skinparts/channellogoback.png
new file mode 100644
index 0000000..b0e83b1
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/channellogoback.png differ
diff --git a/skins/nopacity/themes/default/skinparts/discpercent.png b/skins/nopacity/themes/default/skinparts/discpercent.png
new file mode 100644
index 0000000..cf32be2
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/discpercent.png differ
diff --git a/skins/nopacity/themes/default/skinparts/displaychannelback.png b/skins/nopacity/themes/default/skinparts/displaychannelback.png
new file mode 100644
index 0000000..1437384
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/displaychannelback.png differ
diff --git a/skins/nopacity/themes/default/skinparts/displaychanneltop.png b/skins/nopacity/themes/default/skinparts/displaychanneltop.png
new file mode 100644
index 0000000..5108435
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/displaychanneltop.png differ
diff --git a/skins/nopacity/themes/default/skinparts/displayreplayback.png b/skins/nopacity/themes/default/skinparts/displayreplayback.png
new file mode 100644
index 0000000..d72931f
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/displayreplayback.png differ
diff --git a/skins/nopacity/themes/default/skinparts/displayreplaytop.png b/skins/nopacity/themes/default/skinparts/displayreplaytop.png
new file mode 100644
index 0000000..064347e
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/displayreplaytop.png differ
diff --git a/skins/nopacity/themes/default/skinparts/displayvolume.png b/skins/nopacity/themes/default/skinparts/displayvolume.png
new file mode 100644
index 0000000..a5c4c66
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/displayvolume.png differ
diff --git a/skins/nopacity/themes/default/skinparts/headertop.png b/skins/nopacity/themes/default/skinparts/headertop.png
new file mode 100644
index 0000000..2bc19a6
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/headertop.png differ
diff --git a/skins/nopacity/themes/default/skinparts/menubutton.png b/skins/nopacity/themes/default/skinparts/menubutton.png
new file mode 100644
index 0000000..0800a5e
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/menubutton.png differ
diff --git a/skins/nopacity/themes/default/skinparts/menubuttonactive.png b/skins/nopacity/themes/default/skinparts/menubuttonactive.png
new file mode 100644
index 0000000..caae104
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/menubuttonactive.png differ
diff --git a/skins/nopacity/themes/default/skinparts/menubuttondefault.png b/skins/nopacity/themes/default/skinparts/menubuttondefault.png
new file mode 100644
index 0000000..76735de
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/menubuttondefault.png differ
diff --git a/skins/nopacity/themes/default/skinparts/menubuttondefaultactive.png b/skins/nopacity/themes/default/skinparts/menubuttondefaultactive.png
new file mode 100644
index 0000000..70c0b8a
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/menubuttondefaultactive.png differ
diff --git a/skins/nopacity/themes/default/skinparts/menubuttontop.png b/skins/nopacity/themes/default/skinparts/menubuttontop.png
new file mode 100644
index 0000000..1b49cfd
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/menubuttontop.png differ
diff --git a/skins/nopacity/themes/default/skinparts/messageError.png b/skins/nopacity/themes/default/skinparts/messageError.png
new file mode 100644
index 0000000..a894992
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/messageError.png differ
diff --git a/skins/nopacity/themes/default/skinparts/messageInfo.png b/skins/nopacity/themes/default/skinparts/messageInfo.png
new file mode 100644
index 0000000..5f8e62a
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/messageInfo.png differ
diff --git a/skins/nopacity/themes/default/skinparts/messageStatus.png b/skins/nopacity/themes/default/skinparts/messageStatus.png
new file mode 100644
index 0000000..f4b83f4
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/messageStatus.png differ
diff --git a/skins/nopacity/themes/default/skinparts/messageWarning.png b/skins/nopacity/themes/default/skinparts/messageWarning.png
new file mode 100644
index 0000000..f073ed5
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/messageWarning.png differ
diff --git a/skins/nopacity/themes/default/skinparts/scrollbar.png b/skins/nopacity/themes/default/skinparts/scrollbar.png
new file mode 100644
index 0000000..f822555
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/scrollbar.png differ
diff --git a/skins/nopacity/themes/default/skinparts/signal.png b/skins/nopacity/themes/default/skinparts/signal.png
new file mode 100644
index 0000000..4f03c7a
Binary files /dev/null and b/skins/nopacity/themes/default/skinparts/signal.png differ
diff --git a/skins/nopacity/themes/default/theme.xml b/skins/nopacity/themes/default/theme.xml
new file mode 100644
index 0000000..82c075c
--- /dev/null
+++ b/skins/nopacity/themes/default/theme.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE globals SYSTEM "../../../../dtd/globals.dtd">
+
+<globals>
+ <colors>
+ <color name="clrRed">FFFF0000</color>
+ <color name="clrGreen">FF5FE200</color>
+ <color name="clrYellow">FFE2DA00</color>
+ <color name="clrBlue">FF007FE2</color>
+ <color name="clrWhite">FFFFFFFF</color>
+ <color name="clrTransWhite">99FFFFFF</color>
+ <color name="clrBlack">FF000000</color>
+ <color name="clrProgressbar">FF8EAB21</color>
+ <color name="clrScrollbar">FF8EAB21</color>
+ <color name="clrBorder">FF4C5C11</color>
+ <color name="clrGray">FF858585</color>
+ <color name="clrBackground">B012273F</color>
+ <color name="clrTransBlack">99000000</color>
+ <color name="clrTransBlackDark">CC000000</color>
+ <color name="clrTransRed">99FF0000</color>
+ <color name="clrFontMenuItem">FFFFFFFF</color>
+ <color name="clrFontMenuItemSelected">FF363636</color>
+ <color name="clrFontInactive">FF858585</color>
+ <color name="clrTransparent">00000000</color>
+ </colors>
+ <variables>
+ </variables>
+</globals>
diff --git a/skins/nopacity/xmlfiles/displayaudiotracks.xml b/skins/nopacity/xmlfiles/displayaudiotracks.xml
new file mode 100644
index 0000000..b141439
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displayaudiotracks.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayaudiotracks SYSTEM "../../../dtd/displayaudiotracks.dtd">
+
+<displayaudiotracks x="25%" y="0" width="50%" height="100%" fadetime="{fadeTime}">
+ <!-- Available Variables background:
+ {numtracks} number of displayed tracks
+ -->
+ <background>
+ <area x="0" y="{areaheight} - {numtracks} * {areaheight} / 10 - {areaheight} / 10" width="100%" height="{areaheight} / 10 + {areaheight} / 10 * {numtracks}" layer="1">
+ <fill color="{clrTransBlack}" />
+ </area>
+ </background>
+
+ <!-- Available Variables header:
+ {numtracks} number of displayed tracks
+ {title} title of menu
+ -->
+ <header>
+ <area x="0" y="{areaheight} - {numtracks} * {areaheight} / 10 - {areaheight} / 10" width="100%" height="{areaheight} / 10" layer="2">
+ <drawtext x="10" valign="center" font="{vdrOsd}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ <drawimage condition="{isstereo}" imagetype="icon" path="ico_stereo" x="{areawidth} - {areaheight}*0.9" valign="center" width="{areaheight}*0.9" height="{areaheight}*0.9"/>
+ <drawimage condition="{isac3}" imagetype="icon" path="ico_ac3" x="{areawidth} - {areaheight}*0.9" valign="center" width="{areaheight}*0.9" height="{areaheight}*0.9"/>
+ </area>
+ </header>
+
+ <!-- Available Variables header:
+ {numelements} number of displayed tracks
+ -->
+ <menuitems x="0" y="{areaheight} - {numelements} * {areaheight} / 10" orientation="vertical" width="100%" height="{numelements} * {areaheight} / 10" align="top" numlistelements="{numelements}">
+ <!-- Available Variables auidotrack listelement:
+ {current} true if item is currently selected
+ {title} title of auio track
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="1%" width="98%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <area x="1%" width="98%" layer="3">
+ <drawtext x="10" valign="center" font="{vdrOsd}" fontsize="60%" color="{clrWhite}" text="{title}" />
+ </area>
+ </listelement>
+ </menuitems>
+
+</displayaudiotracks>
diff --git a/skins/nopacity/xmlfiles/displaychannel.xml b/skins/nopacity/xmlfiles/displaychannel.xml
new file mode 100644
index 0000000..354e1a7
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaychannel.xml
@@ -0,0 +1,225 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaychannel SYSTEM "../../../dtd/displaychannel.dtd">
+
+<displaychannel x="0" y="0" width="100%" height="100%" fadetime="{fadeTime}">
+
+ <background>
+ <area x="1%" y="74%" width="98%" height="25%" layer="1" transparency="{transparency}">
+ <drawimage imagetype="skinpart" path="displaychannelback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="1%" y="74%" width="98%" height="25%" layer="7">
+ <drawimage imagetype="skinpart" path="displaychanneltop" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="2%" y="80%" width="14%" height="18%" layer="2">
+ <drawimage imagetype="skinpart" path="channellogoback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+ <!-- Available Variables channelinfo:
+ {channelnumber} Number of Channel, with "-" in case of channel switching
+ {channelname} Name of current Channel
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {switching} true if a number is pressed on the remote to switch to a dedicated channel
+ -->
+ <channelinfo>
+ <area x="2%" y="80%" width="14%" height="18%" layer="3">
+ <drawimage cache="true" imagetype="channellogo" path="{channelid}" width="94%" height="94%" align="center" valign="center"/>
+ </area>
+ <area x="18%" y="74%" width="42%" height="6%" layer="2">
+ <drawtext x="0" valign="center" font="{vdrOsd}" fontsize="95%" width="100%" color="{clrWhite}" text="{channelnumber} {channelname}" />
+ </area>
+ </channelinfo>
+
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="78%" y="74%" width="20%" height="6%" layer="2">
+ <drawtext align="right" valign="center" font="{vdrOsd}" fontsize="70%" color="{clrWhite}" text="{daynameshort} {day}.{month} {time}" />
+ </area>
+ </datetime>
+
+ <currentweather>
+ <area condition="{showweather}" x="60%" y="74%" width="18%" height="6%" layer="2">
+ <drawimage name="weathericon" imagetype="icon" path="{icon}" x="{areawidth}/2 + {width(temperature)}/2 - {width(weathericon)}/2 + 5" valign="center" width="{areaheight}*0.7" height="{areaheight}*0.7"/>
+ <drawtext name="temperature" x="{areawidth}/2 - {width(temperature)}/2 - {width(weathericon)}/2" valign="center" font="{vdrOsd}" fontsize="70%" color="{clrWhite}" text="{temperature}°C" />
+ </area>
+ </currentweather>
+
+ <!-- Available Variables epginfo:
+ {currenttitle} Title of the current Schedule
+ {currentsubtitle} Subtitle of the current Schedule
+ {currentstart} Start of current Schedule in hh:mm
+ {currentstop} End of current Schedule in hh:mm
+ {currentduration} Duration of current Schedule in min
+ {currentelapsed} Elapsed time of current Schedule in min
+ {currentremaining} Remaining time of current Schedule in min
+ {currentrecording} true if current Schedule is recorded
+ {nexttitle} Title of next Schedule
+ {nextsubtitle} Subtitle of next Schedule
+ {nextstart} Start of next Schedule in hh:mm
+ {nextstop} Stop of next Schedule in hh:mm
+ {nextduration} Duration of next Schedule in min
+ {nextrecording} true if next Schedule will be recorded
+ -->
+ <epginfo>
+ <area x="18%" y="82%" width="68%" height="6%" layer="2">
+ <drawtext name="starttime" x="0" y="0" font="{vdrOsd}" fontsize="60%" color="{clrWhite}" text="{currentstart}" />
+ <drawtext x="{width(starttime)} + 15" y="0" width="{areawidth} - {width(starttime)} - 15" font="{vdrOsd}" fontsize="60%" color="{clrWhite}" text="{currenttitle}" />
+ <drawtext x="{width(starttime)} + 16" y="55%" width="{areawidth} - {width(starttime)} - 16" font="{vdrOsd}" fontsize="45%" color="{clrWhite}" text="{currentsubtitle}" />
+ </area>
+ <area x="86%" y="82%" width="11%" height="6%" layer="2">
+ <drawtext align="right" y="0" font="{vdrOsd}" fontsize="60%" color="{clrWhite}" text="{currentelapsed}/{currentduration}min" />
+ </area>
+ <area x="18%" y="88%" width="72%" height="6%" layer="2">
+ <drawtext name="starttime" x="0" y="0" font="{vdrOsd}" fontsize="60%" color="{clrGray}" text="{nextstart}" />
+ <drawtext x="{width(starttime)} + 15" y="0" width="{areawidth} - {width(starttime)} - 15" font="{vdrOsd}" fontsize="60%" color="{clrGray}" text="{nexttitle}" />
+ <drawtext x="{width(starttime)} + 16" y="55%" width="{areawidth} - {width(starttime)} - 16" font="{vdrOsd}" fontsize="45%" color="{clrGray}" text="{nextsubtitle}" />
+ </area>
+ <area x="90%" y="88%" width="7%" height="6%" layer="2">
+ <drawtext align="right" y="0" font="{vdrOsd}" fontsize="60%" color="{clrGray}" text="{nextduration}min" />
+ </area>
+ </epginfo>
+
+ <!-- Available Variables progressbar:
+ {start} Start of current Schedule in hh:mm
+ {stop} End of current Schedule in hh:mm
+ {duration} Total Duration of current Schedule in seconds
+ {elapsed} Elapsed time of current Schedule in seconds
+ {remaining} Remaining time of current Schedule in seconds
+ -->
+ <progressbar>
+ <area x="17%" y="80%" width="81%" height="2%" layer="2">
+ <drawellipse x="1" y="1" width="{areaheight}-2" height="{areaheight}-2" color="{clrProgressbar}" quadrant="0" />
+ <drawellipse x="1 + {elapsed}/{duration}*{areawidth} - {elapsed}/{duration}*{areaheight}" y="1" width="{areaheight}-2" height="{areaheight}-2" color="{clrProgressbar}" quadrant="0" />
+ <drawrectangle x="{areaheight}/2" y="1" width="{elapsed}/{duration}*{areawidth} - {elapsed}/{duration}*{areaheight}" height="{areaheight}-2" color="{clrProgressbar}" />
+ </area>
+ </progressbar>
+
+ <progressbarback>
+ <area x="17%" y="80%" width="81%" height="2%" layer="2">
+ <drawellipse x="0" y="0" width="{areaheight}" height="{areaheight}" color="{clrBlack}" quadrant="0" />
+ <drawellipse x="{areawidth}-{areaheight}" y="0" width="{areaheight}" height="{areaheight}" color="{clrBlack}" quadrant="0" />
+ <drawrectangle x="{areaheight}/2" y="0" width="{areawidth} - {areaheight}" height="{areaheight}" color="{clrBlack}" />
+ </area>
+ </progressbarback>
+ <!-- Available Variables statusinfo:
+ {isRadio} true if channel is a radio channel
+ {hasVT} true if channel has video text
+ {isStereo} true if a stereo audio trac is available
+ {isDolby} true if a dolby audio track is available
+ {isEncrypted} true if channel is encrypted
+ {isRecording} true if currently a recording is running on this channel
+ -->
+ <statusinfo>
+ <area x="{areawidth}*0.98 - {areaheight}*0.40 - 25" y="93%" width="{areaheight}*0.25 + 20" height="5%" layer="2">
+ <drawimage condition="{hasVT}" imagetype="icon" path="ico_txton" x="0" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="not{hasVT}" imagetype="icon" path="ico_txtoff" x="0" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{isStereo}" imagetype="icon" path="ico_stereoon" x="{areaheight}+5" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="not{isStereo}" imagetype="icon" path="ico_stereooff" x="{areaheight}+5" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{isDolby}" imagetype="icon" path="ico_dolbyon" x="2*{areaheight}+10" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="not{isDolby}" imagetype="icon" path="ico_dolbyoff" x="2*{areaheight}+10" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{isEncrypted}" imagetype="icon" path="ico_encrypted" x="3*{areaheight}+15" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="not{isEncrypted}" imagetype="icon" path="ico_fta" x="3*{areaheight}+15" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{isRecording}" imagetype="icon" path="ico_recon" x="4*{areaheight}+20" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="not{isRecording}" imagetype="icon" path="ico_recoff" x="4*{areaheight}+20" y="0" width="{areaheight}" height="{areaheight}"/>
+ </area>
+ </statusinfo>
+
+ <!-- Available Variables screenresolution:
+ {screenwidth} width of currently displayed channel in px
+ {screenheight} height of currently displayed channel in px
+ {resolution} resolution: hd1080i, hd720p, sd576i
+ {aspect} screen aspect, each 4:3, 16:9 or 21:9
+ {isHD} true for hd1080i and hd720p
+ {isWideScreen} true if aspect is 16:9 or 21:9
+ -->
+ <screenresolution>
+ <area x="{areawidth}*0.98 - {areaheight}*0.15" y="93%" width="{areaheight}*0.15" height="5%" layer="2">
+ <drawimage imagetype="icon" path="ico_{resolution}" x="0" y="0" width="{areaheight}*3" height="{areaheight}"/>
+ </area>
+ </screenresolution>
+
+ <!-- Available Variables dvbdeviceinfo:
+ {prevAvailable} true if previous Channel Group is avaialble
+ {nextAvailable} true if next Channel Group is avaialble
+ {group} Name of current Channel Group
+ {nextgroup} Name of next Channel Group
+ {prevgroup} Name of prev Channel Group
+ {sepexists} true if a channel separator logo exists
+ {seppath} path for separator logo to use in imagetype "seplogo"
+ -->
+ <channelgroup>
+ <area x="2%" y="80%" width="14%" height="18%" layer="2">
+ <drawimage condition="{sepexists}" imagetype="seplogo" path="{seppath}" width="96%" height="96%" align="center" valign="center" />
+ <drawimage condition="not{sepexists}" imagetype="icon" path="ico_channelsep" align="center" valign="center" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
+ </area>
+ <area x="18%" y="82%" width="80%" height="10%" layer="2">
+ <drawtext x="0" width="25%" valign="center" font="{vdrOsd}" fontsize="60%" color="{clrWhite}" text="{prevgroup}" />
+ <drawtext x="30%" width="40%" valign="center" font="{vdrOsd}" fontsize="80%" color="{clrWhite}" text="{group}" />
+ <drawtext align="right" width="25%" valign="center" font="{vdrOsd}" fontsize="60%" color="{clrWhite}" text="{nextgroup}" />
+ <drawimage imagetype="icon" path="ico_arrow_left_channelsep" x="25%" valign="center" width="{areawidth}*4/100" height="{areawidth}*4/100"/>
+ <drawimage imagetype="icon" path="ico_arrow_right_channelsep" x="71%" valign="center" width="{areawidth}*4/100" height="{areawidth}*4/100"/>
+ </area>
+ </channelgroup>
+ <!-- Available Variables signalquality:
+ {signalstrength} STR value of currently displayed channel
+ {signalquality} SNR value of currently displayed channel
+ -->
+ <signalquality>
+ <area x="17%" y="95%" width="15%" height="4%" layer="3">
+ <drawrectangle x="{areawidth}*{signalstrength}/100" y="0" width="{areawidth} - {areawidth}*{signalstrength}/100" height="45%" color="{clrTransBlack}" />
+ <drawrectangle x="{areawidth}*{signalquality}/100" y="50%" width="{areawidth} - {areawidth}*{signalquality}/100" height="45%" color="{clrTransBlack}" />
+ </area>
+ </signalquality>
+
+ <!-- background of signalmeter, will only be drawn if signalquality was deleted -->
+ <signalqualityback>
+ <area x="17%" y="95%" width="15%" height="4%" layer="2">
+ <drawimage imagetype="skinpart" path="signal" x="0" y="0" width="100%" height="45%"/>
+ <drawimage imagetype="skinpart" path="signal" x="0" y="50%" width="100%" height="45%"/>
+ </area>
+ </signalqualityback>
+
+ <!-- Available Variables scrapercontent:
+ {mediapath} Full Path of Poster or Banner to use in image path attribute
+ {mediawidth} width of image in pixel
+ {mediaheight} height of image in pixel
+ {isbanner} true if image is a banner, false if it is a poster
+ -->
+ <scrapercontent>
+ <area condition="{showposter}++{isbanner}" x="1%" y="1%" width="{areaheight}*0.13*{mediawidth}/{mediaheight}" height="13%" layer="2">
+ <drawimage imagetype="image" path="{mediapath}" align="center" valign="center" width="{areawidth}" height="{areaheight}"/>
+ </area>
+ <area condition="{showposter}++not{isbanner}" x="1%" y="1%" width="{areaheight}*0.5*{mediawidth}/{mediaheight}" height="50%" layer="2">
+ <drawimage imagetype="image" path="{mediapath}" x="5" y="5" width="{areawidth}-10" height="{areaheight}-10"/>
+ </area>
+ </scrapercontent>
+
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ <area x="5%" y="88%" width="90%" height="10%" layer="6">
+ <drawimage condition="{status}" imagetype="skinpart" path="messageStatus" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{info}" imagetype="skinpart" path="messageInfo" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{warning}" imagetype="skinpart" path="messageWarning" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{error}" imagetype="skinpart" path="messageError" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="5%" y="88%" width="90%" height="10%" layer="7">
+ <drawtext align="center" valign="center" font="{light}" fontsize="50%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+
+</displaychannel>
diff --git a/skins/nopacity/xmlfiles/displaymenu.xml b/skins/nopacity/xmlfiles/displaymenu.xml
new file mode 100644
index 0000000..f6040f6
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenu.xml
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaymenu SYSTEM "../../../dtd/displaymenu.dtd" [
+<!ENTITY displaymenudefault SYSTEM "displaymenudefault.xml">
+<!ENTITY displaymenumain SYSTEM "displaymenumain.xml">
+<!ENTITY displaymenusetup SYSTEM "displaymenusetup.xml">
+<!ENTITY displaymenuschedules SYSTEM "displaymenuschedules.xml">
+<!ENTITY displaymenutimers SYSTEM "displaymenutimers.xml">
+<!ENTITY displaymenuchannels SYSTEM "displaymenuchannels.xml">
+<!ENTITY displaymenurecordings SYSTEM "displaymenurecordings.xml">
+<!ENTITY displaymenudetailepg SYSTEM "displaymenudetailepg.xml">
+<!ENTITY displaymenudetailrecording SYSTEM "displaymenudetailrecording.xml">
+<!ENTITY displaymenudetailtext SYSTEM "displaymenudetailtext.xml">
+]>
+
+<displaymenu x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!--
+ The following background, header, datetime and colorbuttons definitions are default
+ implementations. If one or more of these elements are not implemented in the subview,
+ the default implementations are used.
+ -->
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <!-- top bar -->
+ <drawrectangle x="0" y="0" width="{areawidth}" height="10%" color="{clrBackground}" />
+ <drawrectangle x="30%" y="{areaheight}*0.1 - 1" width="71%" height="1" color="{clrBorder}" />
+ <!-- menu bar -->
+ <drawrectangle x="0" y="10%" width="{areawidth}*29/100" height="81%" color="{clrBackground}" />
+ <drawrectangle x="{areawidth}*29/100 - 1" y="12%" width="1" height="76%" color="{clrBorder}" />
+ <!-- bottom bar -->
+ <drawrectangle x="0" y="90%" width="{areawidth}" height="10%" color="{clrBackground}" />
+ <drawrectangle x="30%" y="{areaheight}*0.9 - 1" width="71%" height="1" color="{clrBorder}" />
+ <!-- upper corner -->
+ <drawellipse x="{areawidth}*29/100" y="{areaheight}/10" width="{areawidth}*2/100" height="{areawidth}*2/100" quadrant="-2" color="{clrBorder}" />
+ <drawellipse x="{areawidth}*29/100 - 1" y="{areaheight}/10 - 1" width="{areawidth}*2/100" height="{areawidth}*2/100" quadrant="-2" color="{clrBackground}" />
+ <!-- lower corner -->
+ <drawellipse x="{areawidth}*29/100" y="{areaheight}*90/100 - {areawidth}*2/100" width="{areawidth}*2/100" height="{areawidth}*2/100" quadrant="-3" color="{clrBorder}" />
+ <drawellipse x="{areawidth}*29/100 - 1" y="{areaheight}*90/100 - {areawidth}*2/100 + 1" width="{areawidth}*2/100" height="{areawidth}*2/100" quadrant="-3" color="{clrBackground}" />
+ </area>
+ <area x="0" y="0" width="100%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="headertop" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ -->
+ <header>
+ <area x="1%" y="0" width="64%" height="10%" layer="3">
+ <drawtext x="0" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrWhite}" text="{title}" />
+ </area>
+ </header>
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="65%" y="0" width="34%" height="10%" layer="3">
+ <drawtext align="right" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrWhite}" text="{daynameshort} {day}.{month} {time}" />
+ </area>
+ </datetime>
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is an status message
+ {info} true if message is an info message
+ {warning} true if message is an warn message
+ {error} true if message is an error message
+ -->
+ <message>
+ <area x="5%" y="80%" width="90%" height="15%" layer="6">
+ <drawimage condition="{status}" imagetype="skinpart" path="messageStatus" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{info}" imagetype="skinpart" path="messageInfo" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{warning}" imagetype="skinpart" path="messageWarning" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{error}" imagetype="skinpart" path="messageError" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="5%" y="80%" width="90%" height="15%" layer="7">
+ <drawtext align="center" valign="center" font="{light}" fontsize="40%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+ <!-- Available Variables colorbuttons:
+ {red1} true if red button is button 1
+ {red2} true if red button is button 2
+ {red3} true if red button is button 3
+ {red4} true if red button is button 4
+ {green1} true if green button is button 1
+ {green2} true if green button is button 2
+ {green3} true if green button is button 3
+ {green4} true if green button is button 4
+ {yellow1} true if yellow button is button 1
+ {yellow2} true if yellow button is button 2
+ {yellow3} true if yellow button is button 3
+ {yellow4} true if yellow button is button 4
+ {blue1} true if blue button is button 1
+ {blue2} true if blue button is button 2
+ {blue3} true if blue button is button 3
+ {blue4} true if blue button is button 4
+ {red} label of red button
+ {green} label of green button
+ {yellow} label of yellow button
+ {blue} label of blue button
+ -->
+ <colorbuttons>
+ <area condition="{red1}" x="0" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonred" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{red}" />
+ </area>
+ <area condition="{green1}" x="0" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttongreen" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{green}" />
+ </area>
+ <area condition="{yellow1}" x="0" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonyellow" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{yellow}" />
+ </area>
+ <area condition="{blue1}" x="0" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonblue" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{blue}" />
+ </area>
+
+ <area condition="{red2}" x="25%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonred" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{red}" />
+ </area>
+ <area condition="{green2}" x="25%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttongreen" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{green}" />
+ </area>
+ <area condition="{yellow2}" x="25%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonyellow" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{yellow}" />
+ </area>
+ <area condition="{blue2}" x="25%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonblue" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{blue}" />
+ </area>
+
+ <area condition="{red3}" x="50%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonred" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{red}" />
+ </area>
+ <area condition="{green3}" x="50%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttongreen" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{green}" />
+ </area>
+ <area condition="{yellow3}" x="50%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonyellow" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{yellow}" />
+ </area>
+ <area condition="{blue3}" x="50%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonblue" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{blue}" />
+ </area>
+
+ <area condition="{red4}" x="75%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonred" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{red}" />
+ </area>
+ <area condition="{green4}" x="75%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttongreen" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{green}" />
+ </area>
+ <area condition="{yellow4}" x="75%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonyellow" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{yellow}" />
+ </area>
+ <area condition="{blue4}" x="75%" y="90%" width="25%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="buttonblue" align="center" valign="center" width="90%" height="40%"/>
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{blue}" />
+ </area>
+ </colorbuttons>
+ &displaymenudefault;
+ &displaymenumain;
+ &displaymenusetup;
+ &displaymenuschedules;
+ &displaymenutimers;
+ &displaymenuchannels;
+ &displaymenurecordings;
+ &displaymenudetailepg;
+ &displaymenudetailrecording;
+ &displaymenudetailtext;
+</displaymenu>
diff --git a/skins/nopacity/xmlfiles/displaymenuchannels.xml b/skins/nopacity/xmlfiles/displaymenuchannels.xml
new file mode 100644
index 0000000..8a0ff34
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenuchannels.xml
@@ -0,0 +1,127 @@
+<menuchannels x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="33%" scaletvy="10%" scaletvwidth="65%" scaletvheight="80%">
+ <scrollbar>
+ <area x="30%" y="11%" width="2%" height="78%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+
+ <menuitems x="{areawidth}*0.005" y="10%" orientation="vertical" width="99%" height="80%" align="center" numlistelements="10">
+ <!-- Available Variables channels menu listelement:
+ {number} number of the displayed channel
+ {name} name of the displayed channel
+ {channelid} ChannelID as path to display channel logo
+ {transponder} Transponder of channel
+ {frequency} Frequency of channel
+ {source} Source of channel (S, C, T)
+ {sourcedescription} Descriptin of source from sources.conf
+ {position} orbital position of the satellite in case this is a DVB-S source
+ {isAtsc} true if channel is a ATSC channel
+ {isCable} true if channel is cable channel
+ {isSat} true if channel is a satellite channel
+ {isTerr} true if channel is terrestrical
+ {presenteventtitle} title of present event on this channel
+ {presenteventstart} present event start time in hh::mm
+ {presenteventstop} present event event stop time in hh::mm
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ <!-- background and foreground-->
+ <area x="0" width="28%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <!-- channel logo -->
+ <area condition="not{separator}" x="5" width="6%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="100%" height="100%" valign="center" />
+ </area>
+ <!-- scrollable channel name -->
+ <areascroll condition="not{separator}++not{current}" scrollelement="channelname" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="7%" width="20%" layer="3">
+ <drawtext name="channelname" x="0" y="5" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItem}" text="{number} {name}" />
+ </areascroll>
+ <areascroll condition="not{separator}++{current}" scrollelement="channelname" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="7%" width="20%" layer="3">
+ <drawtext name="channelname" x="0" y="5" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItemSelected}" text="{number} {name}" />
+ </areascroll>
+ <!-- channel information -->
+ <area condition="not{separator}++not{current}" x="7%" width="20%" layer="3">
+ <drawtext x="0" y="60%" font="{vdrOsd}" fontsize="30%" color="{clrFontMenuItem}" text="{sourcedescription}, {tr(transponder)} {transponder}" />
+ </area>
+ <area condition="not{separator}++{current}" x="7%" width="20%" layer="3">
+ <drawtext x="0" y="60%" font="{vdrOsd}" fontsize="30%" color="{clrFontMenuItemSelected}" text="{sourcedescription}, {tr(transponder)} {transponder}" />
+ </area>
+ <!-- separator -->
+ <area condition="{separator}" x="0" width="28%" layer="3">
+ <drawimage name="sep" imagetype="icon" path="ico_channelsep" x="10" valign="center" width="{areaheight}-10" height="{areaheight}-10"/>
+ <drawtext x="{width(sep)} + 20" valign="center" font="{vdrOsd}" fontsize="60%" color="{clrFontInactive}" text="{name}" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {number} number of the displayed channel
+ {name} name of the displayed channel
+ {channelid} ChannelID as path to display channel logo
+ {transponder} Transponder of channel
+ {frequency} Frequency of channel
+ {source} Source of channel (S, C, T)
+ {sourcedescription} Descriptin of source from sources.conf
+ {position} orbital position of the satellite in case this is a DVB-S source
+ {isAtsc} true if channel is a ATSC channel
+ {isCable} true if channel is cable channel
+ {isSat} true if channel is a satellite channel
+ {isTerr} true if channel is terrestrical
+ {presenteventtitle} title of present event on this channel
+ {presenteventstart} present event start time in hh::mm
+ {presenteventstop} present event stop time in hh::mm
+ {presenteventshorttext} present event short text
+ {presenteventdescription} present event description
+ {presenteventday} present event name of day
+ {presenteventdate} present event date in dd:mm:yy
+ {presenteventelapsed} present event elapsed time
+ {presenteventduration} present event duration
+ {hasposter} true if a scraped poster is available for this elements present evemt
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {nexteventtitle} title of next event on this channel
+ {nexteventstart} next event start time in hh::mm
+ {nexteventstop} next event event stop time in hh::mm
+ {nexteventshorttext} next event short text
+ {nexteventdescription} next event description
+ {nexteventday} next event name of day
+ {nexteventdate} next event date in dd:mm:yy
+ {nexteventdate} next event duration
+ {schedule[]} array with following 10 schedules
+ {schedule[title]} title of event
+ {schedule[shorttext]} shorttext of event
+ {schedule[start]} start time of event in hh:mm
+ {schedule[stop]} stop time of event in hh:mm
+ -->
+ <currentelement delay="500" fadetime="300">
+ <area x="32%" y="2%" width="67%" height="96%" layer="2">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area x="32%" y="2%" width="67%" height="76%" layer="2">
+ <!-- Logo and Header -->
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="1%" y="1%" width="20%" height="15%" />
+ <drawtext name="channelname" x="23%" y="{height(logo)} * 3 / 10" font="{vdrOsd}" fontsize="10%" color="{clrWhite}" text="{number} - {name}" />
+ <drawtext x="23%" y="{posy(channelname)} + {height(channelname)}" font="{vdrOsd}" fontsize="7%" color="{clrWhite}" text="{sourcedescription}, {tr(transponder)} {transponder}" />
+ <!-- NOW -->
+ <drawtext name="headernow" x="1%" y="{posy(logo)} + {height(logo)} + 10" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(now)}: {presenteventstart} - {presenteventstop}" />
+ <drawtext name="titlenow" x="1%" y="{posy(headernow)} + {height(headernow)}" width="48%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{presenteventtitle}" />
+ <drawtextbox x="1%" y="{posy(titlenow)} + {height(titlenow)} + 10" width="48%" height="{areaheight} - {posy(titlenow)} - {height(titlenow)} - 10" font="{vdrOsd}" fontsize="5%" color="{clrWhite}" text="{presenteventshorttext}
{presenteventdescription}" />
+ <!-- NEXT -->
+ <drawtext name="headernext" x="51%" y="{posy(logo)} + {height(logo)} + 10" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(next)}: {nexteventstart} - {nexteventstop}" />
+ <drawtext name="titlenext" x="51%" y="{posy(headernext)} + {height(headernext)}" width="48%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{nexteventtitle}" />
+ <drawtextbox x="51%" y="{posy(titlenext)} + {height(titlenext)} + 10" width="48%" height="{areaheight} - {posy(titlenext)} - {height(titlenext)} - 10" font="{vdrOsd}" fontsize="5%" color="{clrWhite}" text="{nexteventshorttext}
{nexteventdescription}" />
+ </area>
+ <areascroll mode="forthandback" orientation="vertical" delay="1000" scrollspeed="medium" x="32%" y="78%" width="67%" height="20%" layer="2">
+ <drawtext x="10" y="0" font="{semibold}" fontsize="20%" color="{clrWhite}" text="{tr(nextschedules)}:" />
+ <loop name="schedule" x="0" y="{areaheight}/4 + 5" orientation="vertical">
+ <drawtext x="10" font="{vdrOsd}" width="{areawidth}-20" fontsize="19%" color="{clrWhite}" text="{schedule[start]} {schedule[title]}" />
+ </loop>
+ </areascroll>
+ </currentelement>
+ </menuitems>
+</menuchannels>
\ No newline at end of file
diff --git a/skins/nopacity/xmlfiles/displaymenudefault.xml b/skins/nopacity/xmlfiles/displaymenudefault.xml
new file mode 100644
index 0000000..a2d0de3
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenudefault.xml
@@ -0,0 +1,65 @@
+ <menudefault x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="0" scaletvy="0" scaletvwidth="0" scaletvheight="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrBackground}" />
+ </area>
+ <area x="0" y="0" width="100%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="headertop" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+
+ <!-- IMPORTANT: menuitemwidth and determinatefont have to be defined here. menuitemwidth defines the total width of the
+ default menu items, determinatefont the function which sets the actual font to use. With that it is possible to determinate
+ the correct column widths -->
+ <menuitems x="1%" y="10%" orientation="vertical" width="96%" height="80%" align="center" menuitemwidth="96%" determinatefont="column1" numlistelements="16">
+ <!-- Available Variables default menu listelement:
+ {column1} text of column1
+ {column2} text of column2
+ {column3} text of column3
+ {column4} text of column4
+ {column5} text of column5
+ {column6} text of column6
+ {column2set} true if column2 is used
+ {column3set} true if column3 is used
+ {column4set} true if column4 is used
+ {column5set} true if column5 is used
+ {column6set} true if column6 is used
+ {column2x} proposed x value of column2
+ {column3x} proposed x value of column3
+ {column4x} proposed x value of column4
+ {column5x} proposed x value of column5
+ {column6x} proposed x value of column6
+ {column1width} proposed width of column1
+ {column2width} proposed width of column2
+ {column3width} proposed width of column3
+ {column4width} proposed width of column4
+ {column5width} proposed width of column5
+ {column6width} proposed width of column6
+ {current} true if column is currently selected
+ {separator} true if column is a list separator
+ -->
+ <listelement>
+ <area x="0" width="100%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubuttondefault" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttondefaultactive" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <areascroll scrollelement="column1" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="1%" width="{column1width}" layer="3">
+ <drawtext condition="not{current}" name="column1" x="{column1x}" width="{column1width}" valign="center" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItem}" text="{column1}" />
+ <drawtext condition="{current}" name="column1" x="{column1x}" width="{column1width}" valign="center" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItemSelected}" text="{column1}" />
+ </areascroll>
+ <area x="1%" width="100%" layer="3">
+ <drawtext condition="{column2set}++not{current}" x="{column2x}" valign="center" width="{column2width}" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItem}" text="{column2}" />
+ <drawtext condition="{column2set}++{current}" x="{column2x}" valign="center" width="{column2width}" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItemSelected}" text="{column2}" />
+ <drawtext condition="{column3set}++not{current}" x="{column3x}" valign="center" width="{column3width}" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItem}" text="{column3}" />
+ <drawtext condition="{column3set}++{current}" x="{column3x}" valign="center" width="{column3width}" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItemSelected}" text="{column3}" />
+ <drawtext condition="{column4set}++not{current}" x="{column4x}" valign="center" width="{column4width}" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItem}" text="{column4}" />
+ <drawtext condition="{column4set}++{current}" x="{column4x}" valign="center" width="{column4width}" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItemSelected}" text="{column4}" />
+ <drawtext condition="{column5set}++not{current}" x="{column5x}" valign="center" width="{column5width}" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItem}" text="{column5}" />
+ <drawtext condition="{column5set}++{current}" x="{column5x}" valign="center" width="{column5width}" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItemSelected}" text="{column5}" />
+ <drawtext condition="{column6set}++not{current}" x="{column6x}" valign="center" width="{column6width}" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItem}" text="{column6}" />
+ <drawtext condition="{column6set}++{current}" x="{column6x}" valign="center" width="{column6width}" font="{vdrOsd}" fontsize="90%" color="{clrFontMenuItemSelected}" text="{column6}" />
+ </area>
+ </listelement>
+
+ </menuitems>
+</menudefault>
diff --git a/skins/nopacity/xmlfiles/displaymenudetailepg.xml b/skins/nopacity/xmlfiles/displaymenudetailepg.xml
new file mode 100644
index 0000000..a49ad36
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenudetailepg.xml
@@ -0,0 +1,257 @@
+<menudetailedepg x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle x="0" y="0" width="100%" height="10%" color="{clrBackground}" />
+ </area>
+ <area x="0" y="0" width="100%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="headertop" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+ <scrollbar>
+ <area x="97%" y="25%" width="2%" height="60%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+ <!-- Available Variables in detailheader elements:
+ {title} title of event
+ {shorttext} shorttext of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event
+ {date} date of current event in dd.mm.yy
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {channelid} ChannelID as path to display channel logo
+ {ismovie} true if event is scraped as a movie
+ {isseries} true if event is scraped as a series
+ {posteravailable} true if a poster is available
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {banneravailable} true if a banner is available
+ {bannerwidth} width of banner
+ {bannerheight} height of banner
+ {bannerpath} path of banner
+ {epgpicavailable} true if a epg picture is available
+ {epgpicpath} path of epg picture
+ -->
+ <detailheader>
+ <area x="1%" y="10%" width="98%" height="15%" layer="2">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area x="1%" y="10%" width="98%" height="15%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="15%" height="80%" valign="center" />
+
+ <drawimage condition="{isseries}++{banneravailable}++not{epgpicavailable}" imagetype="image" path="{bannerpath}" x="{areawidth} - {areawidth}/3 - 10" valign="center" width="{areawidth}/3" height="{areawidth}/3 * {bannerheight} / {bannerwidth}"/>
+ <drawimage condition="{ismovie}++{posteravailable}++not{epgpicavailable}" imagetype="image" path="{posterpath}" x="{areawidth} - {areaheight}*8/10" valign="center" width="{areaheight}*8 / 10 * {posterheight} / {posterwidth}" height="{areaheight}*8 / 10"/>
+ <drawimage condition="{epgpicavailable}" imagetype="image" path="{epgpicpath}" x="{areawidth} - {areaheight}*8/10 * 174 / 130" valign="center" width="{areaheight}*8/10 * 174 / 130" height="{areaheight}*8 / 10"/>
+
+ <drawtext name="title" x="{width(logo)} + 20" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{title}" />
+ <drawtext name="datetime" x="{width(logo)} + 20" y="{posy(title)} - {height(datetime)}" font="{vdrOsd}" fontsize="25%" color="{clrWhite}" text="{day} {date} {start} - {stop} ({duration} mins)" />
+ <drawtext name="shorttext" x="{width(logo)} + 20" y="{posy(title)} + {height(title)}" font="{vdrOsd}" fontsize="25%" color="{clrWhite}" text="{shorttext}" />
+ </area>
+ </detailheader>
+
+ <!-- Available Variables in tab elements:
+ {title} title of event
+ {shorttext} shorttext of event
+ {description} description of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event
+ {date} date of current event in dd.mm.yy
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {channelid} ChannelID as path to display channel logo
+ {hasreruns} true if reruns of this event are found
+ {reruns[]} array with reruns
+ {reruns[title]} title of rerun
+ {reruns[shorttext]} shorttext of rerun
+ {reruns[date]} date of rerun in dd:mm
+ {reruns[day]} short dayname of rerun
+ {reruns[start]} start time of rerun in hh:mm
+ {reruns[stop]} stop time of rerun in hh:mm
+ {reruns[channelname]} name of channel on which rerun occurs
+ {reruns[channelnumber]} number of channel on which rerun occurs
+ {reruns[channelid]} id of channel on which rerun occurs to display channel logo
+ {reruns[channellogoexists]} true if channel logo exists
+ {epgpic1avaialble} true if first epg picture is available
+ {epgpic2avaialble} true if first epg picture is available
+ {epgpic3avaialble} true if first epg picture is available
+ {epgpic1path} path of first epg picture
+ {epgpic2path} path of second epg picture
+ {epgpic3path} path of third epg picture
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+
+ <!-- TAB EPGINFO -->
+ <tab name="EPG Info" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawtextbox condition="not{isseries}++not{ismovie}" x="0" y="10" width="96%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{description}" />
+ <drawimage condition="{isseries}" name="seriesposter" imagetype="image" path="{seriesposter1path}" x="{areawidth}*0.75" y="10" width="{areawidth}*0.25" height="{areawidth} * 0.25 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage condition="{ismovie}" name="movieposter" imagetype="image" path="{posterpath}" x="{areawidth}*0.75" y="10" width="{areawidth}*0.25" height="{areawidth} * 0.25 * {posterheight} / {posterwidth}" />
+ <drawtextbox condition="{isseries}" x="0" y="10" width="96%" float="topright" floatwidth="{width(seriesposter)} + 10" floatheight="{height(seriesposter)} + 20" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="{ismovie}" x="0" y="10" width="96%" float="topright" floatwidth="{width(movieposter)} + 10" floatheight="{height(movieposter)} + 20" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{description}" />
+ </tab>
+ <!-- TAB RERUNS -->
+ <tab condition="{hasreruns}" name="{tr(reruns)}" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext align="center" y="0" name="title" font="{vdrOsd}" fontsize="10%" color="{clrWhite}" text="{tr(rerunsof)} '{title}'" />
+ <loop name="reruns" x="0" y="{height(title)} + 10" width="{areawidth}" orientation="vertical">
+ <drawimage name="logo" condition="{reruns[channellogoexists]}" imagetype="channellogo" path="{reruns[channelid]}" x="0" width="10%" height="10%" />
+ <drawtext name="channelname" condition="not{reruns[channellogoexists]}" x="-5" font="{vdrOsd}" fontsize="10%" color="{clrWhite}" text="{reruns[channelname]}" />
+ <drawtext condition="{reruns[channellogoexists]}" x="{width(logo)}+20" y="-5" width="{areawidth} - {width(logo)} - 20" font="{vdrOsd}" fontsize="8%" color="{clrWhite}" text="{reruns[day]} {reruns[date]} {reruns[start]} - {reruns[stop]}: {reruns[title]} {reruns[shorttext]}" />
+ <drawtext condition="not{reruns[channellogoexists]}" x="{width(channelname)}+20" y="-5" width="{areawidth} - {width(logo)} - 20" font="{vdrOsd}" fontsize="8%" color="{clrWhite}" text="{reruns[day]} {reruns[date]} {reruns[start]} - {reruns[stop]}: {reruns[title]} {reruns[shorttext]}" />
+ </loop>
+ </tab>
+ <!-- TAB ACTORS -->
+ <tab condition="{isseries}||{ismovie}" name="{tr(actors)}" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext align="center" name="title" y="0" font="{vdrOsd}" fontsize="15%" color="{clrWhite}" text="{tr(actors)}" />
+ <loop name="actors" x="0" y="{height(title)} + 10" width="{areawidth}" orientation="horizontal" columnwidth="{areawidth}/5" rowheight="{areawidth}/5*1.8" overflow="linewrap">
+ <drawimage name="thumb" imagetype="image" path="{actors[thumb]}" x="20" y="0" width="{columnwidth}-40" height="{columnwidth} * {actors[thumbheight]} / {actors[thumbwidth]} - 40 * {actors[thumbheight]} / {actors[thumbwidth]}"/>
+ <drawtext align="center" y="{height(thumb)} + 10" width="{columnwidth}" name="actorname" font="{vdrOsd}" fontsize="7%" color="{clrWhite}" text="{actors[name]}" />
+ <drawtext align="center" y="{height(thumb)} + 10 + {height(actorname)}" width="{columnwidth}" font="{vdrOsd}" fontsize="7%" color="{clrWhite}" text="{actors[role]}" />
+ </loop>
+ </tab>
+ <!-- TAB TVDBINFO -->
+ <tab condition="{isseries}" name="TvDBInfo" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="banner" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="episodeimage" imagetype="image" path="{episodeimagepath}" x="{areawidth}*0.7" y="{height(banner)} + 20" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {episodeimageheight} / {episodeimagewidth}"/>
+ <drawimage name="seasonposter" imagetype="image" path="{seasonposterpath}" x="{areawidth}*0.7" y="{height(banner)} + {height(episodeimage)} + 30" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seasonposterheight} / {seasonposterwidth}"/>
+ <drawtextbox x="0" y="{height(banner)} + 20" width="96%" float="topright" floatwidth="{width(seasonposter)} + 10" floatheight="{height(episodeimage)} + {height(seasonposter)} + 30" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(episode)}: {episodetitle} ({tr(season)} {episodeseason}, {tr(episode)} {episodenumber})
{episodeoverview}|
{tr(gueststars)}: {episodegueststars}||
{tr(seriesfirstaired)}: {seriesfirstaired}||
{tr(episodefirstaire [...]
+ </tab>
+ <!-- TAB SERIESGALERY -->
+ <tab condition="{isseries}" name="{tr(seriesgalery)}" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="banner1" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="fanart1" imagetype="image" path="{seriesfanart1path}" align="center" y="{posy(banner1)} + {height(banner1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart1height} / {seriesfanart1width}"/>
+ <drawimage name="banner2" imagetype="image" path="{seriesbanner2path}" align="center" y="{posy(fanart1)} + {height(fanart1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner2height} / {seriesbanner2width}"/>
+ <drawimage name="fanart2" imagetype="image" path="{seriesfanart2path}" align="center" y="{posy(banner2)} + {height(banner2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart2height} / {seriesfanart2width}"/>
+ <drawimage name="banner3" imagetype="image" path="{seriesbanner3path}" align="center" y="{posy(fanart2)} + {height(fanart2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner3height} / {seriesbanner3width}"/>
+ <drawimage name="fanart3" imagetype="image" path="{seriesfanart3path}" align="center" y="{posy(banner3)} + {height(banner3)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart3height} / {seriesfanart3width}"/>
+ <drawimage name="poster1" imagetype="image" path="{seriesposter1path}" align="center" y="{posy(fanart3)} + {height(fanart3)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage name="poster2" imagetype="image" path="{seriesposter2path}" align="center" y="{posy(poster1)} + {height(poster1)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter2height} / {seriesposter2width}"/>
+ <drawimage name="poster3" imagetype="image" path="{seriesposter3path}" align="center" y="{posy(poster2)} + {height(poster2)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter3height} / {seriesposter3width}"/>
+ </tab>
+ <!-- TAB MOVIEDBINFO -->
+ <tab condition="{ismovie}" name="MovieDBInfo" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="poster" imagetype="image" path="{posterpath}" x="70%" y="10" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {posterheight} / {posterwidth}"/>
+ <drawtextbox x="0" y="10" width="96%" float="topright" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 20" font="{vdrOsd}" fontsize="8%" color="{clrWhite}" text="{tr(originaltitle)}: {movieoriginalTitle}
|{tr(genre)}: {moviegenres}
||{movietagline}
|{movieoverview}
|{tr(budget)}: {moviebudget}
||{tr(revenue)}: {movierevenue}
||{tr(adult)}: {movieadult}
||{tr(releasedate)}: {moviereleasedate}
||{tr(runtime) [...]
+ </tab>
+ <!-- TAB MOVIEGALERY -->
+ <tab condition="{ismovie}" name="{tr(moviegalery)}" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="fanart" imagetype="image" path="{fanartpath}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {fanartheight} / {fanartwidth}"/>
+ <drawimage name="poster" imagetype="image" path="{posterpath}" align="center" y="{height(fanart)} + 30" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {posterheight} / {posterwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionfanart" imagetype="image" path="{collectionfanartpath}" align="center" y="{posy(poster)} + {height(poster)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {collectionfanartheight} / {collectionfanartwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionposter" imagetype="image" path="{collectionposterpath}" align="center" y="{posy(collectionfanart)} + {height(collectionfanart)} + 20" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {collectionposterheight} / {collectionposterwidth}"/>
+ </tab>
+ <!-- Available Variables tablabels:
+ {tabs[]} array with available tab labels
+ {tabs[title]} title of tab
+ {tabs[current]} true if tab is displayed currently
+ -->
+ <tablabels>
+ <area x="1%" y="85%" width="98%" height="5%" layer="3">
+ <drawrectangle x="0" y="1" width="100%" height="1" color="{clrBorder}" />
+ <loop name="tabs" x="0" y="0" orientation="horizontal">
+ <drawrectangle condition="{tabs[current]}" x="0" y="1" width="{width(label)}" height="100%" color="{clrBorder}" />
+ <drawrectangle condition="not{tabs[current]}" x="0" y="1" width="{width(label)}" height="100%" color="{clrBorder}" />
+ <drawrectangle condition="not{tabs[current]}" x="2" y="2" width="{width(label)} - 4" height="{areaheight}-4" color="{clrTransparent}" />
+ <drawtext name="label" x="0" valign="center" font="{vdrOsd}" fontsize="95%" color="{clrWhite}" text=" {tabs[title]} " />
+ </loop>
+ </area>
+ </tablabels>
+</menudetailedepg>
\ No newline at end of file
diff --git a/skins/nopacity/xmlfiles/displaymenudetailrecording.xml b/skins/nopacity/xmlfiles/displaymenudetailrecording.xml
new file mode 100644
index 0000000..28469db
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenudetailrecording.xml
@@ -0,0 +1,235 @@
+<menudetailedrecording x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle x="0" y="0" width="100%" height="10%" color="{clrBackground}" />
+ </area>
+ <area x="0" y="0" width="100%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="headertop" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+ <scrollbar>
+ <area x="97%" y="25%" width="2%" height="60%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+ <!-- Available Variables in detailheader elements:
+ {name} full name of recording (including folders)
+ {epgname} Name of recording (Name from EPG)
+ {shorttext} shorttext of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of current event in hh:mm
+ {duration} real duration of recording in minutes
+ {durationevent} duration of according event in minutes
+ {ismovie} true if event is scraped as a movie
+ {isseries} true if event is scraped as a series
+ {posteravailable} true if a poster is available
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {banneravailable} true if a banner is available
+ {bannerwidth} width of banner
+ {bannerheight} height of banner
+ {bannerpath} path of banner
+ {recimgavailable} true if a recording image is available in the recording path
+ {recimgpath} path of rec image
+ -->
+ <detailheader>
+ <area x="1%" y="10%" width="98%" height="15%" layer="2">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area x="1%" y="10%" width="98%" height="15%" layer="3">
+ <drawimage condition="{isseries}++{banneravailable}++not{recimgavailable}" imagetype="image" path="{bannerpath}" x="{areawidth} - {areawidth}/3 - 10" valign="center" width="{areawidth}/3" height="{areawidth}/3 * {bannerheight} / {bannerwidth}"/>
+ <drawimage condition="{ismovie}++{posteravailable}++not{recimgavailable}" imagetype="image" path="{posterpath}" x="{areawidth} - {areaheight}*8/10" valign="center" width="{areaheight}*8 / 10 * {posterheight} / {posterwidth}" height="{areaheight}*8 / 10"/>
+ <drawimage condition="{recimgavailable}" imagetype="image" path="{recimgpath}" x="{areawidth} - {areaheight}*8/10 * 174 / 130" valign="center" width="{areaheight}*8/10 * 174 / 130" height="{areaheight}*8 / 10"/>
+ <drawtext name="title" x="20" valign="center" font="{vdrOsd}" fontsize="35%" color="{clrWhite}" text="{epgname}" />
+ <drawtext name="datetime" x="20" y="{posy(title)} - {height(datetime)}" font="{vdrOsd}" fontsize="25%" color="{clrWhite}" text="{date} {time} ({duration} mins)" />
+ <drawtext name="shorttext" x="20" y="{posy(title)} + {height(title)}" font="{vdrOsd}" fontsize="25%" color="{clrWhite}" text="{shorttext}" />
+ </area>
+ </detailheader>
+ <!-- Available Variables in tab elements:
+ {name} full name of recording (including folders)
+ {epgname} Name of recording (Name from EPG)
+ {shorttext} shorttext of recording
+ {description} description of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of recording in hh:mm
+ {duration} real duration of recording in minutes
+ {durationevent} duration of according event in minutes
+
+ {recordingsize} size of recording (automatically in GB / MB)
+ {recordingsizecutted} size of cutted recording (automatically in GB / MB)
+ {recordinglength} length of recording (in hh::mm:ss)
+ {recordinglengthcutted} length of cutted recording (in hh::mm:ss)
+ {recordingbitrate} bitrate of recording (in MBit/s)
+ {recordingformat} format of recording (TS / PS)
+ {searchtimer} name of accordign searchtimer (if available)
+
+ {recimg1avaialble} true if first recording image is available
+ {recimg2avaialble} true if first recording image is available
+ {recimg3avaialble} true if first recording image is available
+ {recimg1path} path of first recording image
+ {recimg2path} path of second recording image
+ {recimg3path} path of third recording image
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+
+ <!-- a tab is one scrolling area, just position and draw as inside a normal area -->
+ <!-- just define as many tabs as needed -->
+ <tab name="Info" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawtextbox condition="not{isseries}++not{ismovie}" x="0" y="0" width="96%" font="{vdrOsd}" fontsize="8%" color="{clrWhite}" text="{description}" />
+ <drawimage condition="{isseries}" name="seriesposter" imagetype="image" path="{seriesposter1path}" x="{areawidth}*0.7" y="0" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage condition="{ismovie}" name="movieposter" imagetype="image" path="{posterpath}" x="{areawidth}*0.7" y="0" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {posterheight} / {posterwidth}" />
+ <drawtextbox condition="{isseries}" x="0" y="0" width="96%" float="topright" floatwidth="{width(seriesposter)} + 10" floatheight="{height(seriesposter)} + 20" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="{ismovie}" x="0" y="0" width="96%" float="topright" floatwidth="{width(movieposter)} + 10" floatheight="{height(movieposter)} + 20" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{description}" />
+ </tab>
+ <tab name="{tr(recinfo)}" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext align="center" y="0" name="title" font="{vdrOsd}" fontsize="10%" color="{clrWhite}" text="{tr(recinfo)}" />
+ <drawtextbox x="0" y="{height(title)} + 20" width="96%" font="{vdrOsd}" fontsize="8%" color="{clrWhite}" text="{tr(recsize)}: {recordingsize}
{tr(recsizecutted)}: {recordingsizecutted}
{tr(reclength)}: {recordinglength}
{tr(reclengthcutted)}: {recordinglengthcutted}
{tr(bitrate)}: {recordingbitrate}
{tr(format)}: {recordingformat}
{tr(searchtimer)}: {searchtimer}
" />
+ </tab>
+ <tab condition="{isseries}||{ismovie}" name="{tr(actors)}" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext align="center" name="title" y="0" font="{vdrOsd}" fontsize="10%" color="{clrWhite}" text="{tr(actors)}" />
+ <loop name="actors" x="0" y="{height(title)} + 10" width="{areawidth}" orientation="horizontal" columnwidth="{areawidth}/5" rowheight="{areawidth}/5*1.8" overflow="linewrap">
+ <drawimage name="thumb" imagetype="image" path="{actors[thumb]}" x="20" y="0" width="{columnwidth}-40" height="{columnwidth} * {actors[thumbheight]} / {actors[thumbwidth]} - 40 * {actors[thumbheight]} / {actors[thumbwidth]}"/>
+ <drawtext align="center" y="{height(thumb)} + 10" width="{columnwidth}" name="actorname" font="{vdrOsd}" fontsize="7%" color="{clrWhite}" text="{actors[name]}" />
+ <drawtext align="center" y="{height(thumb)} + 10 + {height(actorname)}" width="{columnwidth}" font="{vdrOsd}" fontsize="7%" color="{clrWhite}" text="{actors[role]}" />
+ </loop>
+ </tab>
+ <tab condition="{isseries}" name="TvDBInfo" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="banner" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="episodeimage" imagetype="image" path="{episodeimagepath}" x="{areawidth}*0.7" y="{height(banner)} + 20" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {episodeimageheight} / {episodeimagewidth}"/>
+ <drawimage name="seasonposter" imagetype="image" path="{seasonposterpath}" x="{areawidth}*0.7" y="{height(banner)} + {height(episodeimage)} + 30" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {seasonposterheight} / {seasonposterwidth}"/>
+ <drawtextbox x="0" y="{height(banner)} + 20" width="96%" float="topright" floatwidth="{width(seasonposter)} + 10" floatheight="{height(episodeimage)} + {height(seasonposter)} + 30" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(episode)}: {episodetitle} ({tr(season)} {episodeseason}, {tr(episode)} {episodenumber})
{episodeoverview}|
{tr(gueststars)}: {episodegueststars}||
{tr(seriesfirstaired)}: {seriesfirstaired}||
{tr(episodefirstaire [...]
+ </tab>
+ <tab condition="{isseries}" name="{tr(seriesgalery)}" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="banner1" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage name="fanart1" imagetype="image" path="{seriesfanart1path}" align="center" y="{posy(banner1)} + {height(banner1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart1height} / {seriesfanart1width}"/>
+ <drawimage name="banner2" imagetype="image" path="{seriesbanner2path}" align="center" y="{posy(fanart1)} + {height(fanart1)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner2height} / {seriesbanner2width}"/>
+ <drawimage name="fanart2" imagetype="image" path="{seriesfanart2path}" align="center" y="{posy(banner2)} + {height(banner2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart2height} / {seriesfanart2width}"/>
+ <drawimage name="banner3" imagetype="image" path="{seriesbanner3path}" align="center" y="{posy(fanart2)} + {height(fanart2)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesbanner3height} / {seriesbanner3width}"/>
+ <drawimage name="fanart3" imagetype="image" path="{seriesfanart3path}" align="center" y="{posy(banner3)} + {height(banner3)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {seriesfanart3height} / {seriesfanart3width}"/>
+ <drawimage name="poster1" imagetype="image" path="{seriesposter1path}" align="center" y="{posy(fanart3)} + {height(fanart3)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter1height} / {seriesposter1width}"/>
+ <drawimage name="poster2" imagetype="image" path="{seriesposter2path}" align="center" y="{posy(poster1)} + {height(poster1)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter2height} / {seriesposter2width}"/>
+ <drawimage name="poster3" imagetype="image" path="{seriesposter3path}" align="center" y="{posy(poster2)} + {height(poster2)} + 20" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesposter3height} / {seriesposter3width}"/>
+ </tab>
+ <tab condition="{ismovie}" name="MovieDBInfo" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="poster" imagetype="image" path="{posterpath}" x="70%" y="10" width="{areawidth}*0.3" height="{areawidth} * 0.3 * {posterheight} / {posterwidth}"/>
+ <drawtextbox x="0" y="10" width="96%" float="topright" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 20" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(originaltitle)}: {movieoriginalTitle}
|{tr(genre)}: {moviegenres}
||{movietagline}
|{movieoverview}
|{tr(budget)}: {moviebudget}$
||{tr(revenue)}: {movierevenue}$
||{tr(adult)}: {movieadult}
||{tr(releasedate)}: {moviereleasedate}
||{tr(runtim [...]
+ </tab>
+ <tab condition="{ismovie}" name="{tr(moviegalery)}" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawimage name="fanart" imagetype="image" path="{fanartpath}" align="center" y="10" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {fanartheight} / {fanartwidth}"/>
+ <drawimage name="poster" imagetype="image" path="{posterpath}" align="center" y="{height(fanart)} + 30" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {posterheight} / {posterwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionfanart" imagetype="image" path="{collectionfanartpath}" align="center" y="{posy(poster)} + {height(poster)} + 20" width="{areawidth}*0.9" height="{areawidth} * 0.9 * {collectionfanartheight} / {collectionfanartwidth}"/>
+ <drawimage condition="{movieiscollection}" name="collectionposter" imagetype="image" path="{collectionposterpath}" align="center" y="{posy(collectionfanart)} + {height(collectionfanart)} + 20" width="{areawidth}*0.6" height="{areawidth} * 0.6 * {collectionposterheight} / {collectionposterwidth}"/>
+ </tab>
+
+ <!-- Available Variables tablabels:
+ {tabs[]} array with available tab labels
+ {tabs[title]} title of tab
+ {tabs[current]} true if tab is displayed currently
+ -->
+ <tablabels>
+ <area x="1%" y="85%" width="98%" height="5%" layer="3">
+ <loop name="tabs" x="0" y="0" orientation="horizontal">
+ <drawrectangle condition="{tabs[current]}" x="0" y="0" width="{width(label)}" height="100%" color="{clrBorder}" />
+ <drawrectangle condition="not{tabs[current]}" x="0" y="0" width="{width(label)}" height="100%" color="{clrBorder}" />
+ <drawrectangle condition="not{tabs[current]}" x="2" y="2" width="{width(label)} - 4" height="{areaheight}-4" color="{clrTransparent}" />
+ <drawtext name="label" x="0" valign="center" font="{vdrOsd}" fontsize="95%" color="{clrWhite}" text=" {tabs[title]} " />
+ </loop>
+ </area>
+ </tablabels>
+
+</menudetailedrecording>
diff --git a/skins/nopacity/xmlfiles/displaymenudetailtext.xml b/skins/nopacity/xmlfiles/displaymenudetailtext.xml
new file mode 100644
index 0000000..dae4e61
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenudetailtext.xml
@@ -0,0 +1,25 @@
+<menudetailedtext x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle x="0" y="0" width="100%" height="10%" color="{clrBackground}" />
+ </area>
+ <area x="0" y="0" width="100%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="headertop" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+ <scrollbar>
+ <area x="97%" y="11%" width="2%" height="79%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+ <!-- Available Variables in tab elements:
+ {text} detailed text
+ -->
+ <tab name="text" x="2%" y="11%" width="94%" height="79%" layer="2" scrollheight="{areaheight}/4">
+ <drawtextbox x="0" y="0" width="100%" font="{light}" fontsize="5%" color="{clrWhite}" text="{text}" />
+ </tab>
+
+</menudetailedtext>
\ No newline at end of file
diff --git a/skins/nopacity/xmlfiles/displaymenumain.xml b/skins/nopacity/xmlfiles/displaymenumain.xml
new file mode 100644
index 0000000..5af1bc9
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenumain.xml
@@ -0,0 +1,152 @@
+<menumain x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="33%" scaletvy="10%" scaletvwidth="65%" scaletvheight="80%" >
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ -->
+ <header>
+ <area x="1%" y="0" width="64%" height="10%" layer="3">
+ <drawimage imagetype="icon" path="ico_vdrlogo" x="0" valign="center" width="{areaheight} * 0.9 * 160 / 70" height="{areaheight}*0.9"/>
+ <drawtext x="{areaheight} * 0.9 * 160 / 70 + 10" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrWhite}" text="{vdrversion}" />
+ </area>
+ </header>
+
+ <!-- Available Variables timers:
+ {numtimers} number of active timers (max. 15 timers will be displayed)
+ {numtimerconflicts} number of current timer conflicts
+ {timer1exists} true if timer 1 available
+ {timer2exists} true if timer 2 available
+ ...
+ {timer15exists} true if timer 15 available
+ {timers[]} array with active timers (local and remote if remotetimers plugin is in use)
+ {timers[title]} title of timer
+ {timers[datetime]} date and time of timer
+ {timers[recording]} true if timer is recording currently
+ {timers[channelname]} name of channel for which timer is created
+ {timers[channelnumber]} number of channel
+ {timers[channelid]} ChannelID of channel
+ {timers[channellogoexists]} true if channel logo exists
+ -->
+ <timers>
+ <area x="85%" y="28%" width="14%" height="60%" layer="1">
+ <drawrectangle condition="gt({numtimers}, 0)" x="0" y="0" width="{areawidth}" height="{areaheight} / 4 * 99 / 100" color="{clrTransBlack}" />
+ <drawrectangle condition="gt({numtimers}, 1)" x="0" y="{areaheight} / 4" width="{areawidth}" height="{areaheight} / 4 * 99 / 100" color="{clrTransBlack}" />
+ <drawrectangle condition="gt({numtimers}, 2)" x="0" y="{areaheight} / 2" width="{areawidth}" height="{areaheight} / 4 * 99 / 100" color="{clrTransBlack}" />
+ <drawrectangle condition="gt({numtimers}, 3)" x="0" y="{areaheight} * 3 / 4" width="{areawidth}" height="{areaheight} / 4 * 99 / 100" color="{clrTransBlack}" />
+ </area>
+ <area x="85%" y="28%" width="14%" height="60%" layer="2">
+ <loop name="timers" x="0" y="0" orientation="vertical" columnwidth="100%" rowheight="{areaheight} / 4" overflow="cut">
+ <drawrectangle condition="{timers[recording]}" x="0" y="0" width="{columnwidth}" height="{rowheight} * 99 / 100" color="{clrTransRed}" />
+ <drawimage cache="true" name="logo" imagetype="channellogo" path="{timers[channelid]}" width="80%" height="{rowheight} / 2" align="center" y="5" />
+ <drawtextbox x="5" y="{height(logo)}+2" width="{columnwidth}-10" align="center" maxlines="2" font="{vdrOsd}" fontsize="4%" color="{clrWhite}" text="{timers[title]}" />
+ <drawtext name="datetime" align="center" y="{rowheight}*84/100" font="{vdrOsd}" fontsize="4%" color="{clrWhite}" text="{timers[datetime]}" />
+ </loop>
+ </area>
+ </timers>
+
+ <scrollbar>
+ <area x="30%" y="11%" width="2%" height="78%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+
+ <!-- Available Variables discusage:
+ {freetime} available disc capacity in hh:mm
+ {freepercent} available disc capacity in percent
+ {usedpercent} used disc capacity in percent
+ {freegb} available disc capacity in gigabytes
+ {discalert} true if disc usage is > 95%
+ {vdrusagestring} localized VDR internal usage string
+ -->
+ <discusage>
+ <area x="89%" y="11%" width="10%" height="16%" layer="1">
+ <fill condition="lt({freepercent}, 6)" color="{clrTransRed}" />
+ <fill condition="gt({freepercent}, 5)" color="{clrBackground}" />
+ <drawimage imagetype="skinpart" path="discpercent" x="0" y="82%" width="{areawidth}" height="18%"/>
+ </area>
+ <area x="89%" y="11%" width="10%" height="16%" layer="2">
+ <drawimage imagetype="icon" path="ico_discusage" align="center" y="2" width="{areawidth}*65/100" height="{areawidth}*65/100"/>
+ <drawtext align="center" y="42%" font="{vdrOsd}" fontsize="18%" color="{clrWhite}" text="{freetime}h {tr(free)}" />
+ <drawrectangle x="{areawidth}*{usedpercent}/100" y="82%" width="{areawidth} - {areawidth}*{usedpercent}/100" height="18%" color="{clrTransBlack}" />
+ <drawtext align="center" y="82%" font="{vdrOsd}" fontsize="19%" color="{clrWhite}" text="{usedpercent}%" />
+ </area>
+ </discusage>
+
+ <currentweather>
+ <area x="63%" y="11%" width="25%" height="16%" layer="1">
+ <fill color="{clrBackground}"/>
+ </area>
+ <area x="63%" y="11%" width="25%" height="16%" layer="2">
+ <drawimage name="weathericon" imagetype="icon" path="{icon}" x="5" valign="center" width="{areaheight}*0.7" height="{areaheight}*0.7"/>
+ </area>
+ <area x="75%" y="11%" width="12%" height="16%" layer="2">
+ <drawtext align="right" valign="center" font="{vdrOsd}" fontsize="40%" color="{clrWhite}" text="{temperature}°C" />
+ <drawtext x="0" y="5" font="{vdrOsd}" fontsize="18%" color="{clrWhite}" text="{mintemperature}°C - {maxtemperature}°C" />
+ <drawtext x="0" y="82%" font="{vdrOsd}" width="100%" fontsize="15%" color="{clrWhite}" text="{summary}" />
+ </area>
+ </currentweather>
+
+ <!-- Available Variables devices:
+ {numdevices} number of available devices
+ {devices[]} array with available devices
+ {devices[num]} number of current device
+ {devices[type]} type of device (DVB-S, DVB-C, ...)
+ {devices[istuned]} true if device is currently tuned to a transponder
+ {devices[livetv]} true if device is currently playing livetv
+ {devices[recording]} true if device is currently recording
+ {devices[hascam]} true if device has a CAM
+ {devices[cam]} number of CAM
+ {devices[signalstrength]} signalstrength of devcie
+ {devices[signalquality]} signalstrength of devcie
+ {devices[channelnumber]} number of the currently tuned channel
+ {devices[channelname]} name of the currently tuned channel
+ {devices[channelid]} ID of the currently tuned channel
+ {devices[source]} source of the currently tuned channel
+ -->
+ <devices>
+ </devices>
+
+ <!-- Available Variables systemload:
+ {load} current system load
+ -->
+ <systemload>
+ </systemload>
+
+ <menuitems x="{areawidth}*0.005" y="10%" orientation="vertical" width="28%" height="80%" align="center" numlistelements="10">
+ <!-- Available Variables main menu listelement:
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ <area x="0" width="100%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <area x="0" width="100%" layer="7">
+ <drawimage imagetype="skinpart" path="menubuttontop" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <area x="0" width="100%" layer="3">
+ <drawimage imagetype="menuicon" path="{icon}" x="10" valign="center" width="{areaheight}*0.8" height="{areaheight}*0.8"/>
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="23%" width="77%" layer="3">
+ <drawtext condition="not{current}" name="menutext" x="0" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItem}" text="{number} {label}" />
+ <drawtext condition="{current}" name="menutext" x="0" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItemSelected}" text="{number} {label}" />
+ </areascroll>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables main menu currentelement:
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ -->
+ <currentelement delay="50" fadetime="0">
+ </currentelement>
+ </menuitems>
+
+</menumain>
diff --git a/skins/nopacity/xmlfiles/displaymenurecordings.xml b/skins/nopacity/xmlfiles/displaymenurecordings.xml
new file mode 100644
index 0000000..53ca60d
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenurecordings.xml
@@ -0,0 +1,94 @@
+<menurecordings x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="33%" scaletvy="10%" scaletvwidth="65%" scaletvheight="80%">
+ <scrollbar>
+ <area x="30%" y="11%" width="2%" height="78%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+
+ <menuitems x="{areawidth}*0.005" y="10%" orientation="vertical" width="99%" height="80%" align="center" numlistelements="10">
+ <!-- Available Variables recordings menu listelement:
+ {name} Name of recording
+ {date} Date of recording
+ {time} Time of recording
+ {duration} real duration of recording in minutes
+ {durationevent} duration of corresponding event in minutes
+ {current} true if item is currently selected
+ {new} true if recording is new
+ {cutted} true if recording is cutted
+ {folder} true if item is a folder
+ {numrecordingsfolder} if item is a folder, number of recordings in this folder
+ {newrecordingsfolder} if item is a folder, number of new recordings in this folder
+ {hasposterthumbnail} true if a scraped poster thumbnail is available for recording
+ {thumbnailbwidth} width of scraped poster thumbnail
+ {thumbnailheight} height of scraped poster thumbnail
+ {thumbnailpath} absolute path of scraped poster thumbnail
+ -->
+ <listelement>
+ <!-- background and foreground-->
+ <area x="0" width="28%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <!-- Folders -->
+ <area condition="{folder}" x="1%" width="27%" layer="3">
+ <drawimage name="foldericon" imagetype="icon" path="ico_recfolder" x="0" width="0.9*{areaheight} * 92 / 136" height="0.9*{areaheight}" valign="center" />
+ </area>
+ <areascroll condition="{folder}" scrollelement="foldername" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="5%" width="23%" layer="3">
+ <drawtext condition="not{current}" name="foldername" x="0" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItem}" text="{name} ({numrecordingsfolder}, {newrecordingsfolder} new)" />
+ <drawtext condition="{current}" name="foldername" x="0" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItemSelected}" text="{name} ({numrecordingsfolder}, {newrecordingsfolder} new)" />
+ </areascroll>
+ <!-- Recording -->
+ <area condition="{hasposterthumbnail}++not{folder}" x="1%" width="4%" layer="3">
+ <drawimage imagetype="image" path="{thumbnailpath}" x="0" width="0.9*{areaheight} * {thumbnailbwidth} / {thumbnailheight}" height="0.9*{areaheight}" valign="center" />
+ </area>
+ <areascroll condition="not{folder}" scrollelement="recname" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="5%" width="23%" layer="3">
+ <drawtext condition="not{current}" name="recname" x="0" y="5" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItem}" text="{name}" />
+ <drawtext condition="{current}" name="recname" x="0" y="5" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItemSelected}" text="{name}" />
+ </areascroll>
+ <area condition="not{folder}" x="5%" width="23%" layer="3">
+ <drawtext condition="not{current}" x="0" y="55%" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItem}" text="{date} {time}" />
+ <drawtext condition="{current}" x="0" y="55%" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItemSelected}" text="{date} {time}" />
+ <drawimage condition="{new}" name="new" imagetype="icon" path="ico_recnew" x="{areawidth} - {areaheight}/2 - 5" y="50%" width="{areaheight}*4/10" height="{areaheight}*4/10" />
+ <drawimage condition="{new}++{cutted}" imagetype="icon" path="ico_cutted" x="{areawidth} - {areaheight} - 10" y="50%" width="{areaheight}*4/10" height="{areaheight}*4/10" />
+ <drawimage condition="not{new}++{cutted}" imagetype="icon" path="ico_cutted" x="{areawidth} - {areaheight}/2 - 5" y="50%" width="{areaheight}*4/10" height="{areaheight}*4/10" />
+ </area>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {name} Real Name of recording (Name of Recording Folder)
+ {epgname} Name of recording (Name from EPG)
+ {shorttext} Short Text of recording
+ {description} Descrption of recording
+ {date} Date of recording
+ {time} Time of recording
+ {duration} real duration of recording in minutes
+ {durationevent} duration of corresponding event in minutes
+ {new} true if recording is new
+ {cutted} true if recording is cutted
+ {folder} true if item is a folder
+ {numrecordingsfolder} if item is a folder, number of recordings in this folder
+ {newrecordingsfolder} if item is a folder, number of new recordings in this folder
+ {hasposter} true if a scraped poster is available for recording
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ -->
+ <currentelement delay="500" fadetime="300">
+ <area x="32%" y="2%" width="67%" height="96%" layer="2">
+ <fill color="{clrTransBlack}" />
+ <!-- header -->
+ <drawtext name="title" x="1%" y="0" width="98%" font="{vdrOsd}" fontsize="8%" color="{clrWhite}" text="{epgname}" />
+ <drawtext name="shorttext" x="1%" y="{height(title)}" width="98%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{shorttext}" />
+ <drawtext name="datetime" x="1%" y="{posy(shorttext)} + {height(shorttext)}" font="{vdrOsd}" fontsize="5%" color="{clrWhite}" text="{date} {time}, {duration} min" />
+ <!-- scraper poster -->
+ <drawimage condition="{hasposter}" name="poster" imagetype="image" path="{posterpath}" x="3*{areawidth}/4" y="{posy(datetime)} + {height(datetime)} + 20" width="{areawidth}/4" height="{areawidth}/4 * {posterheight} / {posterwidth}"/>
+ <!-- description -->
+ <drawtextbox condition="{hasposter}" x="1%" y="{posy(poster)}" width="98%" height="{areaheight} - {posy(poster)}" float="topright" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 10" font="{vdrOsd}" fontsize="5%" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="not{hasposter}" x="1%" y="{posy(poster)}" width="98%" height="{areaheight} - {posy(poster)}" font="{vdrOsd}" fontsize="5%" color="{clrWhite}" text="{description}" />
+ </area>
+ </currentelement>
+ </menuitems>
+
+</menurecordings>
\ No newline at end of file
diff --git a/skins/nopacity/xmlfiles/displaymenuschedules.xml b/skins/nopacity/xmlfiles/displaymenuschedules.xml
new file mode 100644
index 0000000..27b84e9
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenuschedules.xml
@@ -0,0 +1,235 @@
+<menuschedules x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="33%" scaletvy="10%" scaletvwidth="65%" scaletvheight="80%" >
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {channelnumber} Number of Channel of current event
+ {channelname} Name of current Channel of current event
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {whatsonfavorites} true if EPGSearch Favorites menu is displayed
+ -->
+ <header>
+ <area x="1%" y="0" width="64%" height="10%" layer="2">
+ <drawtext condition="{whatsonnow}||{whatsonnext}||{whatsonfavorites}" x="5" valign="center" font="{vdrOsd}" fontsize="80%" color="{clrWhite}" text="{title}" />
+ <drawimage name="logo" condition="{whatson}" imagetype="channellogo" path="{channelid}" x="0" width="15%" height="100%" align="left" valign="center" />
+ <drawtext condition="{whatson}" x="{width(logo)}+20" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrWhite}" text="{channelnumber} - {channelname}" />
+ </area>
+ </header>
+
+
+ <scrollbar>
+ <area x="30%" y="11%" width="2%" height="78%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+
+ <menuitems x="{areawidth}*0.005" y="10%" orientation="vertical" width="99%" height="80%" align="center" numlistelements="10">
+ <!-- Available Variables schedules menu listelement:
+ {title} title of event
+ {shorttext} shorttext of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event
+ {date} date of current event in dd.mm.yy
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ {channelname} Channel Name (for what's on now and next)
+ {channelid} ChannelID as path to display channel logo (for what's on now and next)
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {whatsonfavorites} true if EPGSearch Favorites menu is displayed
+ {timerpartitial} true if partitial timer is set for the event
+ {timerfull} true if full timer is set for the event
+ {hasVPS} true if event has VPS information
+ -->
+ <listelement>
+ <!-- background and foreground-->
+ <area x="0" width="28%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <area x="0" width="28%" layer="7">
+ <drawimage imagetype="skinpart" path="menubuttontop" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <!-- element whatson -->
+ <area condition="not{separator}++{whatson}++not{current}" x="1%" width="27%" layer="3">
+ <drawtext x="0" y="5%" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItem}" text="{start} - {stop}" />
+ <drawimage condition="{timerfull}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*5/10 - 10" y="10" width="{areaheight}*5/10" height="{areaheight}*5/10" />
+ <drawimage condition="{timerpartitial}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*3/10 - 10" y="10" width="{areaheight}*3/10" height="{areaheight}*3/10" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" condition="not{separator}++{whatson}++not{current}" x="1%" width="27%" layer="3">
+ <drawtext name="menutext" x="0" y="40%" font="{vdrOsd}" fontsize="55%" color="{clrFontMenuItem}" text="{title}" />
+ </areascroll>
+ <!-- current element whatson -->
+ <area condition="not{separator}++{whatson}++{current}" x="1%" width="27%" layer="3">
+ <drawtext x="0" y="5%" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItemSelected}" text="{start} - {stop}" />
+ <drawimage condition="{timerfull}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*5/10 - 10" y="10" width="{areaheight}*5/10" height="{areaheight}*5/10" />
+ <drawimage condition="{timerpartitial}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*3/10 - 10" y="10" width="{areaheight}*3/10" height="{areaheight}*3/10" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" condition="not{separator}++{whatson}++{current}" x="1%" width="27%" layer="3">
+ <drawtext name="menutext" x="0" y="40%" font="{vdrOsd}" fontsize="55%" color="{clrFontMenuItemSelected}" text="{title}" />
+ </areascroll>
+ <!-- element whatsonnow -->
+ <area condition="not{separator}++{whatsonnow}" x="5" width="8%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="100%" height="94%" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonnow}++not{current}" x="9%" width="18%" layer="3">
+ <drawtext x="0" y="5%" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItem}" text="{start} - {stop}" />
+ <drawimage condition="{timerfull}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*5/10 - 10" y="10" width="{areaheight}*5/10" height="{areaheight}*5/10" />
+ <drawimage condition="{timerpartitial}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*3/10 - 10" y="10" width="{areaheight}*3/10" height="{areaheight}*3/10" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" condition="not{separator}++{whatsonnow}++not{current}" x="9%" width="18%" layer="3">
+ <drawtext name="menutext" x="0" y="40%" font="{vdrOsd}" fontsize="55%" color="{clrFontMenuItem}" text="{title}" />
+ </areascroll>
+ <!-- current element whatsonnow -->
+ <area condition="not{separator}++{whatsonnow}++{current}" x="9%" width="18%" layer="3">
+ <drawtext x="0" y="5%" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItemSelected}" text="{start} - {stop}" />
+ <drawimage condition="{timerfull}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*5/10 - 10" y="10" width="{areaheight}*5/10" height="{areaheight}*5/10" />
+ <drawimage condition="{timerpartitial}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*3/10 - 10" y="10" width="{areaheight}*3/10" height="{areaheight}*3/10" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" condition="not{separator}++{whatsonnow}++{current}" x="9%" width="18%" layer="3">
+ <drawtext name="menutext" x="0" y="40%" font="{vdrOsd}" fontsize="55%" color="{clrFontMenuItemSelected}" text="{title}" />
+ </areascroll>
+ <!-- day or channel separator -->
+ <area condition="{separator}" x="0" width="28%" layer="3">
+ <drawimage name="sep" imagetype="icon" path="ico_daydelimiter" x="10" valign="center" width="{areaheight}-10" height="{areaheight}-10"/>
+ <drawtext x="{width(sep)} + 20" valign="center" font="{vdrOsd}" fontsize="60%" color="{clrFontInactive}" text="{title}" />
+ </area>
+ <!-- element whatsonnext -->
+ <area condition="not{separator}++{whatsonnext}" x="5" width="8%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="100%" height="94%" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonnext}++not{current}" x="9%" width="18%" layer="3">
+ <drawtext x="0" y="5%" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItem}" text="{start} - {stop}" />
+ <drawimage condition="{timerfull}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*5/10 - 10" y="10" width="{areaheight}*5/10" height="{areaheight}*5/10" />
+ <drawimage condition="{timerpartitial}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*3/10 - 10" y="10" width="{areaheight}*3/10" height="{areaheight}*3/10" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" condition="not{separator}++{whatsonnext}++not{current}" x="9%" width="18%" layer="3">
+ <drawtext name="menutext" x="0" y="40%" font="{vdrOsd}" fontsize="55%" color="{clrFontMenuItem}" text="{title}" />
+ </areascroll>
+ <!-- current element whatsonnext -->
+ <area condition="not{separator}++{whatsonnext}++{current}" x="9%" width="18%" layer="3">
+ <drawtext x="0" y="5%" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItemSelected}" text="{start} - {stop}" />
+ <drawimage condition="{timerfull}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*5/10 - 10" y="10" width="{areaheight}*5/10" height="{areaheight}*5/10" />
+ <drawimage condition="{timerpartitial}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*3/10 - 10" y="10" width="{areaheight}*3/10" height="{areaheight}*3/10" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" condition="not{separator}++{whatsonnext}++{current}" x="9%" width="18%" layer="3">
+ <drawtext name="menutext" x="0" y="40%" font="{vdrOsd}" fontsize="55%" color="{clrFontMenuItemSelected}" text="{title}" />
+ </areascroll>
+ <!-- element whatsonfavorites -->
+ <area condition="not{separator}++{whatsonfavorites}" x="5" width="8%" layer="3">
+ <drawimage name="logo" imagetype="channellogo" path="{channelid}" x="0" width="100%" height="94%" valign="center" />
+ </area>
+ <area condition="not{separator}++{whatsonfavorites}++not{current}" x="9%" width="18%" layer="3">
+ <drawtext x="0" y="5%" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItem}" text="{start} - {stop}" />
+ <drawimage condition="{timerfull}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*5/10 - 10" y="10" width="{areaheight}*5/10" height="{areaheight}*5/10" />
+ <drawimage condition="{timerpartitial}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*3/10 - 10" y="10" width="{areaheight}*3/10" height="{areaheight}*3/10" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" condition="not{separator}++{whatsonfavorites}++not{current}" x="9%" width="18%" layer="3">
+ <drawtext name="menutext" x="0" y="40%" font="{vdrOsd}" fontsize="55%" color="{clrFontMenuItem}" text="{title}" />
+ </areascroll>
+ <!-- current element whatsonfavorites -->
+ <area condition="not{separator}++{whatsonfavorites}++{current}" x="9%" width="18%" layer="3">
+ <drawtext x="0" y="5%" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItemSelected}" text="{start} - {stop}" />
+ <drawimage condition="{timerfull}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*5/10 - 10" y="10" width="{areaheight}*5/10" height="{areaheight}*5/10" />
+ <drawimage condition="{timerpartitial}" imagetype="icon" path="ico_activetimer" x="{areawidth} - {areaheight}*3/10 - 10" y="10" width="{areaheight}*3/10" height="{areaheight}*3/10" />
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" condition="not{separator}++{whatsonfavorites}++{current}" x="9%" width="18%" layer="3">
+ <drawtext name="menutext" x="0" y="40%" font="{vdrOsd}" fontsize="55%" color="{clrFontMenuItemSelected}" text="{title}" />
+ </areascroll> <!-- day or channel separator -->
+ <area condition="{separator}" x="0" width="28%" layer="3">
+ <drawimage name="sep" imagetype="icon" path="ico_daydelimiter" x="10" valign="center" width="{areaheight}-10" height="{areaheight}-10"/>
+ <drawtext x="{width(sep)} + 20" valign="center" font="{vdrOsd}" fontsize="60%" color="{clrFontInactive}" text="{title}" />
+ </area>
+ </listelement>
+ <!-- Available Variables schedules menu currentelement:
+ {title} title of event
+ {shorttext} shorttext of event
+ {description} detailed description of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event
+ {date} date of current event in dd.mm.yy
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {channelid} ChannelID as path to display channel logo
+ {hasposter} true if a scraped poster is available for this element
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {timerpartitial} true if partitial timer is set for the event
+ {timerfull} true if full timer is set for the event
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {schedule[]} array with next 10 schedules, only for whatsonnow and whatsonnext
+ {schedule[title]} title of event
+ {schedule[shorttext]} shorttext of event
+ {schedule[start]} start time of event in hh:mm
+ {schedule[stop]} stop time of event in hh:mm
+ -->
+ <currentelement delay="500" fadetime="300">
+ <area x="32%" y="2%" width="67%" height="96%" layer="2">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area condition="{whatson}" x="32%" y="2%" width="67%" height="96%" layer="2">
+ <!-- title -->
+ <drawtext name="title" align="center" y="0" font="{vdrOsd}" width="{areawidth}-20" fontsize="8%" color="{clrWhite}" text="{title}" />
+ <!-- progress bar if event is running -->
+ <drawtext condition="{running}" name="start" x="{areawidth}/4 - {width(start)}" y="9%" font="vdrOsd}" fontsize="6%" color="{clrWhite}" text="{start}" />
+ <drawtext condition="{running}" name="stop" x="{areawidth}*3/4" y="9%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{stop}" />
+ <drawellipse condition="{running}" x="{areawidth} / 4 + 5" y="{posy(start)} + {height(start)} / 2 - 6" width="11" height="11" quadrant="0" color="{clrBackground}" />
+ <drawrectangle condition="{running}" x="{areawidth} / 4 + 10" y="{posy(start)} + {height(start)} / 2 - 6" width="{areawidth}/2 - 20" height="11" color="{clrBackground}" />
+ <drawellipse condition="{running}" x="3 * {areawidth} / 4 - 16" y="{posy(start)} + {height(start)} / 2 - 6" width="11" height="11" quadrant="0" color="{clrBackground}" />
+ <drawellipse condition="{running}" x="{areawidth} / 4 + 6" y="{posy(start)} + {height(start)} / 2 - 5" width="9" height="9" quadrant="0" color="{clrProgressbar}" />
+ <drawrectangle condition="{running}" x="{areawidth} / 4 + 10" y="{posy(start)} + {height(start)} / 2 - 5" width="{areawidth}/2 * {elapsed} / {duration} - 20 * {elapsed} / {duration}" height="9" color="{clrProgressbar}" />
+ <drawellipse condition="{running}" x="{areawidth} / 4 + 10 + {areawidth}/2 * {elapsed} / {duration} - 20 * {elapsed} / {duration} - 4" y="{posy(start)} + {height(start)} / 2 - 5" width="9" height="9" quadrant="0" color="{clrProgressbar}" />
+ <!-- start and stop if event is not running -->
+ <drawtext condition="not{running}" x="10" y="9%" font="{vdrOsd}" fontsize="{areaheight}/20" color="{clrWhite}" text="{start} - {stop} ({duration} min)" />
+ <!-- scraper poster -->
+ <drawimage condition="{hasposter}" name="poster" imagetype="image" path="{posterpath}" x="{areawidth} - {areawidth}/3" y="{posy(start)} + {height(start)} + 10" width="{areawidth}/3" height="{areawidth}/3 * {posterheight} / {posterwidth}"/>
+ <!-- description -->
+ <drawtextbox condition="{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" float="topright" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 20" font="{vdrOsd}" fontsize="{areaheight}/20" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="not{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" font="{vdrOsd}" fontsize="{areaheight}/20" color="{clrWhite}" text="{description}" />
+ </area>
+ <!-- whatsonnow and whotsonnext -->
+ <area condition="{whatsonnow}||{whatsonnext}" x="32%" y="2%" width="67%" height="76%" layer="2">
+ <!-- title -->
+ <drawtext align="center" y="0" font="{vdrOsd}" width="{areawidth}-20" fontsize="10%" color="{clrWhite}" text="{title}" />
+ <!-- progress bar if event is running -->
+ <drawtext condition="{running}" name="start" x="{areawidth}/4 - {width(start)}" y="11%" font="vdrOsd}" fontsize="8%" color="{clrWhite}" text="{start}" />
+ <drawtext condition="{running}" name="stop" x="{areawidth}*3/4" y="11%" font="{vdrOsd}" fontsize="8%" color="{clrWhite}" text="{stop}" />
+ <drawellipse condition="{running}" x="{areawidth} / 4 + 5" y="{posy(start)} + {height(start)} / 2 - 6" width="11" height="11" quadrant="0" color="{clrBackground}" />
+ <drawrectangle condition="{running}" x="{areawidth} / 4 + 10" y="{posy(start)} + {height(start)} / 2 - 6" width="{areawidth}/2 - 20" height="11" color="{clrBackground}" />
+ <drawellipse condition="{running}" x="3 * {areawidth} / 4 - 16" y="{posy(start)} + {height(start)} / 2 - 6" width="11" height="11" quadrant="0" color="{clrBackground}" />
+ <drawellipse condition="{running}" x="{areawidth} / 4 + 6" y="{posy(start)} + {height(start)} / 2 - 5" width="9" height="9" quadrant="0" color="{clrProgressbar}" />
+ <drawrectangle condition="{running}" x="{areawidth} / 4 + 10" y="{posy(start)} + {height(start)} / 2 - 5" width="{areawidth}/2 * {elapsed} / {duration} - 20 * {elapsed} / {duration}" height="9" color="{clrProgressbar}" />
+ <drawellipse condition="{running}" x="{areawidth} / 4 + 10 + {areawidth}/2 * {elapsed} / {duration} - 20 * {elapsed} / {duration} - 4" y="{posy(start)} + {height(start)} / 2 - 5" width="9" height="9" quadrant="0" color="{clrProgressbar}" />
+ <!-- start and stop if event is not running -->
+ <drawtext condition="not{running}" x="10" y="9%" font="{vdrOsd}" fontsize="{areaheight}/20" color="{clrWhite}" text="{start} - {stop} ({duration} min)" />
+ <!-- scraper poster -->
+ <drawimage condition="{hasposter}" name="poster" imagetype="image" path="{posterpath}" x="{areawidth}* 2 / 3" y="{posy(start)} + {height(start)} + 10" width="{areawidth}/3" height="{areawidth}/3 * {posterheight} / {posterwidth}"/>
+ <!-- description -->
+ <drawtextbox condition="{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" float="topright" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 10" font="{vdrOsd}" fontsize="{areaheight}/18" color="{clrWhite}" text="{description}" />
+ <drawtextbox condition="not{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" font="{vdrOsd}" fontsize="{areaheight}/18" color="{clrWhite}" text="{description}" />
+ </area>
+ <areascroll condition="{whatsonnow}||{whatsonnext}" mode="forthandback" orientation="vertical" delay="1000" scrollspeed="medium" x="32%" y="78%" width="67%" height="20%" layer="2">
+ <drawtext x="10" y="0" font="{semibold}" fontsize="20%" color="{clrWhite}" text="{tr(nextschedules)}:" />
+ <loop name="schedule" x="0" y="{areaheight}/4 + 5" orientation="vertical">
+ <drawtext x="10" font="{vdrOsd}" width="{areawidth}-20" fontsize="20%" color="{clrWhite}" text="{schedule[start]} {schedule[title]}" />
+ </loop>
+ </areascroll>
+ </currentelement>
+ </menuitems>
+</menuschedules>
+
diff --git a/skins/nopacity/xmlfiles/displaymenusetup.xml b/skins/nopacity/xmlfiles/displaymenusetup.xml
new file mode 100644
index 0000000..519d818
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenusetup.xml
@@ -0,0 +1,45 @@
+<menusetup x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="33%" scaletvy="10%" scaletvwidth="65%" scaletvheight="80%" >
+
+ <scrollbar>
+ <area x="30%" y="11%" width="2%" height="78%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+
+ <menuitems x="{areawidth}*0.005" y="10%" orientation="vertical" width="28%" height="80%" align="center" numlistelements="10">
+ <!-- Available Variables setup menu listelement:
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ <area x="0" width="100%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <area x="0" width="100%" layer="7">
+ <drawimage imagetype="skinpart" path="menubuttontop" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <area x="0" width="100%" layer="3">
+ <drawimage imagetype="menuicon" path="{icon}" x="10" valign="center" width="{areaheight}*0.9" height="{areaheight}*0.9"/>
+ </area>
+ <areascroll scrollelement="menutext" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="25%" width="75%" layer="3">
+ <drawtext condition="not{current}" name="menutext" x="0" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItem}" text="{number} {label}" />
+ <drawtext condition="{current}" name="menutext" x="0" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItemSelected}" text="{number} {label}" />
+ </areascroll>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables main menu currentelement:
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ -->
+ <currentelement delay="50" fadetime="0">
+ </currentelement>
+ </menuitems>
+
+</menusetup>
diff --git a/skins/nopacity/xmlfiles/displaymenutimers.xml b/skins/nopacity/xmlfiles/displaymenutimers.xml
new file mode 100644
index 0000000..5b1999b
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymenutimers.xml
@@ -0,0 +1,102 @@
+<menutimers x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="33%" scaletvy="10%" scaletvwidth="65%" scaletvheight="80%">
+ <scrollbar>
+ <area x="30%" y="11%" width="2%" height="78%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+
+ <menuitems x="{areawidth}*0.005" y="10%" orientation="vertical" width="99%" height="80%" align="center" numlistelements="10">
+ <!-- Available Variables channels menu listelement:
+ {title} Title of Timer
+ {timerstart} Start Time of Timer in hh::mm
+ {timerstop} End Time of Timer in hh::mm
+ {day} Day (numerical)
+ {dayname} Day, for repeating timers days where timer is active
+ {channelname} Name of channel which is set for the timer
+ {channelid} ID of channel which is set for the timer (for dispalying channel logo)
+ {channelnumber} Number of channel which is set for the timer
+ {eventtitle} Title of corresponding event
+ {eventstart} Start Time of corresponding event in hh::mm
+ {eventstop} Stop Time of corresponding event in hh::mm
+ {current} true if item is currently selected
+ {flagactive} true if timer is active
+ {flaginstant} true if timer is an instant timer
+ {flagvps} true if timer uses VPS
+ {flagrecording} true if is recording currently
+ {flagpending} true if timer is pending
+ -->
+ <listelement>
+ <!-- background and foreground-->
+ <area x="0" width="28%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <!-- channel logo -->
+ <area x="5" width="6%" layer="3">
+ <drawimage imagetype="channellogo" path="{channelid}" x="0" width="100%" height="100%" valign="center" />
+ </area>
+ <!-- datetime and icons -->
+ <area x="1%" width="28%" layer="3">
+ <drawtext condition="not{current}" x="22%" y="5" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItem}" text="{dayname} {day}. {timerstart} - {timerstop}" />
+ <drawtext condition="{current}" x="22%" y="5" font="{vdrOsd}" fontsize="40%" color="{clrFontMenuItemSelected}" text="{dayname} {day}. {timerstart} - {timerstop}" />
+ <drawimage condition="{flagactive}" imagetype="icon" path="ico_timer_active" x="{areawidth} - 0.5*{areaheight} - 20" y="0" width="0.5*{areaheight}" height="0.5*{areaheight}" />
+ <drawimage condition="not{flagactive}" imagetype="icon" path="ico_timer_inactive" x="{areawidth} - 0.5*{areaheight} - 20" y="0" width="0.5*{areaheight}" height="0.5*{areaheight}" />
+ <drawimage condition="{flagrecording}" name="active" imagetype="icon" path="ico_timer_recording" x="{areawidth} - {areaheight} - 20" y="0" width="0.5*{areaheight}" height="0.5*{areaheight}" />
+ </area>
+ <!-- Timer Name -->
+ <areascroll scrollelement="timername" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="7%" width="20%" layer="3">
+ <drawtext condition="not{current}" name="timername" x="0" y="50%" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItem}" text="{title}" />
+ <drawtext condition="{current}" name="timername" x="0" y="50%" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItemSelected}" text="{title}" />
+ </areascroll>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {title} Title of Timer
+ {timerstart} Start Time of Timer in hh::mm
+ {timerstop} End Time of Timer in hh::mm
+ {day} Day (numerical)
+ {dayname} Day, for repeating timers days where timer is active
+ {channelname} Name of channel which is set for the timer
+ {channelid} ID of channel which is set for the timer (for dispalying channel logo)
+ {channelnumber} Number of channel which is set for the timer
+ {eventtitle} Title of corresponding event
+ {eventstart} Start Time of corresponding event in hh::mm
+ {eventstop} Stop Time of corresponding event in hh::mm
+ {eventshorttext} Short Text corresponding event
+ {eventdescription} Description corresponding event
+ {hasposter} true if a scraped poster is available for event
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {flagactive} true if timer is active
+ {flaginstant} true if timer is an instant timer
+ {flagvps} true if timer uses VPS
+ {flagrecording} true if is recording currently
+ {flagpending} true if timer is pending
+ -->
+ <currentelement delay="500" fadetime="300">
+ <area x="32%" y="2%" width="67%" height="96%" layer="2">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area condition="{flagactive}" x="32%" y="2%" width="67%" height="96%" layer="2">
+ <!-- title -->
+ <drawtext name="title" align="center" y="0" font="{vdrOsd}" width="{areawidth}-20" fontsize="8%" color="{clrWhite}" text="{eventtitle} - {eventshorttext}" />
+ <!-- start and stop if event is not running -->
+ <drawtext x="10" y="9%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{dayname} {eventstart} - {eventstop}, {channelname}" />
+ <!-- scraper poster -->
+ <drawimage condition="{hasposter}" name="poster" imagetype="image" path="{posterpath}" x="{areawidth} - {areawidth}/4" y="17%" width="{areawidth}/4" height="{areawidth}/4 * {posterheight} / {posterwidth}"/>
+ <!-- description -->
+ <drawtextbox condition="{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" float="topright" floatwidth="{width(poster)} + 10" floatheight="{height(poster)} + 20" font="{vdrOsd}" fontsize="5%" color="{clrWhite}" text="{eventdescription}" />
+ <drawtextbox condition="not{hasposter}" x="10" y="{posy(poster)}" width="99%" height="{areaheight} - {posy(poster)}" font="{vdrOsd}" fontsize="5%" color="{clrWhite}" text="{eventdescription}" />
+ </area>
+ <area condition="not{flagactive}" x="32%" y="2%" width="67%" height="96%" layer="2">
+ <drawtext x="10" y="0" font="{vdrOsd}" fontsize="8%" color="{clrWhite}" text="{channelname}" />
+ <drawtext x="10" y="10%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{timerstart} - {timerstop}" />
+ </area>
+ </currentelement>
+
+ </menuitems>
+
+</menutimers>
\ No newline at end of file
diff --git a/skins/nopacity/xmlfiles/displaymessage.xml b/skins/nopacity/xmlfiles/displaymessage.xml
new file mode 100644
index 0000000..84d9470
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displaymessage.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaymessage SYSTEM "../../../dtd/displaymessage.dtd">
+
+<displaymessage x="0" y="0" width="100%" height="100%" fadetime="300">
+
+ <background>
+ </background>
+
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ <area x="5%" y="88%" width="90%" height="10%" layer="6">
+ <drawimage condition="{status}" imagetype="skinpart" path="messageStatus" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{info}" imagetype="skinpart" path="messageInfo" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{warning}" imagetype="skinpart" path="messageWarning" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{error}" imagetype="skinpart" path="messageError" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="5%" y="88%" width="90%" height="10%" layer="7">
+ <drawtext align="center" valign="center" font="{light}" fontsize="50%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+
+</displaymessage>
diff --git a/skins/nopacity/xmlfiles/displayreplay.xml b/skins/nopacity/xmlfiles/displayreplay.xml
new file mode 100644
index 0000000..e77fc20
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displayreplay.xml
@@ -0,0 +1,342 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayreplay SYSTEM "../../../dtd/displayreplay.dtd">
+
+<displayreplay x="0" y="0" width="100%" height="100%" fadetime="{fadeTime}">
+
+ <background>
+ <area x="1%" y="74%" width="98%" height="25%" layer="1" transparency="{transparency}">
+ <drawimage imagetype="skinpart" path="displayreplayback" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <area x="1%" y="74%" width="98%" height="25%" layer="7">
+ <drawimage imagetype="skinpart" path="displayreplaytop" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <!-- background progress bar -->
+ <area x="3%" y="83%" width="94%" height="2%" layer="2">
+ <drawellipse x="0" y="0" width="{areaheight}" height="{areaheight}" color="{clrBlack}" quadrant="0" />
+ <drawellipse x="{areawidth}-{areaheight}" y="0" width="{areaheight}" height="{areaheight}" color="{clrBlack}" quadrant="0" />
+ <drawrectangle x="{areaheight}/2" y="0" width="{areawidth} - {areaheight}" height="{areaheight}" color="{clrBlack}" />
+ </area>
+ </background>
+
+ <backgroundmodeonly>
+ <area x="40%" y="86%" width="20%" height="11%" layer="3">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="1" y="1" width="{areawidth} -2" height="{areaheight} -2" color="{clrTransBlack}" />
+ </area>
+ </backgroundmodeonly>
+
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {year} year in yyyy
+ -->
+ <datetime>
+ <area x="63%" y="74%" width="35%" height="6%" layer="2">
+ <drawtext align="right" valign="center" font="{vdrOsd}" fontsize="95%" color="{clrWhite}" width="100%" text="{daynameshort} {day}.{month} {time}" />
+ </area>
+ </datetime>
+
+ <!-- Available Variables scrapercontent:
+ {mediapath} Full Path of Poster or Banner to use in image path attribute
+ {mediawidth} width of image in pixel
+ {mediaheight} height of image in pixel
+ {isbanner} true if image is a banner, false if it is a poster
+ -->
+ <scrapercontent>
+ <area condition="{isbanner}" x="0" y="0" width="{areaheight}*0.13*{mediawidth}/{mediaheight}" height="13%" layer="2">
+ <drawimage imagetype="image" path="{mediapath}" align="center" valign="center" width="{areawidth}" height="{areaheight}"/>
+ </area>
+ <area condition="not{isbanner}" x="0" y="0" width="{areaheight}*0.5*{mediawidth}/{mediaheight}" height="50%" layer="2">
+ <drawimage imagetype="image" path="{mediapath}" x="5" y="5" width="{areawidth}-10" height="{areaheight}-10"/>
+ </area>
+ </scrapercontent>
+
+ <!-- Available Variables rectitle:
+ {rectitle} Title of Recording
+ {recsubtitle} Subtitle of the Recording
+ {recdate} Date Recording in dd.mm.yy
+ {rectime} Time of Recording in hh:mm
+ -->
+ <rectitle>
+ <area x="3%" y="74%" width="60%" height="6%" layer="2">
+ <drawtext name="title" x="0" valign="center" font="{vdrOsd}" fontsize="95%" color="{clrWhite}" width="100%" text="{rectitle}" />
+ <drawtext condition="isset{recsubtitle}" x="{width(title)}" valign="center" font="{vdrOsd}" fontsize="95%" color="{clrWhite}" width="100%" text=" - {recsubtitle}" />
+ </area>
+ </rectitle>
+
+ <!-- Available Variables recinfo:
+ {screenwidth} width of currently displayed recording in px
+ {screenheight} height of currently displayed recording in px
+ {resolution} resolution: hd1080i, hd720p, sd576i
+ {aspect} screen aspect, each 4:3, 16:9 or 21:9
+ {isHD} true for hd1080i and hd720p
+ {isWideScreen} true if aspect is 16:9 or 21:9
+ -->
+ <recinfo>
+ <area x="{areawidth}*0.98 - {areaheight}*0.15" y="93%" width="{areaheight}*0.15" height="5%" layer="2">
+ <drawimage imagetype="icon" path="ico_{resolution}" x="0" y="0" width="{areaheight}*3" height="{areaheight}"/>
+ </area>
+ </recinfo>
+
+ <!-- Available Variables currenttime:
+ {reccurrent} Current Time in hh:mm:ss
+ -->
+ <currenttime>
+ <area x="3%" y="86%" width="30%" height="4%" layer="2">
+ <drawtext x="0" valign="center" font="{vdrOsd}" fontsize="100%" color="{clrWhite}" text="{reccurrent}" />
+ </area>
+ </currenttime>
+
+ <!-- Available Variables totaltime:
+ {rectotal} Total Time in hh:mm:ss
+ -->
+ <totaltime>
+ <area x="67%" y="86%" width="30%" height="4%" layer="2">
+ <drawtext align="right" valign="center" font="{vdrOsd}" fontsize="100%" color="{clrWhite}" text="{rectotal}" />
+ </area>
+ </totaltime>
+
+ <!-- Available Variables progressbar:
+ {current} current frame of recording
+ {total} total frames of recording
+ -->
+ <progressbar>
+ <area x="3%" y="83%" width="94%" height="2%" layer="2">
+ <drawellipse x="1" y="1" width="{areaheight}-2" height="{areaheight}-2" color="{clrProgressbar}" quadrant="0" />
+ <drawrectangle x="{areaheight}/2" y="1" width="{current}/{total}*{areawidth} - {current}/{total}*{areaheight}" height="{areaheight}-2" color="{clrProgressbar}" />
+ </area>
+ </progressbar>
+
+ <!-- Available Variables cutmarks:
+ {marks[]} array of available marks
+ {marks[position]} frame of current mark
+ {marks[endposition]} frame where startmark ends
+ {marks[total]} total number of frames
+ {marks[startmark]} true if mark is start mark
+ -->
+ <cutmarks>
+ <area x="3%" y="82%" width="94%" height="4%" layer="3">
+ <loop name="marks" x="0" y="0" orientation="absolute">
+ <drawrectangle x="{marks[position]}/{marks[total]}*{areawidth}" y="0" width="1" height="100%" color="{clrTransWhite}" />
+ <drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="0" width="5" height="1" color="{clrTransWhite}" />
+ <drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="{areaheight}-1" width="5" height="1" color="{clrTransWhite}" />
+ <drawrectangle condition="not{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth} - 5" y="0" width="5" height="1" color="{clrTransWhite}" />
+ <drawrectangle condition="not{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth} - 5" y="{areaheight}-1" width="5" height="1" color="{clrTransWhite}" />
+ <drawrectangle condition="{marks[startmark]}" x="{marks[position]}/{marks[total]}*{areawidth}" y="30%" width="{marks[endposition]}/{marks[total]}*{areawidth} - {marks[position]}/{marks[total]}*{areawidth}" height="40%" color="{clrTransWhite}" />
+ </loop>
+ </area>
+ </cutmarks>
+
+ <!-- Available Variables controlicons and controliconsmodeonly:
+ {play} true if recording is played currently
+ {pause} true if recording is paused
+ {forward} true if fast forwarding
+ {forward1x} true if fast forwarding 1x (with 3 trickspeeds)
+ {forward2x} true if fast forwarding 2x (with 3 trickspeeds)
+ {forward3x} true if fast forwarding 3x (with 3 trickspeeds)
+ {rewind} true if rewinding
+ {rewind1x} true if rewinding 1x (with 3 trickspeeds)
+ {rewind2x} true if rewinding 2x (with 3 trickspeeds)
+ {rewind3x} true if rewinding 3x (with 3 trickspeeds)
+ -->
+ <controlicons>
+ <area x="30%" y="88%" width="40%" height="7%" layer="3">
+ <drawimage condition="not{rewind} ++ not{rewind1x} ++ not{rewind2x} ++ not{rewind3x}" imagetype="icon" path="ico_rew_off" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind}" imagetype="icon" path="ico_rew" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind1x}" imagetype="icon" path="ico_rew_1x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind2x}" imagetype="icon" path="ico_rew_2x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind3x}" imagetype="icon" path="ico_rew_3x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{pause}" imagetype="icon" path="ico_pause_off" x="{areawidth}/2 - {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{pause}" imagetype="icon" path="ico_pause" x="{areawidth}/2 - {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{play}" imagetype="icon" path="ico_play_off" x="{areawidth}/2" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{play}" imagetype="icon" path="ico_play" x="{areawidth}/2" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{forward} ++ not{forward1x} ++ not{forward2x} ++ not{forward3x}" imagetype="icon" path="ico_ff_off" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward}" imagetype="icon" path="ico_ff" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward1x}" imagetype="icon" path="ico_ff_1x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward2x}" imagetype="icon" path="ico_ff_2x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward3x}" imagetype="icon" path="ico_ff_3x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ </area>
+ </controlicons>
+
+ <controliconsmodeonly>
+ <area x="30%" y="88%" width="40%" height="7%" layer="3">
+ <drawimage condition="not{rewind} ++ not{rewind1x} ++ not{rewind2x} ++ not{rewind3x}" imagetype="icon" path="ico_rew_off" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind}" imagetype="icon" path="ico_rew" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind1x}" imagetype="icon" path="ico_rew_1x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind2x}" imagetype="icon" path="ico_rew_2x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{rewind3x}" imagetype="icon" path="ico_rew_3x" x="{areawidth}/2 - 2*{areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{pause}" imagetype="icon" path="ico_pause_off" x="{areawidth}/2 - {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{pause}" imagetype="icon" path="ico_pause" x="{areawidth}/2 - {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{play}" imagetype="icon" path="ico_play_off" x="{areawidth}/2" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{play}" imagetype="icon" path="ico_play" x="{areawidth}/2" y="0" width="{areaheight}" height="{areaheight}"/>
+
+ <drawimage condition="not{forward} ++ not{forward1x} ++ not{forward2x} ++ not{forward3x}" imagetype="icon" path="ico_ff_off" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward}" imagetype="icon" path="ico_ff" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward1x}" imagetype="icon" path="ico_ff_1x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward2x}" imagetype="icon" path="ico_ff_2x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{forward3x}" imagetype="icon" path="ico_ff_3x" x="{areawidth}/2 + {areaheight}" y="0" width="{areaheight}" height="{areaheight}"/>
+ </area>
+ </controliconsmodeonly>
+
+ <!-- Available Variables jump:
+ {jump} time to jump to in hh:mm
+ -->
+ <jump>
+ <area x="5%" y="90%" width="30%" height="7%" layer="2">
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="80%" color="{clrWhite}" text="{jump}" />
+ </area>
+ </jump>
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ <area x="5%" y="88%" width="90%" height="10%" layer="6">
+ <drawimage condition="{status}" imagetype="skinpart" path="messageStatus" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{info}" imagetype="skinpart" path="messageInfo" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{warning}" imagetype="skinpart" path="messageWarning" x="0" y="0" width="100%" height="100%" />
+ <drawimage condition="{error}" imagetype="skinpart" path="messageError" x="0" y="0" width="100%" height="100%" />
+ </area>
+ <area x="5%" y="88%" width="90%" height="10%" layer="7">
+ <drawtext align="center" valign="center" font="{light}" fontsize="50%" color="{clrWhite}" text="{text}" />
+ </area>
+ </message>
+
+ <!-- Available Variables onpause and onpausemodeonly:
+ {name} title of recording
+ {shorttext} shorttext of recording
+ {description} description of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of recording in hh:mm
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+ <onpause delay="60" fadetime="{fadeTime}">
+ <area x="0" y="0" width="100%" height="100%" layer="7">
+ <fill color="{clrTransBlackDark}" />
+ </area>
+ </onpause>
+
+ <onpausemodeonly delay="20" fadetime="{fadeTime}">
+ <area x="0" y="0" width="100%" height="100%" layer="7">
+ <fill color="{clrTransBlackDark}" />
+ </area>
+ <area x="0" y="0" width="100%" height="100%" layer="6">
+ <drawtext align="center" valign="center" font="{vdrOsd}" fontsize="25%" color="{clrWhite}" text="{tr(pause)}" />
+ <drawimage condition="{isseries}" imagetype="image" path="{seriesbanner1path}" align="center" y="10" width="{areawidth}*0.5" height="{areawidth} * 0.5 * {seriesbanner1height} / {seriesbanner1width}"/>
+ <drawimage condition="{ismovie}" imagetype="image" path="{posterpath}" x="10" y="10" width="{areaheight} * 0.4 * {posterwidth} / {posterheight}" height="{areaheight} * 0.4"/>
+ </area>
+ </onpausemodeonly>
+</displayreplay>
diff --git a/skins/nopacity/xmlfiles/displayvolume.xml b/skins/nopacity/xmlfiles/displayvolume.xml
new file mode 100644
index 0000000..6c54ee9
--- /dev/null
+++ b/skins/nopacity/xmlfiles/displayvolume.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayvolume SYSTEM "../../../dtd/displayvolume.dtd">
+
+<displayvolume x="20%" y="75%" width="60%" height="10%" fadetime="{fadeTime}">
+
+ <background>
+ </background>
+
+ <!-- Available Variables volume:
+ {volume} current volume, range from 0 to 255
+ {volpercent} current volume in %
+ {maxvolume} maximal volume
+ {mute} true if volume is muted
+ -->
+ <volume>
+ <!-- Background -->
+ <area x="0" y="0" width="100%" height="100%" layer="1" transparency="{transparency}">
+ <drawimage imagetype="skinpart" path="displayvolume" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ <!-- Header -->
+ <area x="0" y="3%" width="100%" height="40%" layer="2">
+ <drawtext x="10" valign="center" font="{vdrOsd}" fontsize="100%" color="{clrWhite}" text="{tr(volume)}: {volpercent}%" />
+ <drawimage condition="not{mute}" imagetype="icon" path="ico_volume" x="{areawidth} - 2*{areaheight}" y="5" width="{areaheight}" height="{areaheight}"/>
+ <drawimage condition="{mute}" imagetype="icon" path="ico_mute" x="{areawidth} - 2*{areaheight}" y="5" width="{areaheight}" height="{areaheight}"/>
+ </area>
+ <!-- Volumebar Background -->
+ <area x="4%" y="60%" width="92%" height="30%" layer="2">
+ <drawellipse x="0" y="0" width="{areaheight}" height="{areaheight}" color="{clrBlack}" quadrant="0" />
+ <drawellipse x="1" y="1" width="{areaheight}-2" height="{areaheight}-2" color="{clrProgressbar}" quadrant="0" />
+ <drawellipse x="{areawidth}-{areaheight}" y="0" width="{areaheight}" height="{areaheight}" color="{clrBlack}" quadrant="0" />
+ <drawrectangle x="{areaheight}/2" y="0" width="{areawidth} - {areaheight}" height="{areaheight}" color="{clrBlack}" />
+ </area>
+ <!-- Volumebar -->
+ <area x="5%" y="60%" width="91%" height="30%" layer="3">
+ <drawrectangle x="1" y="1" width="{volume}/{maxvolume}*{areawidth} - {volume}/{maxvolume}*{areaheight}/2" height="{areaheight}-2" color="{clrProgressbar}" />
+ <drawellipse x="{volume}/{maxvolume}*{areawidth} - {volume}/{maxvolume}*{areaheight}/2" y="1" width="{areaheight}/2 - 2" height="{areaheight}-2" color="{clrProgressbar}" quadrant="5" />
+ </area>
+ </volume>
+
+</displayvolume>
diff --git a/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecast.xml b/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecast.xml
new file mode 100644
index 0000000..521db36
--- /dev/null
+++ b/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecast.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0" scaletvx="33%" scaletvy="10%" scaletvwidth="65%" scaletvheight="80%">
+ <scrollbar>
+ <area x="30%" y="11%" width="2%" height="78%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+
+ <menuitems x="0" y="10%" orientation="vertical" width="100%" height="82%" align="center" numlistelements="10">
+ <!-- Available Variables:
+ {current}
+ {menuitemtext} "Current Weather", "Next 48 hours" or "Next 7 days"
+ {iscurrent} true if item is "Current Weather"
+ {ishourly} true if item is "Next 48 hours"
+ {isdaily} true if item is "Next 7 days"
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+
+ If {iscurrent} is true, the following tokens are set:
+ {timestamp} timestamp in hh:mm dd.mm of current forecast
+ {temperature} current temperature in °C
+ {apparenttemperature} apparent (felt) temperature in °C
+ {summary} short summary of current weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {precipitationintensity} precipitation intensity in l/qm
+ {precipitationprobability} precipitation probability in %
+ {precipitationtype} precipitation type (snow, ...)
+ {humidity} humidity in %
+ {windspeed} wind speed in km/h
+ {windbearing} wind bearing in degrees
+ {windbearingstring} wind bearing as human readable string (e.g NE, NNE, ...)
+ {visibility} visibility in km
+ {cloudcover} cloud cover in %
+ {pressure} pressure in HPa
+ {ozone} Ozone in DU (Dobson Unit)
+
+ If {ishourly} is true, the following tokens are set:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+
+ {hourly[]} array with up to 48 hourly forecasts
+ {hourly[num]} number of forecast, starting at 1
+ {hourly[timestamp]} timestamp in hh:mm
+ {hourly[temperature]} temperature in °C
+ {hourly[apparenttemperature]} apparent (felt) temperature in °C
+ {hourly[summary]} short summary
+ {hourly[icon]} path to use in <drawimage> to display appropriate weather icon
+ {hourly[precipitationintensity]} precipitation intensity in l/qm
+ {hourly[precipitationprobability]} precipitation probability in %
+ {hourly[precipitationtype]} precipitation type (snow, ...)
+ {hourly[humidity]} humidity in %
+ {hourly[windspeed]} wind speed in km/h
+ {hourly[windbearing]} wind bearing in degrees
+ {hourly[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {hourly[visibility]} visibility in km
+ {hourly[cloudcover]} cloud cover in %
+ {hourly[pressure]} pressure in HPa
+ {hourly[ozone]} Ozone in DU (Dobson Unit)
+
+ If {isdaily} is true, the following tokens are set:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+
+ {daily[day]} day of forecast in dd.mm
+ {daily[dayname]} three letter abbrivated day name
+ {daily[temperaturemin]} minimum temperature at this day in °C
+ {daily[temperaturemintime]} time of minimum temperature
+ {daily[temperaturemax]} maximum temperature at this day in °C
+ {daily[temperaturemaxtime]} time of maximum temperature
+ {daily[summary]} short summary
+ {daily[icon]} path to use in <drawimage> to display appropriate weather icon
+ {daily[precipitationintensity]} precipitation intensity in l/qm
+ {daily[precipitationprobability]} precipitation probability in %
+ {daily[precipitationtype]} precipitation type (snow, ...)
+ {daily[humidity]} humidity in %
+ {daily[windspeed]} wind speed in km/h
+ {daily[windbearing]} wind bearing in degrees
+ {daily[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {daily[visibility]} visibility in km
+ {daily[cloudcover]} cloud cover in %
+ {daily[pressure]} pressure in HPa
+ {daily[ozone]} Ozone in DU (Dobson Unit)
+ -->
+ <listelement>
+ <!-- Background -->
+ <area x="0" width="28%" layer="2">
+ <drawimage condition="not{current}" imagetype="skinpart" path="menubutton" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ <drawimage condition="{current}" imagetype="skinpart" path="menubuttonactive" x="0" y="1%" width="{areawidth}" height="{areaheight}*0.98"/>
+ </area>
+ <areascroll condition="not{current}" scrollelement="menuelement" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="0" width="28%" layer="3">
+ <drawtext name="menuelement" x="10" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItem}" text="{menuitemtext}" />
+ </areascroll>
+ <areascroll condition="{current}" scrollelement="menuelement" mode="forthandback" orientation="horizontal" delay="1000" scrollspeed="medium" x="0" width="28%" layer="3">
+ <drawtext name="menuelement" x="10" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrFontMenuItemSelected}" text="{menuitemtext}" />
+ </areascroll>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- All Tokens from listelement are available -->
+ <currentelement delay="100" fadetime="0">
+ <area x="32%" y="2%" width="67%" height="96%" layer="2">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area condition="{iscurrent}" x="32%" y="2%" width="67%" height="96%" layer="3">
+ <drawimage name="weathericon" imagetype="icon" path="{icon}" x="2%" y="0" width="{areawidth}*0.2" height="{areawidth}*0.2"/>
+ <drawtext align="right" y="2%" font="{semibold}" fontsize="6%" color="{clrWhite}" text="{city}" />
+ <drawtext align="right" y="8%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{timestamp}" />
+ <drawtext align="right" y="14%" font="{vdrOsd}" fontsize="12%" color="{clrWhite}" text="{temperature}°C" />
+ <drawtext align="right" y="26%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{summary}" />
+ <drawtext x="2%" y="45%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(apparenttemp)}: {apparenttemperature} °C" />
+ <drawtext x="2%" y="51%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(precipitationprobability)}: {precipitationprobability} %" />
+ <drawtext x="2%" y="57%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(precipitationintensity)}: {precipitationintensity} l/qm" />
+ <drawtext x="2%" y="63%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(humidity)}: {humidity} %" />
+ <drawtext x="2%" y="69%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(windspeed)}: {windspeed} km/h" />
+ <drawtext x="2%" y="75%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(windbearing)}: {windbearingstring} ({windbearing} °)" />
+ <drawtext x="2%" y="81%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(cloudcover)}: {cloudcover} %" />
+ </area>
+ <area condition="{ishourly}" x="32%" y="2%" width="67%" height="96%" layer="3">
+ <loop name="hourly" x="0" y="0" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/12" overflow="cut">
+ <drawtext x="2%" font="{semibold}" fontsize="7%" valign="center" color="{clrWhite}" text="{hourly[timestamp]}" />
+ <drawimage imagetype="icon" path="{hourly[icon]}" x="22%" valign="center" width="{rowheight}*0.8" height="{rowheight}*0.8"/>
+ <drawtext x="35%" font="{vdrOsd}" fontsize="7%" valign="center" color="{clrWhite}" text="{hourly[temperature]}°C" />
+ <drawtext x="60%" font="{vdrOsd}" fontsize="5%" valign="center" width="38%" color="{clrWhite}" text="{hourly[summary]}" />
+ <drawrectangle x="2%" y="{rowheight} - 1" width="{columnwidth}*0.96" height="1" color="{clrWhite}" />
+ </loop>
+ </area>
+ <area condition="{isdaily}" x="32%" y="2%" width="67%" height="96%" layer="3">
+ <loop name="daily" x="2%" y="0" orientation="vertical" columnwidth="{areawidth}*0.96" rowheight="{areaheight}/7" overflow="cut">
+ <drawtext x="0" font="{semibold}" fontsize="{rowheight}/2" y="5" color="{clrWhite}" text="{daily[dayname]} {daily[day]}" />
+ <drawtext x="35%" font="{vdrOsd}" fontsize="{rowheight}/2" y="5" color="{clrWhite}" text="{daily[temperaturemin]}°C - {daily[temperaturemax]}°C" />
+ <drawtext x="0" font="{vdrOsd}" fontsize="{rowheight}*0.3" width="{columnwidth} - {rowheight}*0.7" y="{rowheight}*0.6" color="{clrWhite}" text="{daily[summary]}" />
+ <drawimage imagetype="icon" path="{daily[icon]}" x="{columnwidth} - {rowheight}*0.7" valign="center" width="{rowheight}*0.7" height="{rowheight}*0.7"/>
+ <drawrectangle x="0" y="{rowheight} - 1" width="{columnwidth}" height="1" color="{clrWhite}" />
+ </loop>
+ </area>
+ </currentelement>
+ </menuitems>
+</menuplugin>
diff --git a/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml b/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml
new file mode 100644
index 0000000..ae9c2a6
--- /dev/null
+++ b/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecastdetailcurrent.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle x="0" y="0" width="100%" height="10%" color="{clrBackground}" />
+ </area>
+ <area x="0" y="0" width="100%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="headertop" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+ <scrollbar>
+ <area x="97%" y="25%" width="2%" height="60%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+ <!-- Available Variables in detailheader and tab:
+ {menuheader} "Current Weather"
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+ {timestamp} timestamp in hh:mm dd.mm of current forecast
+ {temperature} current temperature in °C
+ {apparenttemperature} apparent (felt) temperature in °C
+ {temperaturemin} minimum temperature the day in °C
+ {temperaturemax} maximum temperature the day in °C
+ {summary} short summary of current weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {precipitationintensity} precipitation intensity in l/qm
+ {precipitationprobability} precipitation probability in %
+ {precipitationtype} precipitation type (snow, ...)
+ {humidity} humidity in %
+ {windspeed} wind speed in km/h
+ {windbearing} wind bearing in degrees
+ {windbearingstring} wind bearing as human readable string (e.g NE, NNE, ...)
+ {visibility} visibility in km
+ {cloudcover} cloud cover in %
+ {pressure} pressure in HPa
+ {ozone} Ozone in DU (Dobson Unit)
+ -->
+ <detailheader>
+ <area x="1%" y="10%" width="98%" height="15%" layer="2">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area x="1%" y="10%" width="97%" height="15%" layer="3">
+ <drawimage name="weathericon" imagetype="icon" path="{icon}" align="right" valign="center" width="{areaheight}*0.7" height="70%"/>
+ <drawtext name="temp" x="{areawidth} - {width(weathericon)} - {width(temp)} - 10" valign="center" font="{vdrOsd}" fontsize="50%" color="{clrWhite}" text="{temperature}°C" />
+ <drawtext x="2%" y="20%" font="{semibold}" fontsize="35%" color="{clrWhite}" text="{tr(conditions)} {tr(for)} {city}, {timestamp}:" />
+ <drawtext x="2%" y="55%" font="{semibold}" fontsize="35%" color="{clrWhite}" text="{summary}" />
+ </area>
+ </detailheader>
+
+ <tab name="current" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <drawtext x="0" y="6%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(apparenttemp)}: {apparenttemperature}°C" />
+ <drawtext x="0" y="12%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(todaymin)}: {mintemperature}°C, {tr(todaymax)}: {maxtemperature}°C" />
+ <drawtext x="0" y="18%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(precipitationprobability)}: {precipitationprobability} %" />
+ <drawtext x="0" y="24%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(precipitationintensity)}: {precipitationintensity} l/qm" />
+ <drawtext x="0" y="30%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(humidity)}: {humidity} %" />
+ <drawtext x="0" y="36%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(windspeed)}: {windspeed} km/h aus {windbearingstring}" />
+ <drawtext x="0" y="42%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(visibility)}: {visibility} km" />
+ <drawtext x="0" y="48%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(cloudcover)}: {cloudcover} %" />
+ <drawtext x="0" y="54%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(pressure)}: {pressure} HPa" />
+ <drawtext x="0" y="60%" font="{vdrOsd}" fontsize="6%" color="{clrWhite}" text="{tr(ozone)}: {ozone} DU" />
+ </tab>
+</menuplugin>
diff --git a/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml b/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml
new file mode 100644
index 0000000..433bf99
--- /dev/null
+++ b/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecastdetaildaily.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle x="0" y="0" width="100%" height="10%" color="{clrBackground}" />
+ </area>
+ <area x="0" y="0" width="100%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="headertop" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+ <scrollbar>
+ <area x="97%" y="25%" width="2%" height="60%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+
+ <!-- Available Variables in detailheader and tab:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+
+ {daily[day]} day of forecast in dd.mm
+ {daily[dayname]} three letter abbrivated day name
+ {daily[temperaturemin]} minimum temperature at this day in °C
+ {daily[temperaturemintime]} time of minimum temperature
+ {daily[temperaturemax]} maximum temperature at this day in °C
+ {daily[temperaturemaxtime]} time of maximum temperature
+ {daily[summary]} short summary
+ {daily[icon]} path to use in <drawimage> to display appropriate weather icon
+ {daily[precipitationintensity]} precipitation intensity in l/qm
+ {daily[precipitationprobability]} precipitation probability in %
+ {daily[precipitationtype]} precipitation type (snow, ...)
+ {daily[humidity]} humidity in %
+ {daily[windspeed]} wind speed in km/h
+ {daily[windbearing]} wind bearing in degrees
+ {daily[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {daily[visibility]} visibility in km
+ {daily[cloudcover]} cloud cover in %
+ {daily[pressure]} pressure in HPa
+ {daily[ozone]} Ozone in DU (Dobson Unit)
+ -->
+
+ <detailheader>
+ <area x="1%" y="10%" width="98%" height="15%" layer="2">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area x="1%" y="10%" width="97%" height="15%" layer="3">
+ <drawimage name="weathericon" imagetype="icon" path="{icon}" align="right" valign="center" width="{areaheight}*0.7" height="70%"/>
+ <drawtextbox x="2%" y="15%" width="80%" maxlines="2" font="{semibold}" fontsize="35%" color="{clrWhite}" text="{summary}" />
+ </area>
+ </detailheader>
+
+ <tab name="current" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <loop name="daily" x="0" y="1%" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/5">
+ <drawtext x="0" font="{semibold}" fontsize="8%" valign="center" color="{clrWhite}" text="{daily[dayname]} {daily[day]}" />
+ <drawimage imagetype="icon" path="{daily[icon]}" x="2.2*{rowheight}" valign="center" width="{rowheight}*0.8" height="{rowheight}*0.8"/>
+ <drawtext x="3.5*{rowheight}" font="{vdrOsd}" fontsize="{rowheight}*0.3" y="0" color="{clrWhite}" text="{daily[temperaturemin]}°C - {daily[temperaturemax]}°C ({tr(max)} {daily[temperaturemaxtime]}, {tr(min)} {daily[temperaturemintime]})" />
+ <drawtext x="3.5*{rowheight}" font="{vdrOsd}" fontsize="{rowheight}/4" y="{rowheight}*0.25" width="{columnwidth} - 3.5*{rowheight}" color="{clrWhite}" text="{daily[summary]}" />
+ <drawtext x="3.5*{rowheight}" font="{vdrOsd}" fontsize="{rowheight}/4" y="{rowheight}*0.5" width="{columnwidth} - 3.5*{rowheight}" color="{clrWhite}" text="{tr(precipitationprobability)} {daily[precipitationprobability]}%, {daily[precipitationintensity]} l/qm, {tr(windspeed)} {daily[windspeed]} km/h {tr(from)} {daily[windbearingstring]}" />
+ <drawtext x="3.5*{rowheight}" font="{vdrOsd}" fontsize="{rowheight}/4" y="{rowheight}*0.75" width="{columnwidth} - 3.5*{rowheight}" color="{clrWhite}" text="{tr(cloudcover)} {daily[cloudcover]}%, {tr(visibility)} {daily[visibility]} km, {tr(pressure)} {daily[pressure]} HPa, {tr(ozone)} {daily[ozone]} DU" />
+ <drawrectangle x="0" y="{rowheight} - 1" width="{columnwidth}" height="1" color="{clrWhite}" />
+ </loop>
+ </tab>
+</menuplugin>
diff --git a/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml b/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml
new file mode 100644
index 0000000..ccde6f7
--- /dev/null
+++ b/skins/nopacity/xmlfiles/plug-weatherforecast-weatherforecastdetailhourly.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE menuplugin SYSTEM "../../../dtd/displaymenuplugin.dtd">
+
+<menuplugin x="0" y="0" width="100%" height="100%" fadetime="0">
+ <background>
+ <area x="0" y="0" width="100%" height="100%" layer="1">
+ <fill color="{clrTransBlack}" />
+ <drawrectangle x="0" y="0" width="100%" height="10%" color="{clrBackground}" />
+ </area>
+ <area x="0" y="0" width="100%" height="10%" layer="2">
+ <drawimage imagetype="skinpart" path="headertop" x="0" y="0" width="100%" height="100%"/>
+ </area>
+ </background>
+ <scrollbar>
+ <area x="97%" y="25%" width="2%" height="60%" layer="2">
+ <fill color="{clrBorder}" />
+ <drawrectangle x="2" y="2" width="{areawidth} - 4" height="{areaheight} - 4" color="{clrTransparent}" />
+ <drawrectangle x="4" y="4 + {areaheight} * {offset} / 1000" width="{areawidth} - 8" height="{areaheight} * {height} / 1000 - 8" color="{clrScrollbar}" />
+ </area>
+ </scrollbar>
+
+ <!-- Available Variables in detailheader and tab:
+ {summary} short summary of weather
+ {icon} path to use in <drawimage> to display appropriate weather icon
+ {city} configured city to display weather for
+ {latitude} latitude
+ {longitude} longitude
+
+ {hourly[]} array with up to 48 hourly forecasts
+ {hourly[num]} number of forecast, starting at 1
+ {hourly[timestamp]} timestamp in hh:mm
+ {hourly[temperature]} temperature in °C
+ {hourly[apparenttemperature]} apparent (felt) temperature in °C
+ {hourly[summary]} short summary
+ {hourly[icon]} path to use in <drawimage> to display appropriate weather icon
+ {hourly[precipitationintensity]} precipitation intensity in l/qm
+ {hourly[precipitationprobability]} precipitation probability in %
+ {hourly[precipitationtype]} precipitation type (snow, ...)
+ {hourly[humidity]} humidity in %
+ {hourly[windspeed]} wind speed in km/h
+ {hourly[windbearing]} wind bearing in degrees
+ {hourly[windbearingstring]} wind bearing as human readable string (e.g NE, NNE, ...)
+ {hourly[visibility]} visibility in km
+ {hourly[cloudcover]} cloud cover in %
+ {hourly[pressure]} pressure in HPa
+ {hourly[ozone]} Ozone in DU (Dobson Unit)
+ -->
+ <detailheader>
+ <area x="1%" y="10%" width="98%" height="15%" layer="2">
+ <fill color="{clrTransBlack}" />
+ </area>
+ <area x="1%" y="10%" width="97%" height="15%" layer="3">
+ <drawimage name="weathericon" imagetype="icon" path="{icon}" align="right" valign="center" width="{areaheight}*0.7" height="70%"/>
+ <drawtextbox x="2%" y="15%" width="80%" maxlines="2" font="{semibold}" fontsize="35%" color="{clrWhite}" text="{summary}" />
+ </area>
+ </detailheader>
+
+ <tab name="current" x="2%" y="25%" width="94%" height="60%" layer="2" scrollheight="{areaheight}/4">
+ <loop name="hourly" x="0" y="1%" orientation="vertical" columnwidth="{areawidth}" rowheight="{areaheight}/5">
+ <drawtext x="0" font="{semibold}" fontsize="9%" valign="center" color="{clrWhite}" text="{hourly[timestamp]}" />
+ <drawimage imagetype="icon" path="{hourly[icon]}" x="{rowheight}*1.2" valign="center" width="{rowheight}*0.8" height="{rowheight}*0.8"/>
+ <drawtext name="temp" x="2.2*{rowheight} + 0.75*{rowheight} - {width(temp)}/2" font="{vdrOsd}" fontsize="11%" y="0" color="{clrWhite}" text="{hourly[temperature]}°C" />
+ <drawtext name="felt" x="2.2*{rowheight} + 0.75*{rowheight} - {width(felt)}/2" font="{vdrOsd}" fontsize="5%" y="{rowheight}*0.6" color="{clrWhite}" text="{tr(felt)} {hourly[apparenttemperature]}°C" />
+ <drawtext x="4.2*{rowheight}" font="{vdrOsd}" fontsize="{rowheight}/3-2" y="0" width="{columnwidth} - 4*{rowheight}" color="{clrWhite}" text="{hourly[summary]}" />
+ <drawtext x="4.2*{rowheight}" font="{vdrOsd}" fontsize="{rowheight}/3-2" y="{rowheight}/3" width="{columnwidth} - 4*{rowheight}" color="{clrWhite}" text="{tr(precipitationprobability)} {hourly[precipitationprobability]}%, {hourly[precipitationintensity]} l/qm" />
+ <drawtext x="4.2*{rowheight}" font="{vdrOsd}" fontsize="{rowheight}/3-2" y="{rowheight}*2/3" width="{columnwidth} - 4*{rowheight}" color="{clrWhite}" text="{tr(windspeed)} {hourly[windspeed]} km/h {tr(from)} {hourly[windbearingstring]}" />
+ <drawrectangle x="0" y="{rowheight} - 1" width="{columnwidth}" height="1" color="{clrWhite}" />
+ </loop>
+ </tab>
+</menuplugin>
diff --git a/skinskeleton/globals.xml b/skinskeleton/globals.xml
new file mode 100644
index 0000000..01f37fb
--- /dev/null
+++ b/skinskeleton/globals.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE globals SYSTEM "../../dtd/globals.dtd">
+
+<globals>
+ <!--
+ define all your needed colors here
+ -->
+ <colors>
+ </colors>
+ <!--
+ these variables can be used everywhere in the templates
+ variabls of type int can also be used as conditions, just
+ set such a variable to 1 for true and 0 for false
+ -->
+ <variables>
+ </variables>
+ <!--
+ translations used in the skin
+ -->
+ <translations>
+ </translations>
+ <!--
+ The three Fonts FontOSD, FontFix and FontSml configured in VDR
+ can be used in all template "font" attributes with this tokens:
+ {vdrOsd}
+ {vdrFix}
+ {vdrSml}
+ If you like to use further fonts, just define them below.
+ Syntax:
+ <font name="tokenname">fontname</font>
+ These fonts can then also be used in all templates in the "font"
+ attribute.
+ if an invalid font is used in a template, vdrOsd is used as default.
+ -->
+ <fonts>
+ </fonts>
+</globals>
diff --git a/skinskeleton/setup.xml b/skinskeleton/setup.xml
new file mode 100644
index 0000000..c73d6d4
--- /dev/null
+++ b/skinskeleton/setup.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE setup SYSTEM "../../dtd/setup.dtd">
+
+<setup>
+ <!--
+ define all your parameters here which should be configurable via
+ OSD and the skindesigner setup menu.
+ <submenu> and <parameter> tags are allowed, <submenu> can be nested
+ with arbitrary depth.
+ Submenus must carry the attributes "name" and "displaytext". "name"
+ is for internal usage, "displaytext" is used for displaying the submenu
+ in the menu and can be an translation token
+ Parameters must have type "bool" or "integer". For "bool" Parameters
+ a choice yes/no is shown in the setup menu, a "integer" parameter
+ can be configured to a value between "min" and "max". If "min" is not
+ set, "0" is the minimum, if "max" is not set, "1000" is maximum.
+ "displaytext" is used to display the option in the setup menu.
+ The configured parameter value is the default value.
+ -->
+ <menu>
+ </menu>
+
+ <!--
+ translations of displaytexts
+ -->
+ <translations>
+ </translations>
+</setup>
diff --git a/skinskeleton/themes/default/theme.xml b/skinskeleton/themes/default/theme.xml
new file mode 100644
index 0000000..f9dce83
--- /dev/null
+++ b/skinskeleton/themes/default/theme.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE globals SYSTEM "../../../../dtd/globals.dtd">
+
+<globals>
+ <!--
+ define all your needed colors here
+ -->
+ <colors>
+ </colors>
+ <!--
+ these variables can be used everywhere in the templates
+ variabls of type int can also be used as conditions, just
+ set such a variable to 1 for true and 0 for false
+ -->
+ <variables>
+ </variables>
+ <!--
+ translations used in the skin
+ -->
+ <translations>
+ </translations>
+ <!--
+ The three Fonts FontOSD, FontFix and FontSml configured in VDR
+ can be used in all template "font" attributes with this tokens:
+ {vdrOsd}
+ {vdrFix}
+ {vdrSml}
+ If you like to use further fonts, just define them below.
+ Syntax:
+ <font name="tokenname">fontname</font>
+ These fonts can then also be used in all templates in the "font"
+ attribute.
+ if an invalid font is used in a template, vdrOsd is used as default.
+ -->
+ <fonts>
+ </fonts>
+</globals>
diff --git a/skinskeleton/xmlfiles/displayaudiotracks.xml b/skinskeleton/xmlfiles/displayaudiotracks.xml
new file mode 100644
index 0000000..1989bb9
--- /dev/null
+++ b/skinskeleton/xmlfiles/displayaudiotracks.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayaudiotracks SYSTEM "../../../dtd/displayaudiotracks.dtd">
+
+<displayaudiotracks x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!-- Available Variables background:
+ {numtracks} number of displayed tracks
+ -->
+ <background>
+ </background>
+
+ <!-- Available Variables header:
+ {numtracks} number of displayed tracks
+ {title} title of menu
+ -->
+ <header>
+ </header>
+
+ <!-- Available Variables header:
+ {numelements} number of displayed tracks
+ -->
+ <menuitems x="0" y="{areaheight} - {numelements} * {areaheight} / 10" orientation="vertical" width="100%" height="{numelements} * {areaheight} / 10" align="top" numlistelements="{numelements}">
+ <!-- Available Variables auidotrack listelement:
+ {current} true if item is currently selected
+ {title} title of auio track
+ -->
+ <listelement>
+ </listelement>
+ </menuitems>
+
+</displayaudiotracks>
diff --git a/skinskeleton/xmlfiles/displaychannel.xml b/skinskeleton/xmlfiles/displaychannel.xml
new file mode 100644
index 0000000..5c359a7
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaychannel.xml
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaychannel SYSTEM "../../../dtd/displaychannel.dtd">
+
+<displaychannel x="0" y="0" width="100%" height="100%" fadetime="0">
+
+ <background>
+ </background>
+
+ <!-- Available Variables channelinfo:
+ {channelnumber} Number of Channel, with "-" in case of channel switching
+ {channelname} Name of current Channel
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {switching} true if a number is pressed on the remote to switch to a dedicated channel
+ -->
+ <channelinfo>
+ </channelinfo>
+
+ <!-- Available Variables epginfo:
+ {currenttitle} Title of the current Schedule
+ {currentsubtitle} Subtitle of the current Schedule
+ {currentstart} Start of current Schedule in hh:mm
+ {currentstop} End of current Schedule in hh:mm
+ {currentduration} Duration of current Schedule in min
+ {currentdurationhours} Duration, full hours
+ {currentdurationminutes} Duration, rest of minutes
+ {currentelapsed} Elapsed time of current Schedule in min
+ {currentremaining} Remaining time of current Schedule in min
+ {currentrecording} true if current Schedule is recorded
+ {hasVPS} true if current Schedule has VPS
+ {nexttitle} Title of next Schedule
+ {nextsubtitle} Subtitle of next Schedule
+ {nextstart} Start of next Schedule in hh:mm
+ {nextstop} Stop of next Schedule in hh:mm
+ {nextduration} Duration of next Schedule in min
+ {nextdurationhours} Duration, full hours
+ {nextdurationminutes} Duration, rest of minutes
+ {nextrecording} true if next Schedule will be recorded
+ -->
+ <epginfo>
+ </epginfo>
+
+ <!-- Available Variables progressbar:
+ {start} Start of current Schedule in hh:mm
+ {stop} End of current Schedule in hh:mm
+ {duration} Total Duration of current Schedule in seconds
+ {elapsed} Elapsed time of current Schedule in seconds
+ {remaining} Remaining time of current Schedule in seconds
+ -->
+ <progressbar>
+ </progressbar>
+
+ <!-- Available Variables statusinfo:
+ {isRadio} true if channel is a radio channel
+ {hasVT} true if channel has video text
+ {isStereo} true if a stereo audio trac is available
+ {isDolby} true if a dolby audio track is available
+ {isEncrypted} true if channel is encrypted
+ {isRecording} true if currently a recording is running on this channel
+ {newmails} true if mailbox plugin is installed and new mails are available
+ -->
+ <statusinfo>
+ </statusinfo>
+
+ <!-- Available Variables audioinfo:
+ {numaudiotracks} number of available audio tracks for current channel
+ {audiochannel} 0 if current channel is stereo, 1 for left chanel only, 2 for right channel only
+ {trackdesc} description of the current audio track
+ {tracklang} language of the current audio track
+ -->
+ <audioinfo>
+ </audioinfo>
+
+
+ <!-- Available Variables screenresolution:
+ {screenwidth} width of currently displayed channel in px
+ {screenheight} height of currently displayed channel in px
+ {resolution} resolution: hd1080i, hd720p, sd576i
+ {aspect} screen aspect, each 4:3, 16:9 or 21:9
+ {isHD} true for hd1080i and hd720p
+ {isWideScreen} true if aspect is 16:9 or 21:9
+ -->
+ <screenresolution>
+ </screenresolution>
+
+ <!-- Available Variables dvbdeviceinfo:
+ {prevAvailable} true if previous Channel Group is avaialble
+ {nextAvailable} true if next Channel Group is avaialble
+ {group} Name of current Channel Group
+ {nextgroup} Name of next Channel Group
+ {prevgroup} Name of prev Channel Group
+ {sepexists} true if a channel separator logo exists
+ {seppath} path for separator logo to use in imagetype "seplogo"
+ -->
+ <channelgroup>
+ </channelgroup>
+
+ <!-- Available Variables signalquality:
+ {signalstrength} STR value of currently displayed channel
+ {signalquality} SNR value of currently displayed channel
+ -->
+ <signalquality>
+ </signalquality>
+
+ <!-- background of signalmeter, will only be drawn if signalquality was deleted -->
+ <signalqualityback>
+ </signalqualityback>
+
+ <!-- Available Variables devices:
+ {numdevices} number of available devices
+ {devices[]} array with available devices
+ {devices[num]} number of current device
+ {devices[type]} type of device (DVB-S, DVB-C, ...)
+ {devices[istuned]} true if device is currently tuned to a transponder
+ {devices[livetv]} true if device is currently playing livetv
+ {devices[recording]} true if device is currently recording
+ {devices[hascam]} true if device has a CAM
+ {devices[cam]} number of CAM
+ {devices[signalstrength]} signalstrength of devcie
+ {devices[signalquality]} signalstrength of devcie
+ {devices[channelnumber]} number of the currently tuned channel
+ {devices[channelname]} name of the currently tuned channel
+ {devices[channellogoexists]} true if a channel logo exists
+ {devices[channelid]} ID of the currently tuned channel
+ {devices[source]} source of the currently tuned channel
+ -->
+ <devices>
+ </devices>
+
+ <!-- Available Variables currentweather:
+ {timestamp} timestamp of forecast in dd.mm hh:mm
+ {temperature} current temperature in °C
+ {apparenttemperature} apparent (feeled) temperature
+ {mintemperature} minimum daily temperature in °C
+ {maxtemperature} maximum daily temperature in °C
+ {summary} short weather summary
+ {icon} weather icon
+ {precipitationintensity} precipitation intensity in l/m2
+ {precipitationprobability} precipitation probability in %
+ {precipitationtype} precipitation type
+ {humidity} humidity in %
+ {windspeed} windspeed in km/h
+ {windbearing} wind bearing in °
+ {windbearingstring} wind bearing (N, NE, ...)
+ {visibility} visibility in km
+ {cloudcover} cloud cover in %
+ {pressure} pressure in HPo
+ {ozone} ozone value in DU
+ -->
+ <currentweather>
+ </currentweather>
+
+ <!-- Available Variables scrapercontent:
+ {posterpath} Full Path of Poster to use in image path attribute
+ {posterwidth} width of poster in pixel
+ {posterheight} height of poster in pixel
+ {hasPoster} true if poster is available
+ {bannerpath} Full Path of banner to use in image path attribute
+ {bannerwidth} width of banner in pixel
+ {bannerheight} height of banner in pixel
+ {hasBanner} true if banner is available
+
+ Use this tokens if you want to display a banner for series and a poster for movies:
+ {mediapath} Full Path of Poster or Banner to use in image path attribute
+ {mediawidth} width of image in pixel
+ {mediaheight} height of image in pixel
+ {isbanner} true if image is a banner, false if it is a poster
+ -->
+ <scrapercontent>
+ </scrapercontent>
+
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {monthnameshort} 3 letter abbrivation of month name
+ {year} year in yyyy
+ -->
+ <datetime>
+ </datetime>
+
+ <!-- Available Variables time:
+ {sec} current seconds
+ {min} current minutes
+ {hour} current hours
+ {hmins} current "hourminutes" to display an hour hand
+ -->
+ <time>
+ </time>
+
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ </message>
+
+ <!-- Available Variables customtokens:
+ all custom tokens set by the svdrp command SCTK are available in this viewelement
+ For instance, use an appropriate script which runs periodically as cronjob and
+ sets these custom tokens with svdrpsend or dbus2vdr
+ -->
+ <customtokens>
+ </customtokens>
+
+</displaychannel>
diff --git a/skinskeleton/xmlfiles/displaymenu.xml b/skinskeleton/xmlfiles/displaymenu.xml
new file mode 100644
index 0000000..1a31df0
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenu.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaymenu SYSTEM "../../../dtd/displaymenu.dtd" [
+<!ENTITY displaymenudefault SYSTEM "displaymenudefault.xml">
+<!ENTITY displaymenumain SYSTEM "displaymenumain.xml">
+<!ENTITY displaymenusetup SYSTEM "displaymenusetup.xml">
+<!ENTITY displaymenuschedules SYSTEM "displaymenuschedules.xml">
+<!ENTITY displaymenutimers SYSTEM "displaymenutimers.xml">
+<!ENTITY displaymenuchannels SYSTEM "displaymenuchannels.xml">
+<!ENTITY displaymenurecordings SYSTEM "displaymenurecordings.xml">
+<!ENTITY displaymenudetailepg SYSTEM "displaymenudetailepg.xml">
+<!ENTITY displaymenudetailrecording SYSTEM "displaymenudetailrecording.xml">
+<!ENTITY displaymenudetailtext SYSTEM "displaymenudetailtext.xml">
+]>
+
+<displaymenu x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!--
+ The following background, header, datetime and colorbuttons definitions are default
+ implementations. If one or more of these elements are not implemented in the subview,
+ the default implementations are used.
+ -->
+ <background>
+ </background>
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ {freetime} available disc capacity in hh:mm
+ {freepercent} available disc capacity in percent
+ {usedpercent} used disc capacity in percent
+ {freegb} available disc capacity in gigabytes
+ {discalert} true if disc usage is > 95%
+ {vdrusagestring} localized VDR internal usage string
+ -->
+ <header>
+ </header>
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {monthnameshort} 3 letter abbrivation of month name
+ {year} year in yyyy
+ -->
+ <datetime>
+ </datetime>
+ <!-- Available Variables time:
+ {sec} current seconds
+ {min} current minutes
+ {hour} current hours
+ {hmins} current "hourminutes" to display an hour hand
+ -->
+ <time>
+ </time>
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is an status message
+ {info} true if message is an info message
+ {warning} true if message is an warn message
+ {error} true if message is an error message
+ -->
+ <message>
+ </message>
+ <!-- Available Variables colorbuttons:
+ {red1} true if red button is button 1
+ {red2} true if red button is button 2
+ {red3} true if red button is button 3
+ {red4} true if red button is button 4
+ {green1} true if green button is button 1
+ {green2} true if green button is button 2
+ {green3} true if green button is button 3
+ {green4} true if green button is button 4
+ {yellow1} true if yellow button is button 1
+ {yellow2} true if yellow button is button 2
+ {yellow3} true if yellow button is button 3
+ {yellow4} true if yellow button is button 4
+ {blue1} true if blue button is button 1
+ {blue2} true if blue button is button 2
+ {blue3} true if blue button is button 3
+ {blue4} true if blue button is button 4
+ {red} label of red button
+ {green} label of green button
+ {yellow} label of yellow button
+ {blue} label of blue button
+ -->
+ <colorbuttons>
+ </colorbuttons>
+ &displaymenudefault;
+ &displaymenumain;
+ &displaymenusetup;
+ &displaymenuschedules;
+ &displaymenutimers;
+ &displaymenuchannels;
+ &displaymenurecordings;
+ &displaymenudetailepg;
+ &displaymenudetailrecording;
+ &displaymenudetailtext;
+</displaymenu>
diff --git a/skinskeleton/xmlfiles/displaymenuchannels.xml b/skinskeleton/xmlfiles/displaymenuchannels.xml
new file mode 100644
index 0000000..ba6ef24
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenuchannels.xml
@@ -0,0 +1,81 @@
+<menuchannels x="0" y="0" width="100%" height="100%" fadetime="0">
+ <menuitems x="0" y="0" orientation="vertical" width="100%" height="100%" align="center" numlistelements="16">
+ <!-- Available Variables channels menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {number} number of the displayed channel
+ {name} name of the displayed channel
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {transponder} Transponder of channel
+ {frequency} Frequency of channel
+ {source} Source of channel (S, C, T)
+ {sourcedescription} Descriptin of source from sources.conf
+ {position} orbital position of the satellite in case this is a DVB-S source
+ {isAtsc} true if channel is a ATSC channel
+ {isCable} true if channel is cable channel
+ {isSat} true if channel is a satellite channel
+ {isTerr} true if channel is terrestrical
+ {presenteventtitle} title of present event on this channel
+ {presenteventstart} present event start time in hh::mm
+ {presenteventstop} present event event stop time in hh::mm
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {menuitemx} x position of according menu item
+ {menuitemy} y position of according menu item
+ {menuitemwidth} width of according menu item
+ {menuitemheight} height of according menu item
+ {number} number of the displayed channel
+ {name} name of the displayed channel
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {transponder} Transponder of channel
+ {frequency} Frequency of channel
+ {source} Source of channel (S, C, T)
+ {sourcedescription} Descriptin of source from sources.conf
+ {position} orbital position of the satellite in case this is a DVB-S source
+ {isAtsc} true if channel is a ATSC channel
+ {isCable} true if channel is cable channel
+ {isSat} true if channel is a satellite channel
+ {isTerr} true if channel is terrestrical
+ {presenteventtitle} title of present event on this channel
+ {presenteventstart} present event start time in hh::mm
+ {presenteventstop} present event stop time in hh::mm
+ {presenteventshorttext} present event short text
+ {presenteventdescription} present event description
+ {presenteventday} present event name of day
+ {presenteventdate} present event date in dd:mm:yy
+ {presenteventelapsed} present event elapsed time
+ {presenteventduration} present event duration
+ {presenteventdurationhours} duration, full hours
+ {presenteventdurationminutes} duration, rest of minutes
+ {hasposter} true if a scraped poster is available for this elements present evemt
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {nexteventtitle} title of next event on this channel
+ {nexteventstart} next event start time in hh::mm
+ {nexteventstop} next event event stop time in hh::mm
+ {nexteventshorttext} next event short text
+ {nexteventdescription} next event description
+ {nexteventday} next event name of day
+ {nexteventdate} next event date in dd:mm:yy
+ {nexteventduration} next event duration
+ {nexteventdurationhours} duration, full hours
+ {nexteventdurationminutes} duration, rest of minutes
+ {schedule[]} array with following 10 schedules
+ {schedule[title]} title of event
+ {schedule[shorttext]} shorttext of event
+ {schedule[start]} start time of event in hh:mm
+ {schedule[stop]} stop time of event in hh:mm
+ -->
+ <currentelement delay="500" fadetime="0">
+ </currentelement>
+
+ </menuitems>
+
+</menuchannels>
\ No newline at end of file
diff --git a/skinskeleton/xmlfiles/displaymenudefault.xml b/skinskeleton/xmlfiles/displaymenudefault.xml
new file mode 100644
index 0000000..8f38b18
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenudefault.xml
@@ -0,0 +1,37 @@
+ <menudefault x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!-- IMPORTANT: menuitemwidth and determinatefont have to be defined here. menuitemwidth defines the total width of the
+ default menu items, determinatefont the function which sets the actual font to use. With that it is possible to determinate
+ the correct column widths -->
+ <menuitems x="0" y="0" orientation="vertical" width="100%" height="100%" align="center" menuitemwidth="94%" determinatefont="column1" numlistelements="16">
+ <!-- Available Variables default menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {column1} text of column1
+ {column2} text of column2
+ {column3} text of column3
+ {column4} text of column4
+ {column5} text of column5
+ {column6} text of column6
+ {column2set} true if column2 is used
+ {column3set} true if column3 is used
+ {column4set} true if column4 is used
+ {column5set} true if column5 is used
+ {column6set} true if column6 is used
+ {column2x} proposed x value of column2
+ {column3x} proposed x value of column3
+ {column4x} proposed x value of column4
+ {column5x} proposed x value of column5
+ {column6x} proposed x value of column6
+ {column1width} proposed width of column1
+ {column2width} proposed width of column2
+ {column3width} proposed width of column3
+ {column4width} proposed width of column4
+ {column5width} proposed width of column5
+ {column6width} proposed width of column6
+ {current} true if column is currently selected
+ {separator} true if column is a list separator
+ -->
+ <listelement>
+ </listelement>
+
+ </menuitems>
+</menudefault>
diff --git a/skinskeleton/xmlfiles/displaymenudetailepg.xml b/skinskeleton/xmlfiles/displaymenudetailepg.xml
new file mode 100644
index 0000000..2a110c6
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenudetailepg.xml
@@ -0,0 +1,184 @@
+<menudetailedepg x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!-- Available Variables in detailheader elements:
+ {title} title of event
+ {shorttext} shorttext of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} Day of event as three letter abrivation
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {vps} vps description string
+ {channelname} Channelname of event
+ {channelnumber} Channelnumber of event
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {ismovie} true if event is scraped as a movie
+ {isseries} true if event is scraped as a series
+ {posteravailable} true if a poster is available
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {banneravailable} true if a banner is available
+ {bannerwidth} width of banner
+ {bannerheight} height of banner
+ {bannerpath} path of banner
+ {epgpicavailable} true if a epg picture is available
+ {epgpicpath} path of epg picture
+ -->
+ <detailheader>
+ </detailheader>
+
+ <!-- Available Variables in tab elements:
+ {title} title of event
+ {shorttext} shorttext of event
+ {description} description of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} Day of event as three letter abrivation
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {vps} vps description string
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {hasreruns} true if reruns of this event are found
+ {reruns[]} array with reruns
+ {reruns[title]} title of rerun
+ {reruns[shorttext]} shorttext of rerun
+ {reruns[date]} date of rerun in dd:mm
+ {reruns[day]} short dayname of rerun
+ {reruns[start]} start time of rerun in hh:mm
+ {reruns[stop]} stop time of rerun in hh:mm
+ {reruns[channelname]} name of channel on which rerun occurs
+ {reruns[channelnumber]} number of channel on which rerun occurs
+ {reruns[channelid]} id of channel on which rerun occurs to display channel logo
+ {reruns[channellogoexists]} true if channel logo exists
+ {epgpic1avaialble} true if first epg picture is available
+ {epgpic2avaialble} true if first epg picture is available
+ {epgpic3avaialble} true if first epg picture is available
+ {epgpic1path} path of first epg picture
+ {epgpic2path} path of second epg picture
+ {epgpic3path} path of third epg picture
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+
+ <!-- a tab is one scrolling area, just position and draw as inside a normal area -->
+ <!-- just define as many tabs as needed -->
+ <tab name="Tab1" x="0" y="0" width="100%" height="100%" layer="2" scrollheight="{areaheight}/4">
+ </tab>
+
+ <!-- Available Variables tablabels:
+ {currenttab} name of currently active tab
+ {prevtab} name of prev tab
+ {nexttab} name of next tab
+ {tabs[]} array with available tab labels
+ {tabs[title]} title of tab
+ {tabs[current]} true if tab is displayed currently
+ -->
+ <tablabels>
+ </tablabels>
+</menudetailedepg>
\ No newline at end of file
diff --git a/skinskeleton/xmlfiles/displaymenudetailrecording.xml b/skinskeleton/xmlfiles/displaymenudetailrecording.xml
new file mode 100644
index 0000000..94f1303
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenudetailrecording.xml
@@ -0,0 +1,180 @@
+<menudetailedrecording x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!-- Available Variables in detailheader elements:
+ {name} full name of recording (including folders)
+ {epgname} name of recording (name from EPG)
+ {shorttext} shorttext of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of current recording in hh:mm
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+ {ismovie} true if event is scraped as a movie
+ {isseries} true if event is scraped as a series
+ {posteravailable} true if a poster is available
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {banneravailable} true if a banner is available
+ {bannerwidth} width of banner
+ {bannerheight} height of banner
+ {bannerpath} path of banner
+ {recimgavailable} true if a recording image is available in the recording path
+ {recimgpath} path of rec image
+ {recchannelname} name of channel from which was recorded
+ {recchannelid} id of channel from which was recorded
+ {recchannelnumber} number of channel from which was recorded
+ -->
+ <detailheader>
+ </detailheader>
+ <!-- Available Variables in tab elements:
+ {name} full name of recording (including folders)
+ {epgname} name of recording (name from EPG)
+ {shorttext} shorttext of recording
+ {description} description of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of current recording in hh:mm
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+ {cutted} true if recording is cutted
+
+ {recordingsize} size of recording (automatically in GB / MB)
+ {recordingsizecutted} size of cutted recording (automatically in GB / MB)
+ {recordinglength} length of recording (in hh::mm:ss)
+ {recordinglengthcutted} length of cutted recording (in hh::mm:ss)
+ {recordingbitrate} bitrate of recording (in MBit/s)
+ {recordingformat} format of recording (TS / PS)
+ {searchtimer} name of accordign searchtimer (if available)
+ {recchannelname} name of channel from which was recorded
+ {recchannelid} id of channel from which was recorded
+ {recchannelnumber} number of channel from which was recorded
+
+ {recimg1avaialble} true if first recording image is available
+ {recimg2avaialble} true if first recording image is available
+ {recimg3avaialble} true if first recording image is available
+ {recimg1path} path of first recording image
+ {recimg2path} path of second recording image
+ {recimg3path} path of third recording image
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+
+ <!-- a tab is one scrolling area, just position and draw as inside a normal area -->
+ <!-- just define as many tabs as needed -->
+ <tab name="Tab1" x="0" y="0" width="100%" height="100%" layer="2" scrollheight="{areaheight}/4">
+ </tab>
+
+ <!-- Available Variables tablabels:
+ {currenttab} name of currently active tab
+ {prevtab} name of prev tab
+ {nexttab} name of next tab
+ {tabs[]} array with available tab labels
+ {tabs[title]} title of tab
+ {tabs[current]} true if tab is displayed currently
+ -->
+ <tablabels>
+ </tablabels>
+
+</menudetailedrecording>
diff --git a/skinskeleton/xmlfiles/displaymenudetailtext.xml b/skinskeleton/xmlfiles/displaymenudetailtext.xml
new file mode 100644
index 0000000..6c91e5d
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenudetailtext.xml
@@ -0,0 +1,9 @@
+<menudetailedtext x="0" y="0" width="100%" height="100%" fadetime="0">
+
+ <!-- Available Variables in tab elements:
+ {text} detailed text
+ -->
+ <tab name="text" x="0" y="0" width="100" height="100%" layer="1" scrollheight="{areaheight}/4">
+ </tab>
+
+</menudetailedtext>
\ No newline at end of file
diff --git a/skinskeleton/xmlfiles/displaymenumain.xml b/skinskeleton/xmlfiles/displaymenumain.xml
new file mode 100644
index 0000000..bc4c72d
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenumain.xml
@@ -0,0 +1,141 @@
+<menumain x="0" y="0" width="100%" height="100%" fadetime="0">
+
+ <!-- Available Variables timers:
+ {numtimers} number of active timers (max. 15 timers will be displayed)
+ {numtimerconflicts} number of current timer conflicts
+ {timer1exists} true if timer 1 available
+ {timer2exists} true if timer 2 available
+ ...
+ {timer15exists} true if timer 15 available
+ {timers[]} array with active timers (local and remote if remotetimers plugin is in use)
+ {timers[title]} title of timer
+ {timers[datetime]} date and time of timer
+ {timers[recording]} true if timer is recording currently
+ {timers[channelname]} name of channel for which timer is created
+ {timers[channelnumber]} number of channel
+ {timers[channelid]} ChannelID of channel
+ {timers[channellogoexists]} true if channel logo exists
+ -->
+ <timers>
+ </timers>
+
+ <!-- Available Variables discusage:
+ {freetime} available disc capacity in hh:mm
+ {freepercent} available disc capacity in percent
+ {usedpercent} used disc capacity in percent
+ {freegb} available disc capacity in gigabytes
+ {discalert} true if disc usage is > 95%
+ {vdrusagestring} localized VDR internal usage string
+ -->
+ <discusage>
+ </discusage>
+
+ <!-- Available Variables devices:
+ {numdevices} number of available devices
+ {devices[]} array with available devices
+ {devices[num]} number of current device
+ {devices[type]} type of device (DVB-S, DVB-C, ...)
+ {devices[istuned]} true if device is currently tuned to a transponder
+ {devices[livetv]} true if device is currently playing livetv
+ {devices[recording]} true if device is currently recording
+ {devices[hascam]} true if device has a CAM
+ {devices[cam]} number of CAM
+ {devices[signalstrength]} signalstrength of devcie
+ {devices[signalquality]} signalstrength of devcie
+ {devices[channelnumber]} number of the currently tuned channel
+ {devices[channelname]} name of the currently tuned channel
+ {devices[channellogoexists]} true if a channel logo exists
+ {devices[channelid]} ID of the currently tuned channel
+ {devices[source]} source of the currently tuned channel
+ -->
+ <devices>
+ </devices>
+
+ <!-- Available Variables systemload:
+ {load} current system load
+ -->
+ <systemload>
+ </systemload>
+
+ <!-- Available Variables tempreatures:
+ {cputemp} current cpu temperature in °C
+ {gputemp} current gpu temperature in °C
+ -->
+ <temperatures>
+ </temperatures>
+
+ <!-- Available Variables currentschedule:
+ {title} Title of the current Schedule
+ {subtitle} Subtitle of the current Schedule
+ {start} Start of current Schedule in hh:mm
+ {stop} End of current Schedule in hh:mm
+ {duration} Duration of current Schedule in min
+ {durationhours} Duration, full hours
+ {minutes} Duration, rest of minutes
+ {elapsed} Elapsed time of current Schedule in min
+ {remaining} Remaining time of current Schedule in min
+ {hasPoster} true if poster is available
+ {posterpath} Full Path of Poster to use in image path attribute
+ {posterwidth} width of poster in pixel
+ {posterheight} height of poster in pixel
+ {hasBanner} true if banner is available
+ {bannerpath} Full Path of banner to use in image path attribute
+ {bannerwidth} width of banner in pixel
+ {bannerheight} height of banner in pixel
+ -->
+ <currentschedule>
+ </currentschedule>
+
+ <!-- Available Variables currentweather:
+ {timestamp} timestamp of forecast in dd.mm hh:mm
+ {temperature} current temperature in °C
+ {apparenttemperature} apparent (feeled) temperature
+ {mintemperature} minimum daily temperature in °C
+ {maxtemperature} maximum daily temperature in °C
+ {summary} short weather summary
+ {icon} weather icon
+ {precipitationintensity} precipitation intensity in l/m2
+ {precipitationprobability} precipitation probability in %
+ {precipitationtype} precipitation type
+ {humidity} humidity in %
+ {windspeed} windspeed in km/h
+ {windbearing} wind bearing in °
+ {windbearingstring} wind bearing (N, NE, ...)
+ {visibility} visibility in km
+ {cloudcover} cloud cover in %
+ {pressure} pressure in HPo
+ {ozone} ozone value in DU
+ -->
+ <currentweather>
+ </currentweather>
+
+ <!-- Available Variables customtokens:
+ all custom tokens set by the svdrp command SCTK are available in this viewelement
+ For instance, use an appropriate script which runs periodically as cronjob and
+ sets these custom tokens with svdrpsend or dbus2vdr
+ -->
+ <customtokens>
+ </customtokens>
+
+ <menuitems x="0" y="0" orientation="vertical" width="100%" height="100%" align="center" numlistelements="8">
+ <!-- Available Variables main menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables main menu currentelement:
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ -->
+ <currentelement delay="50" fadetime="0">
+ </currentelement>
+ </menuitems>
+
+</menumain>
diff --git a/skinskeleton/xmlfiles/displaymenurecordings.xml b/skinskeleton/xmlfiles/displaymenurecordings.xml
new file mode 100644
index 0000000..3e66746
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenurecordings.xml
@@ -0,0 +1,65 @@
+<menurecordings x="0" y="0" width="100%" height="100%" fadetime="0">
+ <menuitems x="0" y="0" orientation="vertical" width="100%" height="100%" align="center" numlistelements="16">
+ <!-- Available Variables recordings menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {name} Real Name of recording (Name of Recording Folder)
+ {epgname} Name of recording (Name from EPG)
+ {date} Date of recording
+ {time} Time of recording
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+ {current} true if item is currently selected
+ {new} true if recording is new
+ {cutted} true if recording is cutted
+ {folder} true if item is a folder
+ {numrecordingsfolder} if item is a folder, number of recordings in this folder
+ {newrecordingsfolder} if item is a folder, number of new recordings in this folder
+ {hasposterthumbnail} true if a scraped poster thumbnail is available for recording
+ {thumbnailbwidth} width of scraped poster thumbnail
+ {thumbnailheight} height of scraped poster thumbnail
+ {thumbnailpath} absolute path of scraped poster thumbnail
+ -->
+ <listelement>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {menuitemx} x position of according menu item
+ {menuitemy} y position of according menu item
+ {menuitemwidth} width of according menu item
+ {menuitemheight} height of according menu item
+ {name} Real Name of recording (Name of Recording Folder)
+ {epgname} Name of recording (Name from EPG)
+ {shorttext} Short Text of recording
+ {description} Descrption of recording
+ {date} Date of recording
+ {time} Time of recording
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes {new} true if recording is new
+ {cutted} true if recording is cutted
+ {folder} true if item is a folder
+ {numrecordingsfolder} if item is a folder, number of recordings in this folder
+ {newrecordingsfolder} if item is a folder, number of new recordings in this folder
+ {hasposter} true if a scraped poster is available for recording
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ -->
+ <currentelement delay="500" fadetime="0">
+ </currentelement>
+ </menuitems>
+
+</menurecordings>
\ No newline at end of file
diff --git a/skinskeleton/xmlfiles/displaymenuschedules.xml b/skinskeleton/xmlfiles/displaymenuschedules.xml
new file mode 100644
index 0000000..58c579d
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenuschedules.xml
@@ -0,0 +1,96 @@
+<menuschedules x="0" y="0" width="100%" height="100%" fadetime="0">
+ <!-- Available Variables header:
+ {title} title of current menu
+ {vdrversion} running VDR Version
+ {hasicon} true if a menu icon is available
+ {icon} path of menu icon
+ {channelnumber} Number of Channel of current event
+ {channelname} Name of current Channel of current event
+ {channellogoexists} true if a channel logo exists
+ {channelid} ChannelID as path to display channel logo
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {whatsonfavorites} true if EPGSearch Favorites menu is displayed
+ -->
+ <header>
+ </header>
+
+ <menuitems x="0" y="0" orientation="vertical" width="100%" height="100%" align="center" numlistelements="16">
+ <!-- Available Variables schedules menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {title} title of event
+ {shorttext} shorttext of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ {channelname} Channel Name
+ {channelnumber} Channel Number
+ {channelid} ChannelID as path to display channel logo
+ {channellogoexists} true if a channel logo exists
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {whatsonfavorites} true if EPGSearch Favorites menu is displayed
+ {timerpartitial} true if partitial timer is set for the event
+ {timerfull} true if full timer is set for the event
+ {hasVPS} true if event has VPS information
+ -->
+ <listelement>
+ </listelement>
+ <!-- Available Variables schedules menu currentelement:
+ {menuitemx} x position of according menu item
+ {menuitemy} y position of according menu item
+ {menuitemwidth} width of according menu item
+ {menuitemheight} height of according menu item
+ {title} title of event
+ {shorttext} shorttext of event
+ {description} detailed description of event
+ {start} event start time in hh::mm
+ {stop} event stop time
+ {day} day of current event
+ {date} date of current event in dd.mm.yy
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {running} true if event is currently running
+ {elapsed} elapsed time of event, if not running 0
+ {duration} duration of event
+ {durationhours} duration, full hours
+ {durationminutes} duration, rest of minutes
+ {channelname} Channel Name
+ {channelnumber} Channel Number
+ {channelid} ChannelID as path to display channel logo
+ {channellogoexists} true if a channel logo exists
+ {hasposter} true if a scraped poster is available for this element
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {timerpartitial} true if partitial timer is set for the event
+ {timerfull} true if full timer is set for the event
+ {whatson} true if menu "What's on" is displayed
+ {whatsonnow} true if menu "What's on now" is displayed
+ {whatsonnext} true if menu "What's on next" is displayed
+ {whatsonfavorites} true if EPGSearch Favorites menu is displayed
+ {schedule[]} array with next 10 schedules, only for whatsonnow and whatsonnext
+ {schedule[title]} title of event
+ {schedule[shorttext]} shorttext of event
+ {schedule[start]} start time of event in hh:mm
+ {schedule[stop]} stop time of event in hh:mm
+ -->
+ <currentelement delay="500" fadetime="0">
+ </currentelement>
+ </menuitems>
+
+</menuschedules>
\ No newline at end of file
diff --git a/skinskeleton/xmlfiles/displaymenusetup.xml b/skinskeleton/xmlfiles/displaymenusetup.xml
new file mode 100644
index 0000000..59b6740
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenusetup.xml
@@ -0,0 +1,28 @@
+<menusetup x="0" y="0" width="100%" height="100%" fadetime="0">
+
+ <menuitems x="0" y="0" orientation="vertical" width="100%" height="100%" align="center" numlistelements="16">
+ <!-- Available Variables setup menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ {current} true if item is currently selected
+ {separator} true if item is a list separator
+ -->
+ <listelement>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables main menu currentelement:
+ {menuitemx} x position of according menu item
+ {menuitemy} y position of according menu item
+ {menuitemwidth} width of according menu item
+ {menuitemheight} height of according menu item
+ {label} label of menu item
+ {number} number of menu item (or empty string if not set)
+ {icon} path of appropriate icon
+ -->
+ <currentelement delay="50" fadetime="0">
+ </currentelement>
+ </menuitems>
+
+</menusetup>
diff --git a/skinskeleton/xmlfiles/displaymenutimers.xml b/skinskeleton/xmlfiles/displaymenutimers.xml
new file mode 100644
index 0000000..e806240
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymenutimers.xml
@@ -0,0 +1,67 @@
+<menutimers x="0" y="0" width="100%" height="100%" fadetime="0">
+ <menuitems x="0" y="0" orientation="vertical" width="100%" height="100%" align="center" numlistelements="16">
+ <!-- Available Variables channels menu listelement:
+ {nummenuitem} number of item in list, starts with 1
+ {title} Title of Timer
+ {timerstart} Start Time of Timer in hh::mm
+ {timerstop} End Time of Timer in hh::mm
+ {day} Day (numerical)
+ {dayname} Day, for repeating timers days where timer is active
+ {month} Month (two digits)
+ {monthname} Month, three letter abbrevation
+ {year} Year (4 digits)
+ {channelname} Name of channel which is set for the timer
+ {channellogoexists} true if a channel logo exists
+ {channelid} ID of channel which is set for the timer (for dispalying channel logo)
+ {channelnumber} Number of channel which is set for the timer
+ {eventtitle} Title of corresponding event
+ {eventstart} Start Time of corresponding event in hh::mm
+ {eventstop} Stop Time of corresponding event in hh::mm
+ {current} true if item is currently selected
+ {flagactive} true if timer is active
+ {flaginstant} true if timer is an instant timer
+ {flagvps} true if timer uses VPS
+ {flagrecording} true if is recording currently
+ {flagpending} true if timer is pending
+ -->
+ <listelement>
+ </listelement>
+ <!-- additional element which is drawn for current element -->
+ <!-- Available Variables channels menu currentelement:
+ {menuitemx} x position of according menu item
+ {menuitemy} y position of according menu item
+ {menuitemwidth} width of according menu item
+ {menuitemheight} height of according menu item
+ {title} Title of Timer
+ {timerstart} Start Time of Timer in hh::mm
+ {timerstop} End Time of Timer in hh::mm
+ {day} Day (numerical)
+ {dayname} Day, for repeating timers days where timer is active
+ {month} Month (two digits)
+ {monthname} Month, three letter abbrevation
+ {year} Year (4 digits)#
+ {channelname} Name of channel which is set for the timer
+ {channellogoexists} true if a channel logo exists
+ {channelid} ID of channel which is set for the timer (for dispalying channel logo)
+ {channelnumber} Number of channel which is set for the timer
+ {eventtitle} Title of corresponding event
+ {eventstart} Start Time of corresponding event in hh::mm
+ {eventstop} Stop Time of corresponding event in hh::mm
+ {eventshorttext} Short Text corresponding event
+ {eventdescription} Description corresponding event
+ {hasposter} true if a scraped poster is available for event
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {flagactive} true if timer is active
+ {flaginstant} true if timer is an instant timer
+ {flagvps} true if timer uses VPS
+ {flagrecording} true if is recording currently
+ {flagpending} true if timer is pending
+ -->
+ <currentelement delay="500" fadetime="0">
+ </currentelement>
+
+ </menuitems>
+
+</menutimers>
\ No newline at end of file
diff --git a/skinskeleton/xmlfiles/displaymessage.xml b/skinskeleton/xmlfiles/displaymessage.xml
new file mode 100644
index 0000000..9f8d9a5
--- /dev/null
+++ b/skinskeleton/xmlfiles/displaymessage.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displaymessage SYSTEM "../../../dtd/displaymessage.dtd">
+
+<displaymessage x="0" y="0" width="100%" height="100%" fadetime="0">
+
+ <background>
+ </background>
+
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ </message>
+
+</displaymessage>
diff --git a/skinskeleton/xmlfiles/displayreplay.xml b/skinskeleton/xmlfiles/displayreplay.xml
new file mode 100644
index 0000000..8cef153
--- /dev/null
+++ b/skinskeleton/xmlfiles/displayreplay.xml
@@ -0,0 +1,252 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayreplay SYSTEM "../../../dtd/displayreplay.dtd">
+
+<displayreplay x="0" y="0" width="100%" height="100%" fadetime="0">
+
+ <background>
+ </background>
+
+ <backgroundmodeonly>
+ </backgroundmodeonly>
+
+ <!-- Available Variables datetime:
+ {time} time in hh:mm
+ {day} day in digits
+ {dayleadingzero} day in digits with leading 0
+ {dayname} Full name of the day
+ {daynameshort} Short 3 char name of the day
+ {month} month in digits with leading 0
+ {monthname} Full name of the month
+ {monthnameshort} 3 letter abbrivation of month name
+ {year} year in yyyy
+ -->
+ <datetime>
+ </datetime>
+
+ <!-- Available Variables scrapercontent:
+ {posterpath} Full Path of Poster to use in image path attribute
+ {posterwidth} width of poster in pixel
+ {posterheight} height of poster in pixel
+ {hasPoster} true if poster is available
+ {bannerpath} Full Path of banner to use in image path attribute
+ {bannerwidth} width of banner in pixel
+ {bannerheight} height of banner in pixel
+ {hasBanner} true if banner is available
+
+ Use this tokens if you want to display a banner for series and a poster for movies:
+ {mediapath} Full Path of Poster or Banner to use in image path attribute
+ {mediawidth} width of image in pixel
+ {mediaheight} height of image in pixel
+ {isbanner} true if image is a banner, false if it is a poster
+ -->
+ <scrapercontent>
+ </scrapercontent>
+
+ <!-- Available Variables rectitle:
+ {rectitle} Title of Recording
+ {recsubtitle} Subtitle of the Recording
+ {recdate} Date Recording in dd.mm.yy
+ {rectime} Time of Recording in hh:mm
+ -->
+ <rectitle>
+ </rectitle>
+
+ <!-- Available Variables recinfo:
+ {screenwidth} width of currently displayed recording in px
+ {screenheight} height of currently displayed recording in px
+ {resolution} resolution: hd1080i, hd720p, sd576i
+ {aspect} screen aspect, each 4:3, 16:9 or 21:9
+ {isHD} true for hd1080i and hd720p
+ {isWideScreen} true if aspect is 16:9 or 21:9
+ -->
+ <recinfo>
+ </recinfo>
+
+ <!-- Available Variables currenttime:
+ {reccurrent} Current Time in hh:mm:ss
+ -->
+ <currenttime>
+ </currenttime>
+
+ <!-- Available Variables totaltime:
+ {rectotal} Total Time in hh:mm:ss
+ -->
+ <totaltime>
+ </totaltime>
+
+ <!-- Available Variables progressbar:
+ {current} current frame of recording
+ {total} total frames of recording
+ -->
+ <progressbar>
+ </progressbar>
+
+ <!-- Available Variables cutmarks:
+ {marks[]} array of available marks
+ {marks[position]} frame of current mark
+ {marks[endposition]} frame where startmark ends
+ {marks[total]} total number of frames
+ {marks[active]} true if current replay position hits exactly the mark
+ {marks[startmark]} true if mark is start mark
+ -->
+ <cutmarks>
+ </cutmarks>
+
+ <!-- Available Variables controlicons and controliconsmodeonly:
+ {play} true if recording is played currently
+ {pause} true if recording is paused
+ {forward} true if fast forwarding
+ {forward1x} true if fast forwarding 1x (with 3 trickspeeds)
+ {forward2x} true if fast forwarding 2x (with 3 trickspeeds)
+ {forward3x} true if fast forwarding 3x (with 3 trickspeeds)
+ {rewind} true if rewinding
+ {rewind1x} true if rewinding 1x (with 3 trickspeeds)
+ {rewind2x} true if rewinding 2x (with 3 trickspeeds)
+ {rewind3x} true if rewinding 3x (with 3 trickspeeds)
+ -->
+ <controlicons>
+ </controlicons>
+
+ <controliconsmodeonly>
+ </controliconsmodeonly>
+
+ <!-- Available Variables jump:
+ {jump} time to jump to in hh:mm
+ -->
+ <jump>
+ </jump>
+ <!-- Available Variables message:
+ {text} message text
+ {status} true if message is a status message
+ {info} true if message is a info message
+ {warning} true if message is a warn message
+ {error} true if message is a error message
+ -->
+ <message>
+ </message>
+
+ <!-- Available Variables onpause and onpausemodeonly:
+ {name} title of recording
+ {shorttext} shorttext of recording
+ {description} description of recording
+ {date} date of recording in dd.mm.yy
+ {time} time of recording in hh:mm
+ {daynumeric} day as number
+ {month} month as number
+ {year} year as number
+ {duration} real duration of recording in minutes
+ {durationhours} real duration, full hours
+ {durationminutes} real duration, rest of minutes
+ {durationevent} duration of corresponding event in minutes
+ {durationeventhours} event duration, full hours
+ {durationeventminutes} event duration, rest of minutes
+
+ {ismovie} true if event is scraped as a movie
+ Available variables for movies:
+ {movietitle} movie title from themoviedb
+ {movieoriginalTitle} movie original title from themoviedb
+ {movietagline} movie tagline from themoviedb
+ {movieoverview} movie overview from themoviedb
+ {movieadult} true if movie is rated as adult
+ {moviebudget} movie budget from themoviedb in $
+ {movierevenue} movie revenue from themoviedb in $
+ {moviegenres} movie genres from themoviedb
+ {moviehomepage} movie homepage from themoviedb
+ {moviereleasedate} movie release date from themoviedb
+ {movieruntime} movie runtime from themoviedb
+ {moviepopularity} movie popularity from themoviedb
+ {movievoteaverage} movie vote average from themoviedb
+ {posterwidth} width of scraped poster
+ {posterheight} height of scraped poster
+ {posterpath} absolute path of scraped poster
+ {fanartwidth} width of scraped fanart
+ {fanartheight} height of scraped fanart
+ {fanartpath} absolute path of scraped fanart
+ {movieiscollection} true if movie is part of a collection
+ {moviecollectionName} name of movie collection
+ {collectionposterwidth} width of scraped collection poster
+ {collectionposterheight} height of scraped collection poster
+ {collectionposterpath} absolute path of scraped collection poster
+ {collectionfanartwidth} width of scraped collection fanart
+ {collectionfanartheight} height of scraped collection fanart
+ {collectionfanartpath} absolute path of scraped collection fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+
+ {isseries} true if event is scraped as a series
+ Available variables for series:
+ {seriesname} name of series
+ {seriesoverview} series overview
+ {seriesfirstaired} first aired date
+ {seriesnetwork} network which produces series
+ {seriesgenre} series genre
+ {seriesrating} series thetvdb rating
+ {seriesstatus} status of series (running / finished)
+ {episodetitle} title of episode
+ {episodenumber} number of episode
+ {episodeseason} season of episode
+ {episodefirstaired} first aired date of episode
+ {episodegueststars} guest stars of episode
+ {episodeoverview} episode overview
+ {episoderating} user rating for episode
+ {episodeimagewidth} episode image width
+ {episodeimageheight} episode image height
+ {episodeimagepath} episode image path
+ {seasonposterwidth} episode season poster width
+ {seasonposterheight} episode season poster height
+ {seasonposterpath} episode season poster path
+ {seriesposter1width} width of 1st poster
+ {seriesposter1height} height of 1st poster
+ {seriesposter1path} path of 1st poster
+ {seriesposter2width} width of 2nd poster
+ {seriesposter2height} height of 2nd poster
+ {seriesposter2path} path of 2nd poster
+ {seriesposter3width} width of 3rd poster
+ {seriesposter3height} height of 3rd poster
+ {seriesposter3path} path of 3rd poster
+ {seriesfanart1width} width of 1st fanart
+ {seriesfanart1height} height of 1st fanart
+ {seriesfanart1path} path of 1st fanart
+ {seriesfanart2width} width of 2nd fanart
+ {seriesfanart2height} height of 2nd fanart
+ {seriesfanart2path} path of 2nd fanart
+ {seriesfanart3width} width of 3rd fanart
+ {seriesfanart3height} height of 3rd fanart
+ {seriesfanart3path} path of 3rd fanart
+ {seriesbanner1width} width of 1st banner
+ {seriesbanner1height} height of 1st banner
+ {seriesbanner1path} path of 1st banner
+ {seriesbanner2width} width of 2nd banner
+ {seriesbanner2height} height of 2nd banner
+ {seriesbanner2path} path of 2nd banner
+ {seriesbanner3width} width of 3rd banner
+ {seriesbanner3height} height of 3rd banner
+ {seriesbanner3path} path of 3rd fanart
+ {actors[]} array with movie actors
+ {actors[name]} real name of actor
+ {actors[role]} actor role
+ {actors[thumb]} absolute path of scraped actor thumb
+ {actors[thumbwidth]} width of scraped actor thumb
+ {actors[thumbheight]} height of scraped actor thumb
+ -->
+ <!-- delay (in seconds) defines the time to wait till viewelement is displayed
+ fadetime in ms -->
+ <onpause delay="60" fadetime="0">
+ </onpause>
+
+ <onpausemodeonly delay="30" fadetime="0">
+ </onpausemodeonly>
+
+ <!-- Available Variables customtokens:
+ all custom tokens set by the svdrp command SCTK are available in this viewelement
+ For instance, use an appropriate script which runs periodically as cronjob and
+ sets these custom tokens with svdrpsend or dbus2vdr
+ -->
+ <customtokens>
+ </customtokens>
+
+</displayreplay>
diff --git a/skinskeleton/xmlfiles/displayvolume.xml b/skinskeleton/xmlfiles/displayvolume.xml
new file mode 100644
index 0000000..d5bb8a0
--- /dev/null
+++ b/skinskeleton/xmlfiles/displayvolume.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE displayvolume SYSTEM "../../../dtd/displayvolume.dtd">
+
+<displayvolume x="0" y="0" width="100%" height="100%" fadetime="0">
+
+ <background>
+ </background>
+
+ <!-- Available Variables volume:
+ {volume} current volume, range from 0 to 255
+ {volpercent} current volume in %
+ {maxvolume} maximal volume
+ {mute} true if volume is muted
+ -->
+ <volume>
+ </volume>
+
+</displayvolume>
diff --git a/themes/blackhole-default.theme b/themes/blackhole-default.theme
new file mode 100644
index 0000000..ef29962
--- /dev/null
+++ b/themes/blackhole-default.theme
@@ -0,0 +1 @@
+Description = default
diff --git a/themes/nopacity-darkred.theme b/themes/nopacity-darkred.theme
new file mode 100644
index 0000000..48e23a4
--- /dev/null
+++ b/themes/nopacity-darkred.theme
@@ -0,0 +1 @@
+Description = DarkRed
diff --git a/themes/nopacity-default.theme b/themes/nopacity-default.theme
new file mode 100644
index 0000000..80b3660
--- /dev/null
+++ b/themes/nopacity-default.theme
@@ -0,0 +1 @@
+Description = freestyle
diff --git a/views/displayaudiotracksview.c b/views/displayaudiotracksview.c
new file mode 100644
index 0000000..c4b9f9a
--- /dev/null
+++ b/views/displayaudiotracksview.c
@@ -0,0 +1,79 @@
+#define __STL_CONFIG_H
+#include <vdr/menu.h>
+#include "displayaudiotracksview.h"
+
+cDisplayAudiotracksView::cDisplayAudiotracksView(int numTracks, cTemplateView *tmplView) : cView(tmplView) {
+ DeleteOsdOnExit();
+ SetFadeTime(tmplView->GetNumericParameter(ptFadeTime));
+
+ this->numTracks = numTracks;
+
+ cTemplateViewList *tmplMenuItems = tmplView->GetViewList(vlMenuItem);
+ listView = NULL;
+ if (tmplMenuItems) {
+ listView = new cDisplayMenuListView(tmplMenuItems, numTracks);
+ }
+}
+
+cDisplayAudiotracksView::~cDisplayAudiotracksView() {
+ if (listView)
+ delete listView;
+ CancelSave();
+ FadeOut();
+}
+
+bool cDisplayAudiotracksView::createOsd(void) {
+ cRect osdSize = tmplView->GetOsdSize();
+ bool ok = CreateOsd(cOsd::OsdLeft() + osdSize.X(),
+ cOsd::OsdTop() + osdSize.Y(),
+ osdSize.Width(),
+ osdSize.Height());
+ return ok;
+}
+
+void cDisplayAudiotracksView::DrawBackground(void) {
+ if (!ViewElementImplemented(veBackground)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ intTokens.insert(pair<string,int>("numtracks", numTracks));
+
+ DrawViewElement(veBackground, &stringTokens, &intTokens);
+}
+
+void cDisplayAudiotracksView::DrawHeader(const char *title, int audioChannel) {
+ if (!ViewElementImplemented(veHeader)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ intTokens.insert(pair<string,int>("numtracks", numTracks));
+ if (audioChannel < 0) {
+ intTokens.insert(pair<string,int>("isac3", true));
+ intTokens.insert(pair<string,int>("isstereo", false));
+ } else {
+ intTokens.insert(pair<string,int>("isac3", false));
+ intTokens.insert(pair<string,int>("isstereo", true));
+ }
+ stringTokens.insert(pair<string,string>("title", title));
+
+ ClearViewElement(veHeader);
+ DrawViewElement(veHeader, &stringTokens, &intTokens);
+}
+
+void cDisplayAudiotracksView::RenderMenuItems(void) {
+ if (listView)
+ listView->Render();
+}
+
+void cDisplayAudiotracksView::Action(void) {
+ SetInitFinished();
+ FadeIn();
+ DoFlush();
+ cView::Action();
+}
diff --git a/views/displayaudiotracksview.h b/views/displayaudiotracksview.h
new file mode 100644
index 0000000..3414d66
--- /dev/null
+++ b/views/displayaudiotracksview.h
@@ -0,0 +1,24 @@
+#ifndef __DISPLAYAUDIOTRACKSVIEW_H
+#define __DISPLAYAUDIOTRACKSVIEW_H
+
+#include "../libtemplate/template.h"
+#include "displaymenulistview.h"
+
+class cDisplayAudiotracksView : public cView {
+protected:
+ int numTracks;
+ cDisplayMenuListView *listView;
+ virtual void Action(void);
+public:
+ cDisplayAudiotracksView(int numTracks, cTemplateView *tmplView);
+ virtual ~cDisplayAudiotracksView();
+ bool createOsd(void);
+ void DrawBackground(void);
+ void DrawHeader(const char *title, int audioChannel);
+ cDisplayMenuListView *GetListView(void) { return listView; };
+ void DoFadeIn(void) { Start(); };
+ void Flush(void) { DoFlush(); };
+ void RenderMenuItems(void);
+};
+
+#endif //__DISPLAYAUDIOTRACKSVIEW_H
diff --git a/views/displaychannelview.c b/views/displaychannelview.c
new file mode 100644
index 0000000..6348f7d
--- /dev/null
+++ b/views/displaychannelview.c
@@ -0,0 +1,564 @@
+#define __STL_CONFIG_H
+#include <vdr/menu.h>
+#include "../services/scraper2vdr.h"
+#include "displaychannelview.h"
+#include "../libcore/timers.h"
+#include "../libcore/helpers.h"
+
+cDisplayChannelView::cDisplayChannelView(cTemplateView *tmplView) : cView(tmplView) {
+ lastScreenWidth = 0;
+ lastScreenHeight = 0;
+ lastSignalDisplay = 0;
+ lastSignalStrength = 0;
+ lastSignalQuality = 0;
+ lastNumAudioTracks = 0;
+ lastAudioChannel = -1;
+ lastTracDesc = "";
+ lastTrackLang = "";
+ InitDevices();
+ DeleteOsdOnExit();
+ SetFadeTime(tmplView->GetNumericParameter(ptFadeTime));
+}
+
+cDisplayChannelView::~cDisplayChannelView() {
+ CancelSave();
+ FadeOut();
+}
+
+bool cDisplayChannelView::createOsd(void) {
+ cRect osdSize = tmplView->GetOsdSize();
+ bool ok = CreateOsd(cOsd::OsdLeft() + osdSize.X(),
+ cOsd::OsdTop() + osdSize.Y(),
+ osdSize.Width(),
+ osdSize.Height());
+ return ok;
+}
+
+void cDisplayChannelView::DrawBackground(void) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ DrawViewElement(veBackground, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::DrawChannel(cString &number, cString &name, cString &id, bool switching) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string,string>("channelname", *name));
+ stringTokens.insert(pair<string,string>("channelnumber", *number));
+ stringTokens.insert(pair<string,string>("channelid", *id));
+
+ intTokens.insert(pair<string, int>("switching", switching));
+ bool logoExisis = imgCache->LogoExists(*id);
+ intTokens.insert(pair<string, int>("channellogoexists", logoExisis));
+
+ DrawViewElement(veChannelInfo, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::ClearChannel(void) {
+ ClearViewElement(veChannelInfo);
+}
+
+void cDisplayChannelView::DrawDate(void) {
+ if (!ViewElementImplemented(veDateTime)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ if (!SetDate(stringTokens, intTokens)) {
+ return;
+ }
+
+ ClearViewElement(veDateTime);
+ DrawViewElement(veDateTime, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::DrawTime(void) {
+ if (!ViewElementImplemented(veTime)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ if (!SetTime(stringTokens, intTokens)) {
+ return;
+ }
+ ClearViewElement(veTime);
+ DrawViewElement(veTime, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::DrawProgressBar(cString &start, cString &stop, int Current, int Total) {
+ if (!ViewElementImplemented(veProgressBar)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string, string>("start", *start));
+ stringTokens.insert(pair<string, string>("stop", *stop));
+
+ intTokens.insert(pair<string, int>("duration", Total));
+ intTokens.insert(pair<string, int>("elapsed", Current));
+ intTokens.insert(pair<string, int>("remaining", Total - Current));
+
+ ClearProgressBar();
+ DrawViewElement(veProgressBar, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::ClearProgressBar(void) {
+ ClearViewElement(veProgressBar);
+}
+
+void cDisplayChannelView::DrawProgressBarBack(void) {
+ DrawViewElement(veProgressBarBack);
+}
+
+void cDisplayChannelView::ClearProgressBarBack(void) {
+ ClearViewElement(veProgressBarBack);
+}
+
+void cDisplayChannelView::DrawEPGInfo(const cEvent *present, const cEvent *next, bool presentRecording, bool nextRecording) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ if (present) {
+ stringTokens.insert(pair<string,string>("currenttitle", (present->Title())?present->Title():""));
+ stringTokens.insert(pair<string,string>("currentsubtitle", (present->ShortText())?present->ShortText():""));
+ stringTokens.insert(pair<string,string>("currentstart", *present->GetTimeString()));
+ stringTokens.insert(pair<string,string>("currentstop", *present->GetEndTimeString()));
+
+ intTokens.insert(pair<string,int>("currentduration", present->Duration() / 60));
+ intTokens.insert(pair<string,int>("currentdurationhours", present->Duration() / 3600));
+ stringTokens.insert(pair<string,string>("currentdurationminutes", *cString::sprintf("%.2d", (present->Duration() / 60)%60)));
+ intTokens.insert(pair<string,int>("currentelapsed", (int)round((time(NULL) - present->StartTime())/60)));
+ intTokens.insert(pair<string,int>("currentremaining", (int)round((present->EndTime() - time(NULL))/60)));
+ intTokens.insert(pair<string,int>("currentrecording", presentRecording ? 1 : 0));
+ intTokens.insert(pair<string,int>("hasVPS", (bool)present->Vps()));
+ } else {
+ stringTokens.insert(pair<string,string>("currenttitle", ""));
+ stringTokens.insert(pair<string,string>("currentsubtitle", ""));
+ stringTokens.insert(pair<string,string>("currentstart", ""));
+ stringTokens.insert(pair<string,string>("currentstop", ""));
+
+ intTokens.insert(pair<string,int>("currentduration", 0));
+ intTokens.insert(pair<string,int>("currentdurationhours", 0));
+ stringTokens.insert(pair<string,string>("currentdurationminutes", ""));
+ intTokens.insert(pair<string,int>("currentelapsed", 0));
+ intTokens.insert(pair<string,int>("currentremaining", 0));
+ intTokens.insert(pair<string,int>("currentrecording", 0));
+ intTokens.insert(pair<string,int>("hasVPS", 0));
+ }
+
+ if (next) {
+ stringTokens.insert(pair<string,string>("nexttitle", (next->Title())?next->Title():""));
+ stringTokens.insert(pair<string,string>("nextsubtitle", (next->ShortText())?next->ShortText():""));
+ stringTokens.insert(pair<string,string>("nextstart", *next->GetTimeString()));
+ stringTokens.insert(pair<string,string>("nextstop", *next->GetEndTimeString()));
+
+ intTokens.insert(pair<string,int>("nextduration", next->Duration() / 60));
+ intTokens.insert(pair<string,int>("nextdurationhours", next->Duration() / 3600));
+ stringTokens.insert(pair<string,string>("nextdurationminutes", *cString::sprintf("%.2d", (next->Duration() / 60)%60)));
+ intTokens.insert(pair<string,int>("nextrecording", nextRecording ? 1 : 0));
+ } else {
+ stringTokens.insert(pair<string,string>("nexttitle", ""));
+ stringTokens.insert(pair<string,string>("nextsubtitle", ""));
+ stringTokens.insert(pair<string,string>("nextstart", ""));
+ stringTokens.insert(pair<string,string>("nextstop", ""));
+
+ intTokens.insert(pair<string,int>("nextduration", 0));
+ intTokens.insert(pair<string,int>("nextdurationhours", 0));
+ stringTokens.insert(pair<string,string>("nextdurationminutes", ""));
+ intTokens.insert(pair<string,int>("nextrecording", 0));
+ }
+ DrawViewElement(veEpgInfo, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::ClearEPGInfo(void) {
+ ClearViewElement(veEpgInfo);
+}
+
+void cDisplayChannelView::DrawStatusIcons(const cChannel *Channel) {
+ if (!ViewElementImplemented(veStatusInfo)) {
+ return;
+ }
+
+ map < string, int > intTokens;
+ map < string, string > stringTokens;
+
+ bool isRadio = !Channel->Vpid() && Channel->Apid(0);
+ bool hasVT = Channel->Vpid() && Channel->Tpid();
+ bool isStereo = Channel->Apid(0);
+ bool isDolby = Channel->Dpid(0);
+ bool isEncrypted = Channel->Ca();
+ bool isRecording = cRecordControls::Active();
+ cGlobalSortedTimers SortedTimers;// local and remote timers
+ for (int i = 0; i < SortedTimers.Size() && !isRecording; i++)
+ if (const cTimer *Timer = SortedTimers[i])
+ if (Timer->Recording())
+ isRecording = true;
+
+ intTokens.insert(pair<string,int>("isRadio", isRadio));
+ intTokens.insert(pair<string,int>("hasVT", hasVT));
+ intTokens.insert(pair<string,int>("isStereo", isStereo));
+ intTokens.insert(pair<string,int>("isDolby", isDolby));
+ intTokens.insert(pair<string,int>("isEncrypted", isEncrypted));
+ intTokens.insert(pair<string,int>("isRecording", isRecording));
+ intTokens.insert(pair<string,int>("newmails", CheckNewMails()));
+
+ DrawViewElement(veStatusInfo, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::ClearStatusIcons(void) {
+ ClearViewElement(veStatusInfo);
+}
+
+void cDisplayChannelView::DrawAudioInfo(void) {
+ if (!ViewElementImplemented(veAudioInfo)) {
+ return;
+ }
+
+ int numAudioTracks = 0;
+ int audioChannel = -1;
+ string trackDescription = "";
+ string trackLanguage = "";
+
+ cDevice *device = cDevice::PrimaryDevice();
+ if (device) {
+ numAudioTracks = device->NumAudioTracks();
+ audioChannel = device->GetAudioChannel();
+ if (numAudioTracks > 0) {
+ const tTrackId *track = device->GetTrack(device->GetCurrentAudioTrack());
+ if (track) {
+ trackDescription = track->description ? track->description : "";
+ trackLanguage = track->language ? track->language : "";
+ }
+ }
+ }
+ if (lastNumAudioTracks != numAudioTracks || lastAudioChannel != audioChannel || lastTracDesc.compare(trackDescription) || lastTrackLang.compare(trackLanguage)) {
+ lastNumAudioTracks = numAudioTracks;
+ lastAudioChannel = audioChannel;
+ lastTracDesc = trackDescription;
+ lastTrackLang = trackLanguage;
+
+ map < string, int > intTokens;
+ map < string, string > stringTokens;
+ intTokens.insert(pair<string,int>("numaudiotracks", numAudioTracks));
+ intTokens.insert(pair<string,int>("audiochannel", audioChannel));
+ stringTokens.insert(pair<string,string>("trackdesc", trackDescription));
+ stringTokens.insert(pair<string,string>("tracklang", trackLanguage));
+
+ ClearAudioInfo();
+ DrawViewElement(veAudioInfo, &stringTokens, &intTokens);
+ }
+}
+
+void cDisplayChannelView::ClearAudioInfo(void) {
+ ClearViewElement(veAudioInfo);
+}
+
+void cDisplayChannelView::DrawScreenResolution(void) {
+ if (!ViewElementImplemented(veScreenResolution)) {
+ return;
+ }
+
+ int screenWidth = 0;
+ int screenHeight = 0;
+ double aspect = 0;
+
+ cDevice::PrimaryDevice()->GetVideoSize(screenWidth, screenHeight, aspect);
+
+ if ((lastScreenWidth == screenWidth) && (lastScreenHeight == screenHeight))
+ return;
+
+ if ((screenWidth == 0) && (screenHeight == 0))
+ return;
+
+ lastScreenWidth = screenWidth;
+ lastScreenHeight = screenHeight;
+
+ bool isHD = false;
+ string resName = GetScreenResolutionString(screenWidth, screenHeight, &isHD);
+
+ bool isWideScreen = false;
+ string aspectName = GetScreenAspectString(aspect, &isWideScreen);
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ intTokens.insert(pair<string,int>("screenwidth", screenWidth));
+ intTokens.insert(pair<string,int>("screenheight", screenHeight));
+ intTokens.insert(pair<string,int>("isHD", isHD));
+ intTokens.insert(pair<string,int>("isWideScreen", isWideScreen));
+ stringTokens.insert(pair<string,string>("resolution", resName));
+ stringTokens.insert(pair<string,string>("aspect", aspectName));
+
+ ClearViewElement(veScreenResolution);
+ DrawViewElement(veScreenResolution, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::ClearScreenResolution(void) {
+ ClearViewElement(veScreenResolution);
+ lastScreenWidth = 0;
+ lastScreenHeight = 0;
+}
+
+void cDisplayChannelView::DrawScraperContent(const cEvent *event) {
+ if (!event) {
+ return;
+ }
+
+ if (!ViewElementImplemented(veScraperContent)) {
+ return;
+ }
+
+ static cPlugin *pScraper = GetScraperPlugin();
+ if (!pScraper) {
+ return;
+ }
+
+ ScraperGetPosterBanner call;
+ call.event = event;
+ if (pScraper->Service("GetPosterBanner", &call)) {
+ int mediaWidth = 0;
+ int mediaHeight = 0;
+ string mediaPath = "";
+ bool isBanner = false;
+ int posterWidth = 0;
+ int posterHeight = 0;
+ string posterPath = "";
+ bool hasPoster = false;
+ int bannerWidth = 0;
+ int bannerHeight = 0;
+ string bannerPath = "";
+ bool hasBanner = false;
+
+ if ((call.type == tSeries) && call.banner.path.size() > 0) {
+ mediaWidth = call.banner.width;
+ mediaHeight = call.banner.height;
+ mediaPath = call.banner.path;
+ isBanner = true;
+ bannerWidth = mediaWidth;
+ bannerHeight = mediaHeight;
+ bannerPath = mediaPath;
+ hasBanner = true;
+
+ ScraperGetPoster callPoster;
+ callPoster.event = event;
+ callPoster.recording = NULL;
+ if (pScraper->Service("GetPoster", &callPoster)) {
+ posterWidth = callPoster.poster.width;
+ posterHeight = callPoster.poster.height;
+ posterPath = callPoster.poster.path;
+ hasPoster = true;
+ }
+ } else if (call.type == tMovie && call.poster.path.size() > 0 && call.poster.height > 0) {
+ mediaWidth = call.poster.width;
+ mediaHeight = call.poster.height;
+ mediaPath = call.poster.path;
+ posterWidth = call.poster.width;
+ posterHeight = call.poster.height;
+ posterPath = call.poster.path;
+ hasPoster = true;
+ } else
+ return;
+
+ map < string, int > intTokens;
+ map < string, string > stringTokens;
+ intTokens.insert(pair<string,int>("mediawidth", mediaWidth));
+ intTokens.insert(pair<string,int>("mediaheight", mediaHeight));
+ intTokens.insert(pair<string,int>("isbanner", isBanner));
+ stringTokens.insert(pair<string,string>("mediapath", mediaPath));
+ intTokens.insert(pair<string,int>("posterwidth", posterWidth));
+ intTokens.insert(pair<string,int>("posterheight", posterHeight));
+ stringTokens.insert(pair<string,string>("posterpath", posterPath));
+ intTokens.insert(pair<string,int>("hasposter", hasPoster));
+ intTokens.insert(pair<string,int>("bannerwidth", bannerWidth));
+ intTokens.insert(pair<string,int>("bannerheight", bannerHeight));
+ stringTokens.insert(pair<string,string>("bannerpath", bannerPath));
+ intTokens.insert(pair<string,int>("hasbanner", hasBanner));
+ ClearViewElement(veScraperContent);
+ DrawViewElement(veScraperContent, &stringTokens, &intTokens);
+ }
+}
+
+void cDisplayChannelView::ClearScraperContent(void) {
+ ClearViewElement(veScraperContent);
+}
+
+void cDisplayChannelView::DrawSignal(void) {
+ if (!ViewElementImplemented(veSignalQuality)) {
+ return;
+ }
+ time_t Now = time(NULL);
+ if (Now != lastSignalDisplay) {
+#ifdef DOPROFILE
+ cStopWatch watch("DrawSignal");
+#endif
+ int SignalStrength = cDevice::ActualDevice()->SignalStrength();
+#ifdef DOPROFILE
+ watch.Report("SignalStrength");
+#endif
+ int SignalQuality = cDevice::ActualDevice()->SignalQuality();
+#ifdef DOPROFILE
+ watch.Report("SignalQuality");
+ watch.Stop("DrawSignal");
+#endif
+ if (SignalStrength < 0) SignalStrength = 0;
+ if (SignalQuality < 0) SignalQuality = 0;
+ if ((SignalStrength == 0)&&(SignalQuality==0))
+ return;
+ if ((lastSignalStrength != SignalStrength) || (lastSignalQuality != SignalQuality)) {
+ map < string, int > intTokens;
+ map < string, string > stringTokens;
+ intTokens.insert(pair<string,int>("signalstrength", SignalStrength));
+ intTokens.insert(pair<string,int>("signalquality", SignalQuality));
+ ClearViewElement(veSignalQuality);
+ DrawViewElement(veSignalQuality, &stringTokens, &intTokens);
+ }
+ lastSignalStrength = SignalStrength;
+ lastSignalQuality = SignalQuality;
+ lastSignalDisplay = Now;
+ }
+}
+
+void cDisplayChannelView::DrawSignalBackground(void) {
+ if (!ViewElementImplemented(veSignalQualityBack)) {
+ return;
+ }
+ DrawViewElement(veSignalQualityBack);
+}
+
+
+void cDisplayChannelView::ClearSignal(void) {
+ ClearViewElement(veSignalQuality);
+}
+
+void cDisplayChannelView::ClearSignalBackground(void) {
+ ClearViewElement(veSignalQualityBack);
+}
+
+void cDisplayChannelView::DrawDevices(bool initial) {
+ if (!ViewElementImplemented(veDevices)) {
+ return;
+ }
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ map < string, vector< map< string, string > > > deviceLoopTokens;
+ vector< map< string, string > > devices;
+
+ bool changed = SetDevices(initial, &intTokens, &devices);
+ if (!changed)
+ return;
+
+ deviceLoopTokens.insert(pair< string, vector< map< string, string > > >("devices", devices));
+
+ ClearViewElement(veDevices);
+ DrawViewElement(veDevices, &stringTokens, &intTokens, &deviceLoopTokens);
+}
+
+void cDisplayChannelView::ClearDevices(void) {
+ ClearViewElement(veDevices);
+}
+
+void cDisplayChannelView::DrawChannelGroups(const cChannel *Channel, cString ChannelName) {
+ if (!ViewElementImplemented(veChannelGroup)) {
+ return;
+ }
+
+ bool separatorExists = imgCache->SeparatorLogoExists(*ChannelName);
+ string separatorPath = separatorExists ? *ChannelName : "";
+
+ std::string prevChannelSep = GetChannelSep(Channel, true);
+ std::string nextChannelSep = GetChannelSep(Channel, false);
+ bool prevAvailable = (prevChannelSep.size() > 0)?true:false;
+ bool nextAvailable = (nextChannelSep.size() > 0)?true:false;
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ intTokens.insert(pair<string,int>("sepexists", separatorExists));
+ intTokens.insert(pair<string,int>("prevAvailable", prevAvailable));
+ intTokens.insert(pair<string,int>("nextAvailable", nextAvailable));
+ stringTokens.insert(pair<string,string>("group", *ChannelName));
+ stringTokens.insert(pair<string,string>("nextgroup", nextChannelSep));
+ stringTokens.insert(pair<string,string>("prevgroup", prevChannelSep));
+ stringTokens.insert(pair<string,string>("seppath", separatorPath));
+
+ ClearViewElement(veChannelGroup);
+ DrawViewElement(veChannelGroup, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::ClearChannelGroups(void) {
+ ClearViewElement(veChannelGroup);
+}
+
+string cDisplayChannelView::GetChannelSep(const cChannel *channel, bool prev) {
+ std::string sepName = "";
+ const cChannel *sep = prev ? Channels.Prev(channel) :
+ Channels.Next(channel);
+ for (; sep; (prev)?(sep = Channels.Prev(sep)):(sep = Channels.Next(sep))) {
+ if (sep->GroupSep()) {
+ sepName = sep->Name();
+ break;
+ }
+ }
+ return sepName;
+}
+
+void cDisplayChannelView::DisplayMessage(eMessageType Type, const char *Text) {
+ if (!Text) {
+ ClearViewElement(veMessage);
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string,string>("text", Text));
+
+ intTokens.insert(pair<string,int>("status", (Type == mtStatus) ? true : false));
+ intTokens.insert(pair<string,int>("info", (Type == mtInfo) ? true : false));
+ intTokens.insert(pair<string,int>("warning", (Type == mtWarning) ? true : false));
+ intTokens.insert(pair<string,int>("error", (Type == mtError) ? true : false));
+
+ ClearViewElement(veMessage);
+ DrawViewElement(veMessage, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::DrawCustomTokens(void) {
+ if (!ViewElementImplemented(veCustomTokens)) {
+ return;
+ }
+ if (!tmplView)
+ return;
+ map < string, string > stringTokens = tmplView->GetCustomStringTokens();
+ map < string, int > intTokens = tmplView->GetCustomIntTokens();
+ DrawViewElement(veCustomTokens, &stringTokens, &intTokens);
+}
+
+void cDisplayChannelView::DrawCurrentWeather(void) {
+ if (!ViewElementImplemented(veCurrentWeather)) {
+ return;
+ }
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ if (!SetCurrentWeatherTokens(stringTokens, intTokens)){
+ ClearViewElement(veCurrentWeather);
+ return;
+ }
+
+ ClearViewElement(veCurrentWeather);
+ DrawViewElement(veCurrentWeather, &stringTokens, &intTokens);
+}
+
+
+void cDisplayChannelView::Action(void) {
+ SetInitFinished();
+ FadeIn();
+ DoFlush();
+ cView::Action();
+}
diff --git a/views/displaychannelview.h b/views/displaychannelview.h
new file mode 100644
index 0000000..5990232
--- /dev/null
+++ b/views/displaychannelview.h
@@ -0,0 +1,58 @@
+#ifndef __DISPLAYCHANNELVIEW_H
+#define __DISPLAYCHANNELVIEW_H
+
+#include "../libtemplate/template.h"
+#include "view.h"
+#include "viewhelpers.h"
+
+class cDisplayChannelView : public cView, public cViewHelpers {
+private:
+ int lastScreenWidth;
+ int lastScreenHeight;
+ int lastSignalDisplay;
+ int lastSignalStrength;
+ int lastSignalQuality;
+ int lastNumAudioTracks;
+ int lastAudioChannel;
+ string lastTracDesc;
+ string lastTrackLang;
+ string GetChannelSep(const cChannel *channel, bool prev);
+ virtual void Action(void);
+public:
+ cDisplayChannelView(cTemplateView *tmplView);
+ virtual ~cDisplayChannelView();
+ bool createOsd(void);
+ void DrawBackground(void);
+ void DrawChannel(cString &number, cString &name, cString &id, bool switching);
+ void ClearChannel(void);
+ void DrawDate(void);
+ void DrawTime(void);
+ void DrawProgressBar(cString &start, cString &stop, int Current, int Total);
+ void ClearProgressBar(void);
+ void DrawProgressBarBack(void);
+ void ClearProgressBarBack(void);
+ void DrawEPGInfo(const cEvent *present, const cEvent *next, bool presentRecording, bool nextRecording);
+ void ClearEPGInfo(void);
+ void DrawStatusIcons(const cChannel *Channel);
+ void ClearStatusIcons(void);
+ void DrawAudioInfo(void);
+ void ClearAudioInfo(void);
+ void DrawScreenResolution(void);
+ void ClearScreenResolution(void);
+ void DrawScraperContent(const cEvent *event);
+ void ClearScraperContent(void);
+ void DrawSignal(void);
+ void DrawSignalBackground(void);
+ void ClearSignal(void);
+ void ClearSignalBackground(void);
+ void DrawDevices(bool initial);
+ void ClearDevices(void);
+ void DrawChannelGroups(const cChannel *Channel, cString ChannelName);
+ void ClearChannelGroups(void);
+ void DisplayMessage(eMessageType Type, const char *Text);
+ void DrawCustomTokens(void);
+ void DrawCurrentWeather(void);
+ void DoStart(void) { Start(); };
+ void Flush(void) { DoFlush(); };
+};
+#endif //__DISPLAYCHANNELVIEW_H
diff --git a/views/displaymenudetailview.c b/views/displaymenudetailview.c
new file mode 100644
index 0000000..80caff7
--- /dev/null
+++ b/views/displaymenudetailview.c
@@ -0,0 +1,871 @@
+#include "displaymenudetailview.h"
+#include "../libcore/helpers.h"
+#include "../services/scraper2vdr.h"
+#include "../services/epgsearch.h"
+
+cDisplayMenuDetailView::cDisplayMenuDetailView(cTemplateView *tmplDetailView) : cView(tmplDetailView) {
+ event = NULL;
+ recording = NULL;
+ text = NULL;
+ detailViewInit = true;
+ isPluginTextView = false;
+ currentTmplTab = NULL;
+ tabView = NULL;
+}
+
+cDisplayMenuDetailView::~cDisplayMenuDetailView() {
+ CancelSave();
+ if (tabView)
+ delete tabView;
+}
+
+void cDisplayMenuDetailView::SetPluginTokens(map<string,string> *plugStringTokens, map<string,int> *plugIntTokens, map<string,vector<map<string,string> > > *plugLoopTokens) {
+ for (map<string,string>::iterator it = plugStringTokens->begin(); it != plugStringTokens->end(); it++) {
+ stringTokens.insert(pair<string,string>(it->first, it->second));
+ }
+
+ for (map<string,int>::iterator it = plugIntTokens->begin(); it != plugIntTokens->end(); it++) {
+ intTokens.insert(pair<string,int>(it->first, it->second));
+ }
+
+ for(map<string,vector<map<string,string> > >::iterator it = plugLoopTokens->begin(); it != plugLoopTokens->end(); it++) {
+ loopTokens.insert(pair<string,vector<map<string,string> > >(it->first, it->second));
+ }
+ isPluginTextView = true;
+}
+
+void cDisplayMenuDetailView::Clear(void) {
+ ClearViewElement(veDetailHeader);
+ ClearViewElement(veScrollbar);
+ ClearViewElement(veTabLabels);
+}
+
+void cDisplayMenuDetailView::Render(void) {
+ if (detailViewInit) {
+ DrawHeader();
+ DoFlush();
+ SetTokens();
+ InitTabs();
+ currentTmplTab = *atIt;
+ detailViewInit = false;
+ }
+ if (!tabView) {
+ tabView = new cDisplayMenuTabView(currentTmplTab);
+ tabView->SetTokens(&intTokens, &stringTokens, &loopTokens);
+ tabView->CreateTab();
+ tabView->Start();
+ }
+ DrawScrollbar();
+ DrawTabLabels();
+}
+
+void cDisplayMenuDetailView::KeyLeft(void) {
+ if (activeTabs.size() > 1) {
+ currentTmplTab = GetPrevTab();
+ delete tabView;
+ tabView = NULL;
+ Render();
+ DoFlush();
+ } else {
+ bool scrolled = tabView->KeyLeft();
+ if (scrolled) {
+ DrawScrollbar();
+ DoFlush();
+ }
+ }
+}
+
+void cDisplayMenuDetailView::KeyRight(void) {
+ if (activeTabs.size() > 1) {
+ currentTmplTab = GetNextTab();
+ delete tabView;
+ tabView = NULL;
+ Render();
+ DoFlush();
+ } else {
+ bool scrolled = tabView->KeyRight();
+ if (scrolled) {
+ DrawScrollbar();
+ DoFlush();
+ }
+ }
+}
+
+void cDisplayMenuDetailView::KeyUp(void) {
+ if (!tabView)
+ return;
+ bool scrolled = tabView->KeyUp();
+ if (scrolled) {
+ DrawScrollbar();
+ DoFlush();
+ }
+}
+
+void cDisplayMenuDetailView::KeyDown(void) {
+ if (!tabView)
+ return;
+ bool scrolled = tabView->KeyDown();
+ if (scrolled) {
+ DrawScrollbar();
+ DoFlush();
+ }
+}
+
+
+void cDisplayMenuDetailView::SetTokens(void) {
+ if (event) {
+ stringTokens.insert(pair<string,string>("title", event->Title() ? event->Title() : ""));
+ stringTokens.insert(pair<string,string>("shorttext", event->ShortText() ? event->ShortText() : ""));
+ stringTokens.insert(pair<string,string>("description", event->Description() ? event->Description() : ""));
+ stringTokens.insert(pair<string,string>("start", *(event->GetTimeString())));
+ stringTokens.insert(pair<string,string>("stop", *(event->GetEndTimeString())));
+ time_t startTime = event->StartTime();
+ stringTokens.insert(pair<string,string>("day", *WeekDayName(startTime)));
+ stringTokens.insert(pair<string,string>("date", *ShortDateString(startTime)));
+ struct tm * sStartTime = localtime(&startTime);
+ intTokens.insert(pair<string, int>("year", sStartTime->tm_year + 1900));
+ intTokens.insert(pair<string, int>("daynumeric", sStartTime->tm_mday));
+ intTokens.insert(pair<string, int>("month", sStartTime->tm_mon+1));
+
+ string channelID = *(event->ChannelID().ToString());
+ stringTokens.insert(pair<string,string>("channelid", channelID));
+ intTokens.insert(pair<string, int>("channellogoexists", imgCache->LogoExists(channelID)));
+
+ bool isRunning = false;
+ time_t now = time(NULL);
+ if ((now >= event->StartTime()) && (now <= event->EndTime()))
+ isRunning = true;
+ intTokens.insert(pair<string,int>("running", isRunning));
+ if (isRunning) {
+ intTokens.insert(pair<string,int>("elapsed", (now - event->StartTime())/60));
+ } else {
+ intTokens.insert(pair<string,int>("elapsed", 0));
+ }
+ intTokens.insert(pair<string,int>("duration", event->Duration() / 60));
+ intTokens.insert(pair<string,int>("durationhours", event->Duration() / 3600));
+ stringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", (event->Duration() / 60)%60)));
+ if (event->Vps())
+ stringTokens.insert(pair<string,string>("vps", *event->GetVpsString()));
+ else
+ stringTokens.insert(pair<string,string>("vps", ""));
+
+ vector< map< string, string > > reruns;
+ bool hasReruns = LoadReruns(&reruns);
+ loopTokens.insert(pair<string, vector< map< string, string > > >("reruns", reruns));
+
+ intTokens.insert(pair<string,int>("hasreruns", hasReruns));
+
+ SetScraperTokens(event, recording, stringTokens, intTokens, loopTokens);
+ SetEpgPictures(event->EventID());
+
+ } else if (recording) {
+ string name = recording->Name() ? recording->Name() : "";
+ stringTokens.insert(pair<string,string>("name", name));
+ intTokens.insert(pair<string,int>("cutted", recording->IsEdited()));
+
+ const cRecordingInfo *info = recording->Info();
+ if (info) {
+ stringTokens.insert(pair<string,string>("epgname", info->Title() ? info->Title() : name));
+ stringTokens.insert(pair<string,string>("shorttext", info->ShortText() ? info->ShortText() : ""));
+ stringTokens.insert(pair<string,string>("description", info->Description() ? info->Description() : ""));
+ const cEvent *event = info->GetEvent();
+ if (event) {
+ string recDate = *(event->GetDateString());
+ string recTime = *(event->GetTimeString());
+ if (recDate.find("1970") != string::npos) {
+ time_t start = recording->Start();
+ recDate = *DateString(start);
+ recTime = *TimeString(start);
+ }
+ stringTokens.insert(pair<string,string>("date", recDate.c_str()));
+ stringTokens.insert(pair<string,string>("time", recTime.c_str()));
+ time_t startTime = event->StartTime();
+ struct tm * sStartTime = localtime(&startTime);
+ intTokens.insert(pair<string, int>("year", sStartTime->tm_year + 1900));
+ intTokens.insert(pair<string, int>("daynumeric", sStartTime->tm_mday));
+ intTokens.insert(pair<string, int>("month", sStartTime->tm_mon+1));
+ int duration = event->Duration() / 60;
+ int recDuration = recording->LengthInSeconds();
+ recDuration = (recDuration>0)?(recDuration / 60):0;
+ intTokens.insert(pair<string,int>("duration", recDuration));
+ intTokens.insert(pair<string,int>("durationhours", recDuration / 60));
+ stringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", recDuration%60)));
+ intTokens.insert(pair<string,int>("durationevent", duration));
+ intTokens.insert(pair<string,int>("durationeventhours", duration / 60));
+ stringTokens.insert(pair<string,string>("durationeventminutes", *cString::sprintf("%.2d", duration%60)));
+ }
+ } else {
+ stringTokens.insert(pair<string,string>("epgname", ""));
+ stringTokens.insert(pair<string,string>("shorttext", ""));
+ stringTokens.insert(pair<string,string>("description", ""));
+ int recDuration = recording->LengthInSeconds();
+ recDuration = (recDuration>0)?(recDuration / 60):0;
+ stringTokens.insert(pair<string,string>("date", ""));
+ stringTokens.insert(pair<string,string>("time", ""));
+ intTokens.insert(pair<string,int>("duration", recDuration));
+ intTokens.insert(pair<string,int>("durationhours", recDuration / 60));
+ stringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", recDuration%60)));
+ intTokens.insert(pair<string,int>("durationevent", 0));
+ intTokens.insert(pair<string,int>("durationeventhours", 0));
+ stringTokens.insert(pair<string,string>("durationeventminutes", ""));
+ }
+ LoadRecordingInformation();
+ SetScraperTokens(event, recording, stringTokens, intTokens, loopTokens);
+ SetRecordingImages(recording->FileName());
+ } else if (text) {
+ stringTokens.insert(pair<string,string>("text", text));
+ } else {
+ intTokens.insert(pair<string,int>("running", false));
+ intTokens.insert(pair<string,int>("hasreruns", false));
+ }
+}
+
+void cDisplayMenuDetailView::InitTabs(void) {
+ tmplView->InitViewTabIterator();
+ cTemplateViewTab *tmplTab = NULL;
+ while(tmplTab = tmplView->GetNextViewTab()) {
+ tmplTab->ParseDynamicParameters(&intTokens, true);
+ tmplTab->ClearDynamicFunctionParameters();
+ tmplTab->ParseDynamicFunctionParameters(&stringTokens, &intTokens);
+ if (tmplTab->DoExecute()) {
+ activeTabs.push_back(tmplTab);
+ }
+ }
+ atIt = activeTabs.begin();
+}
+
+bool cDisplayMenuDetailView::LoadReruns(vector< map< string, string > > *reruns) {
+ if (!event)
+ return false;
+
+ cPlugin *epgSearchPlugin = cPluginManager::GetPlugin("epgsearch");
+ if (!epgSearchPlugin)
+ return false;
+
+ if (isempty(event->Title()))
+ return false;
+
+ int maxNumReruns = config.rerunAmount;
+ int rerunDistance = config.rerunDistance * 3600;
+ int rerunNaxChannel = config.rerunMaxChannel;
+
+ Epgsearch_searchresults_v1_0 data;
+ string strQuery = (event->Title()) ? event->Title() : "";
+ data.query = (char *)strQuery.c_str();
+ data.mode = 0;
+ data.channelNr = 0;
+ data.useTitle = true;
+ data.useSubTitle = true;
+ data.useDescription = false;
+
+ bool foundRerun = false;
+ if (epgSearchPlugin->Service("Epgsearch-searchresults-v1.0", &data)) {
+ cList<Epgsearch_searchresults_v1_0::cServiceSearchResult>* list = data.pResultList;
+ if (list && (list->Count() > 1)) {
+ foundRerun = true;
+ int i = 0;
+ for (Epgsearch_searchresults_v1_0::cServiceSearchResult *r = list->First(); r && i < maxNumReruns; r = list->Next(r)) {
+ time_t eventStart = event->StartTime();
+ time_t rerunStart = r->event->StartTime();
+ cChannel *channel = Channels.GetByChannelID(r->event->ChannelID(), true, true);
+ //check for identical event
+ if ((event->ChannelID() == r->event->ChannelID()) && (eventStart == rerunStart))
+ continue;
+ //check for timely distance
+ if (rerunDistance > 0) {
+ if (rerunStart - eventStart < rerunDistance) {
+ continue;
+ }
+ }
+ //check for maxchannel
+ if (rerunNaxChannel > 0) {
+ if (channel && channel->Number() > rerunNaxChannel) {
+ continue;
+ }
+ }
+ i++;
+ map< string, string > rerun;
+ rerun.insert(pair<string, string>("reruns[title]", r->event->Title() ? r->event->Title() : ""));
+ rerun.insert(pair<string, string>("reruns[shorttext]", r->event->ShortText() ? r->event->ShortText() : ""));
+ rerun.insert(pair<string, string>("reruns[start]", *(r->event->GetTimeString())));
+ rerun.insert(pair<string, string>("reruns[start]", *(r->event->GetTimeString())));
+ rerun.insert(pair<string, string>("reruns[stop]", *(r->event->GetEndTimeString())));
+ rerun.insert(pair<string, string>("reruns[date]", *ShortDateString(r->event->StartTime())));
+ rerun.insert(pair<string, string>("reruns[day]", *WeekDayName(r->event->StartTime())));
+ string channelID = *(r->event->ChannelID().ToString());
+ rerun.insert(pair<string, string>("reruns[channelid]", channelID));
+ bool logoExists = imgCache->LogoExists(channelID);
+ rerun.insert(pair<string, string>("reruns[channellogoexists]", logoExists ? "1" : "0"));
+
+ if (channel) {
+ stringstream channelNumber;
+ channelNumber << channel->Number();
+ rerun.insert(pair<string, string>("reruns[channelname]", channel->ShortName(true)));
+ rerun.insert(pair<string, string>("reruns[channelnumber]", channelNumber.str()));
+ } else {
+ rerun.insert(pair<string, string>("reruns[channelname]", ""));
+ rerun.insert(pair<string, string>("reruns[channelnumber]", ""));
+ }
+ reruns->push_back(rerun);
+ }
+ delete list;
+ }
+ }
+ return foundRerun;
+}
+
+void cDisplayMenuDetailView::LoadRecordingInformation(void) {
+ const cRecordingInfo *Info = recording->Info();
+ if (!Info)
+ return;
+ unsigned long long nRecSize = -1;
+ unsigned long long nFileSize[1000];
+ nFileSize[0] = 0;
+ int i = 0;
+ struct stat filebuf;
+ cString filename;
+ int rc = 0;
+ do {
+ if (recording->IsPesRecording())
+ filename = cString::sprintf("%s/%03d.vdr", recording->FileName(), ++i);
+ else
+ filename = cString::sprintf("%s/%05d.ts", recording->FileName(), ++i);
+ rc = stat(filename, &filebuf);
+ if (rc == 0)
+ nFileSize[i] = nFileSize[i-1] + filebuf.st_size;
+ else
+ if (ENOENT != errno) {
+ nRecSize = -1;
+ }
+ } while (i <= 999 && !rc);
+ nRecSize = nFileSize[i-1];
+
+ cMarks marks;
+ bool fHasMarks = marks.Load(recording->FileName(), recording->FramesPerSecond(), recording->IsPesRecording()) && marks.Count();
+ cIndexFile *index = new cIndexFile(recording->FileName(), false, recording->IsPesRecording());
+
+ int nCutLength = 0;
+ long nCutInFrame = 0;
+ unsigned long long nRecSizeCut = nRecSize < 0 ? -1 : 0;
+ unsigned long long nCutInOffset = 0;
+
+ if (fHasMarks && index) {
+ uint16_t FileNumber;
+ off_t FileOffset;
+
+ bool fCutIn = true;
+ cMark *mark = marks.First();
+ while (mark) {
+ int pos = mark->Position();
+ index->Get(pos, &FileNumber, &FileOffset); //TODO: will disc spin up?
+ if (fCutIn) {
+ nCutInFrame = pos;
+ fCutIn = false;
+ if (nRecSize >= 0)
+ nCutInOffset = nFileSize[FileNumber-1] + FileOffset;
+ } else {
+ nCutLength += pos - nCutInFrame;
+ fCutIn = true;
+ if (nRecSize >= 0)
+ nRecSizeCut += nFileSize[FileNumber-1] + FileOffset - nCutInOffset;
+ }
+ cMark *nextmark = marks.Next(mark);
+ mark = nextmark;
+ }
+ if (!fCutIn) {
+ nCutLength += index->Last() - nCutInFrame;
+ index->Get(index->Last() - 1, &FileNumber, &FileOffset);
+ if (nRecSize >= 0)
+ nRecSizeCut += nFileSize[FileNumber-1] + FileOffset - nCutInOffset;
+ }
+ }
+
+ if (nRecSize < 0) {
+ if ((nRecSize = ReadSizeVdr(recording->FileName())) < 0) {
+ nRecSize = DirSizeMB(recording->FileName());
+ }
+ }
+ if (nRecSize >= 0) {
+ cString strRecSize = "";
+ cString strRecSizeCut = "";
+
+ if (fHasMarks) {
+ if (nRecSize > MEGABYTE(1023)) {
+ strRecSize = cString::sprintf("%.2f GB", (float)nRecSize / MEGABYTE(1024));
+ strRecSizeCut = cString::sprintf("%.2f GB", (float)nRecSizeCut / MEGABYTE(1024));
+ } else {
+ strRecSize = cString::sprintf("%lld MB", nRecSize / MEGABYTE(1));
+ strRecSizeCut = cString::sprintf("%lld MB", nRecSizeCut / MEGABYTE(1));
+ }
+ } else {
+ if (nRecSize > MEGABYTE(1023)) {
+ strRecSize = cString::sprintf("%.2f GB", (float)nRecSize / MEGABYTE(1024));
+ strRecSizeCut = strRecSize;
+ } else {
+ strRecSize = cString::sprintf("%lld MB", nRecSize / MEGABYTE(1));
+ strRecSizeCut = strRecSize;
+ }
+ }
+ stringTokens.insert(pair<string,string>("recordingsize", *strRecSize));
+ stringTokens.insert(pair<string,string>("recordingsizecutted", *strRecSizeCut));
+ } else {
+ stringTokens.insert(pair<string,string>("recordingsize", ""));
+ stringTokens.insert(pair<string,string>("recordingsizecutted", ""));
+ }
+
+ cChannel *channel = Channels.GetByChannelID(Info->ChannelID());
+ if (channel) {
+ stringTokens.insert(pair<string,string>("recchannelname", channel->Name()));
+ stringTokens.insert(pair<string,string>("recchannelid", *channel->GetChannelID().ToString()));
+ intTokens.insert(pair<string,int>("recchannelnumber", channel->Number()));
+ } else {
+ stringTokens.insert(pair<string,string>("recchannelname", ""));
+ stringTokens.insert(pair<string,string>("recchannelid", ""));
+ intTokens.insert(pair<string,int>("recchannelnumber", 0));
+ }
+
+ if (index) {
+ int nLastIndex = index->Last();
+ if (nLastIndex) {
+ string strLength = *IndexToHMSF(nLastIndex, false, recording->FramesPerSecond());
+ string strLengthCutted = "";
+ if (fHasMarks) {
+ strLengthCutted = *IndexToHMSF(nCutLength, false, recording->FramesPerSecond());
+ } else {
+ strLengthCutted = strLength;
+ }
+ string strBitrate = *cString::sprintf("%.2f MBit/s", (float)nRecSize / nLastIndex * recording->FramesPerSecond() * 8 / MEGABYTE(1));
+ stringTokens.insert(pair<string,string>("recordinglength", strLength));
+ stringTokens.insert(pair<string,string>("recordinglengthcutted", strLengthCutted));
+ stringTokens.insert(pair<string,string>("recordingbitrate", strBitrate));
+ }
+ delete index;
+ }
+
+ string recFormat = recording->IsPesRecording() ? "PES" : "TS";
+ stringTokens.insert(pair<string,string>("recordingformat", recFormat));
+
+ bool searchTimerFound = false;
+ if (Info) {
+ const char *aux = NULL;
+ aux = Info->Aux();
+ if (aux) {
+ string strAux = aux;
+ string auxEpgsearch = StripXmlTag(strAux, "epgsearch");
+ if (!auxEpgsearch.empty()) {
+ string searchTimer = StripXmlTag(auxEpgsearch, "searchtimer");
+ if (!searchTimer.empty()) {
+ stringTokens.insert(pair<string,string>("searchtimer", searchTimer));
+ searchTimerFound = true;
+ }
+ }
+ }
+ }
+ if (!searchTimerFound)
+ stringTokens.insert(pair<string,string>("searchtimer", "n.a."));
+}
+
+string cDisplayMenuDetailView::StripXmlTag(string &Line, const char *Tag) {
+ // set the search strings
+ stringstream strStart, strStop;
+ strStart << "<" << Tag << ">";
+ strStop << "</" << Tag << ">";
+ // find the strings
+ string::size_type locStart = Line.find(strStart.str());
+ string::size_type locStop = Line.find(strStop.str());
+ if (locStart == string::npos || locStop == string::npos)
+ return "";
+ // extract relevant text
+ int pos = locStart + strStart.str().size();
+ int len = locStop - pos;
+ return len < 0 ? "" : Line.substr(pos, len);
+}
+
+
+int cDisplayMenuDetailView::ReadSizeVdr(const char *strPath) {
+ int dirSize = -1;
+ char buffer[20];
+ char *strFilename = NULL;
+ if (-1 != asprintf(&strFilename, "%s/size.vdr", strPath)) {
+ struct stat st;
+ if (stat(strFilename, &st) == 0) {
+ int fd = open(strFilename, O_RDONLY);
+ if (fd >= 0) {
+ if (safe_read(fd, &buffer, sizeof(buffer)) >= 0) {
+ dirSize = atoi(buffer);
+ }
+ close(fd);
+ }
+ }
+ free(strFilename);
+ }
+ return dirSize;
+}
+
+void cDisplayMenuDetailView::SetEpgPictures(int eventId) {
+ for (int i=0; i<3; i++) {
+ stringstream picName;
+ picName << eventId << "_" << i;
+ bool epgPicAvailable = FileExists(*config.epgImagePath, picName.str(), "jpg");
+ stringstream available;
+ stringstream path;
+ available << "epgpic" << i+1 << "avaialble";
+ path << "epgpic" << i+1 << "path";
+ if (epgPicAvailable) {
+ intTokens.insert(pair<string,int>(available.str(), true));
+ stringTokens.insert(pair<string,string>(path.str(), *cString::sprintf("%s%s.jpg", *config.epgImagePath, picName.str().c_str())));
+ } else {
+ intTokens.insert(pair<string,int>(available.str(), false));
+ stringTokens.insert(pair<string,string>(path.str(), ""));
+ }
+ }
+}
+
+void cDisplayMenuDetailView::SetRecordingImages(const char *recPath) {
+ if (!recPath) {
+ intTokens.insert(pair<string,int>("recimg1avaialble", false));
+ intTokens.insert(pair<string,int>("recimg2avaialble", false));
+ intTokens.insert(pair<string,int>("recimg3avaialble", false));
+ stringTokens.insert(pair<string,string>("recimg1path", ""));
+ stringTokens.insert(pair<string,string>("recimg2path", ""));
+ stringTokens.insert(pair<string,string>("recimg3path", ""));
+ return;
+ }
+
+ string path = recPath;
+ DIR *dirHandle;
+ struct dirent *dirEntry;
+ dirHandle = opendir(recPath);
+ if (!dirHandle) {
+ intTokens.insert(pair<string,int>("recimg1avaialble", false));
+ intTokens.insert(pair<string,int>("recimg2avaialble", false));
+ intTokens.insert(pair<string,int>("recimg3avaialble", false));
+ stringTokens.insert(pair<string,string>("recimg1path", ""));
+ stringTokens.insert(pair<string,string>("recimg2path", ""));
+ stringTokens.insert(pair<string,string>("recimg3path", ""));
+ return;
+ }
+
+ int picsFound = 0;
+ while ( 0 != (dirEntry = readdir(dirHandle))) {
+ if (endswith(dirEntry->d_name, "jpg")) {
+ string fileName = dirEntry->d_name;
+ stringstream available;
+ available << "recimg" << picsFound+1 << "avaialble";
+ stringstream path;
+ path << "recimg" << picsFound+1 << "path";
+ intTokens.insert(pair<string,int>(available.str(), true));
+ stringTokens.insert(pair<string,string>(path.str(), *cString::sprintf("%s/%s", recPath, fileName.c_str())));
+ picsFound++;
+ }
+ if (picsFound == 3) {
+ break;
+ }
+ }
+ for (int i=picsFound; i<3; i++) {
+ stringstream available;
+ available << "recimg" << i+1 << "avaialble";
+ stringstream path;
+ path << "recimg" << i+1 << "path";
+ intTokens.insert(pair<string,int>(available.str(), false));
+ stringTokens.insert(pair<string,string>(path.str(), ""));
+ }
+ closedir(dirHandle);
+}
+
+void cDisplayMenuDetailView::DrawHeader(void) {
+ map < string, string > headerStringTokens;
+ map < string, int > headerIntTokens;
+
+ if (event || recording) {
+ static cPlugin *pScraper = GetScraperPlugin();
+ if (!pScraper) {
+ headerIntTokens.insert(pair<string,int>("ismovie", false));
+ headerIntTokens.insert(pair<string,int>("isseries", false));
+ headerIntTokens.insert(pair<string,int>("posteravailable", false));
+ headerIntTokens.insert(pair<string,int>("banneravailable", false));
+ } else {
+ ScraperGetEventType getType;
+ getType.event = event;
+ getType.recording = recording;
+ if (!pScraper->Service("GetEventType", &getType)) {
+ headerIntTokens.insert(pair<string,int>("ismovie", false));
+ headerIntTokens.insert(pair<string,int>("isseries", false));
+ headerIntTokens.insert(pair<string,int>("posteravailable", false));
+ headerIntTokens.insert(pair<string,int>("banneravailable", false));
+ } else {
+ if (getType.type == tMovie) {
+ cMovie movie;
+ movie.movieId = getType.movieId;
+ pScraper->Service("GetMovie", &movie);
+ headerIntTokens.insert(pair<string,int>("ismovie", true));
+ headerIntTokens.insert(pair<string,int>("isseries", false));
+ headerIntTokens.insert(pair<string,int>("posteravailable", true));
+ headerIntTokens.insert(pair<string,int>("banneravailable", false));
+ headerStringTokens.insert(pair<string,string>("posterpath", movie.poster.path));
+ headerIntTokens.insert(pair<string,int>("posterwidth", movie.poster.width));
+ headerIntTokens.insert(pair<string,int>("posterheight", movie.poster.height));
+ } else if (getType.type == tSeries) {
+ cSeries series;
+ series.seriesId = getType.seriesId;
+ series.episodeId = getType.episodeId;
+ pScraper->Service("GetSeries", &series);
+ headerIntTokens.insert(pair<string,int>("ismovie", false));
+ headerIntTokens.insert(pair<string,int>("isseries", true));
+ vector<cTvMedia>::iterator poster = series.posters.begin();
+ if (poster != series.posters.end()) {
+ headerIntTokens.insert(pair<string,int>("posterwidth", (*poster).width));
+ headerIntTokens.insert(pair<string,int>("posterheight", (*poster).height));
+ headerStringTokens.insert(pair<string,string>("posterpath", (*poster).path));
+ headerIntTokens.insert(pair<string,int>("posteravailable", true));
+ } else {
+ headerIntTokens.insert(pair<string,int>("posterwidth", 0));
+ headerIntTokens.insert(pair<string,int>("posterheight", 0));
+ headerStringTokens.insert(pair<string,string>("posterpath", ""));
+ headerIntTokens.insert(pair<string,int>("posteravailable", false));
+ }
+ vector<cTvMedia>::iterator banner = series.banners.begin();
+ if (banner != series.banners.end()) {
+ headerIntTokens.insert(pair<string,int>("bannerwidth", (*banner).width));
+ headerIntTokens.insert(pair<string,int>("bannerheight", (*banner).height));
+ headerStringTokens.insert(pair<string,string>("bannerpath", (*banner).path));
+ headerIntTokens.insert(pair<string,int>("banneravailable", true));
+ } else {
+ headerIntTokens.insert(pair<string,int>("bannerwidth", 0));
+ headerIntTokens.insert(pair<string,int>("bannerheight", 0));
+ headerStringTokens.insert(pair<string,string>("bannerpath", ""));
+ headerIntTokens.insert(pair<string,int>("banneravailable", false));
+ }
+ } else {
+ headerIntTokens.insert(pair<string,int>("ismovie", false));
+ headerIntTokens.insert(pair<string,int>("isseries", false));
+ headerIntTokens.insert(pair<string,int>("posteravailable", false));
+ headerIntTokens.insert(pair<string,int>("banneravailable", false));
+ }
+ }
+ }
+ }
+
+ if (event) {
+ headerStringTokens.insert(pair<string,string>("title", event->Title() ? event->Title() : ""));
+ headerStringTokens.insert(pair<string,string>("shorttext", event->ShortText() ? event->ShortText() : ""));
+ headerStringTokens.insert(pair<string,string>("start", *(event->GetTimeString())));
+ headerStringTokens.insert(pair<string,string>("stop", *(event->GetEndTimeString())));
+
+ time_t startTime = event->StartTime();
+ headerStringTokens.insert(pair<string,string>("day", *WeekDayName(startTime)));
+ headerStringTokens.insert(pair<string,string>("date", *ShortDateString(startTime)));
+ struct tm * sStartTime = localtime(&startTime);
+ headerIntTokens.insert(pair<string, int>("year", sStartTime->tm_year + 1900));
+ headerIntTokens.insert(pair<string, int>("daynumeric", sStartTime->tm_mday));
+ headerIntTokens.insert(pair<string, int>("month", sStartTime->tm_mon+1));
+
+ const cChannel *channel = Channels.GetByChannelID(event->ChannelID());
+ if (channel) {
+ headerStringTokens.insert(pair<string,string>("channelname", channel->Name() ? channel->Name() : ""));
+ headerIntTokens.insert(pair<string, int>("channelnumber", channel->Number()));
+ } else {
+ headerStringTokens.insert(pair<string,string>("channelname", ""));
+ headerIntTokens.insert(pair<string, int>("channelnumber", 0));
+ }
+ string channelID = *(channel->GetChannelID().ToString());
+ headerStringTokens.insert(pair<string,string>("channelid", channelID));
+ headerIntTokens.insert(pair<string, int>("channellogoexists", imgCache->LogoExists(channelID)));
+
+ bool isRunning = false;
+ time_t now = time(NULL);
+ if ((now >= event->StartTime()) && (now <= event->EndTime()))
+ isRunning = true;
+ headerIntTokens.insert(pair<string,int>("running", isRunning));
+ if (isRunning) {
+ headerIntTokens.insert(pair<string,int>("elapsed", (now - event->StartTime())/60));
+ } else {
+ headerIntTokens.insert(pair<string,int>("elapsed", 0));
+ }
+ headerIntTokens.insert(pair<string,int>("duration", event->Duration() / 60));
+ headerIntTokens.insert(pair<string,int>("durationhours", event->Duration() / 3600));
+ headerStringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", (event->Duration() / 60)%60)));
+ if (event->Vps())
+ headerStringTokens.insert(pair<string,string>("vps", *event->GetVpsString()));
+ else
+ headerStringTokens.insert(pair<string,string>("vps", ""));
+
+ stringstream epgImageName;
+ epgImageName << event->EventID();
+ bool epgPicAvailable = FileExists(*config.epgImagePath, epgImageName.str(), "jpg");
+ if (epgPicAvailable) {
+ headerIntTokens.insert(pair<string,int>("epgpicavailable", true));
+ headerStringTokens.insert(pair<string,string>("epgpicpath", *cString::sprintf("%s%s.jpg", *config.epgImagePath, epgImageName.str().c_str())));
+ } else {
+ epgImageName << "_0";
+ epgPicAvailable = FileExists(*config.epgImagePath, epgImageName.str(), "jpg");
+ if (epgPicAvailable) {
+ headerIntTokens.insert(pair<string,int>("epgpicavailable", true));
+ headerStringTokens.insert(pair<string,string>("epgpicpath", *cString::sprintf("%s%s.jpg", *config.epgImagePath, epgImageName.str().c_str())));
+ } else {
+ headerIntTokens.insert(pair<string,int>("epgpicavailable", false));
+ headerStringTokens.insert(pair<string,string>("epgpicpath", ""));
+ }
+ }
+
+ DrawViewElement(veDetailHeader, &headerStringTokens, &headerIntTokens);
+ return;
+ } else if (recording) {
+ string name = recording->Name() ? recording->Name() : "";
+ headerStringTokens.insert(pair<string,string>("name", name));
+
+ const cRecordingInfo *info = recording->Info();
+ if (info) {
+ headerStringTokens.insert(pair<string,string>("epgname", info->Title() ? info->Title() : name));
+ headerStringTokens.insert(pair<string,string>("shorttext", info->ShortText() ? info->ShortText() : ""));
+ const cEvent *event = info->GetEvent();
+ if (event) {
+ string recDate = *(event->GetDateString());
+ string recTime = *(event->GetTimeString());
+ if (recDate.find("1970") != string::npos) {
+ time_t start = recording->Start();
+ recDate = *DateString(start);
+ recTime = *TimeString(start);
+ }
+ int duration = event->Duration() / 60;
+ int recDuration = recording->LengthInSeconds();
+ recDuration = (recDuration>0)?(recDuration / 60):0;
+ headerStringTokens.insert(pair<string,string>("date", recDate.c_str()));
+ headerStringTokens.insert(pair<string,string>("time", recTime.c_str()));
+ time_t startTime = event->StartTime();
+ struct tm * sStartTime = localtime(&startTime);
+ headerIntTokens.insert(pair<string, int>("year", sStartTime->tm_year + 1900));
+ headerIntTokens.insert(pair<string, int>("daynumeric", sStartTime->tm_mday));
+ headerIntTokens.insert(pair<string, int>("month", sStartTime->tm_mon+1));
+ headerIntTokens.insert(pair<string,int>("duration", recDuration));
+ headerIntTokens.insert(pair<string,int>("durationhours", recDuration / 60));
+ headerStringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", recDuration%60)));
+ headerIntTokens.insert(pair<string,int>("durationevent", duration));
+ headerIntTokens.insert(pair<string,int>("durationeventhours", duration / 60));
+ headerStringTokens.insert(pair<string,string>("durationeventminutes", *cString::sprintf("%.2d", duration%60)));
+ }
+ cChannel *channel = Channels.GetByChannelID(info->ChannelID());
+ if (channel) {
+ headerStringTokens.insert(pair<string,string>("recchannelname", channel->Name()));
+ headerStringTokens.insert(pair<string,string>("recchannelid", *channel->GetChannelID().ToString()));
+ headerIntTokens.insert(pair<string,int>("recchannelnumber", channel->Number()));
+ } else {
+ headerStringTokens.insert(pair<string,string>("recchannelname", ""));
+ headerStringTokens.insert(pair<string,string>("recchannelid", ""));
+ headerIntTokens.insert(pair<string,int>("recchannelnumber", 0));
+ }
+ } else {
+ headerStringTokens.insert(pair<string,string>("shorttext", ""));
+ int recDuration = recording->LengthInSeconds();
+ recDuration = (recDuration>0)?(recDuration / 60):0;
+ headerStringTokens.insert(pair<string,string>("date", ""));
+ headerStringTokens.insert(pair<string,string>("time", ""));
+ headerIntTokens.insert(pair<string,int>("duration", recDuration));
+ headerIntTokens.insert(pair<string,int>("durationhours", recDuration / 60));
+ headerStringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", recDuration%60)));
+ headerIntTokens.insert(pair<string,int>("durationevent", 0));
+ headerIntTokens.insert(pair<string,int>("durationeventhours", 0));
+ headerStringTokens.insert(pair<string,string>("durationeventminutes", ""));
+ headerStringTokens.insert(pair<string,string>("recchannelname", ""));
+ headerStringTokens.insert(pair<string,string>("recchannelid", ""));
+ headerIntTokens.insert(pair<string,int>("recchannelnumber", 0));
+ }
+
+ string recImage = "";
+ string path = recording->FileName() ? recording->FileName() : "";
+ string extension = ".jpg";
+ if (FirstFileInFolder(path, extension, recImage)) {
+ headerIntTokens.insert(pair<string,int>("recimgavailable", true));
+ headerStringTokens.insert(pair<string,string>("recimgpath", *cString::sprintf("%s/%s", path.c_str(), recImage.c_str())));
+ } else {
+ headerIntTokens.insert(pair<string,int>("recimgavailable", false));
+ headerStringTokens.insert(pair<string,string>("recimgpath", ""));
+ }
+ DrawViewElement(veDetailHeader, &headerStringTokens, &headerIntTokens);
+ return;
+ }
+
+ if (isPluginTextView) {
+ DrawViewElement(veDetailHeader, &stringTokens, &intTokens);
+ }
+}
+
+void cDisplayMenuDetailView::DrawScrollbar(void) {
+ map < string, string > scrollbarStringTokens;
+ map < string, int > scrollbarIntTokens;
+
+ int barTop = 0;
+ int barHeight = 0;
+ tabView->GetScrollbarPosition(barTop, barHeight);
+
+ scrollbarIntTokens.insert(pair<string,int>("height", barHeight));
+ scrollbarIntTokens.insert(pair<string,int>("offset", barTop));
+ ClearViewElement(veScrollbar);
+ DrawViewElement(veScrollbar, &scrollbarStringTokens, &scrollbarIntTokens);
+}
+
+void cDisplayMenuDetailView::DrawTabLabels(void) {
+ if (!ViewElementImplemented(veTabLabels)) {
+ return;
+ }
+ map < string, string > labelStringTokens;
+ map < string, int > labelIntTokens;
+ map < string, vector< map< string, string > > > labelLoopTokens;
+
+ string labelPrev = "";
+ string labelPrevTemp = "";
+ string labelCurrent = "";
+ string labelNext = "";
+ bool wasCurrent = false;
+ vector< map< string, string > > tabLabels;
+ for (list<cTemplateViewTab*>::iterator it = activeTabs.begin(); it != activeTabs.end(); it++) {
+ cTemplateViewTab *tab = *it;
+ map< string, string > tabLabel;
+ tabLabel.insert(pair< string, string >("tabs[title]", tab->GetName()));
+ if (wasCurrent) {
+ labelNext = tab->GetName();
+ }
+ if (tab == currentTmplTab) {
+ wasCurrent = true;
+ labelCurrent = tab->GetName();
+ labelPrev = labelPrevTemp;
+ tabLabel.insert(pair< string, string >("tabs[current]", "1"));
+ } else {
+ wasCurrent = false;
+ tabLabel.insert(pair< string, string >("tabs[current]", "0"));
+ }
+ labelPrevTemp = tab->GetName();
+ tabLabels.push_back(tabLabel);
+ }
+ if (labelNext.size() == 0 && activeTabs.size() > 0) {
+ cTemplateViewTab *firstTab = activeTabs.front();
+ labelNext = firstTab->GetName();
+ }
+ if (labelPrev.size() == 0 && activeTabs.size() > 0) {
+ cTemplateViewTab *lastTab = activeTabs.back();
+ labelPrev = lastTab->GetName();
+ }
+ labelStringTokens.insert(pair< string, string >("currenttab", labelCurrent));
+ labelStringTokens.insert(pair< string, string >("nexttab", labelNext));
+ labelStringTokens.insert(pair< string, string >("prevtab", labelPrev));
+ labelLoopTokens.insert(pair< string, vector< map< string, string > > >("tabs", tabLabels));
+
+ ClearViewElement(veTabLabels);
+ DrawViewElement(veTabLabels, &labelStringTokens, &labelIntTokens, &labelLoopTokens);
+}
+
+cTemplateViewTab *cDisplayMenuDetailView::GetPrevTab(void) {
+ if (atIt == activeTabs.begin()) {
+ atIt = activeTabs.end();
+ }
+ atIt--;
+ return *atIt;
+}
+
+cTemplateViewTab *cDisplayMenuDetailView::GetNextTab(void) {
+ atIt++;
+ if (atIt == activeTabs.end()) {
+ atIt = activeTabs.begin();
+ }
+ return *atIt;
+}
diff --git a/views/displaymenudetailview.h b/views/displaymenudetailview.h
new file mode 100644
index 0000000..1b43687
--- /dev/null
+++ b/views/displaymenudetailview.h
@@ -0,0 +1,52 @@
+#ifndef __DISPLAYMENUDETAILVIEW_H
+#define __DISPLAYMENUDETAILVIEW_H
+
+#include <list>
+#include "../libtemplate/template.h"
+#include "view.h"
+#include "viewhelpers.h"
+#include "displaymenutabview.h"
+
+class cDisplayMenuDetailView : public cView, public cViewHelpers {
+private:
+ bool detailViewInit;
+ bool isPluginTextView;
+ const cEvent *event;
+ const cRecording *recording;
+ const char *text;
+ cTemplateViewTab *currentTmplTab;
+ list<cTemplateViewTab*> activeTabs;
+ list<cTemplateViewTab*>::iterator atIt;
+ cDisplayMenuTabView *tabView;
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ map < string, vector< map< string, string > > > loopTokens;
+ void SetTokens(void);
+ void InitTabs(void);
+ bool LoadReruns(vector< map< string, string > > *reruns);
+ void LoadRecordingInformation(void);
+ void SetEpgPictures(int eventId);
+ void SetRecordingImages(const char *recPath);
+ string StripXmlTag(string &Line, const char *Tag);
+ int ReadSizeVdr(const char *strPath);
+ void DrawHeader(void);
+ void DrawScrollbar(void);
+ void DrawTabLabels(void);
+ cTemplateViewTab *GetPrevTab(void);
+ cTemplateViewTab *GetNextTab(void);
+public:
+ cDisplayMenuDetailView(cTemplateView *tmplDetailView);
+ virtual ~cDisplayMenuDetailView();
+ void SetEvent(const cEvent *event) { this->event = event; };
+ void SetRecording(const cRecording *recording) { this->recording = recording; };
+ void SetText(const char *text) { this->text = text; };
+ void SetPluginTokens(map<string,string> *plugStringTokens, map<string,int> *plugIntTokens, map<string,vector<map<string,string> > > *plugLoopTokens);
+ void Clear(void);
+ void Render(void);
+ void KeyLeft(void);
+ void KeyRight(void);
+ void KeyUp(void);
+ void KeyDown(void);
+};
+
+#endif //__DISPLAYMENUDETAILVIEW_H
diff --git a/views/displaymenuitemcurrentview.c b/views/displaymenuitemcurrentview.c
new file mode 100644
index 0000000..4f1994b
--- /dev/null
+++ b/views/displaymenuitemcurrentview.c
@@ -0,0 +1,724 @@
+#include "../services/scraper2vdr.h"
+#include "../libcore/helpers.h"
+#include "../libcore/recfolderinfo.h"
+#include "../libcore/extrecinfo.h"
+#include "displaymenuitemcurrentview.h"
+
+
+cDisplayMenuItemCurrentView::cDisplayMenuItemCurrentView(cTemplateViewElement *tmplCurrent) : cView(tmplCurrent) {
+ delay = tmplItem->GetNumericParameter(ptDelay);
+ SetFadeTime(tmplItem->GetNumericParameter(ptFadeTime));
+}
+
+cDisplayMenuItemCurrentView::~cDisplayMenuItemCurrentView() {
+ CancelSave();
+}
+
+void cDisplayMenuItemCurrentView::SetPosMenuItem(cRect &pos) {
+ posMenuItem.SetX(pos.X());
+ posMenuItem.SetY(pos.Y());
+ posMenuItem.SetWidth(pos.Width());
+ posMenuItem.SetHeight(pos.Height());
+}
+
+void cDisplayMenuItemCurrentView::SetTokensPosMenuItem(void) {
+ intTokens.insert(pair<string,int>("menuitemx", posMenuItem.X()));
+ intTokens.insert(pair<string,int>("menuitemy", posMenuItem.Y()));
+ intTokens.insert(pair<string,int>("menuitemwidth", posMenuItem.Width()));
+ intTokens.insert(pair<string,int>("menuitemheight", posMenuItem.Height()));
+}
+
+void cDisplayMenuItemCurrentView::SetScraperPoster(const cEvent *event, const cRecording *recording) {
+ static cPlugin *pScraper = GetScraperPlugin();
+ if (!pScraper || (!event && !recording)) {
+ intTokens.insert(pair<string,int>("hasposter", false));
+ intTokens.insert(pair<string,int>("posterwidth", -1));
+ intTokens.insert(pair<string,int>("posterheight", -1));
+ stringTokens.insert(pair<string,string>("posterpath", ""));
+ return;
+ }
+
+ ScraperGetPoster call;
+ call.event = event;
+ call.recording = recording;
+ if (pScraper->Service("GetPoster", &call)) {
+ intTokens.insert(pair<string,int>("hasposter", FileExists(call.poster.path)));
+ intTokens.insert(pair<string,int>("posterwidth", call.poster.width));
+ intTokens.insert(pair<string,int>("posterheight", call.poster.height));
+ stringTokens.insert(pair<string,string>("posterpath", call.poster.path));
+ } else {
+ intTokens.insert(pair<string,int>("hasposter", false));
+ intTokens.insert(pair<string,int>("posterwidth", -1));
+ intTokens.insert(pair<string,int>("posterheight", -1));
+ stringTokens.insert(pair<string,string>("posterpath", ""));
+ }
+}
+
+/*************************************************************
+* cDisplayMenuItemCurrentMainView
+*************************************************************/
+
+cDisplayMenuItemCurrentMainView::cDisplayMenuItemCurrentMainView(cTemplateViewElement *tmplCurrent, string number, string label, string icon)
+ : cDisplayMenuItemCurrentView(tmplCurrent) {
+ this->number = number;
+ this->label = label;
+ this->icon = icon;
+}
+
+cDisplayMenuItemCurrentMainView::~cDisplayMenuItemCurrentMainView() {
+}
+
+void cDisplayMenuItemCurrentMainView::Prepare(void) {
+}
+
+
+void cDisplayMenuItemCurrentMainView::Render(void) {
+ stringTokens.insert(pair<string,string>("number", number));
+ stringTokens.insert(pair<string,string>("label", label));
+ stringTokens.insert(pair<string,string>("icon", icon));
+ SetTokensPosMenuItem();
+ DrawViewElement(veMenuCurrentItemDetail, &stringTokens, &intTokens);
+}
+
+void cDisplayMenuItemCurrentMainView::Clear(void) {
+
+}
+
+void cDisplayMenuItemCurrentMainView::Action(void) {
+ SetInitFinished();
+ DoSleep(delay);
+ Render();
+ FadeIn();
+ DoFlush();
+ if (scrolling) {
+ DoSleep(scrollDelay);
+ if (scrollOrientation == orHorizontal) {
+ ScrollHorizontal(scrollingPix, scrollDelay, scrollSpeed, scrollMode);
+ } else {
+ ScrollVertical(scrollingPix, scrollDelay, scrollSpeed);
+ }
+ }
+}
+
+/*************************************************************
+* cDisplayMenuItemCurrentSchedulesView
+*************************************************************/
+
+cDisplayMenuItemCurrentSchedulesView::cDisplayMenuItemCurrentSchedulesView(cTemplateViewElement *tmplCurrent, const cEvent *event, const cChannel *channel, eTimerMatch timerMatch, eMenuCategory cat, bool isEpgSearchFav)
+ : cDisplayMenuItemCurrentView(tmplCurrent) {
+ this->event = event;
+ this->channel = channel;
+ this->timerMatch = timerMatch;
+ this->cat = cat;
+ this->isEpgSearchFav = isEpgSearchFav;
+}
+
+cDisplayMenuItemCurrentSchedulesView::~cDisplayMenuItemCurrentSchedulesView() {
+}
+
+void cDisplayMenuItemCurrentSchedulesView::Prepare(void) {
+}
+
+
+void cDisplayMenuItemCurrentSchedulesView::Render(void) {
+ intTokens.insert(pair<string,int>("whatson", (cat == mcSchedule)&&(!isEpgSearchFav) ? true: false));
+ intTokens.insert(pair<string,int>("whatsonnow", (cat == mcScheduleNow) ? true: false));
+ intTokens.insert(pair<string,int>("whatsonnext", (cat == mcScheduleNext) ? true: false));
+ intTokens.insert(pair<string,int>("whatsonfavorites", isEpgSearchFav ? true: false));
+ if (timerMatch == tmFull) {
+ intTokens.insert(pair<string,int>("timerpartitial", false));
+ intTokens.insert(pair<string,int>("timerfull", true));
+ } else if (timerMatch == tmPartial) {
+ intTokens.insert(pair<string,int>("timerpartitial", true));
+ intTokens.insert(pair<string,int>("timerfull", false));
+ } else {
+ intTokens.insert(pair<string,int>("timerpartitial", false));
+ intTokens.insert(pair<string,int>("timerfull", false));
+ }
+
+ if (event) {
+ stringTokens.insert(pair<string,string>("title", event->Title() ? event->Title() : ""));
+ stringTokens.insert(pair<string,string>("shorttext", event->ShortText() ? event->ShortText() : ""));
+ stringTokens.insert(pair<string,string>("description", event->Description() ? event->Description() : ""));
+ stringTokens.insert(pair<string,string>("start", *(event->GetTimeString())));
+ stringTokens.insert(pair<string,string>("stop", *(event->GetEndTimeString())));
+
+ time_t startTime = event->StartTime();
+ stringTokens.insert(pair<string,string>("day", *WeekDayName(startTime)));
+ stringTokens.insert(pair<string,string>("date", *ShortDateString(startTime)));
+ struct tm * sStartTime = localtime(&startTime);
+ intTokens.insert(pair<string, int>("year", sStartTime->tm_year + 1900));
+ intTokens.insert(pair<string, int>("daynumeric", sStartTime->tm_mday));
+ intTokens.insert(pair<string, int>("month", sStartTime->tm_mon+1));
+
+ bool isRunning = false;
+ time_t now = time(NULL);
+ if ((now >= event->StartTime()) && (now <= event->EndTime()))
+ isRunning = true;
+ intTokens.insert(pair<string,int>("running", isRunning));
+ if (isRunning) {
+ intTokens.insert(pair<string,int>("elapsed", (now - event->StartTime())/60));
+ } else {
+ intTokens.insert(pair<string,int>("elapsed", 0));
+ }
+ intTokens.insert(pair<string,int>("duration", event->Duration() / 60));
+ intTokens.insert(pair<string,int>("durationhours", event->Duration() / 3600));
+ stringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", (event->Duration() / 60)%60)));
+ SetScraperPoster(event);
+ }
+ if (channel) {
+ stringTokens.insert(pair<string,string>("channelname", channel->Name() ? channel->Name() : ""));
+ string channelID = *(channel->GetChannelID().ToString());
+ stringTokens.insert(pair<string,string>("channelid", channelID));
+ intTokens.insert(pair<string, int>("channelnumber", channel->Number()));
+ intTokens.insert(pair<string, int>("channellogoexists", imgCache->LogoExists(channelID)));
+ }
+
+ vector< map<string,string> > schedulesTokens;
+ if (cat == mcScheduleNow || cat == mcScheduleNext) {
+ ReadSchedules(&schedulesTokens);
+ }
+ map < string, vector< map< string, string > > > loopTokens;
+ loopTokens.insert(pair<string, vector< map< string, string > > >("schedule", schedulesTokens));
+ SetTokensPosMenuItem();
+ DrawViewElement(veMenuCurrentItemDetail, &stringTokens, &intTokens, &loopTokens);
+}
+
+void cDisplayMenuItemCurrentSchedulesView::Clear(void) {
+
+}
+
+void cDisplayMenuItemCurrentSchedulesView::Action(void) {
+ SetInitFinished();
+ DoSleep(delay);
+ Render();
+ FadeIn();
+ DoFlush();
+ if (scrolling) {
+ DoSleep(scrollDelay);
+ if (scrollOrientation == orHorizontal) {
+ ScrollHorizontal(scrollingPix, scrollDelay, scrollSpeed, scrollMode);
+ } else {
+ ScrollVertical(scrollingPix, scrollDelay, scrollSpeed);
+ }
+ }
+}
+
+void cDisplayMenuItemCurrentSchedulesView::ReadSchedules(vector< map<string,string> > *schedulesTokens) {
+ if (!event)
+ return;
+ const cSchedule *schedule = event->Schedule();
+ const cEvent *curEvent = event;
+ int num = 0;
+ for (; curEvent; curEvent = schedule->Events()->Next(curEvent)) {
+ if (num == 0) {
+ num++;
+ continue;
+ }
+ map<string,string> element;
+ element.insert(pair<string,string>("schedule[start]", *(curEvent->GetTimeString())));
+ element.insert(pair<string,string>("schedule[stop]", *(curEvent->GetEndTimeString())));
+ element.insert(pair<string,string>("schedule[title]", curEvent->Title() ? curEvent->Title() : ""));
+ element.insert(pair<string,string>("schedule[shorttext]", curEvent->ShortText() ? curEvent->ShortText() : ""));
+ schedulesTokens->push_back(element);
+ num++;
+ if (num > 10)
+ break;
+ }
+}
+
+/*************************************************************
+* cDisplayMenuItemCurrentChannelView
+*************************************************************/
+
+cDisplayMenuItemCurrentChannelView::cDisplayMenuItemCurrentChannelView(cTemplateViewElement *tmplCurrent, const cChannel *channel)
+ : cDisplayMenuItemCurrentView(tmplCurrent) {
+ this->channel = channel;
+}
+
+cDisplayMenuItemCurrentChannelView::~cDisplayMenuItemCurrentChannelView() {
+}
+
+void cDisplayMenuItemCurrentChannelView::Prepare(void) {
+}
+
+
+void cDisplayMenuItemCurrentChannelView::Render(void) {
+ if (!channel)
+ return;
+ //general channel information
+ intTokens.insert(pair<string,int>("number", channel->Number()));
+ intTokens.insert(pair<string,int>("transponder", channel->Transponder()));
+ intTokens.insert(pair<string,int>("frequency", channel->Frequency()));
+
+ stringTokens.insert(pair<string,string>("name", channel->Name() ? channel->Name() : ""));
+ string channelID = *(channel->GetChannelID().ToString());
+ stringTokens.insert(pair<string,string>("channelid", channelID));
+ intTokens.insert(pair<string, int>("channellogoexists", imgCache->LogoExists(channelID)));
+
+ //Channel Source Information
+ const cSource *source = Sources.Get(channel->Source());
+ if (source) {
+ stringTokens.insert(pair<string,string>("source", *cSource::ToString(source->Code())));
+ stringTokens.insert(pair<string,string>("sourcedescription", source->Description() ? source->Description() : ""));
+ stringTokens.insert(pair<string,string>("source", *cSource::ToString(source->Code())));
+ intTokens.insert(pair<string,int>("isAtsc", source->IsAtsc(source->Code())));
+ intTokens.insert(pair<string,int>("isCable", source->IsCable(source->Code())));
+ intTokens.insert(pair<string,int>("isSat", source->IsSat(source->Code())));
+ intTokens.insert(pair<string,int>("isTerr", source->IsTerr(source->Code())));
+ }
+
+ //current schedule
+ cSchedulesLock schedulesLock;
+ const cSchedules *schedules = cSchedules::Schedules(schedulesLock);
+ const cSchedule *schedule = NULL;
+ schedule = schedules->GetSchedule(channel);
+ if (schedule) {
+ const cEvent *presentEvent = schedule->GetPresentEvent();
+ if (presentEvent) {
+ stringTokens.insert(pair<string,string>("presenteventtitle", presentEvent->Title() ? presentEvent->Title() : ""));
+ stringTokens.insert(pair<string,string>("presenteventshorttext", presentEvent->ShortText() ? presentEvent->ShortText() : ""));
+ stringTokens.insert(pair<string,string>("presenteventdescription", presentEvent->Description() ? presentEvent->Description() : ""));
+ stringTokens.insert(pair<string,string>("presenteventstart", *presentEvent->GetTimeString()));
+ stringTokens.insert(pair<string,string>("presenteventstop", *presentEvent->GetEndTimeString()));
+ stringTokens.insert(pair<string,string>("presenteventday", *WeekDayName(presentEvent->StartTime())));
+ stringTokens.insert(pair<string,string>("presenteventdate", *ShortDateString(presentEvent->StartTime())));
+ intTokens.insert(pair<string,int>("presenteventelapsed", (time(0) - presentEvent->StartTime())/60));
+ intTokens.insert(pair<string,int>("presenteventduration", presentEvent->Duration() / 60));
+ intTokens.insert(pair<string,int>("presenteventdurationhours", presentEvent->Duration() / 3600));
+ stringTokens.insert(pair<string,string>("presenteventdurationminutes", *cString::sprintf("%.2d", (presentEvent->Duration() / 60)%60)));
+ SetScraperPoster(presentEvent);
+ } else {
+ stringTokens.insert(pair<string,string>("presenteventtitle", ""));
+ stringTokens.insert(pair<string,string>("presenteventshorttext", ""));
+ stringTokens.insert(pair<string,string>("presenteventdescription", ""));
+ stringTokens.insert(pair<string,string>("presenteventstart", ""));
+ stringTokens.insert(pair<string,string>("presenteventstop", ""));
+ stringTokens.insert(pair<string,string>("presenteventday", ""));
+ stringTokens.insert(pair<string,string>("presenteventdate", ""));
+ intTokens.insert(pair<string,int>("presenteventelapsed", 0));
+ intTokens.insert(pair<string,int>("presenteventduration", 0));
+ intTokens.insert(pair<string,int>("presenteventdurationhours", 0));
+ stringTokens.insert(pair<string,string>("presenteventdurationminutes", ""));
+ }
+ const cList<cEvent> *events = schedule->Events();
+ bool inserted = false;
+ if (events && presentEvent) {
+ const cEvent *nextEvent = events->Next(presentEvent);
+ if (nextEvent) {
+ stringTokens.insert(pair<string,string>("nexteventtitle", nextEvent->Title() ? nextEvent->Title() : ""));
+ stringTokens.insert(pair<string,string>("nexteventshorttext", nextEvent->ShortText() ? nextEvent->ShortText() : ""));
+ stringTokens.insert(pair<string,string>("nexteventdescription", nextEvent->Description() ? nextEvent->Description() : ""));
+ stringTokens.insert(pair<string,string>("nexteventstart", *nextEvent->GetTimeString()));
+ stringTokens.insert(pair<string,string>("nexteventstop", *nextEvent->GetEndTimeString()));
+ stringTokens.insert(pair<string,string>("nexteventday", *WeekDayName(nextEvent->StartTime())));
+ stringTokens.insert(pair<string,string>("nexteventdate", *ShortDateString(nextEvent->StartTime())));
+ intTokens.insert(pair<string,int>("nexteventduration", nextEvent->Duration() / 60));
+ intTokens.insert(pair<string,int>("nexteventdurationhours", nextEvent->Duration() / 3600));
+ stringTokens.insert(pair<string,string>("nexteventdurationminutes", *cString::sprintf("%.2d", (nextEvent->Duration() / 60)%60)));
+ inserted = true;
+ }
+ }
+ if (!inserted) {
+ stringTokens.insert(pair<string,string>("nexteventtitle", ""));
+ stringTokens.insert(pair<string,string>("nexteventshorttext", ""));
+ stringTokens.insert(pair<string,string>("nexteventdescription", ""));
+ stringTokens.insert(pair<string,string>("nexteventstart", ""));
+ stringTokens.insert(pair<string,string>("nexteventstop", ""));
+ stringTokens.insert(pair<string,string>("nexteventday", ""));
+ stringTokens.insert(pair<string,string>("nexteventdate", ""));
+ intTokens.insert(pair<string,int>("nexteventduration", 0));
+ intTokens.insert(pair<string,int>("nexteventdurationhours", 0));
+ stringTokens.insert(pair<string,string>("nexteventdurationminutes", ""));
+ }
+ }
+
+ vector< map<string,string> > schedulesTokens;
+ ReadSchedules(&schedulesTokens);
+
+ map < string, vector< map< string, string > > > loopTokens;
+ loopTokens.insert(pair<string, vector< map< string, string > > >("schedule", schedulesTokens));
+ SetTokensPosMenuItem();
+ DrawViewElement(veMenuCurrentItemDetail, &stringTokens, &intTokens, &loopTokens);
+}
+
+void cDisplayMenuItemCurrentChannelView::Clear(void) {
+
+}
+
+void cDisplayMenuItemCurrentChannelView::Action(void) {
+ SetInitFinished();
+ DoSleep(delay);
+ Render();
+ FadeIn();
+ DoFlush();
+ if (scrolling) {
+ DoSleep(scrollDelay);
+ if (scrollOrientation == orHorizontal) {
+ ScrollHorizontal(scrollingPix, scrollDelay, scrollSpeed, scrollMode);
+ } else {
+ ScrollVertical(scrollingPix, scrollDelay, scrollSpeed);
+ }
+ }
+}
+
+void cDisplayMenuItemCurrentChannelView::ReadSchedules(vector< map<string,string> > *schedulesTokens) {
+ cSchedulesLock schedulesLock;
+ const cSchedules *schedules = cSchedules::Schedules(schedulesLock);
+ const cSchedule *schedule = NULL;
+ schedule = schedules->GetSchedule(channel);
+ if (!schedule) {
+ return;
+ }
+ const cEvent *curEvent = schedule->GetPresentEvent();
+ int num = 0;
+ for (; curEvent; curEvent = schedule->Events()->Next(curEvent)) {
+ if (num < 2) {
+ num++;
+ continue;
+ }
+ map<string,string> element;
+ element.insert(pair<string,string>("schedule[start]", *(curEvent->GetTimeString())));
+ element.insert(pair<string,string>("schedule[stop]", *(curEvent->GetEndTimeString())));
+ element.insert(pair<string,string>("schedule[title]", curEvent->Title() ? curEvent->Title() : ""));
+ element.insert(pair<string,string>("schedule[shorttext]", curEvent->ShortText() ? curEvent->ShortText() : ""));
+ schedulesTokens->push_back(element);
+ num++;
+ if (num > 11)
+ break;
+ }
+}
+
+/*************************************************************
+* cDisplayMenuItemCurrentTimerView
+*************************************************************/
+
+cDisplayMenuItemCurrentTimerView::cDisplayMenuItemCurrentTimerView(cTemplateViewElement *tmplCurrent, const cTimer *timer)
+ : cDisplayMenuItemCurrentView(tmplCurrent) {
+ this->timer = timer;
+}
+
+cDisplayMenuItemCurrentTimerView::~cDisplayMenuItemCurrentTimerView() {
+}
+
+void cDisplayMenuItemCurrentTimerView::Prepare(void) {
+}
+
+
+void cDisplayMenuItemCurrentTimerView::Render(void) {
+ if (!timer)
+ return;
+ intTokens.insert(pair<string,int>("flagactive", timer->HasFlags(tfActive)));
+ intTokens.insert(pair<string,int>("flaginstant", timer->HasFlags(tfInstant)));
+ intTokens.insert(pair<string,int>("flagvps", timer->HasFlags(tfVps)));
+ intTokens.insert(pair<string,int>("flagrecording", timer->Recording()));
+ intTokens.insert(pair<string,int>("flagpending", timer->Pending()));
+
+ const char *file = Setup.FoldersInTimerMenu ? NULL : strrchr(timer->File(), FOLDERDELIMCHAR);
+ if (file && strcmp(file + 1, TIMERMACRO_TITLE) && strcmp(file + 1, TIMERMACRO_EPISODE))
+ file++;
+ else
+ file = timer->File();
+ stringTokens.insert(pair<string,string>("title", file));
+ stringTokens.insert(pair<string,string>("timerstart", *cString::sprintf("%02d:%02d", timer->Start() / 100, timer->Start() % 100)));
+ stringTokens.insert(pair<string,string>("timerstop", *cString::sprintf("%02d:%02d", timer->Stop() / 100, timer->Stop() % 100)));
+
+ string day = "";
+ string dayName = "";
+ if (timer->WeekDays())
+ day = timer->PrintDay(0, timer->WeekDays(), false);
+ else if (timer->Day() - time(NULL) < 28 * SECSINDAY) {
+ day = itoa(timer->GetMDay(timer->Day()));
+ dayName = WeekDayName(timer->Day());
+ } else {
+ struct tm tm_r;
+ time_t Day = timer->Day();
+ localtime_r(&Day, &tm_r);
+ char buffer[16];
+ strftime(buffer, sizeof(buffer), "%Y%m%d", &tm_r);
+ day = buffer;
+ }
+
+ struct tm tm_r;
+ time_t timerDate = timer->Day();
+ localtime_r(&timerDate, &tm_r);
+ char buffer[4];
+ strftime(buffer, sizeof(buffer), "%m", &tm_r);
+ int month = atoi(buffer);
+ char buffer2[6];
+ strftime(buffer2, sizeof(buffer2), "%b", &tm_r);
+ string monthName = buffer2;
+ char buffer3[6];
+ strftime(buffer3, sizeof(buffer3), "%Y", &tm_r);
+ int year = atoi(buffer3);
+
+ stringTokens.insert(pair<string,string>("day", day));
+ stringTokens.insert(pair<string,string>("dayname", dayName));
+ intTokens.insert(pair<string,int>("month", month));
+ stringTokens.insert(pair<string,string>("monthname", monthName));
+ intTokens.insert(pair<string,int>("year", year));
+
+ const cChannel *channel = timer->Channel();
+ if (channel) {
+ stringTokens.insert(pair<string,string>("channelname", channel->Name() ? channel->Name() : ""));
+ string channelID = *(channel->GetChannelID().ToString());
+ stringTokens.insert(pair<string,string>("channelid", channelID));
+ intTokens.insert(pair<string, int>("channellogoexists", imgCache->LogoExists(channelID)));
+ intTokens.insert(pair<string,int>("channelnumber", channel->Number()));
+ } else {
+ stringTokens.insert(pair<string,string>("channelname", ""));
+ stringTokens.insert(pair<string,string>("channelid", ""));
+ intTokens.insert(pair<string, int>("channellogoexists", 0));
+ intTokens.insert(pair<string,int>("channelnumber", 0));
+ }
+
+ const cEvent *event = timer->Event();
+ if (event) {
+ stringTokens.insert(pair<string,string>("eventtitle", event->Title() ? event->Title() : ""));
+ stringTokens.insert(pair<string,string>("eventstart", *event->GetTimeString()));
+ stringTokens.insert(pair<string,string>("eventstop", *event->GetEndTimeString()));
+ stringTokens.insert(pair<string,string>("eventshorttext", event->ShortText() ? event->ShortText() : ""));
+ stringTokens.insert(pair<string,string>("eventdescription", event->Description() ? event->Description() : ""));
+ SetScraperPoster(event);
+ } else {
+ stringTokens.insert(pair<string,string>("eventtitle", ""));
+ stringTokens.insert(pair<string,string>("eventstart", ""));
+ stringTokens.insert(pair<string,string>("eventstop", ""));
+ stringTokens.insert(pair<string,string>("eventshorttext", ""));
+ stringTokens.insert(pair<string,string>("eventdescription", ""));
+ }
+ SetTokensPosMenuItem();
+ DrawViewElement(veMenuCurrentItemDetail, &stringTokens, &intTokens);
+}
+
+void cDisplayMenuItemCurrentTimerView::Clear(void) {
+
+}
+
+void cDisplayMenuItemCurrentTimerView::Action(void) {
+ SetInitFinished();
+ DoSleep(delay);
+ Render();
+ FadeIn();
+ DoFlush();
+ if (scrolling) {
+ DoSleep(scrollDelay);
+ if (scrollOrientation == orHorizontal) {
+ ScrollHorizontal(scrollingPix, scrollDelay, scrollSpeed, scrollMode);
+ } else {
+ ScrollVertical(scrollingPix, scrollDelay, scrollSpeed);
+ }
+ }
+}
+
+/*************************************************************
+* cDisplayMenuItemCurrentRecordingView
+*************************************************************/
+
+cDisplayMenuItemCurrentRecordingView::cDisplayMenuItemCurrentRecordingView(cTemplateViewElement *tmplCurrent, const cRecording *recording, int level, int total, int newRecs)
+ : cDisplayMenuItemCurrentView(tmplCurrent) {
+ this->recording = recording;
+ this->level = level;
+ this->total = total;
+ this->newRecs = newRecs;
+}
+
+cDisplayMenuItemCurrentRecordingView::~cDisplayMenuItemCurrentRecordingView() {
+}
+
+void cDisplayMenuItemCurrentRecordingView::Prepare(void) {
+}
+
+
+void cDisplayMenuItemCurrentRecordingView::Render(void) {
+ if (!recording)
+ return;
+ map < string, vector< map< string, string > > > loopTokens;
+
+ bool isFolder = (total > 0) ? true : false;
+ intTokens.insert(pair<string,int>("folder", isFolder));
+
+ string name = recording->Name() ? recording->Name() : "";
+ string buffer = "";
+ stringstream folderName;
+ try {
+ vector<string> tokens;
+ istringstream f(name.c_str());
+ string s;
+ int i=0;
+ while (getline(f, s, FOLDERDELIMCHAR)) {
+ tokens.push_back(s);
+ if (isFolder && i <= level) {
+ if (i > 0)
+ folderName << FOLDERDELIMCHAR;
+ folderName << s;
+ i++;
+ }
+ }
+ buffer = tokens.at(level);
+ if (!isFolder && recording->IsEdited()) {
+ buffer = buffer.substr(1);
+ }
+ } catch (...) {
+ buffer = name.c_str();
+ }
+
+ const cRecording *usedRecording = recording;
+
+ if (isFolder) {
+ cRecordingsFolderInfo::cFolderInfo *folderInfo = recFolderInfo.Get(folderName.str().c_str());
+ if (folderInfo) {
+ cRecording *newestRec = Recordings.GetByName(*folderInfo->LatestFileName);
+ if (newestRec) {
+ usedRecording = newestRec;
+ }
+ delete folderInfo;
+ }
+ }
+
+ stringTokens.insert(pair<string,string>("name", buffer.c_str()));
+ intTokens.insert(pair<string,int>("new", usedRecording->IsNew()));
+ intTokens.insert(pair<string,int>("newrecordingsfolder", newRecs));
+ intTokens.insert(pair<string,int>("numrecordingsfolder", total));
+ intTokens.insert(pair<string,int>("cutted", usedRecording->IsEdited()));
+
+ SetScraperPoster(NULL, usedRecording);
+
+
+ const cRecordingInfo *info = usedRecording->Info();
+ if (!info) return;
+
+ bool extRecinfoAvailable = false;
+ if (info->Aux()) {
+ cExtRecInfo extRecInfo(info->Aux());
+ if (extRecInfo.Parse()) {
+ extRecinfoAvailable = true;
+ intTokens.insert(pair<string,int>("screenwidth", extRecInfo.resWidth));
+ intTokens.insert(pair<string,int>("screenheight", extRecInfo.resHeight));
+ intTokens.insert(pair<string,int>("isHD", extRecInfo.isHD));
+ intTokens.insert(pair<string,int>("isWideScreen", extRecInfo.isWideScreen));
+ intTokens.insert(pair<string,int>("isDolby", extRecInfo.isDolby));
+ stringTokens.insert(pair<string,string>("resolution", extRecInfo.resString));
+ stringTokens.insert(pair<string,string>("aspect", extRecInfo.aspectratio));
+ stringTokens.insert(pair<string,string>("codec", extRecInfo.codec));
+ stringTokens.insert(pair<string,string>("format", extRecInfo.format));
+ stringTokens.insert(pair<string,string>("framerate", extRecInfo.framerate));
+ stringTokens.insert(pair<string,string>("interlace", extRecInfo.interlace));
+ intTokens.insert(pair<string,int>("numtracks", extRecInfo.tracks.size()));
+ vector< map<string,string> > trackTokens;
+ int trackNumber = 1;
+ for (vector<tAudioTrack>::iterator track = extRecInfo.tracks.begin(); track != extRecInfo.tracks.end(); track++) {
+ map<string,string> element;
+ stringstream trackNum;
+ trackNum << trackNumber++;
+ element.insert(pair<string,string>("track[num]", trackNum.str()));
+ element.insert(pair<string,string>("track[codec]", (*track).codec));
+ element.insert(pair<string,string>("track[bitrate]", (*track).bitrate));
+ element.insert(pair<string,string>("track[language]", (*track).language));
+ trackTokens.push_back(element);
+ }
+ loopTokens.insert(pair<string, vector< map< string, string > > >("track", trackTokens));
+ }
+ }
+ intTokens.insert(pair<string,int>("extrecinfoavailable", extRecinfoAvailable));
+
+ stringTokens.insert(pair<string,string>("epgname", info->Title() ? info->Title() : buffer));
+ stringTokens.insert(pair<string,string>("shorttext", info->ShortText() ? info->ShortText() : ""));
+ stringTokens.insert(pair<string,string>("description", info->Description() ? info->Description() : ""));
+
+ const cEvent *event = info->GetEvent();
+ if (!event) return;
+
+ string recDate = *(event->GetDateString());
+ string recTime = *(event->GetTimeString());
+ if (recDate.find("1970") != string::npos) {
+ time_t start = usedRecording->Start();
+ recDate = *DateString(start);
+ recTime = *TimeString(start);
+ }
+
+ time_t startTime = event->StartTime();
+ struct tm * sStartTime = localtime(&startTime);
+ intTokens.insert(pair<string, int>("year", sStartTime->tm_year + 1900));
+ intTokens.insert(pair<string, int>("daynumeric", sStartTime->tm_mday));
+ intTokens.insert(pair<string, int>("month", sStartTime->tm_mon+1));
+
+ int duration = event->Duration() / 60;
+ int recDuration = usedRecording->LengthInSeconds();
+ recDuration = (recDuration>0)?(recDuration / 60):0;
+ stringTokens.insert(pair<string,string>("date", recDate.c_str()));
+ stringTokens.insert(pair<string,string>("time", recTime.c_str()));
+ intTokens.insert(pair<string,int>("duration", recDuration));
+ intTokens.insert(pair<string,int>("durationhours", recDuration / 60));
+ stringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", recDuration%60)));
+ intTokens.insert(pair<string,int>("durationevent", duration));
+ intTokens.insert(pair<string,int>("durationeventhours", duration / 60));
+ stringTokens.insert(pair<string,string>("durationeventminutes", *cString::sprintf("%.2d", duration%60)));
+ SetTokensPosMenuItem();
+ DrawViewElement(veMenuCurrentItemDetail, &stringTokens, &intTokens, &loopTokens);
+}
+
+void cDisplayMenuItemCurrentRecordingView::Clear(void) {
+
+}
+
+void cDisplayMenuItemCurrentRecordingView::Action(void) {
+ SetInitFinished();
+ DoSleep(delay);
+ Render();
+ FadeIn();
+ DoFlush();
+ if (scrolling) {
+ DoSleep(scrollDelay);
+ if (scrollOrientation == orHorizontal) {
+ ScrollHorizontal(scrollingPix, scrollDelay, scrollSpeed, scrollMode);
+ } else {
+ ScrollVertical(scrollingPix, scrollDelay, scrollSpeed);
+ }
+ }
+}
+
+/*************************************************************
+* cDisplayMenuItemCurrentPluginView
+*************************************************************/
+
+cDisplayMenuItemCurrentPluginView::cDisplayMenuItemCurrentPluginView(cTemplateViewElement *tmplCurrent, map <string,string> &plugStringTokens,
+ map <string,int> &plugIntTokens, map<string,vector<map<string,string> > > &pluginLoopTokens)
+ : cDisplayMenuItemCurrentView(tmplCurrent) {
+
+ stringTokens = plugStringTokens;
+ intTokens = plugIntTokens;
+ loopTokens = pluginLoopTokens;
+}
+
+cDisplayMenuItemCurrentPluginView::~cDisplayMenuItemCurrentPluginView() {
+}
+
+void cDisplayMenuItemCurrentPluginView::Prepare(void) {
+}
+
+
+void cDisplayMenuItemCurrentPluginView::Render(void) {
+ SetTokensPosMenuItem();
+ DrawViewElement(veMenuCurrentItemDetail, &stringTokens, &intTokens, &loopTokens);
+}
+
+void cDisplayMenuItemCurrentPluginView::Clear(void) {
+
+}
+
+void cDisplayMenuItemCurrentPluginView::Action(void) {
+ SetInitFinished();
+ DoSleep(delay);
+ Render();
+ FadeIn();
+ DoFlush();
+ if (scrolling) {
+ DoSleep(scrollDelay);
+ if (scrollOrientation == orHorizontal) {
+ ScrollHorizontal(scrollingPix, scrollDelay, scrollSpeed, scrollMode);
+ } else {
+ ScrollVertical(scrollingPix, scrollDelay, scrollSpeed);
+ }
+ }
+}
diff --git a/views/displaymenuitemcurrentview.h b/views/displaymenuitemcurrentview.h
new file mode 100644
index 0000000..680d9c8
--- /dev/null
+++ b/views/displaymenuitemcurrentview.h
@@ -0,0 +1,108 @@
+#ifndef __DISPLAYMENUITEMCURRENTVIEW_H
+#define __DISPLAYMENUITEMCURRENTVIEW_H
+
+#include "../libtemplate/template.h"
+#include "view.h"
+
+class cDisplayMenuItemCurrentView : public cView {
+private:
+protected:
+ int delay;
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ cRect posMenuItem;
+ void SetTokensPosMenuItem(void);
+ void SetScraperPoster(const cEvent *event, const cRecording *recording=NULL);
+public:
+ cDisplayMenuItemCurrentView(cTemplateViewElement *tmplCurrent);
+ virtual ~cDisplayMenuItemCurrentView();
+ void SetPosMenuItem(cRect &pos);
+ virtual void Prepare(void) {};
+ virtual void Render(void) {};
+ virtual void Clear(void) {};
+};
+
+class cDisplayMenuItemCurrentMainView: public cDisplayMenuItemCurrentView {
+private:
+ string number;
+ string label;
+ string icon;
+ void Action(void);
+public:
+ cDisplayMenuItemCurrentMainView(cTemplateViewElement *tmplCurrent, string number, string label, string icon);
+ virtual ~cDisplayMenuItemCurrentMainView();
+ void Prepare(void);
+ void Render(void);
+ void Clear(void);
+};
+
+class cDisplayMenuItemCurrentSchedulesView: public cDisplayMenuItemCurrentView {
+private:
+ const cEvent *event;
+ const cChannel *channel;
+ eTimerMatch timerMatch;
+ eMenuCategory cat;
+ bool isEpgSearchFav;
+ void Action(void);
+ void ReadSchedules(vector< map<string,string> > *schedulesTokens);
+public:
+ cDisplayMenuItemCurrentSchedulesView(cTemplateViewElement *tmplCurrent, const cEvent *event, const cChannel *channel, eTimerMatch timerMatch, eMenuCategory cat, bool isEpgSearchFav);
+ virtual ~cDisplayMenuItemCurrentSchedulesView();
+ void Prepare(void);
+ void Render(void);
+ void Clear(void);
+};
+
+class cDisplayMenuItemCurrentChannelView: public cDisplayMenuItemCurrentView {
+private:
+ const cChannel *channel;
+ void Action(void);
+ void ReadSchedules(vector< map<string,string> > *schedulesTokens);
+public:
+ cDisplayMenuItemCurrentChannelView(cTemplateViewElement *tmplCurrent, const cChannel *channel);
+ virtual ~cDisplayMenuItemCurrentChannelView();
+ void Prepare(void);
+ void Render(void);
+ void Clear(void);
+};
+
+class cDisplayMenuItemCurrentTimerView: public cDisplayMenuItemCurrentView {
+private:
+ const cTimer *timer;
+ void Action(void);
+public:
+ cDisplayMenuItemCurrentTimerView(cTemplateViewElement *tmplCurrent, const cTimer *timer);
+ virtual ~cDisplayMenuItemCurrentTimerView();
+ void Prepare(void);
+ void Render(void);
+ void Clear(void);
+};
+
+class cDisplayMenuItemCurrentRecordingView: public cDisplayMenuItemCurrentView {
+private:
+ const cRecording *recording;
+ int level;
+ int total;
+ int newRecs;
+ void Action(void);
+public:
+ cDisplayMenuItemCurrentRecordingView(cTemplateViewElement *tmplCurrent, const cRecording *recording, int level, int total, int newRecs);
+ virtual ~cDisplayMenuItemCurrentRecordingView();
+ void Prepare(void);
+ void Render(void);
+ void Clear(void);
+};
+
+class cDisplayMenuItemCurrentPluginView: public cDisplayMenuItemCurrentView {
+private:
+ map<string,vector<map<string,string> > > loopTokens;
+ void Action(void);
+public:
+ cDisplayMenuItemCurrentPluginView(cTemplateViewElement *tmplCurrent, map <string,string> &plugStringTokens, map <string,int> &plugIntTokens, map<string,vector<map<string,string> > > &pluginLoopTokens);
+ virtual ~cDisplayMenuItemCurrentPluginView();
+ void Prepare(void);
+ void Render(void);
+ void Clear(void);
+};
+
+#endif //__DISPLAYMENUITEMCURRENTVIEW_H
diff --git a/views/displaymenuitemview.c b/views/displaymenuitemview.c
new file mode 100644
index 0000000..3594396
--- /dev/null
+++ b/views/displaymenuitemview.c
@@ -0,0 +1,870 @@
+#include "displaymenuitemview.h"
+#include "../services/scraper2vdr.h"
+#include "../config.h"
+#include "../libcore/helpers.h"
+#include "../libcore/recfolderinfo.h"
+#include <sstream>
+#include <algorithm>
+
+/*************************************************************
+* cDisplayMenuItemView
+*************************************************************/
+
+cDisplayMenuItemView::cDisplayMenuItemView(cTemplateViewList *tmplList, bool current, bool selectable) : cViewListItem(tmplList->GetListElement()) {
+ this->tmplList = tmplList;
+ this->current = current;
+ this->selectable = selectable;
+ itemInit = true;
+ dirty = true;
+ num = 0;
+ currentView = NULL;
+}
+
+cDisplayMenuItemView::~cDisplayMenuItemView() {
+ if (currentView)
+ delete currentView;
+ CancelSave();
+}
+
+void cDisplayMenuItemView::SetCurrent(bool cur) {
+ current = cur;
+ intTokens.erase("current");
+ intTokens.insert(pair<string,int>("current", current));
+ dirty = true;
+};
+
+
+void cDisplayMenuItemView::ArrangeContainer(void) {
+ if (pos > -1)
+ return;
+ SetInitFinished();
+ pos = num;
+ numTotal = tmplList->GetNumericParameter(ptNumElements);
+ container.SetX(tmplList->GetNumericParameter(ptX));
+ container.SetY(tmplList->GetNumericParameter(ptY));
+ container.SetWidth(tmplList->GetNumericParameter(ptWidth));
+ container.SetHeight(tmplList->GetNumericParameter(ptHeight));
+ align = tmplList->GetNumericParameter(ptAlign);
+ listOrientation = tmplList->GetNumericParameter(ptOrientation);
+}
+
+void cDisplayMenuItemView::Clear(void) {
+ ClearListItem();
+ if (currentView) {
+ delete currentView;
+ currentView = NULL;
+ }
+}
+
+void cDisplayMenuItemView::PrepareScrolling(void) {
+ currentlyScrolling = true;
+ ClearListItem();
+ DrawListItem(&stringTokens, &intTokens);
+}
+
+void cDisplayMenuItemView::EndScrolling(void) {
+ const cPoint p(0,0);
+ SetDrawPortPoint(scrollingPix, p);
+ currentlyScrolling = false;
+ ClearListItem();
+ DrawListItem(&stringTokens, &intTokens);
+}
+
+void cDisplayMenuItemView::Action(void) {
+ if (scrolling) {
+ DoSleep(scrollDelay);
+ PrepareScrolling();
+ if (scrollOrientation == orHorizontal) {
+ ScrollHorizontal(scrollingPix, scrollDelay, scrollSpeed, scrollMode);
+ } else {
+ ScrollVertical(scrollingPix, scrollDelay, scrollSpeed);
+ }
+ }
+}
+
+void cDisplayMenuItemView::Stop(void) {
+ if (Running()) {
+ CancelSave();
+ EndScrolling();
+ }
+}
+
+
+void cDisplayMenuItemView::Debug(void) {
+ esyslog("skindesigner: current %d, selectable %d", current, selectable);
+ esyslog("skindesigner: pos %d, numTotal %d", pos, numTotal);
+ esyslog("skindesigner: container x = %d, y = %d, width = %d, height = %d", container.X(), container.Y(), container.Width(), container.Height());
+}
+
+/*************************************************************
+* cDisplayMenuItemDefaultView
+*************************************************************/
+
+cDisplayMenuItemDefaultView::cDisplayMenuItemDefaultView(cTemplateViewList *tmplList, string *tabTexts, int *tabs, int *tabWidths, bool current, bool selectable)
+ : cDisplayMenuItemView(tmplList, current, selectable) {
+ this->tabTexts = tabTexts;
+ this->tabs = tabs;
+ this->tabWidths = tabWidths;
+ maxTabs = cSkinDisplayMenu::MaxTabs;
+}
+
+cDisplayMenuItemDefaultView::~cDisplayMenuItemDefaultView() {
+ delete[] tabTexts;
+}
+
+void cDisplayMenuItemDefaultView::SetTabTexts(string *tabTexts) {
+ delete[] this->tabTexts;
+ this->tabTexts = tabTexts;
+}
+
+void cDisplayMenuItemDefaultView::SetTokens(void) {
+ stringTokens.clear();
+ intTokens.clear();
+ for (int i=0; i<maxTabs; i++) {
+ stringstream name;
+ name << "column" << (i+1);
+ stringstream nameUsed;
+ nameUsed << name.str() << "set";
+ stringstream nameX;
+ nameX << name.str() << "x";
+ stringstream nameWidth;
+ nameWidth << name.str() << "width";
+ stringTokens.insert(pair<string,string>(name.str(), tabTexts[i]));
+ if (i>0)
+ intTokens.insert(pair<string,int>(nameUsed.str(), (tabTexts[i].size() > 0) ? 1 : 0 ));
+ intTokens.insert(pair<string,int>(nameX.str(), tabs[i]));
+ intTokens.insert(pair<string,int>(nameWidth.str(), tabWidths[i]));
+ }
+ intTokens.insert(pair<string,int>("current", current));
+ intTokens.insert(pair<string,int>("separator", !selectable));
+ intTokens.insert(pair<string,int>("nummenuitem", num+1));
+}
+
+void cDisplayMenuItemDefaultView::Prepare(void) {
+ ArrangeContainer();
+}
+
+
+void cDisplayMenuItemDefaultView::Render(void) {
+ DrawListItem(&stringTokens, &intTokens);
+ dirty = false;
+}
+
+void cDisplayMenuItemDefaultView::Debug(void) {
+ esyslog("skindesigner: Default Menu Item ---------------");
+ cDisplayMenuItemView::Debug();
+ for (int i=0; i<maxTabs; i++) {
+ esyslog("skindesigner: tab %d: text: %s, x: %d", i, tabTexts[i].c_str(), tabs[i]);
+ }
+}
+
+/*************************************************************
+* Private Functions
+*************************************************************/
+
+
+/*************************************************************
+* cDisplayMenuItemMainView
+*************************************************************/
+
+cDisplayMenuItemMainView::cDisplayMenuItemMainView(cTemplateViewList *tmplList, string itemText, bool current, bool selectable)
+ : cDisplayMenuItemView(tmplList, current, selectable) {
+ text = itemText;
+ number = "";
+ label = "";
+ icon = "";
+}
+
+cDisplayMenuItemMainView::~cDisplayMenuItemMainView() {
+}
+
+void cDisplayMenuItemMainView::SetTokens(void) {
+ if (!itemInit)
+ return;
+ itemInit = false;
+ stringTokens.insert(pair<string,string>("number", number));
+ stringTokens.insert(pair<string,string>("label", label));
+ stringTokens.insert(pair<string,string>("icon", icon));
+
+ intTokens.insert(pair<string,int>("current", current));
+ intTokens.insert(pair<string,int>("separator", !selectable));
+ intTokens.insert(pair<string,int>("nummenuitem", num+1));
+}
+
+void cDisplayMenuItemMainView::Prepare(void) {
+ ArrangeContainer();
+ SplitMenuText();
+ icon = imgCache->GetIconName(label);
+}
+
+
+void cDisplayMenuItemMainView::Render(void) {
+
+ cRect pos = DrawListItem(&stringTokens, &intTokens);
+
+ if (current) {
+ cTemplateViewElement *tmplCurrent = tmplList->GetListElementCurrent();
+ if (tmplCurrent) {
+ currentView = new cDisplayMenuItemCurrentMainView(tmplCurrent, number, label, icon);
+ currentView->SetPosMenuItem(pos);
+ currentView->Start();
+ }
+ }
+
+ dirty = false;
+}
+
+void cDisplayMenuItemMainView::Debug(void) {
+ esyslog("skindesigner: Main Menu Item ---------------");
+ cDisplayMenuItemView::Debug();
+ esyslog("skindesigner: item Text: %s", text.c_str());
+ esyslog("skindesigner: item Number: %s, Label: %s", number.c_str(), label.c_str());
+ esyslog("skindesigner: Icon: %s", icon.c_str());
+}
+
+/*************************************************************
+* Private Functions
+*************************************************************/
+
+void cDisplayMenuItemMainView::SplitMenuText(void) {
+ string textPlain = skipspace(text.c_str());
+ bool found = false;
+ bool doBreak = false;
+ size_t i = 0;
+ for (; i < textPlain.length(); i++) {
+ char s = textPlain.at(i);
+ if (i==0) {
+ //if text directly starts with nonnumeric, break
+ if (!(s >= '0' && s <= '9')) {
+ break;
+ }
+ }
+ if (found) {
+ if (!(s >= '0' && s <= '9')) {
+ doBreak = true;
+ }
+ }
+ if (s >= '0' && s <= '9') {
+ found = true;
+ }
+ if (doBreak)
+ break;
+ if (i>4)
+ break;
+ }
+ if (found) {
+ number = skipspace(textPlain.substr(0,i).c_str());
+ label = skipspace(textPlain.substr(i).c_str());
+ } else {
+ number = "";
+ label = textPlain.c_str();
+ }
+}
+
+/*************************************************************
+* cDisplayMenuItemSchedulesView
+*************************************************************/
+
+cDisplayMenuItemSchedulesView::cDisplayMenuItemSchedulesView(cTemplateViewList *tmplList, const cEvent *event,
+ const cChannel *channel, eTimerMatch timerMatch,
+ eMenuCategory cat, bool isEpgSearchFav, bool current, bool selectable)
+ : cDisplayMenuItemView(tmplList, current, selectable) {
+ this->event = event;
+ this->channel = channel;
+ this->timerMatch = timerMatch;
+ this->cat = cat;
+ this->isEpgSearchFav = isEpgSearchFav;
+}
+
+cDisplayMenuItemSchedulesView::~cDisplayMenuItemSchedulesView() {
+}
+
+void cDisplayMenuItemSchedulesView::SetTokens(void) {
+ if (!itemInit)
+ return;
+ itemInit = false;
+ intTokens.insert(pair<string,int>("current", current));
+ intTokens.insert(pair<string,int>("separator", !selectable));
+ intTokens.insert(pair<string,int>("nummenuitem", num+1));
+ intTokens.insert(pair<string,int>("whatson", (cat == mcSchedule)&&(!isEpgSearchFav) ? true: false));
+ intTokens.insert(pair<string,int>("whatsonnow", (cat == mcScheduleNow) ? true: false));
+ intTokens.insert(pair<string,int>("whatsonnext", (cat == mcScheduleNext) ? true: false));
+ intTokens.insert(pair<string,int>("whatsonfavorites", isEpgSearchFav ? true: false));
+ if (timerMatch == tmFull) {
+ intTokens.insert(pair<string,int>("timerpartitial", false));
+ intTokens.insert(pair<string,int>("timerfull", true));
+ } else if (timerMatch == tmPartial) {
+ intTokens.insert(pair<string,int>("timerpartitial", true));
+ intTokens.insert(pair<string,int>("timerfull", false));
+ } else {
+ intTokens.insert(pair<string,int>("timerpartitial", false));
+ intTokens.insert(pair<string,int>("timerfull", false));
+ }
+
+ if (event) {
+ if (selectable) {
+ stringTokens.insert(pair<string,string>("title", event->Title() ? event->Title() : ""));
+ stringTokens.insert(pair<string,string>("shorttext", event->ShortText() ? event->ShortText() : ""));
+ stringTokens.insert(pair<string,string>("start", *(event->GetTimeString())));
+ stringTokens.insert(pair<string,string>("stop", *(event->GetEndTimeString())));
+ time_t startTime = event->StartTime();
+ stringTokens.insert(pair<string,string>("day", *WeekDayName(startTime)));
+ stringTokens.insert(pair<string,string>("date", *ShortDateString(startTime)));
+ struct tm * sStartTime = localtime(&startTime);
+ intTokens.insert(pair<string, int>("year", sStartTime->tm_year + 1900));
+ intTokens.insert(pair<string, int>("daynumeric", sStartTime->tm_mday));
+ intTokens.insert(pair<string, int>("month", sStartTime->tm_mon+1));
+
+ bool isRunning = false;
+ time_t now = time(NULL);
+ if ((now >= event->StartTime()) && (now <= event->EndTime()))
+ isRunning = true;
+ intTokens.insert(pair<string,int>("running", isRunning));
+ if (isRunning) {
+ intTokens.insert(pair<string,int>("elapsed", (now - event->StartTime())/60));
+ } else {
+ intTokens.insert(pair<string,int>("elapsed", 0));
+ }
+ intTokens.insert(pair<string,int>("duration", event->Duration() / 60));
+ intTokens.insert(pair<string,int>("durationhours", event->Duration() / 3600));
+ stringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", (event->Duration() / 60)%60)));
+ intTokens.insert(pair<string,int>("hasVPS", (bool)event->Vps()));
+ } else {
+ stringTokens.insert(pair<string,string>("title", event->Title() ? ParseSeparator(event->Title()) : ""));
+ }
+ }
+ if (channel) {
+ stringTokens.insert(pair<string,string>("channelname", channel->Name() ? channel->Name() : ""));
+ string channelID = *(channel->GetChannelID().ToString());
+ stringTokens.insert(pair<string,string>("channelid", channelID));
+ intTokens.insert(pair<string, int>("channelnumber", channel->Number()));
+ intTokens.insert(pair<string, int>("channellogoexists", imgCache->LogoExists(channelID)));
+ if (!event && !selectable) {
+ stringTokens.insert(pair<string,string>("title", channel->Name() ? ParseSeparator(channel->Name()) : ""));
+ }
+ } else {
+ stringTokens.insert(pair<string,string>("channelname", ""));
+ stringTokens.insert(pair<string,string>("channelid", ""));
+ intTokens.insert(pair<string, int>("channelnumber", 0));
+ intTokens.insert(pair<string, int>("channellogoexists", 0));
+ }
+}
+
+
+void cDisplayMenuItemSchedulesView::Prepare(void) {
+ ArrangeContainer();
+}
+
+void cDisplayMenuItemSchedulesView::Render(void) {
+
+ DrawListItem(&stringTokens, &intTokens);
+
+ if (current) {
+ cTemplateViewElement *tmplCurrent = tmplList->GetListElementCurrent();
+ if (tmplCurrent) {
+ currentView = new cDisplayMenuItemCurrentSchedulesView(tmplCurrent, event, channel, timerMatch, cat, isEpgSearchFav);
+ currentView->Start();
+ }
+ }
+
+ dirty = false;
+}
+
+void cDisplayMenuItemSchedulesView::Debug(void) {
+ esyslog("skindesigner: Schedules Menu Item ---------------");
+ cDisplayMenuItemView::Debug();
+ esyslog("skindesigner: Event: %s", event ? event->Title() : "Event is NULL");
+}
+
+/*************************************************************
+* Private Functions
+*************************************************************/
+
+string cDisplayMenuItemSchedulesView::ParseSeparator(string sep) {
+ string separator = sep;
+ try {
+ if (separator.find_first_not_of("-") > 0)
+ separator.erase(0, separator.find_first_not_of("-")+1);
+ if (separator.find_last_not_of("-") != string::npos)
+ separator.erase(separator.find_last_not_of("-")+1);
+ } catch (...) {}
+ return separator;
+}
+
+/*************************************************************
+* cDisplayMenuItemChannelsView
+*************************************************************/
+
+cDisplayMenuItemChannelsView::cDisplayMenuItemChannelsView(cTemplateViewList *tmplList, const cChannel *channel,
+ bool withProvider, bool current, bool selectable)
+ : cDisplayMenuItemView(tmplList, current, selectable) {
+ this->channel = channel;
+ this->withProvider = withProvider;
+}
+
+cDisplayMenuItemChannelsView::~cDisplayMenuItemChannelsView() {
+}
+
+void cDisplayMenuItemChannelsView::SetTokens(void) {
+ if (!itemInit)
+ return;
+ itemInit = false;
+ if (!channel)
+ return;
+ //general channel information
+ intTokens.insert(pair<string,int>("current", current));
+ intTokens.insert(pair<string,int>("separator", !selectable));
+ intTokens.insert(pair<string,int>("nummenuitem", num+1));
+ intTokens.insert(pair<string,int>("number", channel->Number()));
+ intTokens.insert(pair<string,int>("transponder", channel->Transponder()));
+ intTokens.insert(pair<string,int>("frequency", channel->Frequency()));
+
+ stringTokens.insert(pair<string,string>("name", channel->Name() ? channel->Name() : ""));
+ string channelID = *(channel->GetChannelID().ToString());
+ stringTokens.insert(pair<string,string>("channelid", channelID));
+ intTokens.insert(pair<string, int>("channellogoexists", imgCache->LogoExists(channelID)));
+
+ //Channel Source Information
+ const cSource *source = Sources.Get(channel->Source());
+ if (source) {
+ stringTokens.insert(pair<string,string>("source", *cSource::ToString(source->Code())));
+ stringTokens.insert(pair<string,string>("sourcedescription", source->Description() ? source->Description() : ""));
+ stringTokens.insert(pair<string,string>("source", *cSource::ToString(source->Code())));
+ intTokens.insert(pair<string,int>("isAtsc", source->IsAtsc(source->Code())));
+ intTokens.insert(pair<string,int>("isCable", source->IsCable(source->Code())));
+ intTokens.insert(pair<string,int>("isSat", source->IsSat(source->Code())));
+ intTokens.insert(pair<string,int>("isTerr", source->IsTerr(source->Code())));
+ }
+
+ //current schedule
+ cSchedulesLock schedulesLock;
+ const cSchedules *schedules = cSchedules::Schedules(schedulesLock);
+ const cSchedule *schedule = NULL;
+ schedule = schedules->GetSchedule(channel);
+ bool inserted = false;
+ if (schedule) {
+ const cEvent *presentEvent = schedule->GetPresentEvent();
+ if (presentEvent) {
+ stringTokens.insert(pair<string,string>("presenteventtitle", presentEvent->Title() ? presentEvent->Title() : ""));
+ stringTokens.insert(pair<string,string>("presenteventstart", *presentEvent->GetTimeString()));
+ stringTokens.insert(pair<string,string>("presenteventstop", *presentEvent->GetEndTimeString()));
+ inserted = true;
+ }
+ }
+ if (!inserted) {
+ stringTokens.insert(pair<string,string>("presenteventtitle", ""));
+ stringTokens.insert(pair<string,string>("presenteventstart", ""));
+ stringTokens.insert(pair<string,string>("presenteventstop", ""));
+ }
+}
+
+
+void cDisplayMenuItemChannelsView::Prepare(void) {
+ ArrangeContainer();
+}
+
+void cDisplayMenuItemChannelsView::Render(void) {
+
+ DrawListItem(&stringTokens, &intTokens);
+
+ if (current) {
+ cTemplateViewElement *tmplCurrent = tmplList->GetListElementCurrent();
+ if (tmplCurrent) {
+ currentView = new cDisplayMenuItemCurrentChannelView(tmplCurrent, channel);
+ currentView->Start();
+ }
+ }
+
+ dirty = false;
+}
+
+void cDisplayMenuItemChannelsView::Debug(void) {
+ esyslog("skindesigner: Channels Menu Item ---------------");
+ cDisplayMenuItemView::Debug();
+ esyslog("skindesigner: Channel: %s", channel ? channel->Name() : "Channel is NULL");
+}
+
+/*************************************************************
+* Private Functions
+*************************************************************/
+
+/*************************************************************
+* cDisplayMenuItemTimersView
+*************************************************************/
+
+cDisplayMenuItemTimersView::cDisplayMenuItemTimersView(cTemplateViewList *tmplList, const cTimer *timer, bool current, bool selectable)
+ : cDisplayMenuItemView(tmplList, current, selectable) {
+ this->timer = timer;
+}
+
+cDisplayMenuItemTimersView::~cDisplayMenuItemTimersView() {
+}
+
+void cDisplayMenuItemTimersView::SetTokens(void) {
+ if (!timer)
+ return;
+ if (!itemInit) {
+ intTokens.erase("flagactive");
+ intTokens.insert(pair<string,int>("flagactive", timer->HasFlags(tfActive)));
+ return;
+ }
+ itemInit = false;
+
+ intTokens.insert(pair<string,int>("current", current));
+ intTokens.insert(pair<string,int>("nummenuitem", num+1));
+ intTokens.insert(pair<string,int>("flagactive", timer->HasFlags(tfActive)));
+ intTokens.insert(pair<string,int>("flaginstant", timer->HasFlags(tfInstant)));
+ intTokens.insert(pair<string,int>("flagvps", timer->HasFlags(tfVps)));
+ intTokens.insert(pair<string,int>("flagrecording", timer->Recording()));
+ intTokens.insert(pair<string,int>("flagpending", timer->Pending()));
+
+
+ const char *file = Setup.FoldersInTimerMenu ? NULL : strrchr(timer->File(), FOLDERDELIMCHAR);
+ if (file && strcmp(file + 1, TIMERMACRO_TITLE) && strcmp(file + 1, TIMERMACRO_EPISODE))
+ file++;
+ else
+ file = timer->File();
+ stringTokens.insert(pair<string,string>("title", file));
+ stringTokens.insert(pair<string,string>("timerstart", *cString::sprintf("%02d:%02d", timer->Start() / 100, timer->Start() % 100)));
+ stringTokens.insert(pair<string,string>("timerstop", *cString::sprintf("%02d:%02d", timer->Stop() / 100, timer->Stop() % 100)));
+
+ string day = "";
+ string dayName = "";
+ if (timer->WeekDays())
+ day = timer->PrintDay(0, timer->WeekDays(), false);
+ else if (timer->Day() - time(NULL) < 28 * SECSINDAY) {
+ day = itoa(timer->GetMDay(timer->Day()));
+ dayName = WeekDayName(timer->Day());
+ } else {
+ struct tm tm_r;
+ time_t Day = timer->Day();
+ localtime_r(&Day, &tm_r);
+ char buffer[16];
+ strftime(buffer, sizeof(buffer), "%Y%m%d", &tm_r);
+ day = buffer;
+ }
+
+ struct tm tm_r;
+ time_t timerDate = timer->Day();
+ localtime_r(&timerDate, &tm_r);
+ char buffer[4];
+ strftime(buffer, sizeof(buffer), "%m", &tm_r);
+ int month = atoi(buffer);
+ char buffer2[6];
+ strftime(buffer2, sizeof(buffer2), "%b", &tm_r);
+ string monthName = buffer2;
+ char buffer3[6];
+ strftime(buffer3, sizeof(buffer3), "%Y", &tm_r);
+ int year = atoi(buffer3);
+
+ stringTokens.insert(pair<string,string>("day", day));
+ stringTokens.insert(pair<string,string>("dayname", dayName));
+ intTokens.insert(pair<string,int>("month", month));
+ stringTokens.insert(pair<string,string>("monthname", monthName));
+ intTokens.insert(pair<string,int>("year", year));
+
+ const cChannel *channel = timer->Channel();
+ if (channel) {
+ stringTokens.insert(pair<string,string>("channelname", channel->Name() ? channel->Name() : ""));
+ string channelID = *(channel->GetChannelID().ToString());
+ stringTokens.insert(pair<string,string>("channelid", channelID));
+ intTokens.insert(pair<string, int>("channellogoexists", imgCache->LogoExists(channelID)));
+ intTokens.insert(pair<string,int>("channelnumber", channel->Number()));
+ } else {
+ stringTokens.insert(pair<string,string>("channelname", ""));
+ stringTokens.insert(pair<string,string>("channelid", ""));
+ intTokens.insert(pair<string, int>("channellogoexists", 0));
+ intTokens.insert(pair<string,int>("channelnumber", 0));
+ }
+
+ const cEvent *event = timer->Event();
+ if (event) {
+ stringTokens.insert(pair<string,string>("eventtitle", event->Title() ? event->Title() : ""));
+ stringTokens.insert(pair<string,string>("eventstart", *event->GetTimeString()));
+ stringTokens.insert(pair<string,string>("eventstop", *event->GetEndTimeString()));
+ } else {
+ stringTokens.insert(pair<string,string>("eventtitle", ""));
+ stringTokens.insert(pair<string,string>("eventtitle", ""));
+ stringTokens.insert(pair<string,string>("eventstop", ""));
+ }
+}
+
+
+void cDisplayMenuItemTimersView::Prepare(void) {
+ ArrangeContainer();
+}
+
+void cDisplayMenuItemTimersView::Render(void) {
+
+ DrawListItem(&stringTokens, &intTokens);
+
+ if (current) {
+ cTemplateViewElement *tmplCurrent = tmplList->GetListElementCurrent();
+ if (tmplCurrent) {
+ currentView = new cDisplayMenuItemCurrentTimerView(tmplCurrent, timer);
+ currentView->Start();
+ }
+ }
+
+ dirty = false;
+}
+
+void cDisplayMenuItemTimersView::Debug(void) {
+ esyslog("skindesigner: Timers Menu Item ---------------");
+ cDisplayMenuItemView::Debug();
+ esyslog("skindesigner: Timer: %s", timer ? *(timer->ToDescr()) : "Timer is NULL");
+}
+
+/*************************************************************
+* Private Functions
+*************************************************************/
+
+
+/*************************************************************
+* cDisplayMenuItemRecordingView
+*************************************************************/
+
+cDisplayMenuItemRecordingView::cDisplayMenuItemRecordingView(cTemplateViewList *tmplList, const cRecording *recording, int level, int total, int newRecs, bool current, bool selectable)
+ : cDisplayMenuItemView(tmplList, current, selectable) {
+ this->recording = recording;
+ this->level = level;
+ this->total = total;
+ this->newRecs = newRecs;
+}
+
+cDisplayMenuItemRecordingView::~cDisplayMenuItemRecordingView() {
+}
+
+void cDisplayMenuItemRecordingView::SetTokens(void) {
+ if (!itemInit) return;
+ itemInit = false;
+ if (!recording) return;
+
+ intTokens.insert(pair<string,int>("current", current));
+ intTokens.insert(pair<string,int>("nummenuitem", num+1));
+ bool isFolder = (total > 0) ? true : false;
+ intTokens.insert(pair<string,int>("folder", isFolder));
+
+ string name = recording->Name() ? recording->Name() : "";
+ string buffer = "";
+ stringstream folderName;
+ try {
+ vector<string> tokens;
+ istringstream f(name.c_str());
+ string s;
+ int i=0;
+ while (getline(f, s, FOLDERDELIMCHAR)) {
+ tokens.push_back(s);
+ if (isFolder && i <= level) {
+ if (i > 0)
+ folderName << FOLDERDELIMCHAR;
+ folderName << s;
+ i++;
+ }
+ }
+ buffer = tokens.at(level);
+ if (!isFolder && recording->IsEdited()) {
+ buffer = buffer.substr(1);
+ }
+ } catch (...) {
+ buffer = name.c_str();
+ }
+
+ const cRecording *usedRecording = recording;
+
+ if (isFolder) {
+ cRecordingsFolderInfo::cFolderInfo *folderInfo = recFolderInfo.Get(folderName.str().c_str());
+ if (folderInfo) {
+ cRecording *newestRec = Recordings.GetByName(*folderInfo->LatestFileName);
+ if (newestRec) {
+ usedRecording = newestRec;
+ }
+ delete folderInfo;
+ }
+ }
+
+ stringTokens.insert(pair<string,string>("name", buffer.c_str()));
+ intTokens.insert(pair<string,int>("new", usedRecording->IsNew()));
+ intTokens.insert(pair<string,int>("newrecordingsfolder", newRecs));
+ intTokens.insert(pair<string,int>("numrecordingsfolder", total));
+ intTokens.insert(pair<string,int>("cutted", usedRecording->IsEdited()));
+
+ const cEvent *event = NULL;
+ const cRecordingInfo *info = usedRecording->Info();
+ if (!info) return;
+ event = info->GetEvent();
+ if (!event) return;
+
+
+ string recDate = *(event->GetDateString());
+ string recTime = *(event->GetTimeString());
+ if (recDate.find("1970") != string::npos) {
+ time_t start = usedRecording->Start();
+ recDate = *DateString(start);
+ recTime = *TimeString(start);
+ }
+
+ time_t startTime = event->StartTime();
+ struct tm * sStartTime = localtime(&startTime);
+ intTokens.insert(pair<string, int>("year", sStartTime->tm_year + 1900));
+ intTokens.insert(pair<string, int>("daynumeric", sStartTime->tm_mday));
+ intTokens.insert(pair<string, int>("month", sStartTime->tm_mon+1));
+
+ int duration = event->Duration() / 60;
+ int recDuration = usedRecording->LengthInSeconds();
+ recDuration = (recDuration>0)?(recDuration / 60):0;
+ stringTokens.insert(pair<string,string>("date", recDate.c_str()));
+ stringTokens.insert(pair<string,string>("time", recTime.c_str()));
+ intTokens.insert(pair<string,int>("duration", recDuration));
+ intTokens.insert(pair<string,int>("durationhours", recDuration / 60));
+ stringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", recDuration%60)));
+ intTokens.insert(pair<string,int>("durationevent", duration));
+ intTokens.insert(pair<string,int>("durationeventhours", duration / 60));
+ stringTokens.insert(pair<string,string>("durationeventminutes", *cString::sprintf("%.2d", duration%60)));
+
+ static cPlugin *pScraper = GetScraperPlugin();
+ if (!pScraper || !usedRecording) {
+ intTokens.insert(pair<string,int>("hasposterthumbnail", false));
+ intTokens.insert(pair<string,int>("thumbnailbwidth", -1));
+ intTokens.insert(pair<string,int>("thumbnailheight", -1));
+ stringTokens.insert(pair<string,string>("thumbnailpath", ""));
+ return;
+ }
+
+ ScraperGetPosterThumb call;
+ call.event = NULL;
+ call.recording = usedRecording;
+ if (pScraper->Service("GetPosterThumb", &call)) {
+ intTokens.insert(pair<string,int>("hasposterthumbnail", FileExists(call.poster.path)));
+ intTokens.insert(pair<string,int>("thumbnailbwidth", call.poster.width));
+ intTokens.insert(pair<string,int>("thumbnailheight", call.poster.height));
+ stringTokens.insert(pair<string,string>("thumbnailpath", call.poster.path));
+ } else {
+ intTokens.insert(pair<string,int>("hasposterthumbnail", false));
+ intTokens.insert(pair<string,int>("thumbnailbwidth", -1));
+ intTokens.insert(pair<string,int>("thumbnailheight", -1));
+ stringTokens.insert(pair<string,string>("thumbnailpath", ""));
+ }
+}
+
+
+void cDisplayMenuItemRecordingView::Prepare(void) {
+ ArrangeContainer();
+}
+
+void cDisplayMenuItemRecordingView::Render(void) {
+
+ DrawListItem(&stringTokens, &intTokens);
+
+ if (current) {
+ cTemplateViewElement *tmplCurrent = tmplList->GetListElementCurrent();
+ if (tmplCurrent) {
+ currentView = new cDisplayMenuItemCurrentRecordingView(tmplCurrent, recording, level, total, newRecs);
+ currentView->Start();
+ }
+ }
+
+ dirty = false;
+}
+
+void cDisplayMenuItemRecordingView::Debug(void) {
+ esyslog("skindesigner: Recording Menu Item ---------------");
+ cDisplayMenuItemView::Debug();
+ esyslog("skindesigner: Recording: %s", recording ? recording->Title() : "Recording is NULL");
+}
+
+/*************************************************************
+* cDisplayMenuItemPluginView
+*************************************************************/
+
+cDisplayMenuItemPluginView::cDisplayMenuItemPluginView(cTemplateViewList *tmplList, map<string,string> *plugStringTokens, map<string,int> *plugIntTokens,
+ map<string,vector<map<string,string> > > *pluginLoopTokens, int index, bool current, bool selectable)
+ : cDisplayMenuItemView(tmplList, current, selectable) {
+
+ for (map<string,string>::iterator it = plugStringTokens->begin(); it != plugStringTokens->end(); it++) {
+ stringTokens.insert(pair<string,string>(it->first, it->second));
+ }
+
+ for (map<string,int>::iterator it = plugIntTokens->begin(); it != plugIntTokens->end(); it++) {
+ intTokens.insert(pair<string,int>(it->first, it->second));
+ }
+
+ for(map<string,vector<map<string,string> > >::iterator it = pluginLoopTokens->begin(); it != pluginLoopTokens->end(); it++) {
+ loopTokens.insert(pair<string,vector<map<string,string> > >(it->first, it->second));
+ }
+}
+
+cDisplayMenuItemPluginView::~cDisplayMenuItemPluginView() {
+}
+
+void cDisplayMenuItemPluginView::SetTokens(void) {
+ if (!itemInit) return;
+ itemInit = false;
+ intTokens.insert(pair<string,int>("current", current));
+ intTokens.insert(pair<string,int>("nummenuitem", num+1));
+}
+
+
+void cDisplayMenuItemPluginView::Prepare(void) {
+ ArrangeContainer();
+}
+
+void cDisplayMenuItemPluginView::Render(void) {
+
+ DrawListItem(&stringTokens, &intTokens);
+
+ if (current) {
+ cTemplateViewElement *tmplCurrent = tmplList->GetListElementCurrent();
+ if (tmplCurrent) {
+ currentView = new cDisplayMenuItemCurrentPluginView(tmplCurrent, stringTokens, intTokens, loopTokens);
+ currentView->Start();
+ }
+ }
+
+ dirty = false;
+}
+
+void cDisplayMenuItemPluginView::Debug(void) {
+ esyslog("skindesigner: Plugin Menu Item ---------------");
+ cDisplayMenuItemView::Debug();
+}
+
+/*************************************************************
+* cDisplayMenuItemTrackView
+*************************************************************/
+
+cDisplayMenuItemTrackView::cDisplayMenuItemTrackView(cTemplateViewList *tmplList, const char *title, bool current, bool selectable, int numTracks)
+ : cDisplayMenuItemView(tmplList, current, selectable) {
+ this->title = title;
+ this->numTracks = numTracks;
+}
+
+cDisplayMenuItemTrackView::~cDisplayMenuItemTrackView() {
+}
+
+void cDisplayMenuItemTrackView::SetTokens(void) {
+ if (!itemInit) return;
+ itemInit = false;
+ if (!title) return;
+
+ stringTokens.insert(pair<string,string>("title", title));
+}
+
+
+void cDisplayMenuItemTrackView::Prepare(void) {
+ ArrangeContainer();
+}
+
+void cDisplayMenuItemTrackView::Render(void) {
+
+ DrawListItem(&stringTokens, &intTokens);
+
+ dirty = false;
+}
+
+void cDisplayMenuItemTrackView::Debug(void) {
+ esyslog("skindesigner: Tracks Menu Item ---------------");
+ cDisplayMenuItemView::Debug();
+ esyslog("skindesigner: Title: %s", title);
+}
+
diff --git a/views/displaymenuitemview.h b/views/displaymenuitemview.h
new file mode 100644
index 0000000..e9cfd5f
--- /dev/null
+++ b/views/displaymenuitemview.h
@@ -0,0 +1,154 @@
+#ifndef __DISPLAYMENUITEMVIEW_H
+#define __DISPLAYMENUITEMVIEW_H
+
+#include "../libtemplate/template.h"
+#include "view.h"
+#include "displaymenuitemcurrentview.h"
+
+class cDisplayMenuItemView : public cViewListItem {
+private:
+protected:
+ bool itemInit;
+ bool dirty;
+ bool current;
+ bool selectable;
+ int num;
+ cTemplateViewList *tmplList;
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ cDisplayMenuItemCurrentView *currentView;
+ virtual void Action(void);
+public:
+ cDisplayMenuItemView(cTemplateViewList *tmplList, bool current, bool selectable);
+ virtual ~cDisplayMenuItemView();
+ void SetCurrent(bool cur);
+ void SetNumber(int n) { num = n; };
+ void ArrangeContainer(void);
+ bool Current(void) { return current; };
+ void PrepareScrolling(void);
+ void EndScrolling(void);
+ virtual void SetTokens(void) {};
+ virtual void Prepare(void) {};
+ virtual void Render(void) {};
+ virtual void Clear(void);
+ bool Dirty(void) { return dirty; };
+ void Stop(void);
+ virtual void Debug(void);
+};
+
+class cDisplayMenuItemDefaultView: public cDisplayMenuItemView {
+private:
+ int *tabs;
+ int *tabWidths;
+ string *tabTexts;
+ int maxTabs;
+public:
+ cDisplayMenuItemDefaultView(cTemplateViewList *tmplList, string *tabTexts, int *tabs, int *tabWidths, bool current, bool selectable);
+ virtual ~cDisplayMenuItemDefaultView();
+ void SetTabTexts(string *tabTexts);
+ void SetTokens(void);
+ void Prepare(void);
+ void Render(void);
+ void Debug(void);
+};
+
+class cDisplayMenuItemMainView: public cDisplayMenuItemView {
+private:
+ string text;
+ string number;
+ string label;
+ string icon;
+ void SplitMenuText(void);
+public:
+ cDisplayMenuItemMainView(cTemplateViewList *tmplList, string itemText, bool current, bool selectable);
+ virtual ~cDisplayMenuItemMainView();
+ void SetTokens(void);
+ void Prepare(void);
+ void Render(void);
+ void Debug(void);
+};
+
+class cDisplayMenuItemSchedulesView: public cDisplayMenuItemView {
+private:
+ const cEvent *event;
+ const cChannel *channel;
+ eTimerMatch timerMatch;
+ eMenuCategory cat;
+ bool isEpgSearchFav;
+ string ParseSeparator(string sep);
+public:
+ cDisplayMenuItemSchedulesView(cTemplateViewList *tmplList, const cEvent *event, const cChannel *channel, eTimerMatch timerMatch,
+ eMenuCategory cat, bool isEpgSearchFav, bool current, bool selectable);
+ virtual ~cDisplayMenuItemSchedulesView();
+ void SetTokens(void);
+ void Prepare(void);
+ void Render(void);
+ void Debug(void);
+};
+
+class cDisplayMenuItemChannelsView: public cDisplayMenuItemView {
+private:
+ const cChannel *channel;
+ bool withProvider;
+public:
+ cDisplayMenuItemChannelsView(cTemplateViewList *tmplList, const cChannel *channel, bool withProvider, bool current, bool selectable);
+ virtual ~cDisplayMenuItemChannelsView();
+ void SetTokens(void);
+ void Prepare(void);
+ void Render(void);
+ void Debug(void);
+};
+
+class cDisplayMenuItemTimersView: public cDisplayMenuItemView {
+private:
+ const cTimer *timer;
+public:
+ cDisplayMenuItemTimersView(cTemplateViewList *tmplList, const cTimer *timer, bool current, bool selectable);
+ virtual ~cDisplayMenuItemTimersView();
+ void SetTokens(void);
+ void Prepare(void);
+ void Render(void);
+ void Debug(void);
+};
+
+class cDisplayMenuItemRecordingView: public cDisplayMenuItemView {
+private:
+ const cRecording *recording;
+ int level;
+ int total;
+ int newRecs;
+public:
+ cDisplayMenuItemRecordingView(cTemplateViewList *tmplList, const cRecording *recording, int level, int total, int newRecs, bool current, bool selectable);
+ virtual ~cDisplayMenuItemRecordingView();
+ void SetTokens(void);
+ void Prepare(void);
+ void Render(void);
+ void Debug(void);
+};
+
+class cDisplayMenuItemPluginView: public cDisplayMenuItemView {
+private:
+ map<string,vector<map<string,string> > > loopTokens;
+public:
+ cDisplayMenuItemPluginView(cTemplateViewList *tmplList, map<string,string> *plugStringTokens, map<string,int> *plugIntTokens, map<string,vector<map<string,string> > > *pluginLoopTokens, int index, bool current, bool selectable);
+ virtual ~cDisplayMenuItemPluginView();
+ void SetTokens(void);
+ void Prepare(void);
+ void Render(void);
+ void Debug(void);
+};
+
+class cDisplayMenuItemTrackView: public cDisplayMenuItemView {
+private:
+ const char *title;
+ int numTracks;
+public:
+ cDisplayMenuItemTrackView(cTemplateViewList *tmplList, const char *title, bool current, bool selectable, int numTracks);
+ virtual ~cDisplayMenuItemTrackView();
+ void SetTokens(void);
+ void Prepare(void);
+ void Render(void);
+ void Debug(void);
+};
+
+#endif //__DISPLAYMENUITEMVIEW_H
diff --git a/views/displaymenulistview.c b/views/displaymenulistview.c
new file mode 100644
index 0000000..3a51b82
--- /dev/null
+++ b/views/displaymenulistview.c
@@ -0,0 +1,243 @@
+#include <vdr/menu.h>
+#include "displaymenulistview.h"
+
+
+cDisplayMenuListView::cDisplayMenuListView(cTemplateViewList *tmplList, int count) {
+ oneColumn = true;
+ this->tmplList = tmplList;
+ if (count < 0) {
+ //if count is not set, the fixed number of items is configured in the template
+ itemCount = tmplList->GetNumericParameter(ptNumElements);
+ } else {
+ //else use the actual numbers of elements
+ itemCount = count;
+ map < string, int > intTokens;
+ intTokens.insert(pair<string,int>("numelements", count));
+ tmplList->CalculateListParameters(&intTokens);
+ }
+ menuItems = new cDisplayMenuItemView*[itemCount];
+ for (int i=0; i<itemCount; i++)
+ menuItems[i] = NULL;
+ tabs = new int[cSkinDisplayMenu::MaxTabs];
+ for (int i=0; i<cSkinDisplayMenu::MaxTabs; i++)
+ tabs[i] = 0;
+ tabWidths = new int[cSkinDisplayMenu::MaxTabs];
+ for (int i=0; i<cSkinDisplayMenu::MaxTabs; i++)
+ tabWidths[i] = 0;
+}
+
+cDisplayMenuListView::~cDisplayMenuListView() {
+ Clear();
+ delete[] menuItems;
+ delete[] tabs;
+ delete[] tabWidths;
+}
+
+void cDisplayMenuListView::SetTabs(int tab1, int tab2, int tab3, int tab4, int tab5) {
+
+ int menuItemWidth = 1920;
+ int averageFontWidth = 20;
+ if (tmplList) {
+ menuItemWidth = tmplList->GetMenuItemWidth();
+ averageFontWidth = tmplList->GetAverageFontWidth();
+ }
+
+ if (!tab1) {
+ tabs[0] = 0;
+ tabWidths[0] = menuItemWidth;
+ } else {
+ tabs[0] = 0;
+ if (!tab2) {
+ tabs[1] = menuItemWidth/2;
+ tabWidths[0] = tabs[1];
+ tabWidths[1] = tabs[1];
+ } else {
+ tabs[0] = 0;
+ tabs[1] = tab1 ? tabs[0] + tab1 : 0;
+ tabs[2] = tab2 ? tabs[1] + tab2 : 0;
+ tabs[3] = tab3 ? tabs[2] + tab3 : 0;
+ tabs[4] = tab4 ? tabs[3] + tab4 : 0;
+ tabs[5] = tab5 ? tabs[4] + tab5 : 0;
+ for (int i = 1; i < cSkinDisplayMenu::MaxTabs; i++)
+ tabs[i] *= averageFontWidth;
+
+ for (int i = 0; i < cSkinDisplayMenu::MaxTabs; i++) {
+ if (i == cSkinDisplayMenu::MaxTabs - 1) {
+ tabWidths[i] = menuItemWidth - tabs[i];
+ } else {
+ tabWidths[i] = tabs[i+1] - tabs[i];
+ }
+ }
+ }
+ }
+}
+
+int cDisplayMenuListView::GetListWidth(void) {
+ if (tmplList) {
+ return tmplList->GetMenuItemWidth();
+ }
+ return 1920;
+}
+
+
+void cDisplayMenuListView::Clear(void) {
+ for (int i=0; i<itemCount; i++) {
+ if (menuItems[i]) {
+ delete menuItems[i];
+ menuItems[i] = NULL;
+ }
+ }
+ oneColumn = true;
+ for (int i=0; i<cSkinDisplayMenu::MaxTabs; i++) {
+ tabs[i] = 0;
+ tabWidths[i] = 0;
+ }
+}
+
+void cDisplayMenuListView::AddDefaultMenuItem(int index, string *tabTexts, bool current, bool selectable) {
+ if (index >= itemCount)
+ return;
+ if (menuItems[index]) {
+ cDisplayMenuItemDefaultView *menuItem = dynamic_cast<cDisplayMenuItemDefaultView*>(menuItems[index]);
+ if (!menuItem)
+ return;
+ menuItem->SetCurrent(current);
+ menuItem->SetTabTexts(tabTexts);
+ return;
+ }
+ for (int i=1; i<cSkinDisplayMenu::MaxTabs; i++) {
+ if (tabTexts[i].size() > 0) {
+ oneColumn = false;
+ break;
+ }
+ }
+ cDisplayMenuItemView *item = new cDisplayMenuItemDefaultView(tmplList, tabTexts, tabs, tabWidths, current, selectable);
+ menuItems[index] = item;
+}
+
+void cDisplayMenuListView::AddMainMenuItem(int index, const char *itemText, bool current, bool selectable) {
+ if (index >= itemCount)
+ return;
+ if (menuItems[index]) {
+ menuItems[index]->SetCurrent(current);
+ return;
+ }
+ cDisplayMenuItemView *item = new cDisplayMenuItemMainView(tmplList, itemText, current, selectable);
+ menuItems[index] = item;
+}
+
+void cDisplayMenuListView::AddSetupMenuItem(int index, const char *itemText, bool current, bool selectable) {
+ if (index >= itemCount)
+ return;
+ if (menuItems[index]) {
+ menuItems[index]->SetCurrent(current);
+ return;
+ }
+ cDisplayMenuItemView *item = new cDisplayMenuItemMainView(tmplList, itemText, current, selectable);
+ menuItems[index] = item;
+}
+
+void cDisplayMenuListView::AddSchedulesMenuItem(int index, const cEvent *event, const cChannel *channel, eTimerMatch timerMatch,
+ eMenuCategory cat, bool isEpgSearchFav, bool current, bool selectable) {
+ if (index >= itemCount)
+ return;
+ if (menuItems[index]) {
+ menuItems[index]->SetCurrent(current);
+ return;
+ }
+ cDisplayMenuItemView *item = new cDisplayMenuItemSchedulesView(tmplList, event, channel, timerMatch, cat, isEpgSearchFav, current, selectable);
+ menuItems[index] = item;
+}
+
+void cDisplayMenuListView::AddChannelsMenuItem(int index, const cChannel *channel, bool withProvider, bool current, bool selectable) {
+ if (index >= itemCount)
+ return;
+ if (menuItems[index]) {
+ menuItems[index]->SetCurrent(current);
+ return;
+ }
+ cDisplayMenuItemView *item = new cDisplayMenuItemChannelsView(tmplList, channel, withProvider, current, selectable);
+ menuItems[index] = item;
+}
+
+void cDisplayMenuListView::AddTimersMenuItem(int index, const cTimer *timer, bool current, bool selectable) {
+ if (index >= itemCount)
+ return;
+ if (menuItems[index]) {
+ menuItems[index]->SetCurrent(current);
+ return;
+ }
+ cDisplayMenuItemView *item = new cDisplayMenuItemTimersView(tmplList, timer, current, selectable);
+ menuItems[index] = item;
+}
+
+void cDisplayMenuListView::AddRecordingMenuItem(int index, const cRecording *recording, int level, int total, int isNew, bool current, bool selectable) {
+ if (index >= itemCount)
+ return;
+ if (menuItems[index]) {
+ menuItems[index]->SetCurrent(current);
+ return;
+ }
+ cDisplayMenuItemView *item = new cDisplayMenuItemRecordingView(tmplList, recording, level, total, isNew, current, selectable);
+ menuItems[index] = item;
+}
+
+void cDisplayMenuListView::AddPluginMenuItem(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens, int index, bool current, bool selectable) {
+ if (index >= itemCount)
+ return;
+ if (menuItems[index]) {
+ menuItems[index]->SetCurrent(current);
+ return;
+ }
+ cDisplayMenuItemView *item = new cDisplayMenuItemPluginView(tmplList, stringTokens, intTokens, loopTokens, index, current, selectable);
+ menuItems[index] = item;
+}
+
+void cDisplayMenuListView::AddTracksMenuItem(int index, const char *title, bool current, bool selectable) {
+ if (index >= itemCount)
+ return;
+ if (menuItems[index]) {
+ menuItems[index]->SetCurrent(current);
+ return;
+ }
+ cDisplayMenuItemView *item = new cDisplayMenuItemTrackView(tmplList, title, current, selectable, itemCount);
+ menuItems[index] = item;
+}
+
+void cDisplayMenuListView::Render(void) {
+ if (tabs[1] && oneColumn) {
+ tabs[0] = 0;
+ tabWidths[0] = tmplList->GetMenuItemWidth();
+ for (int i=1; i<cSkinDisplayMenu::MaxTabs; i++) {
+ tabs[i] = 0;
+ tabWidths[i] = 0;
+ }
+ }
+ int current = -1;
+ for (int i=0; i<itemCount; i++) {
+ if (menuItems[i] && menuItems[i]->Dirty()) {
+ menuItems[i]->Clear();
+ menuItems[i]->SetNumber(i);
+ menuItems[i]->Prepare();
+ menuItems[i]->SetTokens();
+ menuItems[i]->Render();
+ if (menuItems[i]->Current()) {
+ current = i;
+ } else {
+ menuItems[i]->Stop();
+ }
+ }
+ }
+ if (current > -1) {
+ menuItems[current]->Start();
+ }
+}
+
+void cDisplayMenuListView::Debug(void) {
+ for (int i=0; i<itemCount; i++) {
+ esyslog("skindesigner: item %d", i);
+ if (menuItems[i]) {
+ menuItems[i]->Debug();
+ }
+ }
+}
diff --git a/views/displaymenulistview.h b/views/displaymenulistview.h
new file mode 100644
index 0000000..a407020
--- /dev/null
+++ b/views/displaymenulistview.h
@@ -0,0 +1,36 @@
+#ifndef __DISPLAYMENULISTVIEW_H
+#define __DISPLAYMENULISTVIEW_H
+
+#include "../libtemplate/template.h"
+#include "view.h"
+#include "displaymenuitemview.h"
+
+class cDisplayMenuListView {
+private:
+ cTemplateViewList *tmplList;
+ int itemCount;
+ cDisplayMenuItemView **menuItems;
+ int *tabs;
+ int *tabWidths;
+ bool oneColumn;
+public:
+ cDisplayMenuListView(cTemplateViewList *tmplList, int count = -1);
+ virtual ~cDisplayMenuListView();
+ void Clear(void);
+ void SetTabs(int tab1, int tab2, int tab3, int tab4, int tab5);
+ int GetMaxItems(void) { return itemCount; };
+ int GetListWidth(void);
+ void AddDefaultMenuItem(int index, string *tabTexts, bool current, bool selectable);
+ void AddMainMenuItem(int index, const char *itemText, bool current, bool selectable);
+ void AddSetupMenuItem(int index, const char *itemText, bool current, bool selectable);
+ void AddSchedulesMenuItem(int index, const cEvent *event, const cChannel *channel, eTimerMatch timerMatch, eMenuCategory cat, bool isEpgSearchFav, bool current, bool selectable);
+ void AddChannelsMenuItem(int index, const cChannel *channel, bool withProvider, bool current, bool selectable);
+ void AddTimersMenuItem(int index, const cTimer *timer, bool current, bool selectable);
+ void AddRecordingMenuItem(int index, const cRecording *recording, int level, int total, int isNew, bool current, bool selectable);
+ void AddPluginMenuItem(map<string,string> *stringTokens, map<string,int> *intTokens, map<string, vector<map<string,string> > > *loopTokens, int index, bool current, bool selectable);
+ void AddTracksMenuItem(int index, const char *title, bool current, bool selectable);
+ void Render(void);
+ void Debug(void);
+};
+
+#endif //__DISPLAYMENULISTVIEW_H
diff --git a/views/displaymenurootview.c b/views/displaymenurootview.c
new file mode 100644
index 0000000..4caf2e5
--- /dev/null
+++ b/views/displaymenurootview.c
@@ -0,0 +1,627 @@
+#define __STL_CONFIG_H
+#include <vdr/menu.h>
+#include <vdr/videodir.h>
+#include "displaymenurootview.h"
+#include "../config.h"
+#include "../libcore/helpers.h"
+
+cDisplayMenuRootView::cDisplayMenuRootView(cTemplateView *rootView) : cView(rootView) {
+ cat = mcUndefined;
+ viewType = svUndefined;
+ subView = NULL;
+ subViewAvailable = false;
+ pluginName = "";
+ pluginMenu = -1;
+ pluginMenuType = mtUnknown;
+ pluginMenuChanged = false;
+ view = NULL;
+ listView = NULL;
+ detailView = NULL;
+ buttonTexts[0] = "";
+ buttonTexts[1] = "";
+ buttonTexts[2] = "";
+ buttonTexts[3] = "";
+ defaultBackgroundDrawn = false;
+ defaultHeaderDrawn = false;
+ defaultButtonsDrawn = false;
+ defaultDateTimeDrawn = false;
+ defaultMessageDrawn = false;
+ DeleteOsdOnExit();
+ SetFadeTime(tmplView->GetNumericParameter(ptFadeTime));
+}
+
+cDisplayMenuRootView::~cDisplayMenuRootView() {
+ if (view) {
+ delete view;
+ view = NULL;
+ }
+ if (listView) {
+ delete listView;
+ listView = NULL;
+ }
+ if (detailView) {
+ delete detailView;
+ detailView = NULL;
+ }
+}
+
+/*******************************************************************
+* Public Functions
+*******************************************************************/
+
+bool cDisplayMenuRootView::createOsd(void) {
+ cRect osdSize = tmplView->GetOsdSize();
+ bool ok = CreateOsd(cOsd::OsdLeft() + osdSize.X(),
+ cOsd::OsdTop() + osdSize.Y(),
+ osdSize.Width(),
+ osdSize.Height());
+ return ok;
+}
+
+/* Categories:
+-1 mcUndefined,
+0 mcUnknown,
+1 mcMain,
+2 mcSchedule,
+3 mcScheduleNow,
+4 mcScheduleNext,
+5 mcChannel,
+6 mcChannelEdit,
+7 mcTimer,
+8 mcTimerEdit,
+9 mcRecording,
+10 mcRecordingInfo,
+11 mcRecordingEdit,
+12 mcPlugin,
+13 mcPluginSetup,
+14 mcSetup,
+15 mcSetupOsd,
+16 mcSetupEpg,
+17 mcSetupDvb,
+18 mcSetupLnb,
+19 mcSetupCam,
+20 mcSetupRecord,
+21 mcSetupReplay,
+22 mcSetupMisc,
+23 mcSetupPlugins,
+24 mcCommand,
+25 mcEvent,
+26 mcText,
+27 mcFolder,
+28 mcCam
+*/
+
+void cDisplayMenuRootView::SetMenu(eMenuCategory menuCat, bool menuInit) {
+ eSubView newViewType = svUndefined;
+ cat = menuCat;
+ bool isListView = true;
+ if (menuCat != mcPlugin) {
+ pluginName = "";
+ pluginMenu = -1;
+ pluginMenuType = mtUnknown;
+ pluginMenuChanged = false;
+ }
+ switch (menuCat) {
+ case mcMain:
+ newViewType = svMenuMain;
+ break;
+ case mcSetup:
+ newViewType = svMenuSetup;
+ break;
+ case mcSchedule:
+ case mcScheduleNow:
+ case mcScheduleNext:
+ newViewType = svMenuSchedules;
+ if (view)
+ view->SetMenuCat(menuCat);
+ break;
+ case mcChannel:
+ newViewType = svMenuChannels;
+ break;
+ case mcTimer:
+ newViewType = svMenuTimers;
+ break;
+ case mcRecording:
+ newViewType = svMenuRecordings;
+ break;
+ case mcEvent:
+ newViewType = svMenuDetailedEpg;
+ isListView = false;
+ break;
+ case mcRecordingInfo:
+ newViewType = svMenuDetailedRecording;
+ isListView = false;
+ break;
+ case mcText:
+ newViewType = svMenuDetailedText;
+ isListView = false;
+ break;
+ case mcPlugin:
+ newViewType = svMenuPlugin;
+ isListView = ( pluginMenuType == mtList ) ? true : false;
+ break;
+ default:
+ newViewType = svMenuDefault;
+ break;
+ }
+ if (newViewType != viewType || pluginMenuChanged) {
+ if (newViewType == svMenuPlugin) {
+ subView = tmplView->GetPluginView(pluginName, pluginMenu);
+ if (!subView) {
+ subViewAvailable = false;
+ if (isListView)
+ subView = tmplView->GetSubView(svMenuDefault);
+ else
+ subView = tmplView->GetSubView(svMenuDetailedText);
+ } else {
+ subViewAvailable = true;
+ }
+ } else {
+ subView = tmplView->GetSubView(newViewType);
+ if (!subView) {
+ subViewAvailable = false;
+ subView = tmplView->GetSubView(svMenuDefault);
+ } else {
+ subViewAvailable = true;
+ }
+ }
+ //Cleanup
+ if (view) {
+ delete view;
+ view = NULL;
+ }
+ if (listView) {
+ delete listView;
+ listView = NULL;
+ }
+ if (detailView) {
+ delete detailView;
+ detailView = NULL;
+ }
+ //Create new View
+ switch (newViewType) {
+ case svMenuMain:
+ view = new cDisplayMenuMainView(subView, menuInit);
+ break;
+ case svMenuSchedules:
+ if (subViewAvailable)
+ view = new cDisplayMenuSchedulesView(subView, menuCat, menuInit);
+ else
+ view = new cDisplayMenuView(subView, menuInit);
+ break;
+ default:
+ view = new cDisplayMenuView(subView, menuInit);
+ }
+ view->SetMenuCat(cat);
+ view->SetButtonTexts(buttonTexts);
+ //Cleanup root view
+ ClearRootView();
+ if (isListView) {
+ //Create menu item list
+ cTemplateViewList *tmplMenuItems = subView->GetViewList(vlMenuItem);
+ if (!tmplMenuItems)
+ return;
+ listView = new cDisplayMenuListView(tmplMenuItems);
+ } else {
+ //Create detailed view
+ detailView = new cDisplayMenuDetailView(subView);
+ }
+ viewType = newViewType;
+ }
+}
+
+void cDisplayMenuRootView::CorrectDefaultMenu(void) {
+ if (viewType > svMenuDefault && viewType != svMenuPlugin) {
+ SetMenu(mcUnknown, true);
+ }
+}
+
+void cDisplayMenuRootView::SetPluginMenu(string name, int menu, int type) {
+ if (pluginName.compare(name) || menu != pluginMenu || type != pluginMenuType)
+ pluginMenuChanged = true;
+ else
+ pluginMenuChanged = false;
+ pluginName = name;
+ pluginMenu = menu;
+ pluginMenuType = (ePluginMenuType)type;
+}
+
+void cDisplayMenuRootView::SetTitle(const char *title) {
+ menuTitle = title;
+ if (view)
+ view->SetTitle(title);
+}
+
+void cDisplayMenuRootView::SetButtonTexts(const char *Red, const char *Green, const char *Yellow, const char *Blue) {
+ if (Red)
+ buttonTexts[0] = Red;
+ else
+ buttonTexts[0] = "";
+ if (Green)
+ buttonTexts[1] = Green;
+ else
+ buttonTexts[1] = "";
+ if (Yellow)
+ buttonTexts[2] = Yellow;
+ else
+ buttonTexts[2] = "";
+ if (Blue)
+ buttonTexts[3] = Blue;
+ else
+ buttonTexts[3] = "";
+ if (view)
+ view->SetButtonTexts(buttonTexts);
+}
+
+void cDisplayMenuRootView::SetTabs(int tab1, int tab2, int tab3, int tab4, int tab5) {
+ if (listView) {
+ listView->SetTabs(tab1, tab2, tab3, tab4, tab5);
+ }
+}
+
+void cDisplayMenuRootView::SetMessage(eMessageType type, const char *text) {
+ if (!view)
+ return;
+ if (!view->DrawMessage(type, text)) {
+ defaultMessageDrawn = true;
+ DrawMessage(type, text);
+ } else {
+ defaultMessageDrawn = false;
+ }
+}
+
+void cDisplayMenuRootView::SetDetailedViewEvent(const cEvent *event) {
+ if (!detailView) {
+ if (viewType != svMenuDetailedEpg) {
+ SetMenu(mcEvent, true);
+ } else {
+ detailView = new cDisplayMenuDetailView(subView);
+ }
+ }
+ detailView->SetEvent(event);
+}
+
+void cDisplayMenuRootView::SetDetailedViewRecording(const cRecording *recording) {
+ if (!detailView) {
+ if (viewType != svMenuDetailedRecording) {
+ SetMenu(mcRecordingInfo, true);
+ } else {
+ detailView = new cDisplayMenuDetailView(subView);
+ }
+ }
+ detailView->SetRecording(recording);
+}
+
+void cDisplayMenuRootView::SetDetailedViewText(const char *text) {
+ if (!detailView) {
+ if (viewType != svMenuDetailedText) {
+ SetMenu(mcText, true);
+ } else {
+ detailView = new cDisplayMenuDetailView(subView);
+ }
+ }
+ detailView->SetText(text);
+}
+
+bool cDisplayMenuRootView::SetDetailedViewPlugin(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens) {
+ if (!detailView) {
+ SetMenu(mcPlugin, true);
+ }
+ if (!subViewAvailable)
+ return false;
+ detailView->SetPluginTokens(stringTokens, intTokens, loopTokens);
+ return true;
+}
+
+void cDisplayMenuRootView::KeyInput(bool up, bool page) {
+ if (!detailView)
+ return;
+
+ if (up && page) {
+ detailView->KeyLeft();
+ } else if (!up && page) {
+ detailView->KeyRight();
+ } else if (up && !page) {
+ detailView->KeyUp();
+ } else if (!up && !page) {
+ detailView->KeyDown();
+ }
+}
+
+void cDisplayMenuRootView::Clear(void) {
+ if (view) {
+ view->ClearChannel();
+ view->ClearEpgSearchFavorite();
+ }
+ if (listView) {
+ listView->Clear();
+ }
+ if (detailView) {
+ delete detailView;
+ detailView = NULL;
+ }
+}
+
+void cDisplayMenuRootView::ClearRootView(void) {
+ if (defaultBackgroundDrawn && view && view->BackgroundImplemented())
+ ClearViewElement(veBackground);
+ if (defaultHeaderDrawn)
+ ClearViewElement(veHeader);
+ if (defaultButtonsDrawn)
+ ClearViewElement(veButtons);
+ if (defaultDateTimeDrawn)
+ ClearViewElement(veDateTime);
+ if (defaultMessageDrawn)
+ ClearViewElement(veMessage);
+}
+
+int cDisplayMenuRootView::GetMaxItems(void) {
+ if (listView) {
+ return listView->GetMaxItems();
+ }
+ //wrong menucat
+ SetMenu(mcUnknown, true);
+ return listView->GetMaxItems();
+}
+
+int cDisplayMenuRootView::GetListViewWidth(void) {
+ if (listView) {
+ return listView->GetListWidth();
+ }
+ return 0;
+}
+
+int cDisplayMenuRootView::GetTextAreaWidth(void) {
+ if (!tmplView)
+ return 1900;
+ cTemplateView *tmplSubView = tmplView->GetSubView(svMenuDefault);
+ if (!tmplSubView)
+ return 1900;
+ int areaWidth = tmplSubView->GetNumericParameter(ptWidth);
+ if (areaWidth > 0)
+ return areaWidth;
+ return 1900;
+}
+
+cFont *cDisplayMenuRootView::GetTextAreaFont(void) {
+ if (!tmplView)
+ return NULL;
+ cTemplateView *tmplSubViewDefault = tmplView->GetSubView(svMenuDefault);
+ if (!tmplSubViewDefault)
+ return NULL;
+
+ cTemplateViewList *tmplViewList = tmplSubViewDefault->GetViewList(vlMenuItem);
+ if (!tmplViewList)
+ return NULL;
+
+ return tmplViewList->GetTextAreaFont();
+}
+
+
+void cDisplayMenuRootView::Render(void) {
+ if (!view)
+ return;
+ if (!view->DrawBackground()) {
+ defaultBackgroundDrawn = true;
+ DrawBackground();
+ } else {
+ defaultBackgroundDrawn = false;
+ }
+
+ if (!view->DrawHeader()) {
+ defaultHeaderDrawn = true;
+ DrawHeader();
+ } else {
+ defaultHeaderDrawn = false;
+ }
+
+ if (!view->DrawColorButtons()) {
+ defaultButtonsDrawn = true;
+ DrawColorButtons();
+ } else {
+ defaultButtonsDrawn = false;
+ }
+
+ view->DrawStaticViewElements();
+ view->DrawDynamicViewElements();
+}
+
+void cDisplayMenuRootView::RenderMenuItems(void) {
+ if (listView)
+ listView->Render();
+}
+
+void cDisplayMenuRootView::RenderDetailView(void) {
+ if (detailView)
+ detailView->Render();
+}
+
+void cDisplayMenuRootView::RenderMenuScrollBar(int Total, int Offset) {
+ if (!listView)
+ return;
+ view->DrawScrollbar(listView->GetMaxItems(), Total, Offset);
+}
+
+bool cDisplayMenuRootView::RenderDynamicElements(void) {
+ if (!view)
+ return false;
+ bool updated = false;
+ if (view->DrawTime()) {
+ updated = true;
+ } else if (DrawTime()) {
+ updated = true;
+ }
+ if (view->DrawDynamicViewElements()){
+ updated = true;
+ }
+
+ if (!view->DrawDateTime()) {
+ defaultDateTimeDrawn = true;
+ DrawDateTime();
+ } else {
+ defaultDateTimeDrawn = false;
+ }
+
+ return updated;
+}
+
+/*******************************************************************
+* Private Functions
+*******************************************************************/
+
+void cDisplayMenuRootView::DrawBackground(void) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ DrawViewElement(veBackground, &stringTokens, &intTokens);
+}
+void cDisplayMenuRootView::DrawHeader(void) {
+ if (!ViewElementImplemented(veHeader)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string,string>("title", menuTitle));
+ stringTokens.insert(pair<string,string>("vdrversion", VDRVERSION));
+
+ //check for standard menu entries
+ bool hasIcon = false;
+
+ string icon = imgCache->GetIconName(menuTitle, cat);
+ if (imgCache->MenuIconExists(icon))
+ hasIcon = true;
+
+ stringTokens.insert(pair<string,string>("icon", icon));
+ intTokens.insert(pair<string,int>("hasicon", hasIcon));
+
+ //Disc Usage
+ string vdrUsageString = *cVideoDiskUsage::String();
+ int discUsage = cVideoDiskUsage::UsedPercent();
+ bool discAlert = (discUsage > 95) ? true : false;
+ string freeTime = *cString::sprintf("%02d:%02d", cVideoDiskUsage::FreeMinutes() / 60, cVideoDiskUsage::FreeMinutes() % 60);
+ int freeGB = cVideoDiskUsage::FreeMB() / 1024;
+
+ intTokens.insert(pair<string, int>("usedpercent", discUsage));
+ intTokens.insert(pair<string, int>("freepercent", 100-discUsage));
+ intTokens.insert(pair<string, int>("discalert", discAlert));
+ intTokens.insert(pair<string, int>("freegb", freeGB));
+ stringTokens.insert(pair<string,string>("freetime", freeTime));
+ stringTokens.insert(pair<string,string>("vdrusagestring", vdrUsageString));
+
+ ClearViewElement(veHeader);
+ DrawViewElement(veHeader, &stringTokens, &intTokens);
+}
+
+void cDisplayMenuRootView::DrawDateTime(void) {
+ if (!ViewElementImplemented(veDateTime)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ if (!SetDate(stringTokens, intTokens)) {
+ return;
+ }
+
+ ClearViewElement(veDateTime);
+ DrawViewElement(veDateTime, &stringTokens, &intTokens);
+}
+
+bool cDisplayMenuRootView::DrawTime(void) {
+ if (!ViewElementImplemented(veTime)) {
+ return false;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ if (!SetTime(stringTokens, intTokens)) {
+ return false;
+ }
+
+ ClearViewElement(veTime);
+ DrawViewElement(veTime, &stringTokens, &intTokens);
+ return true;
+}
+
+
+void cDisplayMenuRootView::DrawColorButtons(void) {
+ if (!ViewElementImplemented(veButtons)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string,string>("red", buttonTexts[0]));
+ stringTokens.insert(pair<string,string>("green", buttonTexts[1]));
+ stringTokens.insert(pair<string,string>("yellow", buttonTexts[2]));
+ stringTokens.insert(pair<string,string>("blue", buttonTexts[3]));
+
+ int colorKeys[4] = { Setup.ColorKey0, Setup.ColorKey1, Setup.ColorKey2, Setup.ColorKey3 };
+
+ for (int button = 1; button < 5; button++) {
+ string red = *cString::sprintf("red%d", button);
+ string green = *cString::sprintf("green%d", button);
+ string yellow = *cString::sprintf("yellow%d", button);
+ string blue = *cString::sprintf("blue%d", button);
+ bool isRed = false;
+ bool isGreen = false;
+ bool isYellow = false;
+ bool isBlue = false;
+ switch (colorKeys[button-1]) {
+ case 0:
+ isRed = true;
+ break;
+ case 1:
+ isGreen = true;
+ break;
+ case 2:
+ isYellow = true;
+ break;
+ case 3:
+ isBlue = true;
+ break;
+ default:
+ break;
+ }
+ intTokens.insert(pair<string, int>(red, isRed));
+ intTokens.insert(pair<string, int>(green, isGreen));
+ intTokens.insert(pair<string, int>(yellow, isYellow));
+ intTokens.insert(pair<string, int>(blue, isBlue));
+ }
+
+ ClearViewElement(veButtons);
+ DrawViewElement(veButtons, &stringTokens, &intTokens);
+}
+
+void cDisplayMenuRootView::DrawMessage(eMessageType type, const char *text) {
+ if (!text) {
+ ClearViewElement(veMessage);
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ intTokens.insert(pair<string, int>("status", (type == mtStatus) ? true : false));
+ intTokens.insert(pair<string, int>("info", (type == mtInfo) ? true : false));
+ intTokens.insert(pair<string, int>("warning", (type == mtWarning) ? true : false));
+ intTokens.insert(pair<string, int>("error", (type == mtError) ? true : false));
+ stringTokens.insert(pair<string,string>("text", text));
+
+ ClearViewElement(veMessage);
+ DrawViewElement(veMessage, &stringTokens, &intTokens);
+}
+
+void cDisplayMenuRootView::Action(void) {
+ if (!view)
+ return;
+ SetInitFinished();
+ Render();
+ view->Start();
+ FadeIn();
+ DoFlush();
+}
diff --git a/views/displaymenurootview.h b/views/displaymenurootview.h
new file mode 100644
index 0000000..b9c8c81
--- /dev/null
+++ b/views/displaymenurootview.h
@@ -0,0 +1,75 @@
+#ifndef __DISPLAYMENUROOTVIEW_H
+#define __DISPLAYMENUROOTVIEW_H
+
+#include "../libtemplate/template.h"
+#include "displaymenuview.h"
+#include "displaymenulistview.h"
+#include "displaymenudetailview.h"
+
+enum ePluginMenuType {
+ mtList,
+ mtText,
+ mtUnknown
+};
+
+class cDisplayMenuRootView : public cView, public cViewHelpers {
+private:
+ eMenuCategory cat;
+ eSubView viewType;
+ cTemplateView *subView;
+ bool subViewAvailable;
+ string pluginName;
+ int pluginMenu;
+ ePluginMenuType pluginMenuType;
+ bool pluginMenuChanged;
+ cDisplayMenuView *view;
+ cDisplayMenuListView *listView;
+ cDisplayMenuDetailView *detailView;
+ string menuTitle;
+ string buttonTexts[4];
+ bool defaultBackgroundDrawn;
+ bool defaultHeaderDrawn;
+ bool defaultButtonsDrawn;
+ bool defaultDateTimeDrawn;
+ bool defaultMessageDrawn;
+ void DrawBackground(void);
+ void DrawHeader(void);
+ void DrawDateTime(void);
+ bool DrawTime(void);
+ void DrawColorButtons(void);
+ void DrawMessage(eMessageType type, const char *text);
+ void ClearRootView(void);
+ virtual void Action(void);
+public:
+ cDisplayMenuRootView(cTemplateView *rootView);
+ virtual ~cDisplayMenuRootView();
+ bool createOsd(void);
+ void SetMenu(eMenuCategory menuCat, bool menuInit);
+ void CorrectDefaultMenu(void);
+ void SetPluginMenu(string name, int menu, int type);
+ void SetTitle(const char *title);
+ void SetChannel(const cChannel *channel) { view->SetChannel(channel); };
+ const cChannel *GetChannel(void) { return view->GetChannel(); };
+ void SetEpgSearchFavorite(void) { if (view) view->SetEpgSearchFavorite(); };
+ void SetButtonTexts(const char *Red, const char *Green, const char *Yellow, const char *Blue);
+ void SetTabs(int tab1, int tab2, int tab3, int tab4, int tab5);
+ void SetMessage(eMessageType type, const char *text);
+ void SetDetailedViewEvent(const cEvent *event);
+ void SetDetailedViewRecording(const cRecording *recording);
+ void SetDetailedViewText(const char *text);
+ bool SetDetailedViewPlugin(map<string,string> *stringTokens, map<string,int> *intTokens, map<string,vector<map<string,string> > > *loopTokens);
+ void KeyInput(bool up, bool page);
+ void Clear(void);
+ int GetMaxItems(void);
+ int GetListViewWidth(void);
+ int GetTextAreaWidth(void);
+ cFont *GetTextAreaFont(void);
+ bool SubViewAvailable(void) { return subViewAvailable; };
+ cDisplayMenuListView *GetListView(void) { return listView; };
+ void Render(void);
+ void RenderMenuItems(void);
+ void RenderDetailView(void);
+ void RenderMenuScrollBar(int Total, int Offset);
+ bool RenderDynamicElements(void);
+};
+#endif //__DISPLAYMENUROOTVIEW_H
diff --git a/views/displaymenutabview.c b/views/displaymenutabview.c
new file mode 100644
index 0000000..f9e03f9
--- /dev/null
+++ b/views/displaymenutabview.c
@@ -0,0 +1,126 @@
+#include "displaymenutabview.h"
+
+
+cDisplayMenuTabView::cDisplayMenuTabView(cTemplateViewTab *tmplTab) : cView(tmplTab) {
+}
+
+cDisplayMenuTabView::~cDisplayMenuTabView() {
+ CancelSave();
+}
+
+void cDisplayMenuTabView::SetTokens(map < string, int > *intTokens, map < string, string > *stringTokens, map < string, vector< map< string, string > > > *loopTokens) {
+ this->intTokens = intTokens;
+ this->stringTokens = stringTokens;
+ this->loopTokens = loopTokens;
+}
+
+void cDisplayMenuTabView::Clear(void) {
+ Fill(0, clrTransparent);
+}
+
+void cDisplayMenuTabView::CreateTab(void) {
+ //Create Pixmap
+ if (!PixmapExists(0)) {
+ cSize drawportSize;
+ scrolling = tmplTab->CalculateDrawPortSize(drawportSize, loopTokens);
+ if (scrolling) {
+ CreateScrollingPixmap(0, tmplTab, drawportSize);
+ scrollingPix = 0;
+ scrollOrientation = orVertical;
+ scrollMode = smNone;
+ } else {
+ CreateViewPixmap(0, tmplTab);
+ }
+ }
+}
+
+
+void cDisplayMenuTabView::Render(void) {
+ if (tmplTab->DoDebug()) {
+ tmplTab->Debug();
+ }
+ //Draw Tab, flushing every loop
+ DrawPixmap(0, tmplTab, loopTokens, true);
+}
+
+bool cDisplayMenuTabView::KeyUp(void) {
+ if (!scrolling)
+ return false;
+ int scrollStep = tmplTab->GetScrollStep();
+ int aktHeight = DrawportY(0);
+ if (aktHeight >= 0) {
+ return false;
+ }
+ int newY = aktHeight + scrollStep;
+ if (newY > 0)
+ newY = 0;
+ SetDrawPortPoint(0, cPoint(0, newY));
+ return true;
+}
+
+bool cDisplayMenuTabView::KeyDown(void) {
+ if (!scrolling)
+ return false;
+
+ int scrollStep = tmplTab->GetScrollStep();
+ int aktHeight = DrawportY(0);
+ int totalHeight = DrawportHeight(0);
+ int screenHeight = Height(0);
+
+ if (totalHeight - ((-1)*aktHeight) == screenHeight) {
+ return false;
+ }
+ int newY = aktHeight - scrollStep;
+ if ((-1)*newY > totalHeight - screenHeight)
+ newY = (-1)*(totalHeight - screenHeight);
+ SetDrawPortPoint(0, cPoint(0, newY));
+ return true;
+}
+
+bool cDisplayMenuTabView::KeyLeft(void) {
+ if (!scrolling)
+ return false;
+ if (!PixmapExists(0))
+ return false;
+ int aktHeight = DrawportY(0);
+ int screenHeight = Height(0);
+ int newY = aktHeight + screenHeight;
+ if (newY > 0)
+ newY = 0;
+ SetDrawPortPoint(0, cPoint(0, newY));
+ return true;
+}
+
+bool cDisplayMenuTabView::KeyRight(void) {
+ if (!scrolling)
+ return false;
+ if (!PixmapExists(0))
+ return false;
+ int aktHeight = DrawportY(0);
+ int screenHeight = Height(0);
+ int totalHeight = DrawportHeight(0);
+ int newY = aktHeight - screenHeight;
+ if ((-1)*newY > totalHeight - screenHeight)
+ newY = (-1)*(totalHeight - screenHeight);
+ SetDrawPortPoint(0, cPoint(0, newY));
+ return true;
+}
+
+void cDisplayMenuTabView::GetScrollbarPosition(int &barTop, int &barHeight) {
+ int y = (-1)*DrawportY(0);
+ int totalHeight = DrawportHeight(0);
+ int screenHeight = Height(0);
+ if (totalHeight == 0)
+ return;
+ if (totalHeight <= screenHeight)
+ barHeight = 1000;
+ else {
+ barHeight = (double)screenHeight / (double) totalHeight * 1000;
+ }
+ barTop = (double)y / (double) totalHeight * 1000;
+}
+
+void cDisplayMenuTabView::Action(void) {
+ Render();
+ DoFlush();
+}
\ No newline at end of file
diff --git a/views/displaymenutabview.h b/views/displaymenutabview.h
new file mode 100644
index 0000000..70a7447
--- /dev/null
+++ b/views/displaymenutabview.h
@@ -0,0 +1,27 @@
+#ifndef __DISPLAYMENUTABVIEW_H
+#define __DISPLAYMENUTABVIEW_H
+
+#include "../libtemplate/template.h"
+#include "view.h"
+
+class cDisplayMenuTabView : public cView {
+private:
+ map < string, string > *stringTokens;
+ map < string, int > *intTokens;
+ map < string, vector< map< string, string > > > *loopTokens;
+ void Action(void);
+public:
+ cDisplayMenuTabView(cTemplateViewTab *tmplTab);
+ virtual ~cDisplayMenuTabView();
+ void SetTokens(map < string, int > *intTokens, map < string, string > *stringTokens, map < string, vector< map< string, string > > > *loopTokens);
+ void Clear(void);
+ void CreateTab(void);
+ void Render(void);
+ bool KeyUp(void);
+ bool KeyDown(void);
+ bool KeyLeft(void);
+ bool KeyRight(void);
+ void GetScrollbarPosition(int &barTop, int &barHeight);
+};
+
+#endif //__DISPLAYMENUTABVIEW_H
diff --git a/views/displaymenuview.c b/views/displaymenuview.c
new file mode 100644
index 0000000..32a00ba
--- /dev/null
+++ b/views/displaymenuview.c
@@ -0,0 +1,662 @@
+#define __STL_CONFIG_H
+#include <fstream>
+#include <iostream>
+#include <vdr/menu.h>
+#include <vdr/videodir.h>
+#include "displaymenuview.h"
+#include "../config.h"
+#include "../libcore/helpers.h"
+#include "../libcore/timers.h"
+#include "../services/scraper2vdr.h"
+
+cDisplayMenuView::cDisplayMenuView(cTemplateView *tmplView, bool menuInit) : cView(tmplView) {
+ if (menuInit)
+ SetFadeTime(tmplView->GetNumericParameter(ptFadeTime));
+ else
+ SetFadeTime(0);
+ cat = mcUndefined;
+ buttonTexts = NULL;
+}
+
+cDisplayMenuView::~cDisplayMenuView() {
+ CancelSave();
+ FadeOut();
+}
+
+bool cDisplayMenuView::DrawBackground(void) {
+ if (!ViewElementImplemented(veBackground)) {
+ return false;
+ }
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ DrawViewElement(veBackground, &stringTokens, &intTokens);
+ return true;
+}
+
+bool cDisplayMenuView::DrawHeader(void) {
+ if (!ViewElementImplemented(veHeader)) {
+ return false;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string,string>("title", menuTitle));
+ stringTokens.insert(pair<string,string>("vdrversion", VDRVERSION));
+
+ //check for standard menu entries
+ bool hasIcon = false;
+ string icon = imgCache->GetIconName(menuTitle, cat);
+ if (imgCache->MenuIconExists(icon))
+ hasIcon = true;
+ stringTokens.insert(pair<string,string>("icon", icon));
+ intTokens.insert(pair<string,int>("hasicon", hasIcon));
+
+ //Disc Usage
+ string vdrUsageString = *cVideoDiskUsage::String();
+ int discUsage = cVideoDiskUsage::UsedPercent();
+ bool discAlert = (discUsage > 95) ? true : false;
+ string freeTime = *cString::sprintf("%02d:%02d", cVideoDiskUsage::FreeMinutes() / 60, cVideoDiskUsage::FreeMinutes() % 60);
+ int freeGB = cVideoDiskUsage::FreeMB() / 1024;
+
+ intTokens.insert(pair<string, int>("usedpercent", discUsage));
+ intTokens.insert(pair<string, int>("freepercent", 100-discUsage));
+ intTokens.insert(pair<string, int>("discalert", discAlert));
+ intTokens.insert(pair<string, int>("freegb", freeGB));
+ stringTokens.insert(pair<string,string>("freetime", freeTime));
+ stringTokens.insert(pair<string,string>("vdrusagestring", vdrUsageString));
+
+ ClearViewElement(veHeader);
+ DrawViewElement(veHeader, &stringTokens, &intTokens);
+ return true;
+}
+
+bool cDisplayMenuView::DrawDateTime(void) {
+ if (!ViewElementImplemented(veDateTime)) {
+ return false;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ if (!SetDate(stringTokens, intTokens)) {
+ return false;
+ }
+
+ ClearViewElement(veDateTime);
+ DrawViewElement(veDateTime, &stringTokens, &intTokens);
+ return true;
+}
+
+bool cDisplayMenuView::DrawTime(void) {
+ if (!ViewElementImplemented(veTime)) {
+ return false;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ if (!SetTime(stringTokens, intTokens)) {
+ return false;
+ }
+
+ ClearViewElement(veTime);
+ DrawViewElement(veTime, &stringTokens, &intTokens);
+
+ return true;
+}
+
+bool cDisplayMenuView::DrawColorButtons(void) {
+ if (!ViewElementImplemented(veButtons)) {
+ return false;
+ }
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string,string>("red", buttonTexts ? buttonTexts[0] : ""));
+ stringTokens.insert(pair<string,string>("green", buttonTexts ? buttonTexts[1]: ""));
+ stringTokens.insert(pair<string,string>("yellow", buttonTexts ? buttonTexts[2]: ""));
+ stringTokens.insert(pair<string,string>("blue", buttonTexts ? buttonTexts[3] : ""));
+
+ int colorKeys[4] = { Setup.ColorKey0, Setup.ColorKey1, Setup.ColorKey2, Setup.ColorKey3 };
+
+ for (int button = 1; button < 5; button++) {
+ string red = *cString::sprintf("red%d", button);
+ string green = *cString::sprintf("green%d", button);
+ string yellow = *cString::sprintf("yellow%d", button);
+ string blue = *cString::sprintf("blue%d", button);
+ bool isRed = false;
+ bool isGreen = false;
+ bool isYellow = false;
+ bool isBlue = false;
+ switch (colorKeys[button-1]) {
+ case 0:
+ isRed = true;
+ break;
+ case 1:
+ isGreen = true;
+ break;
+ case 2:
+ isYellow = true;
+ break;
+ case 3:
+ isBlue = true;
+ break;
+ default:
+ break;
+ }
+ intTokens.insert(pair<string, int>(red, isRed));
+ intTokens.insert(pair<string, int>(green, isGreen));
+ intTokens.insert(pair<string, int>(yellow, isYellow));
+ intTokens.insert(pair<string, int>(blue, isBlue));
+ }
+
+ ClearViewElement(veButtons);
+ DrawViewElement(veButtons, &stringTokens, &intTokens);
+ return true;
+}
+
+bool cDisplayMenuView::DrawMessage(eMessageType type, const char *text) {
+ if (!ViewElementImplemented(veMessage)) {
+ return false;
+ }
+ if (!text) {
+ ClearViewElement(veMessage);
+ return true;
+ }
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ intTokens.insert(pair<string, int>("status", (type == mtStatus) ? true : false));
+ intTokens.insert(pair<string, int>("info", (type == mtInfo) ? true : false));
+ intTokens.insert(pair<string, int>("warning", (type == mtWarning) ? true : false));
+ intTokens.insert(pair<string, int>("error", (type == mtError) ? true : false));
+ stringTokens.insert(pair<string,string>("text", text));
+
+ ClearViewElement(veMessage);
+ DrawViewElement(veMessage, &stringTokens, &intTokens);
+ return true;
+}
+
+void cDisplayMenuView::DrawScrollbar(int numMax, int numDisplayed, int offset) {
+ if (!ViewElementImplemented(veScrollbar)) {
+ return;
+ }
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ if (numDisplayed < 1)
+ return;
+
+ int barHeight = 0;
+ if (numDisplayed < numMax)
+ barHeight = 1000;
+ else
+ barHeight = (double)numMax * 1000 / (double)numDisplayed;
+
+ int barOffset = (double)offset * 1000 / (double)numDisplayed;
+
+ intTokens.insert(pair<string, int>("height", barHeight));
+ intTokens.insert(pair<string, int>("offset", barOffset));
+
+ ClearViewElement(veScrollbar);
+ DrawViewElement(veScrollbar, &stringTokens, &intTokens);
+}
+
+bool cDisplayMenuView::BackgroundImplemented(void) {
+ if (!ViewElementImplemented(veBackground)) {
+ return false;
+ }
+ return true;
+}
+
+
+void cDisplayMenuView::Action(void) {
+ SetInitFinished();
+ FadeIn();
+ DoFlush();
+}
+
+/************************************************************************
+* cDisplayMenuMainView
+************************************************************************/
+
+cDisplayMenuMainView::cDisplayMenuMainView(cTemplateView *tmplView, bool menuInit) : cDisplayMenuView(tmplView, menuInit) {
+ initial = true;
+ lastSystemLoad = 0.0;
+ InitDevices();
+}
+
+cDisplayMenuMainView::~cDisplayMenuMainView() {
+ CancelSave();
+ FadeOut();
+}
+
+void cDisplayMenuMainView::DrawStaticViewElements(void) {
+ DrawTimers();
+ DrawDiscUsage();
+ DrawTemperatures();
+ DrawCurrentSchedule();
+ DrawCurrentWeather();
+ DrawCustomTokens();
+}
+
+bool cDisplayMenuMainView::DrawDynamicViewElements(void) {
+ bool loadChanged = DrawLoad();
+ bool devicesChanged = DrawDevices();
+ initial = false;
+ return loadChanged || devicesChanged;
+
+}
+
+void cDisplayMenuMainView::DrawTimers(void) {
+ if (!ViewElementImplemented(veTimers)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ map < string, vector< map< string, string > > > timerLoopTokens;
+ vector< map< string, string > > timers;
+
+ cGlobalSortedTimers SortedTimers;// local and remote timers
+ int numTimers = SortedTimers.Size();
+
+ intTokens.insert(pair<string, int>("numtimers", numTimers));
+
+ int numTimerConflicts = SortedTimers.NumTimerConfilicts();
+ intTokens.insert(pair<string, int>("numtimerconflicts", numTimerConflicts));
+
+ for (int i=0; i<15; i++) {
+ stringstream name;
+ name << "timer" << i+1 << "exists";
+ if (i < numTimers) {
+ intTokens.insert(pair<string, int>(name.str(), true));
+ } else {
+ intTokens.insert(pair<string, int>(name.str(), false));
+ }
+ }
+
+ for (int i = 0; i < numTimers; i++) {
+ if (i >=15)
+ break;
+ map< string, string > timerVals;
+ const cTimer *Timer = SortedTimers[i];
+ const cEvent *event = Timer->Event();
+ if (event) {
+ timerVals.insert(pair< string, string >("timers[title]", event->Title()));
+ } else {
+ const char *File = Setup.FoldersInTimerMenu ? NULL : strrchr(Timer->File(), FOLDERDELIMCHAR);
+ if (File && strcmp(File + 1, TIMERMACRO_TITLE) && strcmp(File + 1, TIMERMACRO_EPISODE))
+ File++;
+ else
+ File = Timer->File();
+ timerVals.insert(pair< string, string >("timers[title]", File));
+ }
+ const cChannel *channel = Timer->Channel();
+ if (channel) {
+ timerVals.insert(pair< string, string >("timers[channelname]", channel->Name()));
+ stringstream chanNum;
+ chanNum << channel->Number();
+ timerVals.insert(pair< string, string >("timers[channelnumber]", chanNum.str()));
+ string channelID = *(channel->GetChannelID().ToString());
+ timerVals.insert(pair< string, string >("timers[channelid]", channelID));
+ bool logoExists = imgCache->LogoExists(channelID);
+ timerVals.insert(pair< string, string >("timers[channellogoexists]", logoExists ? "1" : "0"));
+ } else {
+ timerVals.insert(pair< string, string >("timers[channelname]", ""));
+ timerVals.insert(pair< string, string >("timers[channelnumber]", "0"));
+ timerVals.insert(pair< string, string >("timers[channelid]", ""));
+ timerVals.insert(pair< string, string >("timers[channellogoexists]", "0"));
+ }
+
+ timerVals.insert(pair< string, string >("timers[recording]", Timer->Recording() ? "1" : "0"));
+
+ cString timerDate("");
+ if (Timer->Recording()) {
+ timerDate = cString::sprintf("-%s", *TimeString(Timer->StopTime()));
+ } else {
+ time_t Now = time(NULL);
+ cString Today = WeekDayName(Now);
+ cString Time = TimeString(Timer->StartTime());
+ cString Day = WeekDayName(Timer->StartTime());
+ if (Timer->StartTime() > Now + 6 * SECSINDAY) {
+ time_t ttm = Timer->StartTime();
+ struct tm * timerTime = localtime(&ttm);
+ timerDate = cString::sprintf("%02d.%02d %s", timerTime->tm_mday, timerTime->tm_mon + 1, *Time);
+ } else if (strcmp(Day, Today) != 0)
+ timerDate = cString::sprintf("%s %s", *Day, *Time);
+ else
+ timerDate = Time;
+ if (Timer->Flags() & tfVps)
+ timerDate = cString::sprintf("VPS %s", *timerDate);
+ }
+ timerVals.insert(pair< string, string >("timers[datetime]", *timerDate));
+
+ timers.push_back(timerVals);
+ }
+
+ timerLoopTokens.insert(pair< string, vector< map< string, string > > >("timers", timers));
+
+ ClearViewElement(veTimers);
+ DrawViewElement(veTimers, &stringTokens, &intTokens, &timerLoopTokens);
+}
+
+void cDisplayMenuMainView::DrawDiscUsage(void) {
+ if (!ViewElementImplemented(veDiscUsage)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ string vdrUsageString = *cVideoDiskUsage::String();
+ int discUsage = cVideoDiskUsage::UsedPercent();
+ bool discAlert = (discUsage > 95) ? true : false;
+ string freeTime = *cString::sprintf("%02d:%02d", cVideoDiskUsage::FreeMinutes() / 60, cVideoDiskUsage::FreeMinutes() % 60);
+ int freeGB = cVideoDiskUsage::FreeMB() / 1024;
+
+ intTokens.insert(pair<string, int>("usedpercent", discUsage));
+ intTokens.insert(pair<string, int>("freepercent", 100-discUsage));
+ intTokens.insert(pair<string, int>("discalert", discAlert));
+ intTokens.insert(pair<string, int>("freegb", freeGB));
+ stringTokens.insert(pair<string,string>("freetime", freeTime));
+ stringTokens.insert(pair<string,string>("vdrusagestring", vdrUsageString));
+
+ ClearViewElement(veDiscUsage);
+ DrawViewElement(veDiscUsage, &stringTokens, &intTokens);
+}
+
+bool cDisplayMenuMainView::DrawLoad(void) {
+ if (!ViewElementImplemented(veSystemLoad)) {
+ return false;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ double systemLoad;
+ if (getloadavg(&systemLoad, 1) > 0) {
+ if (lastSystemLoad == systemLoad) {
+ return false;
+ }
+ string load = *cString::sprintf("%.2f", systemLoad);
+ int loadHand = systemLoad * 1000;
+ int loadHandValue = 0;
+ if (loadHand > 2500)
+ loadHandValue = 2525;
+ else {
+
+ int loadHandDec = loadHand - (loadHand / 100) * 100;
+
+ if (loadHandDec <= 12)
+ loadHandDec = 0;
+ else if (loadHandDec <= 37)
+ loadHandDec = 25;
+ else if (loadHandDec <= 62)
+ loadHandDec = 50;
+ else if (loadHandDec <= 87)
+ loadHandDec = 75;
+ else
+ loadHandDec = 0;
+
+ loadHandValue = loadHand / 100 * 100 + loadHandDec;
+ }
+
+ stringTokens.insert(pair<string,string>("load", load));
+ intTokens.insert(pair<string,int>("loadhand", loadHandValue));
+ lastSystemLoad = systemLoad;
+ }
+
+ ClearViewElement(veSystemLoad);
+ DrawViewElement(veSystemLoad, &stringTokens, &intTokens);
+
+ return true;
+}
+
+void cDisplayMenuMainView::DrawTemperatures(void) {
+ if (!ViewElementImplemented(veTemperatures)) {
+ return;
+ }
+ cString execCommand = cString::sprintf("cd \"%s/\"; \"%s/temperatures\"", SCRIPTFOLDER, SCRIPTFOLDER);
+ system(*execCommand);
+
+ string tempCPU, tempGPU;
+ int cpu, gpu;
+
+ cString itemFilename = cString::sprintf("%s/cpu", SCRIPTOUTPUTPATH );
+ ifstream file(*itemFilename, ifstream::in);
+ if( file.is_open() ) {
+ std::getline(file, tempCPU);
+ if (tempCPU.size() > 2) {
+ cpu = atoi(tempCPU.substr(0,2).c_str());
+ } else
+ cpu = 0;
+ file.close();
+ } else {
+ tempCPU = "0°C";
+ cpu = 0;
+ }
+
+ itemFilename = cString::sprintf("%s/gpu", SCRIPTOUTPUTPATH );
+ ifstream file2(*itemFilename, ifstream::in);
+ if( file2.is_open() ) {
+ std::getline(file2, tempGPU);
+ if (tempGPU.size() > 2) {
+ gpu = atoi(tempGPU.substr(0,2).c_str());
+ } else
+ gpu = 0;
+ file2.close();
+ } else {
+ tempGPU = "0°C";
+ gpu = 0;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ intTokens.insert(pair<string,int>("cputemp", cpu));
+ intTokens.insert(pair<string,int>("gputemp", gpu));
+
+ ClearViewElement(veTemperatures);
+ DrawViewElement(veTemperatures, &stringTokens, &intTokens);
+}
+
+bool cDisplayMenuMainView::DrawDevices(void) {
+ if (!ViewElementImplemented(veDevices)) {
+ return false;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ map < string, vector< map< string, string > > > deviceLoopTokens;
+ vector< map< string, string > > devices;
+
+ bool changed = SetDevices(initial, &intTokens, &devices);
+ if (!changed)
+ return false;
+
+ deviceLoopTokens.insert(pair< string, vector< map< string, string > > >("devices", devices));
+
+ ClearViewElement(veDevices);
+ DrawViewElement(veDevices, &stringTokens, &intTokens, &deviceLoopTokens);
+ return true;
+}
+
+void cDisplayMenuMainView::DrawCurrentSchedule(void) {
+ if (!ViewElementImplemented(veCurrentSchedule)) {
+ return;
+ }
+
+ cDevice *device = cDevice::PrimaryDevice();
+ const cChannel *channel = NULL;
+ if (!device->Replaying() || device->Transferring()) {
+ channel = Channels.GetByNumber(device->CurrentChannel());
+ }
+ if (!channel)
+ return;
+
+ const cEvent *event = NULL;
+ cSchedulesLock SchedulesLock;
+ if (const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock))
+ if (const cSchedule *Schedule = Schedules->GetSchedule(channel))
+ event = Schedule->GetPresentEvent();
+ if (!event)
+ return;
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string,string>("title", (event->Title())?event->Title():""));
+ stringTokens.insert(pair<string,string>("subtitle", (event->ShortText())?event->ShortText():""));
+ stringTokens.insert(pair<string,string>("start", *event->GetTimeString()));
+ stringTokens.insert(pair<string,string>("stop", *event->GetEndTimeString()));
+ intTokens.insert(pair<string,int>("duration", event->Duration() / 60));
+ intTokens.insert(pair<string,int>("durationhours", event->Duration() / 3600));
+ stringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", (event->Duration() / 60)%60)));
+ intTokens.insert(pair<string,int>("elapsed", (int)round((time(NULL) - event->StartTime())/60)));
+ intTokens.insert(pair<string,int>("remaining", (int)round((event->EndTime() - time(NULL))/60)));
+
+ int mediaWidth = 0;
+ int mediaHeight = 0;
+ string mediaPath = "";
+ bool isBanner = false;
+ int posterWidth = 0;
+ int posterHeight = 0;
+ string posterPath = "";
+ bool hasPoster = false;
+ int bannerWidth = 0;
+ int bannerHeight = 0;
+ string bannerPath = "";
+ bool hasBanner = false;
+ static cPlugin *pScraper = GetScraperPlugin();
+ if (pScraper) {
+ ScraperGetPosterBanner call;
+ call.event = event;
+ if (pScraper->Service("GetPosterBanner", &call)) {
+ if ((call.type == tSeries) && call.banner.path.size() > 0) {
+ mediaWidth = call.banner.width;
+ mediaHeight = call.banner.height;
+ mediaPath = call.banner.path;
+ isBanner = true;
+ bannerWidth = mediaWidth;
+ bannerHeight = mediaHeight;
+ bannerPath = mediaPath;
+ hasBanner = true;
+ ScraperGetPoster callPoster;
+ callPoster.event = event;
+ callPoster.recording = NULL;
+ if (pScraper->Service("GetPoster", &callPoster)) {
+ posterWidth = callPoster.poster.width;
+ posterHeight = callPoster.poster.height;
+ posterPath = callPoster.poster.path;
+ hasPoster = true;
+ }
+ } else if (call.type == tMovie && call.poster.path.size() > 0 && call.poster.height > 0) {
+ mediaWidth = call.poster.width;
+ mediaHeight = call.poster.height;
+ mediaPath = call.poster.path;
+ posterWidth = call.poster.width;
+ posterHeight = call.poster.height;
+ posterPath = call.poster.path;
+ hasPoster = true;
+ }
+ }
+ }
+ intTokens.insert(pair<string,int>("mediawidth", mediaWidth));
+ intTokens.insert(pair<string,int>("mediaheight", mediaHeight));
+ intTokens.insert(pair<string,int>("isbanner", isBanner));
+ stringTokens.insert(pair<string,string>("mediapath", mediaPath));
+ intTokens.insert(pair<string,int>("posterwidth", posterWidth));
+ intTokens.insert(pair<string,int>("posterheight", posterHeight));
+ stringTokens.insert(pair<string,string>("posterpath", posterPath));
+ intTokens.insert(pair<string,int>("hasposter", hasPoster));
+ intTokens.insert(pair<string,int>("bannerwidth", bannerWidth));
+ intTokens.insert(pair<string,int>("bannerheight", bannerHeight));
+ stringTokens.insert(pair<string,string>("bannerpath", bannerPath));
+ intTokens.insert(pair<string,int>("hasbanner", hasBanner));
+
+ ClearViewElement(veCurrentSchedule);
+ DrawViewElement(veCurrentSchedule, &stringTokens, &intTokens);
+}
+
+void cDisplayMenuMainView::DrawCurrentWeather(void) {
+ if (!ViewElementImplemented(veCurrentWeather)) {
+ return;
+ }
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ if (!SetCurrentWeatherTokens(stringTokens, intTokens)){
+ ClearViewElement(veCurrentWeather);
+ return;
+ }
+
+ ClearViewElement(veCurrentWeather);
+ DrawViewElement(veCurrentWeather, &stringTokens, &intTokens);
+}
+
+void cDisplayMenuMainView::DrawCustomTokens(void) {
+ if (!ViewElementImplemented(veCustomTokens)) {
+ return;
+ }
+ if (!tmplView)
+ return;
+ map < string, string > stringTokens = tmplView->GetCustomStringTokens();
+ map < string, int > intTokens = tmplView->GetCustomIntTokens();
+ DrawViewElement(veCustomTokens, &stringTokens, &intTokens);
+}
+
+/************************************************************************
+* cDisplayMenuSchedulesView
+************************************************************************/
+
+cDisplayMenuSchedulesView::cDisplayMenuSchedulesView(cTemplateView *tmplView, eMenuCategory menuCat, bool menuInit) : cDisplayMenuView(tmplView, menuInit) {
+ cat = menuCat;
+ channel = NULL;
+ isEpgSearchFavoritesMenu = false;
+}
+
+cDisplayMenuSchedulesView::~cDisplayMenuSchedulesView() {
+ CancelSave();
+ FadeOut();
+}
+
+bool cDisplayMenuSchedulesView::DrawHeader(void) {
+ if (!ViewElementImplemented(veHeader)) {
+ return false;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ intTokens.insert(pair<string,int>("whatson", (cat == mcSchedule)&&(!isEpgSearchFavoritesMenu) ? true: false));
+ intTokens.insert(pair<string,int>("whatsonnow", (cat == mcScheduleNow) ? true: false));
+ intTokens.insert(pair<string,int>("whatsonnext", (cat == mcScheduleNext) ? true: false));
+ intTokens.insert(pair<string,int>("whatsonfavorites", isEpgSearchFavoritesMenu ? true: false));
+
+ stringTokens.insert(pair<string,string>("title", menuTitle));
+ stringTokens.insert(pair<string,string>("vdrversion", VDRVERSION));
+ if (channel) {
+ stringTokens.insert(pair<string,string>("channelnumber", *cString::sprintf("%d", channel->Number())));
+ stringTokens.insert(pair<string,string>("channelname", channel->Name()));
+ string channelID = *(channel->GetChannelID().ToString());
+ stringTokens.insert(pair<string,string>("channelid", channelID));
+ intTokens.insert(pair<string, int>("channellogoexists", imgCache->LogoExists(channelID)));
+ } else {
+ stringTokens.insert(pair<string,string>("channelnumber", ""));
+ stringTokens.insert(pair<string,string>("channelname", ""));
+ stringTokens.insert(pair<string,string>("channelid", ""));
+ intTokens.insert(pair<string, int>("channellogoexists", 0));
+ }
+ bool hasIcon = false;
+ string icon = imgCache->GetIconName(menuTitle, cat);
+ if (icon.size() > 0)
+ hasIcon = true;
+
+ stringTokens.insert(pair<string,string>("icon", icon));
+ intTokens.insert(pair<string,int>("hasicon", hasIcon));
+ ClearViewElement(veHeader);
+ DrawViewElement(veHeader, &stringTokens, &intTokens);
+ return true;
+}
\ No newline at end of file
diff --git a/views/displaymenuview.h b/views/displaymenuview.h
new file mode 100644
index 0000000..c7aa7eb
--- /dev/null
+++ b/views/displaymenuview.h
@@ -0,0 +1,71 @@
+#ifndef __DISPLAYMENUVIEW_H
+#define __DISPLAYMENUVIEW_H
+
+#include "../libtemplate/template.h"
+#include "viewhelpers.h"
+#include "displaymenulistview.h"
+
+class cDisplayMenuView : public cView, public cViewHelpers {
+protected:
+ eMenuCategory cat;
+ string menuTitle;
+ string *buttonTexts;
+ virtual void Action(void);
+public:
+ cDisplayMenuView(cTemplateView *tmplView, bool menuInit);
+ virtual ~cDisplayMenuView();
+ void SetMenuCat(eMenuCategory newCat) { cat = newCat; };
+ void SetTitle(const char *title) {menuTitle = title; };
+ virtual void SetChannel(const cChannel *channel) {};
+ virtual const cChannel *GetChannel(void) { return NULL; };
+ virtual void ClearChannel(void) {};
+ virtual void SetEpgSearchFavorite(void) {};
+ virtual void ClearEpgSearchFavorite(void) {};
+ void SetButtonTexts(string *buttonTexts) { this->buttonTexts = buttonTexts; };
+ bool DrawBackground(void);
+ virtual bool DrawHeader(void);
+ bool DrawDateTime(void);
+ bool DrawTime(void);
+ bool DrawColorButtons(void);
+ bool DrawMessage(eMessageType type, const char *text);
+ void DrawScrollbar(int numMax, int numDisplayed, int offset);
+ virtual void DrawStaticViewElements(void) {};
+ virtual bool DrawDynamicViewElements(void) { return false; };
+ bool BackgroundImplemented(void);
+};
+
+class cDisplayMenuMainView : public cDisplayMenuView {
+private:
+ bool initial;
+ double lastSystemLoad;
+ void DrawTimers(void);
+ void DrawDiscUsage(void);
+ bool DrawLoad(void);
+ void DrawTemperatures(void);
+ bool DrawDevices(void);
+ void DrawCurrentSchedule(void);
+ void DrawCurrentWeather(void);
+ void DrawCustomTokens(void);
+public:
+ cDisplayMenuMainView(cTemplateView *tmplView, bool menuInit);
+ virtual ~cDisplayMenuMainView();
+ void DrawStaticViewElements(void);
+ bool DrawDynamicViewElements(void);
+};
+
+class cDisplayMenuSchedulesView : public cDisplayMenuView {
+private:
+ const cChannel *channel;
+ bool isEpgSearchFavoritesMenu;
+public:
+ cDisplayMenuSchedulesView(cTemplateView *tmplView, eMenuCategory menuCat, bool menuInit);
+ virtual ~cDisplayMenuSchedulesView();
+ void SetChannel(const cChannel *channel) { if (channel) this->channel = channel; };
+ const cChannel *GetChannel(void) { return channel; };
+ void ClearChannel(void) { channel = NULL; };
+ void SetEpgSearchFavorite(void) { isEpgSearchFavoritesMenu = true; };
+ void ClearEpgSearchFavorite(void) { isEpgSearchFavoritesMenu = false; };
+ bool DrawHeader(void);
+};
+
+#endif //__DISPLAYMENUVIEW_H
diff --git a/views/displaymessageview.c b/views/displaymessageview.c
new file mode 100644
index 0000000..c1ffe47
--- /dev/null
+++ b/views/displaymessageview.c
@@ -0,0 +1,53 @@
+#define __STL_CONFIG_H
+#include <vdr/menu.h>
+#include "displaymessageview.h"
+
+cDisplayMessageView::cDisplayMessageView(cTemplateView *tmplView) : cView(tmplView) {
+ DeleteOsdOnExit();
+ SetFadeTime(tmplView->GetNumericParameter(ptFadeTime));
+}
+
+cDisplayMessageView::~cDisplayMessageView() {
+ CancelSave();
+ FadeOut();
+}
+
+bool cDisplayMessageView::createOsd(void) {
+ cRect osdSize = tmplView->GetOsdSize();
+ bool ok = CreateOsd(cOsd::OsdLeft() + osdSize.X(),
+ cOsd::OsdTop() + osdSize.Y(),
+ osdSize.Width(),
+ osdSize.Height());
+ return ok;
+}
+
+void cDisplayMessageView::DrawBackground(void) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ DrawViewElement(veBackground, &stringTokens, &intTokens);
+}
+
+void cDisplayMessageView::DrawMessage(eMessageType type, const char *text) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string,string>("text", text));
+
+ intTokens.insert(pair<string,int>("status", (type == mtStatus) ? true : false));
+ intTokens.insert(pair<string,int>("info", (type == mtInfo) ? true : false));
+ intTokens.insert(pair<string,int>("warning", (type == mtWarning) ? true : false));
+ intTokens.insert(pair<string,int>("error", (type == mtError) ? true : false));
+
+ DrawViewElement(veMessage, &stringTokens, &intTokens);
+}
+
+void cDisplayMessageView::ClearMessage(void) {
+ ClearViewElement(veMessage);
+}
+
+void cDisplayMessageView::Action(void) {
+ SetInitFinished();
+ FadeIn();
+ DoFlush();
+ cView::Action();
+}
diff --git a/views/displaymessageview.h b/views/displaymessageview.h
new file mode 100644
index 0000000..2fc1428
--- /dev/null
+++ b/views/displaymessageview.h
@@ -0,0 +1,20 @@
+#ifndef __DISPLAYMESSAGEVIEW_H
+#define __DISPLAYMESSAGEVIEW_H
+
+#include "../libtemplate/template.h"
+#include "view.h"
+
+class cDisplayMessageView : public cView {
+private:
+ virtual void Action(void);
+public:
+ cDisplayMessageView(cTemplateView *tmplView);
+ virtual ~cDisplayMessageView();
+ bool createOsd(void);
+ void DrawBackground(void);
+ void DrawMessage(eMessageType type, const char *text);
+ void ClearMessage(void);
+ void DoFadeIn(void) { Start(); };
+ void Flush(void) { DoFlush(); };
+};
+#endif //__DISPLAYMESSAGEVIEW_H
diff --git a/views/displayreplayonpauseview.c b/views/displayreplayonpauseview.c
new file mode 100644
index 0000000..27aaa50
--- /dev/null
+++ b/views/displayreplayonpauseview.c
@@ -0,0 +1,107 @@
+#define __STL_CONFIG_H
+#include <vdr/player.h>
+#include "displayreplayonpauseview.h"
+
+cDisplayReplayOnPauseView::cDisplayReplayOnPauseView(cTemplateViewElement *tmplViewElement) : cView(tmplViewElement) {
+ tmplViewElement->SetPixOffset(0);
+ delay = tmplViewElement->GetNumericParameter(ptDelay) * 1000;
+ SetFadeTime(tmplViewElement->GetNumericParameter(ptFadeTime));
+ resetSleep = false;
+}
+
+cDisplayReplayOnPauseView::~cDisplayReplayOnPauseView() {
+ CancelSave();
+ FadeOut();
+}
+
+void cDisplayReplayOnPauseView::Render(void) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ map < string, vector< map< string, string > > > loopTokens;
+ const cRecording *recording = NULL;
+ cControl *control = cControl::Control();
+ if (control) {
+ recording = control->GetRecording();
+ }
+ if (recording) {
+ string name = recording->Name() ? recording->Name() : "";
+ stringTokens.insert(pair<string,string>("name", name));
+ const cRecordingInfo *info = recording->Info();
+ if (info) {
+ stringTokens.insert(pair<string,string>("shorttext", info->ShortText() ? info->ShortText() : ""));
+ stringTokens.insert(pair<string,string>("description", info->Description() ? info->Description() : ""));
+ const cEvent *event = info->GetEvent();
+ if (event) {
+ string recDate = *(event->GetDateString());
+ string recTime = *(event->GetTimeString());
+ if (recDate.find("1970") != string::npos) {
+ time_t start = recording->Start();
+ recDate = *DateString(start);
+ recTime = *TimeString(start);
+ }
+ stringTokens.insert(pair<string,string>("date", recDate.c_str()));
+ stringTokens.insert(pair<string,string>("time", recTime.c_str()));
+ time_t startTime = event->StartTime();
+ struct tm * sStartTime = localtime(&startTime);
+ intTokens.insert(pair<string, int>("year", sStartTime->tm_year + 1900));
+ intTokens.insert(pair<string, int>("daynumeric", sStartTime->tm_mday));
+ intTokens.insert(pair<string, int>("month", sStartTime->tm_mon+1));
+ int duration = event->Duration() / 60;
+ int recDuration = recording->LengthInSeconds();
+ recDuration = (recDuration>0)?(recDuration / 60):0;
+ intTokens.insert(pair<string,int>("duration", recDuration));
+ intTokens.insert(pair<string,int>("durationhours", recDuration / 60));
+ stringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", recDuration%60)));
+ intTokens.insert(pair<string,int>("durationevent", duration));
+ intTokens.insert(pair<string,int>("durationeventhours", duration / 60));
+ stringTokens.insert(pair<string,string>("durationeventminutes", *cString::sprintf("%.2d", duration%60)));
+ }
+ } else {
+ stringTokens.insert(pair<string,string>("shorttext", ""));
+ stringTokens.insert(pair<string,string>("description", ""));
+ int recDuration = recording->LengthInSeconds();
+ recDuration = (recDuration>0)?(recDuration / 60):0;
+ stringTokens.insert(pair<string,string>("date", ""));
+ stringTokens.insert(pair<string,string>("time", ""));
+ intTokens.insert(pair<string,int>("duration", recDuration));
+ intTokens.insert(pair<string,int>("durationhours", recDuration / 60));
+ stringTokens.insert(pair<string,string>("durationminutes", *cString::sprintf("%.2d", recDuration%60)));
+ intTokens.insert(pair<string,int>("durationevent", 0));
+ intTokens.insert(pair<string,int>("durationeventhours", 0));
+ stringTokens.insert(pair<string,string>("durationeventminutes", ""));
+ }
+ } else {
+ stringTokens.insert(pair<string,string>("name", ""));
+ stringTokens.insert(pair<string,string>("shorttext", ""));
+ stringTokens.insert(pair<string,string>("description", ""));
+ stringTokens.insert(pair<string,string>("date", ""));
+ stringTokens.insert(pair<string,string>("time", ""));
+ stringTokens.insert(pair<string,string>("durationminutes", ""));
+ stringTokens.insert(pair<string,string>("durationeventminutes", ""));
+ }
+ SetScraperTokens(NULL, recording, stringTokens, intTokens, loopTokens);
+ DrawViewElement(veOnPause, &stringTokens, &intTokens, &loopTokens);
+}
+
+void cDisplayReplayOnPauseView::Action(void) {
+ bool doContinue;
+ int sleepSlice = 10;
+ do {
+ doContinue = false;
+ for (int i = 0; Running() && (i*sleepSlice < delay); i++) {
+ cCondWait::SleepMs(sleepSlice);
+ if (resetSleep) {
+ doContinue = true;
+ resetSleep = false;
+ break;
+ }
+ }
+ } while (doContinue);
+
+ if (!Running())
+ return;
+ Render();
+ SetInitFinished();
+ FadeIn();
+ DoFlush();
+}
diff --git a/views/displayreplayonpauseview.h b/views/displayreplayonpauseview.h
new file mode 100644
index 0000000..b3498af
--- /dev/null
+++ b/views/displayreplayonpauseview.h
@@ -0,0 +1,20 @@
+#ifndef __DISPLAYREPLAYONPAUSEVIEW_H
+#define __DISPLAYREPLAYONPAUSEVIEW_H
+
+#include "../libtemplate/template.h"
+#include "view.h"
+#include "viewhelpers.h"
+
+class cDisplayReplayOnPauseView : public cView, public cViewHelpers {
+private:
+ int delay;
+ bool resetSleep;
+ virtual void Action(void);
+public:
+ cDisplayReplayOnPauseView(cTemplateViewElement *tmplViewElement);
+ virtual ~cDisplayReplayOnPauseView();
+ void ResetSleep(void) { resetSleep = true; };
+ void Render(void);
+ void Flush(void) { DoFlush(); };
+};
+#endif //__DISPLAYREPLAYONPAUSEVIEW_H
diff --git a/views/displayreplayview.c b/views/displayreplayview.c
new file mode 100644
index 0000000..dbd4cd3
--- /dev/null
+++ b/views/displayreplayview.c
@@ -0,0 +1,478 @@
+#define __STL_CONFIG_H
+#include <vdr/menu.h>
+#include "../services/scraper2vdr.h"
+#include "displayreplayview.h"
+#include "../libcore/helpers.h"
+
+cDisplayReplayView::cDisplayReplayView(cTemplateView *tmplView) : cView(tmplView) {
+ onPauseView = NULL;
+ numMarksLast = 0;
+ lastMarks = NULL;
+ markActive = -1;
+ DeleteOsdOnExit();
+ SetFadeTime(tmplView->GetNumericParameter(ptFadeTime));
+}
+
+cDisplayReplayView::~cDisplayReplayView() {
+ if (lastMarks) {
+ delete[] lastMarks;
+ }
+ if (onPauseView) {
+ delete onPauseView;
+ }
+ CancelSave();
+ FadeOut();
+}
+
+bool cDisplayReplayView::createOsd(void) {
+ cRect osdSize = tmplView->GetOsdSize();
+ bool ok = CreateOsd(cOsd::OsdLeft() + osdSize.X(),
+ cOsd::OsdTop() + osdSize.Y(),
+ osdSize.Width(),
+ osdSize.Height());
+ return ok;
+}
+
+void cDisplayReplayView::DrawBackground(bool modeOnly) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ if (modeOnly)
+ DrawViewElement(veBackgroundModeOnly, &stringTokens, &intTokens);
+ else
+ DrawViewElement(veBackground, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawDate(void) {
+ if (!ViewElementImplemented(veDateTime)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ if (!SetDate(stringTokens, intTokens)) {
+ return;
+ }
+
+ ClearViewElement(veDateTime);
+ DrawViewElement(veDateTime, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawTime(void) {
+ if (!ViewElementImplemented(veTime)) {
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ if (!SetTime(stringTokens, intTokens)) {
+ return;
+ }
+ ClearViewElement(veTime);
+ DrawViewElement(veTime, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawTitle(const cRecording *recording) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ const char *recName = NULL;
+ const cRecordingInfo *recInfo = recording->Info();
+ if (recInfo) {
+ recName = recInfo->Title();
+ }
+ if (!recName)
+ recName = recording->Name();
+ string recShortText = recInfo->ShortText() ? recInfo->ShortText() : "";
+ string recDate = *ShortDateString(recording->Start());
+ string recTime = *TimeString(recording->Start());
+
+ stringTokens.insert(pair<string,string>("rectitle", recName ? recName : ""));
+ stringTokens.insert(pair<string,string>("recsubtitle", recShortText));
+ stringTokens.insert(pair<string,string>("recdate", recDate));
+ stringTokens.insert(pair<string,string>("rectime", recTime));
+
+ DrawViewElement(veRecTitle, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawTitle(const char *title) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string,string>("rectitle", title));
+ stringTokens.insert(pair<string,string>("recsubtitle", ""));
+ stringTokens.insert(pair<string,string>("recdate", ""));
+ stringTokens.insert(pair<string,string>("rectime", ""));
+
+ DrawViewElement(veRecTitle, &stringTokens, &intTokens);
+}
+
+
+void cDisplayReplayView::DrawRecordingInformation(const cRecording *recording) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ int screenWidth = 0;
+ int screenHeight = 0;
+ double aspect = 0;
+ cDevice::PrimaryDevice()->GetVideoSize(screenWidth, screenHeight, aspect);
+ bool isHD = false;
+ string resName = GetScreenResolutionString(screenWidth, screenHeight, &isHD);
+ bool isWideScreen = false;
+ string aspectName = GetScreenAspectString(aspect, &isWideScreen);
+
+ intTokens.insert(pair<string,int>("screenwidth", screenWidth));
+ intTokens.insert(pair<string,int>("screenheight", screenHeight));
+ intTokens.insert(pair<string,int>("isHD", isHD));
+ intTokens.insert(pair<string,int>("isWideScreen", isWideScreen));
+ stringTokens.insert(pair<string,string>("resolution", resName));
+ stringTokens.insert(pair<string,string>("aspect", aspectName));
+
+ ClearViewElement(veRecInfo);
+ DrawViewElement(veRecInfo, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawScraperContent(const cRecording *recording) {
+ if (!recording)
+ return;
+
+ if (!ViewElementImplemented(veScraperContent)) {
+ return;
+ }
+
+ int mediaWidth = 0;
+ int mediaHeight = 0;
+ string mediaPath = "";
+ bool isBanner = false;
+ int posterWidth = 0;
+ int posterHeight = 0;
+ string posterPath = "";
+ bool hasPoster = false;
+ int bannerWidth = 0;
+ int bannerHeight = 0;
+ string bannerPath = "";
+ bool hasBanner = false;
+
+ static cPlugin *pScraper = GetScraperPlugin();
+ if (pScraper) {
+ ScraperGetPosterBannerV2 call;
+ call.event = NULL;
+ call.recording = recording;
+ if (pScraper->Service("GetPosterBannerV2", &call)) {
+ if ((call.type == tSeries) && call.banner.path.size() > 0) {
+ mediaWidth = call.banner.width;
+ mediaHeight = call.banner.height;
+ mediaPath = call.banner.path;
+ isBanner = true;
+ bannerWidth = mediaWidth;
+ bannerHeight = mediaHeight;
+ bannerPath = mediaPath;
+ hasBanner = true;
+
+ ScraperGetPoster callPoster;
+ callPoster.event = NULL;
+ callPoster.recording = recording;
+ if (pScraper->Service("GetPoster", &callPoster)) {
+ posterWidth = callPoster.poster.width;
+ posterHeight = callPoster.poster.height;
+ posterPath = callPoster.poster.path;
+ hasPoster = true;
+ }
+ } else if (call.type == tMovie && call.poster.path.size() > 0 && call.poster.height > 0) {
+ mediaWidth = call.poster.width;
+ mediaHeight = call.poster.height;
+ mediaPath = call.poster.path;
+ posterWidth = call.poster.width;
+ posterHeight = call.poster.height;
+ posterPath = call.poster.path;
+ hasPoster = true;
+ }
+ }
+ }
+ map < string, int > intTokens;
+ map < string, string > stringTokens;
+ intTokens.insert(pair<string,int>("mediawidth", mediaWidth));
+ intTokens.insert(pair<string,int>("mediaheight", mediaHeight));
+ intTokens.insert(pair<string,int>("isbanner", isBanner));
+ stringTokens.insert(pair<string,string>("mediapath", mediaPath));
+ intTokens.insert(pair<string,int>("posterwidth", posterWidth));
+ intTokens.insert(pair<string,int>("posterheight", posterHeight));
+ stringTokens.insert(pair<string,string>("posterpath", posterPath));
+ intTokens.insert(pair<string,int>("hasposter", hasPoster));
+ intTokens.insert(pair<string,int>("bannerwidth", bannerWidth));
+ intTokens.insert(pair<string,int>("bannerheight", bannerHeight));
+ stringTokens.insert(pair<string,string>("bannerpath", bannerPath));
+ intTokens.insert(pair<string,int>("hasbanner", hasBanner));
+ ClearViewElement(veScraperContent);
+ DrawViewElement(veScraperContent, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawCurrent(const char *current) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ stringTokens.insert(pair<string,string>("reccurrent", current));
+
+ ClearViewElement(veRecCurrent);
+ DrawViewElement(veRecCurrent, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawTotal(const char *total) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ stringTokens.insert(pair<string,string>("rectotal", total));
+
+ ClearViewElement(veRecTotal);
+ DrawViewElement(veRecTotal, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawProgressBar(int current, int total) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ intTokens.insert(pair<string,int>("current", current));
+ intTokens.insert(pair<string,int>("total", total));
+ stringTokens.insert(pair<string,string>("dummy", ""));
+ ClearViewElement(veRecProgressBar);
+ DrawViewElement(veRecProgressBar, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawMarks(const cMarks *marks, int current, int total) {
+ if (!marks)
+ return;
+ if (!MarksChanged(marks, current))
+ return;
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ map < string, vector< map< string, string > > > loopTokens;
+ vector< map< string, string > > markTokens;
+ stringstream tot;
+ tot << total;
+
+ bool isStartMark = true;
+ for (const cMark *m = marks->First(); m; m = marks->Next(m)) {
+ map< string, string > markVals;
+ stringstream pos;
+ pos << m->Position();
+ markVals.insert(pair< string, string >("marks[position]", pos.str()));
+ markVals.insert(pair< string, string >("marks[total]", tot.str()));
+ markVals.insert(pair< string, string >("marks[startmark]", isStartMark ? "1" : "0"));
+ markVals.insert(pair< string, string >("marks[active]", (m->Position() == current) ? "1" : "0"));
+ const cMark *m2 = marks->Next(m);
+ if (m2) {
+ stringstream posNext;
+ posNext << m2->Position();
+ markVals.insert(pair< string, string >("marks[endposition]", posNext.str()));
+ } else {
+ markVals.insert(pair< string, string >("marks[endposition]", tot.str()));
+ }
+ isStartMark = !isStartMark;
+ markTokens.push_back(markVals);
+ }
+ loopTokens.insert(pair< string, vector< map< string, string > > >("marks", markTokens));
+
+ ClearViewElement(veCuttingMarks);
+ DrawViewElement(veCuttingMarks, &stringTokens, &intTokens, &loopTokens);
+}
+
+void cDisplayReplayView::DrawControlIcons(bool play, bool forward, int speed, bool modeOnly) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ bool isPlay = false;
+ bool isPause = false;
+ bool isFF = false;
+ bool isFF1x = false;
+ bool isFF2x = false;
+ bool isFF3x = false;
+ bool isRew = false;
+ bool isRew1x = false;
+ bool isRew2x = false;
+ bool isRew3x = false;
+
+ if (speed == -1) {
+ if (play) {
+ isPlay = true;
+ } else {
+ isPause = true;
+ }
+ } else if (forward) {
+ if (!play) {
+ isPause = true;
+ }
+ if (speed == 1) {
+ isFF1x = true;
+ } else if (speed == 2) {
+ isFF2x = true;
+ } else if (speed == 3) {
+ isFF3x = true;
+ } else {
+ isFF = true;
+ }
+ } else {
+ if (!play) {
+ isPause = true;
+ }
+ if (speed == 1) {
+ isRew1x = true;
+ } else if (speed == 2) {
+ isRew2x = true;
+ } else if (speed == 3) {
+ isRew3x = true;
+ } else {
+ isRew = true;
+ }
+ }
+ intTokens.insert(pair<string,int>("play", isPlay));
+ intTokens.insert(pair<string,int>("pause", isPause));
+ intTokens.insert(pair<string,int>("forward", isFF));
+ intTokens.insert(pair<string,int>("forward1x", isFF1x));
+ intTokens.insert(pair<string,int>("forward2x", isFF2x));
+ intTokens.insert(pair<string,int>("forward3x", isFF3x));
+ intTokens.insert(pair<string,int>("rewind", isRew));
+ intTokens.insert(pair<string,int>("rewind1x", isRew1x));
+ intTokens.insert(pair<string,int>("rewind2x", isRew2x));
+ intTokens.insert(pair<string,int>("rewind3x", isRew3x));
+
+ if (modeOnly) {
+ ClearViewElement(veControlIconsModeOnly);
+ DrawViewElement(veControlIconsModeOnly, &stringTokens, &intTokens);
+ } else {
+ ClearViewElement(veControlIcons);
+ DrawViewElement(veControlIcons, &stringTokens, &intTokens);
+ }
+}
+
+void cDisplayReplayView::DrawJump(const char *jump) {
+ if (!jump) {
+ ClearViewElement(veRecJump);
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ stringTokens.insert(pair<string,string>("jump", jump));
+
+ ClearViewElement(veRecJump);
+ DrawViewElement(veRecJump, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawMessage(eMessageType type, const char *text) {
+ if (!text) {
+ ClearViewElement(veMessage);
+ return;
+ }
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ stringTokens.insert(pair<string,string>("text", text));
+
+ intTokens.insert(pair<string,int>("status", (type == mtStatus) ? true : false));
+ intTokens.insert(pair<string,int>("info", (type == mtInfo) ? true : false));
+ intTokens.insert(pair<string,int>("warning", (type == mtWarning) ? true : false));
+ intTokens.insert(pair<string,int>("error", (type == mtError) ? true : false));
+
+ ClearViewElement(veMessage);
+ DrawViewElement(veMessage, &stringTokens, &intTokens);
+}
+
+void cDisplayReplayView::DrawOnPause(bool modeOnly) {
+ eViewElement veTmplOnPause = modeOnly ? veOnPauseModeOnly : veOnPause;
+ cTemplateViewElement *tmplOnPause = tmplView->GetViewElement(veTmplOnPause);
+ if (!tmplOnPause)
+ return;
+ onPauseView = new cDisplayReplayOnPauseView(tmplOnPause);
+ onPauseView->Start();
+}
+
+void cDisplayReplayView::ClearOnPause(void) {
+ if (onPauseView) {
+ delete onPauseView;
+ onPauseView = NULL;
+ }
+}
+
+void cDisplayReplayView::DelayOnPause(void) {
+ if (onPauseView) {
+ onPauseView->ResetSleep();
+ }
+}
+
+void cDisplayReplayView::DrawCustomTokens(void) {
+ if (!ViewElementImplemented(veCustomTokens)) {
+ return;
+ }
+ if (!tmplView)
+ return;
+ map < string, string > stringTokens = tmplView->GetCustomStringTokens();
+ map < string, int > intTokens = tmplView->GetCustomIntTokens();
+ DrawViewElement(veCustomTokens, &stringTokens, &intTokens);
+}
+
+/****************************************************************************************
+* Private Functions
+*****************************************************************************************/
+
+bool cDisplayReplayView::MarksChanged(const cMarks *marks, int current) {
+ if (!marks)
+ return false;
+
+ bool redraw = false;
+ //if mark was active, we redraw always
+ if (markActive >= 0) {
+ markActive = -1;
+ redraw = true;
+ }
+ //check if current position in recording hits mark exactly
+ for (const cMark *m = marks->First(); m; m = marks->Next(m)) {
+ if (m->Position() == current) {
+ markActive = current;
+ redraw = true;
+ break;
+ }
+ }
+ if (redraw)
+ return true;
+ //if number of marks has changed, redraw
+ int numMarks = marks->Count();
+ if (numMarks != numMarksLast) {
+ RememberMarks(marks);
+ return true;
+ }
+ if (!lastMarks)
+ return false;
+ //if position has changed, redraw
+ int i=0;
+ for (const cMark *m = marks->First(); m; m = marks->Next(m)) {
+ if (m->Position() != lastMarks[i]) {
+ RememberMarks(marks);
+ return true;
+ }
+ i++;
+ }
+ return false;
+}
+
+void cDisplayReplayView::RememberMarks(const cMarks *marks) {
+ if (!marks)
+ return;
+ numMarksLast = marks->Count();
+ if (numMarksLast < 1)
+ return;
+ if (lastMarks) {
+ delete[] lastMarks;
+ }
+ lastMarks = new int[numMarksLast];
+ int i=0;
+ for (const cMark *m = marks->First(); m; m = marks->Next(m)) {
+ lastMarks[i] = m->Position();
+ i++;
+ }
+}
+
+void cDisplayReplayView::Action(void) {
+ SetInitFinished();
+ FadeIn();
+ DoFlush();
+ cView::Action();
+}
diff --git a/views/displayreplayview.h b/views/displayreplayview.h
new file mode 100644
index 0000000..d5342c1
--- /dev/null
+++ b/views/displayreplayview.h
@@ -0,0 +1,42 @@
+#ifndef __DISPLAYREPLAYVIEW_H
+#define __DISPLAYREPLAYVIEW_H
+
+#include "../libtemplate/template.h"
+#include "view.h"
+#include "displayreplayonpauseview.h"
+
+class cDisplayReplayView : public cView, public cViewHelpers {
+private:
+ cDisplayReplayOnPauseView *onPauseView;
+ int numMarksLast;
+ int *lastMarks;
+ int markActive;
+ bool MarksChanged(const cMarks *marks, int current);
+ void RememberMarks(const cMarks *marks);
+ virtual void Action(void);
+public:
+ cDisplayReplayView(cTemplateView *tmplView);
+ virtual ~cDisplayReplayView();
+ bool createOsd(void);
+ void DrawBackground(bool modeOnly);
+ void DrawDate(void);
+ void DrawTime(void);
+ void DrawTitle(const cRecording *recording);
+ void DrawTitle(const char *title);
+ void DrawRecordingInformation(const cRecording *recording);
+ void DrawScraperContent(const cRecording *recording);
+ void DrawCurrent(const char *current);
+ void DrawTotal(const char *total);
+ void DrawProgressBar(int current, int total);
+ void DrawMarks(const cMarks *marks, int current, int total);
+ void DrawControlIcons(bool play, bool forward, int speed, bool modeOnly);
+ void DrawJump(const char *jump);
+ void DrawMessage(eMessageType type, const char *text);
+ void DrawOnPause(bool modeOnly);
+ void ClearOnPause(void);
+ void DelayOnPause(void);
+ void DrawCustomTokens(void);
+ void DoFadeIn(void) { Start(); };
+ void Flush(void) { DoFlush(); };
+};
+#endif //__DISPLAYREPLAYVIEW_H
diff --git a/views/displayvolumeview.c b/views/displayvolumeview.c
new file mode 100644
index 0000000..4ab2fdd
--- /dev/null
+++ b/views/displayvolumeview.c
@@ -0,0 +1,55 @@
+#define __STL_CONFIG_H
+#include <vdr/menu.h>
+#include "displayvolumeview.h"
+
+cDisplayVolumeView::cDisplayVolumeView(cTemplateView *tmplView) : cView(tmplView) {
+ volumeLast = -1;
+ muteLast = false;
+ DeleteOsdOnExit();
+ SetFadeTime(tmplView->GetNumericParameter(ptFadeTime));
+}
+
+cDisplayVolumeView::~cDisplayVolumeView() {
+ CancelSave();
+ FadeOut();
+}
+
+bool cDisplayVolumeView::createOsd(void) {
+ cRect osdSize = tmplView->GetOsdSize();
+ bool ok = CreateOsd(cOsd::OsdLeft() + osdSize.X(),
+ cOsd::OsdTop() + osdSize.Y(),
+ osdSize.Width(),
+ osdSize.Height());
+ return ok;
+}
+
+void cDisplayVolumeView::DrawBackground(void) {
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+ DrawViewElement(veBackground, &stringTokens, &intTokens);
+}
+
+void cDisplayVolumeView::DrawVolume(int current, int total, bool mute) {
+ if ((volumeLast == current) && (muteLast == mute))
+ return;
+ volumeLast = current;
+ muteLast = mute;
+
+ map < string, string > stringTokens;
+ map < string, int > intTokens;
+
+ intTokens.insert(pair<string,int>("volume", current));
+ intTokens.insert(pair<string,int>("maxvolume", total));
+ intTokens.insert(pair<string,int>("volpercent", (double)current *100 / (double)total));
+ intTokens.insert(pair<string,int>("mute", mute));
+
+ ClearViewElement(veVolume);
+ DrawViewElement(veVolume, &stringTokens, &intTokens);
+}
+
+void cDisplayVolumeView::Action(void) {
+ SetInitFinished();
+ FadeIn();
+ DoFlush();
+ cView::Action();
+}
diff --git a/views/displayvolumeview.h b/views/displayvolumeview.h
new file mode 100644
index 0000000..544426e
--- /dev/null
+++ b/views/displayvolumeview.h
@@ -0,0 +1,21 @@
+#ifndef __DISPLAYVOLUMEVIEW_H
+#define __DISPLAYVOLUMEVIEW_H
+
+#include "../libtemplate/template.h"
+#include "view.h"
+
+class cDisplayVolumeView : public cView {
+private:
+ int volumeLast;
+ bool muteLast;
+ virtual void Action(void);
+public:
+ cDisplayVolumeView(cTemplateView *tmplView);
+ virtual ~cDisplayVolumeView();
+ bool createOsd(void);
+ void DrawBackground(void);
+ void DrawVolume(int current, int total, bool mute);
+ void DoFadeIn(void) { Start(); };
+ void Flush(void) { DoFlush(); };
+};
+#endif //__DISPLAYVOLUMEVIEW_H
diff --git a/views/view.c b/views/view.c
new file mode 100644
index 0000000..2b9c4bf
--- /dev/null
+++ b/views/view.c
@@ -0,0 +1,839 @@
+#include "view.h"
+#include "../config.h"
+#include "../libcore/helpers.h"
+#include "../libcore/imageloader.h"
+
+using namespace std;
+
+cView::cView(cTemplateView *tmplView) : cPixmapContainer(tmplView->GetNumPixmaps()) {
+ this->tmplView = tmplView;
+ tvScaled = tmplView->GetScalingWindow(scalingWindow);
+ if (tvScaled) {
+ cDevice::PrimaryDevice()->ScaleVideo(scalingWindow);
+ }
+ tmplItem = NULL;
+ tmplTab = NULL;
+ Init();
+}
+
+cView::cView(cTemplateViewElement *tmplItem) : cPixmapContainer(tmplItem->GetNumPixmaps()) {
+ this->tmplItem = tmplItem;
+ tmplView = NULL;
+ tmplTab = NULL;
+ tvScaled = false;
+ Init();
+}
+
+cView::cView(cTemplateViewTab *tmplTab) : cPixmapContainer(1) {
+ this->tmplTab = tmplTab;
+ tmplView = NULL;
+ tmplItem = NULL;
+ tvScaled = false;
+ Init();
+}
+
+cView::~cView() {
+ if (tvScaled) {
+ cDevice::PrimaryDevice()->ScaleVideo(cRect::Null);
+ }
+}
+
+void cView::Init(void) {
+ viewInit = true;
+ scrolling = false;
+ veScroll = veUndefined;
+ scrollingPix = -1;
+ scrollOrientation = orHorizontal;
+ scrollDelay = 0;
+ scrollMode = smNone;
+ scrollSpeed = ssMedium;
+ currentlyScrolling = false;
+}
+
+void cView::Action(void) {
+ if (scrolling) {
+ DoSleep(scrollDelay);
+ if (scrollOrientation == orHorizontal) {
+ ActivateScrolling();
+ ScrollHorizontal(scrollingPix, scrollDelay, scrollSpeed, scrollMode);
+ } else {
+ ScrollVertical(scrollingPix, scrollDelay, scrollSpeed);
+ }
+ }
+}
+
+void cView::Stop(void) {
+ CancelSave();
+}
+
+/********************************************************************************
+* Protected Functions
+********************************************************************************/
+
+void cView::DrawViewElement(eViewElement ve, map <string,string> *stringTokens, map <string,int> *intTokens, map < string, vector< map< string, string > > > *loopTokens) {
+ //setting correct ViewElement, depending which constructor was used
+ cTemplateViewElement *viewElement;
+ if (tmplItem && (ve == veMenuCurrentItemDetail || ve == veOnPause)) {
+ viewElement = tmplItem;
+ } else if (tmplView) {
+ viewElement = tmplView->GetViewElement(ve);
+ }
+ if (!viewElement)
+ return;
+
+ if (viewElement->DebugTokens()) {
+ DebugTokens(tmplView ? (tmplView->GetViewElementName(ve)) : "current view", stringTokens, intTokens, loopTokens);
+ }
+ //iterate through pixmaps of viewelement
+ int pixCurrent = viewElement->GetPixOffset();
+ if (pixCurrent < 0)
+ return;
+ viewElement->InitIterator();
+ cTemplatePixmap *pix = NULL;
+ while(pix = viewElement->GetNextPixmap()) {
+ //reset Template
+ pix->ClearDynamicParameters();
+ //create Pixmap if already fully parsed
+ if (!PixmapExists(pixCurrent) && pix->Ready() && pix->DoExecute() && !pix->Scrolling()) {
+ CreateViewPixmap(pixCurrent, pix);
+ }
+ //check if pixmap needs dynamic parameters
+ if ((!pix->Ready() || !pix->DoExecute()) && !pix->Scrolling()) {
+ //parse dynamic parameters and initiate functions
+ pix->ParseDynamicParameters(intTokens, true);
+ if (pix->Ready() && pix->DoExecute()) {
+ CreateViewPixmap(pixCurrent, pix);
+ }
+ } else {
+ //parse dynamic parameters but not initiate functions
+ pix->ParseDynamicParameters(intTokens, false);
+ }
+ //if pixmap still not valid, skip
+ if (!pix->Ready() && !pix->Scrolling()) {
+ pixCurrent++;
+ continue;
+ }
+ //if condition for pixmap set, check if cond is true
+ if (!pix->DoExecute()) {
+ pixCurrent++;
+ continue;
+ }
+ //parse dynamic tokens of pixmap functions
+ pix->ClearDynamicFunctionParameters();
+ pix->ParseDynamicFunctionParameters(stringTokens, intTokens);
+
+ if (!PixmapExists(pixCurrent) && pix->Scrolling()) {
+ cSize drawportSize;
+ scrolling = pix->CalculateDrawPortSize(drawportSize, loopTokens);
+ if (scrolling) {
+ CreateScrollingPixmap(pixCurrent, pix, drawportSize);
+ pix->SetScrollingTextWidth();
+ veScroll = ve;
+ scrollingPix = pixCurrent;
+ scrollOrientation = pix->GetNumericParameter(ptOrientation);
+ scrollMode = pix->GetNumericParameter(ptScrollMode);
+ scrollDelay = pix->GetNumericParameter(ptDelay);
+ scrollSpeed = pix->GetNumericParameter(ptScrollSpeed);
+ } else {
+ CreateViewPixmap(pixCurrent, pix);
+ }
+ }
+ if (pix->DoDebug()) {
+ pix->Debug();
+ }
+
+ DrawPixmap(pixCurrent, pix, loopTokens);
+ pixCurrent++;
+ }
+}
+
+void cView::ClearViewElement(eViewElement ve) {
+ if (!tmplView)
+ return;
+ cTemplateViewElement *viewElement = tmplView->GetViewElement(ve);
+ if (!viewElement)
+ return;
+ int pixCurrent = viewElement->GetPixOffset();
+ if (pixCurrent < 0)
+ return;
+ cTemplatePixmap *pix = NULL;
+ viewElement->InitIterator();
+ while(pix = viewElement->GetNextPixmap()) {
+ Fill(pixCurrent, clrTransparent);
+ pixCurrent++;
+ }
+}
+
+void cView::ActivateScrolling(void) {
+ if (veScroll == veUndefined)
+ return;
+ cTemplateViewElement *scrollViewElement = NULL;
+ if (tmplView) {
+ scrollViewElement = tmplView->GetViewElement(veScroll);
+ }
+ if (!scrollViewElement)
+ return;
+
+ ClearViewElement(veScroll);
+ currentlyScrolling = true;
+
+ int pixCurrent = scrollViewElement->GetPixOffset();
+ if (pixCurrent < 0)
+ return;
+ scrollViewElement->InitIterator();
+ cTemplatePixmap *pix = NULL;
+ while(pix = scrollViewElement->GetNextPixmap()) {
+ DrawPixmap(pixCurrent, pix);
+ pixCurrent++;
+ }
+}
+
+bool cView::ViewElementImplemented(eViewElement ve) {
+ return tmplView->GetNumPixmapsViewElement(ve);
+}
+
+void cView::CreateViewPixmap(int num, cTemplatePixmap *pix, cRect *size) {
+ cRect pixSize;
+ if (size) {
+ pixSize = *size;
+ } else {
+ pixSize = pix->GetPixmapSize();
+ }
+ int layer = pix->GetNumericParameter(ptLayer);
+ int transparency = pix->GetNumericParameter(ptTransparency);
+ SetTransparency(num, transparency);
+ CreatePixmap(num, layer, pixSize);
+}
+
+void cView::CreateScrollingPixmap(int num, cTemplatePixmap *pix, cSize &drawportSize) {
+ cRect pixViewPort = pix->GetPixmapSize();
+ cRect drawPort;
+ drawPort.SetX(0);
+ drawPort.SetY(0);
+ drawPort.SetWidth(drawportSize.Width());
+ drawPort.SetHeight(drawportSize.Height());
+ int layer = pix->GetNumericParameter(ptLayer);
+ int transparency = pix->GetNumericParameter(ptTransparency);
+ SetTransparency(num, transparency);
+ CreatePixmap(num, layer, pixViewPort, drawPort);
+}
+
+void cView::DrawPixmap(int num, cTemplatePixmap *pix, map < string, vector< map< string, string > > > *loopTokens, bool flushPerLoop) {
+ pix->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = pix->GetNextFunction()) {
+ eFuncType type = func->GetType();
+ if (func->DoDebug()) {
+ func->Debug();
+ }
+ if (!func->DoExecute()) {
+ continue;
+ }
+ switch (type) {
+ case ftFill:
+ DoFill(num, func);
+ break;
+ case ftDrawText:
+ DoDrawText(num, func);
+ break;
+ case ftDrawTextBox: {
+ int floating = func->GetNumericParameter(ptFloat);
+ if (floating > flNone) {
+ DoDrawFloatingTextBox(num, func);
+ } else {
+ DoDrawTextBox(num, func);
+ }
+ break; }
+ case ftDrawRectangle:
+ DoDrawRectangle(num, func);
+ break;
+ case ftDrawEllipse:
+ DoDrawEllipse(num, func);
+ break;
+ case ftDrawSlope:
+ DoDrawSlope(num, func);
+ break;
+ case ftDrawImage:
+ DoDrawImage(num, func);
+ break;
+ case ftLoop:
+ if (loopTokens)
+ DrawLoop(num, func, loopTokens);
+ break;
+ default:
+ break;
+ }
+ if (flushPerLoop) {
+ DoFlush();
+ }
+ }
+}
+
+void cView::DrawLoop(int numPixmap, cTemplateFunction *func, map < string, vector< map< string, string > > > *loopTokens) {
+ cTemplateLoopFunction *loopFunc = dynamic_cast<cTemplateLoopFunction*>(func);
+ if (!loopFunc)
+ return;
+
+ int loopX0 = loopFunc->GetNumericParameter(ptX);
+ if (loopX0 < 0) loopX0 = 0;
+ int loopY0 = loopFunc->GetNumericParameter(ptY);
+ if (loopY0 < 0) loopY0 = 0;
+ int orientation = loopFunc->GetNumericParameter(ptOrientation);
+ int loopWidth = loopFunc->GetNumericParameter(ptWidth);
+ if (loopWidth <= 0)
+ loopWidth = loopFunc->GetContainerWidth();
+ int loopHeight = loopFunc->GetNumericParameter(ptHeight);
+ if (loopHeight <= 0)
+ loopHeight = loopFunc->GetContainerHeight();
+ int columnWidth = loopFunc->GetNumericParameter(ptColumnWidth);
+ int rowHeight = loopFunc->GetNumericParameter(ptRowHeight);
+ int overflow = loopFunc->GetNumericParameter(ptOverflow);
+ int maxItems = loopFunc->GetNumericParameter(ptNumElements);
+
+ int x0 = loopX0;
+ int y0 = loopY0;
+
+ string loopTokenName = loopFunc->GetParameter(ptName);
+
+ map < string, vector< map< string, string > > >::iterator hit = loopTokens->find(loopTokenName);
+ if (hit == loopTokens->end())
+ return;
+ vector< map<string,string> > loopToken = hit->second;
+ int lineNumber=0;
+ for (vector< map<string,string> >::iterator line = loopToken.begin(); line != loopToken.end(); line++) {
+ //check overflow behaviour
+ if (overflow == otCut) {
+ if (orientation == orHorizontal) {
+ if (lineNumber * columnWidth > loopWidth) {
+ return;
+ }
+ } else if (orientation == orVertical) {
+ if (lineNumber * rowHeight > loopHeight) {
+ return;
+ }
+ }
+ } else if (overflow == otWrap && orientation == orHorizontal) {
+ if (x0 + columnWidth > loopWidth) {
+ x0 = loopX0;
+ if (rowHeight > 0) {
+ y0 += rowHeight;
+ } else {
+ y0 += loopFunc->GetLoopElementsHeight();
+ }
+ }
+ }
+ map<string,string> tokens = *line;
+ loopFunc->ClearDynamicParameters();
+ loopFunc->ParseDynamicParameters(&tokens);
+ loopFunc->InitIterator();
+ cTemplateFunction *func = NULL;
+ while(func = loopFunc->GetNextFunction()) {
+ //do debug?
+ if (func->DoDebug())
+ func->Debug();
+ //check if set condition is true
+ if (!func->DoExecute()) {
+ continue;
+ }
+ //execute
+ eFuncType type = func->GetType();
+ switch (type) {
+ case ftDrawText:
+ DoDrawText(numPixmap, func, x0, y0);
+ break;
+ case ftDrawTextBox:
+ DoDrawTextBox(numPixmap, func, x0, y0);
+ break;
+ case ftDrawRectangle:
+ DoDrawRectangle(numPixmap, func, x0, y0);
+ break;
+ case ftDrawEllipse:
+ DoDrawEllipse(numPixmap, func, x0, y0);
+ break;
+ case ftDrawSlope:
+ DoDrawSlope(numPixmap, func, x0, y0);
+ break;
+ case ftDrawImage:
+ DoDrawImage(numPixmap, func, x0, y0);
+ break;
+ default:
+ break;
+ }
+ }
+ //calculate position of next loop element
+ if (orientation == orHorizontal) {
+ if (columnWidth > 0) {
+ x0 += columnWidth;
+ } else {
+ x0 += loopFunc->GetLoopElementsWidth();
+ }
+ } else if (orientation == orVertical) {
+ if (rowHeight > 0) {
+ y0 += rowHeight;
+ } else {
+ y0 += loopFunc->GetLoopElementsHeight();
+ }
+ }
+ lineNumber++;
+ //DoFlush();
+ }
+}
+
+void cView::DebugTokens(string viewElement, map<string,string> *stringTokens, map<string,int> *intTokens, map < string, vector< map< string, string > > > *loopTokens) {
+ esyslog("skindesigner: ------------------------------ Tokens for %s:", viewElement.c_str());
+ if (stringTokens) {
+ for (map<string,string>::iterator st = stringTokens->begin(); st != stringTokens->end(); st++) {
+ esyslog("skindesigner: string var \"%s\" = \"%s\"", (st->first).c_str(), (st->second).c_str());
+ }
+ }
+ if (intTokens) {
+ for (map<string,int>::iterator it = intTokens->begin(); it != intTokens->end(); it++) {
+ esyslog("skindesigner: int var \"%s\" = %d", (it->first).c_str(), it->second);
+ }
+ }
+ if (loopTokens) {
+ for(map < string, vector< map< string, string > > >::iterator it1 = loopTokens->begin(); it1 != loopTokens->end(); it1++) {
+ int line = 0;
+ string tokenName = it1->first;
+ vector< map<string,string> > tokens = it1->second;
+ esyslog("skindesigner: loop token %s", tokenName.c_str());
+ for (vector< map<string,string> >::iterator it2 = tokens.begin(); it2 != tokens.end(); it2++) {
+ esyslog("skindesigner: loop tokens line %d:", line++);
+ map<string,string> element = *it2;
+ for (map<string,string>::iterator el = element.begin(); el != element.end(); el++) {
+ esyslog("skindesigner: name: %s, value: %s", (el->first).c_str(), (el->second).c_str());
+ }
+ }
+ }
+ }
+}
+
+/*****************************************************************
+* Private Functions
+*****************************************************************/
+
+void cView::DoFill(int num, cTemplateFunction *func) {
+ tColor col = func->GetColorParameter(ptColor);
+ Fill(num, col);
+}
+
+void cView::DoDrawText(int num, cTemplateFunction *func, int x0, int y0) {
+ int x = func->GetNumericParameter(ptX);
+ if (x < 0) x = 0;
+ x += x0;
+ int y = func->GetNumericParameter(ptY);
+ if (y < 0) y = 0;
+ y += y0;
+ cPoint pos(x,y);
+ string fontName = func->GetFontName();
+ int fontSize = func->GetNumericParameter(ptFontSize);
+ tColor clr = func->GetColorParameter(ptColor);
+ tColor clrBack = clrTransparent;
+ string text = "";
+ if (!currentlyScrolling) {
+ text = func->GetText(true);
+ } else {
+ text = func->GetText(false);
+ }
+ DrawText(num, pos, text.c_str(), clr, clrBack, fontName, fontSize);
+}
+
+void cView::DoDrawTextBox(int num, cTemplateFunction *func, int x0, int y0) {
+ string text = func->GetText(false);
+ if (text.size() < 3)
+ return;
+ int x = func->GetNumericParameter(ptX);
+ int y = func->GetNumericParameter(ptY);
+ if (x < 0) x = 0;
+ x += x0;
+ if (y < 0) y = 0;
+ y += y0;
+ int width = func->GetNumericParameter(ptWidth);
+ int height = func->GetNumericParameter(ptHeight);
+ string fontName = func->GetFontName();
+ int fontSize = func->GetNumericParameter(ptFontSize);
+ int align = func->GetNumericParameter(ptAlign);
+ int maxLines = func->GetNumericParameter(ptMaxLines);
+ tColor clr = func->GetColorParameter(ptColor);
+ tColor clrBack = clrTransparent;
+ const cFont *font = fontManager->Font(fontName, fontSize);
+ if (!font)
+ return;
+ cTextWrapper wrapper;
+ wrapper.Set(text.c_str(), font, width);
+ int fontHeight = fontManager->Height(fontName, fontSize);
+ int lines = wrapper.Lines();
+ int yLine = y;
+ for (int line=0; line < lines; line++) {
+ int xLine = x;
+ if (align == alCenter) {
+ int textWidth = font->Width(wrapper.GetLine(line));
+ xLine += (width - textWidth)/2;
+ } else if (align == alRight) {
+ int textWidth = font->Width(wrapper.GetLine(line));
+ xLine += (width - textWidth);
+ }
+ cPoint pos(xLine, yLine);
+ if (maxLines > 0 && line == maxLines-1) {
+ string lastLine = wrapper.GetLine(line);
+ if (lines > maxLines) {
+ lastLine += "...";
+ }
+ DrawText(num, pos, lastLine.c_str(), clr, clrBack, fontName, fontSize);
+ break;
+ } else if (height > 0 && yLine - y + 2*fontHeight > height) {
+ DrawText(num, pos, "...", clr, clrBack, fontName, fontSize);
+ break;
+ }
+ DrawText(num, pos, wrapper.GetLine(line), clr, clrBack, fontName, fontSize);
+ yLine += fontHeight;
+ }
+}
+
+void cView::DoDrawFloatingTextBox(int num, cTemplateFunction *func) {
+ string text = func->GetText(false);
+ if (text.size() < 3)
+ return;
+ int x = func->GetNumericParameter(ptX);
+ int y = func->GetNumericParameter(ptY);
+ if (x < 0) x = 0;
+ if (y < 0) y = 0;
+ int width = func->GetNumericParameter(ptWidth);
+ int height = func->GetNumericParameter(ptHeight);
+ string fontName = func->GetFontName();
+ int fontSize = func->GetNumericParameter(ptFontSize);
+ tColor clr = func->GetColorParameter(ptColor);
+ tColor clrBack = clrTransparent;
+ const cFont *font = fontManager->Font(fontName, fontSize);
+ if (!font)
+ return;
+ int floatType = func->GetNumericParameter(ptFloat);
+ int floatWidth = func->GetNumericParameter(ptFloatWidth);
+ int floatHeight = func->GetNumericParameter(ptFloatHeight);
+
+ cTextWrapper wTextTall;
+ cTextWrapper wTextFull;
+
+ int fontHeight = fontManager->Height(fontName, fontSize);
+ int linesNarrow = floatHeight / fontHeight;
+ int widthNarrow = width - floatWidth;
+ int linesDrawn = 0;
+ int curY = 0;
+ bool drawNarrow = true;
+
+ splitstring s(text.c_str());
+ std::vector<std::string> flds = s.split('\n', 1);
+
+ if (flds.size() < 1)
+ return;
+
+ std::stringstream sstrTextTall;
+ std::stringstream sstrTextFull;
+
+ for (int i=0; i<flds.size(); i++) {
+ if (!flds[i].size()) {
+ //empty line
+ linesDrawn++;
+ curY += fontHeight;
+ if (drawNarrow)
+ sstrTextTall << "\n";
+ else
+ sstrTextFull << "\n";
+ } else {
+ cTextWrapper wrapper;
+ if (drawNarrow) {
+ wrapper.Set((flds[i].c_str()), font, widthNarrow);
+ int newLines = wrapper.Lines();
+ //check if wrapper fits completely into narrow area
+ if (linesDrawn + newLines < linesNarrow) {
+ for (int line = 0; line < wrapper.Lines(); line++) {
+ sstrTextTall << wrapper.GetLine(line) << " ";
+ }
+ sstrTextTall << "\n";
+ linesDrawn += newLines;
+ } else {
+ //this wrapper has to be splitted
+ for (int line = 0; line < wrapper.Lines(); line++) {
+ if (line + linesDrawn < linesNarrow) {
+ sstrTextTall << wrapper.GetLine(line) << " ";
+ } else {
+ sstrTextFull << wrapper.GetLine(line) << " ";
+ }
+ }
+ sstrTextFull << "\n";
+ drawNarrow = false;
+ }
+ } else {
+ wrapper.Set((flds[i].c_str()), font, width);
+ for (int line = 0; line < wrapper.Lines(); line++) {
+ sstrTextFull << wrapper.GetLine(line) << " ";
+ }
+ sstrTextFull << "\n";
+ }
+ }
+ }
+ //VDRs textwrapper swallows linebreaks at the end, so we have to fix that manually
+ string textTall = sstrTextTall.str();
+ size_t posLastCarriageReturn = textTall.find_last_not_of("\n");
+
+ int numLinesToAddAtTall = 0;
+ if (posLastCarriageReturn != string::npos && (posLastCarriageReturn < textTall.size() - 1)) {
+ numLinesToAddAtTall = textTall.size() - posLastCarriageReturn - 2;
+ }
+
+ wTextTall.Set(textTall.c_str(), font, widthNarrow);
+ wTextFull.Set(sstrTextFull.str().c_str(), font, width);
+
+ int textLinesTall = wTextTall.Lines();
+ int textLinesFull = wTextFull.Lines();
+
+ int textXTall = x;
+ if (floatType == flTopLeft)
+ textXTall = x + floatWidth;
+
+ int yLine = y;
+ for (int line=0; line < textLinesTall; line++) {
+ cPoint pos(textXTall, yLine);
+ DrawText(num, pos, wTextTall.GetLine(line), clr, clrBack, fontName, fontSize);
+ yLine += fontHeight;
+ }
+
+ if (numLinesToAddAtTall) {
+ yLine += numLinesToAddAtTall * fontHeight;
+ }
+
+ for (int line=0; line < textLinesFull; line++) {
+ cPoint pos(x, yLine);
+ if (height > 0 && yLine - y + 2*fontHeight > height) {
+ DrawText(num, pos, "...", clr, clrBack, fontName, fontSize);
+ break;
+ }
+ DrawText(num, pos, wTextFull.GetLine(line), clr, clrBack, fontName, fontSize);
+ yLine += fontHeight;
+ }
+}
+
+void cView::DoDrawRectangle(int num, cTemplateFunction *func, int x0, int y0) {
+ int x = func->GetNumericParameter(ptX);
+ int y = func->GetNumericParameter(ptY);
+ if (x < 0) x = 0;
+ x += x0;
+ if (y < 0) y = 0;
+ y += y0;
+ int w = func->GetNumericParameter(ptWidth);
+ int h = func->GetNumericParameter(ptHeight);
+ cRect size(x, y, w, h);
+ tColor clr = func->GetColorParameter(ptColor);
+ DrawRectangle(num, size, clr);
+}
+
+void cView::DoDrawEllipse(int num, cTemplateFunction *func, int x0, int y0) {
+ int x = func->GetNumericParameter(ptX);
+ int y = func->GetNumericParameter(ptY);
+ if (x < 0) x = 0;
+ x += x0;
+ if (y < 0) y = 0;
+ y += y0;
+ int w = func->GetNumericParameter(ptWidth);
+ int h = func->GetNumericParameter(ptHeight);
+ cRect size(x, y, w, h);
+ tColor clr = func->GetColorParameter(ptColor);
+ int quadrant = func->GetNumericParameter(ptQuadrant);
+ if (quadrant < -4 || quadrant > 8) {
+ esyslog("skindesigner: wrong quadrant %d for drawellipse, allowed values are from -4 to 8", quadrant);
+ quadrant = 0;
+ }
+ DrawEllipse(num, size, clr, quadrant);
+}
+
+void cView::DoDrawSlope(int num, cTemplateFunction *func, int x0, int y0) {
+ int x = func->GetNumericParameter(ptX);
+ int y = func->GetNumericParameter(ptY);
+ if (x < 0) x = 0;
+ x += x0;
+ if (y < 0) y = 0;
+ y += y0;
+ int w = func->GetNumericParameter(ptWidth);
+ int h = func->GetNumericParameter(ptHeight);
+ cRect size(x, y, w, h);
+ tColor clr = func->GetColorParameter(ptColor);
+ int type = func->GetNumericParameter(ptType);
+ if (type < 0 || type > 7) {
+ esyslog("skindesigner: wrong type %d for drawslope, allowed values are from 0 to 7", type);
+ type = 0;
+ }
+ DrawSlope(num, size, clr, type);
+}
+
+void cView::DoDrawImage(int num, cTemplateFunction *func, int x0, int y0) {
+ int x = func->GetNumericParameter(ptX);
+ int y = func->GetNumericParameter(ptY);
+ if (x < 0) x = 0;
+ x += x0;
+ if (y < 0) y = 0;
+ y += y0;
+ cPoint pos(x,y);
+ int width = func->GetNumericParameter(ptWidth);
+ int height = func->GetNumericParameter(ptHeight);
+ string path = func->GetImagePath();
+ eImageType type = (eImageType)func->GetNumericParameter(ptImageType);
+ switch (type) {
+ case itChannelLogo: {
+ cImage *logo = imgCache->GetLogo(path, width, height);
+ if (logo) {
+ DrawImage(num, pos, *logo);
+ }
+ break; }
+ case itSepLogo: {
+ cImage *sepLogo = imgCache->GetSeparatorLogo(path, width, height);
+ if (sepLogo) {
+ DrawImage(num, pos, *sepLogo);
+ }
+ break; }
+ case itSkinPart: {
+ cImage *skinpart = imgCache->GetSkinpart(path, width, height);
+ if (skinpart) {
+ DrawImage(num, pos, *skinpart);
+ }
+ break; }
+ case itIcon: {
+ cImage *icon = imgCache->GetIcon(type, path, width, height);
+ if (icon) {
+ DrawImage(num, pos, *icon);
+ }
+ break; }
+ case itMenuIcon: {
+ cImage *icon = imgCache->GetIcon(type, path, width, height);
+ if (icon) {
+ DrawImage(num, pos, *icon);
+ }
+ break; }
+ case itImage: {
+ cImageLoader imgLoader;
+ if (imgLoader.LoadImage(path.c_str())) {
+ cImage *image = imgLoader.CreateImage(width, height);
+ DrawImage(num, pos, *image);
+ delete(image);
+ }
+ break; }
+ default:
+ break;
+ }
+}
+
+/***********************************************************************
+* cViewListItem
+************************************************************************/
+
+cViewListItem::cViewListItem(cTemplateViewElement *tmplItem) : cView(tmplItem) {
+ pos = -1;
+ numTotal = 0;
+ align = alLeft;
+ listOrientation = orVertical;
+}
+
+cViewListItem::~cViewListItem() {
+
+}
+
+cRect cViewListItem::DrawListItem(map <string,string> *stringTokens, map <string,int> *intTokens) {
+ cRect posItem;
+ if (!tmplItem)
+ return posItem;
+
+ if (tmplItem->DebugTokens()) {
+ DebugTokens("ListItem", stringTokens, intTokens);
+ }
+
+ tmplItem->InitIterator();
+ cTemplatePixmap *pix = NULL;
+ int pixCurrent = 0;
+
+ while(pix = tmplItem->GetNextPixmap()) {
+ SetListElementPosition(pix);
+ if (pixCurrent == 0) {
+ posItem = pix->GetPixmapSize();
+ }
+ if (!PixmapExists(pixCurrent)) {
+ pix->ParseDynamicParameters(intTokens, true);
+ } else {
+ pix->ParseDynamicParameters(intTokens, false);
+ }
+ if (!PixmapExists(pixCurrent) && pix->Ready() && pix->DoExecute() && !pix->Scrolling()) {
+ CreateViewPixmap(pixCurrent, pix);
+ }
+ //if pixmap still not valid, skip
+ if (!pix->Ready() && !pix->Scrolling()) {
+ pixCurrent++;
+ continue;
+ }
+ //if condition for pixmap set, check if cond is true
+ if (!pix->DoExecute()) {
+ pixCurrent++;
+ continue;
+ }
+
+ pix->ClearDynamicFunctionParameters();
+ pix->ParseDynamicFunctionParameters(stringTokens, intTokens);
+
+ if (!PixmapExists(pixCurrent) && pix->Scrolling()) {
+ cSize drawportSize;
+ scrolling = pix->CalculateDrawPortSize(drawportSize);
+ pix->SetScrollingTextWidth();
+ if (scrolling) {
+ CreateScrollingPixmap(pixCurrent, pix, drawportSize);
+ scrollingPix = pixCurrent;
+ scrollOrientation = pix->GetNumericParameter(ptOrientation);
+ scrollMode = pix->GetNumericParameter(ptScrollMode);
+ scrollDelay = pix->GetNumericParameter(ptDelay);
+ scrollSpeed = pix->GetNumericParameter(ptScrollSpeed);
+ } else {
+ CreateViewPixmap(pixCurrent, pix);
+ }
+ }
+ if (pix->DoDebug()) {
+ pix->Debug();
+ }
+ DrawPixmap(pixCurrent, pix);
+ pixCurrent++;
+ }
+ return posItem;
+}
+
+void cViewListItem::ClearListItem(void) {
+ int pixMax = NumPixmaps();
+ for (int pixCurrent = 0; pixCurrent < pixMax; pixCurrent++) {
+ Fill(pixCurrent, clrTransparent);
+ }
+}
+
+void cViewListItem::SetListElementPosition(cTemplatePixmap *pix) {
+ int itemWidth = pix->GetNumericParameter(ptWidth);
+ int itemHeight = pix->GetNumericParameter(ptHeight);
+ int x = 0;
+ int y = 0;
+ if (listOrientation == orHorizontal) {
+ x = container.X();
+ int totalWidth = numTotal * itemWidth;
+ if (align == alCenter) {
+ y += (container.Width() - totalWidth) / 2;
+ } else if (align == alBottom) {
+ y += (container.Width() - totalWidth);
+ }
+ x += pos * itemWidth;
+ y = pix->GetNumericParameter(ptY);
+ } else if (listOrientation == orVertical) {
+ y = container.Y();
+ int totalHeight = numTotal * itemHeight;
+ if (align == alCenter) {
+ y += (container.Height() - totalHeight) / 2;
+ } else if (align == alBottom) {
+ y += (container.Height() - totalHeight);
+ }
+ y += pos * itemHeight;
+ x = pix->GetNumericParameter(ptX);
+ }
+ pix->SetX(x);
+ pix->SetY(y);
+}
+
diff --git a/views/view.h b/views/view.h
new file mode 100644
index 0000000..a793c31
--- /dev/null
+++ b/views/view.h
@@ -0,0 +1,73 @@
+#ifndef __VIEW_H
+#define __VIEW_H
+
+#include "string"
+#include "map"
+#include "../libcore/pixmapcontainer.h"
+#include "../libtemplate/template.h"
+
+using namespace std;
+
+class cView : public cPixmapContainer {
+private:
+ void Init(void);
+ void DoFill(int num, cTemplateFunction *func);
+ void DoDrawText(int num, cTemplateFunction *func, int x0 = 0, int y0 = 0);
+ void DoDrawTextBox(int num, cTemplateFunction *func, int x0 = 0, int y0 = 0);
+ void DoDrawFloatingTextBox(int num, cTemplateFunction *func);
+ void DoDrawRectangle(int num, cTemplateFunction *func, int x0 = 0, int y0 = 0);
+ void DoDrawEllipse(int num, cTemplateFunction *func, int x0 = 0, int y0 = 0);
+ void DoDrawSlope(int num, cTemplateFunction *func, int x0 = 0, int y0 = 0);
+ void DoDrawImage(int num, cTemplateFunction *func, int x0 = 0, int y0 = 0);
+ void ActivateScrolling(void);
+protected:
+ cTemplateView *tmplView;
+ cTemplateViewElement *tmplItem;
+ cTemplateViewTab *tmplTab;
+ //scaling window
+ cRect scalingWindow;
+ bool tvScaled;
+ bool viewInit;
+ //true if view is scrollable in general
+ bool scrolling;
+ //true if view is actually starting scrolling
+ bool currentlyScrolling;
+ eViewElement veScroll;
+ int scrollingPix;
+ int scrollOrientation;
+ int scrollDelay;
+ int scrollMode;
+ int scrollSpeed;
+ void DrawViewElement(eViewElement ve, map <string,string> *stringTokens = NULL, map <string,int> *intTokens = NULL, map < string, vector< map< string, string > > > *loopTokens = NULL);
+ void ClearViewElement(eViewElement ve);
+ bool ViewElementImplemented(eViewElement ve);
+ void CreateViewPixmap(int num, cTemplatePixmap *pix, cRect *size = NULL);
+ void CreateScrollingPixmap(int num, cTemplatePixmap *pix, cSize &drawportSize);
+ void DrawPixmap(int num, cTemplatePixmap *pix, map < string, vector< map< string, string > > > *loopTokens = NULL, bool flushPerLoop = false);
+ void DrawLoop(int numPixmap, cTemplateFunction *func, map < string, vector< map< string, string > > > *loopTokens);
+ void DebugTokens(string viewElement, map<string,string> *stringTokens, map<string,int> *intTokens, map < string, vector< map< string, string > > > *loopTokens = NULL);
+ virtual void Action(void);
+public:
+ cView(cTemplateView *tmplView);
+ cView(cTemplateViewElement *tmplItem);
+ cView(cTemplateViewTab *tmplTab);
+ virtual ~cView();
+ virtual void Stop(void);
+};
+
+class cViewListItem : public cView {
+protected:
+ int pos;
+ int numTotal;
+ cRect container;
+ int align;
+ int listOrientation;
+ void SetListElementPosition(cTemplatePixmap *pix);
+public:
+ cViewListItem(cTemplateViewElement *tmplItem);
+ virtual ~cViewListItem();
+ cRect DrawListItem(map <string,string> *stringTokens, map <string,int> *intTokens);
+ void ClearListItem(void);
+};
+
+#endif //__VIEW_H
\ No newline at end of file
diff --git a/views/viewhelpers.c b/views/viewhelpers.c
new file mode 100644
index 0000000..e10798f
--- /dev/null
+++ b/views/viewhelpers.c
@@ -0,0 +1,457 @@
+#include <vdr/menu.h>
+#include "../services/scraper2vdr.h"
+#include "../services/weatherforecast.h"
+#include "../config.h"
+#include "../libcore/helpers.h"
+#include "viewhelpers.h"
+
+cViewHelpers::cViewHelpers(void) {
+ devicesInit = false;
+ lastSecond = -1;
+ lastMinute = -1;
+}
+
+cViewHelpers::~cViewHelpers() {
+ if (devicesInit) {
+ delete[] lastSignalStrength;
+ delete[] lastSignalQuality;
+ delete[] recDevices;
+ }
+}
+
+void cViewHelpers::InitDevices(void) {
+ int numDevices = cDevice::NumDevices();
+ lastSignalStrength = new int[numDevices];
+ lastSignalQuality = new int[numDevices];
+ recDevices = new bool[numDevices];
+ for (int i=0; i<numDevices; i++) {
+ lastSignalStrength[i] = 0;
+ lastSignalQuality[i] = 0;
+ recDevices[i] = false;
+ }
+ devicesInit = true;
+}
+
+bool cViewHelpers::SetDevices(bool initial, map<string,int> *intTokens, vector<map<string,string> > *devices) {
+#ifdef DOPROFILE
+ cStopWatch watch("SetDevices");
+#endif
+ int numDevices = cDevice::NumDevices();
+ if (!initial) {
+ //check if drawing is necessary
+ bool changed = false;
+ for (int i = 0; i < numDevices; i++) {
+ const cDevice *device = cDevice::GetDevice(i);
+ if (!device || !device->NumProvidedSystems()) {
+ continue;
+ }
+ int signalStrength = device->SignalStrength();
+#ifdef DOPROFILE
+ watch.Report(*cString::sprintf("SignalStrength() device %d", i));
+#endif
+ int signalQuality = device->SignalQuality();
+#ifdef DOPROFILE
+ watch.Report(*cString::sprintf("SignalQuality() device %d", i));
+#endif
+
+ if ((signalStrength != lastSignalStrength[i]) || (signalQuality != lastSignalQuality[i])) {
+ changed = true;
+ break;
+ }
+ }
+ if (!changed) {
+#ifdef DOPROFILE
+ watch.Stop("SetDevices End");
+#endif
+ return false;
+ }
+ }
+ //check device which currently displays live tv
+ int deviceLiveTV = -1;
+ cDevice *primaryDevice = cDevice::PrimaryDevice();
+ if (primaryDevice) {
+ if (!primaryDevice->Replaying() || primaryDevice->Transferring())
+ deviceLiveTV = cDevice::ActualDevice()->DeviceNumber();
+ else
+ deviceLiveTV = primaryDevice->DeviceNumber();
+ }
+ //check currently recording devices
+ for (cTimer *timer = Timers.First(); timer; timer = Timers.Next(timer)) {
+ if (!timer->Recording()) {
+ continue;
+ }
+ if (cRecordControl *RecordControl = cRecordControls::GetRecordControl(timer)) {
+ const cDevice *recDevice = RecordControl->Device();
+ if (recDevice) {
+ recDevices[recDevice->DeviceNumber()] = true;
+ }
+ }
+ }
+ int actualNumDevices = 0;
+ for (int i = 0; i < numDevices; i++) {
+ const cDevice *device = cDevice::GetDevice(i);
+ if (!device || !device->NumProvidedSystems()) {
+ continue;
+ }
+
+ map< string, string > deviceVals;
+ stringstream strNum;
+ strNum << actualNumDevices;
+ actualNumDevices++;
+ deviceVals.insert(pair< string, string >("devices[num]", strNum.str()));
+ deviceVals.insert(pair< string, string >("devices[type]", *(device->DeviceType())));
+ cCamSlot *camSlot = device->CamSlot();
+ int camNumber = -1;
+ if (camSlot) {
+ camNumber = camSlot->SlotNumber();
+ deviceVals.insert(pair< string, string >("devices[hascam]", "1"));
+ } else {
+ deviceVals.insert(pair< string, string >("devices[hascam]", "0"));
+ }
+ int signalStrength = device->SignalStrength();
+#ifdef DOPROFILE
+ watch.Report(*cString::sprintf("SignalStrength() device %d", i));
+#endif
+ int signalQuality = device->SignalQuality();
+#ifdef DOPROFILE
+ watch.Report(*cString::sprintf("SignalQuality() device %d", i));
+#endif
+ stringstream strCamNumber;
+ strCamNumber << camNumber;
+ deviceVals.insert(pair< string, string >("devices[cam]", strCamNumber.str()));
+ stringstream strStrength;
+ strStrength << signalStrength;
+ deviceVals.insert(pair< string, string >("devices[signalstrength]", strStrength.str()));
+ stringstream strQuality;
+ strQuality << signalQuality;
+ deviceVals.insert(pair< string, string >("devices[signalquality]", strQuality.str()));
+
+ deviceVals.insert(pair< string, string >("devices[livetv]", i == deviceLiveTV ? "1" : "0"));
+ deviceVals.insert(pair< string, string >("devices[recording]", recDevices[i] ? "1" : "0"));
+
+ const cChannel *channel = device->GetCurrentlyTunedTransponder();
+ const cSource *source = (channel) ? Sources.Get(channel->Source()) : NULL;
+ if (channel && channel->Number() > 0) {
+ stringstream strChanNum;
+ strChanNum << channel->Number();
+ deviceVals.insert(pair< string, string >("devices[channelnumber]", strChanNum.str()));
+ deviceVals.insert(pair< string, string >("devices[channelname]", channel->Name()));
+ string channelID = *(channel->GetChannelID().ToString());
+ deviceVals.insert(pair< string, string >("devices[channelid]", channelID));
+ deviceVals.insert(pair< string, string >("devices[channellogoexists]", imgCache->LogoExists(channelID) ? "1" : "0"));
+ deviceVals.insert(pair< string, string >("devices[istuned]", "1"));
+ } else {
+ deviceVals.insert(pair< string, string >("devices[channelnumber]", "0"));
+ deviceVals.insert(pair< string, string >("devices[channelname]", ""));
+ deviceVals.insert(pair< string, string >("devices[channelid]", ""));
+ deviceVals.insert(pair< string, string >("devices[channellogoexists]", "0"));
+ deviceVals.insert(pair< string, string >("devices[istuned]", "0"));
+ }
+
+ deviceVals.insert(pair< string, string >("devices[source]", source ? source->Description() : ""));
+
+ devices->push_back(deviceVals);
+
+ lastSignalStrength[i] = signalStrength;
+ lastSignalQuality[i] = signalQuality;
+ }
+
+ intTokens->insert(pair<string, int>("numdevices", actualNumDevices));
+#ifdef DOPROFILE
+ watch.Stop("SetDevices End");
+#endif
+ return true;
+}
+
+bool cViewHelpers::CheckNewMails(void) {
+ static cPlugin *pMailbox = cPluginManager::GetPlugin("mailbox");
+ if (!pMailbox) {
+ return false;
+ }
+ bool newMail = false;
+ if (pMailbox->Service("MailBox-HasNewMail-1.0", &newMail)) {
+ return newMail;
+ }
+ return false;
+}
+
+void cViewHelpers::SetScraperTokens(const cEvent *event, const cRecording *recording, map < string, string > &stringTokens, map < string, int > &intTokens, map < string, vector< map< string, string > > > &loopTokens) {
+ static cPlugin *pScraper = GetScraperPlugin();
+ if (!pScraper || (!event && !recording)) {
+ intTokens.insert(pair<string,int>("ismovie", false));
+ intTokens.insert(pair<string,int>("isseries", false));
+ return;
+ }
+
+ ScraperGetEventType getType;
+ getType.event = event;
+ getType.recording = recording;
+ if (!pScraper->Service("GetEventType", &getType)) {
+ intTokens.insert(pair<string,int>("ismovie", false));
+ intTokens.insert(pair<string,int>("isseries", false));
+ return;
+ }
+
+ if (getType.type == tMovie) {
+ cMovie movie;
+ movie.movieId = getType.movieId;
+ pScraper->Service("GetMovie", &movie);
+ intTokens.insert(pair<string,int>("ismovie", true));
+ intTokens.insert(pair<string,int>("isseries", false));
+
+ stringTokens.insert(pair<string,string>("movietitle", movie.title));
+ stringTokens.insert(pair<string,string>("movieoriginalTitle", movie.originalTitle));
+ stringTokens.insert(pair<string,string>("movietagline", movie.tagline));
+ stringTokens.insert(pair<string,string>("movieoverview", movie.overview));
+ stringTokens.insert(pair<string,string>("moviegenres", movie.genres));
+ stringTokens.insert(pair<string,string>("moviehomepage", movie.homepage));
+ stringTokens.insert(pair<string,string>("moviereleasedate", movie.releaseDate));
+ stringstream pop;
+ pop << movie.popularity;
+ stringTokens.insert(pair<string,string>("moviepopularity", pop.str()));
+ stringstream vote;
+ vote << movie.voteAverage;
+ stringTokens.insert(pair<string,string>("movievoteaverage", pop.str()));
+ stringTokens.insert(pair<string,string>("posterpath", movie.poster.path));
+ stringTokens.insert(pair<string,string>("fanartpath", movie.fanart.path));
+ stringTokens.insert(pair<string,string>("collectionposterpath", movie.collectionPoster.path));
+ stringTokens.insert(pair<string,string>("collectionfanartpath", movie.collectionFanart.path));
+
+ intTokens.insert(pair<string,int>("movieadult", movie.adult));
+ intTokens.insert(pair<string,int>("moviebudget", movie.budget));
+ intTokens.insert(pair<string,int>("movierevenue", movie.revenue));
+ intTokens.insert(pair<string,int>("movieruntime", movie.runtime));
+ intTokens.insert(pair<string,int>("posterwidth", movie.poster.width));
+ intTokens.insert(pair<string,int>("posterheight", movie.poster.height));
+ intTokens.insert(pair<string,int>("fanartwidth", movie.fanart.width));
+ intTokens.insert(pair<string,int>("fanartheight", movie.fanart.height));
+ intTokens.insert(pair<string,int>("collectionposterwidth", movie.collectionPoster.width));
+ intTokens.insert(pair<string,int>("collectionposterheight", movie.collectionPoster.height));
+ intTokens.insert(pair<string,int>("collectionfanartwidth", movie.collectionFanart.width));
+ intTokens.insert(pair<string,int>("collectionfanartheight", movie.collectionFanart.height));
+
+ vector< map< string, string > > actors;
+ for (vector<cActor>::iterator act = movie.actors.begin(); act != movie.actors.end(); act++) {
+ map< string, string > actor;
+ actor.insert(pair<string, string>("actors[name]", (*act).name));
+ actor.insert(pair<string, string>("actors[role]", (*act).role));
+ actor.insert(pair<string, string>("actors[thumb]", (*act).actorThumb.path));
+ stringstream actWidth, actHeight;
+ actWidth << (*act).actorThumb.width;
+ actHeight << (*act).actorThumb.height;
+ actor.insert(pair<string, string>("actors[thumbwidth]", actWidth.str()));
+ actor.insert(pair<string, string>("actors[thumbheight]", actHeight.str()));
+ actors.push_back(actor);
+ }
+ loopTokens.insert(pair<string, vector< map< string, string > > >("actors", actors));
+
+ } else if (getType.type == tSeries) {
+ cSeries series;
+ series.seriesId = getType.seriesId;
+ series.episodeId = getType.episodeId;
+ pScraper->Service("GetSeries", &series);
+ intTokens.insert(pair<string,int>("ismovie", false));
+ intTokens.insert(pair<string,int>("isseries", true));
+ //Series Basics
+ stringTokens.insert(pair<string,string>("seriesname", series.name));
+ stringTokens.insert(pair<string,string>("seriesoverview", series.overview));
+ stringTokens.insert(pair<string,string>("seriesfirstaired", series.firstAired));
+ stringTokens.insert(pair<string,string>("seriesnetwork", series.network));
+ stringTokens.insert(pair<string,string>("seriesgenre", series.genre));
+ stringstream rating;
+ rating << series.rating;
+ stringTokens.insert(pair<string,string>("seriesrating", rating.str()));
+ stringTokens.insert(pair<string,string>("seriesstatus", series.status));
+ //Episode Information
+ intTokens.insert(pair<string,int>("episodenumber", series.episode.number));
+ intTokens.insert(pair<string,int>("episodeseason", series.episode.season));
+ stringTokens.insert(pair<string,string>("episodetitle", series.episode.name));
+ stringTokens.insert(pair<string,string>("episodefirstaired", series.episode.firstAired));
+ stringTokens.insert(pair<string,string>("episodegueststars", series.episode.guestStars));
+ stringTokens.insert(pair<string,string>("episodeoverview", series.episode.overview));
+ stringstream eprating;
+ eprating << series.episode.rating;
+ stringTokens.insert(pair<string,string>("episoderating", eprating.str()));
+ intTokens.insert(pair<string,int>("episodeimagewidth", series.episode.episodeImage.width));
+ intTokens.insert(pair<string,int>("episodeimageheight", series.episode.episodeImage.height));
+ stringTokens.insert(pair<string,string>("episodeimagepath", series.episode.episodeImage.path));
+ //Seasonposter
+ intTokens.insert(pair<string,int>("seasonposterwidth", series.seasonPoster.width));
+ intTokens.insert(pair<string,int>("seasonposterheight", series.seasonPoster.height));
+ stringTokens.insert(pair<string,string>("seasonposterpath", series.seasonPoster.path));
+
+ //Posters
+ int current = 1;
+ for(vector<cTvMedia>::iterator poster = series.posters.begin(); poster != series.posters.end(); poster++) {
+ stringstream labelWidth, labelHeight, labelPath;
+ labelWidth << "seriesposter" << current << "width";
+ labelHeight << "seriesposter" << current << "height";
+ labelPath << "seriesposter" << current << "path";
+
+ intTokens.insert(pair<string,int>(labelWidth.str(), (*poster).width));
+ intTokens.insert(pair<string,int>(labelHeight.str(), (*poster).height));
+ stringTokens.insert(pair<string,string>(labelPath.str(), (*poster).path));
+ current++;
+ }
+ if (current < 3) {
+ for (; current < 4; current++) {
+ stringstream labelWidth, labelHeight, labelPath;
+ labelWidth << "seriesposter" << current << "width";
+ labelHeight << "seriesposter" << current << "height";
+ labelPath << "seriesposter" << current << "path";
+
+ intTokens.insert(pair<string,int>(labelWidth.str(), 0));
+ intTokens.insert(pair<string,int>(labelHeight.str(), 0));
+ stringTokens.insert(pair<string,string>(labelPath.str(), ""));
+ }
+ }
+
+ //Banners
+ current = 1;
+ for(vector<cTvMedia>::iterator banner = series.banners.begin(); banner != series.banners.end(); banner++) {
+ stringstream labelWidth, labelHeight, labelPath;
+ labelWidth << "seriesbanner" << current << "width";
+ labelHeight << "seriesbanner" << current << "height";
+ labelPath << "seriesbanner" << current << "path";
+
+ intTokens.insert(pair<string,int>(labelWidth.str(), (*banner).width));
+ intTokens.insert(pair<string,int>(labelHeight.str(), (*banner).height));
+ stringTokens.insert(pair<string,string>(labelPath.str(), (*banner).path));
+ current++;
+ }
+ if (current < 3) {
+ for (; current < 4; current++) {
+ stringstream labelWidth, labelHeight, labelPath;
+ labelWidth << "seriesbanner" << current << "width";
+ labelHeight << "seriesbanner" << current << "height";
+ labelPath << "seriesbanner" << current << "path";
+
+ intTokens.insert(pair<string,int>(labelWidth.str(), 0));
+ intTokens.insert(pair<string,int>(labelHeight.str(), 0));
+ stringTokens.insert(pair<string,string>(labelPath.str(), ""));
+ }
+ }
+
+ //Fanarts
+ current = 1;
+ for(vector<cTvMedia>::iterator fanart = series.fanarts.begin(); fanart != series.fanarts.end(); fanart++) {
+ stringstream labelWidth, labelHeight, labelPath;
+ labelWidth << "seriesfanart" << current << "width";
+ labelHeight << "seriesfanart" << current << "height";
+ labelPath << "seriesfanart" << current << "path";
+
+ intTokens.insert(pair<string,int>(labelWidth.str(), (*fanart).width));
+ intTokens.insert(pair<string,int>(labelHeight.str(), (*fanart).height));
+ stringTokens.insert(pair<string,string>(labelPath.str(), (*fanart).path));
+ current++;
+ }
+ if (current < 3) {
+ for (; current < 4; current++) {
+ stringstream labelWidth, labelHeight, labelPath;
+ labelWidth << "seriesfanart" << current << "width";
+ labelHeight << "seriesfanart" << current << "height";
+ labelPath << "seriesfanart" << current << "path";
+
+ intTokens.insert(pair<string,int>(labelWidth.str(), 0));
+ intTokens.insert(pair<string,int>(labelHeight.str(), 0));
+ stringTokens.insert(pair<string,string>(labelPath.str(), ""));
+ }
+ }
+
+ //Actors
+ vector< map< string, string > > actors;
+ for (vector<cActor>::iterator act = series.actors.begin(); act != series.actors.end(); act++) {
+ map< string, string > actor;
+ actor.insert(pair<string, string>("actors[name]", (*act).name));
+ actor.insert(pair<string, string>("actors[role]", (*act).role));
+ actor.insert(pair<string, string>("actors[thumb]", (*act).actorThumb.path));
+ stringstream actWidth, actHeight;
+ actWidth << (*act).actorThumb.width;
+ actHeight << (*act).actorThumb.height;
+ actor.insert(pair<string, string>("actors[thumbwidth]", actWidth.str()));
+ actor.insert(pair<string, string>("actors[thumbheight]", actHeight.str()));
+ actors.push_back(actor);
+ }
+ loopTokens.insert(pair<string, vector< map< string, string > > >("actors", actors));
+
+ } else {
+ intTokens.insert(pair<string,int>("ismovie", false));
+ intTokens.insert(pair<string,int>("isseries", false));
+ }
+
+}
+
+bool cViewHelpers::SetTime(map < string, string > &stringTokens, map < string, int > &intTokens) {
+ time_t t = time(0); // get time now
+ struct tm * now = localtime(&t);
+ int sec = now->tm_sec;
+ if (sec == lastSecond)
+ return false;
+
+ int min = now->tm_min;
+ int hour = now->tm_hour;
+ int hourMinutes = hour%12 * 5 + min / 12;
+
+ intTokens.insert(pair<string, int>("sec", sec));
+ intTokens.insert(pair<string, int>("min", min));
+ intTokens.insert(pair<string, int>("hour", hour));
+ intTokens.insert(pair<string, int>("hmins", hourMinutes));
+
+ lastSecond = sec;
+ return true;
+}
+
+bool cViewHelpers::SetDate(map < string, string > &stringTokens, map < string, int > &intTokens) {
+ time_t t = time(0); // get time now
+ struct tm * now = localtime(&t);
+ int min = now->tm_min;
+ if (min == lastMinute)
+ return false;
+
+ intTokens.insert(pair<string, int>("year", now->tm_year + 1900));
+ intTokens.insert(pair<string, int>("day", now->tm_mday));
+
+ char monthname[20];
+ char monthshort[10];
+ strftime(monthshort, sizeof(monthshort), "%b", now);
+ strftime(monthname, sizeof(monthname), "%B", now);
+
+ stringTokens.insert(pair<string,string>("monthname", monthname));
+ stringTokens.insert(pair<string,string>("monthnameshort", monthshort));
+ stringTokens.insert(pair<string,string>("month", *cString::sprintf("%02d", now->tm_mon + 1)));
+ stringTokens.insert(pair<string,string>("dayleadingzero", *cString::sprintf("%02d", now->tm_mday)));
+ stringTokens.insert(pair<string,string>("dayname", *WeekDayNameFull(now->tm_wday)));
+ stringTokens.insert(pair<string,string>("daynameshort", *WeekDayName(now->tm_wday)));
+ stringTokens.insert(pair<string,string>("time", *TimeString(t)));
+
+ return true;
+}
+
+bool cViewHelpers::SetCurrentWeatherTokens(map < string, string > &stringTokens, map < string, int > &intTokens) {
+ static cPlugin *pWeatherForecast = cPluginManager::GetPlugin("weatherforecast");
+ if (!pWeatherForecast)
+ return false;
+ cServiceCurrentWeather currentWeather;
+ if (!pWeatherForecast->Service("GetCurrentWeather", ¤tWeather)) {
+ return false;
+ }
+ stringTokens.insert(pair<string,string>("timestamp", currentWeather.timeStamp));
+ stringTokens.insert(pair<string,string>("temperature", currentWeather.temperature));
+ stringTokens.insert(pair<string,string>("apparenttemperature", currentWeather.apparentTemperature));
+ stringTokens.insert(pair<string,string>("mintemperature", currentWeather.minTemperature));
+ stringTokens.insert(pair<string,string>("maxtemperature", currentWeather.maxTemperature));
+ stringTokens.insert(pair<string,string>("summary", currentWeather.summary));
+ stringTokens.insert(pair<string,string>("icon", currentWeather.icon));
+ stringTokens.insert(pair<string,string>("precipitationintensity", currentWeather.precipitationIntensity));
+ intTokens.insert(pair<string,int>("precipitationprobability", currentWeather.precipitationProbability));
+ stringTokens.insert(pair<string,string>("precipitationtype", currentWeather.precipitationType));
+ intTokens.insert(pair<string,int>("humidity", currentWeather.humidity));
+ stringTokens.insert(pair<string,string>("windspeed", currentWeather.windSpeed));
+ intTokens.insert(pair<string,int>("windbearing", currentWeather.windBearing));
+ stringTokens.insert(pair<string,string>("windbearingstring", currentWeather.windBearingString));
+ stringTokens.insert(pair<string,string>("visibility", currentWeather.visibility));
+ intTokens.insert(pair<string,int>("cloudcover", currentWeather.cloudCover));
+ stringTokens.insert(pair<string,string>("pressure", currentWeather.pressure));
+ stringTokens.insert(pair<string,string>("ozone", currentWeather.ozone));
+ return true;
+}
diff --git a/views/viewhelpers.h b/views/viewhelpers.h
new file mode 100644
index 0000000..8e49554
--- /dev/null
+++ b/views/viewhelpers.h
@@ -0,0 +1,25 @@
+#ifndef __VIEWHELPERS_H
+#define __VIEWHELPERS_H
+
+class cViewHelpers {
+private:
+ bool devicesInit;
+ int* lastSignalStrength;
+ int* lastSignalQuality;
+ bool* recDevices;
+ int lastSecond;
+ int lastMinute;
+protected:
+ void InitDevices(void);
+ bool SetDevices(bool initial, map<string,int> *intTokens, vector<map<string,string> > *devices);
+ bool CheckNewMails(void);
+ void SetScraperTokens(const cEvent *event, const cRecording *recording, map < string, string > &stringTokens, map < string, int > &intTokens, map < string, vector< map< string, string > > > &loopTokens);
+ bool SetTime(map < string, string > &stringTokens, map < string, int > &intTokens);
+ bool SetDate(map < string, string > &stringTokens, map < string, int > &intTokens);
+ bool SetCurrentWeatherTokens(map < string, string > &stringTokens, map < string, int > &intTokens);
+public:
+ cViewHelpers(void);
+ virtual ~cViewHelpers(void);
+};
+
+#endif //__VIEWHELPERS_H
\ No newline at end of file
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-vdr-dvb/vdr-plugin-skindesigner.git
More information about the pkg-vdr-dvb-changes
mailing list