gajim-plural/src/osx/nsapp.m

239 lines
4.8 KiB
Objective-C

#import "nsapp.h"
#include <notify.h>
#include <AppKit/NSSound.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <Python.h>
#define GAJIM_POOL_ALLOC \
NSAutoreleasePool *gajim_pool = [[NSAutoreleasePool alloc] init];
#define GAJIM_POOL_FREE [gajim_pool release];
static PyObject *netChangedCB = NULL;
static NSFileHandle* netNotifyFH = nil;
static int netNotifyToken = -1;
@implementation NSApplication (Gajim)
- (void) initGUI
{
[NSBundle loadNibNamed:@"Gajim" owner:NSApp];
}
+ (void) netNotifyCB: (NSNotification*) notif
{
NSLog(@"Network changed notification");
if (netChangedCB)
{
PyObject_CallObject(netChangedCB, NULL);
}
[[notif object] readInBackgroundAndNotify];
}
- (BOOL) initNetNotify
{
int fd = 0;
if (notify_register_file_descriptor(
"com.apple.system.config.network_change", &fd, 0,
&netNotifyToken) != NOTIFY_STATUS_OK)
{
return FALSE;
}
netNotifyFH = [[NSFileHandle alloc] initWithFileDescriptor: fd];
[[NSNotificationCenter defaultCenter] addObserver: [self class]
selector: @selector(netNotifyCB:)
name: NSFileHandleReadCompletionNotification
object: netNotifyFH];
[netNotifyFH readInBackgroundAndNotify];
return TRUE;
}
- (void) initGajim
{
GAJIM_POOL_ALLOC
[self initGUI];
[self initNetNotify];
[NSApp setDelegate:self];
[NSApp finishLaunching];
GAJIM_POOL_FREE
}
- (void) orderFrontStandardAboutPanel: (id)sender
{
PyRun_SimpleString("\n\
import gobject\n\
import dialogs\n\
def doAbout():\n\
dialogs.AboutDialog()\n\
return None\n\
gobject.idle_add(doAbout)\n\
");
}
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
/*
PyRun_SimpleString("\n\
import gajim\n\
import gobject\n\
def doQuit():\n\
gajim.interface.roster.on_quit_menuitem_activate(None)\n\
return None\n\
gobject.idle_add(doQuit)\n\
");
*/
return NSTerminateNow;
}
- (BOOL) application:(NSApplication *)theApplication
openFile:(NSString *)filename
{
NSLog(@"openFile");
NSLog(filename);
return YES;
}
- (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
{
NSLog(@"openFiles");
NSEnumerator* iter = [filenames objectEnumerator];
NSString* str;
while ((str = [iter nextObject]))
{
NSLog(str);
}
return;
}
- (BOOL)applicationOpenUntitledFile:(NSApplication *)theApplication
{
NSLog(@"openUntitledFile");
return YES;
}
- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender
{
NSLog(@"shouldOpenUntitledFile");
return YES;
}
@end
static PyObject * nsapp_init(PyObject *self, PyObject *args)
{
[NSApp initGajim];
Py_INCREF(Py_None);
return Py_None;
}
static PyObject * nsapp_setNetworkCB(PyObject *self, PyObject *args)
{
PyArg_UnpackTuple(args, "netcb", 1, 1, &netChangedCB);
Py_INCREF(Py_None);
return Py_None;
}
static PyObject * nsapp_requestUserAttention(PyObject *self, PyObject *args)
{
GAJIM_POOL_ALLOC
[NSApp requestUserAttention:NSInformationalRequest];
GAJIM_POOL_FREE
Py_INCREF(Py_None);
return Py_None;
}
static PyObject * nsapp_playFile(PyObject *self, PyObject *args)
{
GAJIM_POOL_ALLOC
const char* cstr = NULL;
if (!PyArg_ParseTuple(args, "s", &cstr))
{
return NULL;
}
NSSound* snd = [[NSSound alloc] initWithContentsOfFile:
[[NSString alloc] initWithUTF8String: cstr]
byReference: YES];
if (!snd)
{
Py_INCREF(Py_None);
return Py_None;
}
if (![snd play])
{
Py_INCREF(Py_None);
return Py_None;
}
GAJIM_POOL_FREE
return Py_BuildValue("b", 1);
}
static PyObject * nsapp_getBundlePath(PyObject *self, PyObject *args)
{
GAJIM_POOL_ALLOC
NSBundle* bundle = [NSBundle mainBundle];
if (!bundle)
{
Py_INCREF(Py_None);
return Py_None;
}
NSString* nspath = [bundle bundlePath];
if (!nspath)
{
Py_INCREF(Py_None);
return Py_None;
}
const char* path = [nspath UTF8String];
PyObject* pypath = Py_BuildValue("s", path);
GAJIM_POOL_FREE
return pypath;
}
static PyMethodDef nsappMethods[] =
{
{"init", nsapp_init, METH_VARARGS, "init nsapp"},
{"setNetworkCB", nsapp_setNetworkCB, METH_VARARGS,
"Callback to call when the network state changes"},
{"getBundlePath", nsapp_getBundlePath, METH_VARARGS,
"Get the path to the bundle we were run from"},
{"playFile", nsapp_playFile, METH_VARARGS,
"Play a sound file"},
{"requestUserAttention", nsapp_requestUserAttention, METH_VARARGS,
"Sends a request for the users attention to the window manager"},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initnsapp(void)
{
(void) Py_InitModule("nsapp", nsappMethods);
}