[Openmcl-devel] The smoking cursor

Ron Garret ron at awun.net
Sun Jan 27 12:42:29 PST 2008

This is again in reference to the matching-paren highlighting bug  
(ticket 64).

The following code causes matching parens to blink red-green instead  
of black-white.  They blink red when the cursor is visible and green  
when the cursor is not visible.  If you try it you will see the  

1.  When you type a close paren there is a VERY brief flash of green  
on the matching open paren.  (Uncomment the call to sleep to make this  
more apparent.  But this breaks double-clicking for some reason so you  
won't want to leave it uncommented.)

2.  Despite the fact that this code ONLY paints close parens with  
either a red or a green background, the screen nonetheless does not  
get filled with red and green squares.  Some other code somewhere is  
helpfully making the background of the matching parens white again.  I  
believe it is THAT code that is the source of the bug.  But I have no  
idea how to even begin trying to figure out where that code is.

BTW, note that the call to flushGraphics is missing in the original  
code, but it is necessary to make the brief green flash on keypresses  
manifest themselves.  I suspect this is a clue.



(in-package "GUI")

;;; Maybe cause 1 character in the textview to blink (by drawing an  
;;; character rectangle) in synch with the insertion point.

(objc:defmethod (#/drawInsertionPointInRect:color:turnedOn: :void)
     ((self hemlock-textstorage-text-view)
      (r :<NSR>ect)
      (flag :<BOOL>))
   (unless (#/editingInProgress (#/textStorage self))
     (unless (eql #$NO (text-view-blink-enabled self))
       (let* ((layout (#/layoutManager self))
              (container (#/textContainer self))
              (blink-color (text-view-blink-color self)))
         (ns:with-ns-range  (char-range (text-view-blink-location  
self) 1)
           (let* ((glyph-range (#/ 
                  (rect (#/boundingRectForGlyphRange:inTextContainer:
             (#/set blink-color)
             (#/set (if flag (#/redColor ns:ns-color) (#/greenColor  
             (#_NSRectFill rect)
             (unless flag
                layout glyph-range (#/textContainerOrigin self)))
             (#/flushGraphics (#/currentContext ns:ns-graphics-context))
            ; (sleep 0.1)
   (call-next-method r color flag))

More information about the Openmcl-devel mailing list