[comp.windows.news] LiteWindow patches to allow pretty colors.

sjs@jcricket.ctt.bellcore.com (Stan Switzer) (10/21/88)

The following patches can be placed in your user.ps to fix a few
problems in LiteWindow.  This is pretty much a must if you want to
take full advantage of "setcolor" posted previously.

Problems addressed:
   1) Handles ClientFillColor properly
   2) Clips painting of frame fill so that it doesn't flash the client
      canvas first
   3) Cures anemia of the focus bar, giving several options.  The
	default is a bar rather than a line.  On monochroms displays
	this has the advantage of allowing frame and focus colors in
	other than just black and white.
   4) On monochrome systems, makes sure there is white under frame label.
   5) For good measure, I've thrown in my caps-lock disable feature
	since I surely can't be the only one with a clumsy left hand.
   6) And to make this all work for you, I've provided an "aesthetics"
	sub-menu that you can hook in to your rootmenu if you wish.

Again, as always, enjoy!

Stan Switzer sjs@ctt.bellcore.com

P.S.:  Ignore article's reply address as my poster mungs it; use
signature address instead.
-------------------------------------------------------------
%
% modify LiteWindow
%
LiteWindow begin
    % so that repaint does not flash client canvas:
    /PaintFrameBorder { % - => - (Paint frame border areas)
	ClientCanvas dup null eq { pop } {
	  gsave setcanvas ClientFillColor fillcanvas grestore } ifelse
	clippath pathbbox rectpath
	BorderLeft .5 sub BorderBottom .5 sub
	FrameWidth BorderLeft BorderRight add sub 1 add
	FrameHeight BorderBottom BorderTop add sub 1 add
	FramePath gsave FrameFillColor setshade eofill grestore
	FrameBorderColor setshade stroke FrameBorderColor strokecanvas
    } def

    % to cure anemia of the focus bar:
    /PaintFocus {
	gsave
	FrameCanvas setcanvas
	KeyFocus? {KeyFocusColor} {FrameFillColor} ifelse setcolor
	FocusStyle {
	  /Lines {
	    FocusLines aload pop { 
	        BorderTop FocusLines aload pop exch pop add
		    div mul FrameHeight exch sub ControlSize exch moveto
	        FrameFont setfont FrameLabel stringwidth pop
	    	    (    ) stringwidth pop add
	        dup FrameWidth exch sub 2 div ControlSize sub dup
	        0 rlineto exch 0 rmoveto 0 rlineto stroke
	    } for
	  }
	  /Bar {
	    BorderTop FocusWidth mul
	    dup BorderTop exch sub 2 div FrameHeight exch sub
		ControlSize exch moveto
	    FrameFont setfont FrameLabel stringwidth pop
                    (    ) stringwidth pop add
	    FrameWidth exch sub 2 div ControlSize sub % Focus-width x-size
	    dup 0 rlineto exch dup neg 0 exch rlineto exch dup neg 0 rlineto
	 	currentpoint closepath moveto
	    0 2 index rmoveto dup FrameWidth BorderRight sub ControlSize sub
		exch sub 0 rmoveto
	    dup 0 rlineto exch dup neg 0 exch rlineto exch dup neg 0 rlineto
	 	closepath 
	    fill
	  }
	} case
	grestore
    } def

    % so you can read the frame label:
    /PaintFrameLabel { % - => - (Paint frame text label)
	FrameWidth 2 div
	FrameHeight BorderTop sub
            BorderTop currentfont fontascent sub 2 div
            currentfont fontdescent
            max 1 add add moveto
	FrameLabel ( ) append ( ) exch append
	dup stringwidth exch 2 div neg exch rmoveto
	ColorDisplay? not {
	  dup gsave false charpath LabelFillColor setcolor fill grestore
	} if
	show
    } def

    % focus style control variables
    /FocusStyle /Bar def
    /FocusWidth .4 def
    /FocusLines [ 3 1 5 ] def	% 3 lines

    % set style for a window (send to LiteWindow to change for all!)
    /setfocusstyle { /FocusStyle exch def } def
    /setfocuslines { /FocusLines exch def } def
    /setfocuswidth { /FocusWidth exch def } def
    
    /FrameFillColor 1 1 1 rgbcolor store
    /KeyFocusColor .25 .25 .25 rgbcolor store
    /LabelFillColor ClientFillColor def
end

%
% Disable Caps-Lock Key
%

/CapsEnable { UI_private begin
    /compute_shift_states exch { { 	% enabled version (original)
	/letter_shift_state control_keys_down 0 gt 0 {
	    caps_keys_down 0 gt shift_keys_down 0 gt or
	    1 2 ifelse
	} ifelse store
	/other_shift_state control_keys_down 0 gt 0 {
	    shift_keys_down 0 gt 1 2 ifelse
	} ifelse store
    } }  { { 			% disabled version
	/other_shift_state control_keys_down 0 gt 0 {
	    shift_keys_down 0 gt 1 2 ifelse
	} ifelse store
	/letter_shift_state other_shift_state store
    } } ifelse store
    reset_shift_state
end } def

false CapsEnable	% change "false" to "true" to enable by default

% controls above customizations, include in your root menu if you wish
/AestheticsMenu [
    (Focus Style =>) [
      (Bar Focus)	  {/Bar /setfocusstyle LiteWindow send }
      (Light Line Focus)  { {[ 1 1 1 ]setfocuslines /Lines setfocusstyle}
                            LiteWindow send }
      (Bold Line Focus)	  { {[ 3 1 5 ]setfocuslines /Lines setfocusstyle}
                            LiteWindow send }
      (Bolder Line Focus) { {[ 2 1 6 ]setfocuslines /Lines setfocusstyle}
                            LiteWindow send }
    ] /new DefaultMenu send
    (Shift Keys =>) [
      (Caps Lock Enable)  { true CapsEnable }
      (Caps Lock Disable) { false CapsEnable }
    ] /new DefaultMenu send
] /new DefaultMenu send def

% see if user has saved favorite color scheme
ColorDisplay? (color.ps) (mono.ps) ifelse LoadFile pop
PaintRoot

% ---------- end ----------