Critcl wrapper for Mac OS X Notification Manager services, c.f. [
1] for details.
Part of
CarbonCritLib:
http://rutherglen.ics.mq.edu.au/~steffen/tcltk/carboncritlib/tclCarbonNotification.tcl[ DAS 06/10/07 ]#!/bin/sh
# #######################################################################
#
# tclCarbonNotification.tcl
#
# Critcl wrapper for Mac OS X Notification Manager services.
#
# Process this file with 'critcl -pkg' to build a loadable package (or
# simply source this file if [package require critcl] and a compiler
# are available at deployment).
#
#
# Author: Daniel A. Steffen
# E-mail: <[email protected]>
# mail: Mathematics Departement
# Macquarie University NSW 2109 Australia
# www: <http://www.maths.mq.edu.au/~steffen/>
#
# RCS: @(#) $Id$
#
# BSD License: c.f. <http://www.opensource.org/licenses/bsd-license>
#
# Copyright (c) 2005-2007, Daniel A. Steffen <[email protected]>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
#
# * Redistributions of source code must retain the above
# copyright notice, this list of conditions and the
# following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# * Neither the name of Macquarie University nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MACQUARIE
# UNIVERSITY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
# DAMAGE.
#
# #######################################################################
# \
exec critcl -pkg "$0" "$@"
package require critcl
if {![::critcl::compiling]} {error "No compiler found"}
#---------------------------------------------------------------------------------------------------
package provide tclCarbonNotification 1.0
namespace eval carbon {
if {[llength [info commands ::critcl::framework]]} {
::critcl::framework Carbon
} else {
lappend ::critcl::v::compile -framework Carbon
}
::critcl::ccode {
#include <Carbon/Carbon.h>
static int notificationAdded = 0;
static NMRec request;
static char *OSErrDesc(OSErr err) {
static char desc[255];
sprintf(desc, "OS Error: %d.", err);
return desc;
}
}
#---------------------------------------------------------------------------------------------------
#
# carbon::notification msg bounce
#
# this command installs a Carbon notification request with the given msg, setting the bounce flag
# will also cause the application icon in the dock to bounce. An empty msg will not post a
# notification dialog but only cause the application icon to bounce.
#
#---------------------------------------------------------------------------------------------------
::critcl::cproc notification {Tcl_Interp* ip char* msg int bounce} ok {
OSErr err;
Str255 message;
if(notificationAdded) {
err = NMRemove(&request);
if ( err != noErr) {
Tcl_AppendResult(ip, "Could not remove notification: ",
OSErrDesc(err), NULL);
return TCL_ERROR;
}
notificationAdded = 0;
}
if(strlen(msg)) {
CopyCStringToPascal(msg,message);
request.nmStr = (StringPtr)&message;
} else {
request.nmStr = NULL;
}
request.nmMark = bounce;
request.qType = nmType;
request.nmSound = NULL;
request.nmResp = NULL;
err = NMInstall(&request);
if ( err != noErr) {
Tcl_AppendResult(ip, "Could not install notification: ", OSErrDesc(err), NULL);
return TCL_ERROR;
}
notificationAdded = 1;
return TCL_OK;
}
#---------------------------------------------------------------------------------------------------
#
# carbon::endNotification
#
# this command removes a notification request installed with [carbon::notification].
#
#---------------------------------------------------------------------------------------------------
::critcl::cproc endNotification {Tcl_Interp* ip} ok {
OSErr err;
if(notificationAdded) {
err = NMRemove(&request);
if ( err != noErr) {
Tcl_AppendResult(ip, "Could not remove notification: ",
OSErrDesc(err), NULL);
return TCL_ERROR;
}
notificationAdded = 0;
}
return TCL_OK;
}
}
#---------------------------------------------------------------------------------------------------