Example #1
0
def main():
    app = QApplication([])
    Col = MainWindow.MainController()

    runAnimation()

    Col.view.showMaximized()

    app.exec_()
Example #2
0
def runAnimation():

    Col = MainWindow.MainController()
    # 开机动画
    splash = QSplashScreen()
    scale = 0.5
    mgnWidth = int(Data.getWindowWidth() * scale)
    mgnHeight = int(Data.getWindowHeight() * scale)
    size = QSize(mgnWidth, mgnHeight)
    splash.show()
    for name in os.listdir(filePath + r"\res\ZeusDesign\startup_seq"):
        path = filePath + r"\res\ZeusDesign\startup_seq\\" + name
        image = QImage(path)
        pixmap = QPixmap.fromImage(image.scaled(size, Qt.IgnoreAspectRatio))
        splash.setPixmap(pixmap)

        time.sleep(0.01)
    splash.finish(Col.view)
Example #3
0
    def __init__(self):

        #Create data directories. Included in windows even though
        #the project won't work in windows yet

        self.frames = 0
        self.oldtime = 0
        SettingsXML = self.Get_Settings()
        Globals.SettingsXML = SettingsXML
        self.window = MainWindow()
        self.ErrorMsg = None
        self.system = None
        Globals.load_game = partial(self.load_game, self)
        Globals.load_game = self.load_game
        Globals.Mainwindow = self.window
        Globals.Mouse = PyMouse()
        Globals.Joysticks = [
            pygame.joystick.Joystick(i)
            for i in xrange(pygame.joystick.get_count())
        ]
        [i.init() for i in Globals.Joysticks]

        self.state_slot = 0

        if not os.path.isdir(Globals.DataDir + "temp"):
            os.mkdir(Globals.DataDir + "temp")
        if not os.path.isdir(Globals.DataDir + "Systems"):
            os.mkdir(Globals.DataDir + "Systems")
        if not os.path.isdir(Globals.DataDir + "Games"):
            os.mkdir(Globals.DataDir + "Games")
        SystemSettingsTree = {
            ("", 1, ("name", ), SettingsCheck.SystemExistSanityCheck): None
        }
        CoreSettingsTree = {
            ("", 1, ("name", "system"), SettingsCheck.CoreNameSanityCheck):
            None
        }

        for i in os.listdir(Globals.DataDir + "Systems"):
            if os.path.isdir(Globals.DataDir + "Systems/" + i):
                try:
                    with open(Globals.DataDir + "Systems/" + i + "/system.xml",
                              'r') as settingsfile:
                        SystemXML = ET.XML(settingsfile.read())
                    if SettingsCheck.check_settings(SystemSettingsTree,
                                                    SystemXML):
                        Globals.Systems.append((i)[7:])
                        for j in os.listdir(Globals.DataDir + "Systems/" + i):
                            if os.path.isdir(Globals.DataDir + "Systems/" + i +
                                             "/" + j):
                                try:
                                    settingsfile = open(
                                        Globals.DataDir + "Systems/" + i +
                                        "/" + j + "/core.xml", 'r')
                                    with open(
                                            Globals.DataDir + "Systems/" + i +
                                            "/" + j + "/core.xml",
                                            'r') as settingsfile:
                                        CoreXML = ET.XML(settingsfile.read())
                                    if SettingsCheck.check_settings(
                                            CoreSettingsTree, CoreXML):
                                        Globals.Cores.append(i[7:] + "/" +
                                                             j[5:])
                                except:
                                    pass
                except:
                    pass

        self.systemrunning = False

        GamesXML = self.Get_Games()

        Globals.GamesXML = GamesXML

        Globals.Update_Games()
        Globals.WindowHeight = int(
            Globals.SettingsXML.find("Window").get("height"))
        Globals.WindowWidth = int(
            Globals.SettingsXML.find("Window").get("width"))
        self.window.set_default_size(Globals.WindowWidth, Globals.WindowHeight)
        self.window.connect('check-resize', self.Window_Size_Changed)
        self.window.connect("delete-event", self.on_kill)
        self.window.connect("destroy", self.on_kill)
        self.window.show_all()
        Globals.Hotkeys = self.generateControls(
            Globals.SettingsXML.find("Hotkeys"))
        self.timeout = GObject.timeout_add(16, self.runframe)
