I take no responsibility for this source. It's freeware, do whatever you like with it.

#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <intuition/screens.h>
#include <intuition/gadgetclass.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <stdlib.h>
#include <stdio.h>
#define OK 0
#define ERROR 10
#define FAILURE 20
#define GetNumber( g ) ((( struct StringInfo * )g->SpecialInfo )->LongInt )
struct Screen *scr;
struct Window *mywindow;
struct Gadget *glist,*gad;
struct Gadget *txtgad, *redgad, *greengad, *bluegad;
struct Gadget *redstringgad, *greenstringgad, *bluestringgad;
struct DrawInfo *drawinfo;
APTR vi;
BYTE mysignal=-1;
UWORD currentcolor=1;
ULONG gtable[5],ltable[5]={1L << 16+1,0,0,0,0}; /* The colortable */
struct NewGadget ng = {5,30,200,200,"Change Palette",0,1,0,0,0};
void adjustcolor(UWORD, ULONG []);
void cleanup(void);
void cleanup()
{
if(mywindow)
CloseWindow(mywindow);
if(glist)
FreeGadgets(glist);
if(vi)
FreeVisualInfo(vi);
if(scr)
while(!CloseScreen(scr))
Wait(1L << mysignal);
if(mysignal != -1)
FreeSignal(mysignal);
}
struct Screen *clonescreen(void)
{
struct Screen *pubscreen, *newscreen=NULL;
ULONG modeid;
if(pubscreen = LockPubScreen(NULL))
{
if(drawinfo = GetScreenDrawInfo(pubscreen))
{
modeid = GetVPModeID(&(pubscreen->ViewPort));
if(modeid != INVALID_ID)
{
newscreen = OpenScreenTags(NULL,
SA_Width, pubscreen->Width,
SA_Height, pubscreen->Height,
SA_Depth, drawinfo->dri_Depth,
SA_AutoScroll, TRUE,
SA_Pens, (ULONG) (drawinfo->dri_Pens),
SA_DisplayID, modeid,
SA_SysFont,1, /* Load the same font as Workbench */
SA_Title, "Testprogram",
SA_PubName, "Testscreen", /* Make screen public,
note that this must be before SA_Pubtask */
SA_Type, PUBLICSCREEN,
SA_PubTask, FindTask(NULL),
SA_PubSig, mysignal,
TAG_DONE);
}
else
printf("Wrong ModeId\n");
FreeScreenDrawInfo(pubscreen, drawinfo);
}
else
printf("Couldn't get drawinfo.\n");
UnlockPubScreen(NULL,pubscreen);
}
else
printf("Couldn't lock the screen\n");
return(newscreen);
}
int main(void)
{
BOOL keepgoing=TRUE,flag=FALSE;
UBYTE buffer[11];
struct IntuiMessage *intmess;
if((mysignal = AllocSignal(-1)) == -1)
cleanup();
if(!(scr = clonescreen()))
cleanup();
gad = CreateContext(&glist);
if(vi = GetVisualInfo(scr,TAG_DONE))
{
ng.ng_VisualInfo = vi;
gad = CreateGadget(PALETTE_KIND,gad, &ng,
GTPA_Depth,drawinfo->dri_Depth,
GTPA_IndicatorHeight,50, /* To indicate the current selection */
TAG_DONE);
ng.ng_TopEdge = 30;
ng.ng_LeftEdge = 260;
ng.ng_Width = 110;
ng.ng_Height= 15;
ng.ng_GadgetText = NULL;
ng.ng_GadgetID = 2;
txtgad = gad = CreateGadget(TEXT_KIND,gad, &ng,
GTTX_Text, (ULONG)"Color 0", /* Why isn't this value showed at once ?? */
GTTX_Border, TRUE,TAG_DONE);
ng.ng_TopEdge = 60;
ng.ng_LeftEdge = 260;
ng.ng_GadgetID = 3;
ng.ng_GadgetText = "Red";
redgad = gad = CreateGadget(SLIDER_KIND,gad, &ng,
GTSL_Max, 255,
GA_RelVerify, TRUE,
PGA_Freedom, LORIENT_HORIZ, TAG_DONE);
ng.ng_TopEdge = 90;
ng.ng_GadgetID = 4;
ng.ng_GadgetText = "Green";
greengad = gad = CreateGadget(SLIDER_KIND,gad, &ng,
GTSL_Max, 255,
GA_RelVerify, TRUE,
PGA_Freedom, LORIENT_HORIZ, TAG_DONE);
ng.ng_TopEdge = 120;
ng.ng_GadgetID = 5;
ng.ng_GadgetText = "Blue";
bluegad = gad = CreateGadget(SLIDER_KIND,gad, &ng,
GTSL_Max, 255,
GA_RelVerify, TRUE,
PGA_Freedom, LORIENT_HORIZ, TAG_DONE);
ng.ng_LeftEdge = 375;
ng.ng_TopEdge = 60;
ng.ng_Width = 40;
ng.ng_GadgetID = 6;
ng.ng_GadgetText = NULL;
redstringgad = gad = CreateGadget(INTEGER_KIND,gad, &ng,
GTIN_MaxChars, 3,
STRINGA_ReplaceMode, TRUE, TAG_DONE);
ng.ng_TopEdge = 90;
ng.ng_GadgetID = 7;
greenstringgad = gad = CreateGadget(INTEGER_KIND,gad, &ng,
GTIN_MaxChars, 3,
STRINGA_ReplaceMode, TRUE, TAG_DONE);
ng.ng_TopEdge = 120;
ng.ng_GadgetID = 8;
if(bluestringgad = gad = CreateGadget(INTEGER_KIND,gad, &ng,
GTIN_MaxChars, 3,
STRINGA_ReplaceMode, TRUE, TAG_DONE))
{
if(!(mywindow = OpenWindowTags(NULL,
WA_Width, scr->Width,
WA_Height, scr->Height,
WA_PubScreen, scr,
WA_Gadgets, glist,
WA_IDCMP, IDCMP_CLOSEWINDOW | BUTTONIDCMP | SLIDERIDCMP | IDCMP_MOUSEBUTTONS,
WA_Flags, WFLG_CLOSEGADGET | WFLG_SIZEGADGET |
WFLG_DEPTHGADGET | WFLG_DRAGBAR,
WA_ScreenTitle, "Colors on a screen",
WA_ReportMouse, TRUE,
WA_MinWidth, 64,
WA_MinHeight, 64,
WA_MaxWidth, ~1,
WA_MaxHeight, ~1, TAG_DONE)))
cleanup();
PubScreenStatus(scr,0);
SetAPen(mywindow->RPort,currentcolor);
while(keepgoing)
{
WaitPort(mywindow->UserPort);
while(intmess = GT_GetIMsg(mywindow->UserPort))
{
switch(intmess->Class)
{
case IDCMP_MOUSEMOVE:
if(flag && intmess->MouseY > 230))
Draw(mywindow->RPort,intmess->MouseX,intmess->MouseY);
break;
case IDCMP_MOUSEBUTTONS:
if(intmess->Code == SELECTDOWN)
{
Move(mywindow->RPort,intmess->MouseX,intmess->MouseY);
flag = TRUE;
}
else flag = FALSE;
break;
case IDCMP_CLOSEWINDOW:
keepgoing = FALSE;
break;
case IDCMP_GADGETUP:
switch(((struct Gadget *)intmess->IAddress)->GadgetID)
{
case 1:
sprintf(buffer,"Color %d",intmess->Code);
GT_SetGadgetAttrs(txtgad,mywindow,0,GTTX_Text,buffer, TAG_DONE);
currentcolor = intmess->Code;
GetRGB32(scr->ViewPort.ColorMap,currentcolor, 1, gtable);
adjustcolor(currentcolor,gtable);
SetAPen(mywindow->RPort,currentcolor);
break;
case 3:
gtable[0] = intmess->Code << 24;
adjustcolor(currentcolor,gtable);
break;
case 4:
gtable[1] = intmess->Code << 24;
adjustcolor(currentcolor,gtable);
break;
case 5:
gtable[2] = intmess->Code << 24;
adjustcolor(currentcolor,gtable);
break;
case 6:
gtable[0] = GetNumber(redstringgad) << 24;
adjustcolor(currentcolor,gtable);
break;
case 7:
gtable[1] = GetNumber(greenstringgad) << 24;
adjustcolor(currentcolor,gtable);
break;
case 8:
gtable[2] = GetNumber(bluestringgad) << 24;
adjustcolor(currentcolor,gtable);
break;
}
break;
}
GT_ReplyIMsg(intmess);
}
}
}
cleanup();
}
}
/* Adjust all gadgets and the color.
I think we have to use BOOPSI if you want it in real time.
color 0 - 255
r,g,b 0 - 2^32 - 1
*/
void adjustcolor(UWORD color, ULONG colortable[])
{
ltable[0] = (1L << 16) + color;
ltable[1] = colortable[0];
ltable[2] = colortable[1];
ltable[3] = colortable[2];
LoadRGB32(&(scr->ViewPort),ltable);
GT_SetGadgetAttrs(redgad,mywindow, 0,GTSL_Level, colortable[0] >> 24,TAG_DONE);
GT_SetGadgetAttrs(greengad,mywindow,0,GTSL_Level, colortable[1] >> 24,TAG_DONE);
GT_SetGadgetAttrs(bluegad,mywindow, 0,GTSL_Level, colortable[2] >> 24,TAG_DONE);
GT_SetGadgetAttrs(redstringgad,mywindow, 0,GTIN_Number, colortable[0] >> 24,TAG_DONE);
GT_SetGadgetAttrs(greenstringgad,mywindow,0,GTIN_Number, colortable[1] >> 24,TAG_DONE);
GT_SetGadgetAttrs(bluestringgad,mywindow, 0,GTIN_Number, colortable[2] >> 24,TAG_DONE);
}