Peter Howkins wrote:
To let you know I tried your patch out, I think it's a good solution, and
definetly an improvement over what is there currenty.
Feel free to make a patch for it, and we'll see about getting it added.
Peter
I attached the patch.
Regards,
Alex
>From a12e1c79e758d11e142143e5e14ef0668359aece Mon Sep 17 00:00:00 2001
From: alx <a...@fastestcode.org>
Date: Sat, 15 Mar 2014 23:31:01 +0100
Subject: [PATCH] dtstyle: enable palette editor on true/direct color screens
Content-Length: 17334
Status: RO
---
cde/programs/dtstyle/ColorEdit.c | 58 +++++++++-
cde/programs/dtstyle/ColorMain.c | 230 +++++++++++++++++++++++----------------
cde/programs/dtstyle/Main.c | 3 +
cde/programs/dtstyle/Main.h | 1 +
4 files changed, 193 insertions(+), 99 deletions(-)
diff --git a/cde/programs/dtstyle/ColorEdit.c b/cde/programs/dtstyle/ColorEdit.c
index eeb32b3..17753f0 100644
--- a/cde/programs/dtstyle/ColorEdit.c
+++ b/cde/programs/dtstyle/ColorEdit.c
@@ -187,6 +187,16 @@ ColorEditor(
{
edit.color_set = color_set;
CopyPixelSet(&edit.oldButtonColor,edit.color_set);
+
+ /* update "old" button if necessary */
+ if(style.visualClass==TrueColor ||
style.visualClass==DirectColor){
+ XtVaSetValues(edit.oldButton,
+ XmNbackground,edit.color_set->bg.pixel,
+ XmNarmColor,edit.color_set->bg.pixel,
+ XmNforeground,edit.color_set->fg.pixel,
+ XmNtopShadowColor,edit.color_set->ts.pixel,
+
XmNbottomShadowColor,edit.color_set->bs.pixel,NULL);
+ }
InitializeNewButton();
SetScales(&edit.color_set->bg);
XtManageChild(edit.DialogShell);
@@ -287,8 +297,17 @@ CreateColorEditor(
XtSetArg(args[n], XmNverticalSpacing, style.verticalSpacing); n++;
sampleForm = XmCreateForm(sampleTB, "sampleForm", args, n);
- /* Create Old and New Buttons */
- InitializeOldButton();
+ /* Create Old and New Buttons */
+ if(style.visualClass==TrueColor ||
style.visualClass==DirectColor){
+ edit.oldButtonColor.bg.pixel = edit.color_set->bg.pixel;
+ edit.oldButtonColor.fg.pixel = edit.color_set->fg.pixel;
+ edit.oldButtonColor.sc.pixel = edit.color_set->sc.pixel;
+ edit.oldButtonColor.bs.pixel = edit.color_set->bs.pixel;
+ edit.oldButtonColor.ts.pixel = edit.color_set->ts.pixel;
+ CopyPixelSet(&edit.oldButtonColor,edit.color_set);
+ }else{
+ InitializeOldButton();
+ }
if(!OldNewSame) {
n=0;
@@ -973,7 +992,36 @@ GenerateColors( void )
edit.color_set->bs.blue = 0;
}
- XStoreColors(style.display, style.colormap, colors, j );
+ if(style.visualClass==PseudoColor || style.visualClass==StaticColor)
+ {
+ XStoreColors(style.display, style.colormap, colors, j );
+ }
+ else if(style.visualClass==TrueColor || style.visualClass==DirectColor)
+ {
+ static unsigned long pixels[4];
+ static int count=0;
+
+ if(count){
+
XFreeColors(style.display,style.colormap,pixels,count,0);
+ count=0;
+ }
+
+
if(XAllocColor(style.display,style.colormap,&edit.color_set->fg))
+ pixels[count++]=edit.color_set->fg.pixel;
+
if(XAllocColor(style.display,style.colormap,&edit.color_set->bg))
+ pixels[count++]=edit.color_set->bg.pixel;
+
if(XAllocColor(style.display,style.colormap,&edit.color_set->ts))
+ pixels[count++]=edit.color_set->ts.pixel;
+
if(XAllocColor(style.display,style.colormap,&edit.color_set->bs))
+ pixels[count++]=edit.color_set->bs.pixel;
+
+ XtVaSetValues(edit.newButton,
+ XmNbackground,edit.color_set->bg.pixel,
+ XmNarmColor,edit.color_set->bg.pixel,
+ XmNforeground,edit.color_set->fg.pixel,
+ XmNtopShadowColor,edit.color_set->ts.pixel,
+ XmNbottomShadowColor,edit.color_set->bs.pixel,NULL);
+ }
}
/************************************************************************
@@ -1187,8 +1235,8 @@ CopyPixelSet(
XtSetValues(edit.oldButton, args, n);
}
-
- XStoreColors(style.display, style.colormap, colors, j );
+ if(style.visualClass == PseudoColor || style.visualClass == GrayScale)
+ XStoreColors(style.display, style.colormap, colors, j );
}
diff --git a/cde/programs/dtstyle/ColorMain.c b/cde/programs/dtstyle/ColorMain.c
index 80d9513..5b1fa96 100644
--- a/cde/programs/dtstyle/ColorMain.c
+++ b/cde/programs/dtstyle/ColorMain.c
@@ -218,6 +218,12 @@ static void _DtmapCB_colorUse(
Widget w,
XtPointer client_data,
XtPointer call_data) ;
+static void colorEditorCB(
+ Widget w,
+ XtPointer client_data,
+ XtPointer call_data) ;
+
+static void allocNewColors(void);
static Boolean ValidName( char *name) ;
void loadDatabase();
@@ -551,8 +557,9 @@ CreatePaletteButtons(
XtSetArg (args[n], XmNrecomputeSize, False); n++;
XtSetArg (args[n], XmNwidth, COLOR_BUTTON_WIDTH); n++;
XtSetArg (args[n], XmNheight, COLOR_BUTTON_HEIGHT); n++;
- /* allow traversal only if dynamicColor is on */
- if (!style.dynamicColor)
+ /* allow traversal only if editing is possible */
+ if (style.dynamicColor || style.visualClass==TrueColor
+ || style.visualClass==DirectColor)
{
XtSetArg (args[n], XmNtraversalOn, False); n++;
}
@@ -589,8 +596,9 @@ CreatePaletteButtons(
string = CMPSTR(" ");
XtSetArg (args[n], XmNlabelString, string); n++;
colorButton[i] = XmCreatePushButton(paletteRc, "colorButton", args, n);
- /* allow access to modify functionality only if dynamicColor is on */
- if (style.dynamicColor)
+ /* allow access to modify functionality if available */
+ if (style.dynamicColor || style.visualClass==TrueColor
+ || style.visualClass==DirectColor)
XtAddCallback(colorButton[i], XmNactivateCallback, selectColorCB,
(XtPointer)i);
XmStringFree(string);
@@ -600,14 +608,18 @@ CreatePaletteButtons(
if(!save.restoreFlag)
selected_button = 0;
- /* draw selection border only if dynamicColor is on */
- if (style.dynamicColor)
+ /* draw selection border if editing is possible */
+ if (style.dynamicColor || style.visualClass==TrueColor
+ || style.visualClass==DirectColor)
{
n=0;
XtSetArg (args[n], XmNborderColor, BlackPixelOfScreen(style.screen));
n++;
XtSetValues(colorButton[selected_button],args,n);
}
-
+
+ if(style.visualClass==TrueColor || style.visualClass==DirectColor)
+ allocNewColors();
+
style.count++;
}
@@ -742,6 +754,77 @@ InitializePaletteList(
style.count++;
return(True);
}
+
+/*
+ * Allocate new pixel values and update color palette buttons.
+ * This is needed for screens without dynamicColor.
+ */
+static void allocNewColors(void)
+{
+ int i, n;
+ Arg args[10];
+ static unsigned long pixels[XmCO_MAX_NUM_COLORS*5];
+ static int count = 0;
+
+ if(count)
+ {
+ /* free the cells from last selection */
+ XFreeColors(style.display, style.colormap, pixels, count, 0);
+ count=0;
+ }
+
+ for (i=0; i<pCurrentPalette->num_of_colors; i++)
+ {
+ n=0;
+ if (XAllocColor(style.display, style.colormap,
+ &(pCurrentPalette->color[i].fg)) == 0) break;
+ pixels[count++] = pCurrentPalette->color[i].fg.pixel;
+
+ if (XAllocColor(style.display, style.colormap,
+ &(pCurrentPalette->color[i].bg)) == 0) break;
+ pixels[count++] = pCurrentPalette->color[i].bg.pixel;
+ XtSetArg (args[n], XmNbackground,
+ pCurrentPalette->color[i].bg.pixel); n++;
+
+ if (XAllocColor(style.display, style.colormap,
+ &(pCurrentPalette->color[i].sc)) == 0) break;
+ pixels[count++] = pCurrentPalette->color[i].sc.pixel;
+ XtSetArg (args[n], XmNarmColor,
+ pCurrentPalette->color[i].sc.pixel); n++;
+
+ if (UsePixmaps == FALSE)
+ {
+ if (XAllocColor(style.display, style.colormap,
+ &(pCurrentPalette->color[i].ts)) == 0) break;
+ pixels[count++] = pCurrentPalette->color[i].ts.pixel;
+ XtSetArg (args[n], XmNtopShadowColor,
+ pCurrentPalette->color[i].ts.pixel); n++;
+
+ if (XAllocColor(style.display, style.colormap,
+ &(pCurrentPalette->color[i].bs)) == 0) break;
+ pixels[count++] = pCurrentPalette->color[i].bs.pixel;
+ XtSetArg (args[n], XmNbottomShadowColor,
+ pCurrentPalette->color[i].bs.pixel); n++;
+ }
+ else /* create pixmaps for top/bottom shadow */
+ {
+ XmDestroyPixmap(style.screen, edit.pixmap25);
+ XmDestroyPixmap(style.screen, edit.pixmap75);
+
+ edit.pixmap25 = XmGetPixmap (style.screen,
+
"50_foreground",pCurrentPalette->color[i].bg.pixel,
+ WhitePixelOfScreen(style.screen));
+
+ edit.pixmap75 = XmGetPixmap (style.screen,
+
"50_foreground",pCurrentPalette->color[i].bg.pixel,
+ BlackPixelOfScreen(style.screen));
+
+ XtSetArg (args[n], XmNtopShadowPixmap, edit.pixmap25);
n++;
+ XtSetArg (args[n], XmNbottomShadowPixmap,
edit.pixmap75); n++;
+ }
+ XtSetValues(colorButton[i], args, n);
+ }
+}
/*
** This is the selection callback for the Scrolled list.
@@ -754,16 +837,13 @@ selectPaletteCB(
XtPointer client_data,
XtPointer call_data )
{
- register int n,i;
+ register int n;
Arg args[10];
XmListCallbackStruct *cb = (XmListCallbackStruct *)call_data;
palette *tmp_palette;
XmString string;
Pixel white, black;
- static unsigned long pixels[XmCO_MAX_NUM_COLORS*5];
- static int count;
- static Boolean First = True;
-
+ static Boolean First = True;
white = WhitePixelOfScreen(style.screen);
black = BlackPixelOfScreen(style.screen);
@@ -793,82 +873,15 @@ selectPaletteCB(
ReColorPalette();
else
{
- /* PUT DIALOG saying can't dynamically change */
- if(First)
- {
- InfoDialog(NEXT_SESSION, style.colorDialog, False);
- First = False;
- }
- else
- {
- if (TypeOfMonitor != XmCO_BLACK_WHITE)
-
- /* free the cells from last selection */
- XFreeColors(style.display, style.colormap, pixels,
- count, 0);
- }
-
if (TypeOfMonitor != XmCO_BLACK_WHITE)
{
- /* allocate new colors */
- count = 0;
-
- for (i=0; i<pCurrentPalette->num_of_colors; i++)
- {
- n=0;
- if (XAllocColor(style.display, style.colormap,
- &(pCurrentPalette->color[i].bg)) == 0)
- break;
- pixels[count++] = pCurrentPalette->color[i].bg.pixel;
- XtSetArg (args[n], XmNbackground,
- pCurrentPalette->color[i].bg.pixel); n++;
-
- if (XAllocColor(style.display, style.colormap,
- &(pCurrentPalette->color[i].sc)) == 0)
- break;
- pixels[count++] = pCurrentPalette->color[i].sc.pixel;
- XtSetArg (args[n], XmNarmColor,
- pCurrentPalette->color[i].sc.pixel); n++;
-
- if (UsePixmaps == FALSE)
- {
- if (XAllocColor(style.display, style.colormap,
- &(pCurrentPalette->color[i].ts)) == 0)
- break;
- pixels[count++] = pCurrentPalette->color[i].ts.pixel;
- XtSetArg (args[n], XmNtopShadowColor,
- pCurrentPalette->color[i].ts.pixel); n++;
-
- if (XAllocColor(style.display, style.colormap,
- &(pCurrentPalette->color[i].bs)) == 0)
- break;
- pixels[count++] = pCurrentPalette->color[i].bs.pixel;
- XtSetArg (args[n], XmNbottomShadowColor,
- pCurrentPalette->color[i].bs.pixel); n++;
- }
- else /* create pixmaps for top/bottom shadow */
- {
- XmDestroyPixmap(style.screen, edit.pixmap25);
- XmDestroyPixmap(style.screen, edit.pixmap75);
-
- edit.pixmap25 = XmGetPixmap (style.screen,
- "50_foreground",
- pCurrentPalette->color[i].bg.pixel,
- WhitePixelOfScreen(style.screen));
-
- edit.pixmap75 = XmGetPixmap (style.screen,
- "50_foreground",
- pCurrentPalette->color[i].bg.pixel,
- BlackPixelOfScreen(style.screen));
-
- XtSetArg (args[n], XmNtopShadowPixmap, edit.pixmap25);
- n++;
- XtSetArg (args[n], XmNbottomShadowPixmap,
edit.pixmap75);
- n++;
- }
-
- XtSetValues(colorButton[i], args, n);
- }
+ /* PUT DIALOG saying can't dynamically change */
+ if(First)
+ {
+ InfoDialog(NEXT_SESSION, style.colorDialog, False);
+ First = False;
+ }
+ allocNewColors();
}
else /* XmCO_BLACK_WHITE */
{
@@ -994,10 +1007,15 @@ selectColorCB(
if ((edit.DialogShell == NULL) || (!XtIsManaged(edit.DialogShell)))
{
+ Pixel bg_pixel;
+
/* make the new selected button have a border color */
- n=0;
- XtSetArg (args[n], XmNborderColor,
- pCurrentPalette->color[pCurrentPalette->secondary].bg.pixel);
+ n=0;
+ XtSetArg(args[n],XmNbackground,&bg_pixel); n++;
+ XtGetValues(colorDialog.colorForm,args,n);
+
+ n=0;
+ XtSetArg (args[n], XmNborderColor,bg_pixel);
n++;
XtSetValues(colorButton[selected_button],args,n);
@@ -1010,9 +1028,28 @@ selectColorCB(
color_set = (ColorSet *) &pCurrentPalette->color[selected_button];
ColorEditor(style.colorDialog,color_set);
+
+ if(!style.dynamicColor) /* need to update pixels */
+ XtAddCallback(edit.DialogShell, XmNcallback,
colorEditorCB, NULL);
}
}
+/*
+ * Color editor callback for screens without dynamicColor.
+ */
+static void colorEditorCB(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ static Boolean first = True;
+ DtDialogBoxCallbackStruct *cb = (DtDialogBoxCallbackStruct *) call_data;
+
+ /* show "next session" message if first edit */
+ if(cb->button_position==OK_BUTTON && first){
+ InfoDialog(NEXT_SESSION, style.colorDialog, False);
+ first = False;
+ }
+ allocNewColors();
+ XtRemoveCallback(edit.DialogShell, XmNcallback, colorEditorCB, NULL);
+}
/*
** This is the double click timeout callback. If this routine is called
@@ -1026,6 +1063,7 @@ timeoutCB(
register int n;
int i;
Arg args[2];
+ Pixel bg_pixel;
if (TypeOfMonitor == XmCO_BLACK_WHITE)
return;
@@ -1035,9 +1073,12 @@ timeoutCB(
if ((edit.DialogShell == NULL) || (!XtIsManaged(edit.DialogShell)))
{
/* make the new selected button have a border color */
+ n=0;
+ XtSetArg(args[n],XmNbackground,&bg_pixel); n++;
+ XtGetValues(colorDialog.colorForm,args,n);
+
n=0;
- XtSetArg (args[n], XmNborderColor,
- pCurrentPalette->color[pCurrentPalette->secondary].bg.pixel);
+ XtSetArg (args[n], XmNborderColor,bg_pixel);
n++;
XtSetValues(colorButton[selected_button],args,n);
@@ -1366,6 +1407,8 @@ modifyColorCB(
color_set = (ColorSet *) &pCurrentPalette->color[selected_button];
ColorEditor(style.colorDialog,color_set);
+ if(!style.dynamicColor) /* need to update pixels */
+ XtAddCallback(edit.DialogShell, XmNcallback, colorEditorCB,
NULL);
}
@@ -2738,8 +2781,7 @@ CreateBottomColor( void )
if(style.count > 10)
return;
-
- if(style.dynamicColor)
+ if(TypeOfMonitor != XmCO_BLACK_WHITE)
{
/* Create form for Add and Delete buttons */
n = 0;
@@ -2814,7 +2856,7 @@ CreateBottomColor( void )
XtManageChild(style.buttonsForm);
/* Create Modify... button */
- if(style.dynamicColor)
+ if(TypeOfMonitor != XmCO_BLACK_WHITE)
{
n = 0;
XtSetArg (args[n], XmNtopAttachment, XmATTACH_FORM); n++;
diff --git a/cde/programs/dtstyle/Main.c b/cde/programs/dtstyle/Main.c
index dadfafa..dc4caca 100644
--- a/cde/programs/dtstyle/Main.c
+++ b/cde/programs/dtstyle/Main.c
@@ -452,6 +452,7 @@ main(
Boolean useMaskRtn, useIconFileCacheRtn;
char *dirs = NULL;
char *string;
+ Visual *visual;
#ifdef USERHELP
malloc_check(1);
@@ -500,6 +501,8 @@ malloc_trace(0);
style.startupDialog = NULL;
style.dtwmDialog = NULL;
style.i18nDialog = NULL;
+ visual = XDefaultVisual(style.display,style.screenNum);
+ style.visualClass = visual->class;
if (progName = DtStrrchr(argv[0], '/')) progName++;
else progName = argv[0];
diff --git a/cde/programs/dtstyle/Main.h b/cde/programs/dtstyle/Main.h
index bdaea8a..23e2719 100644
--- a/cde/programs/dtstyle/Main.h
+++ b/cde/programs/dtstyle/Main.h
@@ -198,6 +198,7 @@ typedef struct {
Boolean dynamicColor;
Boolean workProcs;
int horizontalSpacing, verticalSpacing;
+ int visualClass;
} Style;
/*
--
1.8.4
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/13534_NeoTech
_______________________________________________
cdesktopenv-devel mailing list
cdesktopenv-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/cdesktopenv-devel