621 lines
21 KiB
C
621 lines
21 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/*
|
|
static char rcsid[] =
|
|
"$XConsortium: SrvFile_io.c /main/8 1996/09/25 09:41:53 barstow $";
|
|
*/
|
|
/* *
|
|
* (c) Copyright 1993, 1994 Hewlett-Packard Company *
|
|
* (c) Copyright 1993, 1994 International Business Machines Corp. *
|
|
* (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
|
|
* (c) Copyright 1993, 1994 Novell, Inc. *
|
|
*/
|
|
|
|
/*****************************************************************************
|
|
*****************************************************************************
|
|
**
|
|
** File: SrvFile_io.c
|
|
**
|
|
** Project: HP DT Style Manager (integrated into dtsession)
|
|
**
|
|
** Description:
|
|
** -----------
|
|
** This file initializes the user specified ( or default) palette
|
|
** for this session.
|
|
**
|
|
*******************************************************************
|
|
** (c) Copyright Hewlett-Packard Company, 1990. All rights are
|
|
** reserved. Copying or other reproduction of this program
|
|
** except for archival purposes is prohibited without prior
|
|
** written consent of Hewlett-Packard Company.
|
|
********************************************************************
|
|
**
|
|
**
|
|
**
|
|
*****************************************************************************
|
|
*************************************<+>*************************************/
|
|
/* #includes */
|
|
|
|
#include <fcntl.h>
|
|
#include "Srv.h"
|
|
#include "SrvFile_io.h"
|
|
|
|
/* #defines */
|
|
|
|
#define BUFSIZE 1024
|
|
|
|
#define MSG2 ((char *)GETMESSAGE(28, 3, "Color Server Warning, the size of file is invalid: "))
|
|
#define MSG3 ((char *)GETMESSAGE(28, 4, "Color Server Warning, invalid information in '"))
|
|
#define MSG3a ((char *)GETMESSAGE(28, 5, "' removing file and starting again.\n"))
|
|
|
|
/* Static Function Declarations */
|
|
|
|
|
|
static Boolean FindPalette(
|
|
char *palette,
|
|
char *directory) ;
|
|
static struct _palette* ReadPaletteFile(
|
|
Display *dpy,
|
|
int screen_number,
|
|
char *palettePath,
|
|
char *palette) ;
|
|
static int ParsePaletteInfo(
|
|
Display *dpy,
|
|
int numDisplay,
|
|
char *buf,
|
|
int nbytes,
|
|
struct _palette *new_palette) ;
|
|
static void InitializeBW(
|
|
unsigned long color,
|
|
int num_of_colors,
|
|
struct _palette *new_palette) ;
|
|
|
|
/* static variables */
|
|
|
|
static int error_value;
|
|
|
|
#define HOME "HOME"
|
|
#define USER_PALETTE_DIR "/.dt/palettes"
|
|
#define SYSTEM_PALETTE_DIR CDE_INSTALLATION_TOP "/palettes"
|
|
#define CONFIG_PALETTE_DIR CDE_CONFIGURATION_TOP "/palettes"
|
|
#define DEFAULT_PALETTE "Default.dp"
|
|
|
|
|
|
/************************************************************************
|
|
**
|
|
** GetPaletteDefinition -
|
|
** Query the database for the Dtstyle.paletteDirectories resource
|
|
** Use Dtstyle default (Default) if not specified.
|
|
** Search the directories for the palette in reverse order
|
|
**
|
|
************************************************************************/
|
|
struct _palette *
|
|
GetPaletteDefinition(
|
|
Display *dpy,
|
|
int screen_number,
|
|
char *palette)
|
|
|
|
{
|
|
struct _palette *paletteDef;
|
|
char *str_type_return;
|
|
XrmValue value_return;
|
|
XrmDatabase db;
|
|
Boolean match = False;
|
|
char *palettePath;
|
|
char *path;
|
|
char *p, *d;
|
|
char *home;
|
|
char dir[256];
|
|
|
|
|
|
if (FindPalette (palette, SYSTEM_PALETTE_DIR))
|
|
{
|
|
/*
|
|
* First look for palette in the system location
|
|
*/
|
|
palettePath = (char *) SRV_MALLOC (strlen(SYSTEM_PALETTE_DIR) + 1 );
|
|
strcpy(palettePath, SYSTEM_PALETTE_DIR);
|
|
match = True;
|
|
}
|
|
else if (FindPalette (palette, CONFIG_PALETTE_DIR))
|
|
{
|
|
/*
|
|
* Next check the local config location
|
|
*/
|
|
palettePath = (char *) SRV_MALLOC (strlen(CONFIG_PALETTE_DIR) + 1 );
|
|
strcpy(palettePath, CONFIG_PALETTE_DIR);
|
|
match = True;
|
|
}
|
|
else
|
|
{
|
|
palettePath = NULL;
|
|
}
|
|
|
|
/* Get Dtstyle.paletteDirectories value */
|
|
db = XtDatabase(dpy);
|
|
if (XrmGetResource (db, "dtstyle.paletteDirectories",
|
|
"Dtstyle.PaletteDirectories",
|
|
&str_type_return, &value_return))
|
|
{
|
|
/* Make Local Copy of string */
|
|
path = (char *) SRV_MALLOC( value_return.size + 1 );
|
|
strcpy (path, value_return.addr);
|
|
}
|
|
else
|
|
{
|
|
path = NULL;
|
|
}
|
|
|
|
/* Look for palette in paletteDirectories */
|
|
if (path != NULL)
|
|
{
|
|
/* Loop through paletteDirectories looking in each directory
|
|
* till we find the palette file. Take first occurrence.
|
|
* Copy directory name into dir. Look for NULL or space
|
|
*/
|
|
|
|
p = path;
|
|
while (*p != '\0')
|
|
{
|
|
d = dir;
|
|
while (*p != ' ' && *p != '\0')
|
|
*d++ = *p++;
|
|
*d = '\0';
|
|
if (FindPalette (palette, dir))
|
|
{
|
|
palettePath = (char *)SRV_REALLOC(palettePath,
|
|
strlen(SYSTEM_PALETTE_DIR) + 1);
|
|
strcpy(palettePath, dir);
|
|
match = True;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Look for palette in $HOME/.dt/palettes */
|
|
/* If there is a duplicate, take it */
|
|
|
|
if ((home=getenv(HOME)) == NULL)
|
|
home="";
|
|
path = (char *) SRV_REALLOC (path,
|
|
strlen(home) + strlen(USER_PALETTE_DIR) + 1);
|
|
strcpy(path, home);
|
|
strcat(path, USER_PALETTE_DIR);
|
|
|
|
if (FindPalette (palette, path))
|
|
{
|
|
palettePath = (char *) SRV_REALLOC (palettePath, strlen(path) + 1 );
|
|
strcpy(palettePath, path);
|
|
match = True;
|
|
}
|
|
|
|
if (match)
|
|
{
|
|
/* Parse the data from the palette file */
|
|
paletteDef = (struct _palette *) ReadPaletteFile(dpy,
|
|
screen_number,
|
|
palettePath,
|
|
palette);
|
|
}
|
|
else /* default to system Default */
|
|
{
|
|
palettePath = (char *) SRV_REALLOC (palettePath,
|
|
strlen(SYSTEM_PALETTE_DIR) + 1);
|
|
strcpy(palettePath, SYSTEM_PALETTE_DIR);
|
|
paletteDef = (struct _palette *)ReadPaletteFile(dpy,
|
|
screen_number,
|
|
palettePath,
|
|
DEFAULT_PALETTE);
|
|
}
|
|
|
|
SRV_FREE(path);
|
|
SRV_FREE(palettePath);
|
|
|
|
return (paletteDef);
|
|
|
|
}
|
|
|
|
/************************************************************************
|
|
**
|
|
** FindPalette -
|
|
** Open the directory and look for the palette file.
|
|
** If found, read in data and return true.
|
|
** If not found, return false
|
|
**
|
|
************************************************************************/
|
|
static Boolean
|
|
FindPalette(
|
|
char *palette,
|
|
char *directory)
|
|
|
|
{
|
|
DIR *dirp;
|
|
struct dirent *file_descpt;
|
|
|
|
/* Open the directory */
|
|
if( (dirp = opendir(directory)) == NULL)
|
|
{
|
|
return(False);
|
|
}
|
|
else
|
|
{
|
|
file_descpt = readdir(dirp);
|
|
}
|
|
|
|
/* cycle through the files in the directory until found a match */
|
|
while( file_descpt != NULL)
|
|
{
|
|
/* check for a palette filename match */
|
|
if (strcmp(palette, file_descpt->d_name) == 0)
|
|
{
|
|
closedir(dirp);
|
|
return(True);
|
|
}
|
|
else
|
|
{
|
|
/* read the next file */
|
|
file_descpt = readdir(dirp);
|
|
}
|
|
} /* while( file_descpt != NULL) */
|
|
|
|
closedir(dirp);
|
|
return (False);
|
|
}
|
|
|
|
/***************************************************************************
|
|
*
|
|
* ReadPaletteFile - this routines reads and parses the palette file.
|
|
* It fills in the pCurrentPalette structure for the screen_number
|
|
* that was passed in.
|
|
*
|
|
*************************************************************************/
|
|
static struct _palette *
|
|
ReadPaletteFile(
|
|
Display *dpy,
|
|
int screen_number,
|
|
char *palettePath,
|
|
char *palette )
|
|
{
|
|
struct _palette *new_palette;
|
|
int fd, nbytes;
|
|
char buf[BUFSIZE];
|
|
char tmpPalette[BUFSIZE];
|
|
char *token1;
|
|
char *tmpStr2;
|
|
char *tmpStr;
|
|
char *fullPath;
|
|
|
|
/*
|
|
* create full path, don't forget to add 1 for the NULL byte
|
|
* and 1 for the slash in the format string for sprintf.
|
|
*/
|
|
fullPath = (char *) SRV_MALLOC (strlen(palettePath) + strlen(palette) + 2);
|
|
sprintf(fullPath,"%s/%s", palettePath, palette);
|
|
|
|
if( (fd = open( fullPath, O_RDONLY)) == -1)
|
|
{ /* open failed */
|
|
printf("error opening %s\n",fullPath);
|
|
SRV_FREE(fullPath);
|
|
return((struct _palette *) NULL);
|
|
}
|
|
|
|
/*
|
|
** Read a buffer of data ... BUFSIZE == 1024, as long as
|
|
** screen < MAX_NUM_SCREENS (5) then we should never need more.
|
|
*/
|
|
nbytes = read(fd, buf, BUFSIZE);
|
|
if(nbytes == 0 || nbytes == BUFSIZE) /* A bogus number of bytes */
|
|
{ /* read failed */
|
|
/*
|
|
* Don't forget to add 1 for the NULL byte and 2 for the
|
|
* period and the newline in the format string for sprintf
|
|
*/
|
|
tmpStr = (char *)SRV_MALLOC(strlen(MSG2) + strlen(fullPath) + 3);
|
|
sprintf(tmpStr,"%s%s.\n", MSG2, palettePath);
|
|
_DtSimpleError(XmSCOLOR_SRV_NAME, DtWarning, NULL, tmpStr, NULL);
|
|
SRV_FREE(tmpStr);
|
|
SRV_FREE(fullPath);
|
|
close(fd);
|
|
return((struct _palette *) NULL);
|
|
}
|
|
else
|
|
{ /* read suceeded */
|
|
/* Allocate space for this new palette. */
|
|
new_palette = (palettes *)SRV_MALLOC( sizeof(struct _palette) + 1 );
|
|
|
|
/* allocate enough space for the name */
|
|
strcpy(tmpPalette, palette);
|
|
for (token1=tmpPalette; *token1; token1++);
|
|
while (token1!=tmpPalette && *token1!='.') token1--;
|
|
if (!strcmp(token1,PALETTE_SUFFIX)) *token1 = '\0';
|
|
new_palette->name = (char *)SRV_MALLOC(strlen(tmpPalette) + 1);
|
|
strcpy(new_palette->name, (char *) tmpPalette);
|
|
|
|
new_palette->converted = NULL;
|
|
new_palette->converted_len = 0L;
|
|
|
|
/* set the next pointer to NULL*/
|
|
new_palette->next = NULL;
|
|
|
|
if (ParsePaletteInfo(dpy, screen_number, buf, nbytes, new_palette) == -1)
|
|
{
|
|
/* palette file is bad */
|
|
tmpStr = (char *)SRV_MALLOC(strlen(MSG3) + strlen(MSG3a) + strlen(palettePath) +1);
|
|
tmpStr2 = (char *)SRV_MALLOC(strlen(MSG3)+1);
|
|
sprintf(tmpStr2,"%s", MSG3);
|
|
sprintf(tmpStr,"%s%s%s", tmpStr2, palettePath, MSG3a);
|
|
_DtSimpleError(XmSCOLOR_SRV_NAME, DtWarning, NULL, tmpStr, NULL);
|
|
SRV_FREE(tmpStr);
|
|
SRV_FREE(tmpStr2);
|
|
error_value = 1;
|
|
unlink(palettePath);
|
|
SRV_FREE(fullPath);
|
|
close(fd);
|
|
return((struct _palette *) NULL);
|
|
}
|
|
}
|
|
|
|
/* close the file */
|
|
close(fd);
|
|
SRV_FREE(fullPath);
|
|
|
|
return(new_palette);
|
|
}
|
|
|
|
/***********************************************************************
|
|
*
|
|
* ParsePaletteInfo - This routine reads from the buffer(buf) the
|
|
* actual data into the new_palette. It reads in the bg colors
|
|
* then uses the XmCalculateColorRGB to generate the ts, bs, and sc
|
|
* colors. This routine doesn't allocate any pixel numbers but
|
|
* does generate the RGB values for each color in a palette.
|
|
*
|
|
***********************************************************************/
|
|
static int
|
|
ParsePaletteInfo(
|
|
Display *dpy,
|
|
int screen_num,
|
|
char *buf,
|
|
int nbytes,
|
|
struct _palette *new_palette )
|
|
{
|
|
char tmpbuf[BUFSIZE];
|
|
int count;
|
|
int num_of_colors;
|
|
int result;
|
|
XColor tmp_color;
|
|
int buf_count;
|
|
static XmColorProc calcRGB = NULL;
|
|
|
|
num_of_colors = new_palette->num_of_colors = 0;
|
|
|
|
if(colorSrv.TypeOfMonitor[screen_num] != XmCO_BLACK_WHITE)
|
|
if((strcmp(new_palette->name, W_O_B)) == 0 ||
|
|
(strcmp(new_palette->name, B_O_W)) == 0 ||
|
|
(strcmp(new_palette->name, W_ONLY)) == 0 ||
|
|
(strcmp(new_palette->name, B_ONLY)) == 0)
|
|
return(-1);
|
|
|
|
buf_count = 0;
|
|
/* read in background colors until end of file */
|
|
while(buf_count < nbytes && buf[buf_count] != '!')
|
|
{
|
|
count = 0;
|
|
|
|
/* read in a BG color */
|
|
while(buf[buf_count] != '\012')
|
|
tmpbuf[count++] = buf[buf_count++];
|
|
tmpbuf[count++] = '\0';
|
|
buf_count++;
|
|
|
|
/* get the RGB value (XColor) of the background */
|
|
result = XParseColor(dpy, DefaultColormap(dpy, screen_num),
|
|
tmpbuf, &tmp_color);
|
|
/* there was an error */
|
|
if(result == 0)
|
|
return(-1);
|
|
|
|
new_palette->color[num_of_colors].bg.red = tmp_color.red;
|
|
new_palette->color[num_of_colors].bg.blue = tmp_color.blue;
|
|
new_palette->color[num_of_colors].bg.green = tmp_color.green;
|
|
|
|
/*
|
|
** Now lets generate all the colors which go along with this bg i.e. ts,
|
|
** fg, bs, and sc.
|
|
*/
|
|
if (calcRGB == NULL) calcRGB = XmGetColorCalculation();
|
|
(*calcRGB)(&tmp_color,
|
|
&(new_palette->color[num_of_colors].fg),
|
|
&(new_palette->color[num_of_colors].sc),
|
|
&(new_palette->color[num_of_colors].ts),
|
|
&(new_palette->color[num_of_colors].bs));
|
|
|
|
if(colorSrv.TypeOfMonitor[screen_num] == XmCO_BLACK_WHITE)
|
|
InitializeBW(tmp_color.red, num_of_colors, new_palette);
|
|
|
|
else /* Not Black and White */
|
|
{
|
|
if(colorSrv.UsePixmaps[screen_num] == TRUE)
|
|
{
|
|
/* the values generated by XmCalculateColorRBG are invalid */
|
|
new_palette->color[num_of_colors].ts.red = 65535;
|
|
new_palette->color[num_of_colors].ts.blue = 65535;
|
|
new_palette->color[num_of_colors].ts.green = 65535;
|
|
|
|
new_palette->color[num_of_colors].bs.red = 0;
|
|
new_palette->color[num_of_colors].bs.blue = 0;
|
|
new_palette->color[num_of_colors].bs.green = 0;
|
|
}
|
|
|
|
if(colorSrv.FgColor[screen_num] != DYNAMIC)
|
|
{
|
|
if(colorSrv.FgColor[screen_num] == BLACK)
|
|
{
|
|
new_palette->color[num_of_colors].fg.red = 0;
|
|
new_palette->color[num_of_colors].fg.blue = 0;
|
|
new_palette->color[num_of_colors].fg.green = 0;
|
|
}
|
|
else /* colorSrv.FgColor[screen_num] == WHITE */
|
|
{
|
|
new_palette->color[num_of_colors].fg.red = 65535;
|
|
new_palette->color[num_of_colors].fg.blue = 65535;
|
|
new_palette->color[num_of_colors].fg.green = 65535;
|
|
}
|
|
}
|
|
} /* else Not Black and White */
|
|
|
|
num_of_colors++;
|
|
new_palette->num_of_colors++;
|
|
|
|
if(colorSrv.TypeOfMonitor[screen_num] == XmCO_BLACK_WHITE)
|
|
if( new_palette->num_of_colors == 2)
|
|
break;
|
|
|
|
if(colorSrv.TypeOfMonitor[screen_num] == XmCO_LOW_COLOR ||
|
|
colorSrv.TypeOfMonitor[screen_num] == XmCO_MEDIUM_COLOR)
|
|
if( new_palette->num_of_colors == 4)
|
|
break;
|
|
|
|
} /* while */
|
|
if(colorSrv.TypeOfMonitor[screen_num] == XmCO_LOW_COLOR)
|
|
{
|
|
new_palette->num_of_colors = 2;
|
|
SwitchAItoPS(new_palette);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
/***********************************************************************
|
|
*
|
|
* InitializeBW - the type of monitor is a black and white, so
|
|
* initialize the colors to black and white. If the color passed
|
|
* in is 0 (black) set everything to 65535 (white). Otherwise
|
|
* set everything to 0 (black).
|
|
*
|
|
***********************************************************************/
|
|
static void
|
|
InitializeBW(
|
|
unsigned long color,
|
|
int num_of_colors,
|
|
struct _palette *new_palette )
|
|
{
|
|
if(color == 0L)
|
|
{
|
|
new_palette->color[num_of_colors].fg.red = 65535;
|
|
new_palette->color[num_of_colors].fg.blue = 65535;
|
|
new_palette->color[num_of_colors].fg.green = 65535;
|
|
|
|
new_palette->color[num_of_colors].ts.red = 65535;
|
|
new_palette->color[num_of_colors].ts.blue = 65535;
|
|
new_palette->color[num_of_colors].ts.green = 65535;
|
|
|
|
new_palette->color[num_of_colors].bs.red = 65535;
|
|
new_palette->color[num_of_colors].bs.blue = 65535;
|
|
new_palette->color[num_of_colors].bs.green = 65535;
|
|
|
|
new_palette->color[num_of_colors].sc.red = 0;
|
|
new_palette->color[num_of_colors].sc.blue = 0;
|
|
new_palette->color[num_of_colors].sc.green = 0;
|
|
}
|
|
else
|
|
{
|
|
new_palette->color[num_of_colors].fg.red = 0;
|
|
new_palette->color[num_of_colors].fg.blue = 0;
|
|
new_palette->color[num_of_colors].fg.green = 0;
|
|
|
|
new_palette->color[num_of_colors].ts.red = 0;
|
|
new_palette->color[num_of_colors].ts.blue = 0;
|
|
new_palette->color[num_of_colors].ts.green = 0;
|
|
|
|
new_palette->color[num_of_colors].bs.red = 0;
|
|
new_palette->color[num_of_colors].bs.blue = 0;
|
|
new_palette->color[num_of_colors].bs.green = 0;
|
|
|
|
new_palette->color[num_of_colors].sc.red = 65535;
|
|
new_palette->color[num_of_colors].sc.blue = 65535;
|
|
new_palette->color[num_of_colors].sc.green = 65535;
|
|
}
|
|
}
|
|
|
|
void
|
|
SwitchAItoPS(
|
|
struct _palette *new_palette )
|
|
{
|
|
new_palette->color[0].bg.red = new_palette->color[3].bg.red;
|
|
new_palette->color[0].bg.green = new_palette->color[3].bg.green;
|
|
new_palette->color[0].bg.blue = new_palette->color[3].bg.blue;
|
|
|
|
new_palette->color[0].fg.red = new_palette->color[3].fg.red;
|
|
new_palette->color[0].fg.green = new_palette->color[3].fg.green;
|
|
new_palette->color[0].fg.blue = new_palette->color[3].fg.blue;
|
|
|
|
new_palette->color[0].ts.red = new_palette->color[3].ts.red;
|
|
new_palette->color[0].ts.green = new_palette->color[3].ts.green;
|
|
new_palette->color[0].ts.blue = new_palette->color[3].ts.blue;
|
|
|
|
new_palette->color[0].bs.red = new_palette->color[3].bs.red;
|
|
new_palette->color[0].bs.green = new_palette->color[3].bs.green;
|
|
new_palette->color[0].bs.blue = new_palette->color[3].bs.blue;
|
|
|
|
new_palette->color[0].sc.red = new_palette->color[3].sc.red;
|
|
new_palette->color[0].sc.green = new_palette->color[3].sc.green;
|
|
new_palette->color[0].sc.blue = new_palette->color[3].sc.blue;
|
|
|
|
new_palette->color[1].bg.red = new_palette->color[2].bg.red;
|
|
new_palette->color[1].bg.green = new_palette->color[2].bg.green;
|
|
new_palette->color[1].bg.blue = new_palette->color[2].bg.blue;
|
|
|
|
new_palette->color[1].fg.red = new_palette->color[2].fg.red;
|
|
new_palette->color[1].fg.green = new_palette->color[2].fg.green;
|
|
new_palette->color[1].fg.blue = new_palette->color[2].fg.blue;
|
|
|
|
new_palette->color[1].ts.red = new_palette->color[2].ts.red;
|
|
new_palette->color[1].ts.green = new_palette->color[2].ts.green;
|
|
new_palette->color[1].ts.blue = new_palette->color[2].ts.blue;
|
|
|
|
new_palette->color[1].bs.red = new_palette->color[2].bs.red;
|
|
new_palette->color[1].bs.green = new_palette->color[2].bs.green;
|
|
new_palette->color[1].bs.blue = new_palette->color[2].bs.blue;
|
|
|
|
new_palette->color[1].sc.red = new_palette->color[2].sc.red;
|
|
new_palette->color[1].sc.green = new_palette->color[2].sc.green;
|
|
new_palette->color[1].sc.blue = new_palette->color[2].sc.blue;
|
|
|
|
}
|
|
|
|
/***********************************************************************
|
|
*
|
|
* SaveDefaultPalette - used to save the palette.dt file to
|
|
* either $HOME/.dt/$DISPLAY/current or $HOME/.dt/$DISPLAY/home.
|
|
* The parameter mode determines whether it is home or
|
|
* current.
|
|
*
|
|
***********************************************************************/
|
|
void
|
|
SaveDefaultPalette(
|
|
Display *dpy,
|
|
char *dtPath,
|
|
int mode )
|
|
{
|
|
}
|