The branch, eden has been updated
       via  025dd0fd3d5c2d65c41580ecc091a8c9800698e7 (commit)
      from  c7e222045198f1ac404a956d4358f638b7131715 (commit)

- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/scripts;a=commit;h=025dd0fd3d5c2d65c41580ecc091a8c9800698e7

commit 025dd0fd3d5c2d65c41580ecc091a8c9800698e7
Author: M. Kaijser <[email protected]>
Date:   Thu Jul 11 11:12:23 2013 +0200

    [script.xbmc.lcdproc] 1.3.0

diff --git a/script.xbmc.lcdproc/addon.xml b/script.xbmc.lcdproc/addon.xml
index e5624a8..ca50668 100644
--- a/script.xbmc.lcdproc/addon.xml
+++ b/script.xbmc.lcdproc/addon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="script.xbmc.lcdproc" name="XBMC LCDproc" version="1.2.1" 
provider-name="Team XBMC: Memphiz, Daniel 'herrnst' Scheller">
+<addon id="script.xbmc.lcdproc" name="XBMC LCDproc" version="1.3.0" 
provider-name="Team XBMC: Memphiz, Daniel 'herrnst' Scheller">
   <requires>
     <import addon="xbmc.python" version="2.0"/>
     <import addon="xbmc.gui" version="3.0"/>
diff --git a/script.xbmc.lcdproc/changelog.txt 
b/script.xbmc.lcdproc/changelog.txt
index 6970eee..172a1e2 100644
--- a/script.xbmc.lcdproc/changelog.txt
+++ b/script.xbmc.lcdproc/changelog.txt
@@ -1,3 +1,14 @@
+1.3.0 / 2.3.0
+- Alternate charmap selection, support for HD44780/iMON ROM (A00 and A02 
variants) charsets
+- New "tvshow" mode, active when playing media from the TV-shows database
+- Refactored backlight dimming handling and configuration via GUI settings
+- Cleaned up and improved TCP/Telnet socket handling
+- Indicate internet stream on extraicon-supported displays
+- Use XBMC's time for daytime display on BigDigit-mode and thus properly 
display 12/24h clocks, improve bigdigit handling
+- Additional "finetuning"-options for extraicon/bar-support
+- Option to entirely disable extra stuff support
+- Always load defaults so LCD.xml in the masterprofile acts as user override, 
makes additions like new modes or wrong spelling in XML tags not result in 
empty displays
+- Bugfixes and friends, of course
 1.2.1 / 2.2.1
 - Bugfixes, Credits, slightly more convenient configuration option bools
 1.2.0 / 2.2.0
diff --git a/script.xbmc.lcdproc/lcdmain.py b/script.xbmc.lcdproc/lcdmain.py
index fbb19f9..3bdb45c 100644
--- a/script.xbmc.lcdproc/lcdmain.py
+++ b/script.xbmc.lcdproc/lcdmain.py
@@ -79,6 +79,7 @@ def getLcdMode():
   navActive = InfoLabel_IsNavigationActive()
   screenSaver = InfoLabel_IsScreenSaverActive()
   playingVideo = InfoLabel_PlayingVideo()
+  playingTVShow = InfoLabel_PlayingTVShow()
   playingMusic = InfoLabel_PlayingAudio()
   playingPVRTV = InfoLabel_PlayingLiveTV()
   playingPVRRadio = InfoLabel_PlayingLiveRadio()
@@ -91,6 +92,8 @@ def getLcdMode():
     ret = LCD_MODE.LCD_MODE_PVRTV
   elif playingPVRRadio:
     ret = LCD_MODE.LCD_MODE_PVRRADIO
+  elif playingTVShow:
+    ret = LCD_MODE.LCD_MODE_TVSHOW
   elif playingVideo:
     ret = LCD_MODE.LCD_MODE_VIDEO
   elif playingMusic:
@@ -99,34 +102,19 @@ def getLcdMode():
   return ret
 
 def process_lcd():
-  bBacklightDimmed = False
 
   while not xbmc.abortRequested:
     if handleConnectLCD():
       settingsChanged = settings_didSettingsChange()
-      mode = getLcdMode()
 
-      if mode == LCD_MODE.LCD_MODE_SCREENSAVER and 
settings_getDimOnScreensaver() and not bBacklightDimmed:
-        g_lcdproc.SetBackLight(0)
-        bBacklightDimmed = True
+      if settingsChanged:
+        g_lcdproc.UpdateGUISettings()
 
-      g_lcdproc.Render(mode, settingsChanged)
-
-      # turn the backlight on when leaving screensaver and it was dimmed
-      if mode != LCD_MODE.LCD_MODE_SCREENSAVER and bBacklightDimmed:
-        g_lcdproc.SetBackLight(1)
-        bBacklightDimmed = False
-    
-      if mode == LCD_MODE.LCD_MODE_MUSIC or mode == LCD_MODE.LCD_MODE_PVRRADIO:
-        g_lcdproc.DisableOnPlayback(False, True)
-      elif mode == LCD_MODE.LCD_MODE_VIDEO or mode == LCD_MODE.LCD_MODE_PVRTV:
-        g_lcdproc.DisableOnPlayback(True, False)
-      else:
-        g_lcdproc.DisableOnPlayback(False, False)
+      g_lcdproc.Render(getLcdMode(), settingsChanged)
 
     time.sleep(1.0 / float(settings_getRefreshRate())) # refresh after 
configured rate
 
-  g_lcdproc.Shutdown(settings_getDimOnShutdown())
+  g_lcdproc.Shutdown()
 
 def handleConnectLCD():
   ret = True
@@ -136,12 +124,10 @@ def handleConnectLCD():
     #check for new settings
     if settings_checkForNewSettings() or not g_lcdproc.IsConnected():    
#networksettings changed?
       g_failedConnectionNotified = False  #reset notification flag
-    else:
-      return True
 
-    ret = g_lcdproc.Initialize()
-    if not settings_getHideConnPopups():
-      HandleConnectionNotification(ret)
+      ret = g_lcdproc.Initialize()
+      if not settings_getHideConnPopups():
+        HandleConnectionNotification(ret)
 
   return ret
 
diff --git a/script.xbmc.lcdproc/resources/LCD.xml.defaults 
b/script.xbmc.lcdproc/resources/LCD.xml.defaults
index 7d50cc5..b565702 100644
--- a/script.xbmc.lcdproc/resources/LCD.xml.defaults
+++ b/script.xbmc.lcdproc/resources/LCD.xml.defaults
@@ -20,6 +20,13 @@
       <line>$INFO[LCD.ProgressBar]</line>
       <line>Freemem: $INFO[System.FreeMemory]</line>
    </video>
+   <tvshow>
+      <line>$INFO[LCD.PlayIcon] 
$INFO[Player.Time]/$INFO[Player.Duration]</line>
+      <line>$INFO[VideoPlayer.TVShowTitle]</line>
+      <line>$INFO[VideoPlayer.Title]</line>
+      <line>$INFO[LCD.ProgressBar]</line>
+      <line>Freemem: $INFO[System.FreeMemory]</line>
+   </tvshow> 
    <general>
       <line>XBMC running...</line>
       <line>$INFO[System.Time] $INFO[System.Date]</line>
diff --git a/script.xbmc.lcdproc/resources/language/English/strings.xml 
b/script.xbmc.lcdproc/resources/language/English/strings.xml
index ac2b658..832a683 100644
--- a/script.xbmc.lcdproc/resources/language/English/strings.xml
+++ b/script.xbmc.lcdproc/resources/language/English/strings.xml
@@ -7,11 +7,18 @@
   <string id="32102">Scroll mode</string>
   <string id="32103">Navigation display duration (s)</string>
   <string id="32104">Display refresh rate (Hz)</string>
+  <string id="32105">Use alternate charset</string>
+  <string id="32106">Charset</string>
+  <string id="32107">Support for extra display elements (e.g. icons)</string>
 
   <!--Backlight-->
   <string id="32200">Backlight</string>
-  <string id="32201">Dim backlight on screensaver</string>
-  <string id="32202">Dim backlight on shutdown</string>
+  <string id="32201">on screensaver</string>
+  <string id="32202">Dim on shutdown</string>
+  <string id="32203">on video/LiveTV playback</string>
+  <string id="32204">on music/radio playback</string>
+  <string id="32205">Delay (s)</string>
+  <string id="32206">Dim/turn off...</string>
 
   <!--Connection-->
   <string id="32300">Connection</string>
