Critcl wrapper for Mac OS X Notification Manager services, c.f. [L1 ] 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; } } #---------------------------------------------------------------------------------------------------