mirror of
https://github.com/NishiOwO/fvwm1.git
synced 2025-04-21 08:44:39 +00:00
400 lines
9.9 KiB
C
400 lines
9.9 KiB
C
/****************************************************************************
|
|
* This module is all original code
|
|
* by Rob Nation
|
|
* Copyright 1993, Robert Nation
|
|
* You may use this code for any purpose, as long as the original
|
|
* copyright remains in the source code and all documentation
|
|
****************************************************************************/
|
|
|
|
/***********************************************************************
|
|
*
|
|
* code for parsing the fvwm style command
|
|
*
|
|
***********************************************************************/
|
|
#include "../configure.h"
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
#include "fvwm.h"
|
|
#include "menus.h"
|
|
#include "misc.h"
|
|
#include "parse.h"
|
|
#include "screen.h"
|
|
#include "../version.h"
|
|
|
|
void ParseStyle(char *text, FILE *fd, char **list, int *junk)
|
|
{
|
|
extern char *orig_tline;
|
|
char *name, *line;
|
|
char *restofline,*tmp;
|
|
char *icon_name = NULL;
|
|
char *forecolor = NULL;
|
|
char *backcolor = NULL;
|
|
unsigned long off_buttons=0;
|
|
unsigned long on_buttons=0;
|
|
int butt;
|
|
|
|
int len,desknumber = 0,bw=0, nobw = 0;
|
|
unsigned long off_flags = 0;
|
|
unsigned long on_flags = 0;
|
|
|
|
name = stripcpy2(text,FALSE,TRUE);
|
|
/* in case there was no argument! */
|
|
if(name == NULL)
|
|
return;
|
|
|
|
restofline = stripcpy3(text,FALSE);
|
|
line = restofline;
|
|
|
|
if(restofline == NULL)return;
|
|
while((*restofline != 0)&&(*restofline != '\n'))
|
|
{
|
|
while(isspace(*restofline))restofline++;
|
|
if(mystrncasecmp(restofline,"ICON",4)==0)
|
|
{
|
|
restofline +=4;
|
|
while(isspace(*restofline))restofline++;
|
|
tmp = restofline;
|
|
len = 0;
|
|
while((tmp != NULL)&&(*tmp != 0)&&(*tmp != ',')&&(*tmp != '\n'))
|
|
{
|
|
tmp++;
|
|
len++;
|
|
}
|
|
if(len > 0)
|
|
{
|
|
icon_name = safemalloc(len+1);
|
|
strncpy(icon_name,restofline,len);
|
|
icon_name[len] = 0;
|
|
off_flags |= ICON_FLAG;
|
|
on_flags |= SUPPRESSICON_FLAG;
|
|
}
|
|
else
|
|
on_flags |= SUPPRESSICON_FLAG;
|
|
restofline = tmp;
|
|
}
|
|
if(mystrncasecmp(restofline,"COLOR",5)==0)
|
|
{
|
|
restofline +=5;
|
|
while(isspace(*restofline))restofline++;
|
|
tmp = restofline;
|
|
len = 0;
|
|
while((tmp != NULL)&&(*tmp != 0)&&(*tmp != ',')&&
|
|
(*tmp != '\n')&&(*tmp != '/')&&(!isspace(*tmp)))
|
|
{
|
|
tmp++;
|
|
len++;
|
|
}
|
|
if(len > 0)
|
|
{
|
|
forecolor = safemalloc(len+1);
|
|
strncpy(forecolor,restofline,len);
|
|
forecolor[len] = 0;
|
|
off_flags |= FORE_COLOR_FLAG;
|
|
}
|
|
|
|
while(isspace(*tmp))tmp++;
|
|
if(*tmp == '/')
|
|
{
|
|
tmp++;
|
|
while(isspace(*tmp))tmp++;
|
|
restofline = tmp;
|
|
len = 0;
|
|
while((tmp != NULL)&&(*tmp != 0)&&(*tmp != ',')&&
|
|
(*tmp != '\n')&&(*tmp != '/')&&(!isspace(*tmp)))
|
|
{
|
|
tmp++;
|
|
len++;
|
|
}
|
|
if(len > 0)
|
|
{
|
|
backcolor = safemalloc(len+1);
|
|
strncpy(backcolor,restofline,len);
|
|
backcolor[len] = 0;
|
|
off_flags |= BACK_COLOR_FLAG;
|
|
}
|
|
}
|
|
restofline = tmp;
|
|
}
|
|
if(mystrncasecmp(restofline,"FORECOLOR",9)==0)
|
|
{
|
|
restofline +=9;
|
|
while(isspace(*restofline))restofline++;
|
|
tmp = restofline;
|
|
len = 0;
|
|
while((tmp != NULL)&&(*tmp != 0)&&(*tmp != ',')&&
|
|
(*tmp != '\n')&&(*tmp != '/')&&(!isspace(*tmp)))
|
|
{
|
|
tmp++;
|
|
len++;
|
|
}
|
|
if(len > 0)
|
|
{
|
|
forecolor = safemalloc(len+1);
|
|
strncpy(forecolor,restofline,len);
|
|
forecolor[len] = 0;
|
|
off_flags |= FORE_COLOR_FLAG;
|
|
}
|
|
restofline = tmp;
|
|
}
|
|
|
|
if(mystrncasecmp(restofline,"BACKCOLOR",9)==0)
|
|
{
|
|
restofline +=9;
|
|
while(isspace(*restofline))restofline++;
|
|
tmp = restofline;
|
|
len = 0;
|
|
while((tmp != NULL)&&(*tmp != 0)&&(*tmp != ',')&&
|
|
(*tmp != '\n')&&(*tmp != '/')&&(!isspace(*tmp)))
|
|
{
|
|
tmp++;
|
|
len++;
|
|
}
|
|
if(len > 0)
|
|
{
|
|
backcolor = safemalloc(len+1);
|
|
strncpy(backcolor,restofline,len);
|
|
backcolor[len] = 0;
|
|
off_flags |= BACK_COLOR_FLAG;
|
|
}
|
|
restofline = tmp;
|
|
}
|
|
else if(mystrncasecmp(restofline,"NoIconTitle",11)==0)
|
|
{
|
|
off_flags |= NOICON_TITLE_FLAG;
|
|
restofline +=11;
|
|
}
|
|
else if(mystrncasecmp(restofline,"IconTitle",9)==0)
|
|
{
|
|
on_flags |= NOICON_TITLE_FLAG;
|
|
restofline +=9;
|
|
}
|
|
else if(mystrncasecmp(restofline,"NOICON",6)==0)
|
|
{
|
|
restofline +=6;
|
|
off_flags |= SUPPRESSICON_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"NOTITLE",7)==0)
|
|
{
|
|
restofline +=7;
|
|
off_flags |= NOTITLE_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"TITLE",5)==0)
|
|
{
|
|
restofline +=5;
|
|
on_flags |= NOTITLE_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"NOHANDLES",9)==0)
|
|
{
|
|
restofline +=9;
|
|
off_flags |= NOBORDER_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"HANDLES",7)==0)
|
|
{
|
|
restofline +=7;
|
|
on_flags |= NOBORDER_FLAG;
|
|
}
|
|
else if (mystrncasecmp(restofline,"NOBUTTON",8)==0)
|
|
{
|
|
restofline +=8;
|
|
|
|
sscanf(restofline,"%d",&butt);
|
|
while(isspace(*restofline))restofline++;
|
|
while((!isspace(*restofline))&&(*restofline!= 0)&&
|
|
(*restofline != ',')&&(*restofline != '\n'))
|
|
restofline++;
|
|
while(isspace(*restofline))restofline++;
|
|
|
|
off_buttons |= (1<<(butt-1));
|
|
}
|
|
else if (mystrncasecmp(restofline,"BUTTON",6)==0)
|
|
{
|
|
restofline +=6;
|
|
|
|
sscanf(restofline,"%d",&butt);
|
|
while(isspace(*restofline))restofline++;
|
|
while((!isspace(*restofline))&&(*restofline!= 0)&&
|
|
(*restofline != ',')&&(*restofline != '\n'))
|
|
restofline++;
|
|
while(isspace(*restofline))restofline++;
|
|
|
|
on_buttons |= (1<<(butt-1));
|
|
}
|
|
else if(mystrncasecmp(restofline,"WindowListSkip",14)==0)
|
|
{
|
|
restofline +=14;
|
|
off_flags |= LISTSKIP_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"WindowListHit",13)==0)
|
|
{
|
|
restofline +=13;
|
|
on_flags |= LISTSKIP_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"CirculateSkip",13)==0)
|
|
{
|
|
restofline +=13;
|
|
off_flags |= CIRCULATESKIP_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"CirculateHit",12)==0)
|
|
{
|
|
restofline +=12;
|
|
on_flags |= CIRCULATESKIP_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"StartIconic",11)==0)
|
|
{
|
|
restofline +=11;
|
|
off_flags |= START_ICONIC_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"StartNormal",11)==0)
|
|
{
|
|
restofline +=11;
|
|
on_flags |= START_ICONIC_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"StaysOnTop",10)==0)
|
|
{
|
|
restofline +=10;
|
|
off_flags |= STAYSONTOP_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"StaysPut",8)==0)
|
|
{
|
|
restofline +=8;
|
|
on_flags |= STAYSONTOP_FLAG;
|
|
}
|
|
else if(mystrncasecmp(restofline,"Sticky",6)==0)
|
|
{
|
|
off_flags |= STICKY_FLAG;
|
|
restofline +=6;
|
|
}
|
|
else if(mystrncasecmp(restofline,"Slippery",8)==0)
|
|
{
|
|
on_flags |= STICKY_FLAG;
|
|
restofline +=8;
|
|
}
|
|
else if(mystrncasecmp(restofline,"BorderWidth",11)==0)
|
|
{
|
|
restofline +=11;
|
|
off_flags |= BW_FLAG;
|
|
sscanf(restofline,"%d",&bw);
|
|
while(isspace(*restofline))restofline++;
|
|
while((!isspace(*restofline))&&(*restofline!= 0)&&
|
|
(*restofline != ',')&&(*restofline != '\n'))
|
|
restofline++;
|
|
while(isspace(*restofline))restofline++;
|
|
}
|
|
else if(mystrncasecmp(restofline,"HandleWidth",11)==0)
|
|
{
|
|
restofline +=11;
|
|
off_flags |= NOBW_FLAG;
|
|
sscanf(restofline,"%d",&nobw);
|
|
while(isspace(*restofline))restofline++;
|
|
while((!isspace(*restofline))&&(*restofline!= 0)&&
|
|
(*restofline != ',')&&(*restofline != '\n'))
|
|
restofline++;
|
|
while(isspace(*restofline))restofline++;
|
|
}
|
|
else if(mystrncasecmp(restofline,"STARTSONDESK",12)==0)
|
|
{
|
|
restofline +=12;
|
|
off_flags |= STAYSONDESK_FLAG;
|
|
sscanf(restofline,"%d",&desknumber);
|
|
while(isspace(*restofline))restofline++;
|
|
while((!isspace(*restofline))&&(*restofline!= 0)&&
|
|
(*restofline != ',')&&(*restofline != '\n'))
|
|
restofline++;
|
|
while(isspace(*restofline))restofline++;
|
|
}
|
|
else if(mystrncasecmp(restofline,"STARTSANYWHERE",14)==0)
|
|
{
|
|
restofline +=14;
|
|
on_flags |= STAYSONDESK_FLAG;
|
|
}
|
|
while(isspace(*restofline))restofline++;
|
|
if(*restofline == ',')
|
|
restofline++;
|
|
else if((*restofline != 0)&&(*restofline != '\n'))
|
|
{
|
|
fvwm_err("bad style command in line %s at %s",
|
|
orig_tline,restofline,NULL);
|
|
return;
|
|
}
|
|
}
|
|
/* capture default icons */
|
|
if(strcmp(name,"*") == 0)
|
|
{
|
|
if(off_flags & ICON_FLAG)
|
|
Scr.DefaultIcon = icon_name;
|
|
off_flags &= ~ICON_FLAG;
|
|
icon_name = NULL;
|
|
}
|
|
|
|
/* capture default colors */
|
|
if(strcmp(name,"*") == 0)
|
|
{
|
|
extern char *Stdfore, *Stdback;
|
|
|
|
if(off_flags & FORE_COLOR_FLAG)
|
|
Stdfore = forecolor;
|
|
off_flags &= ~FORE_COLOR_FLAG;
|
|
forecolor = NULL;
|
|
if(off_flags & BACK_COLOR_FLAG)
|
|
Stdback = backcolor;
|
|
off_flags &= ~BACK_COLOR_FLAG;
|
|
backcolor = NULL;
|
|
}
|
|
free(line);
|
|
AddToList(name,icon_name,off_flags,on_flags,desknumber,bw,nobw,
|
|
forecolor,backcolor,off_buttons,on_buttons);
|
|
}
|
|
|
|
|
|
void AddToList(char *name, char *icon_name, unsigned long off_flags,
|
|
unsigned long on_flags, int desk, int bw, int nobw,
|
|
char *forecolor, char *backcolor,
|
|
unsigned long off_buttons, unsigned long on_buttons)
|
|
{
|
|
name_list *nptr,*lastptr = NULL;
|
|
|
|
if((name == NULL)||((off_flags == 0)&&(on_flags == 0)&&(on_buttons == 0)&&
|
|
(off_buttons == 0)))
|
|
{
|
|
if(name)
|
|
free(name);
|
|
if(icon_name)
|
|
free(icon_name);
|
|
return;
|
|
}
|
|
|
|
/* used to merge duplicate entries, but that is no longer
|
|
* appropriate since conficting styles are possible, and the
|
|
* last match should win! */
|
|
for (nptr = Scr.TheList; nptr != NULL; nptr = nptr->next)
|
|
{
|
|
lastptr=nptr;
|
|
}
|
|
|
|
nptr = (name_list *)safemalloc(sizeof(name_list));
|
|
nptr->next = NULL;
|
|
nptr->name = name;
|
|
nptr->on_flags = on_flags;
|
|
nptr->off_flags = off_flags;
|
|
nptr->value = icon_name;
|
|
nptr->Desk = desk;
|
|
nptr->border_width = bw;
|
|
nptr->resize_width = nobw;
|
|
nptr->ForeColor = forecolor;
|
|
nptr->BackColor = backcolor;
|
|
|
|
nptr->off_buttons = off_buttons;
|
|
nptr->on_buttons = on_buttons;
|
|
|
|
if(lastptr != NULL)
|
|
lastptr->next = nptr;
|
|
else
|
|
Scr.TheList = nptr;
|
|
}
|
|
|