/* Written by Dan Heller and Paula Ferguson. * Copyright 1994, O'Reilly & Associates, Inc. * Permission to use, copy, and modify this program without * restriction is hereby granted, as long as this copyright * notice appears in each copy of the program source code. * This program is freely distributable without licensing fees and * is provided without guarantee or warrantee expressed or implied. * This program is -not- in the public domain. */ /* color_slide.c -- Use scale widgets to display the different * colors of a colormap. */ #include <Xm/LabelG.h> #include <Xm/Scale.h> #include <Xm/RowColumn.h> #include <Xm/DrawingA.h> Widget colorwindow; /* the window the displays a solid color */ XColor color; /* the color in the colorwindow */ main(argc, argv) int argc; char *argv[]; { Widget toplevel, rowcol, scale; XtAppContext app; void new_value(); XtVarArgsList arglist; XtSetLanguageProc (NULL, NULL, NULL); toplevel = XtVaAppInitialize (&app, "Demos", NULL, 0, &argc, argv, NULL, NULL); if (DefaultDepthOfScreen (XtScreen (toplevel)) < 2) { puts ("You must be using a color screen."); exit (1); } color.flags = DoRed | DoGreen | DoBlue; /* initialize first color */ XAllocColor (XtDisplay (toplevel), DefaultColormapOfScreen (XtScreen (toplevel)), &color); rowcol = XtVaCreateManagedWidget ("rowcol", xmRowColumnWidgetClass, toplevel, NULL); colorwindow = XtVaCreateManagedWidget ("colorwindow", widgetClass, rowcol, XmNheight, 100, XmNbackground, color.pixel, NULL); /* use rowcol again to create another RowColumn under the 1st */ rowcol = XtVaCreateWidget ("rowcol", xmRowColumnWidgetClass, rowcol, XmNorientation, XmHORIZONTAL, NULL); arglist = XtVaCreateArgsList (NULL, XmNshowValue, True, XmNmaximum, 255, XmNscaleMultiple, 5, NULL); scale = XtVaCreateManagedWidget ("Red", xmScaleWidgetClass, rowcol, XtVaNestedList, arglist, XtVaTypedArg, XmNtitleString, XmRString, "Red", 4, XtVaTypedArg, XmNforeground, XmRString, "Red", 4, NULL); XtAddCallback (scale, XmNdragCallback, new_value, (XtPointer)DoRed); XtAddCallback (scale, XmNvalueChangedCallback, new_value, (XtPointer)DoRed); scale = XtVaCreateManagedWidget ("Green", xmScaleWidgetClass, rowcol, XtVaNestedList, arglist, XtVaTypedArg, XmNtitleString, XmRString, "Green", 6, XtVaTypedArg, XmNforeground, XmRString, "Green", 6, NULL); XtAddCallback (scale, XmNdragCallback, new_value, (XtPointer)DoGreen); XtAddCallback (scale, XmNvalueChangedCallback, new_value, (XtPointer)DoGreen); scale = XtVaCreateManagedWidget ("Blue", xmScaleWidgetClass, rowcol, XtVaNestedList, arglist, XtVaTypedArg, XmNtitleString, XmRString, "Blue", 5, XtVaTypedArg, XmNforeground, XmRString, "Blue", 5, NULL); XtAddCallback (scale, XmNdragCallback, new_value, (XtPointer)DoBlue); XtAddCallback (scale, XmNvalueChangedCallback, new_value, (XtPointer)DoBlue); XtFree (arglist); XtManageChild (rowcol); XtRealizeWidget (toplevel); XtAppMainLoop (app); } void new_value(scale_w, client_data, call_data) Widget scale_w; XtPointer client_data; XtPointer call_data; { int rgb = (int) client_data; XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct *) call_data; Colormap cmap = DefaultColormapOfScreen (XtScreen (scale_w)); switch (rgb) { case DoRed : color.red = (cbs->value << 8); break; case DoGreen : color.green = (cbs->value << 8); break; case DoBlue : color.blue = (cbs->value << 8); break; } /* reuse the same color again and again */ XFreeColors (XtDisplay (scale_w), cmap, &color.pixel, 1, 0); if (!XAllocColor (XtDisplay (scale_w), cmap, &color)) { puts ("Couldn't XAllocColor!"); exit(1); } XtVaSetValues (colorwindow, XmNbackground, color.pixel, NULL); }