Example #4
0
class GSEF(object):
    def __init__(self):

        #Create data directories. Included in windows even though
        #the project won't work in windows yet

        self.frames = 0
        self.oldtime = 0
        SettingsXML = self.Get_Settings()
        Globals.SettingsXML = SettingsXML
        self.window = MainWindow()
        self.ErrorMsg = None
        self.system = None
        Globals.load_game = partial(self.load_game, self)
        Globals.load_game = self.load_game
        Globals.Mainwindow = self.window
        Globals.Mouse = PyMouse()
        Globals.Joysticks = [
            pygame.joystick.Joystick(i)
            for i in xrange(pygame.joystick.get_count())
        ]
        [i.init() for i in Globals.Joysticks]

        self.state_slot = 0

        if not os.path.isdir(Globals.DataDir + "temp"):
            os.mkdir(Globals.DataDir + "temp")
        if not os.path.isdir(Globals.DataDir + "Systems"):
            os.mkdir(Globals.DataDir + "Systems")
        if not os.path.isdir(Globals.DataDir + "Games"):
            os.mkdir(Globals.DataDir + "Games")
        SystemSettingsTree = {
            ("", 1, ("name", ), SettingsCheck.SystemExistSanityCheck): None
        }
        CoreSettingsTree = {
            ("", 1, ("name", "system"), SettingsCheck.CoreNameSanityCheck):
            None
        }

        for i in os.listdir(Globals.DataDir + "Systems"):
            if os.path.isdir(Globals.DataDir + "Systems/" + i):
                try:
                    with open(Globals.DataDir + "Systems/" + i + "/system.xml",
                              'r') as settingsfile:
                        SystemXML = ET.XML(settingsfile.read())
                    if SettingsCheck.check_settings(SystemSettingsTree,
                                                    SystemXML):
                        Globals.Systems.append((i)[7:])
                        for j in os.listdir(Globals.DataDir + "Systems/" + i):
                            if os.path.isdir(Globals.DataDir + "Systems/" + i +
                                             "/" + j):
                                try:
                                    settingsfile = open(
                                        Globals.DataDir + "Systems/" + i +
                                        "/" + j + "/core.xml", 'r')
                                    with open(
                                            Globals.DataDir + "Systems/" + i +
                                            "/" + j + "/core.xml",
                                            'r') as settingsfile:
                                        CoreXML = ET.XML(settingsfile.read())
                                    if SettingsCheck.check_settings(
                                            CoreSettingsTree, CoreXML):
                                        Globals.Cores.append(i[7:] + "/" +
                                                             j[5:])
                                except:
                                    pass
                except:
                    pass

        self.systemrunning = False

        GamesXML = self.Get_Games()

        Globals.GamesXML = GamesXML

        Globals.Update_Games()
        Globals.WindowHeight = int(
            Globals.SettingsXML.find("Window").get("height"))
        Globals.WindowWidth = int(
            Globals.SettingsXML.find("Window").get("width"))
        self.window.set_default_size(Globals.WindowWidth, Globals.WindowHeight)
        self.window.connect('check-resize', self.Window_Size_Changed)
        self.window.connect("delete-event", self.on_kill)
        self.window.connect("destroy", self.on_kill)
        self.window.show_all()
        Globals.Hotkeys = self.generateControls(
            Globals.SettingsXML.find("Hotkeys"))
        self.timeout = GObject.timeout_add(16, self.runframe)

    def on_kill(self, *args):
        if Globals.system:
            Globals.system.close()
            Globals.system = None
        Gtk.main_quit()

    def runframe(self):

        if Globals.Hotkeys["Save State"].changed_this_frame and Globals.Hotkeys[
                "Save State"].get_state():
            Globals.system.save_state("state {}".format(self.state_slot))

        if Globals.Hotkeys["Load State"].changed_this_frame and Globals.Hotkeys[
                "Load State"].get_state():
            Globals.system.load_state("state {}".format(self.state_slot))

        if Globals.Hotkeys[
                "Increment State Slot"].changed_this_frame and Globals.Hotkeys[
                    "Increment State Slot"].get_state():
            self.state_slot += 1
            self.window.statusLabel.add_text_timer(
                "State slot {} selected".format(self.state_slot), 3000)

        if Globals.Hotkeys[
                "Decrement State Slot"].changed_this_frame and Globals.Hotkeys[
                    "Decrement State Slot"].get_state():
            self.state_slot = max(0, self.state_slot - 1)
            self.window.statusLabel.add_text_timer(
                "State slot {} selected".format(self.state_slot), 3000)

        if Globals.system and Globals.Hotkeys["Rewind"].get_state() and len(
                Globals.StateSizes):
            Globals.system.rewinding = True

            Globals.system.unserialize(Globals.StateData[0])
            if len(Globals.StateData) > 1:
                if isinstance(Globals.StateData[1], xordiff.numpyxor):
                    Globals.StateData[1] = Globals.StateData[1].undiff(
                        Globals.StateData[0])
                    Globals.StateSizes[1] = Globals.StateData[1]
            del (Globals.StateData[0])
            del (Globals.StateSizes[0])
        elif Globals.system:
            Globals.system.rewinding = False
        rewind = Globals.SettingsXML.find("Rewind")
        if rewind.get(
                "Enabled"
        ) == "True" and Globals.system and not Globals.system.rewinding:
            frames = int(rewind.get("Frames"))
            size = int(rewind.get("Size"))
            if not self.frames % frames:
                statedata = Globals.system.serialize()
                datalen = statedata.nbytes
                if len(Globals.StateData) and rewind.get("Compress") == "True":
                    Globals.StateData[0] = xordiff.numpyxor(
                        Globals.StateData[0], statedata)
                    Globals.StateSizes[0] = Globals.StateData[0].nbytes
                Globals.StateData.insert(0, statedata)
                Globals.StateSizes.insert(0, datalen)
                while sum(Globals.StateSizes) > size * 1048576:
                    Globals.StateData.pop()
                    Globals.StateSizes.pop()

        pygame.event.pump()
        Globals.OldJoystickStates = Globals.JoystickStates
        Globals.JoystickStates = []

        for joystick in Globals.Joysticks:
            Buttons = []
            Axes = []
            Hats = []
            for i in xrange(0, joystick.get_numaxes()):
                Axes.append(joystick.get_axis(i))
            for i in xrange(0, joystick.get_numhats()):
                Hats.append(joystick.get_hat(i))
            for i in xrange(0, joystick.get_numbuttons()):
                Buttons.append(joystick.get_button(i))
            Globals.JoystickStates.append({
                "Buttons": Buttons,
                "Axes": Axes,
                "Hats": Hats
            })

        if Globals.system and Globals.system.running:
            Globals.system.run_frame()
            self.frames += 1
            if int(time.time()) != self.oldtime:
                self.framerate = self.frames
                self.frames = 0
                self.window.FPSlabel.set_text("FPS: {}".format(self.framerate))
            self.oldtime = int(time.time())

        return True

    def Get_Games(self):
        ValidGames = False
        GamesXML = None
        try:
            with open(Globals.DataDir + "Games/Games.xml", "r") as GamesFile:
                GamesText = GamesFile.read()
            ValidGames = True
        except IOError:
            pass

        #Description to follow through the settings tree for testing sanity
        GamesTree = {
            ("System", 0, ("name", ), SettingsCheck.SystemExistSanityCheck): {
                ("Game", 0, ("name", ), SettingsCheck.GameNameSanityCheck): {
                    ("Patch", 0, ("name", ), SettingsCheck.PatchNameSanityCheck):
                    None
                }
            }
        }
        GameTree = {
            ("", 1, ("name", "core", "filename", "system"), SettingsCheck.GameSettingsSanityCheck):
            {
                ("Controls", 1, ("inherit", ), None): None
            }
        }
        PatchSanityLam = lambda game, name, format, filename, system: os.path.isfile(
            Globals.DataDir + "Games/" + system + "/" + game + "/patches/" +
            name + "/" + filename)
        PatchTree = {
            ("", 1, ("game", "name", "format", "filename", "system"), PatchSanityLam):
            {
                ("Controls", 1, ("inherit", ), None): None
            }
        }

        #Make sure the settings file is valid XML
        if ValidGames:
            try:
                GamesXML = ET.XML(GamesText)
            except ET.ParseError:
                ValidGames = False

        #Validate the the settings use sane values
        if ValidGames:
            ValidGames = SettingsCheck.check_settings(GamesTree, GamesXML)

        #If the games XML file isn't sane, repopulate it manually
        if not ValidGames:
            popup = ErrorPopupWindow(
                "Games not found",
                "Game definitions not found, repopulating manually")
            popup.set_transient_for(self.window)
            popup.show_all()
            systemlam = lambda x: os.path.isdir(
                Globals.DataDir + "Games/" + x) and os.path.isdir(
                    Globals.DataDir + "Systems/System_" + x)
            gamelam = lambda x: os.path.isdir(Globals.DataDir + "Games/" +
                                              system + "/" + x)
            patchlam = lambda x: os.path.isdir(Globals.DataDir + "Games/" +
                                               system + "/" + game + "/" + x)
            GamesXML = ET.XML("<Games/>")
            for system in filter(systemlam,
                                 os.listdir(Globals.DataDir + "Games")):
                SystemXML = ET.XML("<System/>")
                SystemXML.set("name", system)
                for game in filter(
                        gamelam,
                        os.listdir(Globals.DataDir + "Games/" + system)):
                    try:
                        with open(
                                Globals.DataDir + "Games/" + system + "/" +
                                game + "/game.xml", 'r') as GameSettingsFile:
                            GameSettingsText = GameSettingsFile.read()
                        GameSettingsXML = ET.XML(GameSettingsText)
                        GameSane = SettingsCheck.check_settings(
                            GameTree, GameSettingsXML)
                        if GameSane:
                            GameXML = ET.XML("<Game/>")
                            GameXML.set("name", game)
                            GameXML.set("core", GameSettingsXML.get("core"))
                            for patch in filter(
                                    patchlam,
                                    os.listdir(Globals.DataDir + "Games/" +
                                               system + "/" + game +
                                               "/patches")):
                                try:
                                    with open(
                                            Globals.DataDir + "Games/" +
                                            system + "/" + game + "/patches/" +
                                            patch + "/patch.xml",
                                            'r') as PatchSettingsFile:
                                        PatchSettingsText = PatchSettingsFile.read(
                                        )
                                    PatchSettingsXML = ET.XML(
                                        PatchSettingsText)
                                    PatchSane = SettingsCheck.check_settings(
                                        PatchTree, PatchSettingsXML)
                                    if PatchSane:
                                        PatchXML = ET.XML("<Patch/>")
                                        PatchXML.set("name", patch)
                                        PatchXML.set(
                                            "format",
                                            PatchSettingsXML.get("format"))
                                        GameXML.append(PatchXML)
                                except:
                                    pass
                            SystemXML.append(GameXML)
                    except:
                        pass
                GamesXML.append(SystemXML)
        return GamesXML

    def Get_Settings(self):
        ValidSettings = False
        SettingsXML = None
        try:
            with open(Globals.DataDir + "Settings.xml", "r") as SettingsFile:
                SettingsText = SettingsFile.read()
            ValidSettings = True
        except IOError:
            SettingsText = DefaultSettings
            ValidSettings = True

        #Description to follow through the settings tree for testing sanity
        SettingsTree = {
            ("Paths", 1, (), None): {
                ("LastAccessedSystem", 1, ("path", ), SettingsCheck.DirectoryPathSanityCheck):
                None,
                ("LastAccessedCore", 1, ("path", ), SettingsCheck.DirectoryPathSanityCheck):
                None
            },
            ("Window", 1, ("width", "height"), SettingsCheck.WindowSizeSanityCheck):
            None,
            ("AspectRatio", 1, ("keep", ), lambda x: x == "True" or x == "False"):
            None,
            ("Hotkeys", 1, (), None): {
                ("Button", 9, ("Mapping", "name"), None): None
            },
            ("Rewind", 1, ("Frames", "Size", "Enabled", "Compress"), lambda f, s, e, c: f.isdigit(
             ) and s.isdigit() and (e == "False" or e == "True") and (c == "False" or c == "True")):
            None
        }

        SettingsXML = ET.XML(SettingsText)
        #Make sure the settings file is valid XML
        if ValidSettings:
            try:
                SettingsXML = ET.XML(SettingsText)
            except ET.ParseError:
                ValidSettings = False

        #Validate the the settings use sane values
        if ValidSettings:
            ValidSettings = SettingsCheck.check_settings(
                SettingsTree, SettingsXML)

        #If the settings aren't sane, replace them with the standard settings
        #May change later to only replace the parts that are not sane
        if not ValidSettings:
            try:
                SettingsXML = ET.XML(DefaultSettings)
                with open(Globals.DataDir + "Settings.xml",
                          "w") as SettingsFile:
                    SettingsFile.write(DefaultSettings)
                popup = ErrorPopupWindow(
                    "Settings Not Found",
                    "Settings not found or corrupt, using default settings")
                popup.show_all()
            except:
                self.ErrorMsg = "Failed to write to settings file"
        return SettingsXML

    #When the window resizes, we need to change the preferred window size to that
    #That way when they come back, the window will be the same size
    def Window_Size_Changed(self, window):
        size = window.get_size()
        Globals.WindowHeight = size[1]
        Globals.WindowWidth = size[0]
        windowxml = Globals.SettingsXML.find("Window")
        windowxml.set("width", str(size[0]))
        windowxml.set("height", str(size[1]))

    def Run(self):
        Gtk.main()
        #Write out the changed settings, however they were changed
        with open(Globals.DataDir + "Settings.xml", "w") as SettingsFile:
            SettingsFile.write(ET.tostring(Globals.SettingsXML))
        with open(Globals.DataDir + "Games/Games.xml", "w") as GamesFile:
            GamesFile.write(ET.tostring(Globals.GamesXML))
        #self.loopingpipe.send(("kill",))

    def load_game(self, systemname, corename, gamename, patchname):
        Globals.StateData = []
        Globals.StateSizes = []
        if Globals.system != None:
            Globals.system.close()
            Globals.system = System(systemname)
        else:
            Globals.system = System(systemname)
        Globals.system.load_core(corename)
        gamepath = "{0}Games/{1}/{2}/".format(Globals.DataDir, systemname,
                                              gamename)
        sysxmlpath = "{0}Systems/System_{1}/system.xml".format(
            Globals.DataDir, systemname)
        patchpath = "{0}{1}".format(gamepath, patchname)
        controlpath = "{0}game.xml".format(gamepath)
        savespath = "{}savestates".format(gamepath)
        try:
            os.makedirs(savespath)
        except:
            pass
        with open(controlpath, 'r') as controlxmlfile:
            controlxml = ET.XML(controlxmlfile.read())
        if controlxml.find("Controls").get("inherit") == "True":
            with open(sysxmlpath, 'r') as controlxmlfile:
                controlxml = ET.XML(controlxmlfile.read())
        controlxml = controlxml.find("Controls")

        Globals.Hotkeys = self.generateControls(
            Globals.SettingsXML.find("Hotkeys"))
        Globals.Controls = self.generateControls(controlxml)

        patcher = None  #Add patch stuff later
        Globals.system.update_controls(Globals.Controls)
        Globals.system.load_game(gamepath, patchpath, patcher)
        framerate = Globals.system.get_framerate()
        self.window.statusLabel.add_text_timer("Loaded {}".format(gamename),
                                               3000)
        GObject.source_remove(self.timeout)
        self.timeout = GObject.timeout_add(
            int(1000 // Globals.system.get_framerate()), self.runframe)

    def generateControls(self, XMLItem):
        def generateControlsR(XMLItem, parent=None):
            if XMLItem.get("Mapping"):
                digital = False
                if XMLItem.get("type") == "Digital":
                    digital = True
                return Control(XMLItem.get("Mapping"), XMLItem.tag,
                               XMLItem.get("name"), digital)

            controls = {}
            for i in list(XMLItem):
                controls[i.get('name')] = generateControlsR(i)
            return controls

        controls = {}
        for i in list(XMLItem):
            controls[i.get("name")] = generateControlsR(i)
        return controls
from tkinter import Tk
from tkinter import messagebox
import sys

if __name__ == '__main__':
    logObj = Logger()

    try:
        database = dm.Database(logObj)
    except:
        root = Tk()
        root.withdraw()
        messagebox.showerror(
            "Hiba", "A rendszer nem tud csatlakozni az adatbázishoz.")
        sys.exit(1)

    loginWindow = lw.LoginWindow(logObj, database)

    try:
        user = us.User(logObj, loginWindow.user, database,
                       loginWindow.isFirstTime)
    except AttributeError:
        sys.exit(0)

    try:
        mainWindow = mw.MainWindow(logObj, user, database)
    except TclError:
        pass

    database.dbConnection.close()
Example #6
0
from Windows import MainWindow

reload(MainWindow)

Col = MainWindow.MainController()

Col.view.showMaximized()
# -*- coding: utf-8 -*-

##  GUI应用程序主程序入口

import sys

from PySide2.QtWidgets import QApplication
from SplashScreen import SplashScreen

from Windows import MainWindow

app = QApplication(sys.argv)  # 创建GUI应用程序
splash = SplashScreen()

mainWindow = MainWindow()  # 创建主窗体

mainWindow.show()  # 显示主窗体

sys.exit(app.exec_())
Example #8
0
    def __init__(self):

        #Create data directories. Included in windows even though
        #the project won't work in windows yet


        self.frames= 0
        self.oldtime = 0
        SettingsXML = self.Get_Settings()
        Globals.SettingsXML = SettingsXML
        self.window = MainWindow()
        self.ErrorMsg = None
        self.system = None
        Globals.load_game = partial(self.load_game,self)
        Globals.load_game = self.load_game
        Globals.Mainwindow = self.window
        Globals.Mouse = PyMouse()
        Globals.Joysticks = [pygame.joystick.Joystick(i) for i in xrange(pygame.joystick.get_count())]
        [i.init() for i in Globals.Joysticks]

        self.state_slot = 0

        if not os.path.isdir(Globals.DataDir+"temp"):
            os.mkdir(Globals.DataDir+"temp")
        if not os.path.isdir(Globals.DataDir+"Systems"):
            os.mkdir(Globals.DataDir+"Systems")
        if not os.path.isdir(Globals.DataDir+"Games"):
            os.mkdir(Globals.DataDir+"Games")
        SystemSettingsTree = {("",1,("name",), SettingsCheck.SystemExistSanityCheck): None}
        CoreSettingsTree = {("",1,("name","system"),SettingsCheck.CoreNameSanityCheck) : None}

        for i in os.listdir(Globals.DataDir+"Systems"):
            if os.path.isdir(Globals.DataDir+"Systems/"+i):
                try:
                    with open(Globals.DataDir+"Systems/"+i+"/system.xml",'r') as settingsfile:
                        SystemXML = ET.XML(settingsfile.read())
                    if SettingsCheck.check_settings(SystemSettingsTree, SystemXML):
                        Globals.Systems.append((i)[7:])
                        for j in os.listdir(Globals.DataDir+"Systems/"+i):
                            if os.path.isdir(Globals.DataDir+"Systems/"+i+"/"+j):
                                try:
                                    settingsfile = open(Globals.DataDir+"Systems/"+i+"/" + j + "/core.xml",'r')
                                    with open(Globals.DataDir+"Systems/"+i+"/" + j + "/core.xml",'r') as settingsfile:
                                        CoreXML = ET.XML(settingsfile.read())
                                    if SettingsCheck.check_settings(CoreSettingsTree, CoreXML):
                                        Globals.Cores.append(i[7:]+"/"+j[5:])
                                except:
                                    pass
                except:
                    pass

        self.systemrunning=False

        GamesXML = self.Get_Games()


        Globals.GamesXML = GamesXML

        Globals.Update_Games()
        Globals.WindowHeight = int(Globals.SettingsXML.find("Window").get("height"))
        Globals.WindowWidth = int(Globals.SettingsXML.find("Window").get("width"))
        self.window.set_default_size(Globals.WindowWidth, Globals.WindowHeight)
        self.window.connect('check-resize', self.Window_Size_Changed)
        self.window.connect("delete-event", self.on_kill)
        self.window.connect("destroy", self.on_kill)
        self.window.show_all()
        Globals.Hotkeys = self.generateControls(Globals.SettingsXML.find("Hotkeys"))
        self.timeout = GObject.timeout_add(16,self.runframe)
Example #9
0
class GSEF(object):
    def __init__(self):

        #Create data directories. Included in windows even though
        #the project won't work in windows yet


        self.frames= 0
        self.oldtime = 0
        SettingsXML = self.Get_Settings()
        Globals.SettingsXML = SettingsXML
        self.window = MainWindow()
        self.ErrorMsg = None
        self.system = None
        Globals.load_game = partial(self.load_game,self)
        Globals.load_game = self.load_game
        Globals.Mainwindow = self.window
        Globals.Mouse = PyMouse()
        Globals.Joysticks = [pygame.joystick.Joystick(i) for i in xrange(pygame.joystick.get_count())]
        [i.init() for i in Globals.Joysticks]

        self.state_slot = 0

        if not os.path.isdir(Globals.DataDir+"temp"):
            os.mkdir(Globals.DataDir+"temp")
        if not os.path.isdir(Globals.DataDir+"Systems"):
            os.mkdir(Globals.DataDir+"Systems")
        if not os.path.isdir(Globals.DataDir+"Games"):
            os.mkdir(Globals.DataDir+"Games")
        SystemSettingsTree = {("",1,("name",), SettingsCheck.SystemExistSanityCheck): None}
        CoreSettingsTree = {("",1,("name","system"),SettingsCheck.CoreNameSanityCheck) : None}

        for i in os.listdir(Globals.DataDir+"Systems"):
            if os.path.isdir(Globals.DataDir+"Systems/"+i):
                try:
                    with open(Globals.DataDir+"Systems/"+i+"/system.xml",'r') as settingsfile:
                        SystemXML = ET.XML(settingsfile.read())
                    if SettingsCheck.check_settings(SystemSettingsTree, SystemXML):
                        Globals.Systems.append((i)[7:])
                        for j in os.listdir(Globals.DataDir+"Systems/"+i):
                            if os.path.isdir(Globals.DataDir+"Systems/"+i+"/"+j):
                                try:
                                    settingsfile = open(Globals.DataDir+"Systems/"+i+"/" + j + "/core.xml",'r')
                                    with open(Globals.DataDir+"Systems/"+i+"/" + j + "/core.xml",'r') as settingsfile:
                                        CoreXML = ET.XML(settingsfile.read())
                                    if SettingsCheck.check_settings(CoreSettingsTree, CoreXML):
                                        Globals.Cores.append(i[7:]+"/"+j[5:])
                                except:
                                    pass
                except:
                    pass

        self.systemrunning=False

        GamesXML = self.Get_Games()


        Globals.GamesXML = GamesXML

        Globals.Update_Games()
        Globals.WindowHeight = int(Globals.SettingsXML.find("Window").get("height"))
        Globals.WindowWidth = int(Globals.SettingsXML.find("Window").get("width"))
        self.window.set_default_size(Globals.WindowWidth, Globals.WindowHeight)
        self.window.connect('check-resize', self.Window_Size_Changed)
        self.window.connect("delete-event", self.on_kill)
        self.window.connect("destroy", self.on_kill)
        self.window.show_all()
        Globals.Hotkeys = self.generateControls(Globals.SettingsXML.find("Hotkeys"))
        self.timeout = GObject.timeout_add(16,self.runframe)

    def on_kill(self, *args):
        if Globals.system:
            Globals.system.close()
            Globals.system = None
        Gtk.main_quit()

    def runframe(self):

        if Globals.Hotkeys["Save State"].changed_this_frame and Globals.Hotkeys["Save State"].get_state():
            Globals.system.save_state("state {}".format(self.state_slot))

        if Globals.Hotkeys["Load State"].changed_this_frame and Globals.Hotkeys["Load State"].get_state():
            Globals.system.load_state("state {}".format(self.state_slot))

        if Globals.Hotkeys["Increment State Slot"].changed_this_frame and Globals.Hotkeys["Increment State Slot"].get_state():
            self.state_slot += 1
            self.window.statusLabel.add_text_timer("State slot {} selected".format(self.state_slot), 3000)

        if Globals.Hotkeys["Decrement State Slot"].changed_this_frame and Globals.Hotkeys["Decrement State Slot"].get_state():
            self.state_slot = max(0, self.state_slot-1)
            self.window.statusLabel.add_text_timer("State slot {} selected".format(self.state_slot), 3000)

        if Globals.system and Globals.Hotkeys["Rewind"].get_state() and len(Globals.StateSizes):
            Globals.system.rewinding = True

            Globals.system.unserialize(Globals.StateData[0])
            if len(Globals.StateData) > 1:
                if isinstance(Globals.StateData[1], xordiff.numpyxor):
                    Globals.StateData[1] = Globals.StateData[1].undiff(Globals.StateData[0])
                    Globals.StateSizes[1] = Globals.StateData[1]
            del(Globals.StateData[0])
            del(Globals.StateSizes[0])
        elif Globals.system:
            Globals.system.rewinding = False
        rewind = Globals.SettingsXML.find("Rewind")
        if rewind.get("Enabled") == "True" and Globals.system and not Globals.system.rewinding:
            frames = int(rewind.get("Frames"))
            size = int(rewind.get("Size"))
            if not self.frames % frames:
                statedata = Globals.system.serialize()
                datalen = statedata.nbytes
                if len(Globals.StateData) and rewind.get("Compress") == "True":
                    Globals.StateData[0] = xordiff.numpyxor(Globals.StateData[0], statedata)
                    Globals.StateSizes[0] = Globals.StateData[0].nbytes
                Globals.StateData.insert(0,statedata)
                Globals.StateSizes.insert(0,datalen)
                while sum(Globals.StateSizes) > size*1048576:
                    Globals.StateData.pop()
                    Globals.StateSizes.pop()


        pygame.event.pump()
        Globals.OldJoystickStates = Globals.JoystickStates
        Globals.JoystickStates = []

        for joystick in Globals.Joysticks:
            Buttons = []
            Axes = []
            Hats = []
            for i in xrange(0, joystick.get_numaxes()):
                Axes.append(joystick.get_axis(i))
            for i in xrange(0, joystick.get_numhats()):
                Hats.append(joystick.get_hat(i))
            for i in xrange(0, joystick.get_numbuttons()):
                Buttons.append(joystick.get_button(i))
            Globals.JoystickStates.append({"Buttons":Buttons,"Axes":Axes, "Hats": Hats})


        if Globals.system and Globals.system.running:
            Globals.system.run_frame()
            self.frames += 1
            if int(time.time()) != self.oldtime:
                self.framerate = self.frames
                self.frames = 0
                self.window.FPSlabel.set_text("FPS: {}".format(self.framerate))
            self.oldtime = int(time.time())

        return True

    def Get_Games(self):
        ValidGames = False
        GamesXML = None
        try:
            with open(Globals.DataDir+"Games/Games.xml", "r") as GamesFile:
                GamesText = GamesFile.read()
            ValidGames = True
        except IOError:
            pass

        #Description to follow through the settings tree for testing sanity
        GamesTree = {("System",0,("name",),SettingsCheck.SystemExistSanityCheck) :
                        {("Game",0,("name",),SettingsCheck.GameNameSanityCheck):
                            {("Patch",0,("name",),SettingsCheck.PatchNameSanityCheck):None}
                        }
                    }
        GameTree = {("",1,("name","core","filename","system"),SettingsCheck.GameSettingsSanityCheck) :
                        {("Controls",1,("inherit",),None): None
                        }
                    }
        PatchSanityLam = lambda game,name,format,filename,system: os.path.isfile(Globals.DataDir+"Games/"+system+"/"+game+"/patches/"+name+"/"+filename)
        PatchTree = {("",1,("game","name","format","filename","system"),PatchSanityLam) :
                        {("Controls",1,("inherit",),None): None
                        }
                    }

        #Make sure the settings file is valid XML
        if ValidGames:
            try:
                GamesXML = ET.XML(GamesText)
            except ET.ParseError:
                ValidGames = False

        #Validate the the settings use sane values
        if ValidGames:
            ValidGames = SettingsCheck.check_settings(GamesTree,GamesXML)

        #If the games XML file isn't sane, repopulate it manually
        if not ValidGames:
            popup = ErrorPopupWindow("Games not found","Game definitions not found, repopulating manually")
            popup.set_transient_for(self.window)
            popup.show_all()
            systemlam = lambda x: os.path.isdir(Globals.DataDir+"Games/"+x) and os.path.isdir(Globals.DataDir+"Systems/System_"+x)
            gamelam = lambda x: os.path.isdir(Globals.DataDir+"Games/"+system+"/"+x)
            patchlam = lambda x: os.path.isdir(Globals.DataDir+"Games/"+system+"/"+game+"/"+x)
            GamesXML = ET.XML("<Games/>")
            for system in filter(systemlam, os.listdir(Globals.DataDir+"Games")):
                SystemXML = ET.XML("<System/>")
                SystemXML.set("name",system)
                for game in filter(gamelam,os.listdir(Globals.DataDir+"Games/"+system)):
                    try:
                        with open(Globals.DataDir+"Games/"+system+"/"+game+"/game.xml",'r') as GameSettingsFile:
                            GameSettingsText = GameSettingsFile.read()
                        GameSettingsXML = ET.XML(GameSettingsText)
                        GameSane = SettingsCheck.check_settings(GameTree, GameSettingsXML)
                        if GameSane:
                            GameXML = ET.XML("<Game/>")
                            GameXML.set("name",game)
                            GameXML.set("core",GameSettingsXML.get("core"))
                            for patch in filter(patchlam,os.listdir(Globals.DataDir+"Games/"+system+"/"+game+"/patches")):
                                try:
                                    with open(Globals.DataDir+"Games/"+system+"/"+game+"/patches/"+patch+"/patch.xml",'r') as PatchSettingsFile:
                                        PatchSettingsText = PatchSettingsFile.read()
                                    PatchSettingsXML = ET.XML(PatchSettingsText)
                                    PatchSane = SettingsCheck.check_settings(PatchTree, PatchSettingsXML)
                                    if PatchSane:
                                        PatchXML = ET.XML("<Patch/>")
                                        PatchXML.set("name",patch)
                                        PatchXML.set("format",PatchSettingsXML.get("format"))
                                        GameXML.append(PatchXML)
                                except:
                                    pass
                            SystemXML.append(GameXML)
                    except:
                        pass
                GamesXML.append(SystemXML)
        return GamesXML


    def Get_Settings(self):
        ValidSettings = False
        SettingsXML = None
        try:
            with open(Globals.DataDir+"Settings.xml", "r") as SettingsFile:
                SettingsText = SettingsFile.read()
            ValidSettings = True
        except IOError:
            SettingsText = DefaultSettings
            ValidSettings = True

        #Description to follow through the settings tree for testing sanity
        SettingsTree = {("Paths",1,(),None) :
                            {("LastAccessedSystem",1,("path",),SettingsCheck.DirectoryPathSanityCheck):None,
                             ("LastAccessedCore",1,("path",),SettingsCheck.DirectoryPathSanityCheck):None
                            },
                        ("Window",1,("width","height"),SettingsCheck.WindowSizeSanityCheck) :None,
                        ("AspectRatio",1,("keep",), lambda x: x == "True" or x == "False") : None,
                        ("Hotkeys",1,(),None) : {("Button",9,("Mapping","name"),None) : None},
                        ("Rewind",1,("Frames","Size","Enabled","Compress"), lambda f, s, e, c: f.isdigit() and s.isdigit() and (e == "False" or e == "True") and (c == "False" or c == "True")) : None
                        }

        SettingsXML = ET.XML(SettingsText)
        #Make sure the settings file is valid XML
        if ValidSettings:
            try:
                SettingsXML = ET.XML(SettingsText)
            except ET.ParseError:
                ValidSettings = False

        #Validate the the settings use sane values
        if ValidSettings:
            ValidSettings = SettingsCheck.check_settings(SettingsTree,SettingsXML)

        #If the settings aren't sane, replace them with the standard settings
        #May change later to only replace the parts that are not sane
        if not ValidSettings:
            try:
                SettingsXML = ET.XML(DefaultSettings)
                with open(Globals.DataDir+"Settings.xml", "w") as SettingsFile:
                    SettingsFile.write(DefaultSettings)
                popup = ErrorPopupWindow("Settings Not Found","Settings not found or corrupt, using default settings")
                popup.show_all()
            except:
                self.ErrorMsg = "Failed to write to settings file"
        return SettingsXML


    #When the window resizes, we need to change the preferred window size to that
    #That way when they come back, the window will be the same size
    def Window_Size_Changed(self,window):
        size = window.get_size()
        Globals.WindowHeight = size[1]
        Globals.WindowWidth = size[0]
        windowxml = Globals.SettingsXML.find("Window")
        windowxml.set("width",str(size[0]))
        windowxml.set("height",str(size[1]))




    def Run(self):
        Gtk.main()
        #Write out the changed settings, however they were changed
        with open(Globals.DataDir+"Settings.xml", "w") as SettingsFile:
            SettingsFile.write(ET.tostring(Globals.SettingsXML))
        with open(Globals.DataDir+"Games/Games.xml", "w") as GamesFile:
            GamesFile.write(ET.tostring(Globals.GamesXML))
        #self.loopingpipe.send(("kill",))

    def load_game(self,systemname,corename,gamename,patchname):
        Globals.StateData = []
        Globals.StateSizes = []
        if Globals.system != None:
            Globals.system.close()
            Globals.system = System(systemname)
        else:
            Globals.system = System(systemname)
        Globals.system.load_core(corename)
        gamepath = "{0}Games/{1}/{2}/".format(Globals.DataDir,systemname,gamename)
        sysxmlpath = "{0}Systems/System_{1}/system.xml".format(Globals.DataDir,systemname)
        patchpath = "{0}{1}".format(gamepath,patchname)
        controlpath = "{0}game.xml".format(gamepath)
        savespath = "{}savestates".format(gamepath)
        try:
            os.makedirs(savespath)
        except:
            pass
        with open(controlpath,'r') as controlxmlfile:
            controlxml = ET.XML(controlxmlfile.read())
        if controlxml.find("Controls").get("inherit") == "True":
            with open(sysxmlpath,'r') as controlxmlfile:
                controlxml = ET.XML(controlxmlfile.read())
        controlxml = controlxml.find("Controls")

        Globals.Hotkeys = self.generateControls(Globals.SettingsXML.find("Hotkeys"))
        Globals.Controls = self.generateControls(controlxml)

        patcher = None #Add patch stuff later
        Globals.system.update_controls(Globals.Controls)
        Globals.system.load_game(gamepath,patchpath,patcher)
        framerate = Globals.system.get_framerate()
        self.window.statusLabel.add_text_timer("Loaded {}".format(gamename), 3000)
        GObject.source_remove(self.timeout)
        self.timeout = GObject.timeout_add(int(1000//Globals.system.get_framerate()),self.runframe)

    def generateControls(self,XMLItem):
        def generateControlsR(XMLItem, parent=None):
            if XMLItem.get("Mapping"):
                digital = False
                if XMLItem.get("type") == "Digital":
                    digital = True
                return Control(XMLItem.get("Mapping"), XMLItem.tag, XMLItem.get("name"), digital)

            controls = {}
            for i in list(XMLItem):
                controls[i.get('name')] = generateControlsR(i)
            return controls
        controls = {}
        for i in list(XMLItem):
            controls[i.get("name")] = generateControlsR(i)
        return controls