293 lines
8.8 KiB
Objective-C
293 lines
8.8 KiB
Objective-C
/*
|
|
* Copyright 2004 Mark Rowe <bdash@users.sourceforge.net>
|
|
* Released under the BSD license.
|
|
* src/osx/growl/_growlImage.m
|
|
*
|
|
* Copyright (C) 2007 Yann Leboulanger <asterix AT lagaule.org>
|
|
*
|
|
* This file is part of Gajim.
|
|
*
|
|
* Gajim is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published
|
|
* by the Free Software Foundation; version 3 only.
|
|
*
|
|
* Gajim is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Gajim. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#include "Python.h"
|
|
#import <Cocoa/Cocoa.h>
|
|
|
|
typedef struct
|
|
{
|
|
PyObject_HEAD
|
|
NSImage *theImage;
|
|
} ImageObject;
|
|
|
|
|
|
static PyTypeObject ImageObject_Type;
|
|
|
|
#define ImageObject_Check(v) ((v)->ob_type == &ImageObject_Type)
|
|
|
|
static ImageObject *
|
|
newImageObject(NSImage *img)
|
|
{
|
|
ImageObject *self;
|
|
if (! img)
|
|
{
|
|
PyErr_SetString(PyExc_TypeError, "Invalid image.");
|
|
return NULL;
|
|
}
|
|
|
|
self = PyObject_New(ImageObject, &ImageObject_Type);
|
|
if (! self)
|
|
return NULL;
|
|
|
|
self->theImage = [img retain];
|
|
return self;
|
|
}
|
|
|
|
static void
|
|
ImageObject_dealloc(ImageObject *self)
|
|
{
|
|
PyObject_Del(self);
|
|
}
|
|
|
|
static PyObject *
|
|
ImageObject_getAttr(PyObject *self, PyObject *attr)
|
|
{
|
|
char *theAttr = PyString_AsString(attr);
|
|
NSAutoreleasePool *pool = nil;
|
|
|
|
if (strcmp(theAttr, "rawImageData") == 0)
|
|
{
|
|
pool = [[NSAutoreleasePool alloc] init];
|
|
NSData *imageData = [((ImageObject *) self)->theImage TIFFRepresentation];
|
|
PyObject *pyImageData = PyString_FromStringAndSize([imageData bytes], [imageData length]);
|
|
[pool release];
|
|
return pyImageData;
|
|
}
|
|
else
|
|
return PyObject_GenericGetAttr(self, attr);
|
|
}
|
|
|
|
|
|
static PyObject *
|
|
ImageObject_imageFromPath(PyTypeObject *cls, PyObject *args)
|
|
{
|
|
ImageObject *self;
|
|
char *fileName_ = NULL;
|
|
NSString *fileName = nil;
|
|
NSImage *theImage = nil;
|
|
NSAutoreleasePool *pool = nil;
|
|
|
|
if (! PyArg_ParseTuple(args, "et:imageFromPath",
|
|
Py_FileSystemDefaultEncoding, &fileName_))
|
|
return NULL;
|
|
|
|
pool = [[NSAutoreleasePool alloc] init];
|
|
|
|
fileName = [NSString stringWithUTF8String:fileName_];
|
|
theImage = [[[NSImage alloc] initWithContentsOfFile:fileName] autorelease];
|
|
self = newImageObject(theImage);
|
|
|
|
[pool release];
|
|
return (PyObject *) self;
|
|
}
|
|
|
|
static PyObject *
|
|
ImageObject_imageWithData(PyTypeObject *cls, PyObject *args)
|
|
{
|
|
ImageObject *self;
|
|
char *imageData = NULL;
|
|
int imageDataSize = 0;
|
|
NSImage *theImage = nil;
|
|
NSAutoreleasePool *pool = nil;
|
|
|
|
if (! PyArg_ParseTuple(args, "s#:imageWithData",
|
|
&imageData, &imageDataSize))
|
|
return NULL;
|
|
|
|
pool = [[NSAutoreleasePool alloc] init];
|
|
|
|
|
|
theImage = [[[NSImage alloc] initWithData:[NSData dataWithBytes:imageData
|
|
length:imageDataSize]] autorelease];
|
|
self = newImageObject(theImage);
|
|
|
|
[pool release];
|
|
return (PyObject *) self;
|
|
}
|
|
|
|
static PyObject *
|
|
ImageObject_imageWithIconForFile(PyTypeObject *cls, PyObject *args)
|
|
{
|
|
ImageObject *self;
|
|
char *fileName_ = NULL;
|
|
NSString *fileName = nil;
|
|
NSImage *theImage = nil;
|
|
NSAutoreleasePool *pool = nil;
|
|
|
|
if (! PyArg_ParseTuple(args, "et:imageWithIconForFile",
|
|
Py_FileSystemDefaultEncoding, &fileName_))
|
|
return NULL;
|
|
|
|
pool = [[NSAutoreleasePool alloc] init];
|
|
|
|
fileName = [NSString stringWithUTF8String:fileName_];
|
|
theImage = [[NSWorkspace sharedWorkspace] iconForFile:fileName];
|
|
self = newImageObject(theImage);
|
|
|
|
[pool release];
|
|
return (PyObject *) self;
|
|
}
|
|
|
|
static PyObject *
|
|
ImageObject_imageWithIconForFileType(PyTypeObject *cls, PyObject *args)
|
|
{
|
|
ImageObject *self;
|
|
char *fileType = NULL;
|
|
NSImage *theImage = nil;
|
|
NSAutoreleasePool *pool = nil;
|
|
|
|
if (! PyArg_ParseTuple(args, "s:imageWithIconForFileType",
|
|
&fileType))
|
|
return NULL;
|
|
|
|
pool = [[NSAutoreleasePool alloc] init];
|
|
|
|
theImage = [[NSWorkspace sharedWorkspace] iconForFileType:[NSString stringWithUTF8String:fileType]];
|
|
self = newImageObject(theImage);
|
|
|
|
[pool release];
|
|
return (PyObject *) self;
|
|
}
|
|
|
|
static PyObject *
|
|
ImageObject_imageWithIconForCurrentApplication(PyTypeObject *cls, PyObject *args)
|
|
{
|
|
ImageObject *self;
|
|
NSAutoreleasePool *pool = nil;
|
|
|
|
if (! PyArg_ParseTuple(args, ":imageWithIconForCurrentApplication"))
|
|
return NULL;
|
|
|
|
pool = [[NSAutoreleasePool alloc] init];
|
|
|
|
self = newImageObject([NSApp applicationIconImage]);
|
|
|
|
[pool release];
|
|
return (PyObject *) self;
|
|
}
|
|
|
|
static PyObject *
|
|
ImageObject_imageWithIconForApplication(PyTypeObject *cls, PyObject *args)
|
|
{
|
|
ImageObject *self;
|
|
char *appName_ = NULL;
|
|
NSString *appName = nil;
|
|
NSString *appPath = nil;
|
|
NSImage *theImage = nil;
|
|
NSAutoreleasePool *pool = nil;
|
|
|
|
if (! PyArg_ParseTuple(args, "et:imageWithIconForApplication",
|
|
Py_FileSystemDefaultEncoding, &appName_))
|
|
return NULL;
|
|
|
|
pool = [[NSAutoreleasePool alloc] init];
|
|
|
|
appName = [NSString stringWithUTF8String:appName_];
|
|
appPath = [[NSWorkspace sharedWorkspace] fullPathForApplication:appName];
|
|
if (! appPath)
|
|
{
|
|
PyErr_Format(PyExc_RuntimeError, "Application named '%s' not found", appName_);
|
|
self = NULL;
|
|
goto done;
|
|
}
|
|
theImage = [[NSWorkspace sharedWorkspace] iconForFile:appPath];
|
|
self = newImageObject(theImage);
|
|
|
|
done:
|
|
[pool release];
|
|
return (PyObject *) self;
|
|
}
|
|
|
|
|
|
static PyMethodDef ImageObject_methods[] = {
|
|
{"imageFromPath", (PyCFunction)ImageObject_imageFromPath, METH_VARARGS | METH_CLASS},
|
|
{"imageWithData", (PyCFunction)ImageObject_imageWithData, METH_VARARGS | METH_CLASS},
|
|
{"imageWithIconForFile", (PyCFunction)ImageObject_imageWithIconForFile, METH_VARARGS | METH_CLASS},
|
|
{"imageWithIconForFileType", (PyCFunction)ImageObject_imageWithIconForFileType, METH_VARARGS | METH_CLASS},
|
|
{"imageWithIconForCurrentApplication", (PyCFunction)ImageObject_imageWithIconForCurrentApplication, METH_VARARGS | METH_CLASS},
|
|
{"imageWithIconForApplication", (PyCFunction)ImageObject_imageWithIconForApplication, METH_VARARGS | METH_CLASS},
|
|
{NULL, NULL} /* sentinel */
|
|
};
|
|
|
|
static PyTypeObject ImageObject_Type = {
|
|
PyObject_HEAD_INIT(NULL)
|
|
0, /*ob_size*/
|
|
"_growlImage.Image", /*tp_name*/
|
|
sizeof(ImageObject), /*tp_basicsize*/
|
|
0, /*tp_itemsize*/
|
|
/* methods */
|
|
(destructor)ImageObject_dealloc, /*tp_dealloc*/
|
|
0, /*tp_print*/
|
|
0, /*tp_getattr*/
|
|
0, /*tp_setattr*/
|
|
0, /*tp_compare*/
|
|
0, /*tp_repr*/
|
|
0, /*tp_as_number*/
|
|
0, /*tp_as_sequence*/
|
|
0, /*tp_as_mapping*/
|
|
0, /*tp_hash*/
|
|
0, /*tp_call*/
|
|
0, /*tp_str*/
|
|
ImageObject_getAttr, /*tp_getattro*/
|
|
0, /*tp_setattro*/
|
|
0, /*tp_as_buffer*/
|
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_CLASS, /*tp_flags*/
|
|
0, /*tp_doc*/
|
|
0, /*tp_traverse*/
|
|
0, /*tp_clear*/
|
|
0, /*tp_richcompare*/
|
|
0, /*tp_weaklistoffset*/
|
|
0, /*tp_iter*/
|
|
0, /*tp_iternext*/
|
|
ImageObject_methods, /*tp_methods*/
|
|
0, /*tp_members*/
|
|
0, /*tp_getset*/
|
|
0, /*tp_base*/
|
|
0, /*tp_dict*/
|
|
0, /*tp_descr_get*/
|
|
0, /*tp_descr_set*/
|
|
0, /*tp_dictoffset*/
|
|
0, /*tp_init*/
|
|
PyType_GenericAlloc, /*tp_alloc*/
|
|
0, /*tp_new*/
|
|
0, /*tp_free*/
|
|
0, /*tp_is_gc*/
|
|
};
|
|
|
|
static PyMethodDef _growlImage_methods[] = {
|
|
{NULL, NULL}
|
|
};
|
|
|
|
PyMODINIT_FUNC
|
|
init_growlImage(void)
|
|
{
|
|
PyObject *m;
|
|
|
|
if (PyType_Ready(&ImageObject_Type) < 0)
|
|
return;
|
|
|
|
m = Py_InitModule("_growlImage", _growlImage_methods);
|
|
|
|
PyModule_AddObject(m, "Image", (PyObject *)&ImageObject_Type);
|
|
}
|