]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Added methods as_Menu and as_Control to convert a resource
authorJack Jansen <jack.jansen@cwi.nl>
Sun, 18 Jun 1995 20:20:27 +0000 (20:20 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Sun, 18 Jun 1995 20:20:27 +0000 (20:20 +0000)
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
Mac/Modules/res/resedit.py
Mac/Modules/res/ressupport.py

index 3c5b23d5b37f6385465110a5d05beaf6cc76c3c2..d3ec0ea84c8b7612eb4ffecaffa92cda346224e9 100644 (file)
@@ -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)
index 5e54ef223afdf8c1d4fdfe7f07acb05d726cf2da..bffec5fee9d6fa7e6eb329a84e5695818e28d627 100644 (file)
@@ -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"))
index efc757108e21b962744794ab2fd522188ee7fe4a..e2bfa796b9f93031d5433625531d445da01b9ad6 100644 (file)
@@ -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')