mirror of
https://github.com/Stichting-MINIX-Research-Foundation/xsrc.git
synced 2025-09-22 02:57:17 -04:00
2312 lines
68 KiB
C
2312 lines
68 KiB
C
/*****************************************************************************/
|
|
/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/
|
|
/** Salt Lake City, Utah **/
|
|
/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/
|
|
/** Cambridge, Massachusetts **/
|
|
/** **/
|
|
/** All Rights Reserved **/
|
|
/** **/
|
|
/** Permission to use, copy, modify, and distribute this software and **/
|
|
/** its documentation for any purpose and without fee is hereby **/
|
|
/** granted, provided that the above copyright notice appear in all **/
|
|
/** copies and that both that copyright notice and this permis- **/
|
|
/** sion notice appear in supporting documentation, and that the **/
|
|
/** names of Evans & Sutherland and M.I.T. not be used in advertising **/
|
|
/** in publicity pertaining to distribution of the software without **/
|
|
/** specific, written prior permission. **/
|
|
/** **/
|
|
/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/
|
|
/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/
|
|
/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/
|
|
/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/
|
|
/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/
|
|
/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/
|
|
/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/
|
|
/** OR PERFORMANCE OF THIS SOFTWARE. **/
|
|
/*****************************************************************************/
|
|
/*
|
|
* [ ctwm ]
|
|
*
|
|
* Copyright 1992 Claude Lecommandeur.
|
|
*
|
|
* Permission to use, copy, modify and distribute this software [ctwm] and
|
|
* its documentation for any purpose is hereby granted without fee, provided
|
|
* that the above copyright notice appear in all copies and that both that
|
|
* copyright notice and this permission notice appear in supporting documen-
|
|
* tation, and that the name of Claude Lecommandeur not be used in adverti-
|
|
* sing or publicity pertaining to distribution of the software without
|
|
* specific, written prior permission. Claude Lecommandeur make no represen-
|
|
* tations about the suitability of this software for any purpose. It is
|
|
* provided "as is" without express or implied warranty.
|
|
*
|
|
* Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
|
|
* EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
|
|
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
*
|
|
* Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ]
|
|
*/
|
|
|
|
|
|
/***********************************************************************
|
|
*
|
|
* $XConsortium: parse.c,v 1.52 91/07/12 09:59:37 dave Exp $
|
|
*
|
|
* parse the .twmrc file
|
|
*
|
|
* 17-Nov-87 Thomas E. LaStrange File created
|
|
* 10-Oct-90 David M. Sternlicht Storing saved colors on root
|
|
*
|
|
* Do the necessary modification to be integrated in ctwm.
|
|
* Can no longer be used for the standard twm.
|
|
*
|
|
* 22-April-92 Claude Lecommandeur.
|
|
*
|
|
***********************************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#include <sys/wait.h>
|
|
#if defined(sony_news) || defined __QNX__
|
|
# include <ctype.h>
|
|
#endif
|
|
#ifdef VMS
|
|
#include <ctype.h>
|
|
#include <decw$include/Xos.h>
|
|
#include <X11Xmu/CharSet.h>
|
|
#include <X11Xmu/SysUtil.h>
|
|
#else
|
|
#include <X11/Xos.h>
|
|
#include <X11/Xmu/CharSet.h>
|
|
#include <X11/Xmu/SysUtil.h>
|
|
#endif
|
|
#include "twm.h"
|
|
#include "screen.h"
|
|
#include "menus.h"
|
|
#include "util.h"
|
|
#include "parse.h"
|
|
#include "version.h"
|
|
#ifdef SOUNDS
|
|
# include "sound.h"
|
|
#endif
|
|
#ifdef VMS
|
|
# include <decw$include/Xatom.h>
|
|
#else
|
|
# include <X11/Xatom.h>
|
|
#endif
|
|
|
|
/* For m4... */
|
|
#ifdef USEM4
|
|
#include <sys/param.h>
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <netdb.h>
|
|
|
|
extern int GoThroughM4;
|
|
extern char *keepM4_filename;
|
|
extern int KeepTmpFile;
|
|
#endif
|
|
|
|
#if defined(ultrix)
|
|
#define NOSTEMP
|
|
#endif
|
|
|
|
#ifndef SYSTEM_INIT_FILE
|
|
#ifdef VMS
|
|
#define SYSTEM_INIT_FILE "DECW$SYSTEM_DEFAULTS:SYSTEM.CTWMRC"
|
|
#else
|
|
#define SYSTEM_INIT_FILE "/usr/lib/X11/twm/system.twmrc"
|
|
#endif
|
|
#endif
|
|
#define BUF_LEN 300
|
|
|
|
static int ParseRandomPlacement (register char *s);
|
|
static int ParseButtonStyle (register char *s);
|
|
extern int yyparse(void);
|
|
extern void twmrc_error_prefix(void);
|
|
|
|
static FILE *twmrc;
|
|
static int ptr = 0;
|
|
static int len = 0;
|
|
static char buff[BUF_LEN+1];
|
|
static char overflowbuff[20]; /* really only need one */
|
|
static int overflowlen;
|
|
static char **stringListSource, *currentString;
|
|
static int ParseUsePPosition (register char *s);
|
|
#ifdef USEM4
|
|
static FILE *start_m4(FILE *fraw);
|
|
static char *m4_defs(Display *display, char *host);
|
|
#endif
|
|
|
|
extern int mods;
|
|
|
|
int ConstrainedMoveTime = 400; /* milliseconds, event times */
|
|
|
|
int RaiseDelay = 0; /* msec, for AutoRaise */
|
|
|
|
static int twmStringListInput(void);
|
|
#ifndef USEM4
|
|
static int twmFileInput(void);
|
|
#else
|
|
static int m4twmFileInput (void);
|
|
#endif
|
|
int (*twmInputFunc)(void);
|
|
|
|
extern char *defTwmrc[]; /* default bindings */
|
|
|
|
extern char *captivename;
|
|
|
|
/***********************************************************************
|
|
*
|
|
* Procedure:
|
|
* ParseTwmrc - parse the .twmrc file
|
|
*
|
|
* Inputs:
|
|
* filename - the filename to parse. A NULL indicates $HOME/.twmrc
|
|
*
|
|
***********************************************************************
|
|
*/
|
|
|
|
#ifdef YYDEBUG
|
|
int yydebug = 1;
|
|
#endif
|
|
|
|
static int doparse (int (*ifunc)(void), char *srctypename, char *srcname)
|
|
{
|
|
mods = 0;
|
|
ptr = 0;
|
|
len = 0;
|
|
twmrc_lineno = 0;
|
|
ParseError = FALSE;
|
|
twmInputFunc = ifunc;
|
|
overflowlen = 0;
|
|
|
|
yyparse();
|
|
|
|
if (ParseError) {
|
|
fprintf (stderr, "%s: errors found in twm %s",
|
|
ProgramName, srctypename);
|
|
if (srcname) fprintf (stderr, " \"%s\"", srcname);
|
|
fprintf (stderr, "\n");
|
|
}
|
|
return (ParseError ? 0 : 1);
|
|
}
|
|
|
|
|
|
int ParseTwmrc (char *filename)
|
|
{
|
|
int i;
|
|
char *home = NULL;
|
|
int homelen = 0;
|
|
char *cp = NULL;
|
|
char tmpfilename[257];
|
|
#ifdef USEM4
|
|
static FILE *raw;
|
|
#endif
|
|
|
|
/*
|
|
* Check for the twmrc file in the following order:
|
|
* Unix | VMS
|
|
* 0. -f filename.# | -f filename_#
|
|
* 1. -f filename | -f filename
|
|
* 2. .ctwmrc.# | ctwm.rc_#
|
|
* 3. .ctwmrc | ctwm.rc
|
|
* 4. .twmrc.# | twm.rc_#
|
|
* 5. .twmrc | twm.rc
|
|
* 6. system.ctwmrc | system.ctwmrc
|
|
*/
|
|
for (twmrc = NULL, i = 0; !twmrc && i < 7; i++) {
|
|
switch (i) {
|
|
#ifdef VMS
|
|
case 0:
|
|
if (filename != NULL) {
|
|
cp = tmpfilename;
|
|
(void) sprintf (tmpfilename, "%s_%d", filename, Scr->screen);
|
|
} else
|
|
cp = filename;
|
|
break;
|
|
|
|
case 1:
|
|
cp = filename;
|
|
break;
|
|
|
|
case 2:
|
|
if (!filename) {
|
|
home = getenv ("DECW$USER_DEFAULTS");
|
|
if (home) {
|
|
homelen = strlen (home);
|
|
cp = tmpfilename;
|
|
(void) sprintf (tmpfilename, "%sctwm.rc_%d",
|
|
home, Scr->screen);
|
|
break;
|
|
}
|
|
}
|
|
continue;
|
|
|
|
case 3:
|
|
if (home) {
|
|
tmpfilename[homelen + 7] = '\0';
|
|
}
|
|
break;
|
|
|
|
case 4:
|
|
if (!filename) {
|
|
home = getenv ("DECW$USER_DEFAULTS");
|
|
if (home) {
|
|
homelen = strlen (home);
|
|
cp = tmpfilename;
|
|
(void) sprintf (tmpfilename, "%stwm.rc_%d",
|
|
home, Scr->screen);
|
|
break;
|
|
}
|
|
}
|
|
continue;
|
|
|
|
case 5:
|
|
if (home) {
|
|
tmpfilename[homelen + 6] = '\0';
|
|
}
|
|
break;
|
|
#else
|
|
case 0: /* -f filename.# */
|
|
if (filename) {
|
|
cp = tmpfilename;
|
|
(void) sprintf (tmpfilename, "%s.%d", filename, Scr->screen);
|
|
}
|
|
else cp = filename;
|
|
break;
|
|
|
|
case 1: /* -f filename */
|
|
cp = filename;
|
|
break;
|
|
|
|
case 2: /* ~/.ctwmrc.screennum */
|
|
if (!filename) {
|
|
home = getenv ("HOME");
|
|
if (home) {
|
|
homelen = strlen (home);
|
|
cp = tmpfilename;
|
|
(void) sprintf (tmpfilename, "%s/.ctwmrc.%d",
|
|
home, Scr->screen);
|
|
break;
|
|
}
|
|
}
|
|
continue;
|
|
|
|
case 3: /* ~/.ctwmrc */
|
|
if (home) {
|
|
tmpfilename[homelen + 8] = '\0';
|
|
}
|
|
break;
|
|
|
|
case 4: /* ~/.twmrc.screennum */
|
|
if (!filename) {
|
|
home = getenv ("HOME");
|
|
if (home) {
|
|
homelen = strlen (home);
|
|
cp = tmpfilename;
|
|
(void) sprintf (tmpfilename, "%s/.twmrc.%d",
|
|
home, Scr->screen);
|
|
break;
|
|
}
|
|
}
|
|
continue;
|
|
|
|
case 5: /* ~/.twmrc */
|
|
if (home) {
|
|
tmpfilename[homelen + 7] = '\0'; /* C.L. */
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
case 6: /* system.twmrc */
|
|
cp = SYSTEM_INIT_FILE;
|
|
break;
|
|
}
|
|
|
|
if (cp) {
|
|
twmrc = fopen (cp, "r");
|
|
#ifdef USEM4
|
|
raw = twmrc;
|
|
#endif
|
|
|
|
}
|
|
}
|
|
|
|
#ifdef USEM4
|
|
if (raw) {
|
|
#else
|
|
if (twmrc) {
|
|
#endif
|
|
|
|
int status;
|
|
|
|
if (filename && strncmp (cp, filename, strlen (filename))) {
|
|
fprintf (stderr,
|
|
"%s: unable to open twmrc file %s, using %s instead\n",
|
|
ProgramName, filename, cp);
|
|
}
|
|
#ifdef USEM4
|
|
if (GoThroughM4) twmrc = start_m4(raw);
|
|
status = doparse (m4twmFileInput, "file", cp);
|
|
wait (0);
|
|
fclose (twmrc);
|
|
if (GoThroughM4) fclose (raw);
|
|
#else
|
|
status = doparse (twmFileInput, "file", cp);
|
|
fclose (twmrc);
|
|
#endif
|
|
return status;
|
|
} else {
|
|
if (filename) {
|
|
fprintf (stderr,
|
|
"%s: unable to open twmrc file %s, using built-in defaults instead\n",
|
|
ProgramName, filename);
|
|
}
|
|
return ParseStringList (defTwmrc);
|
|
}
|
|
}
|
|
|
|
int ParseStringList (char **sl)
|
|
{
|
|
stringListSource = sl;
|
|
currentString = *sl;
|
|
return doparse (twmStringListInput, "string list", (char *)NULL);
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
*
|
|
* Procedure:
|
|
* twmFileInput - redefinition of the lex input routine for file input
|
|
*
|
|
* Returned Value:
|
|
* the next input character
|
|
*
|
|
***********************************************************************
|
|
*/
|
|
|
|
|
|
#ifndef USEM4
|
|
|
|
/* This has Tom's include() funtionality. This is utterly useless if you
|
|
* can use m4 for the same thing. Chris P. Ross */
|
|
|
|
#define MAX_INCLUDES 10
|
|
|
|
static struct incl {
|
|
FILE *fp;
|
|
char *name;
|
|
int lineno;
|
|
} rc_includes[MAX_INCLUDES];
|
|
static int include_file = 0;
|
|
|
|
|
|
static int twmFileInput()
|
|
{
|
|
if (overflowlen) return (int) overflowbuff[--overflowlen];
|
|
|
|
while (ptr == len)
|
|
{
|
|
while (include_file) {
|
|
if (fgets(buff, BUF_LEN, rc_includes[include_file].fp) == NULL) {
|
|
free(rc_includes[include_file].name);
|
|
fclose(rc_includes[include_file].fp);
|
|
twmrc_lineno = rc_includes[include_file--].lineno;
|
|
} else
|
|
break;
|
|
}
|
|
|
|
if (!include_file)
|
|
if (fgets(buff, BUF_LEN, twmrc) == NULL)
|
|
return 0;
|
|
twmrc_lineno++;
|
|
|
|
if (strncmp(buff, "include", 7) == 0) {
|
|
/* Whoops, an include file! */
|
|
char *p = buff + 7, *q;
|
|
FILE *fp;
|
|
|
|
while (isspace(*p)) p++;
|
|
for (q = p; *q && !isspace(*q); q++)
|
|
continue;
|
|
*q = 0;
|
|
|
|
if ((fp = fopen(p, "r")) == NULL) {
|
|
fprintf(stderr, "%s: Unable to open included init file %s\n",
|
|
ProgramName, p);
|
|
continue;
|
|
}
|
|
if (++include_file >= MAX_INCLUDES) {
|
|
fprintf(stderr, "%s: init file includes nested too deep\n",
|
|
ProgramName);
|
|
continue;
|
|
}
|
|
rc_includes[include_file].fp = fp;
|
|
rc_includes[include_file].lineno = twmrc_lineno;
|
|
twmrc_lineno = 0;
|
|
rc_includes[include_file].name = malloc(strlen(p)+1);
|
|
strcpy(rc_includes[include_file].name, p);
|
|
continue;
|
|
}
|
|
ptr = 0;
|
|
len = strlen(buff);
|
|
}
|
|
return ((int)buff[ptr++]);
|
|
}
|
|
#else /* USEM4 */
|
|
/* If you're going to use m4, use this version instead. Much simpler.
|
|
* m4 ism's credit to Josh Osborne (stripes) */
|
|
|
|
static int m4twmFileInput(void)
|
|
{
|
|
int line;
|
|
static FILE *cp = NULL;
|
|
|
|
if ( cp == NULL && keepM4_filename ) {
|
|
cp = fopen (keepM4_filename,"w");
|
|
if ( cp == NULL ) {
|
|
fprintf (stderr,
|
|
"%s: unable to create m4 output %s, ignoring\n",
|
|
ProgramName, keepM4_filename);
|
|
keepM4_filename = NULL;
|
|
}
|
|
}
|
|
|
|
if (overflowlen){
|
|
return((int) overflowbuff[--overflowlen]);
|
|
}
|
|
|
|
while (ptr == len) {
|
|
nextline:
|
|
if (fgets(buff, BUF_LEN, twmrc) == NULL) {
|
|
if ( cp ) fclose (cp);
|
|
return(0);
|
|
}
|
|
if ( cp ) fputs (buff, cp);
|
|
|
|
if (sscanf(buff, "#line %d", &line)) {
|
|
twmrc_lineno = line - 1;
|
|
goto nextline;
|
|
} else {
|
|
twmrc_lineno++;
|
|
}
|
|
|
|
ptr = 0;
|
|
len = strlen(buff);
|
|
}
|
|
return ((int)buff[ptr++]);
|
|
}
|
|
#endif /* USEM4 */
|
|
|
|
|
|
static int twmStringListInput(void)
|
|
{
|
|
if (overflowlen) return (int) overflowbuff[--overflowlen];
|
|
|
|
/*
|
|
* return the character currently pointed to
|
|
*/
|
|
if (currentString) {
|
|
unsigned int c = (unsigned int) *currentString++;
|
|
|
|
if (c) return c; /* if non-nul char */
|
|
currentString = *++stringListSource; /* advance to next bol */
|
|
return '\n'; /* but say that we hit last eol */
|
|
}
|
|
return 0; /* eof */
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
*
|
|
* Procedure:
|
|
* twmUnput - redefinition of the lex unput routine
|
|
*
|
|
* Inputs:
|
|
* c - the character to push back onto the input stream
|
|
*
|
|
***********************************************************************
|
|
*/
|
|
|
|
void twmUnput (int c)
|
|
{
|
|
if (overflowlen < sizeof overflowbuff) {
|
|
overflowbuff[overflowlen++] = (char) c;
|
|
} else {
|
|
twmrc_error_prefix ();
|
|
fprintf (stderr, "unable to unput character (%c)\n",
|
|
c);
|
|
}
|
|
}
|
|
|
|
|
|
/***********************************************************************
|
|
*
|
|
* Procedure:
|
|
* TwmOutput - redefinition of the lex output routine
|
|
*
|
|
* Inputs:
|
|
* c - the character to print
|
|
*
|
|
***********************************************************************
|
|
*/
|
|
|
|
void TwmOutput(int c)
|
|
{
|
|
putchar(c);
|
|
}
|
|
|
|
|
|
/**********************************************************************
|
|
*
|
|
* Parsing table and routines
|
|
*
|
|
***********************************************************************/
|
|
|
|
typedef struct _TwmKeyword {
|
|
char *name;
|
|
int value;
|
|
int subnum;
|
|
} TwmKeyword;
|
|
|
|
#define kw0_NoDefaults 1
|
|
#define kw0_AutoRelativeResize 2
|
|
#define kw0_ForceIcons 3
|
|
#define kw0_NoIconManagers 4
|
|
#define kw0_InterpolateMenuColors 6
|
|
#define kw0_NoVersion 7
|
|
#define kw0_SortIconManager 8
|
|
#define kw0_NoGrabServer 9
|
|
#define kw0_NoMenuShadows 10
|
|
#define kw0_NoRaiseOnMove 11
|
|
#define kw0_NoRaiseOnResize 12
|
|
#define kw0_NoRaiseOnDeiconify 13
|
|
#define kw0_DontMoveOff 14
|
|
#define kw0_NoBackingStore 15
|
|
#define kw0_NoSaveUnders 16
|
|
#define kw0_RestartPreviousState 17
|
|
#define kw0_ClientBorderWidth 18
|
|
#define kw0_NoTitleFocus 19
|
|
#define kw0_DecorateTransients 21
|
|
#define kw0_ShowIconManager 22
|
|
#define kw0_NoCaseSensitive 23
|
|
#define kw0_NoRaiseOnWarp 24
|
|
#define kw0_WarpUnmapped 25
|
|
#define kw0_ShowWorkspaceManager 27
|
|
#define kw0_StartInMapState 28
|
|
#define kw0_NoShowOccupyAll 29
|
|
#define kw0_AutoOccupy 30
|
|
#define kw0_TransientHasOccupation 31
|
|
#define kw0_DontPaintRootWindow 32
|
|
#define kw0_Use3DMenus 33
|
|
#define kw0_Use3DTitles 34
|
|
#define kw0_Use3DIconManagers 35
|
|
#define kw0_Use3DBorders 36
|
|
#define kw0_SunkFocusWindowTitle 37
|
|
#define kw0_BeNiceToColormap 38
|
|
#define kw0_WarpRingOnScreen 40
|
|
#define kw0_NoIconManagerFocus 41
|
|
#define kw0_StayUpMenus 42
|
|
#define kw0_ClickToFocus 43
|
|
#define kw0_BorderResizeCursors 44
|
|
#define kw0_ReallyMoveInWorkspaceManager 45
|
|
#define kw0_ShowWinWhenMovingInWmgr 46
|
|
#define kw0_Use3DWMap 47
|
|
#define kw0_ReverseCurrentWorkspace 48
|
|
#define kw0_DontWarpCursorInWMap 49
|
|
#define kw0_CenterFeedbackWindow 50
|
|
#define kw0_WarpToDefaultMenuEntry 51
|
|
#define kw0_ShrinkIconTitles 52
|
|
#define kw0_AutoRaiseIcons 53
|
|
#define kw0_use3DIconBorders 54
|
|
#define kw0_UseSunkTitlePixmap 55
|
|
#define kw0_ShortAllWindowsMenus 56
|
|
#define kw0_RaiseWhenAutoUnSqueeze 57
|
|
#define kw0_RaiseOnClick 58
|
|
#define kw0_IgnoreLockModifier 59
|
|
#define kw0_AutoFocusToTransients 60 /* kai */
|
|
#define kw0_PackNewWindows 61
|
|
#define kw0_IgnoreCaseInMenuSelection 62
|
|
#define kw0_SloppyFocus 63
|
|
#define kw0_NoImagesInWorkSpaceManager 64
|
|
#define kw0_NoWarpToMenuTitle 65
|
|
#define kw0_SaveWorkspaceFocus 66 /* blais */
|
|
#define kw0_RaiseOnWarp 67
|
|
|
|
#define kws_UsePPosition 1
|
|
#define kws_IconFont 2
|
|
#define kws_ResizeFont 3
|
|
#define kws_MenuFont 4
|
|
#define kws_TitleFont 5
|
|
#define kws_IconManagerFont 6
|
|
#define kws_UnknownIcon 7
|
|
#define kws_IconDirectory 8
|
|
#define kws_MaxWindowSize 9
|
|
#define kws_PixmapDirectory 10
|
|
/* RandomPlacement moved because it's now a string string keyword */
|
|
#define kws_IconJustification 12
|
|
#define kws_TitleJustification 13
|
|
#define kws_IconRegionJustification 14
|
|
#define kws_IconRegionAlignement 15
|
|
#ifdef SOUNDS
|
|
#define kws_SoundHost 16
|
|
#endif
|
|
#define kws_WMgrButtonStyle 17
|
|
#define kws_WorkSpaceFont 18
|
|
#define kws_IconifyStyle 19
|
|
|
|
#define kwss_RandomPlacement 1
|
|
|
|
#define kwn_ConstrainedMoveTime 1
|
|
#define kwn_MoveDelta 2
|
|
#define kwn_XorValue 3
|
|
#define kwn_FramePadding 4
|
|
#define kwn_TitlePadding 5
|
|
#define kwn_ButtonIndent 6
|
|
#define kwn_BorderWidth 7
|
|
#define kwn_IconBorderWidth 8
|
|
#define kwn_TitleButtonBorderWidth 9
|
|
#define kwn_RaiseDelay 10
|
|
#define kwn_TransientOnTop 11
|
|
#define kwn_OpaqueMoveThreshold 12
|
|
#define kwn_OpaqueResizeThreshold 13
|
|
#define kwn_WMgrVertButtonIndent 14
|
|
#define kwn_WMgrHorizButtonIndent 15
|
|
#define kwn_ClearShadowContrast 16
|
|
#define kwn_DarkShadowContrast 17
|
|
#define kwn_WMgrButtonShadowDepth 18
|
|
#define kwn_MaxIconTitleWidth 19
|
|
#define kwn_AnimationSpeed 20
|
|
#define kwn_ThreeDBorderWidth 21
|
|
#define kwn_MoveOffResistance 22
|
|
#define kwn_BorderShadowDepth 23
|
|
#define kwn_TitleShadowDepth 24
|
|
#define kwn_TitleButtonShadowDepth 25
|
|
#define kwn_MenuShadowDepth 26
|
|
#define kwn_IconManagerShadowDepth 27
|
|
#define kwn_MovePackResistance 28
|
|
#define kwn_XMoveGrid 29
|
|
#define kwn_YMoveGrid 30
|
|
#define kwn_OpenWindowTimeout 31
|
|
#define kwn_RaiseOnClickButton 32
|
|
|
|
#define kwn_BorderTop 33
|
|
#define kwn_BorderBottom 34
|
|
#define kwn_BorderLeft 35
|
|
#define kwn_BorderRight 36
|
|
|
|
#define kwcl_BorderColor 1
|
|
#define kwcl_IconManagerHighlight 2
|
|
#define kwcl_BorderTileForeground 3
|
|
#define kwcl_BorderTileBackground 4
|
|
#define kwcl_TitleForeground 5
|
|
#define kwcl_TitleBackground 6
|
|
#define kwcl_IconForeground 7
|
|
#define kwcl_IconBackground 8
|
|
#define kwcl_IconBorderColor 9
|
|
#define kwcl_IconManagerForeground 10
|
|
#define kwcl_IconManagerBackground 11
|
|
#define kwcl_MapWindowBackground 12
|
|
#define kwcl_MapWindowForeground 13
|
|
|
|
#define kwc_DefaultForeground 1
|
|
#define kwc_DefaultBackground 2
|
|
#define kwc_MenuForeground 3
|
|
#define kwc_MenuBackground 4
|
|
#define kwc_MenuTitleForeground 5
|
|
#define kwc_MenuTitleBackground 6
|
|
#define kwc_MenuShadowColor 7
|
|
|
|
/*
|
|
* The following is sorted alphabetically according to name (which must be
|
|
* in lowercase and only contain the letters a-z). It is fed to a binary
|
|
* search to parse keywords.
|
|
*/
|
|
static TwmKeyword keytable[] = {
|
|
{ "a", ALTER, 0 },
|
|
{ "all", ALL, 0 },
|
|
{ "alter", ALTER, 0 },
|
|
{ "alwaysontop", ALWAYS_ON_TOP, 0 },
|
|
{ "alwaysshowwindowwhenmovingfromworkspacemanager", KEYWORD, kw0_ShowWinWhenMovingInWmgr },
|
|
{ "alwayssqueezetogravity", ALWAYSSQUEEZETOGRAVITY, 0 },
|
|
{ "animationspeed", NKEYWORD, kwn_AnimationSpeed },
|
|
{ "autofocustotransients", KEYWORD, kw0_AutoFocusToTransients }, /* kai */
|
|
{ "autolower", AUTO_LOWER, 0 },
|
|
{ "autooccupy", KEYWORD, kw0_AutoOccupy },
|
|
{ "autoraise", AUTO_RAISE, 0 },
|
|
{ "autoraiseicons", KEYWORD, kw0_AutoRaiseIcons },
|
|
{ "autorelativeresize", KEYWORD, kw0_AutoRelativeResize },
|
|
{ "autosqueeze", AUTOSQUEEZE, 0 },
|
|
{ "benicetocolormap", KEYWORD, kw0_BeNiceToColormap },
|
|
{ "borderbottom", NKEYWORD, kwn_BorderBottom },
|
|
{ "bordercolor", CLKEYWORD, kwcl_BorderColor },
|
|
{ "borderleft", NKEYWORD, kwn_BorderLeft },
|
|
{ "borderresizecursors", KEYWORD, kw0_BorderResizeCursors },
|
|
{ "borderright", NKEYWORD, kwn_BorderRight },
|
|
{ "bordershadowdepth", NKEYWORD, kwn_BorderShadowDepth },
|
|
{ "bordertilebackground", CLKEYWORD, kwcl_BorderTileBackground },
|
|
{ "bordertileforeground", CLKEYWORD, kwcl_BorderTileForeground },
|
|
{ "bordertop", NKEYWORD, kwn_BorderTop },
|
|
{ "borderwidth", NKEYWORD, kwn_BorderWidth },
|
|
{ "button", BUTTON, 0 },
|
|
{ "buttonindent", NKEYWORD, kwn_ButtonIndent },
|
|
{ "c", CONTROL, 0 },
|
|
{ "center", JKEYWORD, J_CENTER },
|
|
{ "centerfeedbackwindow", KEYWORD, kw0_CenterFeedbackWindow },
|
|
{ "changeworkspacefunction", CHANGE_WORKSPACE_FUNCTION, 0 },
|
|
{ "clearshadowcontrast", NKEYWORD, kwn_ClearShadowContrast },
|
|
{ "clicktofocus", KEYWORD, kw0_ClickToFocus },
|
|
{ "clientborderwidth", KEYWORD, kw0_ClientBorderWidth },
|
|
{ "color", COLOR, 0 },
|
|
{ "constrainedmovetime", NKEYWORD, kwn_ConstrainedMoveTime },
|
|
{ "control", CONTROL, 0 },
|
|
{ "cursors", CURSORS, 0 },
|
|
{ "darkshadowcontrast", NKEYWORD, kwn_DarkShadowContrast },
|
|
{ "decoratetransients", KEYWORD, kw0_DecorateTransients },
|
|
{ "defaultbackground", CKEYWORD, kwc_DefaultBackground },
|
|
{ "defaultforeground", CKEYWORD, kwc_DefaultForeground },
|
|
{ "defaultfunction", DEFAULT_FUNCTION, 0 },
|
|
{ "deiconifyfunction", DEICONIFY_FUNCTION, 0 },
|
|
{ "destroy", KILL, 0 },
|
|
{ "donticonifybyunmapping", DONT_ICONIFY_BY_UNMAPPING, 0 },
|
|
{ "dontmoveoff", KEYWORD, kw0_DontMoveOff },
|
|
{ "dontpaintrootwindow", KEYWORD, kw0_DontPaintRootWindow },
|
|
{ "dontsave", DONT_SAVE, 0 },
|
|
{ "dontsetinactive", DONTSETINACTIVE, 0 },
|
|
{ "dontsqueezetitle", DONT_SQUEEZE_TITLE, 0 },
|
|
{ "donttoggleworkspacemanagerstate", DONTTOGGLEWORKSPACEMANAGERSTATE, 0 },
|
|
{ "dontwarpcursorinwmap", KEYWORD, kw0_DontWarpCursorInWMap },
|
|
{ "east", DKEYWORD, D_EAST },
|
|
{ "f", FRAME, 0 },
|
|
{ "f.addtoworkspace", FSKEYWORD, F_ADDTOWORKSPACE },
|
|
{ "f.adoptwindow", FKEYWORD, F_ADOPTWINDOW },
|
|
{ "f.altcontext", FKEYWORD, F_ALTCONTEXT },
|
|
{ "f.altkeymap", FSKEYWORD, F_ALTKEYMAP },
|
|
{ "f.autolower", FKEYWORD, F_AUTOLOWER },
|
|
{ "f.autoraise", FKEYWORD, F_AUTORAISE },
|
|
{ "f.backiconmgr", FKEYWORD, F_BACKICONMGR },
|
|
{ "f.backmapiconmgr", FKEYWORD, F_BACKMAPICONMGR },
|
|
{ "f.beep", FKEYWORD, F_BEEP },
|
|
{ "f.bottomzoom", FKEYWORD, F_BOTTOMZOOM },
|
|
{ "f.changesize", FSKEYWORD, F_CHANGESIZE },
|
|
{ "f.circledown", FKEYWORD, F_CIRCLEDOWN },
|
|
{ "f.circleup", FKEYWORD, F_CIRCLEUP },
|
|
{ "f.colormap", FSKEYWORD, F_COLORMAP },
|
|
{ "f.cut", FSKEYWORD, F_CUT },
|
|
{ "f.cutfile", FKEYWORD, F_CUTFILE },
|
|
{ "f.deiconify", FKEYWORD, F_DEICONIFY },
|
|
{ "f.delete", FKEYWORD, F_DELETE },
|
|
{ "f.deleteordestroy", FKEYWORD, F_DELETEORDESTROY },
|
|
{ "f.deltastop", FKEYWORD, F_DELTASTOP },
|
|
{ "f.destroy", FKEYWORD, F_DESTROY },
|
|
{ "f.downiconmgr", FKEYWORD, F_DOWNICONMGR },
|
|
{ "f.downworkspace", FKEYWORD, F_DOWNWORKSPACE },
|
|
{ "f.exec", FSKEYWORD, F_EXEC },
|
|
{ "f.file", FSKEYWORD, F_FILE },
|
|
{ "f.fill", FSKEYWORD, F_FILL },
|
|
{ "f.fittocontent", FKEYWORD, F_FITTOCONTENT },
|
|
{ "f.focus", FKEYWORD, F_FOCUS },
|
|
{ "f.forcemove", FKEYWORD, F_FORCEMOVE },
|
|
{ "f.forwiconmgr", FKEYWORD, F_FORWICONMGR },
|
|
{ "f.forwmapiconmgr", FKEYWORD, F_FORWMAPICONMGR },
|
|
{ "f.fullzoom", FKEYWORD, F_FULLZOOM },
|
|
{ "f.function", FSKEYWORD, F_FUNCTION },
|
|
{ "f.gotoworkspace", FSKEYWORD, F_GOTOWORKSPACE },
|
|
{ "f.hbzoom", FKEYWORD, F_BOTTOMZOOM },
|
|
{ "f.hideiconmgr", FKEYWORD, F_HIDELIST },
|
|
{ "f.hideworkspacemgr", FKEYWORD, F_HIDEWORKMGR },
|
|
{ "f.horizoom", FKEYWORD, F_HORIZOOM },
|
|
{ "f.htzoom", FKEYWORD, F_TOPZOOM },
|
|
{ "f.hypermove", FKEYWORD, F_HYPERMOVE },
|
|
{ "f.hzoom", FKEYWORD, F_HORIZOOM },
|
|
{ "f.iconify", FKEYWORD, F_ICONIFY },
|
|
{ "f.identify", FKEYWORD, F_IDENTIFY },
|
|
{ "f.initsize", FKEYWORD, F_INITSIZE },
|
|
{ "f.jumpdown", FSKEYWORD, F_JUMPDOWN },
|
|
{ "f.jumpleft", FSKEYWORD, F_JUMPLEFT },
|
|
{ "f.jumpright", FSKEYWORD, F_JUMPRIGHT },
|
|
{ "f.jumpup", FSKEYWORD, F_JUMPUP },
|
|
{ "f.lefticonmgr", FKEYWORD, F_LEFTICONMGR },
|
|
{ "f.leftworkspace", FKEYWORD, F_LEFTWORKSPACE },
|
|
{ "f.leftzoom", FKEYWORD, F_LEFTZOOM },
|
|
{ "f.lower", FKEYWORD, F_LOWER },
|
|
{ "f.menu", FSKEYWORD, F_MENU },
|
|
{ "f.move", FKEYWORD, F_MOVE },
|
|
{ "f.movemenu", FKEYWORD, F_MOVEMENU },
|
|
{ "f.movepack", FKEYWORD, F_MOVEPACK },
|
|
{ "f.movepush", FKEYWORD, F_MOVEPUSH },
|
|
{ "f.moveresize", FSKEYWORD, F_MOVERESIZE },
|
|
{ "f.movetitlebar", FKEYWORD, F_MOVETITLEBAR },
|
|
{ "f.movetonextworkspace", FKEYWORD, F_MOVETONEXTWORKSPACE },
|
|
{ "f.movetonextworkspaceandfollow", FKEYWORD, F_MOVETONEXTWORKSPACEANDFOLLOW },
|
|
{ "f.movetoprevworkspace", FKEYWORD, F_MOVETOPREVWORKSPACE },
|
|
{ "f.movetoprevworkspaceandfollow", FKEYWORD, F_MOVETOPREVWORKSPACEANDFOLLOW },
|
|
{ "f.nexticonmgr", FKEYWORD, F_NEXTICONMGR },
|
|
{ "f.nextworkspace", FKEYWORD, F_NEXTWORKSPACE },
|
|
{ "f.nop", FKEYWORD, F_NOP },
|
|
{ "f.occupy", FKEYWORD, F_OCCUPY },
|
|
{ "f.occupyall", FKEYWORD, F_OCCUPYALL },
|
|
{ "f.pack", FSKEYWORD, F_PACK },
|
|
{ "f.pin", FKEYWORD, F_PIN },
|
|
{ "f.previconmgr", FKEYWORD, F_PREVICONMGR },
|
|
{ "f.prevworkspace", FKEYWORD, F_PREVWORKSPACE },
|
|
{ "f.quit", FKEYWORD, F_QUIT },
|
|
{ "f.raise", FKEYWORD, F_RAISE },
|
|
{ "f.raiseicons", FKEYWORD, F_RAISEICONS },
|
|
{ "f.raiselower", FKEYWORD, F_RAISELOWER },
|
|
{ "f.refresh", FKEYWORD, F_REFRESH },
|
|
{ "f.removefromworkspace", FSKEYWORD, F_REMOVEFROMWORKSPACE },
|
|
#ifdef SOUNDS
|
|
{ "f.rereadsounds", FKEYWORD, F_REREADSOUNDS },
|
|
#endif
|
|
{ "f.resize", FKEYWORD, F_RESIZE },
|
|
{ "f.restart", FKEYWORD, F_RESTART },
|
|
{ "f.restoregeometry", FKEYWORD, F_RESTOREGEOMETRY },
|
|
{ "f.righticonmgr", FKEYWORD, F_RIGHTICONMGR },
|
|
{ "f.rightworkspace", FKEYWORD, F_RIGHTWORKSPACE },
|
|
{ "f.rightzoom", FKEYWORD, F_RIGHTZOOM },
|
|
{ "f.ring", FKEYWORD, F_RING },
|
|
{ "f.savegeometry", FKEYWORD, F_SAVEGEOMETRY },
|
|
{ "f.saveyourself", FKEYWORD, F_SAVEYOURSELF },
|
|
{ "f.separator", FKEYWORD, F_SEPARATOR },
|
|
{ "f.setbuttonsstate", FKEYWORD, F_SETBUTTONSTATE },
|
|
{ "f.setmapstate", FKEYWORD, F_SETMAPSTATE },
|
|
{ "f.showbackground", FKEYWORD, F_SHOWBGRD },
|
|
{ "f.showiconmgr", FKEYWORD, F_SHOWLIST },
|
|
{ "f.showworkspacemgr", FKEYWORD, F_SHOWWORKMGR },
|
|
{ "f.slowdownanimation", FKEYWORD, F_SLOWDOWNANIMATION },
|
|
{ "f.sorticonmgr", FKEYWORD, F_SORTICONMGR },
|
|
{ "f.source", FSKEYWORD, F_BEEP }, /* XXX - don't work */
|
|
{ "f.speedupanimation", FKEYWORD, F_SPEEDUPANIMATION },
|
|
{ "f.squeeze", FKEYWORD, F_SQUEEZE },
|
|
{ "f.startanimation", FKEYWORD, F_STARTANIMATION },
|
|
{ "f.stopanimation", FKEYWORD, F_STOPANIMATION },
|
|
{ "f.title", FKEYWORD, F_TITLE },
|
|
{ "f.toggleoccupation", FSKEYWORD, F_TOGGLEOCCUPATION },
|
|
#ifdef SOUNDS
|
|
{ "f.togglesound", FKEYWORD, F_TOGGLESOUND },
|
|
#endif
|
|
{ "f.togglestate", FKEYWORD, F_TOGGLESTATE },
|
|
{ "f.toggleworkspacemgr", FKEYWORD, F_TOGGLEWORKMGR },
|
|
{ "f.topzoom", FKEYWORD, F_TOPZOOM },
|
|
{ "f.trace", FSKEYWORD, F_TRACE },
|
|
{ "f.twmrc", FKEYWORD, F_RESTART },
|
|
{ "f.unfocus", FKEYWORD, F_UNFOCUS },
|
|
{ "f.upiconmgr", FKEYWORD, F_UPICONMGR },
|
|
{ "f.upworkspace", FKEYWORD, F_UPWORKSPACE },
|
|
{ "f.vanish", FKEYWORD, F_VANISH },
|
|
{ "f.version", FKEYWORD, F_VERSION },
|
|
{ "f.vlzoom", FKEYWORD, F_LEFTZOOM },
|
|
{ "f.vrzoom", FKEYWORD, F_RIGHTZOOM },
|
|
{ "f.warphere", FSKEYWORD, F_WARPHERE },
|
|
{ "f.warpring", FSKEYWORD, F_WARPRING },
|
|
{ "f.warpto", FSKEYWORD, F_WARPTO },
|
|
{ "f.warptoiconmgr", FSKEYWORD, F_WARPTOICONMGR },
|
|
{ "f.warptoscreen", FSKEYWORD, F_WARPTOSCREEN },
|
|
{ "f.winrefresh", FKEYWORD, F_WINREFRESH },
|
|
{ "f.zoom", FKEYWORD, F_ZOOM },
|
|
{ "forceicons", KEYWORD, kw0_ForceIcons },
|
|
{ "frame", FRAME, 0 },
|
|
{ "framepadding", NKEYWORD, kwn_FramePadding },
|
|
{ "function", FUNCTION, 0 },
|
|
{ "i", ICON, 0 },
|
|
{ "icon", ICON, 0 },
|
|
{ "iconbackground", CLKEYWORD, kwcl_IconBackground },
|
|
{ "iconbordercolor", CLKEYWORD, kwcl_IconBorderColor },
|
|
{ "iconborderwidth", NKEYWORD, kwn_IconBorderWidth },
|
|
{ "icondirectory", SKEYWORD, kws_IconDirectory },
|
|
{ "iconfont", SKEYWORD, kws_IconFont },
|
|
{ "iconforeground", CLKEYWORD, kwcl_IconForeground },
|
|
{ "iconifybyunmapping", ICONIFY_BY_UNMAPPING, 0 },
|
|
{ "iconifyfunction", ICONIFY_FUNCTION, 0 },
|
|
{ "iconifystyle", SKEYWORD, kws_IconifyStyle },
|
|
{ "iconjustification", SKEYWORD, kws_IconJustification },
|
|
{ "iconmanagerbackground", CLKEYWORD, kwcl_IconManagerBackground },
|
|
{ "iconmanagerdontshow", ICONMGR_NOSHOW, 0 },
|
|
{ "iconmanagerfont", SKEYWORD, kws_IconManagerFont },
|
|
{ "iconmanagerforeground", CLKEYWORD, kwcl_IconManagerForeground },
|
|
{ "iconmanagergeometry", ICONMGR_GEOMETRY, 0 },
|
|
{ "iconmanagerhighlight", CLKEYWORD, kwcl_IconManagerHighlight },
|
|
{ "iconmanagers", ICONMGRS, 0 },
|
|
{ "iconmanagershadowdepth", NKEYWORD, kwn_IconManagerShadowDepth },
|
|
{ "iconmanagershow", ICONMGR_SHOW, 0 },
|
|
{ "iconmenudontshow", ICONMENU_DONTSHOW, 0 },
|
|
{ "iconmgr", ICONMGR, 0 },
|
|
{ "iconregion", ICON_REGION, 0 },
|
|
{ "iconregionalignement", SKEYWORD, kws_IconRegionAlignement },
|
|
{ "iconregionjustification",SKEYWORD, kws_IconRegionJustification },
|
|
{ "icons", ICONS, 0 },
|
|
{ "ignorecaseinmenuselection", KEYWORD, kw0_IgnoreCaseInMenuSelection },
|
|
{ "ignorelockmodifier", KEYWORD, kw0_IgnoreLockModifier },
|
|
{ "ignoremodifier", IGNOREMODIFIER, 0 },
|
|
{ "ignoretransient", IGNORE_TRANSIENT, 0 },
|
|
{ "interpolatemenucolors", KEYWORD, kw0_InterpolateMenuColors },
|
|
{ "l", LOCK, 0 },
|
|
{ "left", JKEYWORD, J_LEFT },
|
|
{ "lefttitlebutton", LEFT_TITLEBUTTON, 0 },
|
|
{ "lock", LOCK, 0 },
|
|
{ "m", META, 0 },
|
|
{ "maketitle", MAKE_TITLE, 0 },
|
|
{ "mapwindowbackground", CLKEYWORD, kwcl_MapWindowBackground },
|
|
{ "mapwindowcurrentworkspace", MAPWINDOWCURRENTWORKSPACE, 0},
|
|
{ "mapwindowdefaultworkspace", MAPWINDOWDEFAULTWORKSPACE, 0},
|
|
{ "mapwindowforeground", CLKEYWORD, kwcl_MapWindowForeground },
|
|
{ "maxicontitlewidth", NKEYWORD, kwn_MaxIconTitleWidth },
|
|
{ "maxwindowsize", SKEYWORD, kws_MaxWindowSize },
|
|
{ "menu", MENU, 0 },
|
|
{ "menubackground", CKEYWORD, kwc_MenuBackground },
|
|
{ "menufont", SKEYWORD, kws_MenuFont },
|
|
{ "menuforeground", CKEYWORD, kwc_MenuForeground },
|
|
{ "menushadowcolor", CKEYWORD, kwc_MenuShadowColor },
|
|
{ "menushadowdepth", NKEYWORD, kwn_MenuShadowDepth },
|
|
{ "menutitlebackground", CKEYWORD, kwc_MenuTitleBackground },
|
|
{ "menutitleforeground", CKEYWORD, kwc_MenuTitleForeground },
|
|
{ "meta", META, 0 },
|
|
{ "mod", META, 0 }, /* fake it */
|
|
{ "monochrome", MONOCHROME, 0 },
|
|
{ "move", MOVE, 0 },
|
|
{ "movedelta", NKEYWORD, kwn_MoveDelta },
|
|
{ "moveoffresistance", NKEYWORD, kwn_MoveOffResistance },
|
|
{ "movepackresistance", NKEYWORD, kwn_MovePackResistance },
|
|
{ "nobackingstore", KEYWORD, kw0_NoBackingStore },
|
|
{ "noborder", NO_BORDER, 0 },
|
|
{ "nocasesensitive", KEYWORD, kw0_NoCaseSensitive },
|
|
{ "nodefaults", KEYWORD, kw0_NoDefaults },
|
|
{ "nograbserver", KEYWORD, kw0_NoGrabServer },
|
|
{ "nohighlight", NO_HILITE, 0 },
|
|
{ "noiconmanagerfocus", KEYWORD, kw0_NoIconManagerFocus },
|
|
{ "noiconmanagers", KEYWORD, kw0_NoIconManagers },
|
|
{ "noicontitle", NO_ICON_TITLE, 0 },
|
|
{ "noimagesinworkspacemanager", KEYWORD, kw0_NoImagesInWorkSpaceManager },
|
|
{ "nomenushadows", KEYWORD, kw0_NoMenuShadows },
|
|
{ "noopaquemove", NOOPAQUEMOVE, 0 },
|
|
{ "noopaqueresize", NOOPAQUERESIZE, 0 },
|
|
{ "noraiseondeiconify", KEYWORD, kw0_NoRaiseOnDeiconify },
|
|
{ "noraiseonmove", KEYWORD, kw0_NoRaiseOnMove },
|
|
{ "noraiseonresize", KEYWORD, kw0_NoRaiseOnResize },
|
|
{ "noraiseonwarp", KEYWORD, kw0_NoRaiseOnWarp },
|
|
{ "north", DKEYWORD, D_NORTH },
|
|
{ "nosaveunders", KEYWORD, kw0_NoSaveUnders },
|
|
{ "noshowoccupyall", KEYWORD, kw0_NoShowOccupyAll },
|
|
{ "nostackmode", NO_STACKMODE, 0 },
|
|
{ "notitle", NO_TITLE, 0 },
|
|
{ "notitlefocus", KEYWORD, kw0_NoTitleFocus },
|
|
{ "notitlehighlight", NO_TITLE_HILITE, 0 },
|
|
{ "noversion", KEYWORD, kw0_NoVersion },
|
|
{ "nowarptomenutitle", KEYWORD, kw0_NoWarpToMenuTitle },
|
|
{ "occupy", OCCUPYLIST, 0 },
|
|
{ "occupyall", OCCUPYALL, 0 },
|
|
{ "opaquemove", OPAQUEMOVE, 0 },
|
|
{ "opaquemovethreshold", NKEYWORD, kwn_OpaqueMoveThreshold },
|
|
{ "opaqueresize", OPAQUERESIZE, 0 },
|
|
{ "opaqueresizethreshold", NKEYWORD, kwn_OpaqueResizeThreshold },
|
|
{ "openwindowtimeout", NKEYWORD, kwn_OpenWindowTimeout },
|
|
{ "packnewwindows", KEYWORD, kw0_PackNewWindows },
|
|
{ "pixmapdirectory", SKEYWORD, kws_PixmapDirectory },
|
|
{ "pixmaps", PIXMAPS, 0 },
|
|
{ "r", ROOT, 0 },
|
|
{ "raisedelay", NKEYWORD, kwn_RaiseDelay },
|
|
{ "raiseonclick", KEYWORD, kw0_RaiseOnClick },
|
|
{ "raiseonclickbutton", NKEYWORD, kwn_RaiseOnClickButton },
|
|
{ "raiseonwarp", KEYWORD, kw0_RaiseOnWarp },
|
|
{ "raisewhenautounsqueeze", KEYWORD, kw0_RaiseWhenAutoUnSqueeze },
|
|
{ "randomplacement", SSKEYWORD, kwss_RandomPlacement },
|
|
{ "reallymoveinworkspacemanager", KEYWORD, kw0_ReallyMoveInWorkspaceManager },
|
|
{ "resize", RESIZE, 0 },
|
|
{ "resizefont", SKEYWORD, kws_ResizeFont },
|
|
{ "restartpreviousstate", KEYWORD, kw0_RestartPreviousState },
|
|
{ "reversecurrentworkspace",KEYWORD, kw0_ReverseCurrentWorkspace },
|
|
{ "right", JKEYWORD, J_RIGHT },
|
|
{ "righttitlebutton", RIGHT_TITLEBUTTON, 0 },
|
|
{ "root", ROOT, 0 },
|
|
{ "s", SHIFT, 0 },
|
|
{ "savecolor", SAVECOLOR, 0},
|
|
{ "saveworkspacefocus", KEYWORD, kw0_SaveWorkspaceFocus },
|
|
{ "schrinkicontitles", KEYWORD, kw0_ShrinkIconTitles },
|
|
{ "select", SELECT, 0 },
|
|
{ "shift", SHIFT, 0 },
|
|
{ "shortallwindowsmenus", KEYWORD, kw0_ShortAllWindowsMenus },
|
|
{ "showiconmanager", KEYWORD, kw0_ShowIconManager },
|
|
{ "showworkspacemanager", KEYWORD, kw0_ShowWorkspaceManager },
|
|
{ "shrinkicontitles", KEYWORD, kw0_ShrinkIconTitles },
|
|
{ "sloppyfocus", KEYWORD, kw0_SloppyFocus },
|
|
{ "sorticonmanager", KEYWORD, kw0_SortIconManager },
|
|
#ifdef SOUNDS
|
|
{ "soundhost", SKEYWORD, kws_SoundHost },
|
|
#endif
|
|
{ "south", DKEYWORD, D_SOUTH },
|
|
{ "squeezetitle", SQUEEZE_TITLE, 0 },
|
|
{ "starticonified", START_ICONIFIED, 0 },
|
|
{ "startinmapstate", KEYWORD, kw0_StartInMapState },
|
|
{ "startsqueezed", STARTSQUEEZED, 0 },
|
|
{ "stayupmenus", KEYWORD, kw0_StayUpMenus },
|
|
{ "sunkfocuswindowtitle", KEYWORD, kw0_SunkFocusWindowTitle },
|
|
{ "t", TITLE, 0 },
|
|
{ "threedborderwidth", NKEYWORD, kwn_ThreeDBorderWidth },
|
|
{ "title", TITLE, 0 },
|
|
{ "titlebackground", CLKEYWORD, kwcl_TitleBackground },
|
|
{ "titlebuttonborderwidth", NKEYWORD, kwn_TitleButtonBorderWidth },
|
|
{ "titlebuttonshadowdepth", NKEYWORD, kwn_TitleButtonShadowDepth },
|
|
{ "titlefont", SKEYWORD, kws_TitleFont },
|
|
{ "titleforeground", CLKEYWORD, kwcl_TitleForeground },
|
|
{ "titlehighlight", TITLE_HILITE, 0 },
|
|
{ "titlejustification", SKEYWORD, kws_TitleJustification },
|
|
{ "titlepadding", NKEYWORD, kwn_TitlePadding },
|
|
{ "titleshadowdepth", NKEYWORD, kwn_TitleShadowDepth },
|
|
{ "transienthasoccupation", KEYWORD, kw0_TransientHasOccupation },
|
|
{ "transientontop", NKEYWORD, kwn_TransientOnTop },
|
|
{ "unknownicon", SKEYWORD, kws_UnknownIcon },
|
|
{ "unmapbymovingfaraway", UNMAPBYMOVINGFARAWAY, 0 },
|
|
{ "usepposition", SKEYWORD, kws_UsePPosition },
|
|
{ "usesunktitlepixmap", KEYWORD, kw0_UseSunkTitlePixmap },
|
|
{ "usethreedborders", KEYWORD, kw0_Use3DBorders },
|
|
{ "usethreediconborders", KEYWORD, kw0_use3DIconBorders },
|
|
{ "usethreediconmanagers", KEYWORD, kw0_Use3DIconManagers },
|
|
{ "usethreedmenus", KEYWORD, kw0_Use3DMenus },
|
|
{ "usethreedtitles", KEYWORD, kw0_Use3DTitles },
|
|
{ "usethreedwmap", KEYWORD, kw0_Use3DWMap },
|
|
{ "virtualscreens", VIRTUAL_SCREENS, 0 },
|
|
{ "w", WINDOW, 0 },
|
|
{ "wait", WAITC, 0 },
|
|
{ "warpcursor", WARP_CURSOR, 0 },
|
|
{ "warpringonscreen", KEYWORD, kw0_WarpRingOnScreen },
|
|
{ "warptodefaultmenuentry", KEYWORD, kw0_WarpToDefaultMenuEntry },
|
|
{ "warpunmapped", KEYWORD, kw0_WarpUnmapped },
|
|
{ "west", DKEYWORD, D_WEST },
|
|
{ "window", WINDOW, 0 },
|
|
{ "windowbox", WINDOW_BOX, 0 },
|
|
{ "windowfunction", WINDOW_FUNCTION, 0 },
|
|
{ "windowgeometries", WINDOW_GEOMETRIES, 0 },
|
|
{ "windowregion", WINDOW_REGION, 0 },
|
|
{ "windowring", WINDOW_RING, 0 },
|
|
{ "windowringexclude", WINDOW_RING_EXCLUDE, 0},
|
|
{ "wmgrbuttonshadowdepth", NKEYWORD, kwn_WMgrButtonShadowDepth },
|
|
{ "wmgrbuttonstyle", SKEYWORD, kws_WMgrButtonStyle },
|
|
{ "wmgrhorizbuttonindent", NKEYWORD, kwn_WMgrHorizButtonIndent },
|
|
{ "wmgrvertbuttonindent", NKEYWORD, kwn_WMgrVertButtonIndent },
|
|
{ "workspace", WORKSPACE, 0 },
|
|
{ "workspacefont", SKEYWORD, kws_WorkSpaceFont },
|
|
{ "workspacemanagergeometry", WORKSPCMGR_GEOMETRY, 0 },
|
|
{ "workspaces", WORKSPACES, 0},
|
|
{ "xmovegrid", NKEYWORD, kwn_XMoveGrid },
|
|
{ "xorvalue", NKEYWORD, kwn_XorValue },
|
|
{ "xpmicondirectory", SKEYWORD, kws_PixmapDirectory },
|
|
{ "ymovegrid", NKEYWORD, kwn_YMoveGrid },
|
|
{ "zoom", ZOOM, 0 },
|
|
};
|
|
|
|
static int numkeywords = (sizeof(keytable)/sizeof(keytable[0]));
|
|
|
|
int parse_keyword (char *s, int *nump)
|
|
{
|
|
register int lower = 0, upper = numkeywords - 1;
|
|
|
|
XmuCopyISOLatin1Lowered (s, s);
|
|
while (lower <= upper) {
|
|
int middle = (lower + upper) / 2;
|
|
TwmKeyword *p = &keytable[middle];
|
|
int res = strcmp (p->name, s);
|
|
|
|
if (res < 0) {
|
|
lower = middle + 1;
|
|
} else if (res == 0) {
|
|
*nump = p->subnum;
|
|
return p->value;
|
|
} else {
|
|
upper = middle - 1;
|
|
}
|
|
}
|
|
return ERRORTOKEN;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* action routines called by grammar
|
|
*/
|
|
|
|
int do_single_keyword (int keyword)
|
|
{
|
|
switch (keyword) {
|
|
case kw0_NoDefaults:
|
|
Scr->NoDefaults = TRUE;
|
|
return 1;
|
|
|
|
case kw0_AutoRelativeResize:
|
|
Scr->AutoRelativeResize = TRUE;
|
|
return 1;
|
|
|
|
case kw0_ForceIcons:
|
|
if (Scr->FirstTime) Scr->ForceIcon = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoIconManagers:
|
|
Scr->NoIconManagers = TRUE;
|
|
return 1;
|
|
|
|
case kw0_InterpolateMenuColors:
|
|
if (Scr->FirstTime) Scr->InterpolateMenuColors = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoVersion:
|
|
/* obsolete */
|
|
return 1;
|
|
|
|
case kw0_SortIconManager:
|
|
if (Scr->FirstTime) Scr->SortIconMgr = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoGrabServer:
|
|
Scr->NoGrabServer = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoMenuShadows:
|
|
if (Scr->FirstTime) Scr->Shadow = FALSE;
|
|
return 1;
|
|
|
|
case kw0_NoRaiseOnMove:
|
|
if (Scr->FirstTime) Scr->NoRaiseMove = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoRaiseOnResize:
|
|
if (Scr->FirstTime) Scr->NoRaiseResize = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoRaiseOnDeiconify:
|
|
if (Scr->FirstTime) Scr->NoRaiseDeicon = TRUE;
|
|
return 1;
|
|
|
|
case kw0_DontMoveOff:
|
|
Scr->DontMoveOff = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoBackingStore:
|
|
Scr->BackingStore = FALSE;
|
|
return 1;
|
|
|
|
case kw0_NoSaveUnders:
|
|
Scr->SaveUnder = FALSE;
|
|
return 1;
|
|
|
|
case kw0_RestartPreviousState:
|
|
RestartPreviousState = True;
|
|
return 1;
|
|
|
|
case kw0_ClientBorderWidth:
|
|
if (Scr->FirstTime) Scr->ClientBorderWidth = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoTitleFocus:
|
|
Scr->TitleFocus = TRUE /*FALSE*/;
|
|
return 1;
|
|
|
|
case kw0_DecorateTransients:
|
|
Scr->DecorateTransients = TRUE;
|
|
return 1;
|
|
|
|
case kw0_ShowIconManager:
|
|
Scr->ShowIconManager = TRUE;
|
|
return 1;
|
|
|
|
case kw0_ShowWorkspaceManager:
|
|
Scr->ShowWorkspaceManager = TRUE;
|
|
return 1;
|
|
|
|
case kw0_StartInMapState:
|
|
Scr->workSpaceMgr.initialstate = MAPSTATE;
|
|
return 1;
|
|
|
|
case kw0_NoShowOccupyAll:
|
|
Scr->workSpaceMgr.noshowoccupyall = TRUE;
|
|
return 1;
|
|
|
|
case kw0_AutoOccupy:
|
|
Scr->AutoOccupy = TRUE;
|
|
return 1;
|
|
|
|
case kw0_TransientHasOccupation:
|
|
Scr->TransientHasOccupation = TRUE;
|
|
return 1;
|
|
|
|
case kw0_DontPaintRootWindow:
|
|
Scr->DontPaintRootWindow = TRUE;
|
|
return 1;
|
|
|
|
case kw0_UseSunkTitlePixmap:
|
|
Scr->UseSunkTitlePixmap = TRUE;
|
|
return 1;
|
|
|
|
case kw0_Use3DBorders:
|
|
Scr->use3Dborders = TRUE;
|
|
return 1;
|
|
|
|
case kw0_Use3DIconManagers:
|
|
Scr->use3Diconmanagers = TRUE;
|
|
return 1;
|
|
|
|
case kw0_Use3DMenus:
|
|
Scr->use3Dmenus = TRUE;
|
|
return 1;
|
|
|
|
case kw0_Use3DTitles:
|
|
Scr->use3Dtitles = TRUE;
|
|
return 1;
|
|
|
|
case kw0_Use3DWMap:
|
|
Scr->use3Dwmap = TRUE;
|
|
return 1;
|
|
|
|
case kw0_SunkFocusWindowTitle:
|
|
Scr->SunkFocusWindowTitle = TRUE;
|
|
return 1;
|
|
|
|
case kw0_BeNiceToColormap:
|
|
Scr->BeNiceToColormap = TRUE;
|
|
return 1;
|
|
|
|
case kw0_BorderResizeCursors:
|
|
Scr->BorderCursors = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoCaseSensitive:
|
|
Scr->CaseSensitive = FALSE;
|
|
return 1;
|
|
|
|
case kw0_NoRaiseOnWarp:
|
|
Scr->RaiseOnWarp = FALSE;
|
|
return 1;
|
|
|
|
case kw0_RaiseOnWarp:
|
|
Scr->RaiseOnWarp = TRUE;
|
|
return 1;
|
|
|
|
case kw0_WarpUnmapped:
|
|
Scr->WarpUnmapped = TRUE;
|
|
return 1;
|
|
|
|
case kw0_WarpRingOnScreen:
|
|
Scr->WarpRingAnyWhere = FALSE;
|
|
return 1;
|
|
|
|
case kw0_NoIconManagerFocus:
|
|
Scr->IconManagerFocus = FALSE;
|
|
return 1;
|
|
|
|
case kw0_StayUpMenus:
|
|
Scr->StayUpMenus = TRUE;
|
|
return 1;
|
|
|
|
case kw0_ClickToFocus:
|
|
Scr->ClickToFocus = TRUE;
|
|
return 1;
|
|
|
|
case kw0_ReallyMoveInWorkspaceManager:
|
|
Scr->ReallyMoveInWorkspaceManager = TRUE;
|
|
return 1;
|
|
|
|
case kw0_ShowWinWhenMovingInWmgr:
|
|
Scr->ShowWinWhenMovingInWmgr = TRUE;
|
|
return 1;
|
|
|
|
case kw0_ReverseCurrentWorkspace:
|
|
Scr->ReverseCurrentWorkspace = TRUE;
|
|
return 1;
|
|
|
|
case kw0_DontWarpCursorInWMap:
|
|
Scr->DontWarpCursorInWMap = TRUE;
|
|
return 1;
|
|
|
|
case kw0_CenterFeedbackWindow:
|
|
Scr->CenterFeedbackWindow = TRUE;
|
|
return 1;
|
|
|
|
case kw0_WarpToDefaultMenuEntry:
|
|
Scr->WarpToDefaultMenuEntry = TRUE;
|
|
return 1;
|
|
|
|
case kw0_ShrinkIconTitles:
|
|
Scr->ShrinkIconTitles = TRUE;
|
|
return 1;
|
|
|
|
case kw0_AutoRaiseIcons:
|
|
Scr->AutoRaiseIcons = TRUE;
|
|
return 1;
|
|
|
|
/* kai */
|
|
case kw0_AutoFocusToTransients:
|
|
Scr->AutoFocusToTransients = TRUE;
|
|
return 1;
|
|
|
|
case kw0_use3DIconBorders:
|
|
Scr->use3Diconborders = TRUE;
|
|
return 1;
|
|
|
|
case kw0_ShortAllWindowsMenus:
|
|
Scr->ShortAllWindowsMenus = TRUE;
|
|
return 1;
|
|
|
|
case kw0_RaiseWhenAutoUnSqueeze:
|
|
Scr->RaiseWhenAutoUnSqueeze = TRUE;
|
|
return 1;
|
|
|
|
case kw0_RaiseOnClick:
|
|
Scr->RaiseOnClick = TRUE;
|
|
return 1;
|
|
|
|
case kw0_IgnoreLockModifier:
|
|
Scr->IgnoreLockModifier = TRUE;
|
|
return 1;
|
|
|
|
case kw0_PackNewWindows:
|
|
Scr->PackNewWindows = TRUE;
|
|
return 1;
|
|
|
|
case kw0_IgnoreCaseInMenuSelection:
|
|
Scr->IgnoreCaseInMenuSelection = TRUE;
|
|
return 1;
|
|
|
|
case kw0_SloppyFocus:
|
|
Scr->SloppyFocus = TRUE;
|
|
return 1;
|
|
|
|
case kw0_SaveWorkspaceFocus:
|
|
Scr->SaveWorkspaceFocus = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoImagesInWorkSpaceManager:
|
|
Scr->NoImagesInWorkSpaceManager = TRUE;
|
|
return 1;
|
|
|
|
case kw0_NoWarpToMenuTitle:
|
|
Scr->NoWarpToMenuTitle = TRUE;
|
|
return 1;
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int do_string_string_keyword (int keyword, char *s1, char *s2)
|
|
{
|
|
switch (keyword) {
|
|
case kwss_RandomPlacement:
|
|
{
|
|
int rp = ParseRandomPlacement (s1);
|
|
if (rp < 0) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr,
|
|
"ignoring invalid RandomPlacement argument 1 \"%s\"\n", s1);
|
|
} else {
|
|
Scr->RandomPlacement = rp;
|
|
}
|
|
}
|
|
{
|
|
if (strcmp (s2, "default") == 0) return 1;
|
|
JunkMask = XParseGeometry (s2, &JunkX, &JunkY, &JunkWidth, &JunkHeight);
|
|
#ifdef DEBUG
|
|
fprintf (stderr, "DEBUG:: JunkMask = %x, WidthValue = %x, HeightValue = %x\n", JunkMask, WidthValue, HeightValue);
|
|
fprintf (stderr, "DEBUG:: JunkX = %d, JunkY = %d\n", JunkX, JunkY);
|
|
#endif
|
|
if ((JunkMask & (XValue | YValue)) !=
|
|
(XValue | YValue)) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr,
|
|
"ignoring invalid RandomPlacement displacement \"%s\"\n", s2);
|
|
} else {
|
|
Scr->RandomDisplacementX = JunkX;
|
|
Scr->RandomDisplacementY = JunkY;
|
|
}
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int do_string_keyword (int keyword, char *s)
|
|
{
|
|
switch (keyword) {
|
|
case kws_UsePPosition:
|
|
{
|
|
int ppos = ParseUsePPosition (s);
|
|
if (ppos < 0) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr,
|
|
"ignoring invalid UsePPosition argument \"%s\"\n", s);
|
|
} else {
|
|
Scr->UsePPosition = ppos;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
case kws_IconFont:
|
|
if (!Scr->HaveFonts) Scr->IconFont.basename = s;
|
|
return 1;
|
|
|
|
case kws_ResizeFont:
|
|
if (!Scr->HaveFonts) Scr->SizeFont.basename = s;
|
|
return 1;
|
|
|
|
case kws_MenuFont:
|
|
if (!Scr->HaveFonts) Scr->MenuFont.basename = s;
|
|
return 1;
|
|
|
|
case kws_WorkSpaceFont:
|
|
if (!Scr->HaveFonts) Scr->workSpaceMgr.windowFont.basename = s;
|
|
return 1;
|
|
|
|
case kws_TitleFont:
|
|
if (!Scr->HaveFonts) Scr->TitleBarFont.basename = s;
|
|
return 1;
|
|
|
|
case kws_IconManagerFont:
|
|
if (!Scr->HaveFonts) Scr->IconManagerFont.basename = s;
|
|
return 1;
|
|
|
|
case kws_UnknownIcon:
|
|
if (Scr->FirstTime) GetUnknownIcon (s);
|
|
return 1;
|
|
|
|
case kws_IconDirectory:
|
|
if (Scr->FirstTime) Scr->IconDirectory = ExpandFilePath (s);
|
|
return 1;
|
|
|
|
case kws_PixmapDirectory:
|
|
if (Scr->FirstTime) Scr->PixmapDirectory = ExpandFilePath (s);
|
|
return 1;
|
|
|
|
case kws_MaxWindowSize:
|
|
JunkMask = XParseGeometry (s, &JunkX, &JunkY, &JunkWidth, &JunkHeight);
|
|
if ((JunkMask & (WidthValue | HeightValue)) !=
|
|
(WidthValue | HeightValue)) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr, "bad MaxWindowSize \"%s\"\n", s);
|
|
return 0;
|
|
}
|
|
if (JunkWidth == 0 || JunkHeight == 0) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr, "MaxWindowSize \"%s\" must be non-zero\n", s);
|
|
return 0;
|
|
}
|
|
Scr->MaxWindowWidth = JunkWidth;
|
|
Scr->MaxWindowHeight = JunkHeight;
|
|
return 1;
|
|
|
|
case kws_IconJustification:
|
|
{
|
|
int just = ParseJustification (s);
|
|
|
|
if ((just < 0) || (just == J_BORDER)) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr,
|
|
"ignoring invalid IconJustification argument \"%s\"\n", s);
|
|
} else {
|
|
Scr->IconJustification = just;
|
|
}
|
|
return 1;
|
|
}
|
|
case kws_IconRegionJustification:
|
|
{
|
|
int just = ParseJustification (s);
|
|
|
|
if (just < 0) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr,
|
|
"ignoring invalid IconRegionJustification argument \"%s\"\n", s);
|
|
} else {
|
|
Scr->IconRegionJustification = just;
|
|
}
|
|
return 1;
|
|
}
|
|
case kws_IconRegionAlignement:
|
|
{
|
|
int just = ParseAlignement (s);
|
|
|
|
if (just < 0) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr,
|
|
"ignoring invalid IconRegionAlignement argument \"%s\"\n", s);
|
|
} else {
|
|
Scr->IconRegionAlignement = just;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
case kws_TitleJustification:
|
|
{
|
|
int just = ParseJustification (s);
|
|
|
|
if ((just < 0) || (just == J_BORDER)) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr,
|
|
"ignoring invalid TitleJustification argument \"%s\"\n", s);
|
|
} else {
|
|
Scr->TitleJustification = just;
|
|
}
|
|
return 1;
|
|
}
|
|
#ifdef SOUNDS
|
|
case kws_SoundHost:
|
|
if (Scr->FirstTime) set_sound_host(s);
|
|
return 1;
|
|
#endif
|
|
|
|
case kws_WMgrButtonStyle:
|
|
{
|
|
int style = ParseButtonStyle (s);
|
|
|
|
if (style < 0) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr,
|
|
"ignoring invalid WMgrButtonStyle argument \"%s\"\n", s);
|
|
} else {
|
|
Scr->workSpaceMgr.buttonStyle = style;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
case kws_IconifyStyle:
|
|
{
|
|
if (strlen (s) == 0) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr, "ignoring invalid IconifyStyle argument \"%s\"\n", s);
|
|
}
|
|
if (strcmp (s, "default") == 0) Scr->IconifyStyle = ICONIFY_NORMAL;
|
|
XmuCopyISOLatin1Lowered (s, s);
|
|
if (strcmp (s, "normal") == 0) Scr->IconifyStyle = ICONIFY_NORMAL;
|
|
if (strcmp (s, "mosaic") == 0) Scr->IconifyStyle = ICONIFY_MOSAIC;
|
|
if (strcmp (s, "zoomin") == 0) Scr->IconifyStyle = ICONIFY_ZOOMIN;
|
|
if (strcmp (s, "zoomout") == 0) Scr->IconifyStyle = ICONIFY_ZOOMOUT;
|
|
if (strcmp (s, "sweep") == 0) Scr->IconifyStyle = ICONIFY_SWEEP;
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int do_number_keyword (int keyword, int num)
|
|
{
|
|
switch (keyword) {
|
|
case kwn_ConstrainedMoveTime:
|
|
ConstrainedMoveTime = num;
|
|
return 1;
|
|
|
|
case kwn_MoveDelta:
|
|
Scr->MoveDelta = num;
|
|
return 1;
|
|
|
|
case kwn_MoveOffResistance:
|
|
Scr->MoveOffResistance = num;
|
|
return 1;
|
|
|
|
case kwn_MovePackResistance:
|
|
if (num < 0) num = 20;
|
|
Scr->MovePackResistance = num;
|
|
return 1;
|
|
|
|
case kwn_XMoveGrid:
|
|
if (num < 1) num = 1;
|
|
if (num > 100) num = 100;
|
|
Scr->XMoveGrid = num;
|
|
return 1;
|
|
|
|
case kwn_YMoveGrid:
|
|
if (num < 1) num = 1;
|
|
if (num > 100) num = 100;
|
|
Scr->YMoveGrid = num;
|
|
return 1;
|
|
|
|
case kwn_XorValue:
|
|
if (Scr->FirstTime) Scr->XORvalue = num;
|
|
return 1;
|
|
|
|
case kwn_FramePadding:
|
|
if (Scr->FirstTime) Scr->FramePadding = num;
|
|
return 1;
|
|
|
|
case kwn_TitlePadding:
|
|
if (Scr->FirstTime) {
|
|
Scr->TitlePadding = num;
|
|
}
|
|
return 1;
|
|
|
|
case kwn_ButtonIndent:
|
|
if (Scr->FirstTime) Scr->ButtonIndent = num;
|
|
return 1;
|
|
|
|
case kwn_ThreeDBorderWidth:
|
|
if (Scr->FirstTime) Scr->ThreeDBorderWidth = num;
|
|
return 1;
|
|
|
|
case kwn_BorderWidth:
|
|
if (Scr->FirstTime) Scr->BorderWidth = num;
|
|
return 1;
|
|
|
|
case kwn_IconBorderWidth:
|
|
if (Scr->FirstTime) Scr->IconBorderWidth = num;
|
|
return 1;
|
|
|
|
case kwn_TitleButtonBorderWidth:
|
|
if (Scr->FirstTime) Scr->TBInfo.border = num;
|
|
return 1;
|
|
|
|
case kwn_RaiseDelay:
|
|
RaiseDelay = num;
|
|
return 1;
|
|
|
|
case kwn_TransientOnTop:
|
|
if (Scr->FirstTime) Scr->TransientOnTop = num;
|
|
return 1;
|
|
|
|
case kwn_OpaqueMoveThreshold:
|
|
if (Scr->FirstTime) Scr->OpaqueMoveThreshold = num;
|
|
return 1;
|
|
|
|
case kwn_OpaqueResizeThreshold:
|
|
if (Scr->FirstTime) Scr->OpaqueResizeThreshold = num;
|
|
return 1;
|
|
|
|
case kwn_WMgrVertButtonIndent:
|
|
if (Scr->FirstTime) Scr->WMgrVertButtonIndent = num;
|
|
if (Scr->WMgrVertButtonIndent < 0) Scr->WMgrVertButtonIndent = 0;
|
|
Scr->workSpaceMgr.vspace = Scr->WMgrVertButtonIndent;
|
|
Scr->workSpaceMgr.occupyWindow->vspace = Scr->WMgrVertButtonIndent;
|
|
return 1;
|
|
|
|
case kwn_WMgrHorizButtonIndent:
|
|
if (Scr->FirstTime) Scr->WMgrHorizButtonIndent = num;
|
|
if (Scr->WMgrHorizButtonIndent < 0) Scr->WMgrHorizButtonIndent = 0;
|
|
Scr->workSpaceMgr.hspace = Scr->WMgrHorizButtonIndent;
|
|
Scr->workSpaceMgr.occupyWindow->hspace = Scr->WMgrHorizButtonIndent;
|
|
return 1;
|
|
|
|
case kwn_WMgrButtonShadowDepth:
|
|
if (Scr->FirstTime) Scr->WMgrButtonShadowDepth = num;
|
|
if (Scr->WMgrButtonShadowDepth < 1) Scr->WMgrButtonShadowDepth = 1;
|
|
return 1;
|
|
|
|
case kwn_MaxIconTitleWidth:
|
|
if (Scr->FirstTime) Scr->MaxIconTitleWidth = num;
|
|
return 1;
|
|
|
|
case kwn_ClearShadowContrast:
|
|
if (Scr->FirstTime) Scr->ClearShadowContrast = num;
|
|
if (Scr->ClearShadowContrast < 0) Scr->ClearShadowContrast = 0;
|
|
if (Scr->ClearShadowContrast > 100) Scr->ClearShadowContrast = 100;
|
|
return 1;
|
|
|
|
case kwn_DarkShadowContrast:
|
|
if (Scr->FirstTime) Scr->DarkShadowContrast = num;
|
|
if (Scr->DarkShadowContrast < 0) Scr->DarkShadowContrast = 0;
|
|
if (Scr->DarkShadowContrast > 100) Scr->DarkShadowContrast = 100;
|
|
return 1;
|
|
|
|
case kwn_AnimationSpeed:
|
|
if (num < 0) num = 0;
|
|
SetAnimationSpeed (num);
|
|
return 1;
|
|
|
|
case kwn_BorderShadowDepth:
|
|
if (Scr->FirstTime) Scr->BorderShadowDepth = num;
|
|
if (Scr->BorderShadowDepth < 0) Scr->BorderShadowDepth = 2;
|
|
return 1;
|
|
|
|
case kwn_BorderLeft:
|
|
if (Scr->FirstTime) Scr->BorderLeft = num;
|
|
if (Scr->BorderLeft < 0) Scr->BorderLeft = 0;
|
|
return 1;
|
|
|
|
case kwn_BorderRight:
|
|
if (Scr->FirstTime) Scr->BorderRight = num;
|
|
if (Scr->BorderRight < 0) Scr->BorderRight = 0;
|
|
return 1;
|
|
|
|
case kwn_BorderTop:
|
|
if (Scr->FirstTime) Scr->BorderTop = num;
|
|
if (Scr->BorderTop < 0) Scr->BorderTop = 0;
|
|
return 1;
|
|
|
|
case kwn_BorderBottom:
|
|
if (Scr->FirstTime) Scr->BorderBottom = num;
|
|
if (Scr->BorderBottom < 0) Scr->BorderBottom = 0;
|
|
return 1;
|
|
|
|
case kwn_TitleButtonShadowDepth:
|
|
if (Scr->FirstTime) Scr->TitleButtonShadowDepth = num;
|
|
if (Scr->TitleButtonShadowDepth < 0) Scr->TitleButtonShadowDepth = 2;
|
|
return 1;
|
|
|
|
case kwn_TitleShadowDepth:
|
|
if (Scr->FirstTime) Scr->TitleShadowDepth = num;
|
|
if (Scr->TitleShadowDepth < 0) Scr->TitleShadowDepth = 2;
|
|
return 1;
|
|
|
|
case kwn_IconManagerShadowDepth:
|
|
if (Scr->FirstTime) Scr->IconManagerShadowDepth = num;
|
|
if (Scr->IconManagerShadowDepth < 0) Scr->IconManagerShadowDepth = 2;
|
|
return 1;
|
|
|
|
case kwn_MenuShadowDepth:
|
|
if (Scr->FirstTime) Scr->MenuShadowDepth = num;
|
|
if (Scr->MenuShadowDepth < 0) Scr->MenuShadowDepth = 2;
|
|
return 1;
|
|
|
|
case kwn_OpenWindowTimeout:
|
|
if (Scr->FirstTime) Scr->OpenWindowTimeout = num;
|
|
if (Scr->OpenWindowTimeout < 0) Scr->OpenWindowTimeout = 0;
|
|
return 1;
|
|
|
|
case kwn_RaiseOnClickButton:
|
|
if (Scr->FirstTime) Scr->RaiseOnClickButton = num;
|
|
if (Scr->RaiseOnClickButton < 1) Scr->RaiseOnClickButton = 1;
|
|
if (Scr->RaiseOnClickButton > MAX_BUTTONS) Scr->RaiseOnClickButton = MAX_BUTTONS;
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
name_list **do_colorlist_keyword (int keyword, int colormode, char *s)
|
|
{
|
|
switch (keyword) {
|
|
case kwcl_BorderColor:
|
|
GetColor (colormode, &Scr->BorderColorC.back, s);
|
|
return &Scr->BorderColorL;
|
|
|
|
case kwcl_IconManagerHighlight:
|
|
GetColor (colormode, &Scr->IconManagerHighlight, s);
|
|
return &Scr->IconManagerHighlightL;
|
|
|
|
case kwcl_BorderTileForeground:
|
|
GetColor (colormode, &Scr->BorderTileC.fore, s);
|
|
return &Scr->BorderTileForegroundL;
|
|
|
|
case kwcl_BorderTileBackground:
|
|
GetColor (colormode, &Scr->BorderTileC.back, s);
|
|
return &Scr->BorderTileBackgroundL;
|
|
|
|
case kwcl_TitleForeground:
|
|
GetColor (colormode, &Scr->TitleC.fore, s);
|
|
return &Scr->TitleForegroundL;
|
|
|
|
case kwcl_TitleBackground:
|
|
GetColor (colormode, &Scr->TitleC.back, s);
|
|
return &Scr->TitleBackgroundL;
|
|
|
|
case kwcl_IconForeground:
|
|
GetColor (colormode, &Scr->IconC.fore, s);
|
|
return &Scr->IconForegroundL;
|
|
|
|
case kwcl_IconBackground:
|
|
GetColor (colormode, &Scr->IconC.back, s);
|
|
return &Scr->IconBackgroundL;
|
|
|
|
case kwcl_IconBorderColor:
|
|
GetColor (colormode, &Scr->IconBorderColor, s);
|
|
return &Scr->IconBorderColorL;
|
|
|
|
case kwcl_IconManagerForeground:
|
|
GetColor (colormode, &Scr->IconManagerC.fore, s);
|
|
return &Scr->IconManagerFL;
|
|
|
|
case kwcl_IconManagerBackground:
|
|
GetColor (colormode, &Scr->IconManagerC.back, s);
|
|
return &Scr->IconManagerBL;
|
|
|
|
case kwcl_MapWindowBackground:
|
|
GetColor (colormode, &Scr->workSpaceMgr.windowcp.back, s);
|
|
Scr->workSpaceMgr.windowcpgiven = True;
|
|
return &Scr->workSpaceMgr.windowBackgroundL;
|
|
|
|
case kwcl_MapWindowForeground:
|
|
GetColor (colormode, &Scr->workSpaceMgr.windowcp.fore, s);
|
|
Scr->workSpaceMgr.windowcpgiven = True;
|
|
return &Scr->workSpaceMgr.windowForegroundL;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
int do_color_keyword (int keyword, int colormode, char *s)
|
|
{
|
|
switch (keyword) {
|
|
case kwc_DefaultForeground:
|
|
GetColor (colormode, &Scr->DefaultC.fore, s);
|
|
return 1;
|
|
|
|
case kwc_DefaultBackground:
|
|
GetColor (colormode, &Scr->DefaultC.back, s);
|
|
return 1;
|
|
|
|
case kwc_MenuForeground:
|
|
GetColor (colormode, &Scr->MenuC.fore, s);
|
|
return 1;
|
|
|
|
case kwc_MenuBackground:
|
|
GetColor (colormode, &Scr->MenuC.back, s);
|
|
return 1;
|
|
|
|
case kwc_MenuTitleForeground:
|
|
GetColor (colormode, &Scr->MenuTitleC.fore, s);
|
|
return 1;
|
|
|
|
case kwc_MenuTitleBackground:
|
|
GetColor (colormode, &Scr->MenuTitleC.back, s);
|
|
return 1;
|
|
|
|
case kwc_MenuShadowColor:
|
|
GetColor (colormode, &Scr->MenuShadowColor, s);
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* put_pixel_on_root() Save a pixel value in twm root window color property.
|
|
*/
|
|
static void put_pixel_on_root(Pixel pixel)
|
|
{
|
|
int i, addPixel = 1;
|
|
Atom retAtom;
|
|
int retFormat;
|
|
unsigned long nPixels, retAfter;
|
|
Pixel *retProp;
|
|
|
|
if (XGetWindowProperty(dpy, Scr->Root, _XA_MIT_PRIORITY_COLORS, 0, 8192,
|
|
False, XA_CARDINAL, &retAtom,
|
|
&retFormat, &nPixels, &retAfter,
|
|
(unsigned char **)&retProp) != Success || !retProp)
|
|
return;
|
|
|
|
for (i=0; i< nPixels; i++)
|
|
if (pixel == retProp[i]) addPixel = 0;
|
|
|
|
XFree((char *)retProp);
|
|
|
|
if (addPixel)
|
|
XChangeProperty (dpy, Scr->Root, _XA_MIT_PRIORITY_COLORS,
|
|
XA_CARDINAL, 32, PropModeAppend,
|
|
(unsigned char *)&pixel, 1);
|
|
}
|
|
|
|
/*
|
|
* do_string_savecolor() save a color from a string in the twmrc file.
|
|
*/
|
|
int do_string_savecolor(int colormode, char *s)
|
|
{
|
|
Pixel p;
|
|
GetColor(colormode, &p, s);
|
|
put_pixel_on_root(p);
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* do_var_savecolor() save a color from a var in the twmrc file.
|
|
*/
|
|
typedef struct _cnode {int i; struct _cnode *next;} Cnode, *Cptr;
|
|
Cptr chead = NULL;
|
|
|
|
int do_var_savecolor(int key)
|
|
{
|
|
Cptr cptrav, cpnew;
|
|
if (!chead) {
|
|
chead = (Cptr)malloc(sizeof(Cnode));
|
|
chead->i = key; chead->next = NULL;
|
|
}
|
|
else {
|
|
cptrav = chead;
|
|
while (cptrav->next != NULL) { cptrav = cptrav->next; }
|
|
cpnew = (Cptr)malloc(sizeof(Cnode));
|
|
cpnew->i = key; cpnew->next = NULL; cptrav->next = cpnew;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* assign_var_savecolor() traverse the var save color list placeing the pixels
|
|
* in the root window property.
|
|
*/
|
|
void assign_var_savecolor(void)
|
|
{
|
|
Cptr cp = chead;
|
|
while (cp != NULL) {
|
|
switch (cp->i) {
|
|
case kwcl_BorderColor:
|
|
put_pixel_on_root(Scr->BorderColorC.back);
|
|
break;
|
|
case kwcl_IconManagerHighlight:
|
|
put_pixel_on_root(Scr->IconManagerHighlight);
|
|
break;
|
|
case kwcl_BorderTileForeground:
|
|
put_pixel_on_root(Scr->BorderTileC.fore);
|
|
break;
|
|
case kwcl_BorderTileBackground:
|
|
put_pixel_on_root(Scr->BorderTileC.back);
|
|
break;
|
|
case kwcl_TitleForeground:
|
|
put_pixel_on_root(Scr->TitleC.fore);
|
|
break;
|
|
case kwcl_TitleBackground:
|
|
put_pixel_on_root(Scr->TitleC.back);
|
|
break;
|
|
case kwcl_IconForeground:
|
|
put_pixel_on_root(Scr->IconC.fore);
|
|
break;
|
|
case kwcl_IconBackground:
|
|
put_pixel_on_root(Scr->IconC.back);
|
|
break;
|
|
case kwcl_IconBorderColor:
|
|
put_pixel_on_root(Scr->IconBorderColor);
|
|
break;
|
|
case kwcl_IconManagerForeground:
|
|
put_pixel_on_root(Scr->IconManagerC.fore);
|
|
break;
|
|
case kwcl_IconManagerBackground:
|
|
put_pixel_on_root(Scr->IconManagerC.back);
|
|
break;
|
|
case kwcl_MapWindowForeground:
|
|
put_pixel_on_root(Scr->workSpaceMgr.windowcp.fore);
|
|
break;
|
|
case kwcl_MapWindowBackground:
|
|
put_pixel_on_root(Scr->workSpaceMgr.windowcp.back);
|
|
break;
|
|
}
|
|
cp = cp->next;
|
|
}
|
|
if (chead) {
|
|
free(chead);
|
|
chead = NULL;
|
|
}
|
|
}
|
|
|
|
static int ParseRandomPlacement (register char *s)
|
|
{
|
|
if (strlen (s) == 0) return RP_ALL;
|
|
if (strcmp (s, "default") == 0) return RP_ALL;
|
|
XmuCopyISOLatin1Lowered (s, s);
|
|
|
|
if (strcmp (s, "off") == 0) return RP_OFF;
|
|
if (strcmp (s, "on") == 0) return RP_ALL;
|
|
if (strcmp (s, "all") == 0) return RP_ALL;
|
|
if (strcmp (s, "unmapped") == 0) return RP_UNMAPPED;
|
|
return (-1);
|
|
}
|
|
|
|
int ParseJustification (register char *s)
|
|
{
|
|
if (strlen (s) == 0) return (-1);
|
|
if (strcmp (s, "default") == 0) return J_CENTER;
|
|
if (strcmp (s, "undef") == 0) return J_UNDEF;
|
|
XmuCopyISOLatin1Lowered (s, s);
|
|
|
|
if (strcmp (s, "undef") == 0) return J_UNDEF;
|
|
if (strcmp (s, "default") == 0) return J_CENTER;
|
|
if (strcmp (s, "left") == 0) return J_LEFT;
|
|
if (strcmp (s, "center") == 0) return J_CENTER;
|
|
if (strcmp (s, "right") == 0) return J_RIGHT;
|
|
if (strcmp (s, "border") == 0) return J_BORDER;
|
|
return (-1);
|
|
}
|
|
|
|
int ParseAlignement (register char *s)
|
|
{
|
|
if (strlen (s) == 0) return (-1);
|
|
if (strcmp (s, "default") == 0) return J_CENTER;
|
|
if (strcmp (s, "undef") == 0) return J_UNDEF;
|
|
XmuCopyISOLatin1Lowered (s, s);
|
|
|
|
if (strcmp (s, "undef") == 0) return J_UNDEF;
|
|
if (strcmp (s, "default") == 0) return J_CENTER;
|
|
if (strcmp (s, "top") == 0) return J_TOP;
|
|
if (strcmp (s, "center") == 0) return J_CENTER;
|
|
if (strcmp (s, "bottom") == 0) return J_BOTTOM;
|
|
if (strcmp (s, "border") == 0) return J_BORDER;
|
|
return (-1);
|
|
}
|
|
|
|
static int ParseUsePPosition (register char *s)
|
|
{
|
|
if (strlen (s) == 0) return (-1);
|
|
if (strcmp (s, "default") == 0) return PPOS_OFF;
|
|
XmuCopyISOLatin1Lowered (s, s);
|
|
|
|
if (strcmp (s, "default") == 0) return PPOS_OFF;
|
|
if (strcmp (s, "off") == 0) return PPOS_OFF;
|
|
if (strcmp (s, "on") == 0) return PPOS_ON;
|
|
if (strcmp (s, "non-zero") == 0) return PPOS_NON_ZERO;
|
|
if (strcmp (s, "nonzero") == 0) return PPOS_NON_ZERO;
|
|
return (-1);
|
|
}
|
|
|
|
static int ParseButtonStyle (register char *s)
|
|
{
|
|
if (strlen (s) == 0) return (-1);
|
|
if (strcmp (s, "default") == 0) return STYLE_NORMAL;
|
|
XmuCopyISOLatin1Lowered (s, s);
|
|
|
|
if (strcmp (s, "normal") == 0) return STYLE_NORMAL;
|
|
if (strcmp (s, "style1") == 0) return STYLE_STYLE1;
|
|
if (strcmp (s, "style2") == 0) return STYLE_STYLE2;
|
|
if (strcmp (s, "style3") == 0) return STYLE_STYLE3;
|
|
return (-1);
|
|
}
|
|
|
|
int do_squeeze_entry (name_list **list, /* squeeze or dont-squeeze list */
|
|
char *name, /* window name */
|
|
int justify, /* left, center, right */
|
|
int num, /* signed num */
|
|
int denom) /* 0 or indicates fraction denom */
|
|
{
|
|
int absnum = (num < 0 ? -num : num);
|
|
|
|
if (denom < 0) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr, "negative SqueezeTitle denominator %d\n", denom);
|
|
return (1);
|
|
}
|
|
if (absnum > denom && denom != 0) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr, "SqueezeTitle fraction %d/%d outside window\n",
|
|
num, denom);
|
|
return (1);
|
|
}
|
|
/* Process the special cases from the manual here rather than
|
|
* each time we calculate the position of the title bar
|
|
* in add_window.c:ComputeTitleLocation().
|
|
* In fact, it's better to get rid of them entirely, but we
|
|
* probably should not do that for compatibility's sake.
|
|
* By using a non-zero denominator the position will be relative.
|
|
*/
|
|
if (denom == 0 && num == 0) {
|
|
if (justify == J_CENTER) {
|
|
num = 1;
|
|
denom = 2;
|
|
} else if (justify == J_RIGHT) {
|
|
num = 2;
|
|
denom = 2;
|
|
}
|
|
twmrc_error_prefix();
|
|
fprintf (stderr, "deprecated SqueezeTitle faction 0/0, assuming %d/%d\n",
|
|
num, denom);
|
|
}
|
|
|
|
if (HasShape) {
|
|
SqueezeInfo *sinfo;
|
|
sinfo = (SqueezeInfo *) malloc (sizeof(SqueezeInfo));
|
|
|
|
if (!sinfo) {
|
|
twmrc_error_prefix();
|
|
fprintf (stderr, "unable to allocate %lu bytes for squeeze info\n",
|
|
(unsigned long) sizeof(SqueezeInfo));
|
|
return (1);
|
|
}
|
|
sinfo->justify = justify;
|
|
sinfo->num = num;
|
|
sinfo->denom = denom;
|
|
AddToList (list, name, (char *) sinfo);
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
#ifdef USEM4
|
|
|
|
static FILE *start_m4(FILE *fraw)
|
|
{
|
|
int fno;
|
|
int fids[2];
|
|
int fres; /* Fork result */
|
|
|
|
fno = fileno(fraw);
|
|
/* if (-1 == fcntl(fno, F_SETFD, 0)) perror("fcntl()"); */
|
|
if (pipe(fids) < 0) {
|
|
perror("Pipe for " M4CMD " failed");
|
|
exit(23);
|
|
}
|
|
fres = fork();
|
|
if (fres < 0) {
|
|
perror("Fork for " M4CMD " failed");
|
|
exit(23);
|
|
}
|
|
if (fres == 0) {
|
|
char *tmp_file;
|
|
|
|
/* Child */
|
|
close(0); /* stdin */
|
|
close(1); /* stdout */
|
|
dup2(fno, 0); /* stdin = fraw */
|
|
dup2(fids[1], 1); /* stdout = pipe to parent */
|
|
/* get_defs("m4", dpy, display_name) */
|
|
tmp_file = m4_defs(dpy, display_name);
|
|
execlp(M4CMD, M4CMD, "-s", tmp_file, "-", NULL);
|
|
|
|
/* If we get here we are screwed... */
|
|
perror("Can't execlp() " M4CMD);
|
|
exit(124);
|
|
}
|
|
/* Parent */
|
|
close(fids[1]);
|
|
return ((FILE*)fdopen(fids[0], "r"));
|
|
}
|
|
|
|
/* Code taken and munged from xrdb.c */
|
|
#define MAXHOSTNAME 255
|
|
#define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100)
|
|
#define EXTRA 16
|
|
|
|
static char *MkDef(char *name, char *def)
|
|
{
|
|
static char *cp = NULL;
|
|
static int maxsize = 0;
|
|
int n, nl;
|
|
|
|
if (def == NULL) return (""); /* XXX JWS: prevent segfaults */
|
|
/* The char * storage only lasts for 1 call... */
|
|
if ((n = EXTRA + ((nl = strlen(name)) + strlen(def))) > maxsize) {
|
|
maxsize = n;
|
|
if (cp) free(cp);
|
|
|
|
cp = malloc(n);
|
|
}
|
|
/* Otherwise cp is aready big 'nuf */
|
|
if (cp == NULL) {
|
|
fprintf(stderr, "Can't get %d bytes for arg parm\n", n);
|
|
exit(468);
|
|
}
|
|
strcpy (cp, "define(`");
|
|
strcat (cp, name);
|
|
strcat (cp, "', `");
|
|
strcat (cp, def);
|
|
strcat (cp, "')\n");
|
|
|
|
return(cp);
|
|
}
|
|
|
|
static char *MkNum(char *name, int def)
|
|
{
|
|
char num[20];
|
|
|
|
sprintf(num, "%d", def);
|
|
return(MkDef(name, num));
|
|
}
|
|
|
|
#ifdef NOSTEMP
|
|
int mkstemp(str)
|
|
char *str;
|
|
{
|
|
int fd;
|
|
|
|
mktemp(str);
|
|
fd = creat(str, 0744);
|
|
if (fd == -1) perror("mkstemp's creat");
|
|
return(fd);
|
|
}
|
|
#endif
|
|
|
|
static char *m4_defs(Display *display, char *host)
|
|
{
|
|
Screen *screen;
|
|
Visual *visual;
|
|
char client[MAXHOSTNAME], server[MAXHOSTNAME], *colon;
|
|
struct hostent *hostname;
|
|
char *vc; /* Visual Class */
|
|
static char tmp_name[] = "/tmp/twmrcXXXXXX";
|
|
int fd;
|
|
FILE *tmpf;
|
|
char *user;
|
|
|
|
fd = mkstemp(tmp_name); /* I *hope* mkstemp exists, because */
|
|
/* I tried to find the "portable" */
|
|
/* mktmp... */
|
|
if (fd < 0) {
|
|
perror("mkstemp failed in m4_defs");
|
|
exit(377);
|
|
}
|
|
tmpf = (FILE*) fdopen(fd, "w+");
|
|
XmuGetHostname(client, MAXHOSTNAME);
|
|
hostname = gethostbyname(client);
|
|
strcpy(server, XDisplayName(host));
|
|
colon = strchr(server, ':');
|
|
if (colon != NULL) *colon = '\0';
|
|
if ((server[0] == '\0') || (!strcmp(server, "unix")))
|
|
strcpy(server, client); /* must be connected to :0 or unix:0 */
|
|
/* The machine running the X server */
|
|
fputs(MkDef("SERVERHOST", server), tmpf);
|
|
/* The machine running the window manager process */
|
|
fputs(MkDef("CLIENTHOST", client), tmpf);
|
|
if (hostname)
|
|
fputs(MkDef("HOSTNAME", hostname->h_name), tmpf);
|
|
else
|
|
fputs(MkDef("HOSTNAME", client), tmpf);
|
|
|
|
if (!(user=getenv("USER")) && !(user=getenv("LOGNAME"))) user = "unknown";
|
|
fputs(MkDef("USER", user), tmpf);
|
|
fputs(MkDef("HOME", getenv("HOME")), tmpf);
|
|
fputs(MkDef("PIXMAP_DIRECTORY", PIXMAP_DIRECTORY), tmpf);
|
|
fputs(MkNum("VERSION", ProtocolVersion(display)), tmpf);
|
|
fputs(MkNum("REVISION", ProtocolRevision(display)), tmpf);
|
|
fputs(MkDef("VENDOR", ServerVendor(display)), tmpf);
|
|
fputs(MkNum("RELEASE", VendorRelease(display)), tmpf);
|
|
screen = ScreenOfDisplay(display, Scr->screen);
|
|
visual = DefaultVisualOfScreen(screen);
|
|
fputs(MkNum("WIDTH", screen->width), tmpf);
|
|
fputs(MkNum("HEIGHT", screen->height), tmpf);
|
|
fputs(MkNum("X_RESOLUTION",Resolution(screen->width,screen->mwidth)), tmpf);
|
|
fputs(MkNum("Y_RESOLUTION",Resolution(screen->height,screen->mheight)),tmpf);
|
|
fputs(MkNum("PLANES",DisplayPlanes(display, Scr->screen)), tmpf);
|
|
fputs(MkNum("BITS_PER_RGB", visual->bits_per_rgb), tmpf);
|
|
fputs(MkDef("TWM_TYPE", "ctwm"), tmpf);
|
|
fputs(MkDef("TWM_VERSION", VersionNumber), tmpf);
|
|
switch(visual->class) {
|
|
case(StaticGray): vc = "StaticGray"; break;
|
|
case(GrayScale): vc = "GrayScale"; break;
|
|
case(StaticColor): vc = "StaticColor"; break;
|
|
case(PseudoColor): vc = "PseudoColor"; break;
|
|
case(TrueColor): vc = "TrueColor"; break;
|
|
case(DirectColor): vc = "DirectColor"; break;
|
|
default: vc = "NonStandard"; break;
|
|
}
|
|
fputs(MkDef("CLASS", vc), tmpf);
|
|
if (visual->class != StaticGray && visual->class != GrayScale) {
|
|
fputs(MkDef("COLOR", "Yes"), tmpf);
|
|
} else {
|
|
fputs(MkDef("COLOR", "No"), tmpf);
|
|
}
|
|
#ifdef XPM
|
|
fputs(MkDef("XPM", "Yes"), tmpf);
|
|
#endif
|
|
#ifdef JPEG
|
|
fputs(MkDef("JPEG", "Yes"), tmpf);
|
|
#endif
|
|
#ifdef IMCONV
|
|
fputs(MkDef("IMCONV", "Yes"), tmpf);
|
|
#endif
|
|
#ifdef GNOME
|
|
fputs(MkDef("GNOME", "Yes"), tmpf);
|
|
#endif
|
|
#ifdef SOUNDS
|
|
fputs(MkDef("SOUNDS", "Yes"), tmpf);
|
|
#endif
|
|
fputs(MkDef("I18N", "Yes"), tmpf);
|
|
if (captive && captivename) {
|
|
fputs (MkDef ("TWM_CAPTIVE", "Yes"), tmpf);
|
|
fputs (MkDef ("TWM_CAPTIVE_NAME", captivename), tmpf);
|
|
} else {
|
|
fputs (MkDef ("TWM_CAPTIVE", "No"), tmpf);
|
|
}
|
|
if (KeepTmpFile) {
|
|
fprintf(stderr, "Left file: %s\n", tmp_name);
|
|
} else {
|
|
fprintf(tmpf, "syscmd(/bin/rm %s)\n", tmp_name);
|
|
}
|
|
fclose(tmpf);
|
|
return(tmp_name);
|
|
}
|
|
#endif /* USEM4 */
|