#!/usr/bin/python # -*- coding: UTF-8 -*- ########################################################################### # winewrite.py - description # # ------------------------------ # # begin : Fri Mar 26 2004 # # copyright : (C) 2006 by Yuriy Kozlov # # email : yuriy.kozlov@gmail.com # # # ########################################################################### # # # 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 # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # ########################################################################### import os import wineread import random """ Provides functions for changings settings in wine """ def SetDriveMappings(drives): """ Sets wine's drive settings """ driveletters = os.listdir(wineread.winepath + "/dosdevices") set(driveletters) for drive in drives[:26]: letter = drive[1].lower() defineDrive = False if letter in driveletters: # The drive exists if drive[2]: # The drive is in use # Compare for changes changed = False # Check if the mapping changed if drive[2] != os.readlink(wineread.winepath + "/dosdevices/" + letter): changed = True # If it's changed, it will be recreated if changed: os.unlink(wineread.winepath + "/dosdevices/" + letter) defineDrive = True else: # Remove the drive os.unlink(wineread.winepath + "/dosdevices/" + letter) else: # The drive doesn't exist if drive[2]: # The drive is in use # Create it defineDrive = True else: # Do nothing continue if defineDrive: os.symlink(drive[2], wineread.winepath + "/dosdevices/" + letter) SetDriveTypes(drives[:26]) SetShellLinks(drives[26:]) def SetShellLinks(shelllinks): existingshelllinks = os.listdir(wineread.winepath + "/dosdevices/c:/windows/profiles/" + os.environ['USER']) set(existingshelllinks) shellregistry = wineread.GetShellRegistry() for link in shelllinks: createLink = False if link[1] in existingshelllinks: # The link exists linkpath = wineread.winepath + "/dosdevices/c:/windows/profiles/" + os.environ['USER'] + "/" + link[1] if link[2]: # The folder is mapped # Compare for changes changed = False # Check if the mapping changed if os.path.islink(linkpath) and link[2] != os.readlink(linkpath): changed = True elif not os.path.islink(linkpath) and link[2] != linkpath: changed = True elif link[5] != shellregistry.get(link[1], wineread.defaultwinfolderspath + "\\" + link[1]): changed = True # If it's changed, it will be recreated if changed: if os.path.islink(linkpath): os.unlink(linkpath) else: os.rename(linkpath,linkpath + "-backup" + str(random.randint(1,1000000))) createLink = True else: # Remove the link os.unlink(linkpath) else: # The link doesn't exist if link[2]: # The folder is mapped # Create it createLink = True else: # Do nothing continue if createLink: os.symlink(link[2], wineread.winepath + "/dosdevices/c:/windows/profiles/" + os.environ['USER'] + "/" + link[1]) if shellregistry.has_key(link[1]): SetShellRegistry(link) def SetShellRegistry(link): shellfile=open('.registryshellw.reg','w') shellfile.write("REGEDIT4\n\n[HKEY_USERS\\.Default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders]\n") link[5] = link[5].replace("\\","\\\\") shellfile.write('"' + link[1] + '"="' + link[5] + '"\n') shellfile.write("\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders]\n") link[5] = link[5].replace("\\","\\\\") shellfile.write('"' + link[1] + '"="' + link[5] + '"\n') shellfile.write("\n[HKEY_USERS\\.Default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders]\n") shellfile.write('"' + link[1] + '"="' + "%USERPROFILE%\\\\" + link[1] + '"') shellfile.write("\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders]\n") shellfile.write('"' + link[1] + '"="' + "%USERPROFILE%\\\\" + link[1] + '"') shellfile.close() os.system("wine regedit .registryshellw.reg") os.remove(".registryshellw.reg") def SetKeyValues(key,settings): """ Sets all the values in key to those from the dictionary settings """ file=open('.registrykey.reg','w') file.write("REGEDIT4\n\n[" + key + "]\n") for setting in settings: # Casting to a python string is necessary for older versions of pyQT if str(settings[setting])[:4] == 'hex:': file.write('"'+str(setting)+'"='+str(settings[setting])+'\n') else: file.write('"'+str(setting)+'"="'+str(settings[setting])+'"\n') file.close() os.system("wine regedit .registrykey.reg") os.remove(".registrykey.reg") def SetValue(key,value,data): """ Sets the value in key to data """ file=open('.registryvalue.reg','w') file.write("REGEDIT4\n\n[" + key + "]\n") file.write('"' + value + '"="' + data + '"') file.close() os.system("wine regedit .registryvalue.reg") os.remove(".registryvalue.reg") def SetDriveTypes(drives): """ Sets the type for the drives in the registry """ drivesfile=open('.registrydrives.reg','w') drivesfile.write("REGEDIT4\n\n[HKEY_LOCAL_MACHINE\\Software\\Wine\\Drives]\n") for drive in drives: mapping = drive[2] if mapping: drivesfile.write('"' + drive[1] + '"="' + drive[3] + '"\n') drivesfile.close() os.system("wine regedit .registrydrives.reg") os.remove(".registrydrives.reg") def SetAudioDriver(driver): """ Sets the audio driver in the registry """ SetValue("HKEY_CURRENT_USER\\Software\\Wine\\Drivers","Audio",driver) def SetDSoundSettings(settings, app = None): """ Sets the settings for Direct Sound in the registry """ if not app: SetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\DirectSound", settings) else: SetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\" +\ app + "\\DirectSound", settings) def SetWindowSettings(settings, app = None): """ Sets the window settings in the registry """ windowsfile=open('.registrywindows.reg','w') if not app: windowsfile.write("REGEDIT4\n\n[HKEY_CURRENT_USER\\Software\\Wine\\X11 Driver]\n") else: windowsfile.write("REGEDIT4\n\n[HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\" +\ app + "\\X11 Driver]\n") # There is a bug in wine that doesn't allow removing of registry entries from # a reg file, so unchecking emulate desktop can't be implemented this way yet. for setting in settings: if settings[setting]: windowsfile.write('"'+str(setting)+'"="'+str(settings[setting])+'"\n') else: # winecfg removes the value when the emulate desktop checkbox is unchecked windowsfile.write('"'+str(setting)+'"=-\n') windowsfile.close() os.system("wine regedit .registrywindows.reg") os.remove(".registrywindows.reg") def SetD3DSettings(settings, app = None): """ Sets the settings for Direct3D in the registry """ if not app: SetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\Direct3D", settings) else: SetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\" +\ app + "\\Direct3D", settings) def SetDesktopSettings(settings): """ Sets the control panel \ Desktop settings in the registry """ SetKeyValues("HKEY_CURRENT_USER\\Control Panel\\Desktop", settings) def SetWinVersion(version, app = None): """ Sets the windows version in the registry Sample format for version: ( "winxp", "Windows XP", 5, 1, 0xA28, "VER_PLATFORM_WIN32_NT", "Service Pack 2", 2, 0, "WinNT") """ winverfile=open('.registrywinver.reg','w') if not app: winverfile.write("REGEDIT4\n\n[HKEY_CURRENT_USER\\Software\\Wine]\n") winverfile.write('"Version"="' + version[0] + '"\n') Key9x = "\n[HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion]\n" KeyNT = "\n[HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion]\n" KeyProdNT = "\n[HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\ProductOptions]\n" KeyWindNT = "\n[HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Windows\n" KeyEnvNT = "\n[HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\Environment]\n" versionnumber9x = str(version[2]) + '.' + str(version[3]) + '.' + str(version[4]) versionnumberNT = str(version[2]) + '.' + str(version[3]) if version[5] == "VER_PLATFORM_WIN32_WINDOWS": winverfile.write(Key9x + '"VersionNumber"="' + versionnumber9x + '"\n') winverfile.write(Key9x + '"SubVersionNumber"="' + str(version[6]) + '"\n') winverfile.write(KeyNT + '"CSDVersion"=-\n') winverfile.write(KeyNT + '"CurrentVersion"=-\n') winverfile.write(KeyNT + '"CurrentBuildNumber"=-\n') winverfile.write(KeyProdNT + '"ProductType"=-\n') winverfile.write(KeyWindNT + '"CSDVersion"=-\n') winverfile.write(KeyEnvNT + '"OS"=-\n') elif version[5] == "VER_PLATFORM_WIN32_NT": winverfile.write(KeyNT + '"CurrentVersion"="' + versionnumberNT + '"\n') winverfile.write(KeyNT + '"CSDVersion"="' + str(version[6]) + '"\n') winverfile.write(KeyNT + '"CurrentBuildNumber"="' + str(version[4]) + '"\n') winverfile.write(KeyProdNT + '"ProductType"="' + str(version[9]) + '"\n') winverfile.write(KeyWindNT + '"CSDVersion"=dword:00000' + str(version[7]) + '00\n') winverfile.write(KeyEnvNT + '"OS"="Windows_NT"\n') winverfile.write(Key9x + '"VersionNumber"=-\n') winverfile.write(Key9x + '"SubVersionNumber"=-\n') elif version[5] == "VER_PLATFORM_WIN32s": winverfile.write(Key9x + '"VersionNumber"=-\n') winverfile.write(Key9x + '"SubVersionNumber"=-\n') winverfile.write(KeyNT + '"CSDVersion"=-\n') winverfile.write(KeyNT + '"CurrentVersion"=-\n') winverfile.write(KeyNT + '"CurrentBuildNumber"=-\n') winverfile.write(KeyProdNT + '"ProductType"=-\n') winverfile.write(KeyWindNT + '"CSDVersion"=-\n') winverfile.write(KeyEnvNT + '"OS"=-\n') else: winverfile.write("REGEDIT4\n\n[HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\" +\ app + "]\n") if version[0] == "global": winverfile.write('"Version"=-\n') else: winverfile.write('"Version"="' + version[0] + '"\n') winverfile.close() os.system("wine regedit .registrywinver.reg") os.remove(".registrywinver.reg") def SetApps(apps): """ Adds and removes keys for app specific settings for apps """ oldapps = wineread.GetApps() newapps = [] # Add new app keys for app in apps: if app not in oldapps: newapps.append(app) AddApps(newapps) # Remove removed app keys for app in oldapps: if app not in apps: RemoveApp(app) def RemoveApp(app): """ Removes the key for settings for app """ os.system("wine regedit /D HKEY_USERS\\\\S-1-5-4\\\\Software\\\\Wine\\\\AppDefaults\\\\" +\ app) def AddApps(apps): """ Adds a key for app """ appsfile=open('.registryapps.reg','w') appsfile.write("REGEDIT4\n\n") for app in apps: appsfile.write('[HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\' +\ app + ']\n') appsfile.close() os.system("wine regedit .registryapps.reg") os.remove(".registryapps.reg") def SetDllOverrides(overrides, app = None): """ Sets the dll override settings in the registry """ dllfile=open('.registrydll.reg','w') if not app: dllfile.write("REGEDIT4\n\n[HKEY_CURRENT_USER\\Software\\Wine\\DllOverrides]\n") else: dllfile.write("REGEDIT4\n\n[HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\" +\ app + "\\DllOverrides]\n") origoverrides = wineread.GetDllOverrides(app) for dll in overrides.keys(): dllfile.write('"'+str(dll)+'"="'+str(overrides[dll])+'"\n') for dll in origoverrides.keys(): if dll not in overrides: dllfile.write('"'+str(dll)+'"=-\n') dllfile.close() os.system("wine regedit .registrydll.reg") os.remove(".registrydll.reg") def SetDefaultBrowser(browser): """ Sets the default browser to browser Doesn't set windows browsers, leaves it for the program to do. """ file=open('.registrybrowser.reg','w') file.write("REGEDIT4\n") if browser[1] == ':': for format in wineread.default_browser_formats: file.write("\n[HKEY_LOCAL_MACHINE\\Software\\Classes\\" +\ format + "\\shell\\open\\command]\n") file.write('@="' + browser + '"\n') file.close() os.system("wine regedit .registrybrowser.reg") os.remove(".registrybrowser.reg") else: # winebrowser for format in wineread.default_browser_formats: file.write("\n[HKEY_LOCAL_MACHINE\\Software\\Classes\\" +\ format + "\\shell\\open\\command]\n") file.write('@="winebrowser"\n') file.close() os.system("wine regedit .registrybrowser.reg") os.remove(".registrybrowser.reg") SetFirstBrowser(browser) def SetDefaultMailer(mailer): """ Sets the default mailer to mailer Doesn't set windows mailers, leaves it for the program to do. """ file=open('.registrymailer.reg','w') file.write("REGEDIT4\n") if mailer[1] == ':': for format in wineread.default_mailer_formats: file.write("\n[HKEY_LOCAL_MACHINE\\Software\\Classes\\" +\ format + "\\shell\\open\\command]\n") file.write('@="' + mailer + '"\n') file.close() os.system("wine regedit .registrymailer.reg") os.remove(".registrymailer.reg") else: # winebrowser for format in wineread.default_mailer_formats: file.write("\n[HKEY_LOCAL_MACHINE\\Software\\Classes\\" +\ format + "\\shell\\open\\command]\n") file.write('@="winebrowser %1"\n') file.close() os.system("wine regedit .registrymailer.reg") os.remove(".registrymailer.reg") SetFirstMailer(mailer) def SetFirstBrowser(browser): """ Sets the first in the list of browsers for winebrowser to use to browser """ originalbrowserlist = wineread.GetNativeBrowserList() if browser in originalbrowserlist: originalbrowserlist.remove(browser) browserlist = [browser] + originalbrowserlist browserlist = str(browserlist).strip('[]') browserlist = browserlist.replace("'","") browserlist = browserlist.replace(", ",",") SetValue("HKEY_CURRENT_USER\\Software\\Wine\\WineBrowser","Browsers",browserlist) def SetFirstMailer(mailer): """ Sets the first in the list of mailers for winebrowser to use to mailer """ originalmailerlist = wineread.GetNativeMailerList() if mailer in originalmailerlist: originalmailerlist.remove(mailer) mailerlist = [mailer] + originalmailerlist mailerlist = str(mailerlist).strip('[]') mailerlist = mailerlist.replace("'","") mailerlist = mailerlist.replace(", ",",") SetValue("HKEY_CURRENT_USER\\Software\\Wine\\WineBrowser","Mailers",mailerlist) def CreateWineDrive(path = None): """ Creates a fake windows installation in path """ if not path: path = wineread.default_winepath os.system("WINEPREFIX=" + path + " wineprefixcreate --wait") # ----- Theming ----- def SetCurrentTheme(theme): """ Sets the current theme theme = (theme,color,size), None if none is set """ if not theme: theme = ("", "", "") themesettings = {"ColorName":theme[1], "SizeName":theme[2], "ThemeActive":"1"} if not theme[0]: themesettings["DllName"] = "" themesettings["ThemeActive"] = "0" else: themesettings["DllName"] = "C:\\\\windows\\\\Resources\\\\Themes\\\\" +\ theme[0] + "\\\\" + theme[0] +".msstyles" themefile=open('.registrytheme.reg','w') themefile.write("REGEDIT4\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\ThemeManager]\n") for setting in themesettings: if themesettings[setting]: themefile.write('"'+str(setting)+'"="'+str(themesettings[setting])+'"\n') else: themefile.write('"'+str(setting)+'"=-\n') themefile.close() os.system("wine regedit .registrytheme.reg") os.remove(".registrytheme.reg") def SetColorSettings(colors): """ Takes a dictionary of color settings and sets them in the registry """ SetKeyValues("HKEY_CURRENT_USER\\Control Panel\\Colors",colors) SetKeyValues("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\ThemeManager\\Control Panel\\Colors",colors) def SetWindowMetrics(metrics): """ Takes a dictionary of WindowMetrics settings and sets them in the registry """ SetKeyValues("HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics",metrics) ports_translation = {"lp":"lpt","ttyS":"com"} def CreatePorts(ports = None): """ Creates links to ports in dosdevices """ if not ports: # Find ports in /dev ports = ["lp0"] for port in ports: winport = ports_translation[port.rstrip("012345678")] +\ str(int(port.lstrip("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")) + 1) os.symlink("/dev/" + port, wineread.winepath + "/dosdevices/" + winport)