summaryrefslogtreecommitdiffstats
path: root/wineconfig/wineread.py
diff options
context:
space:
mode:
Diffstat (limited to 'wineconfig/wineread.py')
-rw-r--r--wineconfig/wineread.py543
1 files changed, 543 insertions, 0 deletions
diff --git a/wineconfig/wineread.py b/wineconfig/wineread.py
new file mode 100644
index 0000000..c1fa3c5
--- /dev/null
+++ b/wineconfig/wineread.py
@@ -0,0 +1,543 @@
+#!/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")