X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a12f0f98d99109a64942abf1bb1f6e429c2fc7f5..e25ac974810a9c235242d5a4f6bb0c779ddb430a:/skin.py diff --git a/skin.py b/skin.py index 3c4b9e1f..ac66c8d4 100644 --- a/skin.py +++ b/skin.py @@ -2,21 +2,19 @@ import xml.dom.minidom from os import path from enigma import eSize, ePoint, gFont, eWindow, eLabel, ePixmap, eWindowStyleManager, \ - loadPNG, addFont, gRGB, eWindowStyleSkinned + addFont, gRGB, eWindowStyleSkinned from Components.config import ConfigSubsection, ConfigText, config from Components.Converter.Converter import Converter from Components.Sources.Source import Source, ObsoleteSource from Tools.Directories import resolveFilename, SCOPE_SKIN, SCOPE_SKIN_IMAGE, SCOPE_FONTS from Tools.Import import my_import +from Tools.LoadPixmap import LoadPixmap from Tools.XMLTools import elementsWithTag, mergeText colorNames = dict() -def queryColor(colorName): - return colorNames.get(colorName) - def dump(x, i=0): print " " * i + str(x) try: @@ -59,7 +57,9 @@ try: except (SkinError, IOError, AssertionError), err: print "SKIN ERROR:", err print "defaulting to standard skin..." + config.skin.primary_skin.value = 'skin.xml' loadSkin('skin.xml') + loadSkin('skin_default.xml') def parsePosition(str): @@ -79,7 +79,7 @@ def parseColor(str): try: return colorNames[str] except: - raise ("color '%s' must be #aarrggbb or valid named color" % (str)) + raise SkinError("color '%s' must be #aarrggbb or valid named color" % (str)) return gRGB(int(str[1:], 0x10)) def collectAttributes(skinAttributes, node, skin_path_prefix=None, ignore=[]): @@ -98,10 +98,10 @@ def collectAttributes(skinAttributes, node, skin_path_prefix=None, ignore=[]): if attrib not in ignore: skinAttributes.append((attrib, value)) -def loadPixmap(path): - ptr = loadPNG(path) +def loadPixmap(path, desktop): + ptr = LoadPixmap(path, desktop) if ptr is None: - raise "pixmap file %s not found!" % (path) + raise SkinError("pixmap file %s not found!" % (path)) return ptr def applySingleAttribute(guiObject, desktop, attrib, value): @@ -120,8 +120,7 @@ def applySingleAttribute(guiObject, desktop, attrib, value): elif attrib == 'zPosition': guiObject.setZPosition(int(value)) elif attrib in ["pixmap", "backgroundPixmap", "selectionPixmap"]: - ptr = loadPixmap(value) # this should already have been filename-resolved. - desktop.makeCompatiblePixmap(ptr) + ptr = loadPixmap(value, desktop) # this should already have been filename-resolved. if attrib == "pixmap": guiObject.setPixmap(ptr) elif attrib == "backgroundPixmap": @@ -131,8 +130,9 @@ def applySingleAttribute(guiObject, desktop, attrib, value): # guiObject.setPixmapFromFile(value) elif attrib == "alphatest": # used by ePixmap guiObject.setAlphatest( - { "on": True, - "off": False + { "on": 1, + "off": 0, + "blend": 2, }[value]) elif attrib == "orientation": # used by eSlider try: @@ -171,8 +171,12 @@ def applySingleAttribute(guiObject, desktop, attrib, value): print "illegal flag %s!" % f elif attrib == "backgroundColor": guiObject.setBackgroundColor(parseColor(value)) + elif attrib == "backgroundColorSelected": + guiObject.setBackgroundColorSelected(parseColor(value)) elif attrib == "foregroundColor": guiObject.setForegroundColor(parseColor(value)) + elif attrib == "foregroundColorSelected": + guiObject.setForegroundColorSelected(parseColor(value)) elif attrib == "shadowColor": guiObject.setShadowColor(parseColor(value)) elif attrib == "selectionDisabled": @@ -194,15 +198,14 @@ def applySingleAttribute(guiObject, desktop, attrib, value): elif attrib == "pointer" or attrib == "seek_pointer": (name, pos) = value.split(':') pos = parsePosition(pos) - ptr = loadPixmap(name) - desktop.makeCompatiblePixmap(ptr) + ptr = loadPixmap(name, desktop) guiObject.setPointer({"pointer": 0, "seek_pointer": 1}[attrib], ptr, pos) elif attrib == 'shadowOffset': guiObject.setShadowOffset(parsePosition(value)) elif attrib == 'noWrap': guiObject.setNoWrap(1) else: - raise "unsupported attribute " + attrib + "=" + value + raise SkinError("unsupported attribute " + attrib + "=" + value) except int: # AttributeError: print "widget %s (%s) doesn't support attribute %s!" % ("", guiObject.__class__.__name__, attrib) @@ -216,7 +219,23 @@ def loadSingleSkinData(desktop, dom_skin, path_prefix): skin = dom_skin.childNodes[0] assert skin.tagName == "skin", "root element in skin must be 'skin'!" - + + for c in elementsWithTag(skin.childNodes, "output"): + id = int(c.getAttribute("id") or "0") + if id == 0: # framebuffer + for res in elementsWithTag(c.childNodes, "resolution"): + xres = int(res.getAttribute("xres" or "720")) + yres = int(res.getAttribute("yres" or "576")) + bpp = int(res.getAttribute("bpp" or "32")) + + from enigma import gFBDC + i = gFBDC.getInstance() + i.setResolution(xres, yres) + + if bpp != 32: + # load palette (not yet implemented) + pass + for c in elementsWithTag(skin.childNodes, "colors"): for color in elementsWithTag(c.childNodes, "color"): name = str(color.getAttribute("name")) @@ -256,10 +275,7 @@ def loadSingleSkinData(desktop, dom_skin, path_prefix): bpName = str(pixmap.getAttribute("pos")) filename = str(pixmap.getAttribute("filename")) - png = loadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, filename, path_prefix=path_prefix)) - - # adapt palette - desktop.makeCompatiblePixmap(png) + png = loadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, filename, path_prefix=path_prefix), desktop) style.setPixmap(eWindowStyleSkinned.__dict__[bsName], eWindowStyleSkinned.__dict__[bpName], png) for color in elementsWithTag(windowstyle.childNodes, "color"): @@ -289,12 +305,14 @@ def lookupScreen(name): return x, path return None, None -def readSkin(screen, skin, name, desktop): - if not isinstance(name, list): - name = [name] +def readSkin(screen, skin, names, desktop): + if not isinstance(names, list): + names = [names] + + name = "" % screen.__class__.__name__ # try all skins, first existing one have priority - for n in name: + for n in names: myscreen, path = lookupScreen(n) if myscreen is not None: # use this name for debug output @@ -308,7 +326,7 @@ def readSkin(screen, skin, name, desktop): if myscreen is None and getattr(screen, "skin", None): myscreen = screen.parsedSkin = xml.dom.minidom.parseString(screen.skin).childNodes[0] - assert myscreen is not None, "no skin for screen '" + repr(name) + "' found!" + assert myscreen is not None, "no skin for screen '" + repr(names) + "' found!" screen.skinAttributes = [ ]