summaryrefslogtreecommitdiffstats
path: root/wineconfig/winewrite.py
diff options
context:
space:
mode:
Diffstat (limited to 'wineconfig/winewrite.py')
-rw-r--r--wineconfig/winewrite.py489
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