This script does all the platform dependent stuff. Its main task is
to figure out where the python modules are.
"""
+import sys, os
+
+def win32_unicode_argv():
+ # fix for https://gna.org/bugs/?17739
+ # code mostly comes from http://code.activestate.com/recipes/572200/
+ """Uses shell32.GetCommandLineArgvW to get sys.argv as a list of Unicode
+ strings.
+
+ Versions 2.x of Python don't support Unicode in sys.argv on
+ Windows, with the underlying Windows API instead replacing multi-byte
+ characters with '?'.
+ """
+ try:
+ from ctypes import POINTER, byref, cdll, c_int, windll
+ from ctypes.wintypes import LPCWSTR, LPWSTR
+
+ GetCommandLineW = cdll.kernel32.GetCommandLineW
+ GetCommandLineW.argtypes = []
+ GetCommandLineW.restype = LPCWSTR
+ CommandLineToArgvW = windll.shell32.CommandLineToArgvW
+ CommandLineToArgvW.argtypes = [LPCWSTR, POINTER(c_int)]
+
+ CommandLineToArgvW.restype = POINTER(LPWSTR)
+ cmd = GetCommandLineW()
+ argc = c_int(0)
+ argv = CommandLineToArgvW(cmd, byref(argc))
+ if argc.value > 0:
+ # Remove Python executable if present
+ if argc.value - len(sys.argv) == 1:
+ start = 1
+ else:
+ start = 0
+ return [argv[i] for i in xrange(start, argc.value)]
+ except Exception:
+ return [s.decode(sys.getfilesystemencoding()) for s in args]
def get_paths():
- import sys, os
join = os.path.join
lib_shared='share/mypaint/'
# note: some distros use lib64 instead, they have to edit this...
lib_compiled='lib/mypaint/'
- scriptdir=os.path.dirname(sys.argv[0])
+ # convert sys.argv to a list of unicode objects
+ # (actually convertig sys.argv confuses gtk, thus we add a new variable)
+ if sys.platform == 'win32':
+ sys.argv_unicode = win32_unicode_argv()
+ else:
+ sys.argv_unicode = [s.decode(sys.getfilesystemencoding()) for s in sys.argv]
+ scriptdir=os.path.dirname(sys.argv_unicode[0])
# this script is installed as $prefix/bin. We just need $prefix to continue.
#pwd=os.getcwd() # why????
if os.path.basename(dir_install) == 'bin':
prefix=os.path.dirname(dir_install)
+ assert isinstance(prefix, unicode)
libpath=join(prefix, lib_shared)
libpath_compiled = join(prefix, lib_compiled)
sys.path.insert(0, libpath)
sys.path.insert(0, libpath_compiled)
localepath = join(prefix, 'share/locale')
+ extradata = join(prefix, 'share')
+ elif sys.platform == 'win32':
+ prefix=None
+ # this is py2exe point of view, all executables in root of installdir
+ # all path must be normalized to absolute path
+ libpath = os.path.abspath(os.path.dirname(os.path.realpath(sys.argv_unicode[0])))
+ sys.path.insert(0, libpath)
+ localepath = join(libpath, 'share/locale')
+ extradata = join(libpath, 'share')
else:
# we are not installed
- prefix=None
- libpath='.'
+ prefix = None
+ libpath = u'.'
+ extradata = u'desktop'
localepath = 'po'
+ assert isinstance(libpath, unicode)
+
try: # just for a nice error message
from lib import mypaintlib
except ImportError:
print datapath
raise sys.exit(1)
- homepath = os.path.expanduser('~')
- if homepath == '~':
+ from lib import helpers
+ homepath = helpers.expanduser_unicode(u'~')
+ if sys.platform == 'win32':
+ # using patched win32 glib using correct CSIDL_LOCAL_APPDATA
+ import glib
+ confpath = os.path.join(glib.get_user_config_dir().decode('utf-8'),'mypaint')
+ elif homepath == '~':
confpath = join(prefix, 'UserData')
else:
confpath = join(homepath, '.mypaint/')
- return datapath, confpath, localepath
+ assert isinstance(datapath, unicode)
+ assert isinstance(confpath, unicode)
+ assert isinstance(extradata, unicode)
+ return datapath, extradata, confpath, localepath
def psyco_opt():
# This helps on slow PCs where the python overhead dominates.
# (30% higher framerate measured on 533MHz CPU; startup slowdown below 20%)
# Note: python -O -O does not help.
- import psyco
- psyco.full()
- print 'Psyco being used'
-
-if __name__ == '__main__':
try:
- psyco_opt()
+ import psyco
+ if sys.platform == 'win32':
+ if psyco.hexversion >= 0x020000f0 :
+ psyco.full()
+ print 'Psyco being used'
+ else:
+ print "Need at least psyco 2.0 to run"
+ else:
+ psyco.full()
+ print 'Psyco being used'
except ImportError:
pass
- paths = get_paths()
+
+if __name__ == '__main__':
+ psyco_opt()
+
+ datapath, extradata, confpath, localepath = get_paths()
+
+ # must be done before importing any translated python modules
+ # (to get global strings translated, especially brushsettings.py)
+ import gettext
+ if sys.platform == 'win32':
+ import locale
+ os.environ['LANG'] = locale.getdefaultlocale()[0]
+ gettext.bindtextdomain("mypaint", localepath)
+ gettext.textdomain("mypaint")
+
from gui import main
- main.main(*paths)
+ main.main(datapath, extradata, confpath)