anchor.diff:  		for offset from 0 by +gvalue-size+
   		collect (gvalue-peek (pointer+ param-values offset)))))
       (unwind-protect
  -	(let ((result (apply #'invoke-callback callback-id return-type args)))
  -	  (when return-type
  +	(multiple-value-bind (result aborted-p)
  +	    (apply restart-wrapper callback-id nil args)
  +	  (when (and return-type (not aborted-p))
   	    (gvalue-set return-value result)))
         ;; TODO: this should be made more general, by adding a type
  -      ;; method to return invalidate functions.
  +      ;; method to return invalidating functions.
         (loop 
          for arg in args
          when (typep arg 'struct)
          do (invalidate-instance arg)))))
   
  +(defun invoke-signal-handler (callback-id return-type &rest args)
  +  (declare (ignore return-type))
  +  (let* ((instance (first args))
  +	 (handler-id (signal-handler-find instance '(:data) 
  +		      0 0 nil nil callback-id)))
  +    (signal-handler-block instance handler-id)
  +    (unwind-protect
  +	(restart-case (apply #'invoke-callback callback-id nil args)
  +	  (abort () :report "Disconnect and exit signal handler"
  +	    (when (signal-handler-is-connected-p instance handler-id)
  +	      (signal-handler-disconnect instance handler-id))
  +	    (values nil t))))
  +      (when (signal-handler-is-connected-p instance handler-id)
  +	(signal-handler-unblock instance handler-id))))
   
   (defun invoke-callback (callback-id return-type &rest args)
  -  (restart-case
  -      (apply (find-user-data callback-id) args)
  +  (restart-case (apply (find-user-data callback-id) args)
       (continue nil :report "Return from callback function"
  -	      (when return-type
  -		(format *query-io* "Enter return value of type ~S: " return-type)
  -		(force-output *query-io*)
  -		(eval (read *query-io*))))
  +      (cond
  +       (return-type
  +	(format *query-io* "Enter return value of type ~S: " return-type)
  +	(force-output *query-io*)
  +	(eval (read *query-io*)))
  +       (t (values nil t))))
       (re-invoke nil :report "Re-invoke callback function"
  -	       (apply #'invoke-callback callback-id return-type args))))
  +      (apply #'invoke-callback callback-id return-type args))))
   
   
   ;;;; Timeouts and idle functions
  
positive.code: ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  
  ;; $Id: gcallback.lisp,v 1.35 2006-06-07 13:16:11 espen Exp $
  
  (in-package "GLIB")
  
  
negative.code: 		 (unwind-protect
  		     (let ((*signal-stop-emission* signal-stop-emission))
  		       (apply callback args))
  		   (when (signal-handler-is-connected-p gobject handler-id)
  		     (signal-handler-disconnect gobject handler-id))))))
  	  handler-id))))
  
  
  