@@ -21,10 +28,19 @@
   <string id="32304">Show heartbeat symbol</string>
   <string id="32305">Hide connection error notifications</string>
 
-  <!--Enum values-->
+  <!--Enum values: Scroll mode-->
   <string id="32401">Marquee</string>
   <string id="32402">Left/Right</string>
 
+  <!--Enum values: Charsets-->
+  <string id="32411">ISO8859-1 (default)</string>
+  <string id="32412">ISO8859-15</string>
+  <string id="32413">KOI8-R</string>
+  <string id="32414">CP1251</string>
+  <string id="32415">ISO8859-5</string>
+  <string id="32416">HD44780-ROM A00</string>
+  <string id="32417">HD44780-ROM A02</string>
+
   <!--Notifications-->
   <string id="32500">Failed to connect to LCDProc!</string>
   <string id="32501">Connected to LCDProc!</string>
diff --git a/script.xbmc.lcdproc/resources/language/German/strings.xml 
b/script.xbmc.lcdproc/resources/language/German/strings.xml
index a589205..205fc86 100644
--- a/script.xbmc.lcdproc/resources/language/German/strings.xml
+++ b/script.xbmc.lcdproc/resources/language/German/strings.xml
@@ -7,11 +7,18 @@
   <string id="32102">Scroll-Modus</string>
   <string id="32103">Anzeigedauer der Navigationsansicht (s)</string>
   <string id="32104">Display-Aktualisierungsrate (Hz)</string>
+  <string id="32105">Verwende alternativen Zeichensatz</string>
+  <string id="32106">Zeichensatz</string>
+  <string id="32107">Zusatzdisplayelemente (z.B. Icons) unterstützen</string>
 
   <!--Backlight-->
   <string id="32200">Beleuchtung</string>
-  <string id="32201">Hintergrundbeleuchtung ausschalten, wenn 
Bildschirmschoner aktiv</string>
-  <string id="32202">Hintergrundbeleuchtung beim Herunterfahren 
ausschalten</string>
+  <string id="32201">wenn Bildschirmschoner aktiv</string>
+  <string id="32202">Beim Herunterfahren abdunkeln/abschalten</string>
+  <string id="32203">während Video/LiveTV-Wiedergabe</string>
+  <string id="32204">während Musik/Radio-Wiedergabe</string>
+  <string id="32205">Verzögerung (s)</string>
+  <string id="32206">Abdunkeln/Abschalten...</string>
 
   <!--Connection-->
   <string id="32300">Verbindung</string>
@@ -21,10 +28,19 @@
   <string id="32304">Heartbeatsymbol anzeigen</string>
   <string id="32305">Verbindungsfehler-Benachrichtigung verstecken</string>
 
-  <!--Enum values-->
+  <!--Enum values: Scroll mode-->
   <string id="32401">Durchlaufend</string>
   <string id="32402">Links/Rechts</string>
 
+  <!--Enum values: Charsets-->
+  <string id="32411">ISO8859-1 (Standard)</string>
+  <string id="32412">ISO8859-15</string>
+  <string id="32413">KOI8-R</string>
+  <string id="32414">CP1251</string>
+  <string id="32415">ISO8859-5</string>
+  <string id="32416">HD44780-ROM A00</string>
+  <string id="32417">HD44780-ROM A02</string>
+
   <!--Notifications-->
   <string id="32500">Fehler beim Verbinden zu LCDproc!</string>
   <string id="32501">Verbunden mit LCDproc!</string>
