mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Got rid of the python.rsrc resource file. The error message strings and
dialogs are now stored in Mac/Lib, and loaded on demand through macresource. Not only does this simplify a MacPython based on Apple's Python, but it also makes Mac error codes come out symbolically when running command line python (if you have Mac/Lib in your path). The resource files are copied from Mac/Resources. The old ones will disappear after the OS9 build procedure has been adjusted.
This commit is contained in:
parent
430b1563dd
commit
dde800ec4e
7 changed files with 74 additions and 76 deletions
|
@ -27,6 +27,15 @@ import MacOS
|
||||||
import string
|
import string
|
||||||
from Carbon.ControlAccessor import * # Also import Controls constants
|
from Carbon.ControlAccessor import * # Also import Controls constants
|
||||||
import macfs
|
import macfs
|
||||||
|
import macresource
|
||||||
|
|
||||||
|
_initialized = 0
|
||||||
|
|
||||||
|
def _initialize():
|
||||||
|
global _initialized
|
||||||
|
if _initialized: return
|
||||||
|
macresource.need("DLOG", 260, "dialogs.rsrc", __name__)
|
||||||
|
|
||||||
|
|
||||||
def cr2lf(text):
|
def cr2lf(text):
|
||||||
if '\r' in text:
|
if '\r' in text:
|
||||||
|
@ -47,7 +56,7 @@ def Message(msg, id=260, ok=None):
|
||||||
|
|
||||||
The MESSAGE string can be at most 255 characters long.
|
The MESSAGE string can be at most 255 characters long.
|
||||||
"""
|
"""
|
||||||
|
_initialize()
|
||||||
d = GetNewDialog(id, -1)
|
d = GetNewDialog(id, -1)
|
||||||
if not d:
|
if not d:
|
||||||
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
|
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
|
||||||
|
@ -79,6 +88,7 @@ def AskString(prompt, default = "", id=261, ok=None, cancel=None):
|
||||||
can be at most 255 characters long.
|
can be at most 255 characters long.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
_initialize()
|
||||||
d = GetNewDialog(id, -1)
|
d = GetNewDialog(id, -1)
|
||||||
if not d:
|
if not d:
|
||||||
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
|
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
|
||||||
|
@ -119,6 +129,7 @@ def AskPassword(prompt, default='', id=264, ok=None, cancel=None):
|
||||||
The PROMPT and DEFAULT strings, as well as the return value,
|
The PROMPT and DEFAULT strings, as well as the return value,
|
||||||
can be at most 255 characters long.
|
can be at most 255 characters long.
|
||||||
"""
|
"""
|
||||||
|
_initialize()
|
||||||
d = GetNewDialog(id, -1)
|
d = GetNewDialog(id, -1)
|
||||||
if not d:
|
if not d:
|
||||||
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
|
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
|
||||||
|
@ -161,6 +172,7 @@ def AskYesNoCancel(question, default = 0, yes=None, no=None, cancel=None, id=262
|
||||||
The QUESTION string can be at most 255 characters.
|
The QUESTION string can be at most 255 characters.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
_initialize()
|
||||||
d = GetNewDialog(id, -1)
|
d = GetNewDialog(id, -1)
|
||||||
if not d:
|
if not d:
|
||||||
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
|
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
|
||||||
|
@ -221,6 +233,7 @@ class ProgressBar:
|
||||||
def __init__(self, title="Working...", maxval=0, label="", id=263):
|
def __init__(self, title="Working...", maxval=0, label="", id=263):
|
||||||
self.w = None
|
self.w = None
|
||||||
self.d = None
|
self.d = None
|
||||||
|
_initialize()
|
||||||
self.d = GetNewDialog(id, -1)
|
self.d = GetNewDialog(id, -1)
|
||||||
self.w = self.d.GetDialogWindow()
|
self.w = self.d.GetDialogWindow()
|
||||||
self.label(label)
|
self.label(label)
|
||||||
|
@ -391,6 +404,7 @@ def _selectoption(d, optionlist, idx):
|
||||||
|
|
||||||
|
|
||||||
def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
|
def GetArgv(optionlist=None, commandlist=None, addoldfile=1, addnewfile=1, addfolder=1, id=ARGV_ID):
|
||||||
|
_initialize()
|
||||||
d = GetNewDialog(id, -1)
|
d = GetNewDialog(id, -1)
|
||||||
if not d:
|
if not d:
|
||||||
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
|
print "EasyDialogs: Can't get DLOG resource with id =", id, " (missing resource file?)"
|
||||||
|
|
|
@ -353,58 +353,31 @@ def process_common_macho(template, progress, code, rsrcname, destname, is_update
|
||||||
ofp.close()
|
ofp.close()
|
||||||
|
|
||||||
|
|
||||||
if progress:
|
|
||||||
progress.label("Copy resources...")
|
|
||||||
progress.set(20)
|
|
||||||
resfilename = 'python.rsrc' # XXXX later: '%s.rsrc' % shortname
|
|
||||||
try:
|
|
||||||
output = Res.FSOpenResourceFile(
|
|
||||||
os.path.join(destname, 'Contents', 'Resources', resfilename),
|
|
||||||
u'', WRITE)
|
|
||||||
except MacOS.Error:
|
|
||||||
fsr, dummy = Res.FSCreateResourceFile(
|
|
||||||
os.path.join(destname, 'Contents', 'Resources'),
|
|
||||||
unicode(resfilename), '')
|
|
||||||
output = Res.FSOpenResourceFile(fsr, u'', WRITE)
|
|
||||||
|
|
||||||
# Copy the resources from the target specific resource template, if any
|
# Copy the resources from the target specific resource template, if any
|
||||||
typesfound, ownertype = [], None
|
typesfound, ownertype = [], None
|
||||||
try:
|
try:
|
||||||
input = macresource.open_pathname(rsrcname)
|
input = macresource.open_pathname(rsrcname)
|
||||||
except (MacOS.Error, ValueError):
|
except (MacOS.Error, ValueError):
|
||||||
pass
|
|
||||||
if progress:
|
if progress:
|
||||||
progress.inc(50)
|
progress.inc(50)
|
||||||
else:
|
else:
|
||||||
|
if progress:
|
||||||
|
progress.label("Copy resources...")
|
||||||
|
progress.set(20)
|
||||||
|
resfilename = 'python.rsrc' # XXXX later: '%s.rsrc' % shortname
|
||||||
|
try:
|
||||||
|
output = Res.FSOpenResourceFile(
|
||||||
|
os.path.join(destname, 'Contents', 'Resources', resfilename),
|
||||||
|
u'', WRITE)
|
||||||
|
except MacOS.Error:
|
||||||
|
fsr, dummy = Res.FSCreateResourceFile(
|
||||||
|
os.path.join(destname, 'Contents', 'Resources'),
|
||||||
|
unicode(resfilename), '')
|
||||||
|
output = Res.FSOpenResourceFile(fsr, u'', WRITE)
|
||||||
|
|
||||||
typesfound, ownertype = copyres(input, output, [], 0, progress)
|
typesfound, ownertype = copyres(input, output, [], 0, progress)
|
||||||
Res.CloseResFile(input)
|
Res.CloseResFile(input)
|
||||||
|
Res.CloseResFile(output)
|
||||||
# Check which resource-types we should not copy from the template
|
|
||||||
skiptypes = []
|
|
||||||
## if 'vers' in typesfound: skiptypes.append('vers')
|
|
||||||
## if 'SIZE' in typesfound: skiptypes.append('SIZE')
|
|
||||||
## if 'BNDL' in typesfound: skiptypes = skiptypes + ['BNDL', 'FREF', 'icl4',
|
|
||||||
## 'icl8', 'ics4', 'ics8', 'ICN#', 'ics#']
|
|
||||||
## if not copy_codefragment:
|
|
||||||
## skiptypes.append('cfrg')
|
|
||||||
## skipowner = (ownertype <> None)
|
|
||||||
|
|
||||||
# Copy the resources from the template
|
|
||||||
|
|
||||||
input = Res.FSOpenResourceFile(
|
|
||||||
os.path.join(template, 'Contents', 'Resources', 'python.rsrc'), u'', READ)
|
|
||||||
if progress:
|
|
||||||
progress.label("Copy standard resources...")
|
|
||||||
progress.inc(0)
|
|
||||||
## dummy, tmplowner = copyres(input, output, skiptypes, 1, progress)
|
|
||||||
dummy, tmplowner = copyres(input, output, skiptypes, 1, None)
|
|
||||||
|
|
||||||
Res.CloseResFile(input)
|
|
||||||
## if ownertype == None:
|
|
||||||
## raise BuildError, "No owner resource found in either resource file or template"
|
|
||||||
# Make sure we're manipulating the output resource file now
|
|
||||||
|
|
||||||
Res.CloseResFile(output)
|
|
||||||
|
|
||||||
if code:
|
if code:
|
||||||
if raw:
|
if raw:
|
||||||
|
|
BIN
Mac/Lib/dialogs.rsrc
Normal file
BIN
Mac/Lib/dialogs.rsrc
Normal file
Binary file not shown.
BIN
Mac/Lib/errors.rsrc
Normal file
BIN
Mac/Lib/errors.rsrc
Normal file
Binary file not shown.
|
@ -95,6 +95,11 @@ def open_pathname(pathname, verbose=0):
|
||||||
raise
|
raise
|
||||||
return refno
|
return refno
|
||||||
|
|
||||||
|
def open_error_resource():
|
||||||
|
"""Open the resource file containing the error code to error message
|
||||||
|
mapping."""
|
||||||
|
need('Estr', 1, filename="errors.rsrc", modname=__name__)
|
||||||
|
|
||||||
def _decode(pathname, verbose=0):
|
def _decode(pathname, verbose=0):
|
||||||
# Decode an AppleSingle resource file, return the new pathname.
|
# Decode an AppleSingle resource file, return the new pathname.
|
||||||
newpathname = pathname + '.df.rsrc'
|
newpathname = pathname + '.df.rsrc'
|
||||||
|
|
|
@ -37,16 +37,11 @@ LDFLAGS=-F$(builddir) -framework System -framework Python -framework Carbon \
|
||||||
-framework Foundation
|
-framework Foundation
|
||||||
CC=cc
|
CC=cc
|
||||||
LD=cc
|
LD=cc
|
||||||
REZ=/Developer/Tools/Rez
|
|
||||||
DEREZ=/Developer/Tools/DeRez
|
|
||||||
CPMAC=/Developer/Tools/CpMac
|
CPMAC=/Developer/Tools/CpMac
|
||||||
|
|
||||||
PYTHON=$(builddir)/python.exe
|
PYTHON=$(builddir)/python.exe
|
||||||
APPTEMPLATE=$(srcdir)/Mac/OSXResources/app
|
APPTEMPLATE=$(srcdir)/Mac/OSXResources/app
|
||||||
APPSUBDIRS=MacOS Resources Resources/English.lproj
|
APPSUBDIRS=MacOS Resources Resources/English.lproj
|
||||||
RESOURCEDIR=$(srcdir)/Mac/Resources
|
|
||||||
RESOURCEFILE=python.rsrc
|
|
||||||
RFCONVERTER=$(srcdir)/Mac/Lib/applesingle.py
|
|
||||||
CACHERSRC=$(srcdir)/Mac/scripts/cachersrc.py
|
CACHERSRC=$(srcdir)/Mac/scripts/cachersrc.py
|
||||||
|
|
||||||
installapps: install_PythonLauncher install_Python install_BuildApplet install_IDE install_IDLE
|
installapps: install_PythonLauncher install_Python install_BuildApplet install_IDE install_IDLE
|
||||||
|
@ -94,29 +89,6 @@ install_Python: $(PYTHON)
|
||||||
done; \
|
done; \
|
||||||
done
|
done
|
||||||
$(INSTALL_PROGRAM) $(STRIPFLAG) $(PYTHON) $(APPINSTALLDIR)/Contents/MacOS/python
|
$(INSTALL_PROGRAM) $(STRIPFLAG) $(PYTHON) $(APPINSTALLDIR)/Contents/MacOS/python
|
||||||
# Create a temporary version of the resources here
|
|
||||||
# Note that the resource files can either be real 2-fork resource files
|
|
||||||
# or AppleSingle encoded files.
|
|
||||||
@if test -s $(RESOURCEDIR)/dialogs.rsrc; then \
|
|
||||||
echo $(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/dialogs.rsrc dialogs.rsrc ;\
|
|
||||||
$(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/dialogs.rsrc dialogs.rsrc ; \
|
|
||||||
echo $(DEREZ) -useDF -skip ckid dialogs.rsrc > dialogs.r ; \
|
|
||||||
$(DEREZ) -useDF -skip ckid dialogs.rsrc > dialogs.r ; \
|
|
||||||
else \
|
|
||||||
echo $(DEREZ) -skip ckid $(RESOURCEDIR)/dialogs.rsrc > dialogs.r ; \
|
|
||||||
$(DEREZ) -skip ckid $(RESOURCEDIR)/dialogs.rsrc > dialogs.r ; \
|
|
||||||
fi
|
|
||||||
@if test -s $(RESOURCEDIR)/errors.rsrc; then \
|
|
||||||
echo $(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/errors.rsrc errors.rsrc ;\
|
|
||||||
$(PYTHON) $(RFCONVERTER) -r $(RESOURCEDIR)/errors.rsrc errors.rsrc ; \
|
|
||||||
echo $(DEREZ) -useDF -skip ckid errors.rsrc > errors.r ; \
|
|
||||||
$(DEREZ) -useDF -skip ckid errors.rsrc > errors.r ; \
|
|
||||||
else \
|
|
||||||
echo $(DEREZ) -skip ckid $(RESOURCEDIR)/errors.rsrc > errors.r ; \
|
|
||||||
$(DEREZ) -skip ckid $(RESOURCEDIR)/errors.rsrc > errors.r ; \
|
|
||||||
fi
|
|
||||||
$(REZ) -useDF -o $(RESOURCEFILE) dialogs.r errors.r
|
|
||||||
$(INSTALL_DATA) $(RESOURCEFILE) $(APPINSTALLDIR)/Contents/Resources/$(RESOURCEFILE)
|
|
||||||
# Finally create the documentation symlink
|
# Finally create the documentation symlink
|
||||||
$(LN) -fsn ../../../../English.lproj/Documentation $(APPINSTALLDIR)/Contents/Resources/English.lproj/Documentation
|
$(LN) -fsn ../../../../English.lproj/Documentation $(APPINSTALLDIR)/Contents/Resources/English.lproj/Documentation
|
||||||
|
|
||||||
|
@ -205,11 +177,11 @@ installmacsubtree:
|
||||||
echo $(INSTALL_DATA) $$i $(MACLIBDEST); \
|
echo $(INSTALL_DATA) $$i $(MACLIBDEST); \
|
||||||
fi; \
|
fi; \
|
||||||
done
|
done
|
||||||
## @for i in $(MACLIBSRC)/*.rsrc; \
|
@for i in $(MACLIBSRC)/*.rsrc; \
|
||||||
## do \
|
do \
|
||||||
## echo $(CPMAC) $$i $$b ; \
|
echo $(CPMAC) $$i $(MACLIBDEST) ; \
|
||||||
## $(CPMAC) $$i $$b ; \
|
$(CPMAC) $$i $(MACLIBDEST) ; \
|
||||||
## done
|
done
|
||||||
@for d in $(MACLIBSUBDIRS); \
|
@for d in $(MACLIBSUBDIRS); \
|
||||||
do \
|
do \
|
||||||
a=$(MACLIBSRC)/$$d; \
|
a=$(MACLIBSRC)/$$d; \
|
||||||
|
|
|
@ -81,8 +81,42 @@ char *PyMac_StrError(int err)
|
||||||
static char buf[256];
|
static char buf[256];
|
||||||
Handle h;
|
Handle h;
|
||||||
char *str;
|
char *str;
|
||||||
|
static int errors_loaded;
|
||||||
|
|
||||||
h = GetResource('Estr', err);
|
h = GetResource('Estr', err);
|
||||||
|
if (!h && !errors_loaded) {
|
||||||
|
/*
|
||||||
|
** Attempt to open the resource file containing the
|
||||||
|
** Estr resources. We ignore all errors. We also try
|
||||||
|
** this only once.
|
||||||
|
*/
|
||||||
|
errors_loaded = 1;
|
||||||
|
PyObject *m, *rv;
|
||||||
|
|
||||||
|
m = PyImport_ImportModule("macresource");
|
||||||
|
if (!m) {
|
||||||
|
if (Py_VerboseFlag)
|
||||||
|
PyErr_Print();
|
||||||
|
PyErr_Clear();
|
||||||
|
} else {
|
||||||
|
rv = PyObject_CallMethod(m, "open_error_resource", "");
|
||||||
|
if (!rv) {
|
||||||
|
if (Py_VerboseFlag)
|
||||||
|
PyErr_Print();
|
||||||
|
PyErr_Clear();
|
||||||
|
} else {
|
||||||
|
Py_DECREF(rv);
|
||||||
|
/* And try again... */
|
||||||
|
h = GetResource('Estr', err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
** Whether the code above succeeded or not, we won't try
|
||||||
|
** again.
|
||||||
|
*/
|
||||||
|
errors_loaded = 1;
|
||||||
|
|
||||||
if ( h ) {
|
if ( h ) {
|
||||||
HLock(h);
|
HLock(h);
|
||||||
str = (char *)*h;
|
str = (char *)*h;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue