You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tde-guidance/wineconfig/winewrite.py

489 lines
19 KiB

#!/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)