diff --git a/script.xbmc.lcdproc/resources/lib/extraicons.py 
b/script.xbmc.lcdproc/resources/lib/extraicons.py
index 1de8164..21d63f4 100644
--- a/script.xbmc.lcdproc/resources/lib/extraicons.py
+++ b/script.xbmc.lcdproc/resources/lib/extraicons.py
@@ -39,6 +39,7 @@ LCD_EXTRAICONS = enum(
   'LCD_EXTRAICON_WEATHER',
   'LCD_EXTRAICON_TV',
   'LCD_EXTRAICON_PHOTO',
+  'LCD_EXTRAICON_WEBCASTING',
   'LCD_EXTRAICON_MUTE',
   'LCD_EXTRAICON_REPEAT',
   'LCD_EXTRAICON_SHUFFLE',
diff --git a/script.xbmc.lcdproc/resources/lib/infolabels.py 
b/script.xbmc.lcdproc/resources/lib/infolabels.py
index 150862c..0423fd2 100644
--- a/script.xbmc.lcdproc/resources/lib/infolabels.py
+++ b/script.xbmc.lcdproc/resources/lib/infolabels.py
@@ -58,20 +58,44 @@ class WINDOW_IDS:
   WINDOW_DIALOG_VOLUME_BAR     = 10104
   WINDOW_DIALOG_KAI_TOAST      = 10107
   
+g_StreamPrefixes = [ \
+ "http", "https", "tcp",   "udp",    "rtp",  \
+ "sdp",  "mms",   "mmst",  "mmsh",   "rtsp", \
+ "rtmp", "rtmpt", "rtmpe", "rtmpte", "rtmps" \
+]
+
 global g_InfoLabel_oldMenu
 global g_InfoLabel_oldSubMenu
 global g_InfoLabel_navTimer
+global g_InfoLabel_oldFilenameandpath
+global g_InfoLabel_CachedFilenameIsStream
 
 def InfoLabel_Initialize():
   global g_InfoLabel_oldMenu
   global g_InfoLabel_oldSubMenu
   global g_InfoLabel_navTimer
+  global g_InfoLabel_oldFilenameandpath
+  global g_InfoLabel_CachedFilenameIsStream
 
   g_InfoLabel_oldMenu = ""
   g_InfoLabel_oldSubMenu = ""
   g_InfoLabel_navTimer = time.time()
+  g_InfoLabel_oldFilenameandpath = ""
+  g_InfoLabel_CachedFilenameIsStream = False
+
+def InfoLabel_GetInfoLabel(strLabel):
+  return xbmc.getInfoLabel(strLabel)
+
+def InfoLabel_GetBool(strBool):
+  return xbmc.getCondVisibility(strBool)
+
+def InfoLabel_GetActiveWindowID():
+  return int(xbmcgui.getCurrentWindowId())
 
 def InfoLabel_timeToSecs(timeAr):
+  # initialise return
+  currentSecs = 0
+
   arLen = len(timeAr)
   if arLen == 1:
     currentSecs = int(timeAr[0])
@@ -79,43 +103,54 @@ def InfoLabel_timeToSecs(timeAr):
     currentSecs = int(timeAr[0]) * 60 + int(timeAr[1])
   elif arLen == 3:
     currentSecs = int(timeAr[0]) * 60 * 60 + int(timeAr[1]) * 60 + 
int(timeAr[2])
+
   return currentSecs
 
 def InfoLabel_WindowIsActive(WindowID):
-  return xbmc.getCondVisibility("Window.IsActive(" + str(WindowID) + ")")
+  return InfoLabel_GetBool("Window.IsActive(" + str(WindowID) + ")")
 
 def InfoLabel_PlayingVideo():
-  return xbmc.getCondVisibility("Player.HasVideo")
+  return InfoLabel_GetBool("Player.HasVideo")
+
+def InfoLabel_PlayingTVShow():
+  if InfoLabel_PlayingVideo() and 
len(InfoLabel_GetInfoLabel("VideoPlayer.TVShowTitle")): 
+    return True
+  else:
+    return False
 
 def InfoLabel_PlayingAudio():
-  return xbmc.getCondVisibility("Player.HasAudio")
+  return InfoLabel_GetBool("Player.HasAudio")
 
 def InfoLabel_PlayingLiveTV():
-  return xbmc.getCondVisibility("PVR.IsPlayingTV")
+  return InfoLabel_GetBool("PVR.IsPlayingTV")
 
 def InfoLabel_PlayingLiveRadio():
-  return xbmc.getCondVisibility("PVR.IsPlayingRadio")
+  return InfoLabel_GetBool("PVR.IsPlayingRadio")
+
+def InfoLabel_GetSystemTime():
+  # apply some split magic for 12h format here, as "hh:mm:ss"
+  # makes up for format guessing inside XBMC - fix for post-frodo at
+  # https://github.com/xbmc/xbmc/pull/2321
+  ret = "0" + InfoLabel_GetInfoLabel("System.Time(hh:mm:ss)").split(" ")[0]
+  return ret[-8:]
 
 def InfoLabel_GetPlayerTime():
-  return xbmc.getInfoLabel("Player.Time")
+  return InfoLabel_GetInfoLabel("Player.Time")
 
 def InfoLabel_GetPlayerDuration():
-  return xbmc.getInfoLabel("Player.Duration")
-
-def InfoLabel_GetActiveWindowID():
-  return int(xbmcgui.getCurrentWindowId())
+  return InfoLabel_GetInfoLabel("Player.Duration")
 
 def InfoLabel_IsPlayerPlaying():
-  return xbmc.getCondVisibility("Player.Playing")
+  return InfoLabel_GetBool("Player.Playing")
 
 def InfoLabel_IsPlayerPaused():
-  return xbmc.getCondVisibility("Player.Paused")
+  return InfoLabel_GetBool("Player.Paused")
 
 def InfoLabel_IsPlayerForwarding():
-  return xbmc.getCondVisibility("Player.Forwarding")
+  return InfoLabel_GetBool("Player.Forwarding")
 
 def InfoLabel_IsPlayerRewinding():
-  return xbmc.getCondVisibility("Player.Rewinding")
+  return InfoLabel_GetBool("Player.Rewinding")
 
 def InfoLabel_IsPlayingAny():
   return (InfoLabel_IsPlayerPlaying() |
@@ -123,35 +158,48 @@ def InfoLabel_IsPlayingAny():
           InfoLabel_IsPlayerForwarding() |
           InfoLabel_IsPlayerRewinding())
 
+def InfoLabel_IsInternetStream():
+  global g_InfoLabel_oldFilenameandpath
+  global g_InfoLabel_CachedFilenameIsStream
+
+  fname = InfoLabel_GetInfoLabel("Player.Filenameandpath")
+
+  if fname != g_InfoLabel_oldFilenameandpath:
+    g_InfoLabel_oldFilenameandpath = fname
+    g_InfoLabel_CachedFilenameIsStream = False
+
+    for prefix in g_StreamPrefixes:
+      if fname.find(prefix + "://") == 0:
+        g_InfoLabel_CachedFilenameIsStream = True
+
+  return g_InfoLabel_CachedFilenameIsStream
+
 def InfoLabel_IsPassthroughAudio():
-  return xbmc.getCondVisibility("Player.Passthrough")
+  return InfoLabel_GetBool("Player.Passthrough")
 
 def InfoLabel_IsPVRRecording():
-  return xbmc.getCondVisibility("PVR.IsRecording")
+  return InfoLabel_GetBool("PVR.IsRecording")
 
 def InfoLabel_IsPlaylistRandom():
-  return xbmc.getCondVisibility("Playlist.IsRandom")
+  return InfoLabel_GetBool("Playlist.IsRandom")
 
 def InfoLabel_IsPlaylistRepeatAll():
-  return xbmc.getCondVisibility("Playlist.IsRepeat")
+  return InfoLabel_GetBool("Playlist.IsRepeat")
 
 def InfoLabel_IsPlaylistRepeatOne():
-  return xbmc.getCondVisibility("Playlist.IsRepeatOne")
+  return InfoLabel_GetBool("Playlist.IsRepeatOne")
 
 def InfoLabel_IsPlaylistRepeatAny():
   return (InfoLabel_IsPlaylistRepeatAll() | InfoLabel_IsPlaylistRepeatOne())
 
 def InfoLabel_IsDiscInDrive():
-  return xbmc.getCondVisibility("System.HasMediaDVD")
+  return InfoLabel_GetBool("System.HasMediaDVD")
 
 def InfoLabel_IsScreenSaverActive():
-  return xbmc.getCondVisibility("System.ScreenSaverActive")
-
-def InfoLabel_GetInfoLabel(strLabel):
-  return xbmc.getInfoLabel(strLabel)
+  return InfoLabel_GetBool("System.ScreenSaverActive")
 
 def InfoLabel_GetVolumePercent():
-  volumedb = 
float(string.replace(string.replace(xbmc.getInfoLabel("Player.Volume"), ",", 
"."), " dB", ""))
+  volumedb = 
float(string.replace(string.replace(InfoLabel_GetInfoLabel("Player.Volume"), 
",", "."), " dB", ""))
   return (100 * (60.0 + volumedb) / 60)
 
 def InfoLabel_GetPlayerTimeSecs():
diff --git a/script.xbmc.lcdproc/resources/lib/lcdbase.py 
b/script.xbmc.lcdproc/resources/lib/lcdbase.py
index 7c7ea07..db60af9 100644
--- a/script.xbmc.lcdproc/resources/lib/lcdbase.py
+++ b/script.xbmc.lcdproc/resources/lib/lcdbase.py
@@ -41,29 +41,26 @@ __icon__ = sys.modules[ "__main__" ].__icon__
 __lcdxml__ = xbmc.translatePath( 
os.path.join("special://masterprofile","LCD.xml"))
 __lcddefaultxml__ = xbmc.translatePath( os.path.join(__cwd__, "resources", 
"LCD.xml.defaults"))
 
+from settings import *
 from extraicons import *
 from infolabels import *
+from charset_hd44780 import *
 
 # global functions
 def log(loglevel, msg):
   xbmc.log("### [%s] - %s" % (__scriptname__,msg,),level=loglevel ) 
 
-# enumerations
-class DISABLE_ON_PLAY:
-  DISABLE_ON_PLAY_NONE = 0
-  DISABLE_ON_PLAY_VIDEO = 1
-  DISABLE_ON_PLAY_MUSIC = 2
-  
 class LCD_MODE:
   LCD_MODE_GENERAL     = 0
   LCD_MODE_MUSIC       = 1
   LCD_MODE_VIDEO       = 2
-  LCD_MODE_NAVIGATION  = 3
-  LCD_MODE_SCREENSAVER = 4
-  LCD_MODE_XBE_LAUNCH  = 5
-  LCD_MODE_PVRTV       = 6
-  LCD_MODE_PVRRADIO    = 7
-  LCD_MODE_MAX         = 8
+  LCD_MODE_TVSHOW      = 3
+  LCD_MODE_NAVIGATION  = 4
+  LCD_MODE_SCREENSAVER = 5
+  LCD_MODE_XBE_LAUNCH  = 6
+  LCD_MODE_PVRTV       = 7
+  LCD_MODE_PVRRADIO    = 8
+  LCD_MODE_MAX         = 9
 
 class LCD_LINETYPE:
   LCD_LINETYPE_TEXT      = "text"
@@ -85,23 +82,29 @@ g_dictEmptyLineDescriptor['align'] = 
LCD_LINEALIGN.LCD_LINEALIGN_LEFT
 
 class LcdBase():
   def __init__(self):
-    self.m_disableOnPlay = DISABLE_ON_PLAY.DISABLE_ON_PLAY_NONE
-    self.m_timeDisableOnPlayTimer = time.time()
+    # configuration vars (from LCD.xml)
     self.m_lcdMode = [None] * LCD_MODE.LCD_MODE_MAX
     self.m_extraBars = [None] * (LCD_EXTRABARS_MAX + 1)
-    self.m_bDimmedOnPlayback = False
-    self.m_iDimOnPlayDelay = 0
-    self.m_strInfoLabelEncoding = "utf-8" # 
http://forum.xbmc.org/showthread.php?tid=125492&pid=1045926#pid1045926
-    self.m_strLCDEncoding = "iso-8859-1" # LCDproc wants iso-8859-1!
-    self.m_strScrollSeparator = " "
+    self.m_bAllowEmptyLines = False
+    self.m_bCenterBigDigits = False
+    self.m_bDisablePlayIndicatorOnPause = False
     self.m_bProgressbarSurroundings = False
+    self.m_iDimOnPlayDelay = 0
     self.m_iIconTextOffset = 2
-    self.m_bAllowEmptyLines = False
-    self.m_strOldVideoCodec = ""
-    self.m_strOldAudioCodec = ""
-    self.m_iOldAudioChannelsVar = 0
+    self.m_strLCDEncoding = "iso-8859-1" # LCDproc default is iso-8859-1!
+    self.m_strScrollSeparator = " "
+
+    # runtime vars/state tracking
+    self.m_strInfoLabelEncoding = "utf-8" # 
http://forum.xbmc.org/showthread.php?tid=125492&pid=1045926#pid1045926
+    self.m_timeDisableOnPlayTimer = time.time()
+    self.m_bCurrentlyDimmed = False
+    self.m_bHaveHD44780Charmap = False
+    self.m_bVolumeChangeActive = False
     self.m_bWasStopped = True
     self.m_bXMLWarningDisplayed = False
+    self.m_iOldAudioChannelsVar = 0
+    self.m_strOldAudioCodec = ""
+    self.m_strOldVideoCodec = ""
 
 # @abstractmethod
   def _concrete_method(self):
@@ -186,21 +189,53 @@ class LcdBase():
     return ret
 
   def Initialize(self):
-    strXMLFile = __lcdxml__
-    self.m_disableOnPlay = DISABLE_ON_PLAY.DISABLE_ON_PLAY_NONE
+    bGotDefaultSkin = False
+    bSkinHandled = False
+
+    try:
+      if not self.m_bHaveHD44780Charmap:
+        log(xbmc.LOGDEBUG, "Registering HD44780-ROM pseudocodepages")
+        codecs.register(charset_hd44780)
+        self.m_bHaveHD44780Charmap = True
+    except:
+      log(xbmc.LOGERROR, "Failed to register custom HD44780-ROM 
pseudocodepage, expect problems with alternative charsets!")
+
+    # make sure we got reasonable defaults for users who didn't adapt to 
newest additions
+    bGotDefaultSkin = self.LoadSkin(__lcddefaultxml__, True)
 
-    if not self.ManageLCDXML():
-      strXMLFile = __lcddefaultxml__
+    # check for user-LCD.xml, optionally create it
+    bSkinHandled = self.ManageLCDXML()
 
-    if not self.LoadSkin(strXMLFile):
+    # try to load user setup
+    if not self.LoadSkin(__lcdxml__, False) and not bGotDefaultSkin:
+      log(xbmc.LOGERROR, "No usable mode configuration/skin could be loaded, 
check your addon installation!")
       return False
 
+    # force-update GUI settings
+    self.UpdateGUISettings()
+
+    self.m_bCurrentlyDimmed = False
     return True
 
-  def LoadSkin(self, xmlFile):
-    self.Reset()
+  def UpdateGUISettings(self):
+    str_charset = settings_getCharset()
+    if str_charset != self.m_strLCDEncoding:
+      if (str_charset == "hd44780-a00" or str_charset == "hd44780-a02") and 
not self.m_bHaveHD44780Charmap:
+        str_charset = "iso8859-1"
+
+      self.m_strLCDEncoding = str_charset
+      log(xbmc.LOGDEBUG, "Setting character encoding to %s" % 
(self.m_strLCDEncoding))
+
+    self.m_iDimOnPlayDelay = settings_getDimDelay()
+
+  def LoadSkin(self, xmlFile, doReset):
+    if doReset == True:
+      self.Reset()
+
     bHaveSkin = False
 
+    log(xbmc.LOGNOTICE, "Loading settings from %s" % (xmlFile))
+
     try:
       doc = xmltree.parse(xmlFile)
     except:
@@ -217,30 +252,6 @@ class LcdBase():
       if element.tag == "lcd":
         # load our settings  
 
-        # disable on play
-        disableOnPlay = element.find("disableonplay")
-        if disableOnPlay != None:
-          self.m_disableOnPlay = DISABLE_ON_PLAY.DISABLE_ON_PLAY_NONE
-          if str(disableOnPlay.text).find("video") >= 0:
-            self.m_disableOnPlay += DISABLE_ON_PLAY.DISABLE_ON_PLAY_VIDEO
-          if str(disableOnPlay.text).find("music") >= 0:
-            self.m_disableOnPlay += DISABLE_ON_PLAY.DISABLE_ON_PLAY_MUSIC
-
-        # disable on play delay
-        self.m_iDimOnPlayDelay = 0
-
-        disableonplaydelay = element.find("disableonplaydelay")
-        if disableonplaydelay != None and disableonplaydelay.text != None:
-          try:
-            intdelay = int(disableonplaydelay.text)
-          except ValueError, TypeError:
-            log(xbmc.LOGERROR, "Value for disableonplaydelay must be integer 
(got: %s)" % (disableonplaydelay.text))
-          else:
-            if intdelay < 0:
-              log(xbmc.LOGERROR, "Value %d for disableonplaydelay smaller than 
zero, ignoring" % (intdelay))
-            else:
-              self.m_iDimOnPlayDelay = intdelay
-
         # apply scrollseparator
         scrollSeparator = element.find("scrollseparator")
         if scrollSeparator != None:
@@ -281,12 +292,28 @@ class LcdBase():
           if str(allowemptylines.text).lower() in ["on", "true"]:
             self.m_bAllowEmptyLines = True
 
+        # check for centerbigdigits setting
+        self.m_bCenterBigDigits = False
+
+        centerbigdigits = element.find("centerbigdigits")
+        if centerbigdigits != None:
+          if str(centerbigdigits.text).lower() in ["on", "true"]:
+            self.m_bCenterBigDigits = True
+
+        # check for disableplayindicatoronpause setting
+        self.m_bDisablePlayIndicatorOnPause = False
+
+        disableplayindicatoronpause = 
element.find("disableplayindicatoronpause")
+        if disableplayindicatoronpause != None:
+          if str(disableplayindicatoronpause.text).lower() in ["on", "true"]:
+            self.m_bDisablePlayIndicatorOnPause = True
+
         # extra progress bars
         for i in range(1, LCD_EXTRABARS_MAX + 1):
           extrabar = None
           extrabar = element.find("extrabar%i" % (i))
           if extrabar != None:
-            if str(extrabar.text).strip() in ["progress", "volume", "menu"]:
+            if str(extrabar.text).strip() in ["progress", "volume", 
"volumehidden", "menu", "alwayson"]:
               self.m_extraBars[i] = str(extrabar.text).strip()
             else:
               self.m_extraBars[i] = ""
@@ -298,6 +325,9 @@ class LcdBase():
         tmpMode = element.find("video")
         self.LoadMode(tmpMode, LCD_MODE.LCD_MODE_VIDEO)
 
+        tmpMode = element.find("tvshow")
+        self.LoadMode(tmpMode, LCD_MODE.LCD_MODE_TVSHOW)
+
         tmpMode = element.find("general")
         self.LoadMode(tmpMode, LCD_MODE.LCD_MODE_GENERAL)
 
@@ -324,14 +354,24 @@ class LcdBase():
     return bHaveSkin
 
   def LoadMode(self, node, mode):
+    # clear mode (probably overriding defaults), assume the user knows what he 
wants if an empty node is given
+    self.m_lcdMode[mode] = []
+    
     if node == None:
-      log(xbmc.LOGWARNING, "Empty Mode %d, check LCD.xml" % (mode))
-      self.m_lcdMode[mode].append(g_dictEmptyLineDescriptor)
+      log(xbmc.LOGWARNING, "Empty Mode %d, consider checking LCD.xml" % (mode))
+
+      # if mode is empty, initialise with blank line
+      if len(self.m_lcdMode[mode]) <= 0:
+        self.m_lcdMode[mode].append(g_dictEmptyLineDescriptor)
+
       return
 
     if len(node.findall("line")) <= 0:
-      log(xbmc.LOGWARNING, "Mode %d defined without lines, check LCD.xml" % 
(mode))
-      self.m_lcdMode[mode].append(g_dictEmptyLineDescriptor)
+      log(xbmc.LOGWARNING, "Mode %d defined without lines, consider checking 
LCD.xml" % (mode))
+
+      if len(self.m_lcdMode[mode]) <= 0:
+        self.m_lcdMode[mode].append(g_dictEmptyLineDescriptor)
+
       return
 
     # regex to determine any of $INFO[LCD.Time(Wide)21-44]
@@ -403,26 +443,23 @@ class LcdBase():
       self.m_lcdMode[mode].append(linedescriptor)
 
   def Reset(self):
-    self.m_disableOnPlay = DISABLE_ON_PLAY.DISABLE_ON_PLAY_NONE
     for i in range(0,LCD_MODE.LCD_MODE_MAX):
       self.m_lcdMode[i] = []                   #clear list
 
-  def Shutdown(self, bDimOnShutdown):
+  def Shutdown(self):
     log(xbmc.LOGNOTICE, "Shutting down")
 
-    if bDimOnShutdown:
+    if settings_getDimOnShutdown():
       self.SetBackLight(0)
 
-    if self.m_cExtraIcons is not None:
-      if not self.SendCommand(self.m_cExtraIcons.GetClearAllCmd(), True):
-        log(xbmc.LOGERROR, "Shutdown(): Cannot clear extra icons")
-
     self.CloseSocket()
 
   def Render(self, mode, bForce):
     outLine = 0
     inLine = 0
 
+    self.HandleBacklight(mode)
+
     while (outLine < int(self.GetRows()) and inLine < 
len(self.m_lcdMode[mode])):
       #parse the progressbar infolabel by ourselfs!
       if self.m_lcdMode[mode][inLine]['type'] == 
LCD_LINETYPE.LCD_LINETYPE_PROGRESS:
@@ -434,9 +471,14 @@ class LcdBase():
         if self.m_lcdMode[mode][inLine]['type'] == 
LCD_LINETYPE.LCD_LINETYPE_ICONTEXT:
           self.SetPlayingStateIcon()
 
-        line = InfoLabel_GetInfoLabel(self.m_lcdMode[mode][inLine]['text'])
+        srcline = InfoLabel_GetInfoLabel(self.m_lcdMode[mode][inLine]['text'])
         if self.m_strInfoLabelEncoding != self.m_strLCDEncoding:
-          line = 
line.decode(self.m_strInfoLabelEncoding).encode(self.m_strLCDEncoding, 
"replace")
+          try:
+            line = 
srcline.decode(self.m_strInfoLabelEncoding).encode(self.m_strLCDEncoding, 
"replace")
+          except:
+            log(xbmc.LOGDEBUG, "Caught exception on charset conversion: " + 
srcline)
+            line = "---"
+
         self.SetProgressBar(0, -1)
 
       if self.m_bAllowEmptyLines or len(line) > 0:
@@ -457,24 +499,34 @@ class LcdBase():
 
     self.FlushLines()
 
-  def DisableOnPlayback(self, playingVideo, playingAudio):
-    # check if any dimming is requested and matching config
-    dodim = (playingVideo and (self.m_disableOnPlay & 
DISABLE_ON_PLAY.DISABLE_ON_PLAY_VIDEO)) or (playingAudio and 
(self.m_disableOnPlay & DISABLE_ON_PLAY.DISABLE_ON_PLAY_MUSIC))
+  def DoDimOnMusic(self, mode):
+    return (mode == LCD_MODE.LCD_MODE_MUSIC or mode == 
LCD_MODE.LCD_MODE_PVRRADIO) and settings_getDimOnMusicPlayback()
 
-    # if dimrequest matches, check if pause is active (don't dim then)
-    if dodim:
-      dodim = dodim and not InfoLabel_IsPlayerPaused()
+  def DoDimOnVideo(self, mode):
+    return (mode == LCD_MODE.LCD_MODE_VIDEO or LCD_MODE.LCD_MODE_TVSHOW or 
mode == LCD_MODE.LCD_MODE_PVRTV) and settings_getDimOnVideoPlayback()
+
+  def DoDimOnScreensaver(self, mode):
+    return (mode == LCD_MODE.LCD_MODE_SCREENSAVER) and 
settings_getDimOnScreensaver()
+
+  def HandleBacklight(self, mode):
+    # dimming display in case screensaver is active or something is being 
played back (and not paused!)
+    doDim = False
+
+    if self.DoDimOnScreensaver(mode):
+      doDim = True
+    elif not InfoLabel_IsPlayerPaused() and (self.DoDimOnVideo(mode) or 
self.DoDimOnMusic(mode)):
+      doDim = True
     
-    if dodim:
-      if not self.m_bDimmedOnPlayback:
+    if doDim:
+      if not self.m_bCurrentlyDimmed:
         if (self.m_timeDisableOnPlayTimer + self.m_iDimOnPlayDelay) < 
time.time():
           self.SetBackLight(0)
-          self.m_bDimmedOnPlayback = True
+          self.m_bCurrentlyDimmed = True
     else:
       self.m_timeDisableOnPlayTimer = time.time()
-      if self.m_bDimmedOnPlayback:
+      if self.m_bCurrentlyDimmed:
         self.SetBackLight(1)
-        self.m_bDimmedOnPlayback = False
+        self.m_bCurrentlyDimmed = False
 
   def SetExtraInfoPlaying(self, isplaying, isvideo, isaudio):
     # make sure output scaling indicators are off when not playing and/or not 
playing video
@@ -495,6 +547,8 @@ class LcdBase():
 
         if InfoLabel_PlayingLiveTV():
           self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_TV, 
True)
+        elif InfoLabel_IsInternetStream():
+          
self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_WEBCASTING, True)
         else:
           self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_MOVIE, 
True)
 
@@ -509,7 +563,10 @@ class LcdBase():
           self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_OUTFIT, 
True)
 
       elif isaudio:
-        self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_MUSIC, 
True)
+        if InfoLabel_IsInternetStream():
+          
self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_WEBCASTING, True)
+        else:
+          self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_MUSIC, 
True)
 
     else: # not playing
 
