summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am3
-rw-r--r--src/add_window.c52
-rw-r--r--src/cursor.c13
-rw-r--r--src/events.c40
-rw-r--r--src/gram.y1324
-rw-r--r--src/iconmgr.c23
-rw-r--r--src/iconmgr.h2
-rw-r--r--src/icons.c7
-rw-r--r--src/icons.h2
-rw-r--r--src/lex.l119
-rw-r--r--src/list.c5
-rw-r--r--src/menus.c193
-rw-r--r--src/menus.h2
-rw-r--r--src/parse.c88
-rw-r--r--src/resize.c7
-rw-r--r--src/resize.h2
-rw-r--r--src/session.c8
-rw-r--r--src/session.h3
-rw-r--r--src/twm.c205
-rw-r--r--src/twm.h28
-rw-r--r--src/util.c126
-rw-r--r--src/util.h2
22 files changed, 1226 insertions, 1028 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 75e3d4a..805eaf9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -28,6 +28,9 @@ rcdir = ${datadir}/X11/twm
dist_rc_DATA = system.twmrc
AM_CPPFLAGS = \
+ -DAPP_NAME=\"twm\" \
+ -DAPP_CLASS=\"twm\" \
+ -DAPP_VERSION=\"$(VERSION)\" \
-DXVENDORNAME=\"The\ X.Org\ Foundation\" \
-DXORG_RELEASE=\"Release\ $(VERSION)\" \
-DSYSTEM_INIT_FILE=\"${rcdir}/system.twmrc\"
diff --git a/src/add_window.c b/src/add_window.c
index 154a369..3895729 100644
--- a/src/add_window.c
+++ b/src/add_window.c
@@ -51,7 +51,7 @@ in this Software without prior written authorization from The Open Group.
/**********************************************************************
*
- * Add a new window, put the titlbar and other stuff around
+ * Add a new window, put the titlebar and other stuff around
* the window
*
* 31-Mar-88 Tom LaStrange Initial Version.
@@ -147,11 +147,9 @@ TwmWindow *
AddWindow(Window w, int iconm, IconMgr *iconp)
{
TwmWindow *tmp_win; /* new twm window structure */
- int stat;
XEvent event;
unsigned long valuemask; /* mask for create windows */
XSetWindowAttributes attributes; /* attributes for create windows */
- int width, height; /* tmp variable */
int ask_user; /* don't know where to put the window */
int gravx, gravy; /* gravity signs for positioning */
int namelen;
@@ -172,9 +170,7 @@ AddWindow(Window w, int iconm, IconMgr *iconp)
/* allocate space for the twm window */
tmp_win = calloc(1, sizeof(TwmWindow));
if (tmp_win == NULL) {
- fprintf(stderr,
- "%s: Unable to allocate memory to manage window ID %lx.\n",
- ProgramName, w);
+ twmWarning("Unable to allocate memory to manage window ID %lx.", w);
return NULL;
}
tmp_win->w = w;
@@ -289,12 +285,14 @@ AddWindow(Window w, int iconm, IconMgr *iconp)
&tmp_win->class);
if (tmp_win->auto_raise)
Scr->NumAutoRaises++;
- tmp_win->iconify_by_unmapping = Scr->IconifyByUnmapping;
if (Scr->IconifyByUnmapping) {
tmp_win->iconify_by_unmapping = iconm ? FALSE :
!short_lookup LookInList(Scr->DontIconify, tmp_win->full_name,
&tmp_win->class);
}
+ else {
+ tmp_win->iconify_by_unmapping = Scr->IconifyByUnmapping;
+ }
tmp_win->iconify_by_unmapping |=
short_lookup LookInList(Scr->IconifyByUn, tmp_win->full_name,
&tmp_win->class);
@@ -402,10 +400,21 @@ AddWindow(Window w, int iconm, IconMgr *iconp)
*/
if (HandlingEvents && ask_user && !restoredFromPrevSession) {
if (Scr->RandomPlacement) { /* just stick it somewhere */
- if ((PlaceX + tmp_win->attr.width) > Scr->MyDisplayWidth)
- PlaceX = 50;
- if ((PlaceY + tmp_win->attr.height) > Scr->MyDisplayHeight)
- PlaceY = 50;
+ /* Avoid putting the new window off-screen */
+ if ((PlaceX + tmp_win->attr.width) > Scr->MyDisplayWidth) {
+ PlaceX = Scr->MyDisplayWidth - tmp_win->attr.width;
+ if (PlaceX < 0)
+ PlaceX = 0;
+ if (PlaceX > 50)
+ PlaceX = 50;
+ }
+ if ((PlaceY + tmp_win->attr.height) > Scr->MyDisplayHeight) {
+ PlaceY = Scr->MyDisplayHeight - tmp_win->attr.height;
+ if (PlaceY < 0)
+ PlaceY = 0;
+ if (PlaceY > 50)
+ PlaceY = 50;
+ }
tmp_win->attr.x = PlaceX;
tmp_win->attr.y = PlaceY;
@@ -416,11 +425,14 @@ AddWindow(Window w, int iconm, IconMgr *iconp)
if (!(tmp_win->wmhints && tmp_win->wmhints->flags & StateHint &&
tmp_win->wmhints->initial_state == IconicState)) {
Bool firsttime = True;
+ int height, width;
/* better wait until all the mouse buttons have been
* released.
*/
while (TRUE) {
+ int stat;
+
XUngrabServer(dpy);
XSync(dpy, 0);
XGrabServer(dpy);
@@ -1290,8 +1302,7 @@ CreateWindowTitlebarButtons(TwmWindow *tmp_win)
if (nb > 0) {
tmp_win->titlebuttons = malloc((size_t) nb * sizeof(TBWindow));
if (!tmp_win->titlebuttons) {
- fprintf(stderr, "%s: unable to allocate %d titlebuttons\n",
- ProgramName, nb);
+ twmWarning("unable to allocate %d titlebuttons", nb);
}
else {
TBWindow *tbw;
@@ -1483,9 +1494,9 @@ FetchWmColormapWindows(TwmWindow *tmp)
malloc(sizeof(Window) * (size_t) (number_cmap_windows + 1));
if (!new_cmap_windows) {
- fprintf(stderr,
- "%s: unable to allocate %d element colormap window array\n",
- ProgramName, number_cmap_windows + 1);
+ twmWarning
+ ("unable to allocate %d element colormap window array",
+ number_cmap_windows + 1);
goto done;
}
new_cmap_windows[0] = tmp->w; /* add to front */
@@ -1521,10 +1532,11 @@ FetchWmColormapWindows(TwmWindow *tmp)
if (j == tmp->cmaps.number_cwins) {
if (XFindContext(dpy, cmap_windows[i], ColormapContext,
(XPointer *) &cwins[i]) == XCNOENT) {
- if ((cwins[i] = CreateColormapWindow(cmap_windows[i],
- (Bool) tmp->cmaps.
- number_cwins == 0,
- True)) == NULL) {
+ if ((cwins[i] =
+ CreateColormapWindow(cmap_windows[i],
+ (tmp->cmaps.number_cwins == 0
+ ? True
+ : False), True)) == NULL) {
int k;
for (k = i + 1; k < number_cmap_windows; k++)
diff --git a/src/cursor.c b/src/cursor.c
index 98a1256..84d3f0c 100644
--- a/src/cursor.c
+++ b/src/cursor.c
@@ -133,15 +133,13 @@ NewFontCursor(Cursor *cp, const char *str)
i++) {
if (strcmp(str, cursor_names[i].name) == 0) {
if (cursor_names[i].cursor == None)
- cursor_names[i].cursor = XCreateFontCursor(dpy,
- cursor_names[i].
- shape);
+ cursor_names[i].cursor =
+ XCreateFontCursor(dpy, cursor_names[i].shape);
*cp = cursor_names[i].cursor;
return;
}
}
- fprintf(stderr, "%s: unable to find font cursor \"%s\"\n",
- ProgramName, str);
+ twmWarning("unable to find font cursor \"%s\"", str);
}
void
@@ -164,9 +162,8 @@ NewBitmapCursor(Cursor *cp, char *source, char *mask)
XGetGeometry(dpy, spm, &JunkRoot, &sx, &sy, &sw, &sh, &JunkBW, &JunkDepth);
XGetGeometry(dpy, mpm, &JunkRoot, &mx, &my, &mw, &mh, &JunkBW, &JunkDepth);
if (sw != mw || sh != mh) {
- fprintf(stderr,
- "%s: cursor bitmaps \"%s\" and \"%s\" not the same size\n",
- ProgramName, source, mask);
+ twmWarning("cursor bitmaps \"%s\" and \"%s\" not the same size\n",
+ source, mask);
return;
}
*cp = XCreatePixmapCursor(dpy, spm, mpm, &Scr->PointerForeground,
diff --git a/src/events.c b/src/events.c
index 6c34261..9d92322 100644
--- a/src/events.c
+++ b/src/events.c
@@ -380,9 +380,8 @@ void
HandleColormapNotify(void)
{
XColormapEvent *cevent = (XColormapEvent *) &Event;
- ColormapWindow *cwin, **cwins;
+ ColormapWindow *cwin;
TwmColormap *cmap;
- int lost, won, n, number_cwins;
XPointer context_data;
if (XFindContext(dpy, cevent->window, ColormapContext, &context_data) == 0)
@@ -430,6 +429,9 @@ HandleColormapNotify(void)
}
if (cevent->serial >= Scr->cmapInfo.first_req) {
+ ColormapWindow **cwins;
+ int lost, won, n, number_cwins;
+
number_cwins = Scr->cmapInfo.cmaps->number_cwins;
/*
@@ -698,13 +700,14 @@ free_window_names(TwmWindow *tmp, Bool nukefull, Bool nukename, Bool nukeicon)
void
free_cwins(TwmWindow *tmp)
{
- int i;
- TwmColormap *cmap;
-
if (tmp->cmaps.number_cwins) {
+ int i;
+
for (i = 0; i < tmp->cmaps.number_cwins; i++) {
+
if (--tmp->cmaps.cwins[i]->refcnt == 0) {
- cmap = tmp->cmaps.cwins[i]->colormap;
+ TwmColormap *cmap = tmp->cmaps.cwins[i]->colormap;
+
if (--cmap->refcnt == 0) {
XDeleteContext(dpy, cmap->c, ColormapContext);
free(cmap);
@@ -714,6 +717,7 @@ free_cwins(TwmWindow *tmp)
}
}
free(tmp->cmaps.cwins);
+
if (tmp->cmaps.number_cwins > 1) {
free(tmp->cmaps.scoreboard);
tmp->cmaps.scoreboard = NULL;
@@ -729,7 +733,6 @@ void
HandlePropertyNotify(void)
{
char *name = NULL;
- unsigned long valuemask; /* mask for create windows */
XSetWindowAttributes attributes; /* attributes for create windows */
Pixmap pm;
@@ -894,6 +897,8 @@ HandlePropertyNotify(void)
if (Tmp_win->icon_w && !Tmp_win->forced && Tmp_win->wmhints &&
(Tmp_win->wmhints->flags & IconPixmapHint)) {
+ unsigned long valuemask; /* mask for create windows */
+
if (!XGetGeometry(dpy, Tmp_win->wmhints->icon_pixmap, &JunkRoot,
&JunkX, &JunkY,
(unsigned int *) &Tmp_win->icon_width,
@@ -1167,7 +1172,6 @@ remove_window_from_ring(TwmWindow *tmp)
void
HandleDestroyNotify(void)
{
- int i;
/*
* Warning, this is also called by HandleUnmapNotify; if it ever needs to
@@ -1198,7 +1202,10 @@ HandleDestroyNotify(void)
XDeleteContext(dpy, Tmp_win->hilite_w, TwmContext);
XDeleteContext(dpy, Tmp_win->hilite_w, ScreenContext);
}
+
if (Tmp_win->titlebuttons) {
+ int i;
+
for (i = 0; i < nb; i++) {
XDeleteContext(dpy, Tmp_win->titlebuttons[i].window,
TwmContext);
@@ -1279,7 +1286,6 @@ void
HandleMapRequest(void)
{
XPointer context_data;
- int zoom_save;
Event.xany.window = Event.xmaprequest.window;
if (XFindContext(dpy, Event.xany.window, TwmContext, &context_data) == 0)
@@ -1309,6 +1315,7 @@ HandleMapRequest(void)
if ((!Tmp_win->icon) &&
Tmp_win->wmhints && (Tmp_win->wmhints->flags & StateHint)) {
int state;
+ int zoom_save;
Window icon;
/* use WM_STATE if enabled */
@@ -1484,7 +1491,6 @@ HandleMotionNotify(void)
void
HandleButtonRelease(void)
{
- int xl, xr, yt, yb, w, h;
unsigned mask;
XPointer context_data;
@@ -1496,6 +1502,9 @@ HandleButtonRelease(void)
}
if (DragWindow != None) {
+ int xl, yt;
+ int w, h;
+
MoveOutline(Scr->Root, 0, 0, 0, 0, 0, 0);
if (XFindContext(dpy, DragWindow, TwmContext, &context_data) == 0)
@@ -1529,8 +1538,8 @@ HandleButtonRelease(void)
}
if (Scr->DontMoveOff && MoveFunction != F_FORCEMOVE) {
- xr = xl + w;
- yb = yt + h;
+ int xr = xl + w;
+ int yb = yt + h;
if (xl < 0)
xl = 0;
@@ -2218,7 +2227,6 @@ void
HandleConfigureRequest(void)
{
XWindowChanges xwc;
- unsigned long xwcm;
int x, y, width, height, bw;
int gravx, gravy;
XConfigureRequestEvent *cre = &Event.xconfigurerequest;
@@ -2258,6 +2266,8 @@ HandleConfigureRequest(void)
* to configuration requests for windows which have never been mapped.
*/
if (!Tmp_win || Tmp_win->icon_w == cre->window) {
+ unsigned long xwcm;
+
xwcm = cre->value_mask &
(CWX | CWY | CWWidth | CWHeight | CWBorderWidth);
xwc.x = cre->x;
@@ -2420,10 +2430,12 @@ ScreenInfo *
FindScreenInfo(Window w)
{
XWindowAttributes attr;
- int scrnum;
attr.screen = NULL;
+
if (XGetWindowAttributes(dpy, w, &attr)) {
+ int scrnum;
+
for (scrnum = 0; scrnum < NumScreens; scrnum++) {
if (ScreenList[scrnum] != NULL &&
(ScreenOfDisplay(dpy, ScreenList[scrnum]->screen) ==
diff --git a/src/gram.y b/src/gram.y
index 6c4f4ea..8b18038 100644
--- a/src/gram.y
+++ b/src/gram.y
@@ -56,7 +56,7 @@ in this Software without prior written authorization from The Open Group.
*
* .twmrc command grammer
*
- * 07-Jan-86 Thomas E. LaStrange File created
+ * 07-Jan-86 Thomas E. LaStrange File created
* 11-Nov-90 Dave Sternlicht Adding SaveColors
* 10-Oct-90 David M. Sternlicht Storing saved colors on root
*
@@ -65,6 +65,7 @@ in this Software without prior written authorization from The Open Group.
***********************************************************************/
%{
+
#include <stdio.h>
#include <ctype.h>
#include "twm.h"
@@ -81,16 +82,16 @@ in this Software without prior written authorization from The Open Group.
static char empty[1];
static char *Action = empty;
static char *Name = empty;
-static MenuRoot *root, *pull = NULL;
+static MenuRoot *root, *pull = NULL;
-static MenuRoot *GetRoot ( const char *name, const char *fore, const char *back );
-static void GotButton ( int butt, int func );
-static void GotKey ( char *key, int func );
-static void GotTitleButton ( char *bitmapname, int func, Bool rightside );
-static Bool CheckWarpScreenArg ( char *s );
-static Bool CheckWarpRingArg ( char *s );
-static Bool CheckColormapArg ( char *s );
-static void RemoveDQuote ( char *str );
+static MenuRoot *GetRoot(const char *name, const char *fore, const char *back);
+static void GotButton(int butt, int func);
+static void GotKey(char *key, int func);
+static void GotTitleButton(char *bitmapname, int func, Bool rightside);
+static Bool CheckWarpScreenArg(char *s);
+static Bool CheckWarpRingArg(char *s);
+static Bool CheckColormapArg(char *s);
+static void RemoveDQuote(char *str);
static char *ptr;
static name_list **list;
@@ -100,7 +101,7 @@ int mods = 0;
unsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask);
extern int yylineno;
-static void yyerror ( const char *s );
+static void yyerror(const char *s);
%}
@@ -124,355 +125,349 @@ static void yyerror ( const char *s );
%token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN
%token <num> NO_STACKMODE
%token <ptr> STRING
+%token <num> error
%type <ptr> string
%type <num> pixmap_list cursor_list color_list save_color_list stmt
%type <num> win_color_list iconm_list win_list icon_list function menu
-%type <num> noarg sarg error narg squeeze color_entry
+%type <num> noarg sarg narg squeeze color_entry
%type <num> action button number signed_number full fullkey
%start twmrc
%%
-twmrc : stmts
- ;
-
-stmts : /* Empty */
- | stmts stmt
- ;
-
-stmt : error
- | noarg
- | sarg
- | narg
- | squeeze
- | ICON_REGION string DKEYWORD DKEYWORD number number
- { AddIconRegion($2, $3, $4, $5, $6); }
- | ICONMGR_GEOMETRY string number { if (Scr->FirstTime)
- {
- Scr->iconmgr.geometry=$2;
- Scr->iconmgr.columns=$3;
- }
- }
- | ICONMGR_GEOMETRY string { if (Scr->FirstTime)
- Scr->iconmgr.geometry = $2;
- }
- | ZOOM number { if (Scr->FirstTime)
- {
- Scr->DoZoom = TRUE;
- Scr->ZoomCount = (short)$2;
- }
- }
- | ZOOM { if (Scr->FirstTime)
- Scr->DoZoom = TRUE; }
- | PIXMAPS pixmap_list {}
- | CURSORS cursor_list {}
- | ICONIFY_BY_UNMAPPING { list = &Scr->IconifyByUn; }
- win_list
- | ICONIFY_BY_UNMAPPING { if (Scr->FirstTime)
- Scr->IconifyByUnmapping = TRUE; }
- | LEFT_TITLEBUTTON string EQUALS action {
- GotTitleButton ($2, $4, False);
- }
- | RIGHT_TITLEBUTTON string EQUALS action {
- GotTitleButton ($2, $4, True);
- }
- | button string { root = GetRoot($2, NULLSTR, NULLSTR);
- Scr->Mouse[$1][C_ROOT][0].func = F_MENU;
- Scr->Mouse[$1][C_ROOT][0].menu = root;
- }
- | button action { Scr->Mouse[$1][C_ROOT][0].func = $2;
- if ($2 == F_MENU)
- {
- pull->prev = NULL;
- Scr->Mouse[$1][C_ROOT][0].menu = pull;
- }
- else
- {
- root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
- Scr->Mouse[$1][C_ROOT][0].item =
- AddToMenu(root,"x",Action,
- NULL,$2,NULLSTR,NULLSTR);
- }
- Action = empty;
- pull = NULL;
- }
- | string fullkey { GotKey($1, $2); }
- | button full { GotButton($1, $2); }
- | DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; }
- win_list
- | ICONMGR_NOSHOW { list = &Scr->IconMgrNoShow; }
- win_list
- | ICONMGR_NOSHOW { Scr->IconManagerDontShow = TRUE; }
- | ICONMGRS { list = &Scr->IconMgrs; }
- iconm_list
- | ICONMGR_SHOW { list = &Scr->IconMgrShow; }
- win_list
- | NO_TITLE_HILITE { list = &Scr->NoTitleHighlight; }
- win_list
- | NO_TITLE_HILITE { if (Scr->FirstTime)
- Scr->TitleHighlight = FALSE; }
- | NO_HILITE { list = &Scr->NoHighlight; }
- win_list
- | NO_HILITE { if (Scr->FirstTime)
- Scr->Highlight = FALSE; }
- | NO_STACKMODE { list = &Scr->NoStackModeL; }
- win_list
- | NO_STACKMODE { if (Scr->FirstTime)
- Scr->StackMode = FALSE; }
- | NO_TITLE { list = &Scr->NoTitle; }
- win_list
- | NO_TITLE { if (Scr->FirstTime)
- Scr->NoTitlebar = TRUE; }
- | MAKE_TITLE { list = &Scr->MakeTitle; }
- win_list
- | START_ICONIFIED { list = &Scr->StartIconified; }
- win_list
- | AUTO_RAISE { list = &Scr->AutoRaise; }
- win_list
- | MENU string LP string COLON string RP {
- root = GetRoot($2, $4, $6); }
- menu { root->real_menu = TRUE;}
- | MENU string { root = GetRoot($2, NULLSTR, NULLSTR); }
- menu { root->real_menu = TRUE; }
- | FUNCTION string { root = GetRoot($2, NULLSTR, NULLSTR); }
- function
- | ICONS { list = &Scr->IconNames; }
- icon_list
- | COLOR { color = COLOR; }
- color_list
- | GRAYSCALE { color = GRAYSCALE; }
- color_list
- | SAVECOLOR
+twmrc : stmts
+ ;
+
+stmts : /* Empty */
+ | stmts stmt
+ ;
+
+stmt : error
+ | noarg
+ | sarg
+ | narg
+ | squeeze
+ | ICON_REGION string DKEYWORD DKEYWORD number number
+ { AddIconRegion($2, $3, $4, $5, $6); }
+ | ICONMGR_GEOMETRY string number { if (Scr->FirstTime)
+ {
+ Scr->iconmgr.geometry=$2;
+ Scr->iconmgr.columns=$3;
+ }
+ }
+ | ICONMGR_GEOMETRY string { if (Scr->FirstTime)
+ Scr->iconmgr.geometry = $2;
+ }
+ | ZOOM number { if (Scr->FirstTime)
+ {
+ Scr->DoZoom = TRUE;
+ Scr->ZoomCount = (short)$2;
+ }
+ }
+ | ZOOM { if (Scr->FirstTime)
+ Scr->DoZoom = TRUE; }
+ | PIXMAPS pixmap_list {}
+ | CURSORS cursor_list {}
+ | ICONIFY_BY_UNMAPPING { list = &Scr->IconifyByUn; }
+ win_list
+ | ICONIFY_BY_UNMAPPING { if (Scr->FirstTime)
+ Scr->IconifyByUnmapping = TRUE; }
+ | LEFT_TITLEBUTTON string EQUALS action {
+ GotTitleButton ($2, $4, False);
+ }
+ | RIGHT_TITLEBUTTON string EQUALS action {
+ GotTitleButton ($2, $4, True);
+ }
+ | button string { root = GetRoot($2, NULLSTR, NULLSTR);
+ Scr->Mouse[$1][C_ROOT][0].func = F_MENU;
+ Scr->Mouse[$1][C_ROOT][0].menu = root;
+ }
+ | button action { Scr->Mouse[$1][C_ROOT][0].func = $2;
+ if ($2 == F_MENU)
+ {
+ pull->prev = NULL;
+ Scr->Mouse[$1][C_ROOT][0].menu = pull;
+ }
+ else
+ {
+ root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
+ Scr->Mouse[$1][C_ROOT][0].item =
+ AddToMenu(root,"x",Action,
+ NULL,$2,NULLSTR,NULLSTR);
+ }
+ Action = empty;
+ pull = NULL;
+ }
+ | string fullkey { GotKey($1, $2); }
+ | button full { GotButton($1, $2); }
+ | DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; }
+ win_list
+ | ICONMGR_NOSHOW { list = &Scr->IconMgrNoShow; }
+ win_list
+ | ICONMGR_NOSHOW { Scr->IconManagerDontShow = TRUE; }
+ | ICONMGRS { list = &Scr->IconMgrs; }
+ iconm_list
+ | ICONMGR_SHOW { list = &Scr->IconMgrShow; }
+ win_list
+ | NO_TITLE_HILITE { list = &Scr->NoTitleHighlight; }
+ win_list
+ | NO_TITLE_HILITE { if (Scr->FirstTime)
+ Scr->TitleHighlight = FALSE; }
+ | NO_HILITE { list = &Scr->NoHighlight; }
+ win_list
+ | NO_HILITE { if (Scr->FirstTime)
+ Scr->Highlight = FALSE; }
+ | NO_STACKMODE { list = &Scr->NoStackModeL; }
+ win_list
+ | NO_STACKMODE { if (Scr->FirstTime)
+ Scr->StackMode = FALSE; }
+ | NO_TITLE { list = &Scr->NoTitle; }
+ win_list
+ | NO_TITLE { if (Scr->FirstTime)
+ Scr->NoTitlebar = TRUE; }
+ | MAKE_TITLE { list = &Scr->MakeTitle; }
+ win_list
+ | START_ICONIFIED { list = &Scr->StartIconified; }
+ win_list
+ | AUTO_RAISE { list = &Scr->AutoRaise; }
+ win_list
+ | MENU string LP string COLON string RP {
+ root = GetRoot($2, $4, $6); }
+ menu { root->real_menu = TRUE;}
+ | MENU string { root = GetRoot($2, NULLSTR, NULLSTR); }
+ menu { root->real_menu = TRUE; }
+ | FUNCTION string { root = GetRoot($2, NULLSTR, NULLSTR); }
+ function
+ | ICONS { list = &Scr->IconNames; }
+ icon_list
+ | COLOR { color = COLOR; }
+ color_list
+ | GRAYSCALE { color = GRAYSCALE; }
+ color_list
+ | SAVECOLOR
save_color_list
- | MONOCHROME { color = MONOCHROME; }
- color_list
- | DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
- if ($2 == F_MENU)
- {
- pull->prev = NULL;
- Scr->DefaultFunction.menu = pull;
- }
- else
- {
- root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
- Scr->DefaultFunction.item =
- AddToMenu(root,"x",Action,
- NULL,$2, NULLSTR, NULLSTR);
- }
- Action = empty;
- pull = NULL;
- }
- | WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
- root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
- Scr->WindowFunction.item =
- AddToMenu(root,"x",Action,
- NULL,$2, NULLSTR, NULLSTR);
- Action = empty;
- pull = NULL;
- }
- | WARP_CURSOR { list = &Scr->WarpCursorL; }
- win_list
- | WARP_CURSOR { if (Scr->FirstTime)
- Scr->WarpCursor = TRUE; }
- | WINDOW_RING { list = &Scr->WindowRingL; }
- win_list
- ;
-
-
-noarg : KEYWORD { if (!do_single_keyword ($1)) {
- twmrc_error_prefix();
- fprintf (stderr,
- "unknown singleton keyword %d\n",
- $1);
- ParseError = 1;
- }
- }
- ;
-
-sarg : SKEYWORD string { if (!do_string_keyword ($1, $2)) {
- twmrc_error_prefix();
- fprintf (stderr,
- "unknown string keyword %d (value \"%s\")\n",
- $1, $2);
- ParseError = 1;
- }
- }
- ;
-
-narg : NKEYWORD number { if (!do_number_keyword ($1, $2)) {
- twmrc_error_prefix();
- fprintf (stderr,
- "unknown numeric keyword %d (value %d)\n",
- $1, $2);
- ParseError = 1;
- }
- }
- ;
-
-
-
-full : EQUALS keys COLON contexts COLON action { $$ = $6; }
- ;
-
-fullkey : EQUALS keys COLON contextkeys COLON action { $$ = $6; }
- ;
-
-keys : /* Empty */
- | keys key
- ;
-
-key : META { mods |= Mod1Mask; }
- | SHIFT { mods |= ShiftMask; }
- | LOCK { mods |= LockMask; }
- | CONTROL { mods |= ControlMask; }
- | META number { if ($2 < 1 || $2 > 5) {
- twmrc_error_prefix();
- fprintf (stderr,
- "bad modifier number (%d), must be 1-5\n",
- $2);
- ParseError = 1;
- } else {
- mods |= (Mod1Mask << ($2 - 1));
- }
- }
- | OR { }
- ;
-
-contexts : /* Empty */
- | contexts context
- ;
-
-context : WINDOW { cont |= C_WINDOW_BIT; }
- | TITLE { cont |= C_TITLE_BIT; }
- | ICON { cont |= C_ICON_BIT; }
- | ROOT { cont |= C_ROOT_BIT; }
- | FRAME { cont |= C_FRAME_BIT; }
- | ICONMGR { cont |= C_ICONMGR_BIT; }
- | META { cont |= C_ICONMGR_BIT; }
- | ALL { cont |= C_ALL_BITS; }
- | OR { }
- ;
-
-contextkeys : /* Empty */
- | contextkeys contextkey
- ;
-
-contextkey : WINDOW { cont |= C_WINDOW_BIT; }
- | TITLE { cont |= C_TITLE_BIT; }
- | ICON { cont |= C_ICON_BIT; }
- | ROOT { cont |= C_ROOT_BIT; }
- | FRAME { cont |= C_FRAME_BIT; }
- | ICONMGR { cont |= C_ICONMGR_BIT; }
- | META { cont |= C_ICONMGR_BIT; }
- | ALL { cont |= C_ALL_BITS; }
- | OR { }
- | string { Name = $1; cont |= C_NAME_BIT; }
- ;
-
-
-pixmap_list : LB pixmap_entries RB
- ;
-
-pixmap_entries : /* Empty */
- | pixmap_entries pixmap_entry
- ;
-
-pixmap_entry : TITLE_HILITE string { SetHighlightPixmap ($2); }
- ;
-
-
-cursor_list : LB cursor_entries RB
- ;
-
-cursor_entries : /* Empty */
- | cursor_entries cursor_entry
- ;
-
-cursor_entry : FRAME string string {
- NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
- | FRAME string {
- NewFontCursor(&Scr->FrameCursor, $2); }
- | TITLE string string {
- NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
- | TITLE string {
- NewFontCursor(&Scr->TitleCursor, $2); }
- | ICON string string {
- NewBitmapCursor(&Scr->IconCursor, $2, $3); }
- | ICON string {
- NewFontCursor(&Scr->IconCursor, $2); }
- | ICONMGR string string {
- NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); }
- | ICONMGR string {
- NewFontCursor(&Scr->IconMgrCursor, $2); }
- | BUTTON string string {
- NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
- | BUTTON string {
- NewFontCursor(&Scr->ButtonCursor, $2); }
- | MOVE string string {
- NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
- | MOVE string {
- NewFontCursor(&Scr->MoveCursor, $2); }
- | RESIZE string string {
- NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
- | RESIZE string {
- NewFontCursor(&Scr->ResizeCursor, $2); }
- | WAIT string string {
- NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
- | WAIT string {
- NewFontCursor(&Scr->WaitCursor, $2); }
- | MENU string string {
- NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
- | MENU string {
- NewFontCursor(&Scr->MenuCursor, $2); }
- | SELECT string string {
- NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
- | SELECT string {
- NewFontCursor(&Scr->SelectCursor, $2); }
- | KILL string string {
- NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
- | KILL string {
- NewFontCursor(&Scr->DestroyCursor, $2); }
- ;
-
-color_list : LB color_entries RB
- ;
-
-
-color_entries : /* Empty */
- | color_entries color_entry
- ;
-
-color_entry : CLKEYWORD string { if (!do_colorlist_keyword ($1, color,
- $2)) {
- twmrc_error_prefix();
- fprintf (stderr,
- "unhandled list color keyword %d (string \"%s\")\n",
- $1, $2);
- ParseError = 1;
- }
- }
- | CLKEYWORD string { list = do_colorlist_keyword($1,color,
- $2);
- if (!list) {
- twmrc_error_prefix();
- fprintf (stderr,
- "unhandled color list keyword %d (string \"%s\")\n",
- $1, $2);
- ParseError = 1;
- }
- }
- win_color_list { /* No action */; }
- | CKEYWORD string { if (!do_color_keyword ($1, color,
- $2)) {
- twmrc_error_prefix();
- fprintf (stderr,
- "unhandled color keyword %d (string \"%s\")\n",
- $1, $2);
- ParseError = 1;
- }
- }
- ;
+ | MONOCHROME { color = MONOCHROME; }
+ color_list
+ | DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
+ if ($2 == F_MENU)
+ {
+ pull->prev = NULL;
+ Scr->DefaultFunction.menu = pull;
+ }
+ else
+ {
+ root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
+ Scr->DefaultFunction.item =
+ AddToMenu(root,"x",Action,
+ NULL,$2, NULLSTR, NULLSTR);
+ }
+ Action = empty;
+ pull = NULL;
+ }
+ | WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
+ root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
+ Scr->WindowFunction.item =
+ AddToMenu(root,"x",Action,
+ NULL,$2, NULLSTR, NULLSTR);
+ Action = empty;
+ pull = NULL;
+ }
+ | WARP_CURSOR { list = &Scr->WarpCursorL; }
+ win_list
+ | WARP_CURSOR { if (Scr->FirstTime)
+ Scr->WarpCursor = TRUE; }
+ | WINDOW_RING { list = &Scr->WindowRingL; }
+ win_list
+ ;
+
+
+noarg : KEYWORD { if (!do_single_keyword ($1)) {
+ parseWarning (
+ "unknown singleton keyword %d",
+ $1);
+ ParseError = 1;
+ }
+ }
+ ;
+
+sarg : SKEYWORD string { if (!do_string_keyword ($1, $2)) {
+ parseWarning (
+ "unknown string keyword %d (value \"%s\")",
+ $1, $2);
+ ParseError = 1;
+ }
+ }
+ ;
+
+narg : NKEYWORD number { if (!do_number_keyword ($1, $2)) {
+ parseWarning (
+ "unknown numeric keyword %d (value %d)",
+ $1, $2);
+ ParseError = 1;
+ }
+ }
+ ;
+
+
+
+full : EQUALS keys COLON contexts COLON action { $$ = $6; }
+ ;
+
+fullkey : EQUALS keys COLON contextkeys COLON action { $$ = $6; }
+ ;
+
+keys : /* Empty */
+ | keys key
+ ;
+
+key : META { mods |= Mod1Mask; }
+ | SHIFT { mods |= ShiftMask; }
+ | LOCK { mods |= LockMask; }
+ | CONTROL { mods |= ControlMask; }
+ | META number { if ($2 < 1 || $2 > 5) {
+ parseWarning (
+ "bad modifier number (%d), must be 1-5",
+ $2);
+ ParseError = 1;
+ } else {
+ mods |= (Mod1Mask << ($2 - 1));
+ }
+ }
+ | OR { }
+ ;
+
+contexts : /* Empty */
+ | contexts context
+ ;
+
+context : WINDOW { cont |= C_WINDOW_BIT; }
+ | TITLE { cont |= C_TITLE_BIT; }
+ | ICON { cont |= C_ICON_BIT; }
+ | ROOT { cont |= C_ROOT_BIT; }
+ | FRAME { cont |= C_FRAME_BIT; }
+ | ICONMGR { cont |= C_ICONMGR_BIT; }
+ | META { cont |= C_ICONMGR_BIT; }
+ | ALL { cont |= C_ALL_BITS; }
+ | OR { }
+ ;
+
+contextkeys : /* Empty */
+ | contextkeys contextkey
+ ;
+
+contextkey : WINDOW { cont |= C_WINDOW_BIT; }
+ | TITLE { cont |= C_TITLE_BIT; }
+ | ICON { cont |= C_ICON_BIT; }
+ | ROOT { cont |= C_ROOT_BIT; }
+ | FRAME { cont |= C_FRAME_BIT; }
+ | ICONMGR { cont |= C_ICONMGR_BIT; }
+ | META { cont |= C_ICONMGR_BIT; }
+ | ALL { cont |= C_ALL_BITS; }
+ | OR { }
+ | string { Name = $1; cont |= C_NAME_BIT; }
+ ;
+
+
+pixmap_list : LB pixmap_entries RB
+ ;
+
+pixmap_entries : /* Empty */
+ | pixmap_entries pixmap_entry
+ ;
+
+pixmap_entry : TITLE_HILITE string { SetHighlightPixmap ($2); }
+ ;
+
+
+cursor_list : LB cursor_entries RB
+ ;
+
+cursor_entries : /* Empty */
+ | cursor_entries cursor_entry
+ ;
+
+cursor_entry : FRAME string string {
+ NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
+ | FRAME string {
+ NewFontCursor(&Scr->FrameCursor, $2); }
+ | TITLE string string {
+ NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
+ | TITLE string {
+ NewFontCursor(&Scr->TitleCursor, $2); }
+ | ICON string string {
+ NewBitmapCursor(&Scr->IconCursor, $2, $3); }
+ | ICON string {
+ NewFontCursor(&Scr->IconCursor, $2); }
+ | ICONMGR string string {
+ NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); }
+ | ICONMGR string {
+ NewFontCursor(&Scr->IconMgrCursor, $2); }
+ | BUTTON string string {
+ NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
+ | BUTTON string {
+ NewFontCursor(&Scr->ButtonCursor, $2); }
+ | MOVE string string {
+ NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
+ | MOVE string {
+ NewFontCursor(&Scr->MoveCursor, $2); }
+ | RESIZE string string {
+ NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
+ | RESIZE string {
+ NewFontCursor(&Scr->ResizeCursor, $2); }
+ | WAIT string string {
+ NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
+ | WAIT string {
+ NewFontCursor(&Scr->WaitCursor, $2); }
+ | MENU string string {
+ NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
+ | MENU string {
+ NewFontCursor(&Scr->MenuCursor, $2); }
+ | SELECT string string {
+ NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
+ | SELECT string {
+ NewFontCursor(&Scr->SelectCursor, $2); }
+ | KILL string string {
+ NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
+ | KILL string {
+ NewFontCursor(&Scr->DestroyCursor, $2); }
+ ;
+
+color_list : LB color_entries RB
+ ;
+
+
+color_entries : /* Empty */
+ | color_entries color_entry
+ ;
+
+color_entry : CLKEYWORD string { if (!do_colorlist_keyword ($1, color,
+ $2)) {
+ parseWarning (
+ "unhandled list color keyword %d (string \"%s\")",
+ $1, $2);
+ ParseError = 1;
+ }
+ }
+ | CLKEYWORD string { list = do_colorlist_keyword($1,color,
+ $2);
+ if (!list) {
+ parseWarning (
+ "unhandled color list keyword %d (string \"%s\")",
+ $1, $2);
+ ParseError = 1;
+ }
+ }
+ win_color_list { /* No action */; }
+ | CKEYWORD string { if (!do_color_keyword ($1, color,
+ $2)) {
+ parseWarning (
+ "unhandled color keyword %d (string \"%s\")",
+ $1, $2);
+ ParseError = 1;
+ }
+ }
+ ;
save_color_list : LB s_color_entries RB
;
@@ -485,189 +480,186 @@ s_color_entry : string { do_string_savecolor(color, $1); }
| CLKEYWORD { do_var_savecolor($1); }
;
-win_color_list : LB win_color_entries RB
- ;
-
-win_color_entries : /* Empty */
- | win_color_entries win_color_entry
- ;
-
-win_color_entry : string string { if (Scr->FirstTime &&
- color == Scr->Monochrome)
- AddToList(list, $1, $2); }
- ;
-
-squeeze : SQUEEZE_TITLE {
- if (HasShape) Scr->SqueezeTitle = TRUE;
- }
- | SQUEEZE_TITLE { list = &Scr->SqueezeTitleL;
- if (HasShape && Scr->SqueezeTitle == -1)
- Scr->SqueezeTitle = TRUE;
- }
- LB win_sqz_entries RB
- | DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; }
- | DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; }
- win_list
- ;
-
-win_sqz_entries : /* Empty */
- | win_sqz_entries string JKEYWORD signed_number number {
- if (Scr->FirstTime) {
- do_squeeze_entry (list, $2, $3, $4, $5);
- }
- }
- ;
-
-
-iconm_list : LB iconm_entries RB
- ;
-
-iconm_entries : /* Empty */
- | iconm_entries iconm_entry
- ;
-
-iconm_entry : string string number { if (Scr->FirstTime)
- AddToList(list, $1, (char *)
- AllocateIconManager($1, NULLSTR,
- $2,$3));
- }
- | string string string number
- { if (Scr->FirstTime)
- AddToList(list, $1, (char *)
- AllocateIconManager($1,$2,
- $3, $4));
- }
- ;
-
-win_list : LB win_entries RB
- ;
-
-win_entries : /* Empty */
- | win_entries win_entry
- ;
-
-win_entry : string { if (Scr->FirstTime)
- AddToList(list, $1, 0);
- }
- ;
-
-icon_list : LB icon_entries RB
- ;
-
-icon_entries : /* Empty */
- | icon_entries icon_entry
- ;
-
-icon_entry : string string { if (Scr->FirstTime) AddToList(list, $1, $2); }
- ;
-
-function : LB function_entries RB
- ;
+win_color_list : LB win_color_entries RB
+ ;
+
+win_color_entries : /* Empty */
+ | win_color_entries win_color_entry
+ ;
+
+win_color_entry : string string { if (Scr->FirstTime &&
+ color == Scr->Monochrome)
+ AddToList(list, $1, $2); }
+ ;
+
+squeeze : SQUEEZE_TITLE {
+ if (HasShape) Scr->SqueezeTitle = TRUE;
+ }
+ | SQUEEZE_TITLE { list = &Scr->SqueezeTitleL;
+ if (HasShape && Scr->SqueezeTitle == -1)
+ Scr->SqueezeTitle = TRUE;
+ }
+ LB win_sqz_entries RB
+ | DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; }
+ | DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; }
+ win_list
+ ;
+
+win_sqz_entries : /* Empty */
+ | win_sqz_entries string JKEYWORD signed_number number {
+ if (Scr->FirstTime) {
+ do_squeeze_entry (list, $2, $3, $4, $5);
+ }
+ }
+ ;
+
+
+iconm_list : LB iconm_entries RB
+ ;
+
+iconm_entries : /* Empty */
+ | iconm_entries iconm_entry
+ ;
+
+iconm_entry : string string number { if (Scr->FirstTime)
+ AddToList(list, $1, (char *)
+ AllocateIconManager($1, NULLSTR,
+ $2,$3));
+ }
+ | string string string number
+ { if (Scr->FirstTime)
+ AddToList(list, $1, (char *)
+ AllocateIconManager($1,$2,
+ $3, $4));
+ }
+ ;
+
+win_list : LB win_entries RB
+ ;
+
+win_entries : /* Empty */
+ | win_entries win_entry
+ ;
+
+win_entry : string { if (Scr->FirstTime)
+ AddToList(list, $1, 0);
+ }
+ ;
+
+icon_list : LB icon_entries RB
+ ;
+
+icon_entries : /* Empty */
+ | icon_entries icon_entry
+ ;
+
+icon_entry : string string { if (Scr->FirstTime) AddToList(list, $1, $2); }
+ ;
+
+function : LB function_entries RB
+ ;
function_entries: /* Empty */
- | function_entries function_entry
- ;
-
-function_entry : action { AddToMenu(root, empty, Action, NULL, $1,
- NULLSTR, NULLSTR);
- Action = empty;
- }
- ;
-
-menu : LB menu_entries RB
- ;
-
-menu_entries : /* Empty */
- | menu_entries menu_entry
- ;
-
-menu_entry : string action { AddToMenu(root, $1, Action, pull, $2,
- NULLSTR, NULLSTR);
- Action = empty;
- pull = NULL;
- }
- | string LP string COLON string RP action {
- AddToMenu(root, $1, Action, pull, $7,
- $3, $5);
- Action = empty;
- pull = NULL;
- }
- ;
-
-action : FKEYWORD { $$ = $1; }
- | FSKEYWORD string {
- $$ = $1;
- Action = $2;
- switch ($1) {
- case F_MENU:
- pull = GetRoot ($2, NULLSTR,NULLSTR);
- pull->prev = root;
- break;
- case F_WARPRING:
- if (!CheckWarpRingArg (Action)) {
- twmrc_error_prefix();
- fprintf (stderr,
- "ignoring invalid f.warptoring argument \"%s\"\n",
- Action);
- $$ = F_NOP;
- }
- break;
- case F_WARPTOSCREEN:
- if (!CheckWarpScreenArg (Action)) {
- twmrc_error_prefix();
- fprintf (stderr,
- "ignoring invalid f.warptoscreen argument \"%s\"\n",
- Action);
- $$ = F_NOP;
- }
- break;
- case F_COLORMAP:
- if (CheckColormapArg (Action)) {
- $$ = F_COLORMAP;
- } else {
- twmrc_error_prefix();
- fprintf (stderr,
- "ignoring invalid f.colormap argument \"%s\"\n",
- Action);
- $$ = F_NOP;
- }
- break;
- } /* end switch */
- }
- ;
-
-
-signed_number : number { $$ = $1; }
- | PLUS number { $$ = $2; }
- | MINUS number { $$ = -($2); }
- ;
-
-button : BUTTON number { $$ = $2;
- if ($2 == 0)
- yyerror("bad button 0");
-
- if ($2 > MAX_BUTTONS)
- {
- $$ = 0;
- yyerror("button number too large");
- }
- }
- ;
-
-string : STRING { ptr = strdup($1);
- RemoveDQuote(ptr);
- $$ = ptr;
- }
- ;
-number : NUMBER { $$ = $1; }
- ;
+ | function_entries function_entry
+ ;
+
+function_entry : action { AddToMenu(root, empty, Action, NULL, $1,
+ NULLSTR, NULLSTR);
+ Action = empty;
+ }
+ ;
+
+menu : LB menu_entries RB
+ ;
+
+menu_entries : /* Empty */
+ | menu_entries menu_entry
+ ;
+
+menu_entry : string action { AddToMenu(root, $1, Action, pull, $2,
+ NULLSTR, NULLSTR);
+ Action = empty;
+ pull = NULL;
+ }
+ | string LP string COLON string RP action {
+ AddToMenu(root, $1, Action, pull, $7,
+ $3, $5);
+ Action = empty;
+ pull = NULL;
+ }
+ ;
+
+action : FKEYWORD { $$ = $1; }
+ | FSKEYWORD string {
+ $$ = $1;
+ Action = $2;
+ switch ($1) {
+ case F_MENU:
+ pull = GetRoot ($2, NULLSTR,NULLSTR);
+ pull->prev = root;
+ break;
+ case F_WARPRING:
+ if (!CheckWarpRingArg (Action)) {
+ parseWarning (
+ "ignoring invalid f.warptoring argument \"%s\"",
+ Action);
+ $$ = F_NOP;
+ }
+ break;
+ case F_WARPTOSCREEN:
+ if (!CheckWarpScreenArg (Action)) {
+ parseWarning (
+ "ignoring invalid f.warptoscreen argument \"%s\"",
+ Action);
+ $$ = F_NOP;
+ }
+ break;
+ case F_COLORMAP:
+ if (CheckColormapArg (Action)) {
+ $$ = F_COLORMAP;
+ } else {
+ parseWarning (
+ "ignoring invalid f.colormap argument \"%s\"",
+ Action);
+ $$ = F_NOP;
+ }
+ break;
+ } /* end switch */
+ }
+ ;
+
+
+signed_number : number { $$ = $1; }
+ | PLUS number { $$ = $2; }
+ | MINUS number { $$ = -($2); }
+ ;
+
+button : BUTTON number { $$ = $2;
+ if ($2 == 0)
+ yyerror("bad button 0");
+
+ if ($2 > MAX_BUTTONS)
+ {
+ $$ = 0;
+ yyerror("button number too large");
+ }
+ }
+ ;
+
+string : STRING { ptr = strdup($1);
+ RemoveDQuote(ptr);
+ $$ = ptr;
+ }
+ ;
+number : NUMBER { $$ = $1; }
+ ;
%%
+
static void
yyerror(const char *s)
{
- twmrc_error_prefix();
- fprintf (stderr, "error in input file: %s\n", s ? s : "");
+ parseWarning("error in input file: %s", s ? s : "");
ParseError = 1;
}
@@ -678,208 +670,198 @@ RemoveDQuote(char *str)
register int n;
register int count;
- for (i=str+1, o=str; *i && *i != '\"'; o++)
- {
- if (*i == '\\')
- {
- switch (*++i)
- {
- case 'n':
- *o = '\n';
- i++;
- break;
- case 'b':
- *o = '\b';
- i++;
- break;
- case 'r':
- *o = '\r';
- i++;
- break;
- case 't':
- *o = '\t';
- i++;
- break;
- case 'f':
- *o = '\f';
- i++;
- break;
- case '0':
- if (*++i == 'x')
- goto hex;
- else
- --i;
- /* FALLTHRU */
- case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- n = 0;
- count = 0;
- while (*i >= '0' && *i <= '7' && count < 3)
- {
- n = (n<<3) + (*i++ - '0');
- count++;
- }
- *o = (char)n;
- break;
- hex:
- case 'x':
- n = 0;
- count = 0;
- while (i++, count++ < 2)
- {
- if (*i >= '0' && *i <= '9')
- n = (n<<4) + (*i - '0');
- else if (*i >= 'a' && *i <= 'f')
- n = (n<<4) + (*i - 'a') + 10;
- else if (*i >= 'A' && *i <= 'F')
- n = (n<<4) + (*i - 'A') + 10;
- else
- break;
- }
- *o = (char)n;
- break;
- case '\n':
- i++; /* punt */
- o--; /* to account for o++ at end of loop */
- break;
- case '\"':
- case '\'':
- case '\\':
- default:
- *o = *i++;
- break;
- }
- }
- else
- *o = *i++;
+ for (i = str + 1, o = str; *i && *i != '\"'; o++) {
+ if (*i == '\\') {
+ switch (*++i) {
+ case 'n':
+ *o = '\n';
+ i++;
+ break;
+ case 'b':
+ *o = '\b';
+ i++;
+ break;
+ case 'r':
+ *o = '\r';
+ i++;
+ break;
+ case 't':
+ *o = '\t';
+ i++;
+ break;
+ case 'f':
+ *o = '\f';
+ i++;
+ break;
+ case '0':
+ if (*++i == 'x')
+ goto hex;
+ else
+ --i;
+ /* FALLTHRU */
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ n = 0;
+ count = 0;
+ while (*i >= '0' && *i <= '7' && count < 3) {
+ n = (n << 3) + (*i++ - '0');
+ count++;
+ }
+ *o = (char) n;
+ break;
+ hex:
+ case 'x':
+ n = 0;
+ count = 0;
+ while (i++, count++ < 2) {
+ if (*i >= '0' && *i <= '9')
+ n = (n << 4) + (*i - '0');
+ else if (*i >= 'a' && *i <= 'f')
+ n = (n << 4) + (*i - 'a') + 10;
+ else if (*i >= 'A' && *i <= 'F')
+ n = (n << 4) + (*i - 'A') + 10;
+ else
+ break;
+ }
+ *o = (char) n;
+ break;
+ case '\n':
+ i++; /* punt */
+ o--; /* to account for o++ at end of loop */
+ break;
+ case '\"':
+ case '\'':
+ case '\\':
+ default:
+ *o = *i++;
+ break;
+ }
+ }
+ else
+ *o = *i++;
}
*o = '\0';
}
-static MenuRoot *GetRoot(const char *name, const char* fore, const char *back)
+static MenuRoot *
+GetRoot(const char *name, const char *fore, const char *back)
{
MenuRoot *tmp;
tmp = FindMenuRoot(name);
if (tmp == NULL)
- tmp = NewMenuRoot(name);
+ tmp = NewMenuRoot(name);
- if (fore)
- {
- int save;
+ if (fore) {
+ int save;
- save = Scr->FirstTime;
- Scr->FirstTime = TRUE;
- GetColor(COLOR, &tmp->hi_fore, fore);
- GetColor(COLOR, &tmp->hi_back, back);
- Scr->FirstTime = (short)save;
+ save = Scr->FirstTime;
+ Scr->FirstTime = TRUE;
+ GetColor(COLOR, &tmp->hi_fore, fore);
+ GetColor(COLOR, &tmp->hi_back, back);
+ Scr->FirstTime = (short) save;
}
return tmp;
}
-static void GotButton(int butt, int func)
+static void
+GotButton(int butt, int func)
{
int i;
- for (i = 0; i < NUM_CONTEXTS; i++)
- {
- if ((cont & (1 << i)) == 0)
- continue;
-
- Scr->Mouse[butt][i][mods].func = func;
- if (func == F_MENU)
- {
- pull->prev = NULL;
- Scr->Mouse[butt][i][mods].menu = pull;
- }
- else
- {
- root = GetRoot(TWM_ROOT, NULLSTR, NULLSTR);
- Scr->Mouse[butt][i][mods].item = AddToMenu(root,"x",Action,
- NULL, func, NULLSTR, NULLSTR);
- }
+ for (i = 0; i < NUM_CONTEXTS; i++) {
+ if ((cont & (1 << i)) == 0)
+ continue;
+
+ Scr->Mouse[butt][i][mods].func = func;
+ if (func == F_MENU) {
+ pull->prev = NULL;
+ Scr->Mouse[butt][i][mods].menu = pull;
+ }
+ else {
+ root = GetRoot(TWM_ROOT, NULLSTR, NULLSTR);
+ Scr->Mouse[butt][i][mods].item = AddToMenu(root, "x", Action,
+ NULL, func, NULLSTR, NULLSTR);
+ }
}
Action = empty;
pull = NULL;
cont = 0;
- mods_used |= (unsigned)mods;
+ mods_used |= (unsigned) mods;
mods = 0;
}
-static void GotKey(char *key, int func)
+static void
+GotKey(char *key, int func)
{
int i;
- for (i = 0; i < NUM_CONTEXTS; i++)
- {
- if ((cont & (1 << i)) == 0)
- continue;
- if (!AddFuncKey(key, i, mods, func, Name, Action))
- break;
+ for (i = 0; i < NUM_CONTEXTS; i++) {
+ if ((cont & (1 << i)) == 0)
+ continue;
+ if (!AddFuncKey(key, i, mods, func, Name, Action))
+ break;
}
Action = empty;
pull = NULL;
cont = 0;
- mods_used |= (unsigned)mods;
+ mods_used |= (unsigned) mods;
mods = 0;
}
-
-static void GotTitleButton (char *bitmapname, int func, Bool rightside)
+static void
+GotTitleButton(char *bitmapname, int func, Bool rightside)
{
- if (!CreateTitleButton (bitmapname, func, Action, pull, rightside, True)) {
- twmrc_error_prefix();
- fprintf (stderr,
- "unable to create %s titlebutton \"%s\"\n",
- rightside ? "right" : "left", bitmapname);
+ if (!CreateTitleButton(bitmapname, func, Action, pull, rightside, True)) {
+ parseWarning("unable to create %s titlebutton \"%s\"",
+ rightside ? "right" : "left", bitmapname);
}
Action = empty;
pull = NULL;
}
-static Bool CheckWarpScreenArg (char *s)
+static Bool
+CheckWarpScreenArg(char *s)
{
- XmuCopyISOLatin1Lowered (s, s);
+ XmuCopyISOLatin1Lowered(s, s);
- if (strcmp (s, WARPSCREEN_NEXT) == 0 ||
- strcmp (s, WARPSCREEN_PREV) == 0 ||
- strcmp (s, WARPSCREEN_BACK) == 0)
- return True;
+ if (strcmp(s, WARPSCREEN_NEXT) == 0 ||
+ strcmp(s, WARPSCREEN_PREV) == 0 ||
+ strcmp(s, WARPSCREEN_BACK) == 0)
+ return True;
- for (; *s && isascii(*s) && isdigit(*s); s++) ; /* SUPPRESS 530 */
+ for (; *s && isascii(*s) && isdigit(*s); s++); /* SUPPRESS 530 */
return (*s ? False : True);
}
-
-static Bool CheckWarpRingArg (char *s)
+static Bool
+CheckWarpRingArg(char *s)
{
- XmuCopyISOLatin1Lowered (s, s);
+ XmuCopyISOLatin1Lowered(s, s);
- if (strcmp (s, WARPSCREEN_NEXT) == 0 ||
- strcmp (s, WARPSCREEN_PREV) == 0)
- return True;
+ if (strcmp(s, WARPSCREEN_NEXT) == 0 ||
+ strcmp(s, WARPSCREEN_PREV) == 0)
+ return True;
return False;
}
-
-static Bool CheckColormapArg (char *s)
+static Bool
+CheckColormapArg(char *s)
{
- XmuCopyISOLatin1Lowered (s, s);
+ XmuCopyISOLatin1Lowered(s, s);
- if (strcmp (s, COLORMAP_NEXT) == 0 ||
- strcmp (s, COLORMAP_PREV) == 0 ||
- strcmp (s, COLORMAP_DEFAULT) == 0)
- return True;
+ if (strcmp(s, COLORMAP_NEXT) == 0 ||
+ strcmp(s, COLORMAP_PREV) == 0 ||
+ strcmp(s, COLORMAP_DEFAULT) == 0)
+ return True;
return False;
}
-
-
-void
-twmrc_error_prefix (void)
-{
- fprintf (stderr, "%s: line %d: ", ProgramName, yylineno);
-}
diff --git a/src/iconmgr.c b/src/iconmgr.c
index e59f849..48a2931 100644
--- a/src/iconmgr.c
+++ b/src/iconmgr.c
@@ -57,7 +57,6 @@ void
CreateIconManagers(void)
{
IconMgr *p;
- int mask;
char str[100];
char str1[100];
Pixel background;
@@ -74,9 +73,9 @@ CreateIconManagers(void)
}
for (p = &Scr->iconmgr; p != NULL; p = p->next) {
- mask = XParseGeometry(p->geometry, &JunkX, &JunkY,
- (unsigned int *) &p->width,
- (unsigned int *) &p->height);
+ int mask = XParseGeometry(p->geometry, &JunkX, &JunkY,
+ (unsigned int *) &p->width,
+ (unsigned int *) &p->height);
if (mask & XNegative)
JunkX = Scr->MyDisplayWidth - p->width -
@@ -129,7 +128,7 @@ AllocateIconManager(char *name, char *icon_name, char *geom, int columns)
#ifdef DEBUG_ICONMGR
fprintf(stderr, "AllocateIconManager\n");
fprintf(stderr, " name=\"%s\" icon_name=\"%s\", geom=\"%s\", col=%d\n",
- name, icon_name, geom, columns);
+ name, icon_name ? icon_name : "<null>", geom, columns);
#endif
if (Scr->NoIconManagers)
@@ -250,9 +249,8 @@ MoveIconManager(int dir)
}
if (!got_it) {
- fprintf(stderr,
- "%s: unable to find window (%d, %d) in icon manager\n",
- ProgramName, new_row, new_col);
+ twmWarning("unable to find window (%d, %d) in icon manager",
+ new_row, new_col);
return;
}
@@ -290,8 +288,6 @@ JumpIconManager(int dir)
{
IconMgr *ip, *tmp_ip = NULL;
int got_it = FALSE;
- ScreenInfo *sp;
- int screen;
if (!Active)
return;
@@ -309,8 +305,11 @@ JumpIconManager(int dir)
if (!got_it) {
int origscreen = ip->scr->screen;
int inc = (dir == F_NEXTICONMGR ? 1 : -1);
+ int screen;
for (screen = origscreen + inc;; screen += inc) {
+ ScreenInfo *sp;
+
if (screen >= NumScreens)
screen = 0;
else if (screen < 0)
@@ -629,7 +628,6 @@ void
PackIconManager(IconMgr *ip)
{
int newwidth, i, row, col, maxcol, colinc, rowinc, wheight, wwidth;
- int new_x, new_y;
int savewidth;
WList *tmp;
@@ -645,7 +643,10 @@ PackIconManager(IconMgr *ip)
row = 0;
col = ip->columns;
maxcol = 0;
+
for (i = 0, tmp = ip->first; tmp != NULL; i++, tmp = tmp->next) {
+ int new_x, new_y;
+
tmp->me = i;
if (++col >= ip->columns) {
col = 0;
diff --git a/src/iconmgr.h b/src/iconmgr.h
index c74ffb1..ae9214a 100644
--- a/src/iconmgr.h
+++ b/src/iconmgr.h
@@ -34,6 +34,8 @@ in this Software without prior written authorization from The Open Group.
#ifndef _ICONMGR_
#define _ICONMGR_
+#include "twm.h"
+
typedef struct WList {
struct WList *next;
struct WList *prev;
diff --git a/src/icons.c b/src/icons.c
index a437963..bf8d8aa 100644
--- a/src/icons.c
+++ b/src/icons.c
@@ -323,10 +323,11 @@ FreeIconEntries(IconRegion *ir)
void
FreeIconRegions(void)
{
- IconRegion *ir, *tmp;
+ IconRegion *ir;
for (ir = Scr->FirstRegion; ir != NULL;) {
- tmp = ir;
+ IconRegion *tmp = ir;
+
FreeIconEntries(ir);
ir = ir->next;
free(tmp);
@@ -344,7 +345,6 @@ CreateIconWindow(TwmWindow *tmp_win, int def_x, int def_y)
XSetWindowAttributes attributes; /* attributes for create windows */
Pixmap pm = None; /* tmp pixmap variable */
int final_x, final_y;
- int x;
FB(tmp_win->iconc.fore, tmp_win->iconc.back);
@@ -536,6 +536,7 @@ CreateIconWindow(TwmWindow *tmp_win, int def_x, int def_y)
if (pm != None &&
(!(tmp_win->wmhints && tmp_win->wmhints->flags & IconWindowHint))) {
int y;
+ int x;
y = 0;
if (tmp_win->icon_w_width == tmp_win->icon_width)
diff --git a/src/icons.h b/src/icons.h
index 4945967..4bac87a 100644
--- a/src/icons.h
+++ b/src/icons.h
@@ -34,6 +34,8 @@ in this Software without prior written authorization from The Open Group.
#ifndef ICONS_H
#define ICONS_H
+#include "twm.h"
+
typedef struct IconRegion {
struct IconRegion *next;
int x, y, w, h;
diff --git a/src/lex.l b/src/lex.l
index 320d206..d07a085 100644
--- a/src/lex.l
+++ b/src/lex.l
@@ -1,4 +1,5 @@
%{
+
/*****************************************************************************/
/*
@@ -56,12 +57,14 @@ in this Software without prior written authorization from The Open Group.
*
* .twmrc lex file
*
- * 12-Nov-87 Thomas E. LaStrange File created
+ * 12-Nov-87 Thomas E. LaStrange File created
*
***********************************************************************/
/* $XFree86: xc/programs/twm/lex.l,v 3.13 2001/08/27 21:11:39 dawes Exp $ */
-/* #include <stdio.h> */ /* lex already includes stdio.h */
+#define YY_NO_INPUT /* we have our own! */
+
+/* #include <stdio.h> */ /* lex already includes stdio.h */
#include "twm.h"
#include "gram.h"
#include "list.h"
@@ -72,75 +75,81 @@ int yylineno;
#undef YY_INPUT
#define YY_INPUT(buf,result,size) ((result) = doinput((buf),(size)))
-static int doinput (char *buf, int size)
+static int
+doinput(char *buf, int size)
{
- int c;
+ int c;
- if (size == 0)
- return (0);
+ if (size == 0)
+ return (0);
- if ((c = (*twmInputFunc)()) <= 0)
- return (0);
+ if ((c = (*twmInputFunc) ()) <= 0)
+ return (0);
- buf[0] = (char)c;
- return (1);
+ buf[0] = (char) c;
+ if (c == '\n')
+ ++yylineno;
+ return (1);
}
#define YY_NO_UNPUT
#endif
%}
-string \"([^"]|\\.)*\"
-number [0-9]+
+string \"([^"]|\\.)*\"
+number [0-9]+
%%
-"{" { return (LB); }
-"}" { return (RB); }
-"(" { return (LP); }
-")" { return (RP); }
-"=" { return (EQUALS); }
-":" { return (COLON); }
-"+" { return PLUS; }
-"-" { return MINUS; }
-"|" { return OR; }
-
-[a-zA-Z\.]+ { int token = parse_keyword ((char *)yytext,
- &yylval.num);
- if (token == ERRORTOKEN) {
- twmrc_error_prefix();
- fprintf (stderr,
- "ignoring unknown keyword: %s\n",
- yytext);
- ParseError = 1;
- } else
- return token;
- }
-
-"!" { yylval.num = F_EXEC; return FSKEYWORD; }
-"^" { yylval.num = F_CUT; return FSKEYWORD; }
-
-{string} { yylval.ptr = (char *)yytext; return STRING; }
-{number} { (void)sscanf((char *)yytext, "%d", &yylval.num);
- return (NUMBER);
- }
-\#[^\n]*\n {;}
-[\r\n\t ] {;}
-. {
- twmrc_error_prefix();
- fprintf (stderr,
- "ignoring character \"%s\"\n",
- yytext);
- ParseError = 1;
- }
+"{" { return (LB); }
+"}" { return (RB); }
+"(" { return (LP); }
+")" { return (RP); }
+"=" { return (EQUALS); }
+":" { return (COLON); }
+"+" { return PLUS; }
+"-" { return MINUS; }
+"|" { return OR; }
+
+[a-zA-Z\.]+ { int token = parse_keyword ((char *)yytext,
+ &yylval.num);
+ if (token == ERRORTOKEN) {
+ parseWarning (
+ "ignoring unknown keyword: %s",
+ yytext);
+ ParseError = 1;
+ } else
+ return token;
+ }
+
+"!" { yylval.num = F_EXEC; return FSKEYWORD; }
+"^" { yylval.num = F_CUT; return FSKEYWORD; }
+
+{string} { yylval.ptr = (char *)yytext; return STRING; }
+{number} { (void)sscanf((char *)yytext, "%d", &yylval.num);
+ return (NUMBER);
+ }
+\#[^\n]*\n {;}
+[\r\n\t ] {;}
+. {
+ parseWarning (
+ "ignoring character \"%s\"",
+ yytext);
+ ParseError = 1;
+ }
%%
+
#ifndef yywrap
-int yywrap() { return(1);}
+int
+yywrap()
+{
+ return (1);
+}
#endif
#undef unput
#undef input
#undef output
#undef feof
-#define unput(c) twmUnput(c)
-#define input() (*twmInputFunc)()
-#define output(c) TwmOutput(c)
-#define feof() (1)
+#define unput(c) twmUnput(c)
+#define input() (*twmInputFunc)()
+#define output(c) TwmOutput(c)
+#define feof() (1)
diff --git a/src/list.c b/src/list.c
index 9d9bec8..4422cc9 100644
--- a/src/list.c
+++ b/src/list.c
@@ -92,9 +92,8 @@ AddToList(name_list ** list_head, char *name, char *ptr)
nptr = malloc(sizeof(name_list));
if (nptr == NULL) {
- twmrc_error_prefix();
- fprintf(stderr, "unable to allocate %ld bytes for name_list\n",
- (unsigned long) sizeof(name_list));
+ parseWarning("unable to allocate %lu bytes for name_list",
+ (unsigned long) sizeof(name_list));
Done(NULL, NULL);
}
diff --git a/src/menus.c b/src/menus.c
index 5448bad..c721e00 100644
--- a/src/menus.c
+++ b/src/menus.c
@@ -133,7 +133,7 @@ void
InitMenus(void)
{
int i, j, k;
- FuncKey *key, *tmp;
+ FuncKey *key;
for (i = 0; i < MAX_BUTTONS + 1; i++)
for (j = 0; j < NUM_CONTEXTS; j++)
@@ -147,8 +147,9 @@ InitMenus(void)
if (FirstScreen) {
for (key = Scr->FuncKeyRoot.next; key != NULL;) {
+ FuncKey *tmp = key;
+
free(key->name);
- tmp = key;
key = key->next;
free(tmp);
}
@@ -215,9 +216,8 @@ CreateTitleButton(const char *name, int func, const char *action,
TitleButton *tb = malloc(sizeof(TitleButton));
if (!tb) {
- fprintf(stderr,
- "%s: unable to allocate %ld bytes for title button\n",
- ProgramName, (unsigned long) sizeof(TitleButton));
+ twmWarning("unable to allocate %lu bytes for title button",
+ (unsigned long) sizeof(TitleButton));
return 0;
}
@@ -306,11 +306,11 @@ InitTitlebarButtons(void)
/* insert extra buttons */
if (!CreateTitleButton(TBPM_ICONIFY, F_ICONIFY, "", (MenuRoot *) NULL,
False, False)) {
- fprintf(stderr, "%s: unable to add iconify button\n", ProgramName);
+ twmWarning("unable to add iconify button");
}
if (!CreateTitleButton(TBPM_RESIZE, F_RESIZE, "", (MenuRoot *) NULL,
True, True)) {
- fprintf(stderr, "%s: unable to add resize button\n", ProgramName);
+ twmWarning("unable to add resize button");
}
AddDefaultBindings();
}
@@ -325,9 +325,7 @@ InitTitlebarButtons(void)
if (!tb->bitmap) {
tb->bitmap = FindBitmap(TBPM_QUESTION, &tb->width, &tb->height);
if (!tb->bitmap) { /* cannot happen (see util.c) */
- fprintf(stderr,
- "%s: unable to add titlebar button \"%s\"\n",
- ProgramName, tb->name);
+ twmWarning("unable to add titlebar button \"%s\"", tb->name);
}
}
@@ -366,7 +364,6 @@ PaintEntry(MenuRoot *mr, MenuItem *mi, int exposure)
text_y = y_offset + Scr->MenuFont.y;
if (mi->func != F_TITLE) {
- int x, y;
if (mi->state) {
XSetForeground(dpy, Scr->NormalGC, mi->hi_back);
@@ -401,6 +398,8 @@ PaintEntry(MenuRoot *mr, MenuItem *mi, int exposure)
}
if (mi->func == F_MENU) {
+ int x, y;
+
/* create the pull right pixmap if needed */
if (Scr->pullPm == None) {
Scr->pullPm = CreateMenuIcon(Scr->MenuFont.height,
@@ -414,8 +413,6 @@ PaintEntry(MenuRoot *mr, MenuItem *mi, int exposure)
}
}
else {
- int y;
-
XSetForeground(dpy, Scr->NormalGC, mi->back);
/* fill the rectangle with the title background color */
@@ -423,6 +420,8 @@ PaintEntry(MenuRoot *mr, MenuItem *mi, int exposure)
(unsigned) mr->width, (unsigned) Scr->EntryHeight);
{
+ int y;
+
XSetForeground(dpy, Scr->NormalGC, mi->fore);
/* now draw the dividing lines */
if (y_offset)
@@ -658,8 +657,8 @@ AddToMenu(MenuRoot *menu, const char *item, const char *action,
int width;
#ifdef DEBUG_MENUS
- fprintf(stderr, "adding menu item=\"%s\", action=%s, sub=%d, f=%d\n",
- item, action, sub, func);
+ fprintf(stderr, "adding menu item=\"%s\", action=%s, sub=%p, f=%d\n",
+ item, action ? action : "<null>", sub, func);
#endif
tmp = malloc(sizeof(MenuItem));
@@ -731,18 +730,17 @@ MakeMenu(MenuRoot *mr)
XColor f1, f2, f3;
XColor b1, b2, b3;
XColor save_fore, save_back;
- int num, i;
- int fred, fgreen, fblue;
- int bred, bgreen, bblue;
- int width;
- unsigned long valuemask;
+ int i;
XSetWindowAttributes attributes;
Colormap cmap = Scr->TwmRoot.cmaps.cwins[0]->colormap->c;
Scr->EntryHeight = Scr->MenuFont.height + 4;
- /* lets first size the window accordingly */
+ /* let's first size the window accordingly */
if (mr->mapped == NEVER_MAPPED) {
+ int width;
+ unsigned long valuemask;
+
if (mr->pull == TRUE) {
mr->width = (short) (mr->width + (16 + 10));
}
@@ -837,7 +835,12 @@ MakeMenu(MenuRoot *mr)
return;
start = mr->first;
+
while (TRUE) {
+ int num;
+ int fred, fgreen, fblue;
+ int bred, bgreen, bblue;
+
for (; start != NULL; start = start->next) {
if (start->user_colors)
break;
@@ -915,10 +918,8 @@ MakeMenu(MenuRoot *mr)
Bool
PopUpMenu(MenuRoot *menu, int x, int y, Bool center)
{
- int WindowNameCount;
TwmWindow **WindowNames;
TwmWindow *tmp_win2, *tmp_win3;
- int i;
int (*compar) (const char *, const char *) =
(Scr->CaseSensitive ? strcmp : XmuCompareISOLatin1);
@@ -929,6 +930,7 @@ PopUpMenu(MenuRoot *menu, int x, int y, Bool center)
if (menu == Scr->Windows) {
TwmWindow *tmp_win;
+ int WindowNameCount;
/* this is the twm windows menu, let's go ahead and build it */
@@ -945,10 +947,14 @@ PopUpMenu(MenuRoot *menu, int x, int y, Bool center)
for (tmp_win = Scr->TwmRoot.next, WindowNameCount = 0;
tmp_win != NULL; tmp_win = tmp_win->next)
WindowNameCount++;
+
if (WindowNameCount != 0) {
+ int i;
+
WindowNames =
malloc(sizeof(TwmWindow *) * (size_t) WindowNameCount);
WindowNames[0] = Scr->TwmRoot.next;
+
for (tmp_win = Scr->TwmRoot.next->next, WindowNameCount = 1;
tmp_win != NULL; tmp_win = tmp_win->next, WindowNameCount++) {
tmp_win2 = tmp_win;
@@ -1285,7 +1291,7 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
if (smcConn)
SmcCloseConnection(smcConn, 0, NULL);
execvp(*Argv, Argv);
- fprintf(stderr, "%s: unable to restart: %s\n", ProgramName, *Argv);
+ twmWarning("unable to restart: %s", *Argv);
break;
}
@@ -1687,7 +1693,7 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
}
if (ConstMoveDir != MOVE_NONE) {
- int xl, yt, xr, yb, w2, h;
+ int xl, yt, w2, h;
xl = ConstMoveX;
yt = ConstMoveY;
@@ -1695,8 +1701,8 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
h = (int) ((unsigned) DragHeight + 2 * JunkBW);
if (Scr->DontMoveOff && MoveFunction != F_FORCEMOVE) {
- xr = xl + w2;
- yb = yt + h;
+ int xr = xl + w2;
+ int yb = yt + h;
if (xl < 0)
xl = 0;
@@ -1719,7 +1725,7 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
}
}
else if (DragWindow != None) {
- int xl, yt, xr, yb, w2, h;
+ int xl, yt, w2, h;
if (!menuFromFrameOrWindowOrTitlebar) {
xl = (int) ((unsigned) eventp->xmotion.x_root -
@@ -1735,8 +1741,8 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
h = (int) ((unsigned) DragHeight + 2 * JunkBW);
if (Scr->DontMoveOff && MoveFunction != F_FORCEMOVE) {
- xr = xl + w2;
- yb = yt + h;
+ int xr = xl + w2;
+ int yb = yt + h;
if (xl < 0)
xl = 0;
@@ -1773,8 +1779,7 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
MenuItem *mitem;
if ((mroot = FindMenuRoot(action)) == NULL) {
- fprintf(stderr, "%s: couldn't find function \"%s\"\n",
- ProgramName, action);
+ twmWarning("couldn't find function \"%s\"", action);
return TRUE;
}
@@ -1943,9 +1948,7 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
close(fd);
}
else {
- fprintf(stderr,
- "%s: unable to open cut file \"%s\"\n",
- ProgramName, tmp);
+ twmWarning("unable to open cut file \"%s\"", tmp);
}
free(ptr);
}
@@ -1955,7 +1958,7 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
}
}
else {
- fprintf(stderr, "%s: cut buffer is empty\n", ProgramName);
+ twmWarning("cut buffer is empty");
}
break;
@@ -1994,7 +1997,6 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
case F_WARPNEXT:
{
register TwmWindow *t;
- static TwmWindow *savedwarp = NULL;
TwmWindow *of, *l, *n;
int c = 0;
@@ -2019,9 +2021,12 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
if (t == of)
c++;
- if (bwin(t) || c >= 2)
+ if (bwin(t) || c >= 2) {
Bell(XkbBI_MinorError, 0, None);
+ }
else {
+ static TwmWindow *savedwarp = NULL;
+
if (of && of == savedwarp) {
Iconify(of, 0, 0);
savedwarp = NULL;
@@ -2132,13 +2137,12 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
close(fd);
}
else {
- fprintf(stderr, "%s: unable to open file \"%s\"\n",
- ProgramName, ptr);
+ twmWarning("unable to open file \"%s\"", ptr);
}
free(ptr);
}
else {
- fprintf(stderr, "%s: error expanding filename\n", ProgramName);
+ twmWarning("error expanding filename");
}
break;
@@ -2194,7 +2198,7 @@ ExecuteFunction(int func, const char *action, Window w, TwmWindow *tmp_win,
break;
case F_STARTWM:
execlp("/bin/sh", "sh", "-c", action, (void *) NULL);
- fprintf(stderr, "%s: unable to start: %s\n", ProgramName, *Argv);
+ twmWarning("unable to start: %s", *Argv);
break;
}
@@ -2281,25 +2285,33 @@ NeedToDefer(MenuRoot *root)
return FALSE;
}
+/*
+ * We cannot safely free a value passed to putenv, but we can cache the most
+ * recent value, reducing the memory leaks.
+ */
+#define cache_env(saved) \
+ if (saved == NULL || strcmp(saved, update)) { \
+ saved = update; \
+ } else { \
+ free(update); \
+ update = saved; \
+ }
+
static void
Execute(const char *s)
{
- /* FIXME: is all this stuff needed? There could be security problems here. */
- static char buf[256];
+ static const char display_eqls[] = "DISPLAY=";
+ static char *main_display;
+ static char *exec_display;
+
char *ds = DisplayString(dpy);
- char *colon, *dot1;
- char oldDisplay[256];
- char *doisplay;
- int restorevar = 0;
-
- oldDisplay[0] = '\0';
- doisplay = getenv("DISPLAY");
- if (doisplay)
- if (strlcpy (oldDisplay, doisplay, sizeof(oldDisplay)) >=
- sizeof(oldDisplay)) {
- /* some error report? */
- return;
- }
+ char *colon;
+ char *oldDisplay = NULL;
+ char *value;
+ Bool restorevar = False;
+
+ value = getenv("DISPLAY");
+ oldDisplay = strdup(value ? value : "");
/*
* Build a display string using the current screen number, so that
@@ -2307,24 +2319,42 @@ Execute(const char *s)
* that they were invoked from, unless specifically overridden on
* their command line.
*/
- colon = strrchr (ds, ':');
- if (colon) { /* if host[:]:dpy */
- strlcpy (buf, "DISPLAY=", sizeof(buf));
- strlcat (buf, ds, sizeof(buf));
- colon = buf + 8 + (colon - ds); /* use version in buf */
- dot1 = strchr (colon, '.'); /* first period after colon */
- if (!dot1) dot1 = colon + strlen (colon); /* if not there, append */
- (void) sprintf (dot1, ".%d", Scr->screen);
- putenv (buf);
- restorevar = 1;
+ colon = strrchr(ds, ':');
+ if (colon) { /* if host[:]:dpy */
+ size_t need = sizeof(display_eqls) + strlen(ds) + 10;
+ char *update = malloc(need);
+
+ if (update != NULL) {
+ char *dot1;
+
+ strlcpy(update, display_eqls, need);
+ strlcat(update, ds, need);
+ colon = strrchr(update, ':');
+ dot1 = strchr(colon, '.'); /* first period after colon */
+ if (dot1 == NULL)
+ dot1 = colon + strlen(colon); /* if not there, append */
+ (void) sprintf(dot1, ".%d", Scr->screen);
+ cache_env(exec_display);
+ if (strcmp(update, oldDisplay)) {
+ putenv(update);
+ restorevar = True;
+ }
+ }
}
(void) system(s);
- if (restorevar) { /* why bother? */
- (void) snprintf(buf, sizeof(buf), "DISPLAY=%s", oldDisplay);
- putenv(buf);
+ if (restorevar) {
+ size_t need = sizeof(display_eqls) + strlen(oldDisplay);
+ char *update = malloc(need);
+
+ if (update != NULL) {
+ (void) snprintf(update, need, "%s%s", display_eqls, oldDisplay);
+ cache_env(main_display);
+ putenv(update);
+ }
}
+ free(oldDisplay);
}
/**
@@ -2505,7 +2535,7 @@ Iconify(TwmWindow *tmp_win, int def_x, int def_y)
static void
Identify(TwmWindow *t)
{
- int i, n, twidth, width, height;
+ int i, n, width, height;
int x, y;
unsigned int wwidth, wheight, bw, depth;
Window junk;
@@ -2528,9 +2558,9 @@ Identify(TwmWindow *t)
"Class.res_class = \"%s\"", t->class.res_class);
Info[n++][0] = '\0';
snprintf(Info[n++], INFO_SIZE,
- "Geometry/root = %dx%d+%d+%d", wwidth, wheight, x, y);
- snprintf(Info[n++], INFO_SIZE, "Border width = %d", bw);
- snprintf(Info[n++], INFO_SIZE, "Depth = %d", depth);
+ "Geometry/root = %ux%u+%d+%d", wwidth, wheight, x, y);
+ snprintf(Info[n++], INFO_SIZE, "Border width = %u", bw);
+ snprintf(Info[n++], INFO_SIZE, "Depth = %u", depth);
if (HasSync) {
int priority;
@@ -2546,8 +2576,9 @@ Identify(TwmWindow *t)
height = n * (Scr->DefaultFont.height + 2);
width = 1;
for (i = 0; i < n; i++) {
- twidth = MyFont_TextWidth(&Scr->DefaultFont, Info[i],
- (int) strlen(Info[i]));
+ int twidth = MyFont_TextWidth(&Scr->DefaultFont, Info[i],
+ (int) strlen(Info[i]));
+
if (twidth > width)
width = twidth;
}
@@ -2637,8 +2668,7 @@ WarpToScreen(int n, int inc)
n += inc;
continue;
}
- fprintf(stderr, "%s: unable to warp to unmanaged screen %d\n",
- ProgramName, n);
+ twmWarning("unable to warp to unmanaged screen %d", n);
Bell(XkbBI_MinorError, 0, None);
return;
}
@@ -2661,7 +2691,6 @@ WarpToScreen(int n, int inc)
static void
BumpWindowColormap(TwmWindow *tmp, int inc)
{
- int i, j, previously_installed;
ColormapWindow **cwins;
if (!tmp)
@@ -2671,6 +2700,9 @@ BumpWindowColormap(TwmWindow *tmp, int inc)
cwins =
malloc(sizeof(ColormapWindow *) * (size_t) tmp->cmaps.number_cwins);
if (cwins) {
+ int i;
+ int previously_installed;
+
/* SUPPRESS 560 */
if ((previously_installed = (Scr->cmapInfo.cmaps == &tmp->cmaps &&
tmp->cmaps.number_cwins))) {
@@ -2679,7 +2711,8 @@ BumpWindowColormap(TwmWindow *tmp, int inc)
}
for (i = 0; i < tmp->cmaps.number_cwins; i++) {
- j = i - inc;
+ int j = i - inc;
+
if (j >= tmp->cmaps.number_cwins)
j -= tmp->cmaps.number_cwins;
else if (j < 0)
diff --git a/src/menus.h b/src/menus.h
index de0629c..0692a27 100644
--- a/src/menus.h
+++ b/src/menus.h
@@ -60,6 +60,8 @@ in this Software without prior written authorization from The Open Group.
#ifndef _MENUS_
#define _MENUS_
+#include "twm.h"
+
#define TWM_ROOT "bLoB_GoOp" /* my private root menu */
#define TWM_WINDOWS "TwmWindows" /* for f.menu "TwmWindows" */
diff --git a/src/parse.c b/src/parse.c
index d81c2f3..48430b3 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -58,14 +58,17 @@ in this Software without prior written authorization from The Open Group.
***********************************************************************/
#include <stdio.h>
+#include <stdarg.h>
#include <X11/Xos.h>
#include <X11/Xmu/CharSet.h>
+
#include "twm.h"
#include "screen.h"
#include "menus.h"
#include "util.h"
#include "gram.h"
#include "parse.h"
+
#include <X11/Xatom.h>
#include <X11/extensions/sync.h>
@@ -82,8 +85,6 @@ static unsigned char overflowbuff[20]; /* really only need one */
static int overflowlen;
static unsigned char **stringListSource, *currentString;
-static int doparse(int (*ifunc) (void), const char *srctypename,
- const char *srcname);
static int twmFileInput(void);
static int twmStringListInput(void);
static int ParseUsePPosition(char *s);
@@ -95,6 +96,9 @@ int ConstrainedMoveTime = 400; /* milliseconds, event times */
int (*twmInputFunc) (void);
+static const char *twmInputFile;
+static const char *twmInputType;
+
/**
* parse the .twmrc file
* \param filename the filename to parse. NULL indicates $HOME/.twmrc
@@ -108,6 +112,8 @@ doparse(int (*ifunc) (void), const char *srctypename, const char *srcname)
yylineno = 1;
ParseError = FALSE;
twmInputFunc = ifunc;
+ twmInputFile = srcname;
+ twmInputType = srctypename;
overflowlen = 0;
yyparse();
@@ -146,11 +152,12 @@ doparse(int (*ifunc) (void), const char *srctypename, const char *srcname)
&Scr->PointerForeground, &Scr->PointerBackground);
}
if (ParseError) {
- fprintf(stderr, "%s: errors found in twm %s",
- ProgramName, srctypename);
- if (srcname)
- fprintf(stderr, " \"%s\"", srcname);
- fprintf(stderr, "\n");
+ if (srcname) {
+ twmWarning("errors found in twm %s \"%s\"", srctypename, srcname);
+ }
+ else {
+ twmWarning("errors found in twm %s", srctypename);
+ }
}
return (ParseError ? 0 : 1);
}
@@ -206,9 +213,8 @@ ParseTwmrc(char *filename)
int status;
if (filename && cp != filename) {
- fprintf(stderr,
- "%s: unable to open twmrc file %s, using %s instead\n",
- ProgramName, filename, cp);
+ twmWarning("unable to open twmrc file %s, using %s instead",
+ filename, cp);
}
status = doparse(twmFileInput, "file", cp);
fclose(twmrc);
@@ -216,9 +222,8 @@ ParseTwmrc(char *filename)
}
else {
if (filename) {
- fprintf(stderr,
- "%s: unable to open twmrc file %s, using built-in defaults instead\n",
- ProgramName, filename);
+ twmWarning("unable to open twmrc file %s,"
+ " using built-in defaults instead", filename);
}
return ParseStringList(defTwmrc);
}
@@ -285,8 +290,7 @@ twmUnput(int c)
overflowbuff[overflowlen++] = (unsigned char) c;
}
else {
- twmrc_error_prefix();
- fprintf(stderr, "unable to unput character (%d)\n", c);
+ parseWarning("unable to unput character (%d)", c);
}
}
@@ -749,9 +753,7 @@ do_string_keyword(int keyword, char *s)
int ppos = ParseUsePPosition(s);
if (ppos < 0) {
- twmrc_error_prefix();
- fprintf(stderr,
- "ignoring invalid UsePPosition argument \"%s\"\n", s);
+ parseWarning("ignoring invalid UsePPosition argument \"%s\"", s);
}
else {
Scr->UsePPosition = (short) ppos;
@@ -800,13 +802,11 @@ do_string_keyword(int keyword, char *s)
&JunkHeight);
if ((JunkMask & (WidthValue | HeightValue)) !=
(WidthValue | HeightValue)) {
- twmrc_error_prefix();
- fprintf(stderr, "bad MaxWindowSize \"%s\"\n", s);
+ parseWarning("bad MaxWindowSize \"%s\"", s);
return 0;
}
if (JunkWidth <= 0 || JunkHeight <= 0) {
- twmrc_error_prefix();
- fprintf(stderr, "MaxWindowSize \"%s\" must be positive\n", s);
+ parseWarning("MaxWindowSize \"%s\" must be positive", s);
return 0;
}
Scr->MaxWindowWidth = (int) JunkWidth;
@@ -983,19 +983,20 @@ do_color_keyword(int keyword, int colormode, char *s)
static void
put_pixel_on_root(Pixel pixel)
{
- int i, addPixel = 1;
+ int addPixel = 1;
Atom pixelAtom, retAtom;
int retFormat;
unsigned long nPixels, retAfter;
unsigned char *retProp;
- Pixel *pixelProp;
pixelAtom = XInternAtom(dpy, "_MIT_PRIORITY_COLORS", True);
if (XGetWindowProperty(dpy, Scr->Root, pixelAtom, 0, 8192,
False, XA_CARDINAL, &retAtom,
&retFormat, &nPixels, &retAfter,
&retProp) == Success) {
- pixelProp = (Pixel *) retProp;
+ int i;
+ Pixel *pixelProp = (Pixel *) retProp;
+
for (i = 0; (unsigned long) i < nPixels; i++)
if (pixel == pixelProp[i])
addPixel = 0;
@@ -1134,20 +1135,16 @@ do_squeeze_entry(name_list ** list, char *name, int justify, int num, int denom)
int absnum = (num < 0 ? -num : num);
if (denom < 0) {
- twmrc_error_prefix();
- fprintf(stderr, "negative SqueezeTitle denominator %d\n", denom);
+ parseWarning("negative SqueezeTitle denominator %d", denom);
return;
}
if (absnum > denom && denom != 0) {
- twmrc_error_prefix();
- fprintf(stderr, "SqueezeTitle fraction %d/%d outside window\n",
- num, denom);
+ parseWarning("SqueezeTitle fraction %d/%d outside window", num, denom);
return;
}
if (denom == 1) {
- twmrc_error_prefix();
- fprintf(stderr, "useless SqueezeTitle faction %d/%d, assuming 0/0\n",
- num, denom);
+ parseWarning("useless SqueezeTitle faction %d/%d, assuming 0/0",
+ num, denom);
num = 0;
denom = 0;
}
@@ -1158,9 +1155,8 @@ do_squeeze_entry(name_list ** list, char *name, int justify, int num, int denom)
sinfo = malloc(sizeof(SqueezeInfo));
if (!sinfo) {
- twmrc_error_prefix();
- fprintf(stderr, "unable to allocate %ld bytes for squeeze info\n",
- (unsigned long) sizeof(SqueezeInfo));
+ parseWarning("unable to allocate %lu bytes for squeeze info",
+ (unsigned long) sizeof(SqueezeInfo));
return;
}
sinfo->justify = justify;
@@ -1169,3 +1165,23 @@ do_squeeze_entry(name_list ** list, char *name, int justify, int num, int denom)
AddToList(list, name, (char *) sinfo);
}
}
+
+void
+parseWarning(const char *format, ...)
+{
+ if (message_level > 0) {
+ va_list ap;
+
+ va_start(ap, format);
+ if (twmInputFile != NULL) {
+ fprintf(stderr, "%s: line %d: ", twmInputFile, yylineno);
+ }
+ else {
+ fprintf(stderr, "%s[%s]: line %d: ", ProgramName, twmInputType,
+ yylineno);
+ }
+ vfprintf(stderr, format, ap);
+ fputc('\n', stderr);
+ va_end(ap);
+ }
+}
diff --git a/src/resize.c b/src/resize.c
index 07a1015..dce406d 100644
--- a/src/resize.c
+++ b/src/resize.c
@@ -608,7 +608,7 @@ ConstrainSize(TwmWindow *tmp_win, int *widthp, int *heightp)
#define makemult(a,b) ((b==1) ? (a) : (((int)((a)/(b))) * (b)) )
#define _min(a,b) (((a) < (b)) ? (a) : (b))
- int minWidth, minHeight, maxWidth, maxHeight, xinc, yinc, delta;
+ int minWidth, minHeight, maxWidth, maxHeight, xinc, yinc;
int baseWidth, baseHeight;
int dwidth = *widthp, dheight = *heightp;
@@ -694,6 +694,8 @@ ConstrainSize(TwmWindow *tmp_win, int *widthp, int *heightp)
*/
if (tmp_win->hints.flags & PAspect) {
+ int delta;
+
if (minAspectX * dheight > minAspectY * dwidth) {
delta = makemult(minAspectX * dheight / minAspectY - dwidth, xinc);
if (dwidth + delta <= maxWidth)
@@ -914,7 +916,6 @@ fullzoom(TwmWindow *tmp_win, int flag)
Window junkRoot;
unsigned int junkbw, junkDepth;
int basex, basey;
- int frame_bw_times_2;
XGetGeometry(dpy, (Drawable) tmp_win->frame, &junkRoot,
&dragx, &dragy, (unsigned int *) &dragWidth,
@@ -931,6 +932,8 @@ fullzoom(TwmWindow *tmp_win, int flag)
tmp_win->zoomed = ZOOM_NONE;
}
else {
+ int frame_bw_times_2;
+
if (tmp_win->zoomed == ZOOM_NONE) {
tmp_win->save_frame_x = dragx;
tmp_win->save_frame_y = dragy;
diff --git a/src/resize.h b/src/resize.h
index 5eb729e..a16a238 100644
--- a/src/resize.h
+++ b/src/resize.h
@@ -60,6 +60,8 @@ in this Software without prior written authorization from The Open Group.
#ifndef _RESIZE_
#define _RESIZE_
+#include "twm.h"
+
extern void AddEndResize(TwmWindow *tmp_win);
extern void AddStartResize(TwmWindow *tmp_win, int x, int y, int w, int h);
extern void ConstrainSize(TwmWindow *tmp_win, int *widthp, int *heightp);
diff --git a/src/session.c b/src/session.c
index ed8bb33..94b4d63 100644
--- a/src/session.c
+++ b/src/session.c
@@ -274,7 +274,7 @@ WriteWinConfigEntry(FILE *configFile, TwmWindow *theWindow,
char *clientId, char *windowRole)
{
char **wm_command;
- int wm_command_count, i;
+ int wm_command_count;
if (!write_counted_string(configFile, clientId))
return 0;
@@ -311,6 +311,8 @@ WriteWinConfigEntry(FILE *configFile, TwmWindow *theWindow,
return 0;
}
else {
+ int i;
+
if (!write_byte(configFile, (unsigned char) wm_command_count))
return 0;
for (i = 0; i < wm_command_count; i++)
@@ -574,12 +576,14 @@ GetWindowConfig(TwmWindow *theWindow,
*/
char **wm_command = NULL;
- int wm_command_count = 0, i;
+ int wm_command_count = 0;
XGetCommand(dpy, theWindow->w,
&wm_command, &wm_command_count);
if (wm_command_count == ptr->wm_command_count) {
+ int i;
+
for (i = 0; i < wm_command_count; i++)
if (strcmp(wm_command[i],
ptr->wm_command[i]) != 0)
diff --git a/src/session.h b/src/session.h
index 3b93fb7..c574a45 100644
--- a/src/session.h
+++ b/src/session.h
@@ -25,6 +25,9 @@
*/
#ifndef _SESSION_H
#define _SESSION_H
+
+#include "twm.h"
+
#include <X11/SM/SMlib.h>
extern void ConnectToSessionManager(char *previous_id);
diff --git a/src/twm.c b/src/twm.c
index d9a8f6c..2abb603 100644
--- a/src/twm.c
+++ b/src/twm.c
@@ -62,12 +62,13 @@ in this Software without prior written authorization from The Open Group.
#include <stdio.h>
#include <signal.h>
#include <fcntl.h>
+#include <stdarg.h>
+
#include "twm.h"
#include "iconmgr.h"
#include "add_window.h"
#include "gc.h"
#include "parse.h"
-#include "version.h"
#include "menus.h"
#include "events.h"
#include "util.h"
@@ -75,6 +76,7 @@ in this Software without prior written authorization from The Open Group.
#include "screen.h"
#include "parse.h"
#include "session.h"
+
#include <X11/Xproto.h>
#include <X11/Xatom.h>
#include <X11/SM/SMlib.h>
@@ -115,7 +117,7 @@ ScreenInfo **ScreenList; /* structures for each screen */
ScreenInfo *Scr = NULL; /* the cur and prev screens */
int PreviousScreen; /* last screen that we were on */
int FirstScreen; /* TRUE ==> first screen of display */
-static Bool PrintErrorMessages = False; /* controls error messages */
+int message_level = 1; /* controls error messages */
static int RedirectError; /* TRUE ==> another window manager running */
static int TwmErrorHandler(Display *dpy, XErrorEvent *event); /* for settting RedirectError */
static int CatchRedirectError(Display *dpy, XErrorEvent *event); /* for everything else */
@@ -181,33 +183,31 @@ static char *atom_names[11] = {
#ifdef XPRINT
/* |hasExtension()| and |IsPrintScreen()| have been stolen from
* xc/programs/xdpyinfo/xdpyinfo.c */
-static
- Bool
-hasExtension(Display *dpy, char *extname)
+static Bool
+hasExtension(Display *dpy2, char *extname)
{
int num_extensions, i;
char **extensions;
- extensions = XListExtensions(dpy, &num_extensions);
+ extensions = XListExtensions(dpy2, &num_extensions);
for (i = 0; i < num_extensions &&
(strcmp(extensions[i], extname) != 0); i++);
XFreeExtensionList(extensions);
return i != num_extensions;
}
-static
- Bool
+static Bool
IsPrintScreen(Screen *s)
{
- Display *dpy = XDisplayOfScreen(s);
- int i;
+ Display *dpy2 = XDisplayOfScreen(s);
/* Check whether this is a screen of a print DDX */
- if (hasExtension(dpy, XP_PRINTNAME)) {
+ if (hasExtension(dpy2, XP_PRINTNAME)) {
Screen **pscreens;
int pscrcount;
+ int i;
- pscreens = XpQueryScreens(dpy, &pscrcount);
+ pscreens = XpQueryScreens(dpy2, &pscrcount);
for (i = 0; (i < pscrcount) && pscreens; i++) {
if (s == pscreens[i]) {
return True;
@@ -219,6 +219,31 @@ IsPrintScreen(Screen *s)
}
#endif /* XPRINT */
+static void
+usage(void)
+{
+ fprintf(stderr, "usage: %s [-display dpy] [-f file] [-s] [-q] [-v] [-V]"
+#ifdef XPRINT
+ " [-noprint]"
+#endif /* XPRINT */
+ " [-clientId id] [-restore file]\n", ProgramName);
+ exit(EXIT_FAILURE);
+}
+
+static Bool
+brief_opt(const char *param, const char *option)
+{
+ size_t have = strlen(++param);
+ size_t want = strlen(option);
+ Bool result = False;
+
+ if (have <= want) {
+ if (!strncmp(param, option, have))
+ result = True;
+ }
+ return result;
+}
+
/***********************************************************************
*
* Procedure:
@@ -249,57 +274,62 @@ main(int argc, char *argv[])
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
switch (argv[i][1]) {
+ case 'V':
+ printf("%s %s\n", APP_NAME, APP_VERSION);
+ exit(EXIT_SUCCESS);
case 'd': /* -display dpy */
- if (strcmp(&argv[i][1], "display"))
- goto usage;
+ if (!brief_opt(argv[i], "display"))
+ usage();
if (++i >= argc)
- goto usage;
+ usage();
display_name = argv[i];
continue;
case 's': /* -single */
+ if (!brief_opt(argv[i], "single"))
+ usage();
MultiScreen = FALSE;
continue;
#ifdef XPRINT
case 'n': /* -noprint */
- if (strcmp(&argv[i][1], "noprint"))
- goto usage;
+ if (!brief_opt(argv[i], "noprint"))
+ usage();
NoPrintscreens = True;
continue;
#endif /* XPRINT */
case 'f': /* -file twmrcfilename */
+ if (!brief_opt(argv[i], "file"))
+ usage();
if (++i >= argc)
- goto usage;
+ usage();
InitFile = argv[i];
continue;
case 'v': /* -verbose */
- PrintErrorMessages = True;
+ if (!brief_opt(argv[i], "verbose"))
+ usage();
+ message_level++;
continue;
case 'c': /* -clientId */
- if (strcmp(&argv[i][1], "clientId"))
- goto usage;
+ if (!brief_opt(argv[i], "clientId"))
+ usage();
if (++i >= argc)
- goto usage;
+ usage();
client_id = argv[i];
continue;
case 'r': /* -restore */
- if (strcmp(&argv[i][1], "restore"))
- goto usage;
+ if (!brief_opt(argv[i], "restore"))
+ usage();
if (++i >= argc)
- goto usage;
+ usage();
restore_filename = argv[i];
continue;
case 'q': /* -quiet */
- PrintErrorMessages = False;
+ if (!brief_opt(argv[i], "quiet"))
+ usage();
+ --message_level;
continue;
}
}
- usage:
- fprintf(stderr, "usage: %s [-display dpy] [-f file] [-s] [-q] [-v]"
-#ifdef XPRINT
- " [-noprint]"
-#endif /* XPRINT */
- " [-clientId id] [-restore file]\n", ProgramName);
- exit(1);
+ usage();
}
loc = setlocale(LC_ALL, "");
@@ -350,16 +380,11 @@ main(int argc, char *argv[])
if (!(dpy = XtOpenDisplay(appContext, display_name, "twm", "twm",
NULL, 0, &zero, NULL))) {
- fprintf(stderr, "%s: unable to open display \"%s\"\n",
- ProgramName, XDisplayName(display_name));
- exit(1);
+ twmError("unable to open display \"%s\"", XDisplayName(display_name));
}
if (fcntl(ConnectionNumber(dpy), F_SETFD, 1) == -1) {
- fprintf(stderr,
- "%s: unable to mark display connection as close-on-exec\n",
- ProgramName);
- exit(1);
+ twmError("unable to mark display connection as close-on-exec");
}
if (restore_filename)
@@ -396,10 +421,7 @@ main(int argc, char *argv[])
/* for simplicity, always allocate NumScreens ScreenInfo struct pointers */
ScreenList = calloc((size_t) NumScreens, sizeof(ScreenInfo *));
if (ScreenList == NULL) {
- fprintf(stderr,
- "%s: Unable to allocate memory for screen list, exiting.\n",
- ProgramName);
- exit(1);
+ twmError("Unable to allocate memory for screen list, exiting");
}
numManaged = 0;
PreviousScreen = DefaultScreen(dpy);
@@ -409,8 +431,7 @@ main(int argc, char *argv[])
/* Ignore print screens to avoid that users accidentally warp on a
* print screen (which are not visible on video displays) */
if ((!NoPrintscreens) && IsPrintScreen(XScreenOfDisplay(dpy, scrnum))) {
- fprintf(stderr, "%s: skipping print screen %d\n",
- ProgramName, scrnum);
+ twmWarning("skipping print screen %d", scrnum);
continue;
}
#endif /* XPRINT */
@@ -428,12 +449,13 @@ main(int argc, char *argv[])
XSetErrorHandler(TwmErrorHandler);
if (RedirectError) {
- fprintf(stderr, "%s: another window manager is already running.",
- ProgramName);
- if (MultiScreen && NumScreens > 0)
- fprintf(stderr, " on screen %d?\n", scrnum);
- else
- fprintf(stderr, "?\n");
+ if (MultiScreen && NumScreens > 0) {
+ twmWarning("another window manager is already running."
+ " on screen %d?\n", scrnum);
+ }
+ else {
+ twmWarning("another window manager is already running.");
+ }
continue;
}
@@ -442,9 +464,9 @@ main(int argc, char *argv[])
/* Note: ScreenInfo struct is calloc'ed to initialize to zero. */
Scr = ScreenList[scrnum] = calloc(1, sizeof(ScreenInfo));
if (Scr == NULL) {
- fprintf(stderr,
- "%s: unable to allocate memory for ScreenInfo structure for screen %d.\n",
- ProgramName, scrnum);
+ twmWarning
+ ("unable to allocate memory for ScreenInfo structure for screen %d.",
+ scrnum);
continue;
}
@@ -677,10 +699,11 @@ main(int argc, char *argv[])
} /* for */
if (numManaged == 0) {
- if (MultiScreen && NumScreens > 0)
- fprintf(stderr, "%s: unable to find any unmanaged %sscreens.\n",
- ProgramName, NoPrintscreens ? "" : "video ");
- exit(1);
+ if (MultiScreen && NumScreens > 0) {
+ twmError("unable to find any unmanaged %sscreens.\n",
+ NoPrintscreens ? "" : "video ");
+ }
+ exit(EXIT_FAILURE);
}
(void) ConnectToSessionManager(client_id);
@@ -689,7 +712,7 @@ main(int argc, char *argv[])
HandlingEvents = TRUE;
InitEvents();
HandleEvents();
- exit(0);
+ exit(EXIT_SUCCESS);
}
/**
@@ -860,11 +883,12 @@ void
RestoreWithdrawnLocation(TwmWindow *tmp)
{
int gravx, gravy;
- unsigned int bw, mask;
+ unsigned int bw;
XWindowChanges xwc;
if (XGetGeometry(dpy, tmp->w, &JunkRoot, &xwc.x, &xwc.y,
&JunkWidth, &JunkHeight, &bw, &JunkDepth)) {
+ unsigned mask;
GetGravityOffsets(tmp, &gravx, &gravy);
if (gravy < 0)
@@ -945,7 +969,7 @@ Done(XtPointer client_data _X_UNUSED, XtSignalId *si2 _X_UNUSED)
Reborder(CurrentTime);
XCloseDisplay(dpy);
}
- exit(0);
+ exit(EXIT_SUCCESS);
}
/*
@@ -963,7 +987,7 @@ TwmErrorHandler(Display *dpy2, XErrorEvent *event)
LastErrorEvent = *event;
ErrorOccurred = True;
- if (PrintErrorMessages && /* don't be too obnoxious */
+ if ((message_level > 1) && /* don't be too obnoxious */
event->error_code != BadWindow && /* watch for dead puppies */
(event->request_code != X_GetGeometry && /* of all styles */
event->error_code != BadDrawable))
@@ -979,3 +1003,58 @@ CatchRedirectError(Display *dpy2 _X_UNUSED, XErrorEvent *event)
ErrorOccurred = True;
return 0;
}
+
+void
+twmError(const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ fprintf(stderr, "%s: error: ", ProgramName);
+ vfprintf(stderr, format, ap);
+ fputc('\n', stderr);
+ va_end(ap);
+ exit(EXIT_FAILURE);
+}
+
+void
+twmWarning(const char *format, ...)
+{
+ if (message_level > 0) {
+ va_list ap;
+
+ va_start(ap, format);
+ fprintf(stderr, "%s: warning: ", ProgramName);
+ vfprintf(stderr, format, ap);
+ fputc('\n', stderr);
+ va_end(ap);
+ }
+}
+
+void
+twmVerbose(const char *format, ...)
+{
+ if (message_level > 1) {
+ va_list ap;
+
+ va_start(ap, format);
+ fprintf(stderr, "%s: warning: ", ProgramName);
+ vfprintf(stderr, format, ap);
+ fputc('\n', stderr);
+ va_end(ap);
+ }
+}
+
+void
+twmMessage(const char *format, ...)
+{
+ va_list ap;
+
+ va_start(ap, format);
+ printf("%s: ", ProgramName);
+ vprintf(format, ap);
+ putc('\n', stdout);
+ va_end(ap);
+
+ fflush(stdout);
+}
diff --git a/src/twm.h b/src/twm.h
index 1fe106d..2428391 100644
--- a/src/twm.h
+++ b/src/twm.h
@@ -60,6 +60,7 @@ from The Open Group.
#ifndef _TWM_
#define _TWM_
+/* *INDENT-OFF* */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -73,6 +74,18 @@ from The Open Group.
#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
+#ifndef GCC_PRINTFLIKE
+#if defined(GCC_PRINTF) && !defined(printf)
+#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var)))
+#else
+#define GCC_PRINTFLIKE(fmt,var) /*nothing*/
+#endif
+#endif
+
+#ifndef GCC_NORETURN
+#define GCC_NORETURN _X_NORETURN
+#endif
+
#ifndef WithdrawnState
#define WithdrawnState 0
#endif
@@ -335,8 +348,7 @@ extern void CreateFonts(void);
extern void RestoreWithdrawnLocation(TwmWindow *tmp);
extern void Reborder(Time time);
extern void
-Done(XtPointer, XtSignalId *)
- _X_NORETURN;
+Done(XtPointer, XtSignalId *) _X_NORETURN;
extern void
ComputeCommonTitleOffsets(void);
extern void
@@ -392,6 +404,11 @@ NewBitmapCursor(Cursor *cp, char *source, char *mask);
extern Pixmap
CreateMenuIcon(int height, unsigned int *widthp, unsigned int *heightp);
+extern void twmError(const char *, ...) GCC_PRINTFLIKE(1,2) GCC_NORETURN;
+extern void twmWarning(const char *, ...) GCC_PRINTFLIKE(1,2);
+extern void twmVerbose(const char *, ...) GCC_PRINTFLIKE(1,2);
+extern void twmMessage(const char *, ...) GCC_PRINTFLIKE(1,2);
+
extern Bool ErrorOccurred;
extern XErrorEvent LastErrorEvent;
@@ -401,16 +418,16 @@ extern Bool RestartPreviousState;
extern Bool
GetWMState(Window w, int *statep, Window *iwp);
-extern void
-twmrc_error_prefix(void);
-
extern int
yyparse(void);
extern int
yylex(void);
+extern void parseWarning(const char *, ...) GCC_PRINTFLIKE(1,2);
+
extern Atom TwmAtoms[];
+extern int message_level;
extern Bool use_fontset;
extern int ShapeEventBase;
@@ -433,4 +450,5 @@ extern int XrandrErrorBase;
#define _XA_WM_CLIENT_LEADER TwmAtoms[9]
#define _XA_WM_WINDOW_ROLE TwmAtoms[10]
+/* *INDENT-ON* */
#endif /* _TWM_ */
diff --git a/src/util.c b/src/util.c
index c4e0a3f..a6bf902 100644
--- a/src/util.c
+++ b/src/util.c
@@ -260,10 +260,9 @@ ExpandFilename(const char *name)
retval = asprintf(&newname, "%s/%s", Home, &name[1]);
if (retval == -1 || !newname) {
- fprintf (stderr,
- "%s: unable to allocate %ld bytes to expand filename %s/%s\n",
- ProgramName, (unsigned long)HomeLen + (unsigned long)strlen(name) + 2,
- Home, &name[1]);
+ twmWarning("unable to allocate %lu bytes to expand filename %s/%s",
+ (unsigned long) HomeLen + (unsigned long) strlen(name) + 2,
+ Home, &name[1]);
}
return newname;
}
@@ -327,8 +326,7 @@ FindBitmap(const char *name, unsigned *widthp, unsigned *heightp)
if (XmuCompareISOLatin1(pmtab[i].name, name) == 0)
return (*pmtab[i].proc) (widthp, heightp);
}
- fprintf(stderr, "%s: no such built-in bitmap \"%s\"\n",
- ProgramName, name);
+ twmWarning("no such built-in bitmap \"%s\"", name);
return None;
}
@@ -353,9 +351,8 @@ FindBitmap(const char *name, unsigned *widthp, unsigned *heightp)
*/
asprintf(&bigname, "%s/%s", Scr->IconDirectory, name);
if (!bigname) {
- fprintf (stderr,
- "%s: unable to allocate memory for \"%s/%s\"\n",
- ProgramName, Scr->IconDirectory, name);
+ twmWarning("unable to allocate memory for \"%s/%s\"",
+ Scr->IconDirectory, name);
return None;
}
if (XReadBitmapFile (dpy, Scr->Root, bigname, widthp, heightp, &pm,
@@ -365,8 +362,7 @@ FindBitmap(const char *name, unsigned *widthp, unsigned *heightp)
}
free (bigname);
if (pm == None) {
- fprintf(stderr, "%s: unable to find bitmap \"%s\"\n",
- ProgramName, name);
+ twmWarning("unable to find bitmap \"%s\"", name);
}
return pm;
@@ -393,8 +389,8 @@ InsertRGBColormap(Atom a, XStandardColormap *maps, int nmaps, Bool replace)
if (!sc) { /* no existing, allocate new */
sc = malloc(sizeof(StdCmap));
if (!sc) {
- fprintf(stderr, "%s: unable to allocate %ld bytes for StdCmap\n",
- ProgramName, (unsigned long) sizeof(StdCmap));
+ twmWarning("unable to allocate %lu bytes for StdCmap",
+ (unsigned long) sizeof(StdCmap));
return;
}
replace = False;
@@ -496,8 +492,7 @@ GetColor(int kind, Pixel *what, const char *name)
if (name[0] != '#')
stat = XParseColor(dpy, cmap, name, &color);
if (!stat) {
- fprintf(stderr, "%s: invalid color name \"%s\"\n",
- ProgramName, name);
+ twmWarning("invalid color name \"%s\"", name);
return;
}
@@ -540,8 +535,7 @@ GetColor(int kind, Pixel *what, const char *name)
stdcmap->blue_mult));
}
else {
- fprintf(stderr, "%s: unable to allocate color \"%s\"\n",
- ProgramName, name);
+ twmWarning("unable to allocate color \"%s\"", name);
return;
}
}
@@ -564,7 +558,7 @@ GetColorValue(int kind, XColor *what, const char *name)
return;
if (!XLookupColor(dpy, cmap, name, what, &junkcolor)) {
- fprintf(stderr, "%s: invalid color name \"%s\"\n", ProgramName, name);
+ twmWarning("invalid color name \"%s\"", name);
}
else {
what->pixel = AllPlanes;
@@ -580,12 +574,13 @@ FindFontSet(MyFont *font, const char *fontname)
XFontSetExtents *font_extents;
XFontStruct **xfonts;
char **font_names;
- register int i;
- int ascent;
- int descent;
- int fnum;
if (use_fontset) {
+ int ascent;
+ int descent;
+ int fnum;
+ register int i;
+
if (font->fontset != NULL) {
XFreeFontSet(dpy, font->fontset);
}
@@ -596,9 +591,13 @@ FindFontSet(MyFont *font, const char *fontname)
&def_string_return)) == NULL) {
return False;
}
- for (i = 0; i < missing_charset_count_return; i++) {
- printf("%s: warning: font for charset %s is lacking.\n",
- ProgramName, missing_charset_list_return[i]);
+ if (missing_charset_count_return) {
+ twmVerbose("%d fonts are missing from fontset",
+ missing_charset_count_return);
+ for (i = 0; i < missing_charset_count_return; i++) {
+ twmVerbose("font for charset %s is lacking.",
+ missing_charset_list_return[i]);
+ }
}
font_extents = XExtentsOfFontSet(font->fontset);
@@ -614,6 +613,9 @@ FindFontSet(MyFont *font, const char *fontname)
font->y = ascent;
font->ascent = ascent;
font->descent = descent;
+ twmMessage("created fontset with %d fonts (%d missing) for \"%s\"",
+ fnum, missing_charset_count_return,
+ fontname ? fontname : "NULL");
return True;
}
@@ -643,10 +645,10 @@ FindFontSet(MyFont *font, const char *fontname)
void
GetFont(MyFont *font)
{
- const char *deffontname = "fixed";
if (!FindFontSet(font, font->name)) {
const char *what = "fonts";
+ const char *deffontname = "fixed";
if (use_fontset) {
what = "fontsets";
@@ -655,9 +657,8 @@ GetFont(MyFont *font)
deffontname = Scr->DefaultFont.name;
}
if (!FindFontSet(font, deffontname)) {
- fprintf(stderr, "%s: unable to open %s \"%s\" or \"%s\"\n",
- ProgramName, what, font->name, deffontname);
- exit(1);
+ twmError("unable to open %s \"%s\" or \"%s\"",
+ what, font->name, deffontname);
}
}
}
@@ -724,23 +725,38 @@ I18N_FetchName(Display *dpy2, Window w, char **winname)
{
int status;
XTextProperty text_prop;
- char **list;
- int num;
+ int rc = 0;
+
+ *winname = NULL;
status = XGetWMName(dpy2, w, &text_prop);
- if (!status || !text_prop.value || !text_prop.nitems) {
- *winname = NULL;
- return 0;
- }
- status = XmbTextPropertyToTextList(dpy2, &text_prop, &list, &num);
- if (status < Success || !num || !*list) {
- *winname = NULL;
- return 0;
+ if (status && text_prop.value && text_prop.nitems) {
+ char **list = NULL;
+ int num;
+
+ status = XmbTextPropertyToTextList(dpy2, &text_prop, &list, &num);
+ if (status >= Success && num && list && *list) {
+ XFree(text_prop.value);
+ *winname = strdup(*list);
+ XFreeStringList(list);
+ rc = 1;
+ }
+ else {
+ char *value = NULL;
+
+ /*
+ * If the system's locale support is broken (e.g., missing useful
+ * parts), the preceding Xmb call may fail.
+ */
+ if (XFetchName(dpy2, w, &value) && value != NULL) {
+ *winname = strdup(value);
+ XFree(value);
+ rc = 1;
+ }
+ }
}
- XFree(text_prop.value);
- *winname = (char *) strdup(*list);
- XFreeStringList(list);
- return 1;
+
+ return rc;
}
Status
@@ -774,11 +790,11 @@ SetFocus(TwmWindow *tmp_win, Time time)
#ifdef TRACE
if (tmp_win) {
- printf("Focusing on window \"%s\"\n", tmp_win->full_name);
+ twmMessage("Focusing on window \"%s\"", tmp_win->full_name);
}
else {
- printf("Unfocusing; Scr->Focus was \"%s\"\n",
- Scr->Focus ? Scr->Focus->full_name : "(nil)");
+ twmMessage("Unfocusing; Scr->Focus was \"%s\"",
+ Scr->Focus ? Scr->Focus->full_name : "(nil)");
}
#endif
@@ -947,15 +963,6 @@ Pixmap
CreateMenuIcon(int height, unsigned *widthp, unsigned *heightp)
{
int h, w;
- int ih, iw;
- int ix, iy;
- int mh, mw;
- int tw, th;
- int lw, lh;
- int lx, ly;
- int lines, dly;
- int off;
- int bw;
h = height;
w = h * 7 / 8;
@@ -968,6 +975,15 @@ CreateMenuIcon(int height, unsigned *widthp, unsigned *heightp)
if (Scr->tbpm.menu == None) {
Pixmap pix;
GC gc;
+ int ih, iw;
+ int ix, iy;
+ int mh, mw;
+ int tw, th;
+ int lw, lh;
+ int lx, ly;
+ int lines, dly;
+ int off;
+ int bw;
pix = Scr->tbpm.menu =
XCreatePixmap(dpy, Scr->Root, (unsigned) w, (unsigned) h, 1);
diff --git a/src/util.h b/src/util.h
index 195432c..448ed4d 100644
--- a/src/util.h
+++ b/src/util.h
@@ -60,6 +60,8 @@ in this Software without prior written authorization from The Open Group.
#ifndef _UTIL_
#define _UTIL_
+#include "twm.h"
+
extern void MoveOutline(Window root, int x, int y, int width, int height,
int bw, int th);
extern void Zoom(Window wf, Window wt);