Download this source

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

This source do this:
Copy the Workbench screen and open a new screen.
Create a PALETTE_KIND gadget and sliders to change RGB values.
Let the user draw with the mouse and the current color.
It's like a paintprogram... almost :-)


#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);
}