@@ -692,8 +749,10 @@ class LcdBase():
 
     if InfoLabel_WindowIsActive(WINDOW_IDS.WINDOW_DIALOG_VOLUME_BAR):
       self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_VOLUME, 
True)
+      self.m_bVolumeChangeActive = True
     else:
       self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_VOLUME, 
False)
+      self.m_bVolumeChangeActive = False
 
     if InfoLabel_WindowIsActive(WINDOW_IDS.WINDOW_DIALOG_KAI_TOAST):
       self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_ALARM, True)
@@ -709,11 +768,18 @@ class LcdBase():
           self.m_cExtraIcons.SetBar(i, 0)
       elif self.m_extraBars[i] == "volume":
         self.m_cExtraIcons.SetBar(i, InfoLabel_GetVolumePercent())
+      elif self.m_extraBars[i] == "volumehidden":
+        if self.m_bVolumeChangeActive:
+          self.m_cExtraIcons.SetBar(i, InfoLabel_GetVolumePercent())
+        else:
+          self.m_cExtraIcons.SetBar(i, 0)
       elif self.m_extraBars[i] == "menu":
         if isplaying:
           self.m_cExtraIcons.SetBar(i, 0)
         else:
           self.m_cExtraIcons.SetBar(i, 100)
+      elif self.m_extraBars[i] == "alwayson":
+        self.m_cExtraIcons.SetBar(i, 100)
       else:
         self.m_cExtraIcons.SetBar(i, 0)
 
