[comp.windows.news] setcolor: change colors of various things

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

This program allows you to set your screen colors to other than the
boring defaults.  It is also a pretty good way to browse for nice
colors to use for a color application.

Depending on whether your system supports color, you will either get
three RGB sliders of one "gray" slider.  The RGB sliders can be
changed to HSB from the menu the color remains the same, this allows
you to diddle a color in either model until you get it "just right."

Unfortunately, due to the fact that NeWS doesn't really handle
ClientFillColor correctly, changing the fill color or frame color will
not really work right.  I'll post some patches in a subsequent posting
to fix this all up.

This is one of my earlier NeWS programs, so it's kinda gross
internally.  Sure makes a pretty screen, 'tho.

Note to Don: Please replace the version on tumtum, as this one has
a few new features and a few bug fixes.

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.
-------------------------------------------------------------
#! /usr/NeWS/bin/psh
%
% setcolor: control colors of various things on the screen
%
% Copyright (C) 1988 by Stan Switzer. All rights reserved.
% This program is provided for unrestricted use, provided that this 
% copyright message is preserved. There is no warranty, and no author 
% or distributer accepts responsibility for any damage caused by this 
% program.
%

systemdict /Item known not { (NeWS/liteitem.ps) run } if

/PointFromUser { % => x y
    gsave
    fboverlay setcanvas %% Use ParentCanvas!
    getclick
    grestore
} def

/Xform { % ulx uly w h -> llx lly w h
    3 -1 roll 1 index sub 3 1 roll
} def

/GrayMax 100 def

gsave DefaultRootGrayOrColor setshade
currentrgbcolor
  /Val3 exch GrayMax mul def
  /Val2 exch GrayMax mul def
  /Val1 exch GrayMax mul def
/Lab1 (R:) def /Lab2 (G:) def /Lab3 (B:) def
ColorDisplay? not {
   /Lab3 (Gray:) def
   } if
grestore
/SetCol { [ Val1 Val2 Val3 ] { GrayMax div } forall ColorOp
     items /showcolor get /SetColor exch send } def
/SetOp { load dup /ColorOp load ne { ChgModel } if
    /ColorOp exch store
    items begin { /ItemLabel Lab1 store } Slider1 send
                { /ItemLabel Lab2 store } Slider2 send
                { /ItemLabel Lab3 store } Slider3 send
    end SetCol } def
/ChgModel {
  gsave [ Val1 Val2 Val3 ] { GrayMax div } forall
  3 index /rgbcolor load eq
    { sethsbcolor currentrgbcolor } { setrgbcolor currenthsbcolor } ifelse
  [ /Val3 /Val2 /Val1 ] { exch GrayMax mul cvi store } forall
  grestore
  items begin  % NB: only used on color display
    Val1 /setvalue Slider1 send
    Val2 /setvalue Slider2 send
    Val3 /setvalue Slider3 send
  end
} def
/ColorOp ColorDisplay? { /rgbcolor load }
		       { {exch pop exch pop dup dup rgbcolor } } ifelse def
/ReDisp { /paint win send } def
/DoSetColor { ItemValue store SetCol } def
/SetRoot { /DefaultRootGrayOrColor exch store
    ColorDisplay? not { /DefaultRootGrayOrColor Val3 GrayMax div store } if
    { framebuffer setcanvas PaintRoot } fork pop } def
