+ { [ focused?>> ] [ blink>> ]
+ [ [ preedit? not ] [ preedit-selection-mode?>> not ] bi or ] } 1&& ;
+
+: (caret-location) ( editor -- loc dim )
+ [ caret-loc ] [ caret-dim ] bi ;
+
+: (caret-rect) ( dim -- newdim )
+ second [ 2 / ] keep 2array ;
+
+: draw-caret-line ( editor -- )
+ (caret-location) over v+ gl-line ;
+
+: draw-caret-rect ( editor -- )
+ (caret-location) (caret-rect) gl-rect ;
+
+: draw-caret-rect-filled ( editor -- )
+ (caret-location) (caret-rect) gl-fill-rect ;
+
+: draw-caret-shape ( editor -- )
+ dup caret-shape>> value>>
+ {
+ { +box+ [ draw-caret-rect ] }
+ { +filled+ [ draw-caret-rect-filled ] }
+ [ drop draw-caret-line ]
+ } case ;
+