@@ -724,7 +790,8 @@ class LcdBase():
     bIsVideo = InfoLabel_PlayingVideo()
     bIsAudio = InfoLabel_PlayingAudio()
 
-    self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_PLAYING, 
bPlaying)
+    self.m_cExtraIcons.SetIconState(LCD_EXTRAICONS.LCD_EXTRAICON_PLAYING,
+      bPlaying and not (bPaused and self.m_bDisablePlayIndicatorOnPause))
 
     self.SetExtraInfoPlaying(bPlaying, bIsVideo, bIsAudio)
     self.SetExtraInfoCodecs(bPlaying, bIsVideo, bIsAudio)
diff --git a/script.xbmc.lcdproc/resources/lib/lcdproc.py 
b/script.xbmc.lcdproc/resources/lib/lcdproc.py
index 384cec5..e18d364 100644
--- a/script.xbmc.lcdproc/resources/lib/lcdproc.py
+++ b/script.xbmc.lcdproc/resources/lib/lcdproc.py
@@ -60,6 +60,7 @@ class LCDProc(LcdBase):
     self.m_initRetryInterval = INIT_RETRY_INTERVAL
     self.m_used = True
     self.tn = telnetlib.Telnet()
+    self.tnsocket = None
     self.m_timeLastSockAction = time.time()
     self.m_timeSocketIdleTimeout = 2
     self.m_strLineText = [None]*MAX_ROWS
