OSDN Git Service

layer move: strokemap too + cursor & idler tweaks
[mypaint-anime/master.git] / mypaint.py
index 1899909..9ed8906 100644 (file)
 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????
@@ -28,17 +68,30 @@ def get_paths():
 
     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:
@@ -58,28 +111,54 @@ def get_paths():
         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)