diff options
Diffstat (limited to 'display/modes.py')
-rw-r--r-- | display/modes.py | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/display/modes.py b/display/modes.py new file mode 100644 index 0000000..ad0c1c0 --- /dev/null +++ b/display/modes.py @@ -0,0 +1,196 @@ +import sys + +KeyPressed = 2 +KeyReleased = 3 + + +class BaseDisplay: + __taskbkgnd = None + + def taskbar(self, (x, y, w, h)): + if self.__taskbkgnd is None: + pixel = "\x00\x00\x80" + hole = "\x01\x01\x01" + self.__taskbkgnd = self.pixmap(32, 32, + ((pixel+hole)*16 + (hole+pixel)*16) * 16, 0x010101) + for j in range(y, y+h, 32): + for i in range(x, x+w, 32): + self.putppm(i, j, self.__taskbkgnd, + (0, 0, x+w-i, y+h-j)) + + +class Mode: + low_priority = 0 + + def __init__(self, name, descr, extraoptsdescr, + options={}, url=None): + self.name = name + self.descr = descr + self.extraoptsdescr = extraoptsdescr + self.options = options.copy() + self.url = url + + def getmodule(self): + return __import__(self.prefix + self.name.lower(), globals(), + locals(), ['available']) + + def imperror(self): + try: + return self.__imperror + except AttributeError: + try: + module = self.getmodule() + except ImportError: + result = 'not installed' + else: + result = hasattr(module, 'imperror') and module.imperror() + self.__imperror = result + return result + + def unique_id(self): + return self.prefix + self.name + + def printline(self, f): + err = self.imperror() + if err: + state = ' [%s]' % err + else: + state = '' + print >> f, ' %-8s %s%s' % (self.name, self.descr, state) + if self.url: + print >> f, ' %s' % self.url + for line in self.extraoptsdescr: + print >> f, ' %s' % line + + def getformaloptions(self): + return '', [c+'=' for c in self.options.keys()] + + def setoptions(self, options): + for key in self.options.keys(): + if options.has_key('--'+key): + self.options[key] = options['--'+key] + + def currentdriver(self): + lst = self.options.items() + lst.sort() + lst = ['--%s=%s' % keyvalue for keyvalue in lst] + return ' '.join([self.name] + lst) + + def htmloptionstext(self, *args): + if self.imperror(): + return None + module = self.getmodule() + return (hasattr(module, 'htmloptionstext') and + module.htmloptionstext(*args)) + + +class GraphicMode(Mode): + prefix = 'dpy_' + + +class SoundMode(Mode): + prefix = 'snd_' + + +def graphicmodeslist(): + return [ + GraphicMode('X', 'XWindow (Linux/Unix)', + ['--shm=yes use the Shared Memory extension (default)', + '--shm=no disable it (for remote connections or old X servers)', + ], + {'shm': 'yes'}), + GraphicMode('windows', 'MS Windows', []), + GraphicMode('pygame', 'PyGame library (all platforms)', + ['--fullscreen=yes go full screen (Esc key to exit)', + '--transparency=yes slightly transparent bubbles (default)', + '--transparency=no disable it (a bit faster)', + '--zoom=xxx% scale image by xxx %', + '--smooth smoothed scaled image', + '--smoothfast semi-smoothed, for 200% scale only'], + {'transparency': 'yes', 'fullscreen': 'no', + 'zoom': '100', 'smooth': 'yes', 'smoothfast': 'no'}, + url='http://www.pygame.org'), + GraphicMode('gtk', 'PyGTK (Gnome)', + ['--zoom=xxx% scale image by xxx %'], + {'zoom': '100'}, + url='http://www.pygtk.org/'), + ] + +def soundmodeslist(): + return [ + SoundMode('pygame', 'PyGame library mixer (all platforms)', + [], url='http://www.pygame.org'), + SoundMode('linux', 'audio mixer for Linux', + ['--freq=# mixer frequency (default 44100)', + '--fmt=# data format (default S16_NE, --fmt=list for a list)'], + {'freq': '44100', 'fmt': 'S16_NE'}), + SoundMode('windows', 'audio mixer for Windows', + ['--freq=# mixer frequency (default 44100)', + '--bits=# bits per sample (8 or default 16)'], + {'freq': '44100', 'bits': '16'}), + SoundMode('off', 'no sounds', []), + ] + +def findmode(name, lst): + if name is None: + # find the first installed mode + last_chance = None + for info in lst: + err = info.imperror() + if err: + continue + if info.low_priority: + if last_chance is None: + last_chance = info + else: + return info + if last_chance is not None: + return last_chance + raise KeyError, 'no driver available!' + else: + # find mode by name + for info in lst: + if info.name.upper() == name.upper(): + err = info.imperror() + if err: + raise KeyError, '%s: %s' % (info.name, err) + return info + raise KeyError, '%s: no such driver' % name + +def findmode_err(*args): + try: + return findmode(*args) + except KeyError, e: + print >> sys.stderr, str(e) + sys.exit(1) + +def open_dpy(mode, width, height, title): + driver, sound, extraopts = mode + ginfo = findmode_err(driver, graphicmodeslist()) + ginfo.setoptions(extraopts) + dpy = ginfo.getmodule().Display(width, height, title, **ginfo.options) + print 'graphics driver:', ginfo.currentdriver() + return dpy + +def open_snd(mode): + driver, sound, extraopts = mode + sinfo = findmode_err(sound, soundmodeslist()) + sinfo.setoptions(extraopts) + snd = sinfo.getmodule().Sound(**sinfo.options) + if snd.has_sound: + sinfo.options['music'] = 'yes' + sinfo.setoptions(extraopts) + if (sinfo.options['music'].startswith('n') or + sinfo.options['music'] == 'off'): + snd.has_music = 0 + print 'sound driver:', sinfo.currentdriver() + return snd + else: + return None + + +def musichtmloptiontext(nameval): + return '''<font size=-1> +<%s> Background music</input><%s> +</font>''' % (nameval("checkbox", "music", "yes", default="yes", mangling=0), + nameval("hidden", "music", "no", mangling=0)) |