Version 0 of tclCarbonNotification

Updated 2005-01-31 19:59:06 by DAS

Critcl wrapper for Mac OS X Notification Manager services, c.f. [L1 ] 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: <[email protected]>
 #    mail: Mathematics Departement
 #           Macquarie University NSW 2109 Australia
 #     www: <http://www.maths.mq.edu.au/~steffen/>
 #
 # RCS: @(#) $Id: 13462,v 1.1 2005-02-01 07:01:27 jcw Exp $
 #
 # BSD License: c.f. <http://www.opensource.org/licenses/bsd-license>
 #
 # Copyright (c) 2005, 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 tclsh "$0" "$@"

 package require critcl
 if {![::critcl::compiling]} {error "No compiler found"}

 #---------------------------------------------------------------------------------------------------

 package provide tclCarbonNotification 1.0

 namespace eval tclCarbon {

 lappend ::critcl::v::compile -framework Carbon

 ::critcl::ccode {
         #include <Carbon/Carbon.h>
         static int notificationAdded = 0;
         static NMRec request;

         char *OSErrDesc(OSErr err) {
                 static char desc[255];
                 sprintf(desc, "OS Error: %d.\n", err);
                 return desc;
         }
 }

 #---------------------------------------------------------------------------------------------------
 #
 # tclCarbon::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;
 }

 #---------------------------------------------------------------------------------------------------
 #
 # tclCarbon::endNotification
 #
 #   this command removes a notification request installed with [tclCarbon::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;

 }

 }
 #---------------------------------------------------------------------------------------------------