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/wineread.py

544 lines
18 KiB

#!/usr/bin/python
# -*- coding: UTF-8 -*-
###########################################################################
# wineread.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
""" Provides a set of functions for accessing wine's settings """
# Assumes the fake windows is installed in ~/.wine
default_winepath = os.environ['HOME'] + "/.wine"
winepath = default_winepath
defaultwinfolderspath = "c:\\windows\\profiles\\" + os.environ['USER']
# Where the dll's are
default_winebuildpath = "/usr/lib/wine"
default_winebuildpath2 = "/usr/lib32/wine"
default_winebuildpath3 = "/usr/local/lib/wine"
winebuildpath = None
def GetWineBuildPath():
""" Returns the wine build path, None if not present """
path = None
if winebuildpath:
path = winebuildpath
elif os.path.exists(default_winebuildpath):
path = default_winebuildpath
elif os.path.exists(default_winebuildpath2):
path = default_winebuildpath2
elif os.path.exists(default_winebuildpath3):
path = default_winebuildpath3
return path
def SetWineBuildPath(path):
""" Sets the winebuildpath to path """
global winebuildpath
winebuildpath = path
# drive = [index, letter, unixpath/mapping, type, label, serial]
empty_drives = (
[0,"A:","","","",""],
[1,"B:","","","",""],
[2,"C:","","","",""],
[3,"D:","","","",""],
[4,"E:","","","",""],
[5,"F:","","","",""],
[6,"G:","","","",""],
[7,"H:","","","",""],
[8,"I:","","","",""],
[9,"J:","","","",""],
[10,"K:","","","",""],
[11,"L:","","","",""],
[12,"M:","","","",""],
[13,"N:","","","",""],
[14,"O:","","","",""],
[15,"P:","","","",""],
[16,"Q:","","","",""],
[17,"R:","","","",""],
[18,"S:","","","",""],
[19,"T:","","","",""],
[20,"U:","","","",""],
[21,"V:","","","",""],
[22,"W:","","","",""],
[23,"X:","","","",""],
[24,"Y:","","","",""],
[25,"Z:","","","",""])
def GetEmptyDrives():
""" Returns a list of 26 empty drives """
drives = []
for drive in empty_drives:
drives.append(drive[:])
return drives
def LoadDrives():
drives = GetEmptyDrives()
driveletters = os.listdir(winepath + "/dosdevices")
for folder in driveletters:
if len(folder) > 2 or folder[1] != ':':
del folder
set(driveletters)
drivetypes = GetDriveTypes()
for drive in drives:
letter = drive[1].lower()
if letter in driveletters:
drive[2] = os.readlink(winepath + "/dosdevices/" + letter)
if drivetypes.has_key(drive[1]):
drive[3] = drivetypes[drive[1]]
return drives
empty_shelllinks = ([26,"Desktop","","","",""],
[27,"My Documents","","","",""],
[28,"My Pictures","","","",""],
[29,"My Music","","","",""],
[30,"My Video","","","",""])
folder_nonexistent = "This folder does not exist, please map it."
profilesdirectory = winepath + "/dosdevices/c:/windows/profiles/" + os.environ['USER']
def GetEmptyShellLinks():
""" Returns a list of important windows folders """
shelllinks = []
for link in empty_shelllinks:
shelllinks.append(link[:])
return shelllinks
def GetShellLinks():
shelllinks = GetEmptyShellLinks()
existingshelllinks = os.listdir(profilesdirectory)
set(existingshelllinks)
shellregistry = GetShellRegistry()
usershellregistry = GetUserShellRegistry()
for link in shelllinks:
if link[1] in existingshelllinks:
linkpath = profilesdirectory + "/" + link[1]
if os.path.islink(linkpath):
link[2] = os.readlink(linkpath)
else:
link[2] = linkpath
link[3] = "shellfolder"
winpath = defaultwinfolderspath + "\\" + link[1]
link[4] = winpath
link[5] = shellregistry.get(link[1], defaultwinfolderspath + "\\" + link[1])
link[5] = link[5].replace("\\\\","\\")
else:
link[3] = "shellfolder"
link[4] = folder_nonexistent
link[5] = shellregistry.get(link[1], folder_nonexistent)
link[5] = link[5].replace("\\\\","\\")
return shelllinks
def GetValue(key, value):
""" Returns a specific value, returns a blank string if the value is not there. """
# Need 4 \'s to generate one because both python and the shell use it as an escape character
key = key.replace("\\","\\\\")
key = key.replace(" ","\\ ")
error = os.system("wine regedit /E .registryvalue.reg " + key)
if error != 0:
return ""
file=open('.registryvalue.reg')
for line in file:
if line and line[0] == '"' or line[0] == '@':
line = line.strip('\r\n')
line = line.split('=')
line = (line[0].strip('"'),line[1].strip('"@'))
if line[0] == value:
file.close()
os.remove(".registryvalue.reg")
return line[1]
else:
file.close()
os.remove(".registryvalue.reg")
return ""
def GetKeyValues(key):
""" Returns a dictionary of all the values in the key
Returns an empty dictionary if the key does not exist
Does not read subkeys within the key """
# Need 4 \'s to generate one because both python and the shell use it as an escape character
key = key.replace("\\","\\\\")
key = key.replace(" ","\\ ")
error = os.system("wine regedit /E .registrykey.reg " + key)
if error != 0:
return {}
settings = {}
file=open('.registrykey.reg')
keycount = 0
for line in file:
if keycount > 1:
break
elif line and line[0] == '[':
keycount += 1
elif line and line[0] == '"':
line = line.split('=')
settings[line[0].strip('"')] = line[1].strip('"\r\n@')
file.close()
os.remove(".registrykey.reg")
return settings
def GetUserShellRegistry():
error = os.system("wine regedit /E .registryshelluser.reg HKEY_USERS\\\\.Default\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\User\\ Shell\\ Folders")
if error != 0:
return {}
usershellfile=open('.registryshelluser.reg')
usershellfilelines = usershellfile.readlines()
usershellfile.close()
os.remove(".registryshelluser.reg")
settings = {}
del(usershellfilelines[:3])
for usershellline in usershellfilelines:
usershellline = usershellline.split('=')
settings[usershellline[0].strip('"')] = usershellline[1].strip('"\r\n')
return settings
def GetShellRegistry():
error = os.system("wine regedit /E .registryshell.reg HKEY_USERS\\\\.Default\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Shell\\ Folders")
if error != 0:
return {}
shellfile=open('.registryshell.reg')
shellfilelines = shellfile.readlines()
shellfile.close()
os.remove(".registryshell.reg")
settings = {}
del(shellfilelines[:3])
for shellline in shellfilelines:
shellline = shellline.split('=')
settings[shellline[0].strip('"')] = shellline[1].strip('"\r\n')
return settings
def GetDriveTypes():
""" Returns a dictionary of the drive types """
# Drive C: doesn't get stored in the registry
defaulttypes = {"C:":"hd"}
types = GetKeyValues("HKEY_LOCAL_MACHINE\\Software\\Wine\\Drives")
types.update(defaulttypes)
return types
def GetAudioDriver():
""" Returns the audio driver currently set in the registry """
return GetValue("HKEY_CURRENT_USER\\Software\\Wine\\Drivers","Audio")
def GetDSoundSettings(app = None):
""" Returns a dictionary of the settings for the DirectSound section """
if not app:
return GetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\DirectSound")
else:
return GetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\" +\
app + "\\DirectSound")
def GetWindowSettings(app = None):
""" Returns a dictionary of the Window Settings """
if not app:
return GetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\X11 Driver")
else:
return GetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\" +\
app + "\\X11 Driver")
def GetD3DSettings(app = None):
""" Returns a dictionary of the Direct3D Settings """
if not app:
return GetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\Direct3D")
else:
return GetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\" +\
app + "\\Direct3D")
# Copied from winecfg
winversions = (
( "win2003", "Windows 2003", 5, 2, 0xECE, "VER_PLATFORM_WIN32_NT", "Service Pack 1", 1, 0, "ServerNT"),
( "winxp", "Windows XP", 5, 1, 0xA28, "VER_PLATFORM_WIN32_NT", "Service Pack 2", 2, 0, "WinNT"),
( "win2k", "Windows 2000", 5, 0, 0x893, "VER_PLATFORM_WIN32_NT", "Service Pack 4", 4, 0, "WinNT"),
( "winme", "Windows ME", 4, 90, 0xBB8, "VER_PLATFORM_WIN32_WINDOWS", " ", 0, 0, ""),
( "win98", "Windows 98", 4, 10, 0x8AE, "VER_PLATFORM_WIN32_WINDOWS", " A ", 0, 0, ""),
( "win95", "Windows 95", 4, 0, 0x3B6, "VER_PLATFORM_WIN32_WINDOWS", "", 0, 0, ""),
( "nt40", "Windows NT 4.0", 4, 0, 0x565, "VER_PLATFORM_WIN32_NT", "Service Pack 6a", 6, 0, "WinNT"),
( "nt351", "Windows NT 3.5", 3, 51, 0x421, "VER_PLATFORM_WIN32_NT", "Service Pack 2", 0, 0, "WinNT"),
( "win31", "Windows 3.1", 2, 10, 0, "VER_PLATFORM_WIN32s", "Win32s 1.3", 0, 0, ""),
( "win30", "Windows 3.0", 3, 0, 0, "VER_PLATFORM_WIN32s", "Win32s 1.3", 0, 0, ""),
( "win20", "Windows 2.0", 2, 0, 0, "VER_PLATFORM_WIN32s", "Win32s 1.3", 0, 0, ""))
def GetGeneralWineSettings(app = None):
""" Returns a dictionary of the general wine Settings, including the windows version """
if not app:
return GetKeyValues("HKEY_CURRENT_USER\\Software\\Wine")
else:
return GetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\" +\
app)
def GetApps():
"""
Returns a list of the applications which have keys for application
specific settings.
"""
error = os.system("wine regedit /E .registryapps.reg HKEY_CURRENT_USER\\\\Software\\\\Wine\\\\AppDefaults")
if error != 0:
return []
settingsfile=open('.registryapps.reg')
settingsfilelines = settingsfile.readlines()
settingsfile.close()
os.remove('.registryapps.reg')
apps = set([])
del(settingsfilelines[:3])
for line in settingsfilelines:
if line[0] == '[':
line = line.split('\\')
line[4] = line[4].strip(']\r\n')
apps.add(line[4])
apps = list(apps)
apps.sort()
return apps
builtin_only = set(("advapi32",
"capi2032",
"dbghelp",
"ddraw",
"gdi32",
"glu32",
"icmp",
"iphlpapi",
"joystick.drv",
"kernel32",
"mswsock",
"ntdll",
"opengl32",
"stdole2.tlb",
"stdole32.tlb",
"twain_32",
"unicows",
"user32",
"vdmdbg",
"w32skrnl",
"winealsa.drv",
"winearts.drv",
"wineaudioio.drv",
"wined3d",
"winedos",
"wineesd.drv",
"winejack.drv",
"winemp3.acm",
"winenas.drv",
"wineoss.drv",
"wineps",
"wineps.drv",
"winex11.drv",
"winmm",
"wintab32",
"wnaspi32",
"wow32",
"ws2_32",
"wsock32"))
def GetDllsList():
""" Returns a list of dlls that can be overridden """
origdlls = os.listdir(GetWineBuildPath())
dlls = [""]
for dll in origdlls:
dll = dll.rstrip('.so')
dots = dll.count('.')
if dots != 1:
continue
dll, extension = dll.split('.')
if not (extension != "dll" or dll in builtin_only):
dlls.append(dll)
dlls.sort()
return dlls
def GetDllOverrides(app = None):
""" Returns a dictionary of overridden dlls """
if not app:
return GetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\DllOverrides")
else:
return GetKeyValues("HKEY_CURRENT_USER\\Software\\Wine\\AppDefaults\\" +\
app + "\\DllOverrides")
# --- Getting and Setting the Default browser ---
# WineBrowser>Browsers
# List of browsers that Wine will attempt to launch when running winebrowser
# command or clicking on a link in a windows application. Default value is
default_browserlist = ["firefox","konqueror","mozilla","netscape","galeon","opera","dillo"]
# WineBrowser>Mailers
# List of mail clients that Wine will attempt to launch when running winebrowser
# Default value is
default_mailerlist = ["mozilla-thunderbird","thunderbird","evolution","kmail"]
#with firefox installed
browser_formats = ["CHROME","FirefoxHTML","HTML","htmlfile","FTP","GOPHER","http","https"]
default_browser_formats = ["htmlfile","http","https"] # just "winebrowser"
default_mailer_formats = ["mailto"] # "winebrowser %1"
def GetBrowser():
""" Returns the default browser """
browser = GetValue("HKEY_LOCAL_MACHINE\\Software\\Classes\\http\\shell\\open\\command",'@')
if browser == "winebrowser":
return GetWineBrowser()
else:
return browser
def GetWineBrowser():
""" Returns the first browser tried by winebrowser """
browserlist = GetValue("HKEY_CURRENT_USER\\Software\\Wine\\WineBrowser","Browsers")
if browserlist:
browser = browserlist.split(',')[0].strip()
return browser
else:
return default_browserlist[0]
#def GetWinBrowserList():
def GetNativeBrowserList():
""" Returns the list of browsers tried by winebrowser """
browserlist = GetValue("HKEY_CURRENT_USER\\Software\\Wine\\WineBrowser","Browsers")
if browserlist:
browserlist = list(set(browserlist.split(',')))
for i,item in enumerate(browserlist):
browserlist[i] = item.strip()
return browserlist
else:
return default_browserlist
def GetMailer():
""" Returns the default mail client """
mailer = GetValue("HKEY_LOCAL_MACHINE\\Software\\Classes\\mailto\\shell\\open\\command",'@')
if mailer == "winebrowser" or mailer == "winebrowser %1":
return GetWineMailer()
else:
return mailer
def GetWineMailer():
""" Returns the first mail client tried by winebrowser """
mailerlist = GetValue("HKEY_CURRENT_USER\\Software\\Wine\\WineBrowser","Mailers")
if mailerlist:
mailer = mailerlist.split(',')[0].strip()
return mailer
else:
# Default first mailer to try in wine is mozilla-thunderbird
return default_mailerlist[0]
def GetNativeMailerList():
""" Returns the list of mail clients tried by winebrowser """
mailerlist = GetValue("HKEY_CURRENT_USER\\Software\\Wine\\WineBrowser","Mailers")
if mailerlist:
mailerlist = list(set(mailerlist.split(',')))
for i,item in enumerate(mailerlist):
mailerlist[i] = item.strip()
return mailerlist
else:
return default_mailerlist
# ----- Theming -----
def GetThemesList():
""" Returns a list of installed thiemes """
if not os.path.exists(winepath + "/dosdevices/c:/windows/Resources/Themes"):
return []
origthemes = os.listdir(winepath + "/dosdevices/c:/windows/Resources/Themes")
themes = []
for i,theme in enumerate(origthemes):
if os.path.exists(winepath +\
"/dosdevices/c:/windows/Resources/Themes/" + theme +\
"/" + theme + ".msstyles"):
themes.append(theme)
themes.sort()
return themes
def GetCurrentTheme():
""" Returns the current (theme,color,size), None if none is set """
themeinfo = GetKeyValues("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\ThemeManager")
if not themeinfo or themeinfo["ThemeActive"] == "0":
return None
else:
# themename from themename.msstyles
themename = themeinfo["DllName"].split('\\\\')[-1].split('.')[0]
theme = (themename, themeinfo["ColorName"], themeinfo["SizeName"])
return theme
def GetColorSettings():
""" Returns a dictionary of the set colors """
return GetKeyValues("HKEY_CURRENT_USER\\Control Panel\\Colors")
def GetWindowMetrics():
""" Returns a dictionary of the WindowMetrics settings """
return GetKeyValues("HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics")
def GetDesktopSettings():
""" Returns a dictionary of the control panel \ Desktop settings """
return GetKeyValues("HKEY_CURRENT_USER\\Control Panel\\Desktop")
def SetWinePath(path):
""" Sets the winepath to path """
global winepath
winepath = path
def GetWinePath():
return winepath
def VerifyWineDrive(path = None):
""" Does a very basic check of if the given path is a valid fake windows installation
Returns False if there is no C: drive """
if not path:
path = self.default_winepath
return os.path.exists(path + "/dosdevices/c:/windows/profiles/" + os.environ['USER']) and \
os.path.exists(path + "/dosdevices/c:/windows/system32") and \
os.path.exists(path + "/system.reg") and os.path.exists(path + "/userdef.reg") and \
os.path.exists(path + "/user.reg")