@@ -70,6 +71,7 @@ class LCDProc(LcdBase):
     self.m_iProgressBarLine = -1
     self.m_strIconName = "BLOCK_FILLED"
     self.m_iBigDigits = int(8) # 12:45:78 / colons count as digit
+    self.m_iOffset = 1
     self.m_strSetLineCmds = ""
     self.m_cExtraIcons = None
     self.m_vPythonVersion = sys.version_info
@@ -90,8 +92,9 @@ class LCDProc(LcdBase):
       sendcmd += "\n"
 
     try:
-      # Send to server
-      self.tn.write(sendcmd)
+      # Send to server via raw socket to prevent telnetlib tampering with
+      # certain chars (especially 0xFF -> telnet IAC)
+      self.tnsocket.sendall(sendcmd)
     except:
       # Something bad happened, abort
       log(xbmc.LOGERROR, "SendCommand: Telnet exception - send")
@@ -211,6 +214,7 @@ class LCDProc(LcdBase):
         self.m_initRetryInterval = INIT_RETRY_INTERVAL
         self.m_bStop = False
         connected = True
+
       else:
         log(xbmc.LOGERROR, "Connection successful but LCD.xml has errors, 
aborting connect")
 
@@ -231,6 +235,9 @@ class LCDProc(LcdBase):
   def DetermineExtraSupport(self):
     rematch_imon = "SoundGraph iMON(.*)LCD"
     rematch_mdm166a = "Targa(.*)mdm166a"
+    rematch_imonvfd = "Soundgraph(.*)VFD"
+    
+    bUseExtraIcons = settings_getUseExtraElements()
 
     # Never cause script failure/interruption by this! This is totally 
optional!
     try:
@@ -247,12 +254,22 @@ class LCDProc(LcdBase):
 
       if re.match(rematch_imon, reply):
         log(xbmc.LOGNOTICE, "SoundGraph iMON LCD detected")
-        self.m_cExtraIcons = LCDproc_extra_imon()
-        self.m_cExtraIcons.Initialize()
+        if bUseExtraIcons:
+          self.m_cExtraIcons = LCDproc_extra_imon()
+
+        # override bigdigits counter, the imonlcd driver handles bigdigits
+        # different: digits count for two columns instead of three
+        self.m_iBigDigits = 7
 
       elif re.match(rematch_mdm166a, reply):
         log(xbmc.LOGNOTICE, "Futaba/Targa USB mdm166a VFD detected")
-        self.m_cExtraIcons = LCDproc_extra_mdm166a()
+        if bUseExtraIcons:
+          self.m_cExtraIcons = LCDproc_extra_mdm166a()
+
+      elif re.match(rematch_imonvfd, reply):
+        log(xbmc.LOGNOTICE, "SoundGraph iMON IR/VFD detected")
+
+      if self.m_cExtraIcons is not None:
         self.m_cExtraIcons.Initialize()
 
     except:
@@ -295,18 +312,30 @@ class LCDProc(LcdBase):
       # tell users what's going on
       log(xbmc.LOGNOTICE, "Connected to LCDd at %s:%s, Protocol version %s - 
Geometry %sx%s characters (%sx%s pixels, %sx%s pixels per character)" % 
(str(ip), str(port), float(lcdinfo.group(1)), str(self.m_iColumns), 
str(self.m_iRows), str(self.m_iColumns * self.m_iCellWidth), str(self.m_iRows * 
self.m_iCellHeight), str(self.m_iCellWidth), str(self.m_iCellHeight)))
 
-      self.DetermineExtraSupport()
-
       # Set up BigNum values based on display geometry
-      if self.m_iColumns < 16:
-        self.m_iBigDigits = 5
+      if self.m_iColumns < 13:
+        self.m_iBigDigits = 0 # No clock
+      elif self.m_iColumns < 17:
+        self.m_iBigDigits = 5 # HH:MM
       elif self.m_iColumns < 20:
-        self.m_iBigDigits = 7
+        self.m_iBigDigits = 7 # H:MM:SS on play, HH:MM on clock
+      else:
+        self.m_iBigDigits = 8 # HH:MM:SS
+
+      # Check LCDproc if we can enable any extras or override values
+      # (might override e.g. m_iBigDigits!)
+      self.DetermineExtraSupport()
 
     except:
       log(xbmc.LOGERROR,"Connect: Caught exception, aborting.")
       return False
 
+    # retrieve raw socket object
+    self.tnsocket = self.tn.get_socket()
+    if self.tnsocket is None:
+      log(xbmc.LOGERROR, "Retrieval of socket object failed!")
+      return False
+
     if not self.SetupScreen():
       log(xbmc.LOGERROR, "Screen setup failed!")
       return False      
@@ -314,9 +343,14 @@ class LCDProc(LcdBase):
     return True
 
   def CloseSocket(self):
-    if self.tn.get_socket() != None:
+    if self.tnsocket:
       # no pyexceptions, please, we're disconnecting anyway
       try:
+        # if we served extra elements, (try to) reset them
+        if self.m_cExtraIcons is not None:
+          if not self.SendCommand(self.m_cExtraIcons.GetClearAllCmd(), True):
+            log(xbmc.LOGERROR, "CloseSocket(): Cannot clear extra icons")
+
         # do gracefully disconnect (send directly as we won't get any response 
on this)
         self.tn.write("bye\n")
         # and close socket afterwards
@@ -325,11 +359,16 @@ class LCDProc(LcdBase):
         # exception caught on this, so what? :)
         pass
 
+    # delete/cleanup extra support instance
+    del self.m_cExtraIcons
+    self.m_cExtraIcons = None
+
+    self.tnsocket = None
     del self.tn
     self.tn = telnetlib.Telnet()
 
   def IsConnected(self):
-    if self.tn.get_socket() == None:
+    if not self.tnsocket:
       return False
 
     # Ping only every SocketIdleTimeout seconds
@@ -343,16 +382,14 @@ class LCDProc(LcdBase):
     return True
 
   def SetBackLight(self, iLight):
-    if self.tn.get_socket() == None:
+    if not self.tnsocket:
       return
     log(xbmc.LOGDEBUG, "Switch Backlight to: " + str(iLight))
 
     # Build command
     if iLight == 0:
-      #self.m_bStop = True
       cmd = "screen_set xbmc -backlight off\n"
     elif iLight > 0:
-      #self.m_bStop = False
       cmd = "screen_set xbmc -backlight on\n"
 
     # Send to server
@@ -369,7 +406,7 @@ class LCDProc(LcdBase):
     self.m_bStop = True
 
   def Suspend(self):
-    if self.m_bStop or self.tn.get_socket() == None:
+    if self.m_bStop or not self.tnsocket:
       return
 
     # Build command to suspend screen
@@ -381,7 +418,7 @@ class LCDProc(LcdBase):
       self.CloseSocket()
 
   def Resume(self):
-    if self.m_bStop or self.tn.get_socket() == None:
+    if self.m_bStop or not self.tnsocket:
       return
 
     # Build command to resume screen
@@ -396,13 +433,15 @@ class LCDProc(LcdBase):
     return int(self.m_iColumns)
 
   def GetBigDigitTime(self):
-      ret = InfoLabel_GetPlayerTime()
+      ret = InfoLabel_GetPlayerTime()[-self.m_iBigDigits:]
 
       if ret == "": # no usable timestring, e.g. not playing anything
-        if self.m_iBigDigits < 8: # return only h:m when display too small
-          ret = time.strftime("%X")[:5] # %X = locale-based currenttime
-        else:
-          ret = time.strftime("%X")[:8]
+        strSysTime = InfoLabel_GetSystemTime()
+
+        if self.m_iBigDigits >= 8: # return h:m:s
+          ret = strSysTime
+        elif self.m_iBigDigits >= 5: # return h:m when display too small
+          ret = strSysTime[:5]
 
       return ret
 
@@ -417,8 +456,18 @@ class LCDProc(LcdBase):
 
     iStringLength = int(len(strTimeString))
 
+    if self.m_bCenterBigDigits:
+      iColons = strTimeString.count(":")
+      iWidth  = 3 * (iStringLength - iColons) + iColons
+      iOffset = 1 + max(self.m_iColumns - iWidth, 0) / 2
+
     if iStringLength > self.m_iBigDigits:
       iStringOffset = len(strTimeString) - self.m_iBigDigits
