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.
544 lines
18 KiB
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")
|