--- hatari/python-ui/hatari.py 2019/04/09 08:49:05 1.1.1.3 +++ hatari/python-ui/hatari.py 2019/04/09 08:51:33 1.1.1.6 @@ -3,7 +3,7 @@ # Classes for Hatari emulator instance and mapping its congfiguration # variables with its command line option. # -# Copyright (C) 2008-2011 by Eero Tamminen +# Copyright (C) 2008-2012 by Eero Tamminen # # 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 @@ -48,10 +48,17 @@ class Hatari: def is_compatible(self): "check Hatari compatibility and return error string if it's not" - for line in os.popen(self.hataribin + " -h").readlines(): + error = "Hatari not found or it doesn't support the required --control-socket option!" + pipe = os.popen(self.hataribin + " -h") + for line in pipe.readlines(): if line.find("--control-socket") >= 0: - return None - return "Hatari not found or it doesn't support the required --control-socket option!" + error = None + break + try: + pipe.close() + except IOError: + pass + return error def save_config(self): os.popen(self.hataribin + " --saveconfig") @@ -174,6 +181,9 @@ class Hatari: except OSError as value: print("Hatari PID %d had exited in the meanwhile:\n\t%s" % (self.pid, value)) self.pid = 0 + if self.control: + self.control.close() + self.control = None return False return True @@ -225,7 +235,7 @@ class Hatari: def kill(self): "kill(), kill Hatari if it's running" - if self.pid: + if self.is_running(): os.kill(self.pid, signal.SIGKILL) print("killed hatari with PID %d" % self.pid) self.pid = 0 @@ -266,6 +276,8 @@ class HatariConfigMapping(ConfigStore): self._hatari = hatari self._lock_updates = False + self._desktop_w = 0 + self._desktop_h = 0 self._options = [] def validate(self): @@ -287,7 +299,10 @@ class HatariConfigMapping(ConfigStore): else: getattr(self, method)() - def _change_option(self, option): + def _change_option(self, option, quoted = None): + "handle option changing, and quote spaces for quoted part of it" + if quoted: + option = "%s %s" % (option, quoted.replace(" ", "\\ ")) if self._lock_updates: self._options.append(option) else: @@ -429,32 +444,43 @@ class HatariConfigMapping(ConfigStore): # 48kHz, 44.1kHz and STE/TT/Falcon DMA 50066Hz divisable values return ("6000", "6258", "8000", "11025", "12000", "12517", "16000", "22050", "24000", "25033", "32000", - "48000", "44100", "50066") + "44100", "48000", "50066") def get_sound(self): enabled = self.get("[Sound]", "bEnableSound") hz = str(self.get("[Sound]", "nPlaybackFreq")) - return (enabled, hz) + idx = self.get_sound_values().index(hz) + return (enabled, idx) - def set_sound(self, enabled, hz): + def set_sound(self, enabled, idx): # map get_sound_values() index to Hatari config - try: - hz = int(hz) - except ValueError: - hz = 0 - if hz < 6000 or hz > 50066: - hz = 44100 - self.set("[Sound]", "nPlaybackFreq", hz) + hz = self.get_sound_values()[idx] + self.set("[Sound]", "nPlaybackFreq", int(hz)) self.set("[Sound]", "bEnableSound", enabled) - value = str(hz) # and to cli option if enabled: - self._change_option("--sound %s" % value) + self._change_option("--sound %s" % hz) else: self._change_option("--sound off") - return value - - + + def get_ymmixer_types(self): + return ("linear", "table", "model") + + def get_ymmixer(self): + # values for types are start from 1, not 0 + return self.get("[Sound]", "YmVolumeMixing")-1 + + def set_ymmixer(self, value): + self.set("[Sound]", "YmVolumeMixing", value+1) + self._change_option("--ym-mixing %s" % self.get_ymmixer_types()[value]) + + def get_mic(self): + return self.get("[Sound]", "bEnableMicrophone") + + def set_mic(self, value): + self.set("[Sound]", "bEnableMicrophone", value) + self._change_option("--mic %s" % str(value)) + # ----------- joystick -------------- def get_joystick_types(self): return ("Disabled", "Real joystick", "Keyboard") @@ -492,15 +518,15 @@ class HatariConfigMapping(ConfigStore): def set_floppy(self, drive, filename): self.set("[Floppy]", "szDisk%cFileName" % ("A", "B")[drive], filename) - self._change_option("--disk-%c %s" % (("a", "b")[drive], filename)) + self._change_option("--disk-%c" % ("a", "b")[drive], str(filename)) - # ------------ slow FDC access --------------- - def get_slowfdc(self): - return self.get("[Floppy]", "bSlowFloppy") - - def set_slowfdc(self, value): - self.set("[Floppy]", "bSlowFloppy", value) - self._change_option("--slowfdc %s" % str(value)) + # ------------ fast FDC access --------------- + def get_fastfdc(self): + return self.get("[Floppy]", "FastFloppy") + + def set_fastfdc(self, value): + self.set("[Floppy]", "FastFloppy", value) + self._change_option("--fastfdc %s" % str(value)) # ------------- disk protection ------------- def get_protection_types(self): @@ -529,7 +555,7 @@ class HatariConfigMapping(ConfigStore): if dirname and os.path.isdir(dirname): self.set("[HardDisk]", "bUseHardDiskDirectory", True) self.set("[HardDisk]", "szHardDiskDirectory", dirname) - self._change_option("--harddrive %s" % dirname) + self._change_option("--harddrive", str(dirname)) # ------------ ACSI HD (file) --------------- def get_acsi_image(self): @@ -540,7 +566,7 @@ class HatariConfigMapping(ConfigStore): if filename and os.path.isfile(filename): self.set("[HardDisk]", "bUseHardDiskImage", True) self.set("[HardDisk]", "szHardDiskImage", filename) - self._change_option("--acsi %s" % filename) + self._change_option("--acsi", str(filename)) # ------------ IDE master (file) --------------- def get_idemaster_image(self): @@ -551,7 +577,7 @@ class HatariConfigMapping(ConfigStore): if filename and os.path.isfile(filename): self.set("[HardDisk]", "bUseIdeMasterHardDiskImage", True) self.set("[HardDisk]", "szIdeMasterHardDiskImage", filename) - self._change_option("--ide-master %s" % filename) + self._change_option("--ide-master", str(filename)) # ------------ IDE slave (file) --------------- def get_ideslave_image(self): @@ -562,7 +588,7 @@ class HatariConfigMapping(ConfigStore): if filename and os.path.isfile(filename): self.set("[HardDisk]", "bUseIdeSlaveHardDiskImage", True) self.set("[HardDisk]", "szIdeSlaveHardDiskImage", filename) - self._change_option("--ide-slave %s" % filename) + self._change_option("--ide-slave", str(filename)) # ------------ TOS ROM --------------- def get_tos(self): @@ -570,7 +596,7 @@ class HatariConfigMapping(ConfigStore): def set_tos(self, filename): self.set("[ROM]", "szTosImageFileName", filename) - self._change_option("--tos %s" % filename) + self._change_option("--tos", str(filename)) # ------------ memory --------------- def get_memory_names(self): @@ -619,7 +645,6 @@ class HatariConfigMapping(ConfigStore): def get_frameskip(self): fs = self.get("[Screen]", "nFrameSkips") - print("Frameskip", fs) if fs < 0 or fs > 5: return 5 return fs @@ -646,6 +671,22 @@ class HatariConfigMapping(ConfigStore): self.set("[Screen]", "bKeepResolution", value) self._change_option("--desktop %s" % str(value)) + # --------- keep desktop res - st ------ + def get_desktop_st(self): + return self.get("[Screen]", "bKeepResolutionST") + + def set_desktop_st(self, value): + self.set("[Screen]", "bKeepResolutionST", value) + self._change_option("--desktop-st %s" % str(value)) + + # ------------ force max --------------- + def get_force_max(self): + return self.get("[Screen]", "bForceMax") + + def set_force_max(self, value): + self.set("[Screen]", "bForceMax", value) + self._change_option("--force-max %s" % str(value)) + # ------------ show borders --------------- def get_borders(self): return self.get("[Screen]", "bAllowOverscan") @@ -687,9 +728,20 @@ class HatariConfigMapping(ConfigStore): self._change_option("--aspect %s" % str(value)) # ------------ max window size --------------- + def set_desktop_size(self, w, h): + self._desktop_w = w + self._desktop_h = h + + def get_desktop_size(self): + return (self._desktop_w, self._desktop_h) + def get_max_size(self): w = self.get("[Screen]", "nMaxWidth") h = self.get("[Screen]", "nMaxHeight") + # default to desktop size? + if not (w or h): + w = self._desktop_w + h = self._desktop_h return (w, h) def set_max_size(self, w, h):