From 1e054024c12b478eab2c09aae10f1a6cc1d6fda3 Mon Sep 17 00:00:00 2001 From: Jack Jansen Date: Sun, 18 Jun 1995 20:20:27 +0000 Subject: Added methods as_Menu and as_Control to convert a resource to those object types You can now set the data attribute of a resource with the expected semantics (but you have to call ChangedResource yourself) --- Mac/Modules/res/Resmodule.c | 51 ++++++++++++++++++++++++++++++++++++++++++- Mac/Modules/res/resedit.py | 16 ++++++++++++++ Mac/Modules/res/ressupport.py | 31 ++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 1 deletion(-) diff --git a/Mac/Modules/res/Resmodule.c b/Mac/Modules/res/Resmodule.c index 3c5b23d..d3ec0ea 100644 --- a/Mac/Modules/res/Resmodule.c +++ b/Mac/Modules/res/Resmodule.c @@ -403,6 +403,26 @@ static PyObject *ResObj_GetNextFOND(_self, _args) return _res; } +static PyObject *ResObj_as_Control(_self, _args) + ResourceObject *_self; + PyObject *_args; +{ + PyObject *_res = NULL; + + return CtlObj_New((ControlHandle)_self->ob_itself); + +} + +static PyObject *ResObj_as_Menu(_self, _args) + ResourceObject *_self; + PyObject *_args; +{ + PyObject *_res = NULL; + + return MenuObj_New((MenuHandle)_self->ob_itself); + +} + static PyMethodDef ResObj_methods[] = { {"HomeResFile", (PyCFunction)ResObj_HomeResFile, 1, "() -> (short _rv)"}, @@ -438,6 +458,10 @@ static PyMethodDef ResObj_methods[] = { "(long newSize) -> None"}, {"GetNextFOND", (PyCFunction)ResObj_GetNextFOND, 1, "() -> (Handle _rv)"}, + {"as_Control", (PyCFunction)ResObj_as_Control, 1, + "Return this resource/handle as a Control"}, + {"as_Menu", (PyCFunction)ResObj_as_Menu, 1, + "Return this resource/handle as a Menu"}, {NULL, NULL, 0} }; @@ -468,7 +492,32 @@ static PyObject *ResObj_getattr(self, name) return Py_FindMethodInChain(&ResObj_chain, (PyObject *)self, name); } -#define ResObj_setattr NULL +static int +ResObj_setattr(self, name, value) + ResourceObject *self; + char *name; + PyObject *value; +{ + char *data; + long size; + + if (strcmp(name, "data") != 0 || value == NULL ) + return -1; + if ( !PyString_Check(value) ) + return -1; + size = PyString_Size(value); + data = PyString_AsString(value); + /* XXXX Do I need the GetState/SetState calls? */ + SetHandleSize(self->ob_itself, size); + if ( MemError()) + return -1; + HLock(self->ob_itself); + memcpy((char *)*self->ob_itself, data, size); + HUnlock(self->ob_itself); + /* XXXX Should I do the Changed call immedeately? */ + return 0; +} + PyTypeObject Resource_Type = { PyObject_HEAD_INIT(&PyType_Type) diff --git a/Mac/Modules/res/resedit.py b/Mac/Modules/res/resedit.py index 5e54ef2..bffec5f 100644 --- a/Mac/Modules/res/resedit.py +++ b/Mac/Modules/res/resedit.py @@ -23,3 +23,19 @@ The created resource object is actually just a handle. Apply AddResource() to write it to a resource file. """ functions.append(f) + +# Convert resources to other things. + +as_xxx_body = """ +return %sObj_New((%sHandle)_self->ob_itself); +""" + +def genresconverter(longname, shortname): + + f = ManualGenerator("as_%s"%longname, as_xxx_body%(shortname, longname)) + docstring = "Return this resource/handle as a %s"%longname + f.docstring = lambda docstring=docstring: docstring + return f + +resmethods.append(genresconverter("Control", "Ctl")) +resmethods.append(genresconverter("Menu", "Menu")) diff --git a/Mac/Modules/res/ressupport.py b/Mac/Modules/res/ressupport.py index efc7571..e2bfa79 100644 --- a/Mac/Modules/res/ressupport.py +++ b/Mac/Modules/res/ressupport.py @@ -56,6 +56,34 @@ if (strcmp(name, "__members__") == 0) return Py_BuildValue("[ss]", "data", "size"); """ +setattrCode = """ +static int +ResObj_setattr(self, name, value) + ResourceObject *self; + char *name; + PyObject *value; +{ + char *data; + long size; + + if (strcmp(name, "data") != 0 || value == NULL ) + return -1; + if ( !PyString_Check(value) ) + return -1; + size = PyString_Size(value); + data = PyString_AsString(value); + /* XXXX Do I need the GetState/SetState calls? */ + SetHandleSize(self->ob_itself, size); + if ( MemError()) + return -1; + HLock(self->ob_itself); + memcpy((char *)*self->ob_itself, data, size); + HUnlock(self->ob_itself); + /* XXXX Should I do the Changed call immedeately? */ + return 0; +} +""" + class ResDefiniton(GlobalObjectDefinition): def outputCheckNewArg(self): @@ -63,6 +91,9 @@ class ResDefiniton(GlobalObjectDefinition): def outputGetattrHook(self): Output(getattrHookCode) + + def outputSetattr(self): + Output(setattrCode) resobject = ResDefiniton('Resource', 'ResObj', 'Handle') -- cgit v0.12