+      iOffset = 1;
+
+    if self.m_iOffset != iOffset:
+      self.ClearBigDigits()
+      self.m_iOffset = iOffset
 
     for i in range(int(iStringOffset), int(iStringLength)):
       if self.m_strDigits[iDigitCount] != strTimeString[i] or bForceUpdate:
@@ -426,8 +475,10 @@ class LCDProc(LcdBase):
         
         if strTimeString[i] == ":":
           self.m_strSetLineCmds += "widget_set xbmc lineBigDigit%i %i 10\n" % 
(iDigitCount, iOffset)
-        else:
+        elif strTimeString[i].isdigit():
           self.m_strSetLineCmds += "widget_set xbmc lineBigDigit%i %i %s\n" % 
(iDigitCount, iOffset, strTimeString[i])
+        else:
+          self.m_strSetLineCmds += "widget_set xbmc lineBigDigit" + 
str(iDigitCount) + " 0 0\n"
 
       if strTimeString[i] == ":":
         iOffset += 1
@@ -436,10 +487,10 @@ class LCDProc(LcdBase):
 
       iDigitCount += 1
 
-    for j in range(i + 2, int(self.m_iBigDigits + 1)):
+    while iDigitCount <= self.m_iBigDigits:
       if self.m_strDigits[iDigitCount] != "" or bForceUpdate:
         self.m_strDigits[iDigitCount] = ""
-        self.m_strSetLineCmds += "widget_set xbmc lineBigDigit" + str(j) + " 0 
0\n"
+        self.m_strSetLineCmds += "widget_set xbmc lineBigDigit" + 
str(iDigitCount) + " 0 0\n"
       
       iDigitCount += 1
 
@@ -483,9 +534,9 @@ class LCDProc(LcdBase):
     self.m_strSetLineCmds += "widget_set xbmc lineIcon%i 0 0 BLOCK_FILLED\n" % 
(iLine)
     self.m_strSetLineCmds += "widget_set xbmc lineProgress%i 0 0 0\n" % (iLine)
     self.m_strSetLineCmds += "widget_set xbmc lineScroller%i 1 %i %i %i m 1 
\"\"\n" % (iLine, iLine, self.m_iColumns, iLine)
-    
+
   def SetLine(self, iLine, strLine, dictDescriptor, bForce):
-    if self.m_bStop or self.tn.get_socket() == None:
+    if self.m_bStop or not self.tnsocket:
       return
 
     if iLine < 0 or iLine >= int(self.m_iRows):
diff --git a/script.xbmc.lcdproc/resources/lib/lcdproc_extra_imon.py 
b/script.xbmc.lcdproc/resources/lib/lcdproc_extra_imon.py
index 8397186..7a54ab3 100644
--- a/script.xbmc.lcdproc/resources/lib/lcdproc_extra_imon.py
+++ b/script.xbmc.lcdproc/resources/lib/lcdproc_extra_imon.py
@@ -200,6 +200,10 @@ class LCDproc_extra_imon(LCDproc_extra_base):
       self.m_iOutputValueIcons &= IMON_ICONS.ICON_CLEAR_TOPROW
       self._SetIconStateDo(IMON_ICONS.ICON_TOP_MUSIC, state)
 
+    elif icon == LCD_EXTRAICONS.LCD_EXTRAICON_WEBCASTING:
+      self.m_iOutputValueIcons &= IMON_ICONS.ICON_CLEAR_TOPROW
+      self._SetIconStateDo(IMON_ICONS.ICON_TOP_WEBCASTING, state)
+
     elif icon == LCD_EXTRAICONS.LCD_EXTRAICON_WEATHER:
       self.m_iOutputValueIcons &= IMON_ICONS.ICON_CLEAR_TOPROW
       self._SetIconStateDo(IMON_ICONS.ICON_TOP_NEWSWEATHER, state)
diff --git a/script.xbmc.lcdproc/resources/lib/settings.py 
b/script.xbmc.lcdproc/resources/lib/settings.py
index 1e624cf..c7a69e1 100644
--- a/script.xbmc.lcdproc/resources/lib/settings.py
+++ b/script.xbmc.lcdproc/resources/lib/settings.py
@@ -42,9 +42,15 @@ global g_scrollmode
 global g_settingsChanged
 global g_dimonscreensaver
 global g_dimonshutdown
+global g_dimonvideoplayback
+global g_dimonmusicplayback
+global g_dimdelay
 global g_navtimeout
 global g_refreshrate
 global g_hideconnpopups
+global g_usealternatecharset
+global g_charset
+global g_useextraelements
 
 #init globals with defaults
 def settings_initGlobals():
@@ -57,22 +63,34 @@ def settings_initGlobals():
   global g_settingsChanged
   global g_dimonscreensaver
   global g_dimonshutdown
+  global g_dimonvideoplayback
+  global g_dimonmusicplayback
+  global g_dimdelay
   global g_navtimeout
   global g_refreshrate
   global g_hideconnpopups
-
-  g_hostip           = "127.0.0.1"
-  g_hostport         = 13666
-  g_timer            = time.time()   
-  g_heartbeat        = False
-  g_scrolldelay      = 1
-  g_scrollmode       = "0"
-  g_settingsChanged  = True
-  g_dimonscreensaver = False
-  g_dimonshutdown    = False
-  g_navtimeout       = 3
-  g_refreshrate      = 1
-  g_hideconnpopups   = True
+  global g_usealternatecharset
+  global g_charset
+  global g_useextraelements
+
+  g_hostip              = "127.0.0.1"
+  g_hostport            = 13666
+  g_timer               = time.time()   
+  g_heartbeat           = False
+  g_scrolldelay         = 1
+  g_scrollmode          = "0"
+  g_settingsChanged     = True
+  g_dimonscreensaver    = False
+  g_dimonshutdown       = False
+  g_dimonvideoplayback  = False
+  g_dimonmusicplayback  = False
+  g_dimdelay            = 0
+  g_navtimeout          = 3
+  g_refreshrate         = 1
+  g_hideconnpopups      = True
+  g_usealternatecharset = False
+  g_charset             = "iso-8859-1"
+  g_useextraelements    = True
 
 def settings_getHostIp():
   global g_hostip
@@ -86,6 +104,10 @@ def settings_getHeartBeat():
   global g_heartbeat
   return g_heartbeat
 
+def settings_getUseExtraElements():
+  global g_useextraelements
+  return g_useextraelements
+
 def settings_getScrollDelay():
   global g_scrolldelay
   return g_scrolldelay
@@ -108,6 +130,18 @@ def settings_getDimOnShutdown():
   global g_dimonshutdown
   return g_dimonshutdown
 
+def settings_getDimOnVideoPlayback():
+  global g_dimonvideoplayback
+  return g_dimonvideoplayback
+
+def settings_getDimOnMusicPlayback():
+  global g_dimonmusicplayback
+  return g_dimonmusicplayback
+
+def settings_getDimDelay():
+  global g_dimdelay
+  return g_dimdelay
+
 def settings_getNavTimeout():
   global g_navtimeout
   return g_navtimeout
@@ -120,6 +154,33 @@ def settings_getHideConnPopups():
   global g_hideconnpopups
   return g_hideconnpopups
 
+def settings_getCharset():
+  global g_usealternatecharset
+  global g_charset
+  ret = ""
+
+  # if alternatecharset is disabled, return LCDproc's default
+  if g_usealternatecharset == False:
+    ret = "iso-8859-1"
+  else:
+    # make sure to keep this in sync with settings.xml!
+    if g_charset == "1":
+      ret = "iso-8859-15"
+    elif g_charset == "2":
+      ret = "koi8-r"
+    elif g_charset == "3":
+      ret = "cp1251"
+    elif g_charset == "4":
+      ret = "iso-8859-5"
+    elif g_charset == "5":
+      ret = "hd44780-a00"
+    elif g_charset == "6":
+      ret = "hd44780-a02"
+    else:
+      ret = "iso-8859-1"
+
+  return ret
+  
 #check for new settings and handle them if anything changed
 #only checks if the last check is 5 secs old
 #returns if a reconnect is needed due to settings change
@@ -140,18 +201,21 @@ def settings_didSettingsChange():
   g_settingsChanged = False
   return settingsChanged
   
