diff options
Diffstat (limited to 'wineconfig/winewrite.py')
-rw-r--r-- | wineconfig/winewrite.py | 489 |
1 files changed, 489 insertions, 0 deletions
diff --git a/wineconfig/winewrite.py b/wineconfig/winewrite.py new file mode 100644 index 0000000..0d0d365 --- /dev/null +++ b/wineconfig/winewrite.py @@ -0,0 +1,489 @@ +#!/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) +
\ No newline at end of file |