[Critcl] wrapper for Mac OS X Notification Manager services, c.f. [http://developer.apple.com/documentation/Carbon/Reference/Notification_Manager/] for details. ''[[ [Daniel Steffen] 31/01/05 ]]'' ---- #!/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: # mail: Mathematics Departement # Macquarie University NSW 2109 Australia # www: # # RCS: @(#) $Id: 13462,v 1.4 2005-02-01 07:01:30 jcw Exp $ # # BSD License: c.f. # # Copyright (c) 2005, Daniel A. Steffen # 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 tclsh "$0" "$@" package require critcl if {![::critcl::compiling]} {error "No compiler found"} #--------------------------------------------------------------------------------------------------- package provide tclCarbonNotification 1.0 namespace eval carbon { lappend ::critcl::v::compile -framework Carbon ::critcl::ccode { #include static int notificationAdded = 0; static NMRec request; char *OSErrDesc(OSErr err) { static char desc[255]; sprintf(desc, "OS Error: %d.\n", 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; } } #--------------------------------------------------------------------------------------------------- ---- [Category Package]