-#handle all settings in the general tab according to network access
-#returns true if reconnect is needed due to network changes
-def settings_handleNetworkSettings():
+# handle all settings that might require a reinit and/or reconnect
+# (e.g. network config changes)
+# returns true if reconnect is needed due to network changes
+def settings_handleCriticalSettings():
   global g_hostip
   global g_hostport
   global g_heartbeat
+  global g_useextraelements
 
   reconnect = False
 
   hostip    = __settings__.getSetting("hostip")
   hostport  = int(__settings__.getSetting("hostport"))
   heartbeat = __settings__.getSetting("heartbeat") == "true"
+  useextraelements = __settings__.getSetting("useextraelements") == "true"
 
   #server settings
   #we need to reconnect if networkaccess bool changes
@@ -179,6 +243,12 @@ def settings_handleNetworkSettings():
       g_heartbeat = heartbeat
       reconnect = True
 
+  # extra element support needs a reinit+reconnect so the extraelement
+  # support object resets
+  if g_useextraelements != useextraelements:
+    g_useextraelements = useextraelements
+    reconnect = True
+
   return reconnect
 
 def settings_handleLcdSettings():
@@ -188,9 +258,14 @@ def settings_handleLcdSettings():
   global g_settingsChanged
   global g_dimonscreensaver
   global g_dimonshutdown
+  global g_dimonvideoplayback
+  global g_dimonmusicplayback
+  global g_dimdelay
   global g_navtimeout
   global g_refreshrate
   global g_hideconnpopups
+  global g_usealternatecharset
+  global g_charset
 
   g_settingsChanged = False
 
@@ -198,10 +273,15 @@ def settings_handleLcdSettings():
   scrollmode = __settings__.getSetting("scrollmode")
   dimonscreensaver = __settings__.getSetting("dimonscreensaver") == "true"
   dimonshutdown = __settings__.getSetting("dimonshutdown") == "true"
+  dimonvideoplayback = __settings__.getSetting("dimonvideoplayback") == "true"
+  dimonmusicplayback = __settings__.getSetting("dimonmusicplayback") == "true"
+  dimdelay = int(float(string.replace(__settings__.getSetting("dimdelay"), 
",", ".")))
   navtimeout = int(float(string.replace(__settings__.getSetting("navtimeout"), 
",", ".")))
   refreshrate = 
int(float(string.replace(__settings__.getSetting("refreshrate"), ",", ".")))
   hideconnpopups = __settings__.getSetting("hideconnpopups") == "true"
- 
+  usealternatecharset = __settings__.getSetting("usealternatecharset") == 
"true"
+  charset = __settings__.getSetting("charset")
+
   if g_scrolldelay != scrolldelay:
     g_scrolldelay = scrolldelay
     g_settingsChanged = True
@@ -217,6 +297,18 @@ def settings_handleLcdSettings():
   if g_dimonshutdown != dimonshutdown:
     g_dimonshutdown = dimonshutdown
     g_settingsChanged = True
+  
+  if g_dimonvideoplayback != dimonvideoplayback:
+    g_dimonvideoplayback = dimonvideoplayback
+    g_settingsChanged = True
+  
+  if g_dimonmusicplayback != dimonmusicplayback:
+    g_dimonmusicplayback = dimonmusicplayback
+    g_settingsChanged = True
+
+  if g_dimdelay != dimdelay:
+    g_dimdelay = dimdelay
+    g_settingsChanged = True
     
   if g_navtimeout != navtimeout:
     g_navtimeout = navtimeout
@@ -234,12 +326,19 @@ def settings_handleLcdSettings():
     g_hideconnpopups = hideconnpopups
     g_settingsChanged = True
 
+  if g_usealternatecharset != usealternatecharset:
+    g_usealternatecharset = usealternatecharset
+    g_settingsChanged = True
+
+  if g_charset != charset:
+    g_charset = charset
+    g_settingsChanged = True
+
 #handles all settings and applies them as needed
 #returns if a reconnect is needed due to settings changes
 def settings_setup():  
   reconnect = False
-  reconnect = settings_handleNetworkSettings()
+  reconnect = settings_handleCriticalSettings()
   settings_handleLcdSettings()
 
   return reconnect
-  
diff --git a/script.xbmc.lcdproc/resources/settings.xml 
b/script.xbmc.lcdproc/resources/settings.xml
index 3a4e1a4..2b006e8 100644
--- a/script.xbmc.lcdproc/resources/settings.xml
+++ b/script.xbmc.lcdproc/resources/settings.xml
@@ -5,18 +5,28 @@
     <setting id="scrollmode" type="enum" label="32102" lvalues="32401|32402" 
default="0" />
     <setting id="navtimeout" type="slider" label="32103" option="int" 
default="2" range="1,10" />
     <setting id="refreshrate" type="slider" label="32104" option="int" 
default="1" range="1,20" />
+    <setting id="sep1" type="sep" />
+    <setting id="usealternatecharset" type="bool" label="32105" 
default="false" />
+    <setting id="charset" enable="eq(-1,true)" type="enum" label="32106" 
lvalues="32411|32412|32413|32414|32415|32416|32417" default="0" 
subsetting="true"/>
+    <setting id="sep2" type="sep" />
+    <setting id="useextraelements" type="bool" label="32107" default="true" />
   </category>
   <category label="32200">
-    <setting id="dimonscreensaver" type="bool" label="32201" default="false" />
+    <setting label="32206" type="lsep" />
+    <setting id="dimonvideoplayback" type="bool" label="32203" default="false" 
subsetting="true" />
+    <setting id="dimonmusicplayback" type="bool" label="32204" default="false" 
subsetting="true" />
+    <setting id="dimonscreensaver" type="bool" label="32201" default="false" 
subsetting="true" />
+    <setting id="dimdelay" type="slider" label="32205" default="0" 
range="0,30" subsetting="true" />
+    <setting id="sep3" type="sep" />
     <setting id="dimonshutdown" type="bool" label="32202" default="false" />
   </category>
   <category label="32300">
     <setting id="remotelcdproc" type="bool" label="32301" default="false" />
     <setting id="hostip" enable="eq(-1,true)" type="ipaddress" label="32302" 
default="127.0.0.1" subsetting="true" />
     <setting id="hostport" enable="eq(-2,true)" type="number" label="32303" 
default="13666" subsetting="true" />
-    <setting id="sep2" type="sep" />
+    <setting id="sep4" type="sep" />
     <setting id="heartbeat" type="bool" label="32304" default="false" />
-    <setting id="sep3" type="sep" />
+    <setting id="sep5" type="sep" />
     <setting id="hideconnpopups" type="bool" label="32305" default="true" />
   </category>
 </settings>

-----------------------------------------------------------------------

Summary of changes:
 script.xbmc.lcdproc/addon.xml                      |    2 +-
 script.xbmc.lcdproc/changelog.txt                  |   11 +
 script.xbmc.lcdproc/lcdmain.py                     |   34 +--
 script.xbmc.lcdproc/resources/LCD.xml.defaults     |    7 +
 .../resources/language/English/strings.xml         |   22 +-
 .../resources/language/German/strings.xml          |   22 +-
 .../resources/lib/charset_hd44780.py               |   77 ++++
 .../resources/lib/charset_map_hd44780_a00.py       |  301 +++++++++++++++
 .../resources/lib/charset_map_hd44780_a02.py       |  387 ++++++++++++++++++++
 script.xbmc.lcdproc/resources/lib/extraicons.py    |    1 +
 script.xbmc.lcdproc/resources/lib/infolabels.py    |   98 ++++--
 script.xbmc.lcdproc/resources/lib/lcdbase.py       |  229 ++++++++----
 script.xbmc.lcdproc/resources/lib/lcdproc.py       |  105 ++++--
 .../resources/lib/lcdproc_extra_imon.py            |    4 +
 script.xbmc.lcdproc/resources/lib/settings.py      |  137 ++++++-
 script.xbmc.lcdproc/resources/settings.xml         |   16 +-
 16 files changed, 1267 insertions(+), 186 deletions(-)
 create mode 100644 script.xbmc.lcdproc/resources/lib/charset_hd44780.py
 create mode 100644 script.xbmc.lcdproc/resources/lib/charset_map_hd44780_a00.py
 create mode 100644 script.xbmc.lcdproc/resources/lib/charset_map_hd44780_a02.py


hooks/post-receive
-- 
Scripts

------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons

Reply via email to