/FrameFixer { gsave
    FrameCanvas setcanvas
    0 0 FrameWidth FrameHeight rectpath
    BorderLeft BorderBottom translate                 
    0 0                                                
    FrameWidth BorderLeft BorderRight add sub
    FrameHeight BorderBottom BorderTop add sub              
    rectpath 
    BorderLeft neg BorderBottom neg translate                 
    eoclipcanvas
    PaintFrame
    newpath clipcanvas
grestore} def
/AllPaint { {/paint self send} AllWin } def
/AllIcon { { IconCanvas null ne { PaintIcon } if } AllWin } def
/AllFrame { //FrameFixer AllWin } def
/AllNterm { { /setfgcolor where { pop % Hack Warning
  /NtermTextColor UserProfile 1 index known { UserProfile exch get
    dup /setfgcolor Text send /setfgcolor Win send } { pop } ifelse
  /NtermFillColor UserProfile 1 index known { UserProfile exch get
    dup /setbgcolor Text send /setbgcolor Win send } { pop } ifelse
  /NtermCaretColor UserProfile 1 index known { UserProfile exch get
    /setcaretcolor Text send } { pop } ifelse 
  /paint self send
 } if } AllWin } def
/WinSet { LiteWindow begin exch store end } def
/SetFrame { /FrameFillColor WinSet AllFrame } def
/SetIconText { /IconTextColor WinSet AllIcon } def
/SetIconBorder { /IconBorderColor WinSet AllIcon } def
/SetIconFill { /IconFillColor WinSet AllIcon } def
/SetFill { dup /backgroundcolor exch store /ClientFillColor WinSet AllPaint } def
/SetText { /textcolor exch store AllPaint } def
/SetNText { tocolor UserProfile begin /NtermTextColor exch def end AllNterm } def
/SetNFill { tocolor UserProfile begin /NtermFillColor exch def end AllNterm } def
/SetNCaret { tocolor UserProfile begin /NtermCaretColor exch def end AllNterm } def
/SetFocus { /KeyFocusColor WinSet /PaintFocus win send } def
/tocolor { dup type /colortype ne { dup dup rgbcolor } if } def
/SetProc /SetRoot load def
/SetTarget { load /SetProc exch store currentkey
    win begin /FrameLabel exch def end 
    //FrameFixer win send
} def
/DoSetIt { items /showcolor get /ItemValue get SetProc } def

/ColorItem LabeledItem dictbegin
    /ItemHighLighted?	false	def
    /ItemTextColor	0 0 0 rgbcolor	def
    /ItemBorderColor	null	def
    dictend
classbegin
    /new { % initcolor label notifyproc parentcanvas (width height) =>  instance
	% fake a labeled item.
        dup type /canvastype eq
            {() /Center 4 2 roll} {() /Center 6 2 roll} ifelse
        /new super send
        begin
	    /ItemRadius		.5 def
	    /ItemFrame		4 def
	    /ItemBorder		null def %
	    /ItemGap		6 def
	    /ItemValue		exch def
            currentdict
        end
    } def
    /reshape { % x y w h
        /ItemHeight exch def /ItemWidth exch def

        LabelSize /LabelHeight exch def /LabelWidth exch def
        ItemBorder null eq {/ItemBorder ItemFrame def} if

        /ItemWidth ItemWidth
            ItemBorder ItemGap add 2 mul LabelWidth add max def
        /ItemHeight ItemHeight
            ItemBorder ItemGap add 2 mul LabelHeight add max def

        /LabelX ItemWidth LabelWidth sub 2 div LabelX add def
        /LabelY ItemHeight LabelHeight sub 2 div LabelY add def
        ItemLabel type /stringtype eq { % adjust for descenders
            /LabelY LabelY ItemFont fontdescent 2 div sub ItemBorder max def
        } if

        ItemRadius 0 gt ItemRadius .5 le and {
            /ItemRadius ItemWidth ItemHeight min ItemRadius mul def
        } if

	ItemWidth ItemHeight /reshape super send
    } def

    /SetColor { /ItemValue exch store /paint self send } def
    /PaintItem {
	ItemHighLighted?
	    { ItemBorderColor setshade ItemRadius clippath pathbbox points2rect
	      rrectpath fill
	      ItemFrame }
	    { 0 }
	ifelse
	ItemRadius clippath pathbbox points2rect insetrrect
	rrectpath ItemValue setshade fill
	/ItemTextColor
	     currenthsbcolor exch pop exch pop .495 le % want black on gray.
		1 0 ifelse dup dup rgbcolor
	store
	/ItemBorderColor ItemTextColor store
	ShowLabel
    } def
    /HighLight { % bool => -
	ItemHighLighted? exch
        /ItemHighLighted? exch store
        ItemHighLighted? ne {/paint self send} if
    } def
    /ClientDown {true HighLight} def
    /ClientUp {
        ItemHighLighted? {NotifyUser} if
        false HighLight
        StopItem
    } def
    /ClientEnter {true HighLight} def
    /ClientExit {false HighLight} def
classend def
 
/TrackerItem SliderItem []
classbegin
    /ClientDrag { /ClientDrag super send NotifyUser } def
classend def

/createitems {
/items 50 dict dup begin

    /showcolor [ Val1 Val2 Val3 ] { GrayMax div } forall rgbcolor
		(Set it) /DoSetIt can 30 33
    	/new ColorItem send begin
	    /ItemRadius	.3	def
	    /ItemFrame	3	def
	currentdict end 5 ColorDisplay? { 40 } { 5 } ifelse /move
	3 index send def
    
  ColorDisplay? {
    /Slider1 Lab1 [0 GrayMax Val1 round ]
	     /Right { /Val1 DoSetColor } can 220 30
    	/new TrackerItem send
	62 75 /move 3 index send def
    
    /Slider2 Lab2 [0 GrayMax Val2 round ]
	     /Right { /Val2 DoSetColor } can 220 30
    	/new TrackerItem send
	62 40 /move 3 index send def
  } if
    
    /Slider3 Lab3 [0 GrayMax Val3 round ]
	     /Right { /Val3 DoSetColor } can 220 30
    	/new TrackerItem send
	62 5 /move 3 index send def

end def
} def

/main {

    /win framebuffer /new DefaultWindow send def	% Create a window
    {	/PaintClient { ClientFillColor fillcanvas items paintitems } def
	/FrameLabel (Root Color) def
	/ClientMenu [
	    (Root Color) { /SetRoot SetTarget }
	    (Frame Color) { /SetFrame SetTarget }
	    (Focus Color) { /SetFocus SetTarget }
	    (Fill Color) { /SetFill SetTarget }
	    (Text Color) { /SetText SetTarget }
	    (Nterm Fill Color) { /SetNFill SetTarget }
	    (Nterm Text Color) { /SetNText SetTarget }
	    (Nterm Caret Color) { /SetNCaret SetTarget }
	    (Icon Fill Color) { /SetIconFill SetTarget }
	    (Icon Text Color) { /SetIconText SetTarget }
	    (Icon Border Color) { /SetIconBorder SetTarget }
	  ColorDisplay? {
	    (RGB Model) { /Lab1(R:)store/Lab2(G:)store/Lab3(B:)store
			  /rgbcolor SetOp ReDisp }
	    (HSB Model) { /Lab1(H:)store/Lab2(S:)store/Lab3(B:)store
			  /hsbcolor SetOp ReDisp }
	  } if
	    (Zap) { /destroy win send }
	] /new DefaultMenu send def
    } win send

   % /reshapefromuser win send	% Reshape from user.
    PointFromUser 320 ColorDisplay?{145}{75}ifelse Xform /reshape win send
    /map win send		% Map the window & install window event manager.
    				% (Damage causes PaintClient to be called)
    
    /can win /ClientCanvas get def			% Get the window canvas
% Create all the items.
    createitems
    SetCol
    
    /itemmgr items forkitems def
} def

main

%  --- anything following this line is NOT part of the program!