*** ../twm.ORG/Imakefile	Mon Aug 31 12:15:35 1992
--- Imakefile	Mon Aug 31 11:29:35 1992
***************
*** 8,41 ****
  #XCOMM distribute this one.
  #XCOMM
  
     DEPXWCHARLIB = $(CONTRIBSRC)/lib/Xwchar/libXwchar.a
        XWCHARLIB = $(DEPXWCHARLIB)
  
! LINKS = cursor.c deftwmrc.c list.c version.c \
!      	add_window.h events.h gc.h iconmgr.h icons.h list.h menus.h \
! 	parse.h resize.h util.h version.h siconify.bm
  
           YFLAGS = -d
          DEPLIBS = $(DEPXMULIB) $(DEPXWCHARLIB) $(DEPEXTENSIONLIB) $(DEPXLIB)
! LOCAL_LIBRARIES = $(XMULIB) $(XWCHARLIB) $(EXTENSIONLIB) $(XLIB)
         LINTLIBS = $(LINTXMU) $(LINTXWCHARLIB) $(LINTEXTENSIONLIB) $(LINTXLIB)
!         DEFINES = $(SIGNAL_DEFINES -DYYDEBUG -DLEXDEBUG)
  
!            SRCS = gram.c lex.c deftwmrc.c add_window.c gc.c list.c twm.c \
                  parse.c menus.c events.c resize.c util.c version.c iconmgr.c \
!                 cursor.c icons.c strutil.c
! 
!            OBJS = gram.o lex.o deftwmrc.o add_window.o gc.o list.o twm.o \
                  parse.o menus.o events.o resize.o util.o version.o iconmgr.o \
!                 cursor.o icons.o strutil.o
  
! AllTarget(twm)
  
! includes::
! 	$(RM) $(LINKS)
! 	for i in $(LINKS); do (set -x; $(LN) $(CLIENTSRC)/twm/$$i .); done
! 	
! SpecialObjectRule(parse.o,NullParameter,'-DSYSTEM_INIT_FILE="'$(TWMDIR)'/system.twmrc"')
  #if !HasPutenv
  SpecialObjectRule(util.o,NullParameter,-DNOPUTENV)
  #endif
--- 8,56 ----
  #XCOMM distribute this one.
  #XCOMM
  
+ #         XPMLIB = $(CONTRIBSRC)/lib/xpm/libXpm.a
+ #        TIFFLIB = $(CONTRIBSRC)/clients/xtiff/libtiff/libtiff/libtiff.a
+ #        TIFFINC = $(CONTRIBSRC)/clients/xtiff/libtiff/libtiff
+ 
+       DEPXAWLIB = $(CONTRIBSRC)/lib/Xaw/libXaw.a
+          XAWLIB = $(DEPXAWLIB)
     DEPXWCHARLIB = $(CONTRIBSRC)/lib/Xwchar/libXwchar.a
        XWCHARLIB = $(DEPXWCHARLIB)
  
!   SYS_LIBRARIES = -lm
! EXTRA_LIBRARIES = $(XPMLIB) $(TIFFLIB)
! 		  
!  EXTRA_INCLUDES = -I$(TIFFINC)
  
           YFLAGS = -d
          DEPLIBS = $(DEPXMULIB) $(DEPXWCHARLIB) $(DEPEXTENSIONLIB) $(DEPXLIB)
! LOCAL_LIBRARIES = $(XMULIB) $(XWCHARLIB) $(EXTENSIONLIB) $(XPMLIB) $(XLIB)
! LOCAL_LIBRARIES2 = $(XAWLIB) $(XWCHARLIB) $(XMULIB) $(XTOOLLIB) $(XLIB)
! 
         LINTLIBS = $(LINTXMU) $(LINTXWCHARLIB) $(LINTEXTENSIONLIB) $(LINTXLIB)
!         DEFINES = $(SIGNAL_DEFINES)
! #        DEFINES = $(SIGNAL_DEFINES) -DCOLOR_ICON -DXPM -DXTIFF
! #        DEFINES = $(SIGNAL_DEFINES) -DCOLOR_ICON -DXPM
! #        DEFINES = $(SIGNAL_DEFINES) -DCOLOR_ICON -DXTIFF
!     CDEBUGFLAGS = -g
  
!           SRCS1 = gram.c lex.c deftwmrc.c add_window.c gc.c list.c twm.c \
                  parse.c menus.c events.c resize.c util.c version.c iconmgr.c \
!                 cursor.c icons.c strutil.c pseudoscreen.c tiff.c LocPixmap.c
!           OBJS1 = gram.o lex.o deftwmrc.o add_window.o gc.o list.o twm.o \
                  parse.o menus.o events.o resize.o util.o version.o iconmgr.o \
!                 cursor.o icons.o strutil.o pseudoscreen.o tiff.o LocPixmap.o
  
!           SRCS2 = pscont.c
!           OBJS2 = pscont.o
  
!        PROGRAMS = pstwm pscont
! 
! ComplexProgramTarget_1(pstwm,$(LOCAL_LIBRARIES),NullParameter)
! ComplexProgramTarget_2(pscont,$(LOCAL_LIBRARIES2),NullParameter)
! 
! SpecialObjectRule(parse.o,NullParameter,'-DSYSTEM_INIT_FILE="'$(TWMDIR)'/system.pstwmrc"')
! 
  #if !HasPutenv
  SpecialObjectRule(util.o,NullParameter,-DNOPUTENV)
  #endif
***************
*** 42,49 ****
  
  depend:: lex.c gram.c deftwmrc.c 
  
- ComplexProgramTarget(twm)
- 
  InstallNonExecFile(system.twmrc,$(TWMDIR))
  
  gram.h gram.c: gram.y
--- 57,62 ----
***************
*** 67,74 ****
  	echo '    (char *) 0 };' >>$@
  
  install::
! 	MakeDir($(DESTDIR)$(LIBDIR)/wr_WR.ct/twm)
! 	$(INSTALL) -c $(INSTAPPFLAGS) sys.twmrc-ct $(DESTDIR)$(LIBDIR)/wr_WR.ct/twm/system.twmrc
! 	MakeDir($(DESTDIR)$(LIBDIR)/ja_JP.ujis/twm)
! 	$(INSTALL) -c $(INSTAPPFLAGS) sys.twmrc-uj $(DESTDIR)$(LIBDIR)/ja_JP.ujis/twm/system.twmrc
  
--- 80,87 ----
  	echo '    (char *) 0 };' >>$@
  
  install::
! 	MakeDir($(LIBDIR)/wr_WR.ct/twm)
! 	$(INSTALL) -c $(INSTAPPFLAGS) sys.pstwmrc-ct $(LIBDIR)/wr_WR.ct/twm/system.pstwmrc
! 	MakeDir($(LIBDIR)/ja_JP.ujis/twm)
! 	$(INSTALL) -c $(INSTAPPFLAGS) sys.pstwmrc-uj $(LIBDIR)/ja_JP.ujis/twm/system.pstwmrc
  
*** ../twm.ORG/add_window.c	Mon Aug 31 12:15:35 1992
--- add_window.c	Mon Aug 31 11:21:41 1992
***************
*** 1,4 ****
! /* $Id: add_window.c,v 1.3 1991/11/20 08:14:37 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
--- 1,4 ----
! /* $Id: add_window.c,v 1.2 1991/10/28 06:37:41 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
***************
*** 65,70 ****
--- 65,71 ----
  static int PlaceX = 50;
  static int PlaceY = 50;
  static void CreateWindowTitlebarButtons();
+ Window	CreatePSMapWin();
  
  char NoName[] = "Untitled"; /* name if no name is specified */
  
***************
*** 130,142 ****
   */
  
  TwmWindow *
! AddWindow(w, iconm, iconp)
  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 */
--- 131,144 ----
   */
  
  TwmWindow *
! AddWindow(w, iconm, iconp, psmapdisplay)
  Window w;
  int iconm;
  IconMgr *iconp;
+ int psmapdisplay;
  {
      TwmWindow *tmp_win;			/* new twm window structure */
!     int i, stat;
      XEvent event;
      unsigned long valuemask;		/* mask for create windows */
      XSetWindowAttributes attributes;	/* attributes for create windows */
***************
*** 170,175 ****
--- 172,178 ----
      tmp_win->iconmgr = iconm;
      tmp_win->iconmgrp = iconp;
      tmp_win->cmaps.number_cwins = 0;
+     tmp_win->psmapDisplay = psmapdisplay;
  
      XSelectInput(dpy, tmp_win->w, PropertyChangeMask);
      XGetWindowAttributes(dpy, tmp_win->w, &tmp_win->attr);
***************
*** 178,184 ****
      else {
  	if (text_prop.value) text_prop.nitems = strlen(text_prop.value);
  	if (XmbTextPropertyToTextList(dpy, &text_prop, &list, &count)
! 	    < Success)
  	    tmp_win->name = NoName;
  	else {
  	    if (!(*list)) tmp_win->name = NoName;
--- 181,187 ----
      else {
  	if (text_prop.value) text_prop.nitems = strlen(text_prop.value);
  	if (XmbTextPropertyToTextList(dpy, &text_prop, &list, &count)
! 	    != Success)
  	    tmp_win->name = NoName;
  	else {
  	    if (!(*list)) tmp_win->name = NoName;
***************
*** 191,196 ****
--- 194,205 ----
      FetchWmProtocols (tmp_win);
      FetchWmColormapWindows (tmp_win);
  
+     tmp_win->PseudoScreen = GetPseudoScreenNumProp(tmp_win->w);
+     /* if this 'tmp_win' window does not set pseudoscreen number property,
+      *     GetPseudoScreenNumProp()'s return value is -2.
+      *     And this return value is estimated later. (by mukawa)
+      */
+ 
      /*
       * do initial clip; should look at window gravity
       */
***************
*** 222,227 ****
--- 231,248 ----
      tmp_win->full_name = tmp_win->name;
      namelen = strlen (tmp_win->name);
  
+     if(tmp_win->PseudoScreen == -2) {
+ 	if(LookInList(Scr->DontPseudoScreen, tmp_win->full_name,
+ 		&tmp_win->class) || tmp_win->psmapDisplay || tmp_win->iconmgr)
+ 	    tmp_win->PseudoScreen = -1;
+ 	else
+ 	    tmp_win->PseudoScreen = Scr->PseudoCurScreen;
+ 	tmp_win->propTrap = TRUE;
+ 	SetPseudoScreenNumProp(tmp_win->w, tmp_win->PseudoScreen);
+     }
+     else
+ 	tmp_win->propTrap = FALSE;
+ 
      tmp_win->highlight = Scr->Highlight && 
  	(!(short)(int) LookInList(Scr->NoHighlight, tmp_win->full_name, 
  	    &tmp_win->class));
***************
*** 650,656 ****
      else {
  	if (text_prop.value) text_prop.nitems = strlen(text_prop.value);
  	if (XmbTextPropertyToTextList(dpy, &text_prop, &list, &count)
! 	    < Success)
  	    tmp_win->icon_name = tmp_win->name;
  	else {
  	    if (!(*list)) tmp_win->icon_name = tmp_win->name;
--- 671,677 ----
      else {
  	if (text_prop.value) text_prop.nitems = strlen(text_prop.value);
  	if (XmbTextPropertyToTextList(dpy, &text_prop, &list, &count)
! 	    != Success)
  	    tmp_win->icon_name = tmp_win->name;
  	else {
  	    if (!(*list)) tmp_win->icon_name = tmp_win->name;
***************
*** 662,667 ****
--- 683,698 ----
      tmp_win->icon = FALSE;
      tmp_win->icon_on = FALSE;
  
+     for(i = 0; i < 6; ++i) {
+ 	tmp_win->save[i].frameX = -100000;
+ 	tmp_win->save[i].frameY = -100000;
+ 	tmp_win->save[i].frameWidth = -100000;
+ 	tmp_win->save[i].frameHeight = -100000;
+ 	tmp_win->save[i].iconX = -100000;
+ 	tmp_win->save[i].iconY = -100000;
+ 	tmp_win->save[i].icon  = -100000;
+     }
+ 
      XGrabServer(dpy);
  
      /*
***************
*** 696,701 ****
--- 727,735 ----
      tmp_win->title.back = Scr->TitleC.back;
      tmp_win->iconc.fore = Scr->IconC.fore;
      tmp_win->iconc.back = Scr->IconC.back;
+     tmp_win->psmap.fore = Scr->PSMapWindowCol.fore;
+     tmp_win->psmap.back = Scr->PSMapWindowCol.back;
+     tmp_win->psmap_border = Scr->PSMapWindowBorderColor;
  
      GetColorFromList(Scr->BorderColorL, tmp_win->full_name, &tmp_win->class,
  	&tmp_win->border);
***************
*** 713,718 ****
--- 747,758 ----
  	&tmp_win->iconc.fore);
      GetColorFromList(Scr->IconBackgroundL, tmp_win->full_name, &tmp_win->class,
  	&tmp_win->iconc.back);
+     GetColorFromList(Scr->PSMapWindowForegroundL, tmp_win->full_name,
+ 		&tmp_win->class, &tmp_win->psmap.fore);
+     GetColorFromList(Scr->PSMapWindowBackgroundL, tmp_win->full_name,
+ 		&tmp_win->class, &tmp_win->psmap.back);
+     GetColorFromList(Scr->PSMapWindowBorderColorL, tmp_win->full_name,
+ 		&tmp_win->class, &tmp_win->psmap_border);
  
  
      /* create windows */
***************
*** 735,740 ****
--- 775,788 ----
  	valuemask |= CWSaveUnder;
      }
  
+     if(!tmp_win->psmapDisplay && !tmp_win->iconmgr)
+ 	tmp_win->psmapWindow = CreatePSMapWin(tmp_win,
+ 				tmp_win->frame_x, tmp_win->frame_y,
+ 				tmp_win->frame_width, tmp_win->frame_height,
+ 				tmp_win->psmap.back, tmp_win->psmap_border);
+     else
+ 	tmp_win->psmapWindow = 0;
+ 
      tmp_win->frame = XCreateWindow (dpy, Scr->Root, tmp_win->frame_x,
  				    tmp_win->frame_y, 
  				    (unsigned int) tmp_win->frame_width,
***************
*** 797,804 ****
  
      if (HasShape)
  	XShapeSelectInput (dpy, tmp_win->w, ShapeNotifyMask);
! 	
!     if (tmp_win->title_w) {
  	XMapWindow (dpy, tmp_win->title_w);
      }
  
--- 845,852 ----
  
      if (HasShape)
  	XShapeSelectInput (dpy, tmp_win->w, ShapeNotifyMask);
! 
!     if (tmp_win->title_w && tmp_win->PseudoScreen == Scr->PseudoCurScreen) {
  	XMapWindow (dpy, tmp_win->title_w);
      }
  
***************
*** 825,830 ****
--- 873,879 ----
       * again in HandleMapNotify.
       */
      tmp_win->mapped = FALSE;
+     tmp_win->psmapped = FALSE;
  
      SetupFrame (tmp_win, tmp_win->frame_x, tmp_win->frame_y,
  		tmp_win->frame_width, tmp_win->frame_height, -1, True);
***************
*** 843,848 ****
--- 892,898 ----
      (void) AddIconManager(tmp_win);
  
      XSaveContext(dpy, tmp_win->w, TwmContext, (caddr_t) tmp_win);
+     XSaveContext(dpy, tmp_win->w, PSMapContext, (caddr_t) tmp_win);
      XSaveContext(dpy, tmp_win->w, ScreenContext, (caddr_t) Scr);
      XSaveContext(dpy, tmp_win->frame, TwmContext, (caddr_t) tmp_win);
      XSaveContext(dpy, tmp_win->frame, ScreenContext, (caddr_t) Scr);
***************
*** 1084,1089 ****
--- 1134,1146 ----
  	pm = XCreatePixmap (dpy, tmp_win->title_w,
  			    Scr->hilite_pm_width, Scr->hilite_pm_height,
  			    Scr->d_depth);
+ #ifdef	COLOR_ICON
+ 	if(Scr->hilite_pm_depth > 1)
+ 		XCopyArea(dpy, Scr->hilitePm, pm, Scr->NormalGC,
+ 		    0,0, Scr->hilite_pm_width, Scr->hilite_pm_height, 0, 0);
+ 	else
+ #endif
+ 	{
  	gcv.foreground = tmp_win->title.fore;
  	gcv.background = tmp_win->title.back;
  	gcv.graphics_exposures = False;
***************
*** 1099,1104 ****
--- 1156,1162 ----
  	    XFreePixmap (dpy, pm);
  	    pm = None;
  	}
+ 	}
      }
      if (pm) {
  	valuemask = CWBackPixmap;
***************
*** 1293,1299 ****
  SetHighlightPixmap (filename)
      char *filename;
  {
!     Pixmap pm = GetBitmap (filename);
  
      if (pm) {
  	if (Scr->hilitePm) {
--- 1351,1357 ----
  SetHighlightPixmap (filename)
      char *filename;
  {
!     Pixmap pm = GetBitmap(filename, NULL);
  
      if (pm) {
  	if (Scr->hilitePm) {
*** ../twm.ORG/cursor.c	Mon Aug 31 12:15:36 1992
--- cursor.c	Mon Aug 31 11:21:41 1992
***************
*** 157,166 ****
      back.pixel = Scr->White;
      XQueryColor(dpy, cmap, &back);
  
!     spm = GetBitmap(source);
      if ((hotx = HotX) < 0) hotx = 0;
      if ((hoty = HotY) < 0) hoty = 0;
!     mpm = GetBitmap(mask);
  
      /* make sure they are the same size */
  
--- 157,166 ----
      back.pixel = Scr->White;
      XQueryColor(dpy, cmap, &back);
  
!     spm = GetBitmap(source, NULL);
      if ((hotx = HotX) < 0) hotx = 0;
      if ((hoty = HotY) < 0) hoty = 0;
!     mpm = GetBitmap(mask, NULL);
  
      /* make sure they are the same size */
  
*** ../twm.ORG/events.c	Mon Aug 31 12:15:36 1992
--- events.c	Mon Aug 31 11:21:42 1992
***************
*** 1,4 ****
! /* $Id: events.c,v 1.3 1991/11/20 08:15:39 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
--- 1,4 ----
! /* $Id: events.c,v 1.2 1991/10/28 06:37:48 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
***************
*** 73,78 ****
--- 73,79 ----
  TwmWindow *UnHighLight_win = NULL;
  
  Window DragWindow;		/* variables used in moving windows */
+ Window DragPSMapWin;
  int origDragX;
  int origDragY;
  int DragX;
***************
*** 105,111 ****
  void AutoRaiseWindow (tmp)
      TwmWindow *tmp;
  {
!     XRaiseWindow (dpy, tmp->frame);
      XSync (dpy, 0);
      enter_win = NULL;
      enter_flag = TRUE;
--- 106,112 ----
  void AutoRaiseWindow (tmp)
      TwmWindow *tmp;
  {
!     RaiseFrame(tmp);
      XSync (dpy, 0);
      enter_win = NULL;
      enter_flag = TRUE;
***************
*** 294,299 ****
--- 295,301 ----
      return True;
  }
  
+ 
  /***********************************************************************
   *
   *  Procedure:
***************
*** 512,517 ****
--- 514,543 ----
  
  
  
+ CheckTitleWindow()
+ {
+ 	register int	i;
+ 	Window		w = Event.xvisibility.window;
+ 
+ 	if(w == Scr->PseudoScreenTitleWindow)
+ 		return(1);
+ 	for(i = 0; i < 6; ++i)
+ 		if(w == Scr->PseudoScreenCBWindow[i])
+ 			return(1);
+ 	return(0);
+ }
+ 
+ CheckTitleWindow2()
+ {
+ 	register int	i;
+ 	Window		w = Event.xvisibility.window;
+ 
+ 	for(i = 0; i < 6; ++i)
+ 		if(w == Scr->PseudoScreenCBWindow[i])
+ 			return(i);
+ 	return(-1);
+ }
+ 
  /***********************************************************************
   *
   *  Procedure:
***************
*** 524,529 ****
--- 550,557 ----
   ***********************************************************************
   */
  
+ extern int	TitleAndButtonAutoRaise;	/* in pseudoscreen.c */
+ 
  void
  HandleVisibilityNotify()
  {
***************
*** 531,536 ****
--- 559,571 ----
      ColormapWindow *cwin;
      TwmColormap *cmap;
  
+     if(CheckTitleWindow() && (vevent->state == VisibilityPartiallyObscured ||
+ 			vevent->state == VisibilityFullyObscured)) {
+ 	if(TitleAndButtonAutoRaise == TRUE)
+ 		XRaiseWindow(dpy, vevent->window);
+ 	return;
+     }
+ 
      if (XFindContext(dpy, vevent->window, ColormapContext, (caddr_t *)&cwin) == XCNOENT)
  	return;
      
***************
*** 752,774 ****
  	XStandardColormap *maps = NULL;
  	int nmaps;
  
! 	switch (Event.xproperty.state) {
! 	  case PropertyNewValue:
! 	    if (XGetRGBColormaps (dpy, Scr->Root, &maps, &nmaps, 
! 				  Event.xproperty.atom)) {
! 		/* if got one, then replace any existing entry */
! 		InsertRGBColormap (Event.xproperty.atom, maps, nmaps, True);
  	    }
  	    return;
  
! 	  case PropertyDelete:
! 	    RemoveRGBColormap (Event.xproperty.atom);
! 	    return;
  	}
      }
  
      if (!Tmp_win) return;		/* unknown window */
  
  #define MAX_NAME_LEN 200L		/* truncate to this many */
  #define MAX_ICON_NAME_LEN 200L		/* ditto */
  
--- 787,849 ----
  	XStandardColormap *maps = NULL;
  	int nmaps;
  
! 	if(Event.xproperty.atom == _PSTWM_SCREEN_NUM) {
! 	    if(Event.xproperty.state == PropertyNewValue) {
! 		int sn;
! 		sn = GetPseudoScreenNumProp(Scr->Root);
! 		if(sn < 0 || 5 < sn) {
! 		    XBell(dpy, 0);
! 		    SetPseudoScreenNumProp(Scr->Root, Scr->PseudoCurScreen);
! 		}
! 		else
! 		    SwitchPseudoScreen(sn);
  	    }
  	    return;
+ 	}
+ 	else {
+ 	    switch (Event.xproperty.state) {
+ 	      case PropertyNewValue:
+ 		if (XGetRGBColormaps (dpy, Scr->Root, &maps, &nmaps, 
+ 						Event.xproperty.atom)) {
+ 		    /* if got one, then replace any existing entry */
+ 		    InsertRGBColormap (Event.xproperty.atom, maps, nmaps, True);
+ 		}
+ 		return;
  
! 	      case PropertyDelete:
! 		RemoveRGBColormap (Event.xproperty.atom);
! 		return;
! 	    }
  	}
      }
  
      if (!Tmp_win) return;		/* unknown window */
  
+     if(Event.xproperty.atom == _PSTWM_SCREEN_NUM) {
+ 	int sn;
+ 
+ 	if(Tmp_win->psmapDisplay || Tmp_win->iconmgr)
+ 		return;
+ 	if(Tmp_win->propTrap == TRUE) {
+ 		Tmp_win->propTrap = FALSE;
+ 		return;
+ 	}
+ 	sn = GetPseudoScreenNumProp(Tmp_win->w);
+ 	if(0 <= sn && sn <= 5 ) {
+ 		if(Tmp_win->PseudoScreen == -1)
+ 			XBell(dpy, 0);
+ 		else if(Tmp_win->PseudoScreen != sn)
+ 			MovePseudoScreenTo(Tmp_win, sn);
+ 	}
+ 	else if(sn == -1)
+ 		MovePseudoScreenTo(Tmp_win, sn);
+ 	else {	/* probably.. sn == -2 */
+ 		XBell(dpy, 0);
+ 		SetPseudoScreenNumProp(Tmp_win->w, Scr->PseudoCurScreen);
+ 	}
+ 	return;
+     }
+ 
  #define MAX_NAME_LEN 200L		/* truncate to this many */
  #define MAX_ICON_NAME_LEN 200L		/* ditto */
  
***************
*** 779,785 ****
  	if (text_prop.encoding == None) return;
  	if (text_prop.value) text_prop.nitems = strlen(text_prop.value);
  	if (XmbTextPropertyToTextList(dpy, &text_prop, &list, &count)
! 	    < Success)
  	    return;
  	if (!(*list)) {
  	    prop = NoName;
--- 854,860 ----
  	if (text_prop.encoding == None) return;
  	if (text_prop.value) text_prop.nitems = strlen(text_prop.value);
  	if (XmbTextPropertyToTextList(dpy, &text_prop, &list, &count)
! 	    != Success)
  	    return;
  	if (!(*list)) {
  	    prop = NoName;
***************
*** 815,821 ****
  	if (text_prop.encoding == None) return;
  	if (text_prop.value) text_prop.nitems = strlen(text_prop.value);
  	if (XmbTextPropertyToTextList(dpy, &text_prop, &list, &count)
! 	    < Success)
  	    return;
  	if (!(*list)) {
  	    prop = NoName;
--- 890,896 ----
  	if (text_prop.encoding == None) return;
  	if (text_prop.value) text_prop.nitems = strlen(text_prop.value);
  	if (XmbTextPropertyToTextList(dpy, &text_prop, &list, &count)
! 	    != Success)
  	    return;
  	if (!(*list)) {
  	    prop = NoName;
***************
*** 1056,1066 ****
--- 1131,1146 ----
   */
  
  static void flush_expose();
+ void	HandlePSTitleExpose();
+ void	HandleCBExpose();
+ void	HandlePSMapExpose();
  
  void
  HandleExpose()
  {
      MenuRoot *tmp;
+     int	w;
+ 
      if (XFindContext(dpy, Event.xany.window, MenuContext, (caddr_t *)&tmp) == 0)
      {
  	PaintMenu(tmp, &Event);
***************
*** 1070,1076 ****
      if (Event.xexpose.count != 0)
  	return;
  
!     if (Event.xany.window == Scr->InfoWindow && InfoLines)
      {
  	int i;
  	int height;
--- 1150,1170 ----
      if (Event.xexpose.count != 0)
  	return;
  
!     if(Event.xany.window == Scr->PseudoScreenTitleWindow) {
! 	/* if shape is supported, do not call this expose event forever...
! 	 */
! 	HandlePSTitleExpose();
! 	flush_expose(Event.xany.window);
!     }
!     else if((w = CheckTitleWindow2()) >= 0) {
! 	HandleCBExpose(w);
! 	flush_expose(Event.xany.window);
!     }
!     else if(Event.xany.window == Scr->PSMapWindow) {
! 	HandlePSMapExpose();
! 	flush_expose(Event.xany.window);
!     }
!     else if (Event.xany.window == Scr->InfoWindow && InfoLines)
      {
  	int i;
  	int height;
***************
*** 1125,1135 ****
  	    for (i = 0, tbw = Tmp_win->titlebuttons; i < nb; i++, tbw++) {
  		if (w == tbw->window) {
  		    register TitleButton *tb = tbw->info;
! 
! 		    FB(Tmp_win->title.fore, Tmp_win->title.back);
! 		    XCopyPlane (dpy, tb->bitmap, w, Scr->NormalGC,
  				tb->srcx, tb->srcy, tb->width, tb->height,
  				tb->dstx, tb->dsty, 1);
  		    flush_expose (w);
  		    return;
  		}
--- 1219,1238 ----
  	    for (i = 0, tbw = Tmp_win->titlebuttons; i < nb; i++, tbw++) {
  		if (w == tbw->window) {
  		    register TitleButton *tb = tbw->info;
! #ifdef	COLOR_ICON
! 		    if(tb->depth > 1) {
! 			XCopyArea(dpy, tb->bitmap, w, Scr->NormalGC,
  				tb->srcx, tb->srcy, tb->width, tb->height,
+ 				tb->dstx, tb->dsty);
+ 		    }
+ 		    else
+ #endif
+ 		    {
+ 			FB(Tmp_win->title.fore, Tmp_win->title.back);
+ 			XCopyPlane (dpy, tb->bitmap, w, Scr->NormalGC,
+ 				tb->srcx, tb->srcy, tb->width, tb->height,
  				tb->dstx, tb->dsty, 1);
+ 		    }
  		    flush_expose (w);
  		    return;
  		}
***************
*** 1251,1256 ****
--- 1354,1373 ----
      if (Scr->cmapInfo.cmaps == &Tmp_win->cmaps)
  	InstallWindowColormaps(DestroyNotify, &Scr->TwmRoot);
  
+     if(Tmp_win->psmapWindow) {
+         XDeleteContext(dpy, Tmp_win->psmapWindow, TwmContext);
+         XDeleteContext(dpy, Tmp_win->psmapWindow, PSMapContext);
+         XDeleteContext(dpy, Tmp_win->psmapWindow, ScreenContext);
+         XDestroyWindow(dpy, Tmp_win->psmapWindow);
+     }
+     if(Tmp_win->psmapIcon)
+     {
+         XDeleteContext(dpy, Tmp_win->psmapIcon, TwmContext);
+         XDeleteContext(dpy, Tmp_win->psmapIcon, PSMapContext);
+         XDeleteContext(dpy, Tmp_win->psmapIcon, ScreenContext);
+         XDestroyWindow(dpy, Tmp_win->psmapIcon);
+     }
+ 
      /*
       * TwmWindows contain the following pointers
       * 
***************
*** 1318,1324 ****
   */
  
  void
! HandleMapRequest()
  {
      int stat;
      int zoom_save;
--- 1435,1442 ----
   */
  
  void
! HandleMapRequestSub(psmapd)
! int	psmapd;
  {
      int stat;
      int zoom_save;
***************
*** 1332,1338 ****
      if (Tmp_win == NULL)
      {
  	/* Add decorations. */
! 	Tmp_win = AddWindow(Event.xany.window, FALSE, (IconMgr *) NULL);
  	if (Tmp_win == NULL)
  	    return;
      }
--- 1450,1456 ----
      if (Tmp_win == NULL)
      {
  	/* Add decorations. */
! 	Tmp_win = AddWindow(Event.xany.window, FALSE, (IconMgr *) NULL, psmapd);
  	if (Tmp_win == NULL)
  	    return;
      }
***************
*** 1364,1371 ****
  	    case NormalState:
  	    case ZoomState:
  	    case InactiveState:
! 		XMapWindow(dpy, Tmp_win->w);
! 		XMapWindow(dpy, Tmp_win->frame);
  		SetMapStateProp(Tmp_win, NormalState);
  		SetRaiseWindow (Tmp_win);
  		break;
--- 1482,1488 ----
  	    case NormalState:
  	    case ZoomState:
  	    case InactiveState:
! 		MapFrame(Tmp_win);
  		SetMapStateProp(Tmp_win, NormalState);
  		SetRaiseWindow (Tmp_win);
  		break;
***************
*** 1386,1398 ****
      }
  }
  
  
  
! void SimulateMapRequest (w)
      Window w;
  {
      Event.xmaprequest.window = w;
!     HandleMapRequest ();
  }
  
  
--- 1503,1521 ----
      }
  }
  
+ void
+ HandleMapRequest()
+ {
+ 	HandleMapRequestSub(FALSE);
+ }
  
  
! void SimulateMapRequest (w, psmapd)
      Window w;
+     int psmapd;
  {
      Event.xmaprequest.window = w;
!     HandleMapRequestSub(psmapd);
  }
  
  
***************
*** 1419,1425 ****
       */
      XGrabServer (dpy);
      if (Tmp_win->icon_w)
! 	XUnmapWindow(dpy, Tmp_win->icon_w);
      if (Tmp_win->title_w)
  	XMapSubwindows(dpy, Tmp_win->title_w);
      XMapSubwindows(dpy, Tmp_win->frame);
--- 1542,1548 ----
       */
      XGrabServer (dpy);
      if (Tmp_win->icon_w)
! 	UnmapIcon(Tmp_win);
      if (Tmp_win->title_w)
  	XMapSubwindows(dpy, Tmp_win->title_w);
      XMapSubwindows(dpy, Tmp_win->frame);
***************
*** 1426,1432 ****
      if (Scr->Focus != Tmp_win && Tmp_win->hilite_w)
  	XUnmapWindow(dpy, Tmp_win->hilite_w);
  
!     XMapWindow(dpy, Tmp_win->frame);
      XUngrabServer (dpy);
      XFlush (dpy);
      Tmp_win->mapped = TRUE;
--- 1549,1555 ----
      if (Scr->Focus != Tmp_win && Tmp_win->hilite_w)
  	XUnmapWindow(dpy, Tmp_win->hilite_w);
  
!     MapFrame(Tmp_win);
      XUngrabServer (dpy);
      XFlush (dpy);
      Tmp_win->mapped = TRUE;
***************
*** 1517,1522 ****
--- 1640,1650 ----
  void
  HandleMotionNotify()
  {
+     if(XFindContext(dpy, Event.xany.window, PSMapContext,
+ 		(caddr_t *)&Tmp_win) != XCNOENT) {
+         HandlePSMapMotionNotify(&Event, Tmp_win);
+         return;
+     }
      if (ResizeWindow != NULL)
      {
  	XQueryPointer( dpy, Event.xany.window,
***************
*** 1558,1563 ****
--- 1686,1697 ----
  	Context = C_NO_CONTEXT;
        }
  
+     if(XFindContext(dpy, Event.xany.window, PSMapContext,
+ 		(caddr_t *)&Tmp_win) != XCNOENT) {
+         HandlePSMapButtonRelease(&Event, Tmp_win);
+         return;
+     }
+ 
      if (DragWindow != None)
      {
  	MoveOutline(Scr->Root, 0, 0, 0, 0, 0, 0);
***************
*** 1614,1624 ****
  	if (DragWindow == Tmp_win->frame)
  	  SetupWindow (Tmp_win, xl, yt,
  		       Tmp_win->frame_width, Tmp_win->frame_height, -1);
! 	else
  	    XMoveWindow (dpy, DragWindow, xl, yt);
  
! 	if (!Scr->NoRaiseMove && !Scr->OpaqueMove)    /* opaque already did */
  	    XRaiseWindow(dpy, DragWindow);
  
  	if (!Scr->OpaqueMove)
  	    UninstallRootColormap();
--- 1748,1766 ----
  	if (DragWindow == Tmp_win->frame)
  	  SetupWindow (Tmp_win, xl, yt,
  		       Tmp_win->frame_width, Tmp_win->frame_height, -1);
! 	else {
  	    XMoveWindow (dpy, DragWindow, xl, yt);
+ 	    if(DragPSMapWin)
+                 XMoveWindow(dpy, DragPSMapWin,
+ 			xl/Scr->PSMapDisplayScale, yt/Scr->PSMapDisplayScale);
+ 	}
  
! 
! 	if (!Scr->NoRaiseMove && !Scr->OpaqueMove) {  /* opaque already did */
  	    XRaiseWindow(dpy, DragWindow);
+ 	    if(DragPSMapWin)
+ 		XRaiseWindow(dpy, DragPSMapWin);
+ 	}
  
  	if (!Scr->OpaqueMove)
  	    UninstallRootColormap();
***************
*** 1633,1638 ****
--- 1775,1781 ----
  	}
  
  	DragWindow = NULL;
+ 	DragPSMapWin = NULL;
  	ConstMove = FALSE;
      }
  
***************
*** 1752,1762 ****
--- 1895,1922 ----
   *
   ***********************************************************************
   */
+ void HandlePSTitleButtonPress();
+ void HandlePSMapButtonPress1();
+ void HandlePSMapButtonPress2();
+ void HandlePSMapButtonPress3();
+ 
+ CheckPSMapCWindow()
+ {
+ 	register int	i;
+ 	Window		w = Event.xbutton.window;
+ 
+ 	for(i = 0; i < 6; ++i)
+ 		if(w == Scr->PSMapWindowC[i])
+ 			return(i);
+ 	return(-1);
+ }
+ 
  void
  HandleButtonPress()
  {
      unsigned int modifier;
      Cursor cur;
+     int w;
  
      /* pop down the menu, if any */
      if (ActiveMenu != NULL)
***************
*** 1764,1769 ****
--- 1924,1949 ----
  
      XSync(dpy, 0);			/* XXX - remove? */
  
+     /* check the pseudo screen buttons */
+     if((w = CheckTitleWindow2()) >= 0) {
+ 	HandlePSTitleButtonPress(&Event, w);
+ 	/*RootFunction = NULL;*/
+ 	return;
+     }
+     else if(Event.xany.window == Scr->PSMapWindow) {
+ 	HandlePSMapButtonPress3(&Event);
+ 	return;
+     }
+     else if((w = CheckPSMapCWindow()) >= 0) {
+ 	HandlePSMapButtonPress1(&Event, w);
+ 	return;
+     }
+     else if(XFindContext(dpy, Event.xany.window, PSMapContext,
+ 		(caddr_t *)&Tmp_win) != XCNOENT) {
+         HandlePSMapButtonPress2(&Event, Tmp_win);
+         return;
+     }
+ 
      if (ButtonPressed != -1 && !InfoLines) /* want menus if we have info box */
      {
  	/* we got another butt press in addition to one still held
***************
*** 2649,2654 ****
--- 2829,2837 ----
  	    if (!(state & CM_INSTALLED)) {
  		cmap->install_req = NextRequest(dpy);
  		XInstallColormap(dpy, cmap->c);
+ #ifdef DEBUG_EVENTS
+ 	fprintf(stderr, "InstallColormap called\n");
+ #endif
  	    }
  	    cmap->state |= CM_INSTALLED;
  	    n--;
*** ../twm.ORG/gc.c	Mon Aug 31 12:15:36 1992
--- gc.c	Mon Aug 31 11:21:42 1992
***************
*** 92,95 ****
--- 92,107 ----
      gcm |= GCLineWidth;	    gcv.line_width = 0;
  
      Scr->NormalGC = XCreateGC(dpy, Scr->Root, gcm, &gcv);
+ 
+     Scr->ShapeGC = NULL;
+ 
+     gcm = 0;
+     gcm |= GCForeground;    gcv.foreground = Scr->PseudoScreenTitleC.back;
+     gcm |= GCFont;	    gcv.font =  Scr->PSCBFontSet.font->fid;
+     Scr->PseudoScreenCBGC = XCreateGC(dpy, Scr->Root, gcm, &gcv);
+ 
+     gcm = 0;
+     gcm |= GCForeground;    gcv.foreground = Scr->Black;
+ 
+     Scr->PSMapGC = XCreateGC(dpy, Scr->Root, gcm, &gcv);
  }
*** ../twm.ORG/gram.y	Mon Aug 31 12:15:36 1992
--- gram.y	Mon Aug 31 11:21:43 1992
***************
*** 1,4 ****
! /* $Id: gram.y,v 1.3 1991/11/11 08:49:43 proj Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
--- 1,4 ----
! /* $Id: gram.y,v 1.2 1991/10/28 06:37:53 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
***************
*** 86,92 ****
  };
  
  %token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
! %token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION 
  %token <num> ICONMGR_SHOW ICONMGR WINDOW_FUNCTION ZOOM ICONMGRS
  %token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE
  %token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING 
--- 86,92 ----
  };
  
  %token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
! %token <num> ALL OR CURSORS PIXMAPS ICONS COLOR ICON_MASKS SAVECOLOR MONOCHROME FUNCTION 
  %token <num> ICONMGR_SHOW ICONMGR WINDOW_FUNCTION ZOOM ICONMGRS
  %token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE
  %token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING 
***************
*** 96,103 ****
  %token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
  %token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON 
  %token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD 
! %token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN
! %token <num> NO_STACKMODE
  %token <wc_ptr> WC_STRING 
  
  %type <ptr> string
--- 96,103 ----
  %token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
  %token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON 
  %token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD 
! %token <num> SKEYWORD DKEYWORD JKEYWORD PKEYWORD WINDOW_RING WARP_CURSOR
! %token <num> ERRORTOKEN NO_STACKMODE DONT_PSEUDO_SCREEN
  %token <wc_ptr> WC_STRING 
  
  %type <ptr> string
***************
*** 202,207 ****
--- 202,209 ----
  		  win_list
  		| AUTO_RAISE		{ list = &Scr->AutoRaise; }
  		  win_list
+ 		| DONT_PSEUDO_SCREEN	{ list = &Scr->DontPseudoScreen; }
+ 		  win_list
  		| MENU string LP string COLON string RP	{
  					root = GetRoot($2, $4, $6); }
  		  menu			{ root->real_menu = TRUE;}
***************
*** 211,216 ****
--- 213,220 ----
  		  function
  		| ICONS 		{ list = &Scr->IconNames; }
  		  icon_list
+ 		| ICON_MASKS 		{ list = &Scr->IconMaskNames; }
+ 		  icon_msk_list
  		| COLOR 		{ color = COLOR; }
  		  color_list
                  | SAVECOLOR          
***************
*** 348,354 ****
  		| pixmap_entries pixmap_entry
  		;
  
! pixmap_entry	: TITLE_HILITE string { SetHighlightPixmap ($2); }
  		;
  
  
--- 352,358 ----
  		| pixmap_entries pixmap_entry
  		;
  
! pixmap_entry	: PKEYWORD string { do_pixmap_keyword($1,$2); }
  		;
  
  
***************
*** 531,536 ****
--- 535,550 ----
  icon_entry	: string string		{ if (Scr->FirstTime) AddToList(list, $1, $2); }
  		;
  
+ icon_msk_list	: LB icon_msk_entries RB
+ 		;
+ 
+ icon_msk_entries: /* Empty */
+ 		| icon_msk_entries icon_msk_entry
+ 		;
+ 
+ icon_msk_entry	: string string		{ if (Scr->FirstTime) AddToList(list, $1, $2); }
+ 		;
+ 
  function	: LB function_entries RB
  		;
  
***************
*** 626,637 ****
  string		: WC_STRING		{ wc_ptr = (wchar_t *)malloc((wcslen($1)+1) * sizeof(wchar_t));
  					  wcscpy(wc_ptr, $1);
  					  RemoveDQuote(wc_ptr);
! 					  if ((ptr = convert_wctomb(wc_ptr))
! 					      == NULL) {
! 					      yyerror("unable to convert widecharacter to multibyte");
! 					      ptr = (unsigned char *)malloc(sizeof(unsigned char));
! 					      ptr[0] = '\0';
! 					  }
  					  free(wc_ptr);
  					  $$ = ptr;
  					}
--- 640,646 ----
  string		: WC_STRING		{ wc_ptr = (wchar_t *)malloc((wcslen($1)+1) * sizeof(wchar_t));
  					  wcscpy(wc_ptr, $1);
  					  RemoveDQuote(wc_ptr);
! 					  ptr = convert_wctomb(wc_ptr);
  					  free(wc_ptr);
  					  $$ = ptr;
  					}
*** ../twm.ORG/iconmgr.c	Mon Aug 31 12:15:36 1992
--- iconmgr.c	Mon Aug 31 11:21:43 1992
***************
*** 115,121 ****
  	XmbSetWMProperties(dpy, p->w, str, icon_name, NULL, 0, NULL,
  			   NULL, NULL);
  
! 	p->twm_win = AddWindow(p->w, TRUE, p);
  	SetMapStateProp (p->twm_win, WithdrawnState);
      }
      for (p = &Scr->iconmgr; p != NULL; p = p->next)
--- 115,121 ----
  	XmbSetWMProperties(dpy, p->w, str, icon_name, NULL, 0, NULL,
  			   NULL, NULL);
  
! 	p->twm_win = AddWindow(p->w, TRUE, p, FALSE);
  	SetMapStateProp (p->twm_win, WithdrawnState);
      }
      for (p = &Scr->iconmgr; p != NULL; p = p->next)
***************
*** 404,410 ****
  
      tmp_win->list = NULL;
  
!     if (tmp_win->iconmgr || tmp_win->transient || Scr->NoIconManagers)
  	return NULL;
  
      if (LookInList(Scr->IconMgrNoShow, tmp_win->full_name, &tmp_win->class))
--- 404,411 ----
  
      tmp_win->list = NULL;
  
!     if (tmp_win->iconmgr || tmp_win->transient || Scr->NoIconManagers ||
! 			tmp_win->psmapDisplay)
  	return NULL;
  
      if (LookInList(Scr->IconMgrNoShow, tmp_win->full_name, &tmp_win->class))
***************
*** 485,494 ****
      tmp_win->list = tmp;
  
      if (!ip->twm_win->icon)
!     {
! 	XMapWindow(dpy, ip->w);
! 	XMapWindow(dpy, ip->twm_win->frame);
!     }
  
      return (tmp);
  }
--- 486,492 ----
      tmp_win->list = tmp;
  
      if (!ip->twm_win->icon)
! 	MapFrame(ip->twm_win);
  
      return (tmp);
  }
***************
*** 604,613 ****
      PackIconManager(ip);
  
      if (ip->count == 0)
!     {
! 	XUnmapWindow(dpy, ip->twm_win->frame);
!     }
! 
  }
  
  void ActiveIconManager(active)
--- 602,608 ----
      PackIconManager(ip);
  
      if (ip->count == 0)
! 	UnmapFrame(ip->twm_win);
  }
  
  void ActiveIconManager(active)
*** ../twm.ORG/icons.c	Mon Aug 31 12:15:36 1992
--- icons.c	Mon Aug 31 11:21:43 1992
***************
*** 194,200 ****
      defy = -100;
      PlaceIcon(tmp_win, defx, defy, &x, &y);
      if (x != defx || y != defy) {
! 	XMoveWindow (dpy, tmp_win->icon_w, x, y);
  	tmp_win->icon_moved = FALSE;	/* since we've restored it */
      }
  }
--- 194,200 ----
      defy = -100;
      PlaceIcon(tmp_win, defx, defy, &x, &y);
      if (x != defx || y != defy) {
! 	MoveIcon(tmp_win, x, y);
  	tmp_win->icon_moved = FALSE;	/* since we've restored it */
      }
  }
***************
*** 339,344 ****
--- 339,360 ----
  }
  #endif
  
+ CheckThatWindowIconAlready(tmp_win)
+ TwmWindow *tmp_win;
+ {
+ 	register TwmWindow	*t;
+ 	register int		i;
+ 	
+ 	for(i = 0, t = Scr->TwmRoot.next; t != NULL; t = t->next) {
+ 		if(t->icon_w &&
+ 			strcmp(tmp_win->full_name, t->full_name) == 0 &&
+ 				strcmp(tmp_win->name, t->name) == 0 &&
+ 				strcmp(tmp_win->icon_name, t->icon_name) == 0)
+ 			++i;
+ 	}
+ 	return(i);
+ }
+ 
  CreateIconWindow(tmp_win, def_x, def_y)
  TwmWindow *tmp_win;
  int def_x, def_y;
***************
*** 346,354 ****
      unsigned long event_mask;
      unsigned long valuemask;		/* mask for create windows */
      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);
--- 362,372 ----
      unsigned long event_mask;
      unsigned long valuemask;		/* mask for create windows */
      XSetWindowAttributes attributes;	/* attributes for create windows */
!     Pixmap pm = None, mask_bm = None;	/* tmp pixmap variable */
      int final_x, final_y;
!     int x, arin, inn;
!     char *full_name2;
!     char *icon_name = NULL;
  
  
      FB(tmp_win->iconc.fore, tmp_win->iconc.back);
***************
*** 356,361 ****
--- 374,388 ----
      tmp_win->forced = FALSE;
      tmp_win->icon_not_ours = FALSE;
  
+     arin = CheckThatWindowIconAlready(tmp_win);
+ 
+     if(arin > 0) {
+ 	full_name2 = malloc(strlen(tmp_win->full_name) + 5);
+ 	sprintf(full_name2, "%s-%d", tmp_win->full_name, arin);
+     }
+     else
+ 	full_name2 = tmp_win->full_name;
+ 
      /* now go through the steps to get an icon window,  if ForceIcon is 
       * set, then no matter what else is defined, the bitmap from the
       * .twmrc file is used
***************
*** 362,382 ****
       */
      if (Scr->ForceIcon)
      {
- 	char *icon_name;
  	Pixmap bm;
  
! 	icon_name = LookInNameList(Scr->IconNames, tmp_win->full_name);
!         if (icon_name == NULL)
  	    icon_name = LookInList(Scr->IconNames, tmp_win->full_name,
! 				   &tmp_win->class);
! 
! 	bm = None;
  	if (icon_name != NULL)
  	{
! 	    if ((bm = (Pixmap)LookInNameList(Scr->Icons, icon_name)) == None)
! 	    {
! 		if ((bm = GetBitmap (icon_name)) != None)
  		    AddToList(&Scr->Icons, icon_name, (char *)bm);
  	    }
  	}
  
--- 389,420 ----
       */
      if (Scr->ForceIcon)
      {
  	Pixmap bm;
  
! 	inn = 0;
! 	icon_name = LookInNameList(Scr->IconNames, full_name2);
! 	if(icon_name == NULL) {
! 	    inn = 1;
! 	    icon_name = LookInNameList(Scr->IconNames, tmp_win->full_name);
! 	}
! 	if(icon_name == NULL) {
! 	    inn = 2;
! 	    icon_name = LookInList(Scr->IconNames, full_name2, &tmp_win->class);
! 	}
! 	if(icon_name == NULL) {
! 	    inn = 3;
  	    icon_name = LookInList(Scr->IconNames, tmp_win->full_name,
! 			   &tmp_win->class);
! 	}
! 	bm = mask_bm = None;
  	if (icon_name != NULL)
  	{
! 	    if((bm = (Pixmap)LookInNameList(Scr->Icons, icon_name)) == None) {
! 		if((bm = GetBitmap(icon_name, &mask_bm)) != None) {
  		    AddToList(&Scr->Icons, icon_name, (char *)bm);
+ 		    if(mask_bm != None)
+ 			AddToList(&Scr->IconMasks, icon_name, (char *)mask_bm);
+ 		}
  	    }
  	}
  
***************
*** 387,398 ****
  		&JunkBW, &JunkDepth);
  
  	    pm = XCreatePixmap(dpy, Scr->Root, tmp_win->icon_width,
! 		tmp_win->icon_height, Scr->d_depth);
! 
! 	    /* the copy plane works on color ! */
! 	    XCopyPlane(dpy, bm, pm, Scr->NormalGC,
! 		0,0, tmp_win->icon_width, tmp_win->icon_height, 0, 0, 1 );
! 
  	    tmp_win->forced = TRUE;
  	}
      }
--- 425,440 ----
  		&JunkBW, &JunkDepth);
  
  	    pm = XCreatePixmap(dpy, Scr->Root, tmp_win->icon_width,
! 			tmp_win->icon_height, Scr->d_depth);
! #ifdef	COLOR_ICON
! 	    if(JunkDepth > 1)
! 		XCopyArea(dpy, bm, pm, Scr->NormalGC,
! 		    0,0, tmp_win->icon_width, tmp_win->icon_height, 0, 0);
! 	    else
! #endif
! 		/* the copy plane works on color ! */
! 		XCopyPlane(dpy, bm, pm, Scr->NormalGC,
! 		    0,0, tmp_win->icon_width, tmp_win->icon_height, 0, 0, 1 );
  	    tmp_win->forced = TRUE;
  	}
      }
***************
*** 404,420 ****
      if (pm == None && tmp_win->wmhints &&
  	tmp_win->wmhints->flags & IconPixmapHint)
      {
-     
  	XGetGeometry(dpy,   tmp_win->wmhints->icon_pixmap,
!              &JunkRoot, &JunkX, &JunkY,
! 	     (unsigned int *)&tmp_win->icon_width, (unsigned int *)&tmp_win->icon_height, &JunkBW, &JunkDepth);
  
  	pm = XCreatePixmap(dpy, Scr->Root,
  			   tmp_win->icon_width, tmp_win->icon_height,
  			   Scr->d_depth);
! 
! 	XCopyPlane(dpy, tmp_win->wmhints->icon_pixmap, pm, Scr->NormalGC,
! 	    0,0, tmp_win->icon_width, tmp_win->icon_height, 0, 0, 1 );
      }
  
      /* if we still haven't got an icon, let's look in the Icon list 
--- 446,469 ----
      if (pm == None && tmp_win->wmhints &&
  	tmp_win->wmhints->flags & IconPixmapHint)
      {
  	XGetGeometry(dpy,   tmp_win->wmhints->icon_pixmap,
! 		&JunkRoot, &JunkX, &JunkY,
! 		(unsigned int *)&tmp_win->icon_width,
! 		(unsigned int *)&tmp_win->icon_height, &JunkBW, &JunkDepth);
  
  	pm = XCreatePixmap(dpy, Scr->Root,
  			   tmp_win->icon_width, tmp_win->icon_height,
  			   Scr->d_depth);
! #ifdef	COLOR_ICON
! 	if(JunkDepth > 1)
! 	    XCopyArea(dpy, tmp_win->wmhints->icon_pixmap, pm,
! 		Scr->NormalGC, 0,0, tmp_win->icon_width, tmp_win->icon_height,
! 		0, 0);
! 	else
! #endif
! 	    XCopyPlane(dpy, tmp_win->wmhints->icon_pixmap, pm,
! 		Scr->NormalGC, 0,0, tmp_win->icon_width, tmp_win->icon_height,
! 		0, 0, 1 );
      }
  
      /* if we still haven't got an icon, let's look in the Icon list 
***************
*** 422,457 ****
       */
      if (pm == None && !Scr->ForceIcon)
      {
- 	char *icon_name;
  	Pixmap bm;
  
! 	icon_name = LookInNameList(Scr->IconNames, tmp_win->full_name);
!         if (icon_name == NULL)
  	    icon_name = LookInList(Scr->IconNames, tmp_win->full_name,
! 				   &tmp_win->class);
! 
  	bm = None;
! 	if (icon_name != NULL)
! 	{
! 	    if ((bm = (Pixmap)LookInNameList(Scr->Icons, icon_name)) == None)
! 	    {
! 		if ((bm = GetBitmap (icon_name)) != None)
  		    AddToList(&Scr->Icons, icon_name, (char *)bm);
  	    }
  	}
  
! 	if (bm != None)
! 	{
  	    XGetGeometry(dpy, bm, &JunkRoot, &JunkX, &JunkY,
! 		(unsigned int *)&tmp_win->icon_width, (unsigned int *)&tmp_win->icon_height,
! 		&JunkBW, &JunkDepth);
  
  	    pm = XCreatePixmap(dpy, Scr->Root, tmp_win->icon_width,
! 		tmp_win->icon_height, Scr->d_depth);
  
! 	    /* the copy plane works on color ! */
! 	    XCopyPlane(dpy, bm, pm, Scr->NormalGC,
! 		0,0, tmp_win->icon_width, tmp_win->icon_height, 0, 0, 1 );
  	}
      }
  
--- 471,521 ----
       */
      if (pm == None && !Scr->ForceIcon)
      {
  	Pixmap bm;
  
! 	inn = 0;
! 	icon_name = LookInNameList(Scr->IconNames, full_name2);
! 	if(icon_name == NULL) {
! 	    inn = 1;
! 	    icon_name = LookInNameList(Scr->IconNames, tmp_win->full_name);
! 	}
! 	if(icon_name == NULL) {
! 	    inn = 2;
! 	    icon_name = LookInList(Scr->IconNames, full_name2, &tmp_win->class);
! 	}
! 	if(icon_name == NULL) {
! 	    inn = 3;
  	    icon_name = LookInList(Scr->IconNames, tmp_win->full_name,
! 			   &tmp_win->class);
! 	}
  	bm = None;
! 	if(icon_name != NULL) {
! 	    if((bm = (Pixmap)LookInNameList(Scr->Icons, icon_name)) == None) {
! 		if((bm = GetBitmap(icon_name, &mask_bm)) != None) {
  		    AddToList(&Scr->Icons, icon_name, (char *)bm);
+ 		    if(mask_bm != None)
+ 			AddToList(&Scr->IconMasks, icon_name, (char *)mask_bm);
+ 		}
  	    }
  	}
  
! 	if(bm != None) {
  	    XGetGeometry(dpy, bm, &JunkRoot, &JunkX, &JunkY,
! 		(unsigned int *)&tmp_win->icon_width,
! 		(unsigned int *)&tmp_win->icon_height, &JunkBW, &JunkDepth);
  
  	    pm = XCreatePixmap(dpy, Scr->Root, tmp_win->icon_width,
! 			tmp_win->icon_height, Scr->d_depth);
  
! #ifdef	COLOR_ICON
! 	    if(JunkDepth > 1)
! 		XCopyArea(dpy, bm, pm, Scr->NormalGC,
! 		    0,0, tmp_win->icon_width, tmp_win->icon_height, 0, 0);
! 	    else
! #endif
! 		/* the copy plane works on color ! */
! 		XCopyPlane(dpy, bm, pm, Scr->NormalGC,
! 		    0,0, tmp_win->icon_width, tmp_win->icon_height, 0, 0, 1 );
  	}
      }
  
***************
*** 459,464 ****
--- 523,529 ----
  
      if (pm == None && Scr->UnknownPm != None)
      {
+ 	inn = -1;
  	tmp_win->icon_width = Scr->UnknownWidth;
  	tmp_win->icon_height = Scr->UnknownHeight;
  
***************
*** 465,473 ****
  	pm = XCreatePixmap(dpy, Scr->Root, tmp_win->icon_width,
  	    tmp_win->icon_height, Scr->d_depth);
  
! 	/* the copy plane works on color ! */
! 	XCopyPlane(dpy, Scr->UnknownPm, pm, Scr->NormalGC,
! 	    0,0, tmp_win->icon_width, tmp_win->icon_height, 0, 0, 1 );
      }
  
      if (pm == None)
--- 530,544 ----
  	pm = XCreatePixmap(dpy, Scr->Root, tmp_win->icon_width,
  	    tmp_win->icon_height, Scr->d_depth);
  
! #ifdef	COLOR_ICON
! 	if(Scr->UnknownDepth > 1)
! 	    XCopyArea(dpy, Scr->UnknownPm, pm, Scr->NormalGC,
! 		0,0, tmp_win->icon_width, tmp_win->icon_height, 0, 0);
! 	else
! #endif
! 	    /* the copy plane works on color ! */
! 	    XCopyPlane(dpy, Scr->UnknownPm, pm, Scr->NormalGC,
! 		0,0, tmp_win->icon_width, tmp_win->icon_height, 0, 0, 1 );
      }
  
      if (pm == None)
***************
*** 506,514 ****
      {
  	tmp_win->icon_w = tmp_win->wmhints->icon_window;
  	if (tmp_win->forced ||
! 	    XGetGeometry(dpy, tmp_win->icon_w, &JunkRoot, &JunkX, &JunkY,
! 		     (unsigned int *)&tmp_win->icon_w_width, (unsigned int *)&tmp_win->icon_w_height,
! 		     &JunkBW, &JunkDepth) == 0)
  	{
  	    tmp_win->icon_w = None;
  	    tmp_win->wmhints->flags &= ~IconWindowHint;
--- 577,587 ----
      {
  	tmp_win->icon_w = tmp_win->wmhints->icon_window;
  	if (tmp_win->forced ||
! 			XGetGeometry(dpy, tmp_win->icon_w, &JunkRoot,
! 			&JunkX, &JunkY,
! 			(unsigned int *)&tmp_win->icon_w_width,
! 			(unsigned int *)&tmp_win->icon_w_height,
! 			&JunkBW, &JunkDepth) == 0)
  	{
  	    tmp_win->icon_w = None;
  	    tmp_win->wmhints->flags &= ~IconWindowHint;
***************
*** 533,542 ****
--- 606,703 ----
  	event_mask = ExposureMask;
      }
  
+     if(!tmp_win->psmapDisplay)
+ 	tmp_win->psmapIcon = CreatePSMapWin(tmp_win,
+ 		0, 0, tmp_win->icon_w_width, tmp_win->icon_w_height,
+ 		tmp_win->psmap.back, tmp_win->psmap_border);
+     else
+ 	tmp_win->psmapIcon = 0;
+ 
      XSelectInput (dpy, tmp_win->icon_w,
  		  KeyPressMask | ButtonPressMask | ButtonReleaseMask |
  		  event_mask);
  
+ 	if(HasShape && tmp_win->icon_not_ours != TRUE) {
+ 	    Pixmap	bm1, bm2 = None;
+ 	    char	*icon_mask_name = NULL;
+ 
+ 	    if(icon_name != NULL)
+ 		bm2 = (Pixmap)LookInNameList(Scr->IconMasks, icon_name);
+ 
+ 	    if(bm2 == None)
+ 	      switch(inn) {
+ 		case 0:
+ 		    icon_mask_name = LookInNameList(Scr->IconMaskNames,
+ 				full_name2);
+ 		    break;
+ 		case 1:
+ 		    icon_mask_name = LookInNameList(Scr->IconMaskNames,
+ 				tmp_win->full_name);
+ 		    break;
+ 		case 2:
+ 		    icon_mask_name = LookInList(Scr->IconMaskNames, full_name2,
+ 				&tmp_win->class);
+ 		    break;
+ 		case 3:
+ 		    icon_mask_name = LookInList(Scr->IconMaskNames,
+ 				tmp_win->full_name, &tmp_win->class);
+ 		    break;
+ 		case -1:
+ 		    icon_mask_name = "__UnknownIconMask__";
+ 		    break;
+ 		default:
+ 		    icon_mask_name = NULL;
+ 		    break;
+ 	      }
+ 
+ 	    if(bm2 == None && icon_mask_name != NULL) {
+ 		if((bm2 = (Pixmap)LookInNameList(Scr->IconMasks,
+ 				icon_mask_name)) == None) {
+ 		    if(inn != -1 && (bm2 = GetBitmap(icon_mask_name, NULL))
+ 							!= None)
+ 			AddToList(&Scr->IconMasks, icon_mask_name, (char *)bm2);
+ 		}
+ 	    }
+ 
+ 	    if(bm2 != None) {
+ 		XGetGeometry(dpy, bm2, &JunkRoot, &JunkX, &JunkY,
+ 			&JunkWidth, &JunkHeight, &JunkBW, &JunkDepth);
+ 
+ 		if(JunkDepth > 1)
+ 		    fprintf (stderr,
+ 			"%s: Icon mask file is bitmap(depth=1(%d)) only !\n",
+ 			ProgramName, JunkDepth);
+ 		else if(bm2 != NULL) {
+ 		    bm1 = XCreatePixmap(dpy, Scr->Root,
+ 			tmp_win->icon_w_width, tmp_win->icon_w_height, 1);
+ 		    if(bm1 != NULL) {
+ 			if(Scr->ShapeGC == NULL)
+ 				Scr->ShapeGC = XCreateGC(dpy, bm1, 0, 0);
+ 			XSetForeground(dpy, Scr->ShapeGC, 0);
+ 			XFillRectangle(dpy, bm1, Scr->ShapeGC, 0, 0,
+ 				tmp_win->icon_w_width, tmp_win->icon_w_height);
+ 			XSetForeground(dpy, Scr->ShapeGC, 1);
+ 	/*
+ 			XSetFont(dpy, Scr->ShapeGC, Scr->IconFont.font->fid);
+ 			XDrawString(dpy, bm1, Scr->ShapeGC,
+ 				tmp_win->icon_x, tmp_win->icon_y,
+ 				tmp_win->icon_name, strlen(tmp_win->icon_name));
+ 	*/
+ 			XFillRectangle(dpy, bm1, Scr->ShapeGC,
+ 				0, tmp_win->icon_height+2,
+ 				tmp_win->icon_w_width,tmp_win->icon_w_height-2);
+ 
+ 			XCopyArea(dpy, bm2, bm1, Scr->ShapeGC,
+ 					0, 0, JunkWidth, JunkHeight, 
+ 					(tmp_win->icon_w_width-JunkWidth)/2, 0);
+ 			XShapeCombineMask(dpy, tmp_win->icon_w, ShapeBounding,
+ 					0, 0, bm1, ShapeSet);
+ 			XFreePixmap(dpy, bm1);
+ 		    }
+ 		}
+ 	    }
+ 	}
+ 
      tmp_win->icon_bm_w = None;
      if (pm != None &&
  	(! (tmp_win->wmhints && tmp_win->wmhints->flags & IconWindowHint)))
***************
*** 580,586 ****
  	final_y = Scr->MyDisplayHeight - tmp_win->icon_height -
  	    Scr->IconFontSet.height - 4 - (2 * Scr->IconBorderWidth);
  
!     XMoveWindow(dpy, tmp_win->icon_w, final_x, final_y);
      tmp_win->iconified = TRUE;
  
      XMapSubwindows(dpy, tmp_win->icon_w);
--- 741,747 ----
  	final_y = Scr->MyDisplayHeight - tmp_win->icon_height -
  	    Scr->IconFontSet.height - 4 - (2 * Scr->IconBorderWidth);
  
!     MoveIcon(tmp_win, final_x, final_y);
      tmp_win->iconified = TRUE;
  
      XMapSubwindows(dpy, tmp_win->icon_w);
***************
*** 588,592 ****
--- 749,754 ----
      XSaveContext(dpy, tmp_win->icon_w, ScreenContext, (caddr_t)Scr);
      XDefineCursor(dpy, tmp_win->icon_w, Scr->IconCursor);
      if (pm) XFreePixmap (dpy, pm);
+     if(arin > 0) free(full_name2);
      return;
  }
*** ../twm.ORG/lex.c	Mon Aug 31 12:15:36 1992
--- lex.c	Mon Aug 31 11:21:44 1992
***************
*** 1,8 ****
! /* $Id: lex.c,v 1.6 1992/01/08 12:36:44 takashi Exp $ */
  
  /*
   * lexcal analyzer for Internationalized window manager       
   * X11R5 Internationalized Window Manger                     
   */
                                                            
  /* Copyright 1991 by OMRON Corporation                      
--- 1,10 ----
! /* $Id: lex.c,v 1.2 1991/10/28 06:42:16 takashi Exp $ */
  
  /*
   * lexcal analyzer for Internationalized window manager       
+  *
   * X11R5 Internationalized Window Manger                     
+  * lex.c ver.1.0  Tue Sep 17 10:36:18 JST 1991              
   */
                                                            
  /* Copyright 1991 by OMRON Corporation                      
***************
*** 36,42 ****
  
  extern wchar_t getnext();
  extern unsigned char *convert_wctoct();
- extern unsigned char *convert_wctomb();
  
  int yylex()
  {
--- 38,43 ----
***************
*** 46,121 ****
  
      ptr = 0;
      while ((retchar = input()) != 0) {
! 	if (retchar == _atowc('{')) { 	     /* "{" */
! 	    return (LB);
! 	} else if (retchar == _atowc('}')) { /* "}" */
! 	    return (RB);
! 	} else if (retchar == _atowc('(')) { /* "(" */
! 	    return (LP);
! 	} else if (retchar == _atowc(')')) { /* ")" */
! 	    return (RP);
! 	} else if (retchar == _atowc('=')) { /* "=" */
! 	    return (EQUALS);
! 	} else if (retchar == _atowc(':')) { /* ":" */
! 	    return (COLON);
! 	} else if (retchar == _atowc('+')) { /* "+" */
! 	    return (PLUS);
! 	} else if (retchar == _atowc('-')) { /* "-" */
! 	    return (MINUS);
! 	} else if (retchar == _atowc('|')) { /* "|" */
! 	    return (OR);
! 	} else if (_iswalpha(retchar) || retchar == _atowc('.')) {
! 					     /* [a-zA-Z\.]+ */
  	    do {
  		retchar = getnext(retchar);
! 	    } while ((_iswalpha(retchar) || retchar == _atowc('.'))
! 		     && retchar != 0);
  	    backch(retchar);
! 	    if ((keyword = convert_wctoct(yytext)) == NULL) {
! 		twmrc_error_prefix();
! 		fprintf(stderr,
! 			"unable to convert widecharcter to compoundtext\n");
! 		ParseError = 1;
! 		continue;
! 	    }
  	    token = parse_keyword(keyword, &yylval.num);
  	    if (token == ERRORTOKEN) {
  		twmrc_error_prefix();
  		fprintf(stderr,
  			"ignoring unknown keyword:  %s\n",
! 			convert_wctomb(yytext));
  		ParseError = 1;
  	    } else {
  		return (token);
  	    }
! 	} else if (retchar == _atowc('!')) { /* "!" */
! 	    yylval.num = F_EXEC;
! 	    return (FSKEYWORD);
! 	} else if (retchar == _atowc('^')) { /* "^" */
! 	    yylval.num = F_CUT;
! 	    return (FSKEYWORD);
! 	} else if (retchar == _atowc('"')) {
! 				/* {string} -> \"([^"]|\\.)*\" */
  	    do {
- 		do {
- 		    retchar = getnext(retchar);
- 		    next_chk:
- 		    if (retchar == _atowc('"')) {
- 			yytext[ptr++] = retchar;
- 			yytext[ptr] = _atowc('\0');
- 			yylval.wc_ptr = yytext;
- 			return (WC_STRING);
- 		    }
- 		} while (retchar != _atowc('\\') && retchar != 0);
  		retchar = getnext(retchar);
! 	    } while (retchar != _atowc('\n') && retchar != 0);
! 	    ptr--;
! 	    retchar = input();
! 	    goto next_chk;
! 	} else  if (_iswdigit(retchar)) { /* {number} -> [0-9]+ */
! 	    do {
! 		retchar = getnext(retchar);
! 	    } while (_iswdigit(retchar) && retchar != 0);
  	    backch(retchar);
  	    keyword = convert_wctoct(yytext);
  	    (void)sscanf(keyword, "%d", &yylval.num);
--- 47,77 ----
  
      ptr = 0;
      while ((retchar = input()) != 0) {
! 	if (retchar == _atowc('\n') || retchar == _atowc('\t') ||
! 	    retchar == _atowc(' ')) { /* [\n\t ] */
! 	    ;
! 	} else if (_iswalpha(retchar) || retchar == _atowc('.') ||
! 	    retchar == _atowc('\\')) { /* [a-zA-Z\.]+ */
  	    do {
  		retchar = getnext(retchar);
! 	    } while (_iswalpha(retchar) || retchar == _atowc('.') ||
! 		     retchar == _atowc('\\'));
  	    backch(retchar);
! 	    keyword = convert_wctoct(yytext);
  	    token = parse_keyword(keyword, &yylval.num);
  	    if (token == ERRORTOKEN) {
  		twmrc_error_prefix();
  		fprintf(stderr,
  			"ignoring unknown keyword:  %s\n",
! 			yytext);
  		ParseError = 1;
  	    } else {
  		return (token);
  	    }
! 	} else if (_iswdigit(retchar)) { /* {number} -> [0-9]+ */
  	    do {
  		retchar = getnext(retchar);
! 	    } while (_iswdigit(retchar));
  	    backch(retchar);
  	    keyword = convert_wctoct(yytext);
  	    (void)sscanf(keyword, "%d", &yylval.num);
***************
*** 123,137 ****
  	} else if (retchar == _atowc('#')) { /* \#[^\n]*\n */
  	    do {
  		retchar = getnext(retchar);
! 	    } while (retchar != _atowc('\n') && retchar != 0);
  	    ptr = 0;
- 	} else if (retchar == _atowc('\n') || retchar == _atowc('\t') ||
- 		   retchar == _atowc(' ')) { /* [\n\t ] */
  	    ;
! 	} else {
! 	    twmrc_error_prefix();
! 	    fprintf (stderr, "ignoring character \"%s\"\n", yytext);
! 	    ParseError = 1;
  	}
      }
  }
--- 79,120 ----
  	} else if (retchar == _atowc('#')) { /* \#[^\n]*\n */
  	    do {
  		retchar = getnext(retchar);
! 	    } while (retchar != _atowc('\n'));
  	    ptr = 0;
  	    ;
! 	} else if (retchar == _atowc('"')) {
! 				/* {string} -> \"(^"]|\\.)*\" */
! 	    do {
! 		retchar = getnext(retchar);
! 	    } while (retchar != _atowc('"'));
! 	    yytext[ptr++] = retchar;
! 	    yytext[ptr] = _atowc('\0');
! 	    yylval.wc_ptr = yytext;
! 	    return (WC_STRING);
! 	} else if (retchar == _atowc('{')) { /* "{" */
! 	    return (LB);
! 	} else if (retchar == _atowc('}')) { /* "}" */
! 	    return (RB);
! 	} else if (retchar == _atowc('(')) { /* "(" */
! 	    return (LP);
! 	} else if (retchar == _atowc(')')) { /* ")" */
! 	    return (RP);
! 	} else if (retchar == _atowc('=')) { /* "=" */
! 	    return (EQUALS);
! 	} else if (retchar == _atowc(':')) { /* ":" */
! 	    return (COLON);
! 	} else if (retchar == _atowc('+')) { /* "+" */
! 	    return (PLUS);
! 	} else if (retchar == _atowc('-')) { /* "-" */
! 	    return (MINUS);
! 	} else if (retchar == _atowc('|')) { /* "|" */
! 	    return (OR);
! 	} else if (retchar == _atowc('!')) { /* "!" */
! 	    yylval.num = F_EXEC;
! 	    return (FSKEYWORD);
! 	} else if (retchar == _atowc('^')) { /* "^" */
! 	    yylval.num = F_CUT;
! 	    return (FSKEYWORD);
  	}
      }
  }
*** ../twm.ORG/menus.c	Mon Aug 31 12:15:37 1992
--- menus.c	Mon Aug 31 11:21:44 1992
***************
*** 54,59 ****
--- 54,60 ----
  #include <X11/Xmu/CharSet.h>
  #include <X11/bitmaps/menu12>
  #include "version.h"
+ #include "patchlevel.h"
  /* #include <X11/Xresource.h> */
  
  extern XEvent Event;
***************
*** 95,100 ****
--- 96,103 ----
  extern char *InitFile;
  static void Identify();
  
+ extern Window	DragPSMapWin; 	/* in events.c */
+ 
  #define SHADOWWIDTH 5			/* in pixels */
  
  XRectangle overall_ink_return;
***************
*** 231,236 ****
--- 234,240 ----
      tb->bitmap = None;			/* WARNING, values not set yet */
      tb->width = 0;			/* see InitTitlebarButtons */
      tb->height = 0;			/* ditto */
+     tb->depth = 1;
      tb->func = func;
      tb->action = action;
      tb->menuroot = menuroot;
***************
*** 289,294 ****
--- 293,299 ----
  {
      TitleButton *tb;
      int h;
+     unsigned int depth;
  
      /*
       * initialize dimensions
***************
*** 324,332 ****
       */
  
      for (tb = Scr->TBInfo.head; tb; tb = tb->next) {
! 	tb->bitmap = FindBitmap (tb->name, &tb->width, &tb->height);
  	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",
--- 329,339 ----
       */
  
      for (tb = Scr->TBInfo.head; tb; tb = tb->next) {
! 	tb->bitmap = FindBitmap(tb->name, NULL,
! 				&tb->width, &tb->height, &tb->depth);
  	if (!tb->bitmap) {
! 	    tb->bitmap = FindBitmap(TBPM_QUESTION, NULL,
! 					&tb->width, &tb->height, &tb->depth);
  	    if (!tb->bitmap) {		/* cannot happen (see util.c) */
  		fprintf (stderr,
  			 "%s:  unable to add titlebar button \"%s\"\n",
***************
*** 368,374 ****
--- 375,384 ----
      fprintf(stderr, "Paint entry\n");
  #endif
      y_offset = mi->item_num * Scr->EntryHeight;
+     text_y = y_offset + Scr->MenuFontSet.height;
+ /*
      text_y = y_offset + Scr->MenuFontSet.y;
+ */
  
      if (mi->func != F_TITLE)
      {
***************
*** 413,424 ****
  	    if (Scr->pullPm == None)
  	    {
  		Scr->pullPm = CreateMenuIcon (Scr->MenuFontSet.height,
! 					     &Scr->pullW, &Scr->pullH);
  	    }
  	    x = mr->width - Scr->pullW - 5;
  	    y = y_offset + ((Scr->MenuFontSet.height - Scr->pullH) / 2);
! 	    XCopyPlane(dpy, Scr->pullPm, mr->w, gc, 0, 0,
! 		Scr->pullW, Scr->pullH, x, y, 1);
  	}
      }
      else
--- 423,439 ----
  	    if (Scr->pullPm == None)
  	    {
  		Scr->pullPm = CreateMenuIcon (Scr->MenuFontSet.height,
! 						&Scr->pullW, &Scr->pullH,
! 						&Scr->pullDepth);
  	    }
  	    x = mr->width - Scr->pullW - 5;
  	    y = y_offset + ((Scr->MenuFontSet.height - Scr->pullH) / 2);
!             if(Scr->pullDepth > 1)
!                 XCopyArea(dpy, Scr->pullPm, mr->w, gc, 0, 0,
! 			Scr->pullW, Scr->pullH, x, y);
!             else
! 		XCopyPlane(dpy, Scr->pullPm, mr->w, gc, 0, 0,
! 			Scr->pullW, Scr->pullH, x, y, 1);
  	}
      }
      else
***************
*** 1205,1211 ****
--- 1220,1598 ----
  
  
  
+ void	SetRootWindowBackgroundPixmap(pixmap, fore, back, width, height, depth)
+ Pixmap		*pixmap;
+ Pixel		fore, back;
+ unsigned int	width, height, *depth;
+ {
+ 	Pixmap		pix;
+ 	GC		gc;
+ 	XGCValues	gcv;
  
+ 	if(*depth > 1)
+ 		XSetWindowBackgroundPixmap(dpy, Scr->Root, *pixmap);
+ 	else {
+ 		gcv.foreground = fore;
+ 		gcv.background = back;
+ 		gc = XCreateGC(dpy, Scr->Root, GCForeground|GCBackground, &gcv);
+ 		pix = XCreatePixmap(dpy,Scr->Root, width, height, Scr->d_depth);
+ 		XCopyPlane(dpy, *pixmap, pix, gc, 0, 0, width, height, 0, 0,
+ 				(unsigned long)1);
+ 		XSetWindowBackgroundPixmap(dpy, Scr->Root, pix);
+ 		XFreeGC(dpy, gc);
+ 		XFreePixmap(dpy, *pixmap);
+ 		*pixmap = pix;
+ 		*depth = Scr->d_depth;
+ 	}
+ }
+ 
+ void	SetupPseudoRootWindow(scrn)
+ int	scrn;
+ {
+ 	if(Scr->NoPseudoScreenBackground == True)
+ 		return;
+ 
+ 	if(Scr->PseudoScreenC[scrn].fore == -1 && 
+ 			Scr->PseudoScreenPm[scrn] == None)
+ 		XSetWindowBackgroundPixmap(dpy, Scr->Root, (Pixmap)None);
+ 	else if(Scr->PseudoScreenC[scrn].fore != -1 &&
+ 			Scr->PseudoScreenPm[scrn] == None)
+ 		/* if you want solid color mode,
+ 		 *		set that color to foreground !!
+ 		 */
+ 		XSetWindowBackground(dpy, Scr->Root,
+ 				Scr->PseudoScreenC[Scr->PseudoCurScreen ].fore);
+ 	else if(Scr->PseudoScreenPm[scrn] != None) {
+ 		if(Scr->PseudoScreenC[scrn].fore != -1)
+ 			SetRootWindowBackgroundPixmap(
+ 				&Scr->PseudoScreenPm[scrn],
+ 				Scr->PseudoScreenC[scrn].fore,
+ 				Scr->PseudoScreenC[scrn].back,
+ 				Scr->PseudoScreenPmWidth[scrn],
+ 				Scr->PseudoScreenPmHeight[scrn],
+ 				&Scr->PseudoScreenPmDepth[scrn]);
+ 		else
+ 			SetRootWindowBackgroundPixmap(
+ 				&Scr->PseudoScreenPm[scrn],
+ 				Scr->Black,
+ 				Scr->PseudoScreenC[scrn].back,
+ 				Scr->PseudoScreenPmWidth[scrn],
+ 				Scr->PseudoScreenPmHeight[scrn],
+ 				&Scr->PseudoScreenPmDepth[scrn]);
+ 	}
+ 	XClearWindow(dpy, Scr->Root);
+ }
+ 
+ SwitchPseudoScreen(scrn)
+ int	scrn;
+ {
+ 	register TwmWindow	*t;
+ 	XWindowAttributes	winattrs;
+ 	unsigned long		eventMask;
+ 	void			RemakePseudoScreenTitle();
+ 
+ 	if(Scr->PseudoCurScreen == scrn)
+ 		return(0);
+ 
+ 	if(Scr->PseudoScreenCBPm[Scr->PseudoCurScreen] == None) {
+ 		XSetWindowBackground(dpy,
+ 			Scr->PseudoScreenCBWindow[Scr->PseudoCurScreen],
+ 			Scr->PseudoScreenCBC.back);
+ 		XClearArea(dpy,
+ 			Scr->PseudoScreenCBWindow[Scr->PseudoCurScreen],
+ 			0, 0, 0, 0, True);
+ 	}
+ 	else {
+ 		XSetWindowBackgroundPixmap(dpy,
+ 			Scr->PseudoScreenCBWindow[Scr->PseudoCurScreen],
+ 			Scr->PseudoScreenCBPm[Scr->PseudoCurScreen]);
+ 		XClearWindow(dpy,
+ 			Scr->PseudoScreenCBWindow[Scr->PseudoCurScreen]);
+ 	}
+ 
+ 	if(Scr->PseudoScreenCBPm[6] == None) {
+ 		XSetWindowBackground(dpy, Scr->PseudoScreenCBWindow[scrn],
+ 			Scr->PseudoScreenCBAC.back);
+ 		XClearArea(dpy, Scr->PseudoScreenCBWindow[scrn],
+ 			0, 0, 0, 0, True);
+ 	}
+ 	else {
+ 		XSetWindowBackgroundPixmap(dpy, Scr->PseudoScreenCBWindow[scrn],
+ 			Scr->PseudoScreenCBPm[6]);
+ 		XClearWindow(dpy, Scr->PseudoScreenCBWindow[scrn]);
+ 	}
+ 
+ 	/* active screen color change on PSMap Display */
+ 	if(Scr->PSMapDisplayPm[Scr->PseudoCurScreen] == None) {
+ 		XSetWindowBackground(dpy,
+ 			Scr->PSMapWindowC[Scr->PseudoCurScreen],
+ 			Scr->PSMapDisplayC.back);
+ 		XClearWindow(dpy, Scr->PSMapWindowC[Scr->PseudoCurScreen]);
+ 	}
+ 	else {
+ 		XSetWindowBackgroundPixmap(dpy,
+ 			Scr->PSMapWindowC[Scr->PseudoCurScreen],
+ 			Scr->PSMapDisplayPm[Scr->PseudoCurScreen]);
+ 		XClearWindow(dpy, Scr->PSMapWindowC[Scr->PseudoCurScreen]);
+ 	}
+ 
+ 	if(Scr->PSMapDisplayPm[6] == None) {
+ 		XSetWindowBackground(dpy, Scr->PSMapWindowC[scrn],
+ 			Scr->PSMapDisplayActiveC.back);
+ 		XClearWindow(dpy, Scr->PSMapWindowC[scrn]);
+ 	}
+ 	else {
+ 		XSetWindowBackgroundPixmap(dpy, Scr->PSMapWindowC[scrn],
+ 			Scr->PSMapDisplayPm[6]);
+ 		XClearWindow(dpy, Scr->PSMapWindowC[scrn]);
+ 	}
+ 
+ 	Scr->PseudoCurScreen = scrn;
+ 
+ 	if(!Scr->NoPseudoScreenTitle)
+ 		RemakePseudoScreenTitle();
+ 
+ 	/* unmap windows.. */
+ 	for(t = Scr->TwmRoot.next; t != NULL; t = t->next) {
+ 		if(t->psmapDisplay || t->iconmgr)
+ 			continue;
+ 		if(t->PseudoScreen != -1 &&
+ 				t->PseudoScreen != Scr->PseudoCurScreen) {
+ 			if(t->mapped == TRUE && t->psmapped == TRUE  &&
+ 					t->iconmgr != TRUE) {
+ 			/*
+ 				XGetWindowAttributes(dpy, t->w, &winattrs);
+ 				eventMask = winattrs.your_event_mask;
+ 				XSelectInput(dpy, t->w,
+ 					eventMask & ~StructureNotifyMask);
+ 				XUnmapWindow(dpy, t->w);
+ 				XSelectInput(dpy, t->w, eventMask);
+ 			*/
+ 				XUnmapWindow(dpy, t->frame);
+ 			}
+ 			else if(t->icon == TRUE && t->psmapped == TRUE &&
+ 					t->iconmgr != TRUE) {
+ 				if(t->icon_w)
+ 					XUnmapWindow(dpy, t->icon_w);
+ 				else
+ 					XUnmapWindow(dpy, t->icon_bm_w);
+ 			}
+ 			t->psmapped = FALSE;
+ 		}
+ 	}
+ 
+ 	SetupPseudoRootWindow(Scr->PseudoCurScreen);
+ 
+ 	/* map windows.. */
+ 	for(t = Scr->TwmRoot.next; t != NULL; t = t->next) {
+ 		if(t->psmapDisplay == TRUE) {
+ 			if(t->icon == TRUE) {
+ 				if(t->icon_w)
+ 					XRaiseWindow(dpy, t->icon_w);
+ 			}
+ 			else
+ 				XRaiseWindow(dpy, t->frame);
+ 		}
+ 		else if(t->PseudoScreen == Scr->PseudoCurScreen) {
+ 			if(t->mapped == TRUE && t->psmapped != TRUE
+ 					&& t->iconmgr != TRUE) {
+ 				XMapWindow(dpy, t->frame);
+ 			}
+ 			else if(t->icon == TRUE && t->psmapped != TRUE
+ 					&& t->iconmgr != TRUE) {
+ 				if(t->icon_w)
+ 					XMapWindow(dpy, t->icon_w);
+ 				else
+ 					XMapWindow(dpy, t->icon_bm_w);
+ 			}
+ 			t->psmapped = TRUE;
+ 		}
+ 	}
+ 	return(1);
+ }
+ 
+ void	MovePseudoScreenTo(t, scrn)
+ TwmWindow	*t;
+ int		scrn;
+ {
+ 	XWindowAttributes	winattrs;
+ 	unsigned long		eventMask;
+ 
+ 	if(scrn == -1) {	/* change pseudo-screen mode */
+ 		if(t->PseudoScreen == -1) {
+ 			t->PseudoScreen = Scr->PseudoCurScreen;
+ 			if(t->psmapWindow) {
+ 				XReparentWindow(dpy, t->psmapWindow,
+ 					Scr->PSMapWindowC[t->PseudoScreen],
+ 					t->frame_x/Scr->PSMapDisplayScale,
+ 					t->frame_y/Scr->PSMapDisplayScale);
+ 			}
+ 			if(t->psmapIcon) {
+ 				int	x, y, w, h, b, d;
+ 				Window	rw;
+ 				XGetGeometry(dpy, t->psmapIcon, &rw,
+ 					&x, &y, &w, &h, &b, &d);
+ 				XReparentWindow(dpy, t->psmapIcon,
+ 					Scr->PSMapWindowC[t->PseudoScreen],
+ 					x, y);
+ 			}
+ 			t->propTrap = TRUE;
+ 			SetPseudoScreenNumProp(t->w, t->PseudoScreen);
+ 		}
+ 		else {
+ 			t->PseudoScreen = -1;
+ 			if(t->psmapWindow) {
+ 				XReparentWindow(dpy, t->psmapWindow,
+ 					Scr->PSMapWindowC[6],
+ 					t->frame_x/Scr->PSMapDisplayScale,
+ 					t->frame_y/Scr->PSMapDisplayScale);
+ 			}
+ 			if(t->psmapIcon) {
+ 				int	x, y, w, h, b, d;
+ 				Window	rw;
+ 				XGetGeometry(dpy, t->psmapIcon, &rw,
+ 					&x, &y, &w, &h, &b, &d);
+ 				XReparentWindow(dpy, t->psmapIcon,
+ 					Scr->PSMapWindowC[6], x, y);
+ 			}
+ 		}
+ 		return;
+ 	}
+ 
+ 	if(Scr->PseudoCurScreen != scrn) {
+ 		if(t->psmapped == TRUE) {
+ 			if(t->icon == TRUE) {
+ 				if(t->icon_w) {
+ 					XUnmapWindow(dpy, t->icon_w);
+ 					XRaiseWindow(dpy, t->icon_w);
+ 				}
+ 				else
+ 					XUnmapWindow(dpy, t->icon_bm_w);
+ 			}
+ 			else {
+ 			/*
+ 				XGetWindowAttributes(dpy, t->w, &winattrs);
+ 				eventMask = winattrs.your_event_mask;
+ 				XSelectInput(dpy, t->w,
+ 					eventMask & ~StructureNotifyMask);
+ 				XUnmapWindow(dpy, t->w);
+ 				XSelectInput(dpy, t->w, eventMask);
+ 			*/
+ 				XUnmapWindow(dpy, t->frame);
+ 				XRaiseWindow(dpy, t->frame);
+ 			}
+ 			t->psmapped = FALSE;
+ 		}
+ 	}
+ 	else {
+ 		if(t->psmapped != TRUE) {
+ 			if(t->icon == TRUE) {
+ 				if(t->icon_w) {
+ 					XMapWindow(dpy, t->icon_w);
+ 					XRaiseWindow(dpy, t->icon_w);
+ 				}
+ 				else
+ 					XMapWindow(dpy, t->icon_bm_w);
+ 			}
+ 			else if(t->mapped == TRUE) {
+ 				XMapWindow(dpy, t->frame);
+ 				XRaiseWindow(dpy, t->frame);
+ 			}
+ 			t->psmapped = TRUE;
+ 		}
+ 	}
+ 
+ 	if(t->psmapWindow) {
+ 		XReparentWindow(dpy, t->psmapWindow, Scr->PSMapWindowC[scrn],
+ 				t->frame_x/Scr->PSMapDisplayScale,
+ 				t->frame_y/Scr->PSMapDisplayScale);
+ 	}
+ 	if(t->psmapIcon) {
+ 		int	x, y, w, h, b, d;
+ 		Window	rw;
+ 		XGetGeometry(dpy, t->psmapIcon, &rw, &x, &y, &w, &h, &b, &d);
+ 		XReparentWindow(dpy, t->psmapIcon, Scr->PSMapWindowC[scrn],
+ 			x, y);
+ 	}
+ 	t->PseudoScreen = scrn;
+ }
+ 
+ void	SaveWindowsState(n)
+ int	n;
+ {
+ 	register TwmWindow	*t;
+ 	Window			rw, cw;
+ 	int			x, y, dx, dy, dkb, w, h, b, d;
+ 
+ 	XQueryPointer(dpy, Scr->Root, &rw, &cw, &x, &y, &dx, &dy, &dkb);
+ 	Scr->save[n].pointerX = x;
+ 	Scr->save[n].pointerY = y;
+ 	Scr->save[n].pseudoCurScreen = Scr->PseudoCurScreen;
+ 
+ 	for(t = Scr->TwmRoot.next; t != NULL; t = t->next) {
+ 		t->save[n].frameX = t->frame_x;
+ 		t->save[n].frameY = t->frame_y;
+ 		t->save[n].frameWidth = t->frame_width;
+ 		t->save[n].frameHeight = t->frame_height;
+ 		t->save[n].pseudoScreen = t->PseudoScreen;
+ 		if(t->icon_w) {
+ 			XGetGeometry(dpy, t->icon_w, &rw,
+ 					&x, &y, &w, &h, &b, &d);
+ 			t->save[n].iconX = x;
+ 			t->save[n].iconY = y;
+ 			t->save[n].icon = t->icon;
+ 		}
+ 	}
+ }
+ 
+ extern void MoveIcon();
+ 
+ void	RestoreWindowsState(n)
+ int	n;
+ {
+ 	register TwmWindow	*t;
+ 	Window			rw;
+ 	int			x, y, w, h, b, d;
+ 
+ 	
+ 	for(t = Scr->TwmRoot.next; t != NULL; t = t->next) {
+ 		if(t->save[n].frameX == -100000)
+ 			continue;
+ 		if(t->save[n].frameX != t->frame_x ||
+ 				t->save[n].frameY != t->frame_y ||
+ 				t->save[n].frameWidth != t->frame_width ||
+ 				t->save[n].frameHeight != t->frame_height)
+ 			SetupWindow(t, t->save[n].frameX, t->save[n].frameY,
+ 					t->save[n].frameWidth,
+ 					t->save[n].frameHeight,
+ 					Scr->BorderWidth);
+ 		if(t->save[n].iconX != -100000 && t->icon_w) {
+ 			XGetGeometry(dpy, t->icon_w, &rw,
+ 					&x, &y, &w, &h, &b, &d);
+ 			if(t->save[n].iconX != x || t->save[n].iconY != y)
+ 				MoveIcon(t, t->save[n].iconX ,t->save[n].iconY);
+ 			if(t->save[n].icon != t->icon) {
+ 				if(t->save[n].icon == TRUE)
+ 					Iconify(t, t->save[n].iconX,
+ 							t->save[n].iconY);
+ 				else
+ 					DeIconify(t);
+ 			}
+ 		}
+ 		if(t->save[n].pseudoScreen != t->PseudoScreen)
+ 			SetPseudoScreenNumProp(Scr->Root,
+ 					t->save[n].pseudoScreen);
+ 	}
+ 
+ 	if(Scr->save[n].pseudoCurScreen != -1) {
+ 		if(Scr->save[n].pseudoCurScreen != Scr->PseudoCurScreen)
+ 			SetPseudoScreenNumProp(Scr->Root,
+ 				Scr->save[n].pseudoCurScreen);
+ 		XWarpPointer(dpy, None, Scr->Root, 0, 0, 0, 0, 
+ 				Scr->save[n].pointerX, Scr->save[n].pointerY);
+ 	}
+ }
+ 
  /***********************************************************************
   *
   *  Procedure:
***************
*** 1363,1368 ****
--- 1750,1839 ----
  
      switch (func)
      {
+     case F_WRAPSCREEN:
+ 	{
+ 	    int scrn;
+ 
+ 	    scrn = Scr->PseudoCurScreen;
+ 	    if(++scrn > 5)
+ 		scrn = 0;
+ 	    if(SetPseudoScreenNumProp(Scr->Root, scrn))
+ 		if(!Scr->NoPseudoScreenTitle)
+ 		    RemakePseudoScreenTitle();
+ 	    break;
+ 	}
+     case F_SWITCHSCREEN_ONE:
+ 	if(SetPseudoScreenNumProp(Scr->Root, 0))
+ 	    if(!Scr->NoPseudoScreenTitle)
+ 		RemakePseudoScreenTitle();
+ 	break;
+     case F_SWITCHSCREEN_TWO:
+ 	if(SetPseudoScreenNumProp(Scr->Root, 1))
+ 	    if(!Scr->NoPseudoScreenTitle)
+ 		RemakePseudoScreenTitle();
+ 	break;
+     case F_SWITCHSCREEN_THREE:
+ 	if(SetPseudoScreenNumProp(Scr->Root, 2))
+ 	    if(!Scr->NoPseudoScreenTitle)
+ 		RemakePseudoScreenTitle();
+ 	break;
+     case F_SWITCHSCREEN_FOUR:
+ 	if(SetPseudoScreenNumProp(Scr->Root, 3))
+ 	    if(!Scr->NoPseudoScreenTitle)
+ 		RemakePseudoScreenTitle();
+ 	break;
+     case F_SWITCHSCREEN_FIVE:
+ 	if(SetPseudoScreenNumProp(Scr->Root, 4))
+ 	    if(!Scr->NoPseudoScreenTitle)
+ 		RemakePseudoScreenTitle();
+ 	break;
+     case F_SWITCHSCREEN_SIX:
+ 	if(SetPseudoScreenNumProp(Scr->Root, 5))
+ 	    if(!Scr->NoPseudoScreenTitle)
+ 		RemakePseudoScreenTitle();
+ 	break;
+     case F_PSMAPDISPLAY:
+ 	if(Scr->PSMapDisplayState == TRUE)
+ 		UnmapPSMapDisplay();
+ 	else
+ 		MapPSMapDisplay();
+ 	break;
+     case F_SAVEWINDOWSTATE_ONE:
+ 	SaveWindowsState(0);
+ 	break;
+     case F_SAVEWINDOWSTATE_TWO:
+ 	SaveWindowsState(1);
+ 	break;
+     case F_SAVEWINDOWSTATE_THREE:
+ 	SaveWindowsState(2);
+ 	break;
+     case F_SAVEWINDOWSTATE_FOUR:
+ 	SaveWindowsState(3);
+ 	break;
+     case F_SAVEWINDOWSTATE_FIVE:
+ 	SaveWindowsState(4);
+ 	break;
+     case F_SAVEWINDOWSTATE_SIX:
+ 	SaveWindowsState(5);
+ 	break;
+     case F_RESTOREWINDOWSTATE_ONE:
+ 	RestoreWindowsState(0);
+ 	break;
+     case F_RESTOREWINDOWSTATE_TWO:
+ 	RestoreWindowsState(1);
+ 	break;
+     case F_RESTOREWINDOWSTATE_THREE:
+ 	RestoreWindowsState(2);
+ 	break;
+     case F_RESTOREWINDOWSTATE_FOUR:
+ 	RestoreWindowsState(3);
+ 	break;
+     case F_RESTOREWINDOWSTATE_FIVE:
+ 	RestoreWindowsState(4);
+ 	break;
+     case F_RESTOREWINDOWSTATE_SIX:
+ 	RestoreWindowsState(5);
+ 	break;
      case F_UPICONMGR:
      case F_LEFTICONMGR:
      case F_RIGHTICONMGR:
***************
*** 1391,1396 ****
--- 1862,1961 ----
  
      switch (func)
      {
+     case F_MOVE_TO_SCREEN_ONE:
+ 	if(Scr->PseudoCurScreen == 0) {
+ 		XBell(dpy, 0);
+ 		break;
+ 	}
+ 	if(DeferExecution(context, func, Scr->SelectCursor))
+ 		return TRUE;
+ 
+ 	if(tmp_win->iconmgr || tmp_win->PseudoScreen == -1)
+ 		XBell(dpy, 0);
+ 	else
+ 		SetPseudoScreenNumProp(tmp_win->w, 0);
+ 	break;
+ 
+     case F_MOVE_TO_SCREEN_TWO:
+ 	if(Scr->PseudoCurScreen == 1) {
+ 		XBell(dpy, 0);
+ 		break;
+ 	}
+ 	if(DeferExecution(context, func, Scr->SelectCursor))
+ 		return TRUE;
+ 
+ 	if(tmp_win->iconmgr || tmp_win->PseudoScreen == -1)
+ 		XBell(dpy, 0);
+ 	else
+ 		SetPseudoScreenNumProp(tmp_win->w, 1);
+ 	break;
+ 
+     case F_MOVE_TO_SCREEN_THREE:
+ 	if(Scr->PseudoCurScreen == 2) {
+ 		XBell(dpy, 0);
+ 		break;
+ 	}
+ 	if(DeferExecution(context, func, Scr->SelectCursor))
+ 		return TRUE;
+ 
+ 	if(tmp_win->iconmgr || tmp_win->PseudoScreen == -1)
+ 		XBell(dpy, 0);
+ 	else
+ 		SetPseudoScreenNumProp(tmp_win->w, 2);
+ 	break;
+ 
+     case F_MOVE_TO_SCREEN_FOUR:
+ 	if(Scr->PseudoCurScreen == 3) {
+ 		XBell(dpy, 0);
+ 		break;
+ 	}
+ 	if(DeferExecution(context, func, Scr->SelectCursor))
+ 		return TRUE;
+ 
+ 	if(tmp_win->iconmgr || tmp_win->PseudoScreen == -1)
+ 		XBell(dpy, 0);
+ 	else
+ 		SetPseudoScreenNumProp(tmp_win->w, 3);
+ 	break;
+ 
+     case F_MOVE_TO_SCREEN_FIVE:
+ 	if(Scr->PseudoCurScreen == 4) {
+ 		XBell(dpy, 0);
+ 		break;
+ 	}
+ 	if(DeferExecution(context, func, Scr->SelectCursor))
+ 		return TRUE;
+ 
+ 	if(tmp_win->iconmgr || tmp_win->PseudoScreen == -1)
+ 		XBell(dpy, 0);
+ 	else
+ 		SetPseudoScreenNumProp(tmp_win->w, 4);
+ 	break;
+ 
+     case F_MOVE_TO_SCREEN_SIX:
+ 	if(Scr->PseudoCurScreen == 5) {
+ 		XBell(dpy, 0);
+ 		break;
+ 	}
+ 	if(DeferExecution(context, func, Scr->SelectCursor))
+ 		return TRUE;
+ 
+ 	if(tmp_win->iconmgr || tmp_win->PseudoScreen == -1)
+ 		XBell(dpy, 0);
+ 	else
+ 		SetPseudoScreenNumProp(tmp_win->w, 5);
+ 	break;
+ 
+     case F_CHANGE_PS_MODE:
+ 	if(DeferExecution(context, func, Scr->SelectCursor))
+ 		return TRUE;
+ 	if(tmp_win->iconmgr) {
+ 		XBell(dpy, 0);
+ 		break;
+ 	}
+ 	SetPseudoScreenNumProp(tmp_win->w, -1);
+ 	break;
+ 
      case F_NOP:
      case F_TITLE:
  	break;
***************
*** 1425,1431 ****
  	if (Scr->NoIconManagers)
  	    break;
  	DeIconify(Scr->iconmgr.twm_win);
! 	XRaiseWindow(dpy, Scr->iconmgr.twm_win->frame);
  	break;
  
      case F_HIDELIST:
--- 1990,1996 ----
  	if (Scr->NoIconManagers)
  	    break;
  	DeIconify(Scr->iconmgr.twm_win);
! 	RaiseFrame(Scr->iconmgr.twm_win);
  	break;
  
      case F_HIDELIST:
***************
*** 1490,1496 ****
  	else
  	{
  	    DeIconify(tmp_win);
! 	    XRaiseWindow (dpy, tmp_win->frame);
  	}
  	break;
  
--- 2055,2061 ----
  	else
  	{
  	    DeIconify(tmp_win);
! 	    RaiseFrame(tmp_win);
  	}
  	break;
  
***************
*** 1594,1604 ****
  	if (context == C_ICON && tmp_win->icon_w)
  	{
  	    w = tmp_win->icon_w;
  	    DragX = eventp->xbutton.x;
  	    DragY = eventp->xbutton.y;
  	    moving_icon = TRUE;
  	}
- 
  	else if (w != tmp_win->icon_w)
  	{
  	    XTranslateCoordinates(dpy, w, tmp_win->frame,
--- 2159,2169 ----
  	if (context == C_ICON && tmp_win->icon_w)
  	{
  	    w = tmp_win->icon_w;
+ 	    DragPSMapWin = tmp_win->psmapIcon;
  	    DragX = eventp->xbutton.x;
  	    DragY = eventp->xbutton.y;
  	    moving_icon = TRUE;
  	}
  	else if (w != tmp_win->icon_w)
  	{
  	    XTranslateCoordinates(dpy, w, tmp_win->frame,
***************
*** 1605,1612 ****
  		eventp->xbutton.x, 
  		eventp->xbutton.y, 
  		&DragX, &DragY, &JunkChild);
- 
  	    w = tmp_win->frame;
  	}
  
  	DragWindow = None;
--- 2170,2177 ----
  		eventp->xbutton.x, 
  		eventp->xbutton.y, 
  		&DragX, &DragY, &JunkChild);
  	    w = tmp_win->frame;
+ 	    DragPSMapWin = tmp_win->psmapWindow;
  	}
  
  	DragWindow = None;
***************
*** 1775,1780 ****
--- 2340,2347 ----
  
  	    if (!Scr->NoRaiseMove && Scr->OpaqueMove)	/* can't restore... */
  	      XRaiseWindow(dpy, DragWindow);
+ 	    if (!Scr->NoRaiseMove)
+ 	      XRaiseWindow(dpy, DragPSMapWin);
  
  	    if (ConstMove)
  	    {
***************
*** 1945,1954 ****
  
  	/* check to make sure raise is not from the WindowFunction */
  	if (w == tmp_win->icon_w && Context != C_ROOT) 
! 	    XRaiseWindow(dpy, tmp_win->icon_w);
  	else
! 	    XRaiseWindow(dpy, tmp_win->frame);
! 
  	break;
  
      case F_LOWER:
--- 2512,2520 ----
  
  	/* check to make sure raise is not from the WindowFunction */
  	if (w == tmp_win->icon_w && Context != C_ROOT) 
! 	    RaiseIcon(tmp_win);
  	else
! 	    RaiseFrame(tmp_win);
  	break;
  
      case F_LOWER:
***************
*** 1956,1965 ****
  	    return TRUE;
  
  	if (w == tmp_win->icon_w)
! 	    XLowerWindow(dpy, tmp_win->icon_w);
  	else
! 	    XLowerWindow(dpy, tmp_win->frame);
! 
  	break;
  
      case F_FOCUS:
--- 2522,2530 ----
  	    return TRUE;
  
  	if (w == tmp_win->icon_w)
! 	    LowerIcon(tmp_win);
  	else
! 	    LowerFrame(tmp_win);
  	break;
  
      case F_FOCUS:
***************
*** 1996,2001 ****
--- 2561,2571 ----
  
  	if (tmp_win->iconmgr)
  	    XBell(dpy, 0);
+ 	else if (tmp_win->w == Scr->PSMapWindow) {
+ 	    UnmapFrame(tmp_win);
+ 	    tmp_win->mapped = FALSE;
+ 	    Scr->PSMapDisplayState = FALSE;
+         }
  	else
  	    XKillClient(dpy, tmp_win->w);
  	break;
***************
*** 2126,2132 ****
  	    if (t) {
  		if (Scr->WarpUnmapped || t->mapped) {
  		    if (!t->mapped) DeIconify (t);
! 		    if (!Scr->NoRaiseWarp) XRaiseWindow (dpy, t->frame);
  		    WarpToWindow (t);
  		}
  	    } else {
--- 2696,2702 ----
  	    if (t) {
  		if (Scr->WarpUnmapped || t->mapped) {
  		    if (!t->mapped) DeIconify (t);
! 		    if (!Scr->NoRaiseWarp) RaiseFrame(t);
  		    WarpToWindow (t);
  		}
  	    } else {
***************
*** 2140,2153 ****
--- 2710,2726 ----
  	    TwmWindow *t;
  	    int len;
  	    Window raisewin = None, iconwin = None;
+ 	    TwmWindow *raiseframe;
  
  	    len = strlen(action);
  	    if (len == 0) {
  		if (tmp_win && tmp_win->list) {
  		    raisewin = tmp_win->list->iconmgr->twm_win->frame;
+ 		    raiseframe = tmp_win->list->iconmgr->twm_win;
  		    iconwin = tmp_win->list->icon;
  		} else if (Scr->iconmgr.active) {
  		    raisewin = Scr->iconmgr.twm_win->frame;
+ 		    raiseframe = Scr->iconmgr.twm_win;
  		    iconwin = Scr->iconmgr.active->w;
  		}
  	    } else {
***************
*** 2155,2160 ****
--- 2728,2734 ----
  		    if (strncmp (action, t->icon_name, len) == 0) {
  			if (t->list && t->list->iconmgr->twm_win->mapped) {
  			    raisewin = t->list->iconmgr->twm_win->frame;
+ 			    raiseframe = t->list->iconmgr->twm_win;
  			    iconwin = t->list->icon;
  			    break;
  			}
***************
*** 2163,2169 ****
  	    }
  
  	    if (raisewin) {
! 		XRaiseWindow (dpy, raisewin);
  		XWarpPointer (dpy, None, iconwin, 0,0,0,0, 5, 5);
  	    } else {
  		XBell (dpy, 0);
--- 2737,2743 ----
  	    }
  
  	    if (raisewin) {
! 		RaiseFrame(raiseframe);
  		XWarpPointer (dpy, None, iconwin, 0,0,0,0, 5, 5);
  	    } else {
  		XBell (dpy, 0);
***************
*** 2456,2471 ****
  	}
      }
  
-     XMapWindow(dpy, tmp_win->w);
      tmp_win->mapped = TRUE;
!     if (Scr->NoRaiseDeicon)
! 	XMapWindow(dpy, tmp_win->frame);
!     else
! 	XMapRaised(dpy, tmp_win->frame);
      SetMapStateProp(tmp_win, NormalState);
  
      if (tmp_win->icon_w) {
! 	XUnmapWindow(dpy, tmp_win->icon_w);
  	IconDown (tmp_win);
      }
      if (tmp_win->list)
--- 3030,3043 ----
  	}
      }
  
      tmp_win->mapped = TRUE;
!     if(!Scr->NoRaiseDeicon)
! 	RaiseFrame(tmp_win);
!     MapFrame(tmp_win);
      SetMapStateProp(tmp_win, NormalState);
  
      if (tmp_win->icon_w) {
! 	UnmapIcon(tmp_win);
  	IconDown (tmp_win);
      }
      if (tmp_win->list)
***************
*** 2527,2533 ****
  	    CreateIconWindow(tmp_win, def_x, def_y);
  	else
  	    IconUp(tmp_win);
! 	XMapRaised(dpy, tmp_win->icon_w);
      }
      if (tmp_win->list)
  	XMapWindow(dpy, tmp_win->list->icon);
--- 3099,3105 ----
  	    CreateIconWindow(tmp_win, def_x, def_y);
  	else
  	    IconUp(tmp_win);
! 	MapIcon(tmp_win);
      }
      if (tmp_win->list)
  	XMapWindow(dpy, tmp_win->list->icon);
***************
*** 2554,2564 ****
  	     */
  	    t->mapped = FALSE;
  	    XSelectInput(dpy, t->w, eventMask & ~StructureNotifyMask);
! 	    XUnmapWindow(dpy, t->w);
  	    XSelectInput(dpy, t->w, eventMask);
- 	    XUnmapWindow(dpy, t->frame);
  	    if (t->icon_w)
! 	      XUnmapWindow(dpy, t->icon_w);
  	    SetMapStateProp(t, IconicState);
  	    SetBorder (t, False);
  	    if (t == Scr->Focus)
--- 3126,3135 ----
  	     */
  	    t->mapped = FALSE;
  	    XSelectInput(dpy, t->w, eventMask & ~StructureNotifyMask);
! 	    UnmapFrame(t);
  	    XSelectInput(dpy, t->w, eventMask);
  	    if (t->icon_w)
! 		UnmapIcon(t);
  	    SetMapStateProp(t, IconicState);
  	    SetBorder (t, False);
  	    if (t == Scr->Focus)
***************
*** 2582,2590 ****
       */
      tmp_win->mapped = FALSE;
      XSelectInput(dpy, tmp_win->w, eventMask & ~StructureNotifyMask);
!     XUnmapWindow(dpy, tmp_win->w);
      XSelectInput(dpy, tmp_win->w, eventMask);
-     XUnmapWindow(dpy, tmp_win->frame);
      SetMapStateProp(tmp_win, IconicState);
  
      SetBorder (tmp_win, False);
--- 3153,3163 ----
       */
      tmp_win->mapped = FALSE;
      XSelectInput(dpy, tmp_win->w, eventMask & ~StructureNotifyMask);
!     UnmapFrame(tmp_win);
!     if(tmp_win->PseudoScreen == Scr->PseudoCurScreen ||
! 		tmp_win->PseudoScreen == -1)
! 	tmp_win->psmapped = TRUE;
      XSelectInput(dpy, tmp_win->w, eventMask);
      SetMapStateProp(tmp_win, IconicState);
  
      SetBorder (tmp_win, False);
***************
*** 2616,2621 ****
--- 3189,3195 ----
  
      n = 0;
      (void) sprintf(Info[n++], "Twm version:  %s", Version);
+     (void) sprintf(Info[n++], Version2, PATCHLEVEL);
      Info[n++][0] = '\0';
  
      if (t) {
***************
*** 2809,2817 ****
  HideIconManager ()
  {
      SetMapStateProp (Scr->iconmgr.twm_win, WithdrawnState);
!     XUnmapWindow(dpy, Scr->iconmgr.twm_win->frame);
      if (Scr->iconmgr.twm_win->icon_w)
!       XUnmapWindow (dpy, Scr->iconmgr.twm_win->icon_w);
      Scr->iconmgr.twm_win->mapped = FALSE;
      Scr->iconmgr.twm_win->icon = TRUE;
  }
--- 3383,3391 ----
  HideIconManager ()
  {
      SetMapStateProp (Scr->iconmgr.twm_win, WithdrawnState);
!     UnmapFrame(Scr->iconmgr.twm_win);
      if (Scr->iconmgr.twm_win->icon_w)
! 	UnmapIcon(Scr->iconmgr.twm_win);
      Scr->iconmgr.twm_win->mapped = FALSE;
      Scr->iconmgr.twm_win->icon = TRUE;
  }
***************
*** 2875,2885 ****
  
      if (forward) {
  	for (r = head->ring.next; r != head; r = r->ring.next) {
! 	    if (!r || r->mapped) break;
  	}
      } else {
  	for (r = head->ring.prev; r != head; r = r->ring.prev) {
! 	    if (!r || r->mapped) break;
  	}
      }
  
--- 3449,3459 ----
  
      if (forward) {
  	for (r = head->ring.next; r != head; r = r->ring.next) {
! 	    if (!r || (r->psmapped && r->mapped)) break;
  	}
      } else {
  	for (r = head->ring.prev; r != head; r = r->ring.prev) {
! 	    if (!r || (r->psmapped && r->mapped)) break;
  	}
      }
  
*** ../twm.ORG/parse.c	Mon Aug 31 12:15:37 1992
--- parse.c	Mon Aug 31 11:21:45 1992
***************
*** 1,4 ****
! /* $Id: parse.c,v 1.5 1992/01/08 12:35:08 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
--- 1,4 ----
! /* $Id: parse.c,v 1.2 1991/10/28 06:42:02 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
***************
*** 53,59 ****
--- 53,63 ----
  
  #define X11_LIB_DIR "/usr/lib/X11"
  #define TWM_INIT_DIR "/twm/system.twmrc"
+ #define PSTWM_INIT_DIR "/twm/system.pstwmrc"
  
+ #ifndef	SYSTEM_INIT_FILE
+ #define SYSTEM_INIT_FILE "/usr/lib/X11/twm/system.pstwmrc"
+ #endif
  #define BUF_LEN 300
  
  static FILE *twmrc;
***************
*** 72,78 ****
  int ConstrainedMoveTime = 400;		/* milliseconds, event times */
  
  static wchar_t twmFileInput();
! static wchar_t twmStringListInput();
  void twmUnput();
  int (*twmInputFunc)();
  
--- 76,82 ----
  int ConstrainedMoveTime = 400;		/* milliseconds, event times */
  
  static wchar_t twmFileInput();
! static int twmStringListInput();
  void twmUnput();
  int (*twmInputFunc)();
  
***************
*** 126,142 ****
      char *cp = NULL;
      char tmpfilename[257];
  
!     /*
!      * If filename given, try it, else try ~/.twmrc.# then ~/.twmrc.  Then
!      * try system.twmrc; finally using built-in defaults.
!      */
!     for (twmrc = NULL, i = 0; !twmrc && i < 10; i++) {
  	switch (i) {
  	  case 0:			/* -f filename */
  	    cp = filename;
  	    break;
  
! 	  case 1:			/* ~/LANG(full)/.twmrc.screennum */
  	    if (!filename) {
  		home = getenv ("HOME");
  		locale = setlocale(LC_ALL, NULL);
--- 130,161 ----
      char *cp = NULL;
      char tmpfilename[257];
  
! 	/*
! 	 * read by following order.
! 	 *  0) option -f
! 	 *  1) ~/$LANG/.pstwmrc.screennum
! 	 *  2) ~/$LANG/.pstwmrc
! 	 *  3) ~/$l_$t/.pstwmrc.screennum
! 	 *  4) ~/$l_$t/.pstwmrc
! 	 *  5) ~/.pstwmrc.screennum
! 	 *  6) ~/.pstwmrc
! 	 *  7) /usr/lib/X11/$LANG/twm/system.pstwmrc
! 	 *  8) /usr/lib/X11/$l_$t/twm/system.pstwmrc
! 	 *  9) /usr/lib/X11/twm/system.pstwmrc
! 	 * 10) ~/.twmrc.screennum
! 	 * 11) ~/.twmrc
! 	 * 12) /usr/lib/X11/$LANG/twm/system.twmrc
! 	 * 13) /usr/lib/X11/$l_$t/twm/system.twmrc
! 	 * 14) /usr/lib/X11/twm/system.twmrc
! 	 */
! 
!     for (twmrc = NULL, i = 0; !twmrc && i < 15; i++) {
  	switch (i) {
  	  case 0:			/* -f filename */
  	    cp = filename;
  	    break;
  
! 	  case 1:			/* ~/LANG(full)/.pstwmrc.screennum */
  	    if (!filename) {
  		home = getenv ("HOME");
  		locale = setlocale(LC_ALL, NULL);
***************
*** 148,154 ****
  		}
  		if (home) {
  		    cp = tmpfilename;
! 		    (void) sprintf (tmpfilename, "%s/%s/.twmrc.%d",
  				    home, locale, Scr->screen);
  		    break;
  		}
--- 167,173 ----
  		}
  		if (home) {
  		    cp = tmpfilename;
! 		    (void) sprintf (tmpfilename, "%s/%s/.pstwmrc.%d",
  				    home, locale, Scr->screen);
  		    break;
  		}
***************
*** 155,161 ****
  	    }
  	    continue;
  
! 	  case 2:			/* ~/locale(full)/.twmrc */
  	    if (home) {
  		if ((lastdot = rindex(tmpfilename, '.')) != NULL) {
  		    *lastdot = '\0';
--- 174,180 ----
  	    }
  	    continue;
  
! 	  case 2:			/* ~/locale(full)/.pstwmrc */
  	    if (home) {
  		if ((lastdot = rindex(tmpfilename, '.')) != NULL) {
  		    *lastdot = '\0';
***************
*** 164,172 ****
  	    }
  	    continue;
  
!   	  case 3:		/* ~/locale(non_codeset)/.twmrc.screennum */
  	    if (home && tmplocale[0] != '\0') {
! 		(void) sprintf (tmpfilename, "%s/%s/.twmrc.%d",
  				home, tmplocale, Scr->screen);
  		break;
  	    }
--- 183,191 ----
  	    }
  	    continue;
  
!   	  case 3:		/* ~/locale(non_codeset)/.pstwmrc.screennum */
  	    if (home && tmplocale[0] != '\0') {
! 		(void) sprintf (tmpfilename, "%s/%s/.pstwmrc.%d",
  				home, tmplocale, Scr->screen);
  		break;
  	    }
***************
*** 181,188 ****
  	    }
  	    continue;
  
! 	  case 5:			/* ~/.twmrc.screennum */
  	    if (home) {
  		(void) sprintf (tmpfilename, "%s/.twmrc.%d",
  				home, Scr->screen);
  		break;
--- 200,239 ----
  	    }
  	    continue;
  
! 	  case 5:			/* ~/.pstwmrc.screennum */
  	    if (home) {
+ 		(void) sprintf (tmpfilename, "%s/.pstwmrc.%d",
+ 				home, Scr->screen);
+ 		break;
+ 	    }
+ 	    continue;
+ 		
+  	  case 6:			/* ~/.pstwmrc */
+ 	    if (home) {
+ 		if ((lastdot = rindex(tmpfilename, '.')) != NULL) {
+ 		    *lastdot = '\0';
+ 		    break;
+ 		}
+ 	    }
+ 	    continue;
+ 
+ 	  case 7:	/* X11_LIB_DIR/locale(full)/twm/system.pstwmrc */
+ 	    sprintf(tmpfilename, "%s/%s%s",
+ 				X11_LIB_DIR, locale, PSTWM_INIT_DIR);
+ 	    break;
+ 
+ 	  case 8:	/* X11_LIB_DIR/locale(non_codeset)/twm/system.pstwmrc */
+ 	    if (tmplocale[0] != NULL) 
+ 		sprintf(tmpfilename, "%s/%s%s",
+ 				X11_LIB_DIR, tmplocale, PSTWM_INIT_DIR);
+ 	    break;
+ 	   
+ 	  case 9:	/* X11_LIB_DIR/twm/system.pstwmrc */
+ 	    sprintf (tmpfilename, "%s%s", X11_LIB_DIR, PSTWM_INIT_DIR);
+ 	    break;
+ 
+ 	  case 10:			/* ~/.twmrc.screennum */
+ 	    if (home) {
  		(void) sprintf (tmpfilename, "%s/.twmrc.%d",
  				home, Scr->screen);
  		break;
***************
*** 189,195 ****
  	    }
  	    continue;
  		
!  	  case 6:			/* ~/.twmrc */
  	    if (home) {
  		if ((lastdot = rindex(tmpfilename, '.')) != NULL) {
  		    *lastdot = '\0';
--- 240,246 ----
  	    }
  	    continue;
  		
!  	  case 11:			/* ~/.twmrc */
  	    if (home) {
  		if ((lastdot = rindex(tmpfilename, '.')) != NULL) {
  		    *lastdot = '\0';
***************
*** 198,218 ****
  	    }
  	    continue;
  
! 	  case 7:		/* X11_LIB_DIR/locale(full)/twm/system.twmrc */
  	    sprintf(tmpfilename, "%s/%s%s",
! 		    X11_LIB_DIR, locale, TWM_INIT_DIR);
  	    break;
  
! 	  case 8:	/* X11_LIB_DIR/locale(non_codeset)/twm/system.twmrc */
  	    if (tmplocale[0] != NULL) 
  		sprintf(tmpfilename, "%s/%s%s",
! 			X11_LIB_DIR, tmplocale, TWM_INIT_DIR);
  	    break;
  	   
! 	  case 9:	/* X11_LIB_DIR/twm/system.twmrc */
! 	    sprintf (tmpfilename, "%s%s",
! 		     X11_LIB_DIR, TWM_INIT_DIR);
  	    break;
  	}
  
  	if (cp) twmrc = fopen (cp, "r");
--- 249,269 ----
  	    }
  	    continue;
  
! 	  case 12:	/* X11_LIB_DIR/locale(full)/twm/system.twmrc */
  	    sprintf(tmpfilename, "%s/%s%s",
! 				X11_LIB_DIR, locale, TWM_INIT_DIR);
  	    break;
  
! 	  case 13:	/* X11_LIB_DIR/locale(non_codeset)/twm/system.twmrc */
  	    if (tmplocale[0] != NULL) 
  		sprintf(tmpfilename, "%s/%s%s",
! 				X11_LIB_DIR, tmplocale, TWM_INIT_DIR);
  	    break;
  	   
! 	  case 14:	/* X11_LIB_DIR/twm/system.twmrc */
! 	    sprintf (tmpfilename, "%s%s", X11_LIB_DIR, TWM_INIT_DIR);
  	    break;
+ 
  	}
  
  	if (cp) twmrc = fopen (cp, "r");
***************
*** 265,295 ****
  
      while (ptr == len)
      {
! 	if (wcbuff) {
  	    free(wcbuff);
- 	    *wcbuff = NULL;
- 	}
  	if (fgets(buff, BUF_LEN, twmrc) == NULL)
  	    return 0;
  
! 	if ((wcbuff = convert_mbtowc(buff)) == NULL) {
! 	    twmrc_error_prefix();
! 	    fprintf (stderr, "unable to convert multibyte to widecharacter\n");
! 	    len = 0;
! 	    ParseError = 1;
! 	} else {
! 	    len = wcslen(wcbuff); 
! 	}
  	yylineno++;
  	ptr = 0;
      }
      return (wcbuff[ptr++]);
  }
  
! static wchar_t twmStringListInput()
  {
-     wchar_t	*wc = NULL;
- 
      if (overflowlen) return (int) overflowbuff[--overflowlen];
  
      /*
--- 316,337 ----
  
      while (ptr == len)
      {
! 	if (wcbuff)
  	    free(wcbuff);
  	if (fgets(buff, BUF_LEN, twmrc) == NULL)
  	    return 0;
  
! 	wcbuff = convert_mbtowc(buff);
  	yylineno++;
+ 
  	ptr = 0;
+ 	len = wcslen(wcbuff); 
      }
      return (wcbuff[ptr++]);
  }
  
! static int twmStringListInput()
  {
      if (overflowlen) return (int) overflowbuff[--overflowlen];
  
      /*
***************
*** 296,308 ****
       * return the character currently pointed to
       */
      if (currentString) {
! 	if ((wc = convert_mbtowc(currentString++)) == NULL) {
! 	    twmrc_error_prefix();
! 	    fprintf (stderr, "unable to convert multibyte to widecharacter\n");
! 	}
! 	if (*wc) return *wc;		/* if non-nul char */
  	currentString = *++stringListSource;  /* advance to next bol */
! 	return atowc('\n');		/* but say that we hit last eol */
      }
      return 0;				/* eof */
  }
--- 338,348 ----
       * return the character currently pointed to
       */
      if (currentString) {
! 	unsigned int c = (unsigned int) *currentString++;
! 
! 	if (c) return c;		/* if non-nul char */
  	currentString = *++stringListSource;  /* advance to next bol */
! 	return '\n';			/* but say that we hit last eol */
      }
      return 0;				/* eof */
  }
***************
*** 387,392 ****
--- 427,435 ----
  #define kw0_NoCaseSensitive		23
  #define kw0_NoRaiseOnWarp		24
  #define kw0_WarpUnmapped		25
+ #define kw0_NoPseudoScreenTitle		26
+ #define kw0_NoPseudoScreenCB		27
+ #define kw0_NoPseudoScreenBackground	28
  
  #define kws_UsePPosition		1
  #define kws_IconFontSet			2
***************
*** 397,402 ****
--- 440,460 ----
  #define kws_UnknownIcon			7
  #define kws_IconDirectory		8
  #define kws_MaxWindowSize		9
+ #define kws_PseudoScreenOneTitle	10
+ #define kws_PseudoScreenTwoTitle	11
+ #define kws_PseudoScreenThreeTitle	12
+ #define kws_PseudoScreenFourTitle	13
+ #define kws_PseudoScreenFiveTitle	14
+ #define kws_PseudoScreenSixTitle	15
+ #define kws_PSTitleFontSet		16
+ #define kws_PseudoScreenTitlePosition	17
+ #define kws_PseudoScreenCBPosition	18
+ #define kws_PseudoScreenCBSize		19
+ #define kws_PSCBFontSet			20
+ #define kws_PSMapDisplayPosition	21
+ #define kws_PSMapDisplayScale		22
+ #define kws_PSMapDisplayState		23
+ #define kws_SetPseudoScreenBackgroundProc	24
  
  #define kwn_ConstrainedMoveTime		1
  #define kwn_MoveDelta			2
***************
*** 419,432 ****
  #define kwcl_IconBorderColor		9
  #define kwcl_IconManagerForeground	10
  #define kwcl_IconManagerBackground	11
  
! #define kwc_DefaultForeground		1
! #define kwc_DefaultBackground		2
! #define kwc_MenuForeground		3
! #define kwc_MenuBackground		4
! #define kwc_MenuTitleForeground		5
! #define kwc_MenuTitleBackground		6
! #define kwc_MenuShadowColor		7
  
  
  /*
--- 477,539 ----
  #define kwcl_IconBorderColor		9
  #define kwcl_IconManagerForeground	10
  #define kwcl_IconManagerBackground	11
+ #define kwcl_PSMapWindowForeground	12
+ #define kwcl_PSMapWindowBackground	13
+ #define kwcl_PSMapWindowBorderColor	14
  
! #define kwc_DefaultForeground			1
! #define kwc_DefaultBackground			2
! #define kwc_MenuForeground			3
! #define kwc_MenuBackground			4
! #define kwc_MenuTitleForeground			5
! #define kwc_MenuTitleBackground			6
! #define kwc_MenuShadowColor			7
! #define	kwc_PseudoScreenOneForeground 		8
! #define	kwc_PseudoScreenOneBackground 		9
! #define	kwc_PseudoScreenTwoForeground 		10
! #define	kwc_PseudoScreenTwoBackground 		11
! #define	kwc_PseudoScreenThreeForeground		12
! #define	kwc_PseudoScreenThreeBackground		13
! #define	kwc_PseudoScreenFourForeground 		14
! #define	kwc_PseudoScreenFourBackground 		15
! #define	kwc_PseudoScreenFiveForeground 		16
! #define	kwc_PseudoScreenFiveBackground 		17
! #define	kwc_PseudoScreenSixForeground 		18
! #define	kwc_PseudoScreenSixBackground 		19
! #define	kwc_PseudoScreenTitleForeground		20
! #define	kwc_PseudoScreenTitleBackground		21
! #define	kwc_PseudoScreenCBForeground		22
! #define	kwc_PseudoScreenCBBackground		23
! #define	kwc_PseudoScreenCBBorderColor		24
! #define	kwc_PseudoScreenCBAForeground		25
! #define	kwc_PseudoScreenCBABackground		26
! #define	kwc_PSMapDisplayForeground		27
! #define	kwc_PSMapDisplayBackground		28
! #define	kwc_PSMapDisplayBorderColor		29
! #define	kwc_PSMapDisplayActiveForeground	30
! #define	kwc_PSMapDisplayActiveBackground	31
!   
! #define	kwp_TitleHighlight			1
! #define kwp_PseudoScreenOneBackgroundPixmap	2
! #define kwp_PseudoScreenTwoBackgroundPixmap	3
! #define kwp_PseudoScreenThreeBackgroundPixmap	4
! #define kwp_PseudoScreenFourBackgroundPixmap	5
! #define kwp_PseudoScreenFiveBackgroundPixmap	6
! #define kwp_PseudoScreenSixBackgroundPixmap	7
! #define kwp_PseudoScreenCBOnePixmap		8
! #define kwp_PseudoScreenCBTwoPixmap		9
! #define kwp_PseudoScreenCBThreePixmap		10
! #define kwp_PseudoScreenCBFourPixmap		11
! #define kwp_PseudoScreenCBFivePixmap		12
! #define kwp_PseudoScreenCBSixPixmap		13
! #define kwp_PseudoScreenCBActivePixmap		14
! #define kwp_PSMapDisplayOnePixmap		15
! #define kwp_PSMapDisplayTwoPixmap		16
! #define kwp_PSMapDisplayThreePixmap		17
! #define kwp_PSMapDisplayFourPixmap		18
! #define kwp_PSMapDisplayFivePixmap		19
! #define kwp_PSMapDisplaySixPixmap		20
! #define kwp_PSMapDisplayActivePixmap		21
  
  
  /*
***************
*** 458,463 ****
--- 565,571 ----
      { "destroy",		KILL, 0 },
      { "donticonifybyunmapping",	DONT_ICONIFY_BY_UNMAPPING, 0 },
      { "dontmoveoff",		KEYWORD, kw0_DontMoveOff },
+     { "dontpseudoscreen",	DONT_PSEUDO_SCREEN, 0 },
      { "dontsqueezetitle",	DONT_SQUEEZE_TITLE, 0 },
      { "east",			DKEYWORD, D_EAST },
      { "f",			FRAME, 0 },
***************
*** 465,470 ****
--- 573,579 ----
      { "f.backiconmgr",		FKEYWORD, F_BACKICONMGR },
      { "f.beep",			FKEYWORD, F_BEEP },
      { "f.bottomzoom",		FKEYWORD, F_BOTTOMZOOM },
+     { "f.changepseudomode",	FKEYWORD, F_CHANGE_PS_MODE },
      { "f.circledown",		FKEYWORD, F_CIRCLEDOWN },
      { "f.circleup",		FKEYWORD, F_CIRCLEUP },
      { "f.colormap",		FSKEYWORD, F_COLORMAP },
***************
*** 494,502 ****
--- 603,618 ----
      { "f.lower",		FKEYWORD, F_LOWER },
      { "f.menu",			FSKEYWORD, F_MENU },
      { "f.move",			FKEYWORD, F_MOVE },
+     { "f.movetoscreenfive",	FKEYWORD, F_MOVE_TO_SCREEN_FIVE },
+     { "f.movetoscreenfour",	FKEYWORD, F_MOVE_TO_SCREEN_FOUR },
+     { "f.movetoscreenone",	FKEYWORD, F_MOVE_TO_SCREEN_ONE },
+     { "f.movetoscreensix",	FKEYWORD, F_MOVE_TO_SCREEN_SIX },
+     { "f.movetoscreenthree",	FKEYWORD, F_MOVE_TO_SCREEN_THREE },
+     { "f.movetoscreentwo",	FKEYWORD, F_MOVE_TO_SCREEN_TWO },
      { "f.nexticonmgr",		FKEYWORD, F_NEXTICONMGR },
      { "f.nop",			FKEYWORD, F_NOP },
      { "f.previconmgr",		FKEYWORD, F_PREVICONMGR },
+     { "f.psmapdisplay",		FKEYWORD, F_PSMAPDISPLAY },
      { "f.quit",			FKEYWORD, F_QUIT },
      { "f.raise",		FKEYWORD, F_RAISE },
      { "f.raiselower",		FKEYWORD, F_RAISELOWER },
***************
*** 503,514 ****
--- 619,648 ----
      { "f.refresh",		FKEYWORD, F_REFRESH },
      { "f.resize",		FKEYWORD, F_RESIZE },
      { "f.restart",		FKEYWORD, F_RESTART },
+     { "f.restorewindowstatefive",	FKEYWORD, F_RESTOREWINDOWSTATE_FIVE },
+     { "f.restorewindowstatefour",	FKEYWORD, F_RESTOREWINDOWSTATE_FOUR },
+     { "f.restorewindowstateone",	FKEYWORD, F_RESTOREWINDOWSTATE_ONE },
+     { "f.restorewindowstatesix",	FKEYWORD, F_RESTOREWINDOWSTATE_SIX },
+     { "f.restorewindowstatethree",	FKEYWORD, F_RESTOREWINDOWSTATE_THREE },
+     { "f.restorewindowstatetwo",	FKEYWORD, F_RESTOREWINDOWSTATE_TWO },
      { "f.righticonmgr",		FKEYWORD, F_RIGHTICONMGR },
      { "f.rightzoom",		FKEYWORD, F_RIGHTZOOM },
+     { "f.savewindowstatefive",		FKEYWORD, F_SAVEWINDOWSTATE_FIVE },
+     { "f.savewindowstatefour",		FKEYWORD, F_SAVEWINDOWSTATE_FOUR },
+     { "f.savewindowstateone",		FKEYWORD, F_SAVEWINDOWSTATE_ONE },
+     { "f.savewindowstatesix",		FKEYWORD, F_SAVEWINDOWSTATE_SIX },
+     { "f.savewindowstatethree",		FKEYWORD, F_SAVEWINDOWSTATE_THREE },
+     { "f.savewindowstatetwo",		FKEYWORD, F_SAVEWINDOWSTATE_TWO },
      { "f.saveyourself",		FKEYWORD, F_SAVEYOURSELF },
      { "f.showiconmgr",		FKEYWORD, F_SHOWLIST },
      { "f.sorticonmgr",		FKEYWORD, F_SORTICONMGR },
      { "f.source",		FSKEYWORD, F_BEEP },  /* XXX - don't work */
+     { "f.switchscreenfive",	FKEYWORD, F_SWITCHSCREEN_FIVE },
+     { "f.switchscreenfour",	FKEYWORD, F_SWITCHSCREEN_FOUR },
+     { "f.switchscreenone",	FKEYWORD, F_SWITCHSCREEN_ONE },
+     { "f.switchscreensix",	FKEYWORD, F_SWITCHSCREEN_SIX },
+     { "f.switchscreenthree",	FKEYWORD, F_SWITCHSCREEN_THREE },
+     { "f.switchscreentwo",	FKEYWORD, F_SWITCHSCREEN_TWO },
      { "f.title",		FKEYWORD, F_TITLE },
      { "f.topzoom",		FKEYWORD, F_TOPZOOM },
      { "f.twmrc",		FKEYWORD, F_RESTART },
***************
*** 522,527 ****
--- 656,662 ----
      { "f.warptoiconmgr",	FSKEYWORD, F_WARPTOICONMGR },
      { "f.warptoscreen",		FSKEYWORD, F_WARPTOSCREEN },
      { "f.winrefresh",		FKEYWORD, F_WINREFRESH },
+     { "f.wrapscreen",		FKEYWORD, F_WRAPSCREEN },
      { "f.zoom",			FKEYWORD, F_ZOOM },
      { "forceicons",		KEYWORD, kw0_ForceIcons },
      { "frame",			FRAME, 0 },
***************
*** 546,551 ****
--- 681,687 ----
      { "iconmanagerhighlight",	CLKEYWORD, kwcl_IconManagerHighlight },
      { "iconmanagers",		ICONMGRS, 0 },
      { "iconmanagershow",	ICONMGR_SHOW, 0 },
+     { "iconmasks",		ICON_MASKS, 0 },
      { "iconmgr",		ICONMGR, 0 },
      { "iconregion",		ICON_REGION, 0 },
      { "icons",			ICONS, 0 },
***************
*** 577,582 ****
--- 713,721 ----
      { "nohighlight",		NO_HILITE, 0 },
      { "noiconmanagers",		KEYWORD, kw0_NoIconManagers },
      { "nomenushadows",		KEYWORD, kw0_NoMenuShadows },
+     { "nopseudoscreenbackground",	KEYWORD, kw0_NoPseudoScreenBackground },
+     { "nopseudoscreencb",	KEYWORD, kw0_NoPseudoScreenCB },
+     { "nopseudoscreentitle",	KEYWORD, kw0_NoPseudoScreenTitle },
      { "noraiseondeiconify",	KEYWORD, kw0_NoRaiseOnDeiconify },
      { "noraiseonmove",		KEYWORD, kw0_NoRaiseOnMove },
      { "noraiseonresize",	KEYWORD, kw0_NoRaiseOnResize },
***************
*** 590,595 ****
--- 729,815 ----
      { "noversion",		KEYWORD, kw0_NoVersion },
      { "opaquemove",		KEYWORD, kw0_OpaqueMove },
      { "pixmaps",		PIXMAPS, 0 },
+     { "pseudoscreencbabackground", CKEYWORD, kwc_PseudoScreenCBABackground },
+     { "pseudoscreencbactivepixmap", PKEYWORD, kwp_PseudoScreenCBActivePixmap },
+     { "pseudoscreencbaforeground", CKEYWORD, kwc_PseudoScreenCBAForeground },
+     { "pseudoscreencbbackground", CKEYWORD, kwc_PseudoScreenCBBackground },
+     { "pseudoscreencbbordercolor", CKEYWORD, kwc_PseudoScreenCBBorderColor },
+     { "pseudoscreencbfivepixmap", PKEYWORD, kwp_PseudoScreenCBFivePixmap },
+     { "pseudoscreencbfont",	SKEYWORD, kws_PSCBFontSet },
+     { "pseudoscreencbforeground", CKEYWORD, kwc_PseudoScreenCBForeground },
+     { "pseudoscreencbfourpixmap", PKEYWORD, kwp_PseudoScreenCBFourPixmap },
+     { "pseudoscreencbonepixmap", PKEYWORD, kwp_PseudoScreenCBOnePixmap },
+     { "pseudoscreencbposition",	SKEYWORD, kws_PseudoScreenCBPosition },
+     { "pseudoscreencbsixpixmap", PKEYWORD, kwp_PseudoScreenCBSixPixmap },
+     { "pseudoscreencbsize",	SKEYWORD, kws_PseudoScreenCBSize },
+     { "pseudoscreencbthreepixmap", PKEYWORD, kwp_PseudoScreenCBThreePixmap },
+     { "pseudoscreencbtwopixmap", PKEYWORD, kwp_PseudoScreenCBTwoPixmap },
+     { "pseudoscreenfivebackground",
+ 				CKEYWORD, kwc_PseudoScreenFiveBackground },
+     { "pseudoscreenfivebackgroundpixmap",
+ 				PKEYWORD, kwp_PseudoScreenFiveBackgroundPixmap },
+     { "pseudoscreenfiveforeground",
+ 				CKEYWORD, kwc_PseudoScreenFiveForeground },
+     { "pseudoscreenfivetitle",	SKEYWORD, kws_PseudoScreenFiveTitle },
+     { "pseudoscreenfourbackground",
+ 				CKEYWORD, kwc_PseudoScreenFourBackground },
+     { "pseudoscreenfourbackgroundpixmap",
+ 				PKEYWORD, kwp_PseudoScreenFourBackgroundPixmap },
+     { "pseudoscreenfourforeground",
+ 				CKEYWORD, kwc_PseudoScreenFourForeground },
+     { "pseudoscreenfourtitle",	SKEYWORD, kws_PseudoScreenFourTitle },
+     { "pseudoscreenonebackground",
+ 				CKEYWORD, kwc_PseudoScreenOneBackground },
+     { "pseudoscreenonebackgroundpixmap",
+ 				PKEYWORD, kwp_PseudoScreenOneBackgroundPixmap },
+     { "pseudoscreenoneforeground",
+ 				CKEYWORD, kwc_PseudoScreenOneForeground },
+     { "pseudoscreenonetitle",	SKEYWORD, kws_PseudoScreenOneTitle },
+     { "pseudoscreensixbackground",
+ 				CKEYWORD, kwc_PseudoScreenSixBackground },
+     { "pseudoscreensixbackgroundpixmap",
+ 				PKEYWORD, kwp_PseudoScreenSixBackgroundPixmap },
+     { "pseudoscreensixforeground",
+ 				CKEYWORD, kwc_PseudoScreenSixForeground },
+     { "pseudoscreensixtitle",	SKEYWORD, kws_PseudoScreenSixTitle },
+     { "pseudoscreenthreebackground",
+ 				CKEYWORD, kwc_PseudoScreenThreeBackground },
+     { "pseudoscreenthreebackgroundpixmap",
+ 				PKEYWORD, kwp_PseudoScreenThreeBackgroundPixmap},
+     { "pseudoscreenthreeforeground",
+ 				CKEYWORD, kwc_PseudoScreenThreeForeground },
+     { "pseudoscreenthreetitle",	SKEYWORD, kws_PseudoScreenThreeTitle },
+     { "pseudoscreentitlebackground", CKEYWORD, kwc_PseudoScreenTitleBackground },
+     { "pseudoscreentitlefont",	SKEYWORD, kws_PSTitleFontSet },
+     { "pseudoscreentitleforeground", CKEYWORD, kwc_PseudoScreenTitleForeground },
+     { "pseudoscreentitleposition", SKEYWORD, kws_PseudoScreenTitlePosition },
+     { "pseudoscreentwobackground",
+ 				CKEYWORD, kwc_PseudoScreenTwoBackground },
+     { "pseudoscreentwobackgroundpixmap",
+ 				PKEYWORD, kwp_PseudoScreenTwoBackgroundPixmap },
+     { "pseudoscreentwoforeground",
+ 				CKEYWORD, kwc_PseudoScreenTwoForeground },
+     { "pseudoscreentwotitle",	SKEYWORD, kws_PseudoScreenTwoTitle },
+     { "psmapdisplayactivebackground",
+ 				CKEYWORD, kwc_PSMapDisplayActiveBackground },
+     { "psmapdisplayactiveforeground",
+ 				CKEYWORD, kwc_PSMapDisplayActiveForeground },
+     { "psmapdisplayactivepixmap",PKEYWORD, kwp_PSMapDisplayActivePixmap },
+     { "psmapdisplaybackground",	CKEYWORD, kwc_PSMapDisplayBackground },
+     { "psmapdisplaybordercolor",CKEYWORD, kwc_PSMapDisplayBorderColor },
+     { "psmapdisplayfivepixmap",	PKEYWORD, kwp_PSMapDisplayFivePixmap },
+     { "psmapdisplayforeground",	CKEYWORD, kwc_PSMapDisplayForeground },
+     { "psmapdisplayfourpixmap",	PKEYWORD, kwp_PSMapDisplayFourPixmap },
+     { "psmapdisplayonepixmap",	PKEYWORD, kwp_PSMapDisplayOnePixmap },
+     { "psmapdisplayposition",	SKEYWORD, kws_PSMapDisplayPosition },
+     { "psmapdisplayscale",	SKEYWORD, kws_PSMapDisplayScale },
+     { "psmapdisplaysixpixmap",	PKEYWORD, kwp_PSMapDisplaySixPixmap },
+     { "psmapdisplaystate",	SKEYWORD, kws_PSMapDisplayState },
+     { "psmapdisplaythreepixmap",PKEYWORD, kwp_PSMapDisplayThreePixmap },
+     { "psmapdisplaytwopixmap",	PKEYWORD, kwp_PSMapDisplayTwoPixmap },
+     { "psmapwindowbackground",	CLKEYWORD, kwcl_PSMapWindowBackground },
+     { "psmapwindowbordercolor",CLKEYWORD, kwcl_PSMapWindowBorderColor },
+     { "psmapwindowforeground",	CLKEYWORD, kwcl_PSMapWindowForeground },
      { "r",			ROOT, 0 },
      { "randomplacement",	KEYWORD, kw0_RandomPlacement },
      { "resize",			RESIZE, 0 },
***************
*** 602,607 ****
--- 822,829 ----
      { "s",			SHIFT, 0 },
      { "savecolor",              SAVECOLOR, 0},
      { "select",			SELECT, 0 },
+     { "setpseudoscreenbackgroundproc",
+ 				SKEYWORD, kws_SetPseudoScreenBackgroundProc },
      { "shift",			SHIFT, 0 },
      { "showiconmanager",	KEYWORD, kw0_ShowIconManager },
      { "sorticonmanager",	KEYWORD, kw0_SortIconManager },
***************
*** 615,621 ****
      { "titlefont",		SKEYWORD, kws_TitleFontSet },
      { "titlefontset",		SKEYWORD, kws_TitleFontSet },
      { "titleforeground",	CLKEYWORD, kwcl_TitleForeground },
!     { "titlehighlight",		TITLE_HILITE, 0 },
      { "titlepadding",		NKEYWORD, kwn_TitlePadding },
      { "unknownicon",		SKEYWORD, kws_UnknownIcon },
      { "usepposition",		SKEYWORD, kws_UsePPosition },
--- 837,843 ----
      { "titlefont",		SKEYWORD, kws_TitleFontSet },
      { "titlefontset",		SKEYWORD, kws_TitleFontSet },
      { "titleforeground",	CLKEYWORD, kwcl_TitleForeground },
!     { "titlehighlight",		PKEYWORD, kwp_TitleHighlight },
      { "titlepadding",		NKEYWORD, kwn_TitlePadding },
      { "unknownicon",		SKEYWORD, kws_UnknownIcon },
      { "usepposition",		SKEYWORD, kws_UsePPosition },
***************
*** 766,771 ****
--- 988,1006 ----
        case kw0_WarpUnmapped:
  	Scr->WarpUnmapped = TRUE;
  	return 1;
+ 
+       case kw0_NoPseudoScreenTitle:
+ 	Scr->NoPseudoScreenTitle = TRUE;
+ 	return 1;
+ 
+       case kw0_NoPseudoScreenCB:
+ 	Scr->NoPseudoScreenCB = TRUE;
+ 	return 1;
+ 
+       case kw0_NoPseudoScreenBackground:
+ 	Scr->NoPseudoScreenBackground = TRUE;
+ 	return 1;
+ 
      }
  
      return 0;
***************
*** 834,839 ****
--- 1069,1224 ----
  	Scr->MaxWindowWidth = JunkWidth;
  	Scr->MaxWindowHeight = JunkHeight;
  	return 1;
+ 
+       case kws_PseudoScreenOneTitle:
+ 	Scr->PseudoScreenTitle[0] = s;
+ 	return 1;
+ 
+       case kws_PseudoScreenTwoTitle:
+ 	Scr->PseudoScreenTitle[1] = s;
+ 	return 1;
+ 
+       case kws_PseudoScreenThreeTitle:
+ 	Scr->PseudoScreenTitle[2] = s;
+ 	return 1;
+ 
+       case kws_PseudoScreenFourTitle:
+ 	Scr->PseudoScreenTitle[3] = s;
+ 	return 1;
+ 
+       case kws_PseudoScreenFiveTitle:
+ 	Scr->PseudoScreenTitle[4] = s;
+ 	return 1;
+ 
+       case kws_PseudoScreenSixTitle:
+ 	Scr->PseudoScreenTitle[5] = s;
+ 	return 1;
+ 
+       case kws_PSTitleFontSet:
+ 	if (!Scr->HaveFonts) Scr->PSTitleFontSet.name = s;
+ 	return 1;
+ 
+       case kws_PseudoScreenTitlePosition:
+       {
+ 	int	stat, x, y, w, h;
+ 
+ 	if(strcmp(s, "leftup") == 0)
+ 		Scr->PseudoScreenTitleWindowP = 1;
+ 	else if(strcmp(s, "rightup") == 0)
+ 		Scr->PseudoScreenTitleWindowP = 2;
+ 	else if(strcmp(s, "leftdown") == 0)
+ 		Scr->PseudoScreenTitleWindowP = 3;
+ 	else if(strcmp(s, "rightdown") == 0)
+ 		Scr->PseudoScreenTitleWindowP = 4;
+ 	else {
+ 		stat = XParseGeometry(s, &x, &y, &w, &h);
+ 		if((stat & (XValue & YValue)) != (XValue & YValue)) {
+ 			twmrc_error_prefix();
+ 			fprintf(stderr, "ignore invalid position \"%s\"\n", s);
+ 		}
+ 		else {
+ 			Scr->PseudoScreenTitleWindowX = x;
+ 			Scr->PseudoScreenTitleWindowY = y;
+ 			Scr->PseudoScreenTitleWindowP = 5;
+ 		}
+ 	}
+ 	return 1;
+       }
+ 
+       case kws_PseudoScreenCBPosition:
+       {
+ 	int	stat, x, y, w, h;
+ 
+ 	if(strcmp(s, "leftup") == 0)
+ 		Scr->ChangeButtonP = 1;
+ 	else if(strcmp(s, "rightup") == 0)
+ 		Scr->ChangeButtonP = 2;
+ 	else if(strcmp(s, "leftdown") == 0)
+ 		Scr->ChangeButtonP = 3;
+ 	else if(strcmp(s, "rightdown") == 0)
+ 		Scr->ChangeButtonP = 4;
+ 	else {
+ 		stat = XParseGeometry(s, &x, &y, &w, &h);
+ 		if((stat & (XValue & YValue)) != (XValue & YValue)) {
+ 			twmrc_error_prefix();
+ 			fprintf(stderr, "ignore invalid position \"%s\"\n", s);
+ 		}
+ 		else {
+ 			Scr->ChangeButtonX = x;
+ 			Scr->ChangeButtonY = y;
+ 			Scr->ChangeButtonP = 5;
+ 		}
+ 	}
+ 	return 1;
+       }
+ 
+       case kws_PseudoScreenCBSize:
+       {
+ 	int	stat, x, y, w, h;
+ 
+ 	stat = XParseGeometry(s, &x, &y, &w, &h);
+ 	if((stat & (WidthValue & HeightValue)) != (WidthValue & HeightValue)) {
+ 		twmrc_error_prefix();
+ 		fprintf(stderr, "ignore invalid size \"%s\"\n", s);
+ 	}
+ 	else {
+ 		Scr->ChangeButtonW = w;
+ 		Scr->ChangeButtonH = h;
+ 	}
+ 	return 1;
+       }
+ 
+       case kws_PSCBFontSet:
+ 	if (!Scr->HaveFonts) Scr->PSCBFontSet.name = s;
+ 	return 1;
+ 
+       case kws_PSMapDisplayPosition:
+ 	{
+ 		int status, x, y;
+ 		unsigned int width, height;
+ 
+ 		status = XParseGeometry(s, &x, &y, &width, &height);
+ 		if ((status & (XValue & YValue)) != (XValue & YValue)) {
+ 			twmrc_error_prefix();
+ 			fprintf (stderr,
+ 			"ignoring invalid PSMapDisplayPosition \"%s\"\n", s);
+ 		} else
+ 			Scr->PSMapDisplayPosition = s;
+ 		return 1;
+ 	}
+ 
+       case kws_PSMapDisplayScale:
+ 	{
+ 		int	scale;
+ 
+ 		scale = atoi(s);
+ 		if(scale < 2) {
+ 			twmrc_error_prefix();
+ 			fprintf (stderr,
+ 				"ignoring invalid PSMapDisplayScale \"%s\"\n",
+ 					s);
+ 		}
+ 		else
+ 			Scr->PSMapDisplayScale = scale;
+ 		return 1;
+ 	}
+ 
+       case kws_PSMapDisplayState:
+ 	if(strcmp(s, "map") == 0) /* default value. */
+ 		Scr->PSMapDisplayState = TRUE;
+ 	else if(strcmp(s, "unmap") == 0)
+ 		Scr->PSMapDisplayState = FALSE;
+ 	else {
+ 		twmrc_error_prefix();
+ 		fprintf(stderr, "ignoring invalid PSMapDisplayState \"%s\"\n",
+ 				s);
+ 	}
+ 	return 1;
+ 
+       case kws_SetPseudoScreenBackgroundProc:
+ 	Scr->SetPseudoScreenBackgroundProc = s;
+ 	return 1;
+ 
      }
  
      return 0;
***************
*** 935,940 ****
--- 1320,1338 ----
        case kwcl_IconManagerBackground:
  	GetColor (colormode, &Scr->IconManagerC.back, s);
  	return &Scr->IconManagerBL;
+ 
+       case kwcl_PSMapWindowForeground:
+ 	GetColor (colormode, &Scr->PSMapWindowCol.fore, s);
+ 	return &Scr->PSMapWindowForegroundL;
+ 
+       case kwcl_PSMapWindowBackground:
+ 	GetColor (colormode, &Scr->PSMapWindowCol.back, s);
+ 	return &Scr->PSMapWindowBackgroundL;
+ 
+       case kwcl_PSMapWindowBorderColor:
+ 	GetColor (colormode, &Scr->PSMapWindowBorderColor, s);
+ 	return &Scr->PSMapWindowBorderColorL;
+ 
      }
      return NULL;
  }
***************
*** 973,983 ****
--- 1371,1781 ----
  	GetColor (colormode, &Scr->MenuShadowColor, s);
  	return 1;
  
+       case kwc_PseudoScreenOneForeground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[0].fore, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenOneBackground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[0].back, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenTwoForeground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[1].fore, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenTwoBackground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[1].back, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenThreeForeground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[2].fore, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenThreeBackground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[2].back, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenFourForeground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[3].fore, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenFourBackground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[3].back, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenFiveForeground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[4].fore, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenFiveBackground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[4].back, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenSixForeground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[5].fore, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenSixBackground:
+ 	GetColor (colormode, &Scr->PseudoScreenC[5].back, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenTitleForeground :
+ 	GetColor (colormode, &Scr->PseudoScreenTitleC.fore, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenTitleBackground :
+ 	GetColor (colormode, &Scr->PseudoScreenTitleC.back, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenCBForeground :
+ 	GetColor (colormode, &Scr->PseudoScreenCBC.fore, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenCBBackground :
+ 	GetColor (colormode, &Scr->PseudoScreenCBC.back, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenCBBorderColor :
+ 	GetColor (colormode, &Scr->PseudoScreenCBBorderColor, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenCBAForeground :
+ 	GetColor (colormode, &Scr->PseudoScreenCBAC.fore, s);
+ 	return 1;
+ 
+       case kwc_PseudoScreenCBABackground :
+ 	GetColor (colormode, &Scr->PseudoScreenCBAC.back, s);
+ 	return 1;
+ 
+       case kwc_PSMapDisplayActiveForeground :
+ 	GetColor (colormode, &Scr->PSMapDisplayActiveC.fore, s);
+ 	return 1;
+ 
+       case kwc_PSMapDisplayActiveBackground :
+ 	GetColor (colormode, &Scr->PSMapDisplayActiveC.back, s);
+ 	return 1;
+ 
+       case kwc_PSMapDisplayForeground :
+ 	GetColor (colormode, &Scr->PSMapDisplayC.fore, s);
+ 	return 1;
+ 
+       case kwc_PSMapDisplayBackground :
+ 	GetColor (colormode, &Scr->PSMapDisplayC.back, s);
+ 	return 1;
+ 
+       case kwc_PSMapDisplayBorderColor :
+ 	GetColor (colormode, &Scr->PSMapDisplayBorderColor, s);
+ 	return 1;
+ 
      }
  
      return 0;
  }
  
+ int do_pixmap_keyword(keyword, filename)
+     int keyword;
+     char *filename;
+ {
+ Pixmap pm;
+ 
+ switch(keyword)
+     {
+ 
+  case kwp_TitleHighlight:
+     pm = GetBitmap(filename, NULL);
+ 
+     if (pm) {
+ 	if (Scr->hilitePm) {
+ 	    XFreePixmap (dpy, Scr->hilitePm);
+ 	}
+ 	Scr->hilitePm = pm;
+ 	Scr->hilite_pm_width = JunkWidth;
+ 	Scr->hilite_pm_height = JunkHeight;
+ 	Scr->hilite_pm_depth = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenOneBackgroundPixmap:
+     if(Scr->NoPseudoScreenBackground == True)
+ 	return 1;
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenPm[0])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenPm[0]);
+ 	Scr->PseudoScreenPm[0] = pm;
+ 	Scr->PseudoScreenPmWidth[0] = JunkWidth;
+ 	Scr->PseudoScreenPmHeight[0] = JunkHeight;
+ 	Scr->PseudoScreenPmDepth[0] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenTwoBackgroundPixmap:
+     if(Scr->NoPseudoScreenBackground == True)
+ 	return 1;
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenPm[1])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenPm[1]);
+ 	Scr->PseudoScreenPm[1] = pm;
+ 	Scr->PseudoScreenPmWidth[1] = JunkWidth;
+ 	Scr->PseudoScreenPmHeight[1] = JunkHeight;
+ 	Scr->PseudoScreenPmDepth[1] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenThreeBackgroundPixmap:
+     if(Scr->NoPseudoScreenBackground == True)
+ 	return 1;
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenPm[2])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenPm[2]);
+ 	Scr->PseudoScreenPm[2] = pm;
+ 	Scr->PseudoScreenPmWidth[2] = JunkWidth;
+ 	Scr->PseudoScreenPmHeight[2] = JunkHeight;
+ 	Scr->PseudoScreenPmDepth[2] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenFourBackgroundPixmap:
+     if(Scr->NoPseudoScreenBackground == True)
+ 	return 1;
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenPm[3])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenPm[3]);
+ 	Scr->PseudoScreenPm[3] = pm;
+ 	Scr->PseudoScreenPmWidth[3] = JunkWidth;
+ 	Scr->PseudoScreenPmHeight[3] = JunkHeight;
+ 	Scr->PseudoScreenPmDepth[3] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenFiveBackgroundPixmap:
+     if(Scr->NoPseudoScreenBackground == True)
+ 	return 1;
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenPm[4])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenPm[4]);
+ 	Scr->PseudoScreenPm[4] = pm;
+ 	Scr->PseudoScreenPmWidth[4] = JunkWidth;
+ 	Scr->PseudoScreenPmHeight[4] = JunkHeight;
+ 	Scr->PseudoScreenPmDepth[4] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenSixBackgroundPixmap:
+     if(Scr->NoPseudoScreenBackground == True)
+ 	return 1;
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenPm[5])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenPm[5]);
+ 	Scr->PseudoScreenPm[5] = pm;
+ 	Scr->PseudoScreenPmWidth[5] = JunkWidth;
+ 	Scr->PseudoScreenPmHeight[5] = JunkHeight;
+ 	Scr->PseudoScreenPmDepth[5] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenCBOnePixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenCBPm[0])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenCBPm[0]);
+ 	Scr->PseudoScreenCBPm[0] = pm;
+ 	if(Scr->PseudoScreenCBPmWidthM < JunkWidth)
+ 		Scr->PseudoScreenCBPmWidthM = JunkWidth;
+ 	if(Scr->PseudoScreenCBPmHeightM < JunkHeight)
+ 		Scr->PseudoScreenCBPmHeightM = JunkHeight;
+ 	Scr->PseudoScreenCBPmWidth[0] = JunkWidth;
+ 	Scr->PseudoScreenCBPmHeight[0] = JunkHeight;
+ 	Scr->PseudoScreenCBPmDepth[0] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenCBTwoPixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenCBPm[1])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenCBPm[1]);
+ 	Scr->PseudoScreenCBPm[1] = pm;
+ 	if(Scr->PseudoScreenCBPmWidthM < JunkWidth)
+ 		Scr->PseudoScreenCBPmWidthM = JunkWidth;
+ 	if(Scr->PseudoScreenCBPmHeightM < JunkHeight)
+ 		Scr->PseudoScreenCBPmHeightM = JunkHeight;
+ 	Scr->PseudoScreenCBPmWidth[1] = JunkWidth;
+ 	Scr->PseudoScreenCBPmHeight[1] = JunkHeight;
+ 	Scr->PseudoScreenCBPmDepth[1] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenCBThreePixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenCBPm[2])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenCBPm[2]);
+ 	Scr->PseudoScreenCBPm[2] = pm;
+ 	if(Scr->PseudoScreenCBPmWidthM < JunkWidth)
+ 		Scr->PseudoScreenCBPmWidthM = JunkWidth;
+ 	if(Scr->PseudoScreenCBPmHeightM < JunkHeight)
+ 		Scr->PseudoScreenCBPmHeightM = JunkHeight;
+ 	Scr->PseudoScreenCBPmWidth[2] = JunkWidth;
+ 	Scr->PseudoScreenCBPmHeight[2] = JunkHeight;
+ 	Scr->PseudoScreenCBPmDepth[2] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenCBFourPixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenCBPm[3])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenCBPm[3]);
+ 	Scr->PseudoScreenCBPm[3] = pm;
+ 	if(Scr->PseudoScreenCBPmWidthM < JunkWidth)
+ 		Scr->PseudoScreenCBPmWidthM = JunkWidth;
+ 	if(Scr->PseudoScreenCBPmHeightM < JunkHeight)
+ 		Scr->PseudoScreenCBPmHeightM = JunkHeight;
+ 	Scr->PseudoScreenCBPmWidth[3] = JunkWidth;
+ 	Scr->PseudoScreenCBPmHeight[3] = JunkHeight;
+ 	Scr->PseudoScreenCBPmDepth[3] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenCBFivePixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenCBPm[4])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenCBPm[4]);
+ 	Scr->PseudoScreenCBPm[4] = pm;
+ 	if(Scr->PseudoScreenCBPmWidthM < JunkWidth)
+ 		Scr->PseudoScreenCBPmWidthM = JunkWidth;
+ 	if(Scr->PseudoScreenCBPmHeightM < JunkHeight)
+ 		Scr->PseudoScreenCBPmHeightM = JunkHeight;
+ 	Scr->PseudoScreenCBPmWidth[4] = JunkWidth;
+ 	Scr->PseudoScreenCBPmHeight[4] = JunkHeight;
+ 	Scr->PseudoScreenCBPmDepth[4] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenCBSixPixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenCBPm[5])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenCBPm[5]);
+ 	Scr->PseudoScreenCBPm[5] = pm;
+ 	if(Scr->PseudoScreenCBPmWidthM < JunkWidth)
+ 		Scr->PseudoScreenCBPmWidthM = JunkWidth;
+ 	if(Scr->PseudoScreenCBPmHeightM < JunkHeight)
+ 		Scr->PseudoScreenCBPmHeightM = JunkHeight;
+ 	Scr->PseudoScreenCBPmWidth[5] = JunkWidth;
+ 	Scr->PseudoScreenCBPmHeight[5] = JunkHeight;
+ 	Scr->PseudoScreenCBPmDepth[5] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PseudoScreenCBActivePixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PseudoScreenCBPm[6])
+ 	    XFreePixmap(dpy, Scr->PseudoScreenCBPm[6]);
+ 	Scr->PseudoScreenCBPm[6] = pm;
+ 	Scr->PseudoScreenCBPmWidth[6] = JunkWidth;
+ 	Scr->PseudoScreenCBPmHeight[6] = JunkHeight;
+ 	Scr->PseudoScreenCBPmDepth[6] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PSMapDisplayOnePixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PSMapDisplayPm[0])
+ 	    XFreePixmap(dpy, Scr->PSMapDisplayPm[0]);
+ 	Scr->PSMapDisplayPm[0] = pm;
+ 	Scr->PSMapDisplayPmWidth[0] = JunkWidth;
+ 	Scr->PSMapDisplayPmHeight[0] = JunkHeight;
+ 	Scr->PSMapDisplayPmDepth[0] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PSMapDisplayTwoPixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PSMapDisplayPm[1])
+ 	    XFreePixmap(dpy, Scr->PSMapDisplayPm[1]);
+ 	Scr->PSMapDisplayPm[1] = pm;
+ 	Scr->PSMapDisplayPmWidth[1] = JunkWidth;
+ 	Scr->PSMapDisplayPmHeight[1] = JunkHeight;
+ 	Scr->PSMapDisplayPmDepth[1] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PSMapDisplayThreePixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PSMapDisplayPm[2])
+ 	    XFreePixmap(dpy, Scr->PSMapDisplayPm[2]);
+ 	Scr->PSMapDisplayPm[2] = pm;
+ 	Scr->PSMapDisplayPmWidth[2] = JunkWidth;
+ 	Scr->PSMapDisplayPmHeight[2] = JunkHeight;
+ 	Scr->PSMapDisplayPmDepth[2] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PSMapDisplayFourPixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PSMapDisplayPm[3])
+ 	    XFreePixmap(dpy, Scr->PSMapDisplayPm[3]);
+ 	Scr->PSMapDisplayPm[3] = pm;
+ 	Scr->PSMapDisplayPmWidth[3] = JunkWidth;
+ 	Scr->PSMapDisplayPmHeight[3] = JunkHeight;
+ 	Scr->PSMapDisplayPmDepth[3] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PSMapDisplayFivePixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PSMapDisplayPm[4])
+ 	    XFreePixmap(dpy, Scr->PSMapDisplayPm[4]);
+ 	Scr->PSMapDisplayPm[4] = pm;
+ 	Scr->PSMapDisplayPmWidth[4] = JunkWidth;
+ 	Scr->PSMapDisplayPmHeight[4] = JunkHeight;
+ 	Scr->PSMapDisplayPmDepth[4] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PSMapDisplaySixPixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PSMapDisplayPm[5])
+ 	    XFreePixmap(dpy, Scr->PSMapDisplayPm[5]);
+ 	Scr->PSMapDisplayPm[5] = pm;
+ 	Scr->PSMapDisplayPmWidth[5] = JunkWidth;
+ 	Scr->PSMapDisplayPmHeight[5] = JunkHeight;
+ 	Scr->PSMapDisplayPmDepth[5] = JunkDepth;
+     }
+     return 1;
+ 
+  case kwp_PSMapDisplayActivePixmap:
+     pm = GetBitmap(filename, NULL);
+     if(pm) {
+ 	if(Scr->PSMapDisplayPm[6])
+ 	    XFreePixmap(dpy, Scr->PSMapDisplayPm[6]);
+ 	Scr->PSMapDisplayPm[6] = pm;
+ 	Scr->PSMapDisplayPmWidth[6] = JunkWidth;
+ 	Scr->PSMapDisplayPmHeight[6] = JunkHeight;
+ 	Scr->PSMapDisplayPmDepth[6] = JunkDepth;
+     }
+     return 1;
+ 
+     }
+     return 0;
+ }
+ 
+ 
  /*
   * put_pixel_on_root() Save a pixel value in twm root window color property.
   */
***************
*** 1081,1086 ****
--- 1879,1893 ----
        break;
      case kwcl_IconManagerBackground:
        put_pixel_on_root(Scr->IconManagerC.back);
+       break;
+     case kwcl_PSMapWindowForeground:
+       put_pixel_on_root(Scr->PSMapWindowCol.fore);
+       break;
+     case kwcl_PSMapWindowBackground:
+       put_pixel_on_root(Scr->PSMapWindowCol.back);
+       break;
+     case kwcl_PSMapWindowBorderColor:
+       put_pixel_on_root(Scr->PSMapWindowBorderColor);
        break;
      }
      cp = cp->next;
*** ../twm.ORG/parse.h	Mon Aug 31 12:15:37 1992
--- parse.h	Mon Aug 31 11:21:45 1992
***************
*** 91,96 ****
--- 91,124 ----
  #define F_SHOWLIST		44
  #define F_HIDELIST		45
  
+ #define	F_WRAPSCREEN		46
+ #define	F_SWITCHSCREEN_ONE	47
+ #define	F_SWITCHSCREEN_TWO	48
+ #define	F_SWITCHSCREEN_THREE	49
+ #define	F_SWITCHSCREEN_FOUR	50
+ #define	F_SWITCHSCREEN_FIVE	51
+ #define	F_SWITCHSCREEN_SIX	52
+ #define	F_MOVE_TO_SCREEN_ONE	53
+ #define	F_MOVE_TO_SCREEN_TWO	54
+ #define	F_MOVE_TO_SCREEN_THREE	55
+ #define	F_MOVE_TO_SCREEN_FOUR	56
+ #define	F_MOVE_TO_SCREEN_FIVE	57
+ #define	F_MOVE_TO_SCREEN_SIX	58
+ #define	F_CHANGE_PS_MODE	59
+ #define	F_PSMAPDISPLAY		60
+ #define	F_SAVEWINDOWSTATE_ONE	61
+ #define	F_SAVEWINDOWSTATE_TWO	62
+ #define	F_SAVEWINDOWSTATE_THREE	63
+ #define	F_SAVEWINDOWSTATE_FOUR	64
+ #define	F_SAVEWINDOWSTATE_FIVE	65
+ #define	F_SAVEWINDOWSTATE_SIX	66
+ #define	F_RESTOREWINDOWSTATE_ONE	67
+ #define	F_RESTOREWINDOWSTATE_TWO	68
+ #define	F_RESTOREWINDOWSTATE_THREE	69
+ #define	F_RESTOREWINDOWSTATE_FOUR	70
+ #define	F_RESTOREWINDOWSTATE_FIVE	71
+ #define	F_RESTOREWINDOWSTATE_SIX	72
+ 
  #define F_MENU			101	/* string */
  #define F_WARPTO		102	/* string */
  #define F_WARPTOICONMGR		103	/* string */
*** ../twm.ORG/resize.c	Mon Aug 31 12:15:37 1992
--- resize.c	Mon Aug 31 11:21:48 1992
***************
*** 584,590 ****
      }
  
      if (!Scr->NoRaiseResize)
!         XRaiseWindow(dpy, tmp_win->frame);
  
      UninstallRootColormap();
  
--- 584,590 ----
      }
  
      if (!Scr->NoRaiseResize)
! 	RaiseFrame(tmp_win);
  
      UninstallRootColormap();
  
***************
*** 793,803 ****
   ***********************************************************************
   */
  
  void SetupWindow (tmp_win, x, y, w, h, bw)
      TwmWindow *tmp_win;
      int x, y, w, h, bw;
  {
!     SetupFrame (tmp_win, x, y, w, h, bw, False);
  }
  
  void SetupFrame (tmp_win, x, y, w, h, bw, sendEvent)
--- 793,817 ----
   ***********************************************************************
   */
  
+ extern void ResizePSMapWindow();
+ 
  void SetupWindow (tmp_win, x, y, w, h, bw)
      TwmWindow *tmp_win;
      int x, y, w, h, bw;
  {
! 	int	scale;
! 
! 	if(tmp_win->psmapDisplay) {
! 		scale = Scr->MyDisplayWidth/((w - 6)/3);
! 		w = (Scr->MyDisplayWidth/scale + 2) * 3;
! 		h = (Scr->MyDisplayHeight/scale + 2) * 2 +
! 				tmp_win->title_height;
! 		if(scale != Scr->PSMapDisplayScale) {
! 			Scr->PSMapDisplayScale = scale;
! 			ResizePSMapWindow();
! 		}
! 	}
! 	SetupFrame(tmp_win, x, y, w, h, bw, False);
  }
  
  void SetupFrame (tmp_win, x, y, w, h, bw, sendEvent)
***************
*** 899,904 ****
--- 913,930 ----
      frame_mask |= (CWX | CWY | CWWidth | CWHeight);
      XConfigureWindow (dpy, tmp_win->frame, frame_mask, &frame_wc);
  
+     if(tmp_win->psmapWindow) {
+         int width, height;
+         width = tmp_win->frame_width / Scr->PSMapDisplayScale;
+         height = tmp_win->frame_height / Scr->PSMapDisplayScale;
+         if(width == 0)	width = 1;
+         if(height == 0) height = 1;
+         XMoveResizeWindow(dpy, tmp_win->psmapWindow,
+             tmp_win->frame_x / Scr->PSMapDisplayScale,
+             tmp_win->frame_y / Scr->PSMapDisplayScale,
+             width, height);
+     }
+ 
      /*
       * fix up highlight window
       */
***************
*** 1045,1051 ****
        }
  
      if (!Scr->NoRaiseResize)
!         XRaiseWindow(dpy, tmp_win->frame);
  
      ConstrainSize(tmp_win, &dragWidth, &dragHeight);
  
--- 1071,1077 ----
        }
  
      if (!Scr->NoRaiseResize)
! 	RaiseFrame(tmp_win);
  
      ConstrainSize(tmp_win, &dragWidth, &dragHeight);
  
*** ../twm.ORG/screen.h	Mon Aug 31 12:15:37 1992
--- screen.h	Mon Aug 31 11:21:49 1992
***************
*** 77,89 ****
      Window InfoWindow;		/* the information window */
  
      name_list *Icons;		/* list of icon pixmaps */
      TitlebarPixmaps tbpm;	/* titlebar pixmaps */
      Pixmap UnknownPm;		/* the unknown icon pixmap */
      Pixmap siconifyPm;		/* the icon manager iconify pixmap */
      Pixmap pullPm;		/* pull right menu icon */
!     int	pullW, pullH;		/* size of pull right menu icon */
      Pixmap hilitePm;		/* focus highlight window background */
!     int hilite_pm_width, hilite_pm_height;  /* cache the size */
  
      MenuRoot *MenuList;		/* head of the menu list */
      MenuRoot *LastMenu;		/* the last menu (mostly unused?) */
--- 77,92 ----
      Window InfoWindow;		/* the information window */
  
      name_list *Icons;		/* list of icon pixmaps */
+     name_list *IconMasks;	/* list of icon mask bitmaps */
      TitlebarPixmaps tbpm;	/* titlebar pixmaps */
      Pixmap UnknownPm;		/* the unknown icon pixmap */
      Pixmap siconifyPm;		/* the icon manager iconify pixmap */
      Pixmap pullPm;		/* pull right menu icon */
!     int	pullW, pullH, pullDepth;/* size of pull right menu icon */
      Pixmap hilitePm;		/* focus highlight window background */
!     int hilite_pm_width;	/* cache the size */
!     int hilite_pm_height;
!     int hilite_pm_depth;
  
      MenuRoot *MenuList;		/* head of the menu list */
      MenuRoot *LastMenu;		/* the last menu (mostly unused?) */
***************
*** 162,167 ****
--- 165,171 ----
      name_list *MakeTitle;	/* list of window names with title bar */
      name_list *AutoRaise;	/* list of window names to auto-raise */
      name_list *IconNames;	/* list of window names and icon names */
+     name_list *IconMaskNames;	/* list of window names and icon mask names */
      name_list *NoHighlight;	/* list of windows to not highlight */
      name_list *NoStackModeL;	/* windows to ignore stack mode requests */
      name_list *NoTitleHighlight;/* list of windows to not highlight the TB*/
***************
*** 199,204 ****
--- 203,209 ----
      int IconBorderWidth;	/* border width of icon windows */
      int UnknownWidth;		/* width of the unknown icon */
      int UnknownHeight;		/* height of the unknown icon */
+     int UnknownDepth;		/* depth of the unknown icon */
      int TitleHeight;		/* height of the title bar window */
      TwmWindow *Focus;		/* the twm window that has focus */
      int EntryHeight;		/* menu entry height */
***************
*** 246,251 ****
--- 251,339 ----
      short WarpUnmapped;		/* allow warping to unmapped windows */
  
      FuncKey FuncKeyRoot;
+ 
+     int PseudoCurScreen;	/* current screen number of pseudo screens */
+ 
+     Pixmap PseudoScreenPm[6];	/* pseudo screen root window's pixmaps */
+     int	PseudoScreenPmWidth[6];
+     int	PseudoScreenPmHeight[6];
+     int	PseudoScreenPmDepth[6];
+ 
+     Window PseudoScreenTitleWindow;	/* the pseudo screen display window */
+     int PseudoScreenTitleWindowP;
+     int PseudoScreenTitleWindowX;
+     int PseudoScreenTitleWindowY;
+     int PseudoScreenTitleWindowW;
+     int PseudoScreenTitleWindowH;
+     char *PseudoScreenTitle[6];
+ 
+     Window PseudoScreenCBWindow[6]; /* pseudo screen change button window */
+     int ChangeButtonP;
+     int ChangeButtonX;
+     int ChangeButtonY;
+     int ChangeButtonW;
+     int ChangeButtonH;
+     Pixmap PseudoScreenCBPm[7];	 /* pseudo screen change button pixmaps */
+     int	PseudoScreenCBPmWidthM;	/* include active pixmap.. */
+     int	PseudoScreenCBPmHeightM;
+     int	PseudoScreenCBPmWidth[7];
+     int	PseudoScreenCBPmHeight[7];
+     int	PseudoScreenCBPmDepth[7];
+ 
+     ColorPair PseudoScreenC[6];		/* pseudo screen colors */
+     ColorPair PseudoScreenTitleC;	/* pseudo screen name title color */
+     ColorPair PseudoScreenCBC;		/* pseudo screen change button color */
+     Pixel PseudoScreenCBBorderColor;/* pseudo screen change button bordercolor */
+     ColorPair PseudoScreenCBAC;		/* pseudo screen change button(active)
+ 								color */
+     GC PseudoScreenTitleGC;	/* GC to draw pseudo screen title */
+     GC PseudoScreenCBGC;	/* GC to draw pseudo screen change button */
+     GC ShapeGC;				/* GC to do shape*/
+ 
+     MyFontSet PSTitleFontSet;	/* pseudo screen title font structure */
+     MyFontSet PSCBFontSet;	/*pseudo screen change button font structure*/
+ 
+     Cursor ChangeButtonCursor;	/* pseudo screen change button cursor */
+ 
+     short NoPseudoScreenTitle;	/* pseudo screen title display ? */
+     short NoPseudoScreenCB;	/* pseudo screen change button display ? */
+     short NoPseudoScreenBackground; /* pseudo screen background pixmap ? */
+ 
+     Window PSMapWindow;
+     int PSMapWindowW;
+     int PSMapWindowH;
+     char *PSMapDisplayPosition;
+     Window PSMapWindowC[7];	/* include multi common window.. */
+     int PSMapWindowCW;
+     int PSMapWindowCH;
+     Pixmap PSMapDisplayPm[7];	/* include active pixmap.. */
+     int PSMapDisplayPmWidth[7];
+     int PSMapDisplayPmHeight[7];
+     int PSMapDisplayPmDepth[7];
+     short PSMapDisplayScale;
+     short PSMapDisplayState;
+ 
+     ColorPair PSMapDisplayC;
+     Pixel PSMapDisplayBorderColor;
+     ColorPair PSMapDisplayActiveC;
+     ColorPair PSMapWindowCol;
+     Pixel PSMapWindowBorderColor;
+ 
+     GC PSMapGC;
+ 
+     name_list *DontPseudoScreen;
+     name_list *PSMapWindowForegroundL;
+     name_list *PSMapWindowBackgroundL;
+     name_list *PSMapWindowBorderColorL;
+ 
+     struct __save {
+ 	int	pointerX;
+ 	int	pointerY;
+ 	int	pseudoCurScreen;
+     } save[6];
+ 
+     char *SetPseudoScreenBackgroundProc;
+ 
  } ScreenInfo;
  
  extern int MultiScreen;
*** ../twm.ORG/strutil.c	Mon Aug 31 12:15:37 1992
--- strutil.c	Mon Aug 31 11:21:49 1992
***************
*** 1,4 ****
! /* $Id: strutil.c,v 1.3 1991/11/11 08:49:51 proj Exp $ */
  
  /*
   * string utility file for Internationalized window manager       
--- 1,4 ----
! /* $Id: strutil.c,v 1.2 1991/10/28 06:42:13 takashi Exp $ */
  
  /*
   * string utility file for Internationalized window manager       
***************
*** 28,39 ****
      
      wc_len = mb_len = strlen(mb_str);
      wc_str = (wchar_t *)malloc((wc_len + 1) * sizeof(wchar_t));
!     if (_XConvertMBToWC(NULL, (unsigned char *)mb_str, mb_len,
! 			(wchar *)wc_str, &wc_len, &scanned_bytes,
! 			(_State *)NULL) < 0) {
! 	free((char *)wc_str);
! 	return(NULL);
!     }
      wc_str[wc_len] = WNULL;
      return (wc_str);
  }
--- 28,35 ----
      
      wc_len = mb_len = strlen(mb_str);
      wc_str = (wchar_t *)malloc((wc_len + 1) * sizeof(wchar_t));
!     _XConvertMBToWC(NULL, (unsigned char *)mb_str, mb_len,
! 		    (wchar *)wc_str, &wc_len, &scanned_bytes, (_State *)NULL);
      wc_str[wc_len] = WNULL;
      return (wc_str);
  }
***************
*** 49,59 ****
      wc_len = wcslen(wc_str);
      mb_len = wc_len * 6 + 1;
      mb_str = (char *)malloc(mb_len * sizeof(char));
!     if (_XConvertWCToMB(NULL, (wchar *)wc_str, wc_len,
! 			(unsigned char *)mb_str, &mb_len, &scanned_len) < 0) {
! 	free(mb_str);
! 	return(NULL);
!     }
      mb_str[mb_len] = '\0';
      return (mb_str);
  }
--- 45,52 ----
      wc_len = wcslen(wc_str);
      mb_len = wc_len * 6 + 1;
      mb_str = (char *)malloc(mb_len * sizeof(char));
!     _XConvertWCToMB(NULL, (wchar *)wc_str, wc_len,
! 		    (unsigned char *)mb_str, &mb_len, &scanned_len);
      mb_str[mb_len] = '\0';
      return (mb_str);
  }
***************
*** 69,79 ****
      wc_len = wcslen(wc_str);
      ct_bytes = wc_len * 6 + 1;
      ct_str = (char *)malloc(ct_bytes * sizeof(char));
!     if (_XConvertWCToCT(NULL, (wchar *)wc_str, wc_len,
! 			(unsigned char *)ct_str, &ct_bytes, &scanned_len) < 0) {
! 	free(ct_str);
! 	return(NULL);
!     }
      ct_str[ct_bytes] = '\0';
      return (ct_str);
  }
--- 62,69 ----
      wc_len = wcslen(wc_str);
      ct_bytes = wc_len * 6 + 1;
      ct_str = (char *)malloc(ct_bytes * sizeof(char));
!     _XConvertWCToCT(NULL, (wchar *)wc_str, wc_len,
! 		    (unsigned char *)ct_str, &ct_bytes, &scanned_len);
      ct_str[ct_bytes] = '\0';
      return (ct_str);
  }
*** ../twm.ORG/twm.c	Mon Aug 31 12:15:37 1992
--- twm.c	Mon Aug 31 11:21:53 1992
***************
*** 1,4 ****
! /* $Id: twm.c,v 1.3 1992/03/06 14:48:14 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
--- 1,4 ----
! /* $Id: twm.c,v 1.2 1991/10/28 06:42:59 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
***************
*** 82,87 ****
--- 82,88 ----
  Cursor LeftButt;
  
  XContext TwmContext;		/* context for twm windows */
+ XContext PSMapContext;		/* context for psmap windows */
  XContext MenuContext;		/* context for all menu windows */
  XContext IconManagerContext;	/* context for all window list windows */
  XContext ScreenContext;		/* context to get screen data */
***************
*** 210,215 ****
--- 211,217 ----
  
      HasShape = XShapeQueryExtension (dpy, &ShapeEventBase, &ShapeErrorBase);
      TwmContext = XUniqueContext();
+     PSMapContext = XUniqueContext();
      MenuContext = XUniqueContext();
      IconManagerContext = XUniqueContext();
      ScreenContext = XUniqueContext();
***************
*** 297,302 ****
--- 299,305 ----
  	Scr->MakeTitle = NULL;
  	Scr->AutoRaise = NULL;
  	Scr->IconNames = NULL;
+ 	Scr->IconMaskNames = NULL;
  	Scr->NoHighlight = NULL;
  	Scr->NoStackModeL = NULL;
  	Scr->NoTitleHighlight = NULL;
***************
*** 315,320 ****
--- 318,325 ----
  	/* remember to put an initialization in InitVariables also
  	 */
  
+ 	Scr->PseudoCurScreen= 0;
+ 
  	Scr->screen = scrnum;
  	Scr->d_depth = DefaultDepth(dpy, scrnum);
  	Scr->d_visual = DefaultVisual(dpy, scrnum);
***************
*** 403,409 ****
--- 408,442 ----
  	Scr->tbpm.question = None;
  	Scr->tbpm.menu = None;
  	Scr->tbpm.delete = None;
+ 	for(i = 0; i < 6; ++i) {
+ 		static char	*title[] = {
+ 				"Screen Number 1", "Screen Number 2" ,
+ 				"Screen Number 3", "Screen Number 4" ,
+ 				"Screen Number 5", "Screen Number 6" 
+ 			};
+ 		Scr->PseudoScreenPm[i] = None;
+ 		Scr->PseudoScreenPmWidth[i] = 0;
+ 		Scr->PseudoScreenPmHeight[i] = 0;
+ 		Scr->PseudoScreenPmDepth[i] = 0;
+ 		Scr->PseudoScreenTitle[i] = title[i];
+ 	}
  
+ 	for(i = 0; i < 7; ++i) {
+ 		Scr->PseudoScreenCBPm[i] = None;
+ 		Scr->PseudoScreenCBPmWidth[i] = 0;
+ 		Scr->PseudoScreenCBPmHeight[i] = 0;
+ 		Scr->PseudoScreenCBPmDepth[i] = 0;
+ 		Scr->PSMapDisplayPm[i] = None;
+ 		Scr->PSMapDisplayPmWidth[i] = 0;
+ 		Scr->PSMapDisplayPmHeight[i] = 0;
+ 		Scr->PSMapDisplayPmDepth[i] = 0;
+ 	}
+ 	Scr->PseudoScreenCBPmWidthM = 0;
+ 	Scr->PseudoScreenCBPmHeightM = 0;
+ 
+ 	for(i = 0; i < 6; ++i)
+ 		Scr->save[i].pseudoCurScreen = -1;
+ 
  	InitVariables();
  	InitMenus();
  
***************
*** 415,420 ****
--- 448,457 ----
  	CreateGCs();
  	MakeMenus();
  
+ 	if(Scr->PseudoScreenC[Scr->PseudoCurScreen].back != black ||
+ 			Scr->PseudoScreenPm[Scr->PseudoCurScreen] != None)
+ 		SetupPseudoRootWindow(Scr->PseudoCurScreen);
+ 
  	Scr->TitleBarFontSet.y += Scr->FramePadding;
  	Scr->TitleHeight = Scr->TitleBarFontSet.height + Scr->FramePadding * 2;
  	/* make title height be odd so buttons look nice and centered */
***************
*** 425,430 ****
--- 462,469 ----
  	XGrabServer(dpy);
  	XSync(dpy, 0);
  
+ 	CreatePSMapDisplay();
+ 
  	JunkX = 0;
  	JunkY = 0;
  
***************
*** 433,438 ****
--- 472,483 ----
  	if (!Scr->NoIconManagers)
  	    Scr->iconmgr.twm_win->icon = TRUE;
  
+ 	if(!Scr->NoPseudoScreenTitle)
+ 		CreatePseudoScreenTitle();
+ 
+ 	if(!Scr->NoPseudoScreenCB)
+ 		CreatePseudoScreenCB();
+ 
  	/*
  	 * weed out icon windows
  	 */
***************
*** 462,468 ****
  	    if (children[i] && MappedNotOverride(children[i]))
  	    {
  		XUnmapWindow(dpy, children[i]);
! 		SimulateMapRequest(children[i]);
  	    }
  	}
  
--- 507,513 ----
  	    if (children[i] && MappedNotOverride(children[i]))
  	    {
  		XUnmapWindow(dpy, children[i]);
! 		SimulateMapRequest(children[i], FALSE);
  	    }
  	}
  
***************
*** 472,483 ****
  	    if (Scr->iconmgr.count)
  	    {
  		SetMapStateProp (Scr->iconmgr.twm_win, NormalState);
! 		XMapWindow(dpy, Scr->iconmgr.w);
! 		XMapWindow(dpy, Scr->iconmgr.twm_win->frame);
  	    }
  	}
  
! 	
  	attributes.border_pixel = Scr->DefaultC.fore;
  	attributes.background_pixel = Scr->DefaultC.back;
  	attributes.event_mask = (ExposureMask | ButtonPressMask |
--- 517,537 ----
  	    if (Scr->iconmgr.count)
  	    {
  		SetMapStateProp (Scr->iconmgr.twm_win, NormalState);
! 		MapFrame(Scr->iconmgr.twm_win);
  	    }
  	}
  
!         if(Scr->PSMapDisplayState == TRUE)
! 		MapPSMapDisplay();
! 
!         if(Scr->SetPseudoScreenBackgroundProc != NULL) {
! 		if(!Scr->NoGrabServer) {
! 			XUngrabServer(dpy);
! 			XSync(dpy, 0);
! 		}
! 		Execute(Scr->SetPseudoScreenBackgroundProc);
! 	}
! 
  	attributes.border_pixel = Scr->DefaultC.fore;
  	attributes.background_pixel = Scr->DefaultC.back;
  	attributes.event_mask = (ExposureMask | ButtonPressMask |
***************
*** 511,516 ****
--- 565,571 ----
  
  	FirstScreen = FALSE;
      	Scr->FirstTime = FALSE;
+ 
      } /* for */
  
      if (numManaged == 0) {
***************
*** 536,541 ****
--- 591,598 ----
  
  InitVariables()
  {
+     register int i;
+ 
      FreeList(&Scr->BorderColorL);
      FreeList(&Scr->IconBorderColorL);
      FreeList(&Scr->BorderTileForegroundL);
***************
*** 551,556 ****
--- 608,614 ----
      FreeList(&Scr->MakeTitle);
      FreeList(&Scr->AutoRaise);
      FreeList(&Scr->IconNames);
+     FreeList(&Scr->IconMaskNames);
      FreeList(&Scr->NoHighlight);
      FreeList(&Scr->NoStackModeL);
      FreeList(&Scr->NoTitleHighlight);
***************
*** 564,569 ****
--- 622,628 ----
      FreeList(&Scr->DontSqueezeTitleL);
      FreeList(&Scr->WindowRingL);
      FreeList(&Scr->WarpCursorL);
+     FreeList(&Scr->DontPseudoScreen);
  
      NewFontCursor(&Scr->FrameCursor, "top_left_arrow");
      NewFontCursor(&Scr->TitleCursor, "top_left_arrow");
***************
*** 576,581 ****
--- 635,641 ----
      NewFontCursor(&Scr->WaitCursor, "watch");
      NewFontCursor(&Scr->SelectCursor, "dot");
      NewFontCursor(&Scr->DestroyCursor, "pirate");
+     NewFontCursor(&Scr->ChangeButtonCursor, "hand2");
  
      Scr->Ring = NULL;
      Scr->RingLeader = NULL;
***************
*** 599,604 ****
--- 659,699 ----
      Scr->IconManagerC.back = white;
      Scr->IconManagerHighlight = black;
  
+     for(i = 0; i < 6; ++i) {
+ 	Scr->PseudoScreenC[i].fore = -1;
+ 	Scr->PseudoScreenC[i].back = white;
+     }
+     Scr->PseudoScreenTitleC.fore = black;
+     Scr->PseudoScreenTitleC.back = white;
+ 
+     Scr->PseudoScreenCBC.fore = black;
+     Scr->PseudoScreenCBC.back = white;
+     Scr->PseudoScreenCBBorderColor = black;
+     Scr->PseudoScreenCBAC.fore = black;
+     Scr->PseudoScreenCBAC.back = white;
+ 
+     Scr->PSMapDisplayC.fore = black;
+     Scr->PSMapDisplayC.back = white;
+     Scr->PSMapDisplayBorderColor = black;
+ 
+     Scr->PSMapDisplayActiveC.fore = white;
+     Scr->PSMapDisplayActiveC.back = black;
+ 
+     Scr->PSMapWindowCol.fore = black;
+     Scr->PSMapWindowCol.back = white;
+     Scr->PSMapWindowBorderColor = black;
+ 
+     Scr->PseudoScreenTitleWindowX = Scr->PseudoScreenTitleWindowY = -1;
+     Scr->PseudoScreenTitleWindowW = Scr->PseudoScreenTitleWindowH =
+ 		    Scr->PseudoScreenTitleWindowP = 0;
+     Scr->ChangeButtonX = Scr->ChangeButtonY = -1;
+     Scr->ChangeButtonW = 150;
+     Scr->ChangeButtonH = 20;
+     Scr->ChangeButtonP = 0;
+     Scr->NoPseudoScreenTitle = FALSE;
+     Scr->NoPseudoScreenCB = FALSE;
+     Scr->NoPseudoScreenBackground = FALSE;
+ 
      Scr->FramePadding = 2;		/* values that look "nice" on */
      Scr->TitlePadding = 8;		/* 75 and 100dpi displays */
      Scr->ButtonIndent = 1;
***************
*** 672,688 ****
      Scr->DefaultFontSet.font = NULL;
      Scr->DefaultFontSet.name = DEFAULT_FAST_FONT;
  
  }
  
  
  CreateFonts ()
  {
!     GetFontSet(&Scr->TitleBarFontSet);
!     GetFontSet(&Scr->MenuFontSet);
!     GetFontSet(&Scr->IconFontSet);
!     GetFontSet(&Scr->SizeFontSet);
!     GetFontSet(&Scr->IconManagerFontSet);
      GetFont(&Scr->DefaultFontSet);
      Scr->HaveFonts = TRUE;
  }
  
--- 767,796 ----
      Scr->DefaultFontSet.font = NULL;
      Scr->DefaultFontSet.name = DEFAULT_FAST_FONT;
  
+     Scr->PSTitleFontSet.fontset = NULL;
+     Scr->PSTitleFontSet.font = NULL;
+     Scr->PSTitleFontSet.name = DEFAULT_NICE_FONT;
+     Scr->PSCBFontSet.fontset = NULL;
+     Scr->PSCBFontSet.font = NULL;
+     Scr->PSCBFontSet.name = DEFAULT_NICE_FONT;
+ 
+     Scr->PSMapDisplayScale = 15;	/* 1/15 scale.. */
+     Scr->PSMapDisplayState = TRUE;	/* mapped psmap display */
+     Scr->PSMapDisplayPosition = "-0-0";
+     Scr->SetPseudoScreenBackgroundProc = NULL;
  }
  
  
  CreateFonts ()
  {
!     GetFont(&Scr->TitleBarFontSet);
!     GetFont(&Scr->MenuFontSet);
!     GetFont(&Scr->IconFontSet);
!     GetFont(&Scr->SizeFontSet);
!     GetFont(&Scr->IconManagerFontSet);
      GetFont(&Scr->DefaultFontSet);
+     GetFont(&Scr->PSTitleFontSet);
+     GetFont(&Scr->PSCBFontSet);
      Scr->HaveFonts = TRUE;
  }
  
***************
*** 784,789 ****
--- 892,901 ----
  SIGNAL_T Done()
  {
      Reborder (CurrentTime);
+     if(Scr->NoPseudoScreenBackground != True)
+ 	XSetWindowBackgroundPixmap(dpy, Scr->Root, (Pixmap)None);
+     XClearWindow(dpy, Scr->Root);
+     XDeleteProperty(dpy, Scr->Root, _PSTWM_SCREEN_NUM);
      XCloseDisplay(dpy);
      exit(0);
      SIGNAL_RETURN;
***************
*** 826,831 ****
--- 938,944 ----
      return 0;
  }
  
+ Atom _PSTWM_SCREEN_NUM;
  Atom _XA_MIT_PRIORITY_COLORS;
  Atom _XA_WM_CHANGE_STATE;
  Atom _XA_WM_STATE;
***************
*** 837,842 ****
--- 950,960 ----
  
  InternUsefulAtoms ()
  {
+     /* 
+      * Create priority pseudoscreen number if necessary.
+      */
+     _PSTWM_SCREEN_NUM = XInternAtom(dpy, PSTWM_SCREEN_NUM, False);   
+ 
      /* 
       * Create priority colors if necessary.
       */
*** ../twm.ORG/twm.h	Mon Aug 31 12:15:38 1992
--- twm.h	Mon Aug 31 11:21:53 1992
***************
*** 40,56 ****
--- 40,63 ----
  #ifndef _TWM_
  #define _TWM_
  
+ #if	!defined(XPM) || !defined(XPM_h)
  #include <X11/Xlib.h>
+ #endif
  #include <X11/Xutil.h>
  #include <X11/cursorfont.h>
  #include <X11/extensions/shape.h>
  #include <X11/Xfuncs.h>
  
+ #include "pstwm.h"
+ extern Atom _PSTWM_SCREEN_NUM;
+ 
  #ifndef WithdrawnState
  #define WithdrawnState 0
  #endif
  
+ #ifndef _XtIntrinsic_h
  typedef unsigned long Pixel;
+ #endif
  #define PIXEL_ALREADY_TYPEDEFED		/* for Xmu/Drawing.h */
  
  #ifdef SIGNALRETURNSINT
***************
*** 143,148 ****
--- 150,156 ----
      Pixmap bitmap;			/* image to display in button */
      int srcx, srcy;			/* from where to start copying */
      unsigned int width, height;		/* size of pixmap */
+     int depth;				/* depth of pixmap */
      int dstx, dsty;			/* to where to start copying */
      int func;				/* function to execute */
      char *action;			/* optional action arg */
***************
*** 212,217 ****
--- 220,245 ----
      Window title_w;		/* the title bar window */
      Window hilite_w;		/* the hilite window */
      Pixmap gray;
+ 
+     int PseudoScreen;		/* display pseudo screen number */
+     short psmapped;		/* is the window mapped for puseudo screen ? */
+     short psmapDisplay;		/* this is an PSMap displayer window */
+     Window psmapWindow;		/* the small window in PSMap Display. */
+     Window psmapIcon;		/* the small icon in PSMap Display. */
+     ColorPair psmap;
+     Pixel psmap_border;
+     struct _save {
+ 	int frameX;		/* saved x position of frame */
+ 	int frameY;		/* saved y position of frame */
+ 	int frameWidth;		/* saved width of frame */
+ 	int frameHeight;	/* saved height of frame */
+ 	int iconX;		/* saved x position of icon */
+ 	int iconY;		/* saved y position of icon */
+ 	int icon;		/* saved state of icon */
+ 	int pseudoScreen;	/* saved display pseudo screen number */
+     } save[6];
+     short propTrap;		/* _PSTWM_SCREEN_NUM propery trap flag */
+ 
      Window icon_w;		/* the icon window */
      Window icon_bm_w;		/* the icon bitmap window */
      int frame_x;		/* x position of frame */
***************
*** 320,325 ****
--- 348,354 ----
  extern XClassHint NoClass;
  
  extern XContext TwmContext;
+ extern XContext PSMapContext;
  extern XContext MenuContext;
  extern XContext IconManagerContext;
  extern XContext ScreenContext;
*** ../twm.ORG/util.c	Mon Aug 31 12:15:38 1992
--- util.c	Mon Aug 31 11:21:54 1992
***************
*** 1,4 ****
! /* $Id: util.c,v 1.6 1992/03/17 02:09:41 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
--- 1,4 ----
! /* $Id: util.c,v 1.2 1991/10/28 06:38:09 takashi Exp $ */
  
  /*****************************************************************************/
  /**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
***************
*** 38,45 ****
   *
   ***********************************************************************/
  
  #include "twm.h"
- #include <X11/wchar.h>
  #include "util.h"
  #include "gram.h"
  #include "screen.h"
--- 38,48 ----
   *
   ***********************************************************************/
  
+ /*#include <X11/wchar.h>*/
+ #ifdef	XPM
+ #include <X11/xpm.h>
+ #endif
  #include "twm.h"
  #include "util.h"
  #include "gram.h"
  #include "screen.h"
***************
*** 46,54 ****
--- 49,59 ----
  #include <X11/Xos.h>
  #include <X11/Xatom.h>
  #include <stdio.h>
+ #include <sys/stat.h>
  #include <X11/Xmu/Drawing.h>
  #include <X11/Xmu/CharSet.h>
  
+ extern Pixmap ReadTiffToPixmap();
  static Pixmap CreateXLogoPixmap(), CreateResizePixmap();
  static Pixmap CreateQuestionPixmap(), CreateMenuPixmap();
  static Pixmap CreateDotPixmap();
***************
*** 289,298 ****
  GetUnknownIcon(name)
  char *name;
  {
!     if ((Scr->UnknownPm = GetBitmap(name)) != None)
!     {
  	XGetGeometry(dpy, Scr->UnknownPm, &JunkRoot, &JunkX, &JunkY,
! 	    (unsigned int *)&Scr->UnknownWidth, (unsigned int *)&Scr->UnknownHeight, &JunkBW, &JunkDepth);
      }
  }
  
--- 294,308 ----
  GetUnknownIcon(name)
  char *name;
  {
!     Pixmap	unknownMaskBm = None;
!     if ((Scr->UnknownPm = GetBitmap(name, &unknownMaskBm)) != None) {
  	XGetGeometry(dpy, Scr->UnknownPm, &JunkRoot, &JunkX, &JunkY,
! 			(unsigned int *)&Scr->UnknownWidth,
! 			(unsigned int *)&Scr->UnknownHeight,
! 			&JunkBW, (unsigned int *)&Scr->UnknownDepth);
! 	if(unknownMaskBm != None)
! 		AddToList(&Scr->IconMasks, "__UnknownIconMask__",
! 				(char *)unknownMaskBm);
      }
  }
  
***************
*** 312,320 ****
   ***********************************************************************
   */
  
! Pixmap FindBitmap (name, widthp, heightp)
!     char *name;
!     unsigned int *widthp, *heightp;
  {
      char *bigname;
      Pixmap pm;
--- 322,331 ----
   ***********************************************************************
   */
  
! Pixmap FindBitmap(name, mask_bm, widthp, heightp, depthp)
! char		*name;
! Pixmap		*mask_bm;
! unsigned int	*widthp, *heightp, *depthp;
  {
      char *bigname;
      Pixmap pm;
***************
*** 343,349 ****
  	
  	for (i = 0; i < (sizeof pmtab)/(sizeof pmtab[0]); i++) {
  	    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);
--- 354,360 ----
  	
  	for (i = 0; i < (sizeof pmtab)/(sizeof pmtab[0]); i++) {
  	    if (XmuCompareISOLatin1 (pmtab[i].name, name) == 0)
! 	      return (*pmtab[i].proc) (widthp, heightp, depthp);
  	}
  	fprintf (stderr, "%s:  no such built-in bitmap \"%s\"\n",
  		 ProgramName, name);
***************
*** 358,368 ****
--- 369,397 ----
      bigname = ExpandFilename (name);
      if (!bigname) return None;
  
+     *depthp = 1;
      /*
       * look along bitmapFilePath resource same as toolkit clients
       */
      pm = XmuLocateBitmapFile (ScreenOfDisplay(dpy, Scr->screen), bigname, NULL,
  			      0, (int *)widthp, (int *)heightp, &HotX, &HotY);
+ #ifdef	COLOR_ICON
+ #ifdef	XPM
+     if(pm == None) {
+ 	*depthp = Scr->d_depth;
+ 	pm = XmyLocatePixmapFile(ScreenOfDisplay(dpy, Scr->screen), bigname,
+ 			NULL, 0, (int *)widthp, (int *)heightp, &HotX, &HotY,
+ 			mask_bm);
+     }
+ #endif
+ #ifdef	XTIFF
+     if(pm == None) {
+ 	*depthp = 1;
+ 	pm = ReadTiffToPixmap(bigname, widthp, heightp, depthp);
+     }
+ #endif
+ #endif
+ 
      if (pm == None && Scr->IconDirectory && bigname[0] != '/') {
  	if (bigname != name) free (bigname);
  	/*
***************
*** 377,400 ****
  	    return None;
  	}
  	(void) sprintf (bigname, "%s/%s", Scr->IconDirectory, name);
! 	if (XReadBitmapFile (dpy, Scr->Root, bigname, widthp, heightp, &pm,
  			     &HotX, &HotY) != BitmapSuccess) {
! 	    pm = None;
  	}
      }
      if (bigname != name) free (bigname);
      if (pm == None) {
  	fprintf (stderr, "%s:  unable to find bitmap \"%s\"\n", 
  		 ProgramName, name);
      }
  
      return pm;
  }
  
! Pixmap GetBitmap (name)
!     char *name;
  {
!     return FindBitmap (name, &JunkWidth, &JunkHeight);
  }
  
  
--- 406,494 ----
  	    return None;
  	}
  	(void) sprintf (bigname, "%s/%s", Scr->IconDirectory, name);
! 
! 	*depthp = 1;
! 	if(XReadBitmapFile (dpy, Scr->Root, bigname, widthp, heightp, &pm,
  			     &HotX, &HotY) != BitmapSuccess) {
! #ifdef	COLOR_ICON
! #ifdef	XPM
! 		XpmAttributes attrbs;
! 		attrbs.visual = Scr->d_visual;
! 		attrbs.colormap = Scr->TwmRoot.cmaps.cwins[0]->colormap->c;
! 		attrbs.depth = Scr->d_depth;
! 		attrbs.colorsymbols = (ColorSymbol *)NULL;
! 		attrbs.numsymbols = 0;
! 		attrbs.valuemask = XpmVisual | XpmColormap | XpmDepth;
! 		if(XpmReadFileToPixmap(dpy, Scr->Root, bigname, 
! 				&pm, mask_bm, &attrbs) != XpmPixmapSuccess) {
! #endif
! #ifdef	XTIFF
! 			if((pm = ReadTiffToPixmap(bigname, widthp,
! 						heightp, depthp)) == None) {
! #endif
! 				pm = None;
! 			}
! #if	defined(XPM) && defined(XTIFF)
! 		}
! #endif
! #endif
  	}
      }
+ 
      if (bigname != name) free (bigname);
      if (pm == None) {
  	fprintf (stderr, "%s:  unable to find bitmap \"%s\"\n", 
  		 ProgramName, name);
      }
+     else {
+ 	int	largef = 0;
+ 	Pixmap	pm2;
+ 	GC	gc;
  
+ 	if(*widthp > Scr->MyDisplayWidth) {
+ 	    *widthp = Scr->MyDisplayWidth;
+ 	    largef = 1;
+ 	}
+ 	if(*heightp > Scr->MyDisplayHeight) {
+ 	    *heightp = Scr->MyDisplayHeight;
+ 	    largef = 1;
+ 	}
+ 	if(largef) {
+ 	    pm2 = XCreatePixmap(dpy, Scr->Root, *widthp, *heightp, *depthp);
+ 	    if(pm2 == None) {
+ 		fprintf (stderr, "%s:  unable to create bitmap \"%s\"\n", 
+ 			ProgramName, name);
+ 		return pm;
+ 	    }
+ 	    gc = XCreateGC(dpy, pm2, 0, 0);
+ 	    if(gc == None) {
+ 		fprintf (stderr, "%s: unable to create GC for bitmap \"%s\"\n", 
+ 			ProgramName, name);
+ 		XFreePixmap(dpy, pm2);
+ 		return pm;
+ 	    }
+ 	    XSetForeground(dpy, gc, Scr->Black);
+ 	    XSetBackground(dpy, gc, Scr->White);
+ 	    XSetGraphicsExposures(dpy, gc, False);
+ 	    if(*depthp > 1)
+ 		    XCopyArea(dpy, pm, pm2, gc, 0, 0, *widthp, *heightp, 0, 0);
+ 	    else
+ 		    XCopyPlane(dpy, pm, pm2, gc, 0, 0, *widthp, *heightp,
+ 				0, 0, 1);
+ 	    XFreePixmap(dpy, pm);
+ 	    XFreeGC(dpy, gc);
+ 	    pm = pm2;
+ 	}
+     }
+ 
      return pm;
  }
  
! Pixmap GetBitmap(name, mask_bm)
! char	*name;
! Pixmap	*mask_bm;
  {
!     return(FindBitmap(name, mask_bm, &JunkWidth, &JunkHeight, &JunkDepth));
  }
  
  
***************
*** 560,619 ****
      *what = color.pixel;
  }
  
! GetFontSet(font)
  MyFontSet *font;
  {
-     char	**missing_charset_list, *def_string;
-     int		missing_charset_count;
-     char	**dummy;
-     XFontStruct **fs_list;
-     char 	*deffontname = "fixed";
-     int		namecnt;
- 
      if (font->font != NULL)
  	XFreeFont(dpy, font->font);
  
!     namecnt = strlen(ProgramName);
!     if ((font->fontset = XCreateFontSet(dpy, font->name,
!                         &missing_charset_list, &missing_charset_count,
! 			&def_string)) == NULL) {
! 	if (Scr->DefaultFontSet.name) {
! 	    deffontname = Scr->DefaultFontSet.name;
! 	}
! 	fprintf(stderr, 
! 		"%s :\n  unable to create fontset \"%s\".\n  And %s retry to create fontset using \"%s\".\n",
! 		ProgramName, font->name, ProgramName, deffontname);
! 	if ((font->fontset = XCreateFontSet(dpy, deffontname,
! 					    &missing_charset_list,
! 					    &missing_charset_count,
! 					    &def_string)) == NULL) {
! 	    fprintf (stderr, "%s: unable to create fontset \"%s\".\n",
! 		     ProgramName, deffontname);
  	    exit(1);
  	}
- 	if (missing_charset_count) {
- 	    XFreeStringList(missing_charset_list);
- 	}
-     } else {
- 	if (missing_charset_count) {
- 	    int i;
- 	    fprintf(stderr,
- 		    "%s :\n  The following charset%sn\'t found in a list\n  of the base font names \"%s\".\n",
- 		    ProgramName, missing_charset_count == 1 ? " is" : "s are",
- 		    font->name);
- 	    for (i = 0; i < missing_charset_count; i++) {
- 		fprintf(stderr, "\t\"%s\"\n", missing_charset_list[i]);
- 	    }
- 	    XFreeStringList(missing_charset_list);
- 	}
      }
!     XFontsOfFontSet(font->fontset, &fs_list, &dummy);
!     font->font = fs_list[0];
      font->height = font->font->ascent + font->font->descent;
      font->y = font->font->ascent;
  }
  
! GetFont(font)
  MyFontSet *font;
  {
      char	**missing_charset_list, *def_string;
--- 654,686 ----
      *what = color.pixel;
  }
  
! GetFont(font)
  MyFontSet *font;
  {
      if (font->font != NULL)
  	XFreeFont(dpy, font->font);
  
!     GetFontSet(font);
!     if (font->font == NULL) {
! 	fprintf (stderr, "%s:  unable to open font list \"%s\"\n",
! 		 ProgramName, font->name);
! 	if (Scr->DefaultFontSet.name)
! 	    font->name = Scr->DefaultFontSet.name;
! 	else
! 	    font->name = "fixed";
! 	GetFontSet(font);
! 	if (font->font == NULL) {
! 	    fprintf (stderr, "%s:  unable to open font list \"%s\"\n",
! 		     ProgramName, font->name);
  	    exit(1);
  	}
      }
! 
      font->height = font->font->ascent + font->font->descent;
      font->y = font->font->ascent;
  }
  
! GetFontSet(font)
  MyFontSet *font;
  {
      char	**missing_charset_list, *def_string;
***************
*** 621,645 ****
      char	**dummy;
      XFontStruct **fs_list;
  
!     if (font->font != NULL)
! 	XFreeFont(dpy, font->font);
! 
!     if ((font->fontset = XCreateFontSet(dpy, font->name,
                          &missing_charset_list, &missing_charset_count,
! 			&def_string)) == NULL) {
! 	fprintf (stderr, "%s:  unable to create fontset \"%s\"\n",
! 		 ProgramName, font->name);
! 	exit(1);
!     }
!     if (missing_charset_count) {
  	XFreeStringList(missing_charset_list);
      }
      XFontsOfFontSet(font->fontset, &fs_list, &dummy);
      font->font = fs_list[0];
-     font->height = font->font->ascent + font->font->descent;
-     font->y = font->font->ascent;
  }
  
  /*
   * SetFocus - separate routine to set focus to make things more understandable
   * and easier to debug
--- 688,710 ----
      char	**dummy;
      XFontStruct **fs_list;
  
!     font->fontset = XCreateFontSet(dpy, font->name,
                          &missing_charset_list, &missing_charset_count,
! 			&def_string);
!     if(missing_charset_count) {
! 	int i;
! 	for (i = 0; i < missing_charset_count; i++) {
! 	    fprintf(stderr,
! 		    "%s : unable to open font \"%s\".... \n",
! 		    ProgramName, missing_charset_list[i]);
! 	}
  	XFreeStringList(missing_charset_list);
      }
      XFontsOfFontSet(font->fontset, &fs_list, &dummy);
      font->font = fs_list[0];
  }
  
+ 
  /*
   * SetFocus - separate routine to set focus to make things more understandable
   * and easier to debug
***************
*** 729,741 ****
  #endif /* NOPUTENV */
  
  
! static Pixmap CreateXLogoPixmap (widthp, heightp)
!     unsigned int *widthp, *heightp;
  {
      int h = Scr->TBInfo.width - Scr->TBInfo.border * 2;
      if (h < 0) h = 0;
  
      *widthp = *heightp = (unsigned int) h;
      if (Scr->tbpm.xlogo == None) {
  	GC gc, gcBack;
  
--- 794,807 ----
  #endif /* NOPUTENV */
  
  
! static Pixmap CreateXLogoPixmap (widthp, heightp, depthp)
!     unsigned int *widthp, *heightp, *depthp;
  {
      int h = Scr->TBInfo.width - Scr->TBInfo.border * 2;
      if (h < 0) h = 0;
  
      *widthp = *heightp = (unsigned int) h;
+     *depthp = 1;
      if (Scr->tbpm.xlogo == None) {
  	GC gc, gcBack;
  
***************
*** 764,776 ****
  }
  
  
! static Pixmap CreateResizePixmap (widthp, heightp)
!     unsigned int *widthp, *heightp;
  {
      int h = Scr->TBInfo.width - Scr->TBInfo.border * 2;
      if (h < 1) h = 1;
  
      *widthp = *heightp = (unsigned int) h;
      if (Scr->tbpm.resize == None) {
  	XPoint	points[3];
  	GC gc;
--- 830,843 ----
  }
  
  
! static Pixmap CreateResizePixmap (widthp, heightp, depthp)
!     unsigned int *widthp, *heightp, *depthp;
  {
      int h = Scr->TBInfo.width - Scr->TBInfo.border * 2;
      if (h < 1) h = 1;
  
      *widthp = *heightp = (unsigned int) h;
+     *depthp = 1;
      if (Scr->tbpm.resize == None) {
  	XPoint	points[3];
  	GC gc;
***************
*** 819,826 ****
  }
  
  
! static Pixmap CreateDotPixmap (widthp, heightp)
!     unsigned int *widthp, *heightp;
  {
      int h = Scr->TBInfo.width - Scr->TBInfo.border * 2;
  
--- 886,893 ----
  }
  
  
! static Pixmap CreateDotPixmap (widthp, heightp, depthp)
!     unsigned int *widthp, *heightp, *depthp;
  {
      int h = Scr->TBInfo.width - Scr->TBInfo.border * 2;
  
***************
*** 829,834 ****
--- 896,902 ----
      if (!(h & 1))
  	h--;
      *widthp = *heightp = (unsigned int) h;
+     *depthp = 1;
      if (Scr->tbpm.delete == None) {
  	GC  gc;
  	Pixmap pix;
***************
*** 850,860 ****
  static char questionmark_bits[] = {
     0x38, 0x7c, 0x64, 0x30, 0x18, 0x00, 0x18, 0x18};
  
! static Pixmap CreateQuestionPixmap (widthp, heightp)
!     unsigned int *widthp, *heightp;
  {
      *widthp = questionmark_width;
      *heightp = questionmark_height;
      if (Scr->tbpm.question == None) {
  	Scr->tbpm.question = XCreateBitmapFromData (dpy, Scr->Root,
  						    questionmark_bits,
--- 918,929 ----
  static char questionmark_bits[] = {
     0x38, 0x7c, 0x64, 0x30, 0x18, 0x00, 0x18, 0x18};
  
! static Pixmap CreateQuestionPixmap (widthp, heightp, depthp)
!     unsigned int *widthp, *heightp, *depthp;
  {
      *widthp = questionmark_width;
      *heightp = questionmark_height;
+     *depthp = 1;
      if (Scr->tbpm.question == None) {
  	Scr->tbpm.question = XCreateBitmapFromData (dpy, Scr->Root,
  						    questionmark_bits,
***************
*** 868,882 ****
  }
  
  
! static Pixmap CreateMenuPixmap (widthp, heightp)
!     int *widthp, *heightp;
  {
!     CreateMenuIcon (Scr->TBInfo.width - Scr->TBInfo.border * 2,widthp,heightp);
  }
  
! Pixmap CreateMenuIcon (height, widthp, heightp)
      int	height;
!     int	*widthp, *heightp;
  {
      int h, w;
      int ih, iw;
--- 937,952 ----
  }
  
  
! static Pixmap CreateMenuPixmap (widthp, heightp, depthp)
!     int *widthp, *heightp, *depthp;
  {
!     CreateMenuIcon (Scr->TBInfo.width - Scr->TBInfo.border * 2,
! 		widthp, heightp, depthp);
  }
  
! Pixmap CreateMenuIcon (height, widthp, heightp, depthp)
      int	height;
!     int	*widthp, *heightp, *depthp;
  {
      int h, w;
      int ih, iw;
***************
*** 897,902 ****
--- 967,973 ----
  	w = 1;
      *widthp = w;
      *heightp = h;
+     *depthp = 1;
      if (Scr->tbpm.menu == None) {
  	Pixmap  pix;
  	GC	gc;
*** ../twm.ORG/version.c	Mon Aug 31 12:15:38 1992
--- version.c	Mon Aug 31 11:21:54 1992
***************
*** 26,29 ****
--- 26,30 ----
  /*****************************************************************************/
  
  char *Version = "MIT X Consortium, R5";
+ char *Version2 = "Pstwm Version 2.%d";
  
*** ../twm.ORG/version.h	Mon Aug 31 12:15:38 1992
--- version.h	Mon Aug 31 11:21:54 1992
***************
*** 39,43 ****
--- 39,44 ----
  #define _VERSION_
  
  extern char *Version;
+ extern char *Version2;
  
  #endif /* _VERSION_ */
*** /dev/null	Mon Aug 31 10:12:24 1992
--- LocPixmap.c	Mon Aug 31 11:21:40 1992
***************
*** 0 ****
--- 1,223 ----
+ /*
+  * A little change for pstwm by susumu mukawa(mukawa@ctec.tn-sec.ntt.jp).
+  * at 18 Nov 1991
+  */
+ /* * Last edited: Sep 17 14:39 1991 (mallet) */
+ /*
+  * $Id: LocPixmap.c,v 1.3 1991/09/18 18:28:27 mallet Exp $
+  *
+  * Copyright 1991 Lionel Mallet
+  *
+  * Permission to use, copy, modify, and distribute this software and its
+  * documentation for any purpose and without fee is hereby granted, provided
+  * that the above copyright notice appear in all copies and that both that
+  * copyright notice and this permission notice appear in supporting
+  * documentation, and that the name of Lionel MALLET not be used in advertising
+  * or publicity pertaining to distribution of the software without specific,
+  * written prior permission.  Lionel MALLET makes no representations about the
+  * suitability of this software for any purpose.  It is provided "as is"
+  * without express or implied warranty.
+  *
+  * Lionel MALLET DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+  * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+  * FITNESS, IN NO EVENT SHALL Lionel MALLET BE LIABLE FOR ANY SPECIAL,
+  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+  * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+  *
+  * Author:  Lionel Mallet - SIMULOG
+  */
+ 
+ #ifdef	XPM
+ 
+ #include <X11/xpm.h>
+ #include "twm.h"
+ #include "util.h"
+ #include "gram.h"
+ #include "screen.h"
+ #include <X11/Xmu/CvtCache.h>
+ #include <X11/Xmu/Drawing.h>
+ #include <sys/param.h>			/* get MAXPATHLEN if possible */
+ #ifndef MAXPATHLEN
+ #define MAXPATHLEN 256
+ #endif
+ 
+ 
+ /*
+  * XmyLocatePixmapFile - read a pixmap file using the normal defaults
+  */
+ 
+ Pixmap	XmyLocatePixmapFile (screen, name, srcname, srcnamelen,
+ 			    widthp, heightp, hotxp, hotyp, mask_bm)
+ Screen	*screen;
+ char	*name;
+ char	*srcname;		/* RETURN */
+ int	srcnamelen;
+ int	*widthp, *heightp;	/* RETURN */
+ int	*hotxp, *hotyp;		/* RETURN */
+ Pixmap	*mask_bm;		/* RETURN */
+ {
+     Display *dpy = DisplayOfScreen (screen);
+     Bool try_plain_name = True;
+     XmuCvtCache *cache = _XmuCCLookupDisplay (dpy);
+     char **file_paths;
+     char filename[MAXPATHLEN];
+     int i;
+     static char **split_path_string();
+ 
+ 
+     /*
+      * look in cache for pixmap path
+      */
+     if (cache) {
+ 	if (!cache->string_to_bitmap.bitmapFilePath) {
+ 	    XrmName xrm_name[2];
+ 	    XrmClass xrm_class[2];
+ 	    XrmRepresentation rep_type;
+ 	    XrmValue value;
+ 
+ 	    xrm_name[0] = XrmPermStringToQuark("bitmapFilePath");
+ 	    xrm_name[1] = NULLQUARK;
+ 	    xrm_class[0] = XrmPermStringToQuark("BitmapFilePath");
+ 	    xrm_class[1] = NULLQUARK;
+ 	    if (!XrmGetDatabase(dpy)) {
+ 		/* what a hack; need to initialize it. */
+ 		(void) XGetDefault (dpy, "", "");
+ 	    }
+ 	    if (XrmQGetResource (dpy->db, xrm_name, xrm_class, 
+ 				 &rep_type, &value) &&
+ 		rep_type == XrmPermStringToQuark("String")) {
+ 		cache->string_to_bitmap.bitmapFilePath = 
+ 		  split_path_string (value.addr);
+ 	    }
+ 	}
+ 	file_paths = cache->string_to_bitmap.bitmapFilePath;
+     }
+ 
+ 
+     /*
+      * Search order:
+      *    1.  name if it begins with / or ./
+      *    2.  "each prefix in file_paths"/name
+      *    3.  BITMAPDIR/name
+      *    4.  name if didn't begin with / or .
+      */
+ 
+ #ifndef BITMAPDIR
+ #define BITMAPDIR "/usr/include/X11/bitmaps"
+ #endif
+ 
+     for (i = 1; i <= 4; i++) {
+ 	char *fn = filename;
+ 	Pixmap pixmap;
+ 	XpmAttributes attributes;
+ 
+ 	switch (i) {
+ 	  case 1:
+ 	    if (!(name[0] == '/' || (name[0] == '.') && name[1] == '/')) 
+ 	      continue;
+ 	    fn = name;
+ 	    try_plain_name = False;
+ 	    break;
+ 	  case 2:
+ 	    if (file_paths && *file_paths) {
+ 		sprintf (filename, "%s/%s", *file_paths, name);
+ 		file_paths++;
+ 		i--;
+ 		break;
+ 	    }
+ 	    continue;
+ 	  case 3:
+ 	    sprintf (filename, "%s/%s", BITMAPDIR, name);
+ 	    break;
+ 	  case 4:
+ 	    if (!try_plain_name) continue;
+ 	    fn = name;
+ 	    break;
+ 	}
+ 
+ 	attributes.visual = Scr->d_visual;
+ 	attributes.colormap = Scr->TwmRoot.cmaps.cwins[0]->colormap->c;
+ 	attributes.depth = Scr->d_depth;
+ 	attributes.colorsymbols = (ColorSymbol *)NULL;
+ 	attributes.numsymbols = 0;
+ 	attributes.valuemask = XpmVisual | XpmColormap | XpmDepth;
+ 
+ 	if(XpmReadFileToPixmap(dpy, RootWindowOfScreen (screen), fn, 
+ 				&pixmap, mask_bm, &attributes)
+ 				== XpmPixmapSuccess) {
+ 	    if (widthp) *widthp = (int)attributes.width;
+ 	    if (heightp) *heightp = (int)attributes.height;
+ 	    if(attributes.valuemask & XpmHotspot) {
+ 		if(hotxp) *hotxp = (int)attributes.x_hotspot;
+ 		if(hotyp) *hotyp = (int)attributes.y_hotspot;
+ 	    }
+ 	    if (srcname && srcnamelen > 0) {
+ 		strncpy (srcname, fn, srcnamelen - 1);
+ 		srcname[srcnamelen - 1] = '\0';
+ 	    XpmFreeAttributes(&attributes);
+ 	    }
+ 	    return pixmap;
+ 	}
+     }
+ 
+     return None;
+ }
+ 
+ 
+ /*
+  * split_path_string - split a colon-separated list into its constituent
+  * parts; to release, free list[0] and list.
+  */
+ static char **split_path_string (src)
+     register char *src;
+ {
+     int nelems = 1;
+     register char *dst;
+     char **elemlist, **elem;
+ 
+     /* count the number of elements */
+     for (dst = src; *dst; dst++) if (*dst == ':') nelems++;
+ 
+     /* get memory for everything */
+     dst = (char *) malloc (dst - src + 1);
+     if (!dst) return NULL;
+     elemlist = (char **) calloc ((nelems + 1), sizeof (char *));
+     if (!elemlist) {
+ 	free (dst);
+ 	return NULL;
+     }
+ 
+     /* copy to new list and walk up nulling colons and setting list pointers */
+     strcpy (dst, src);
+     for (elem = elemlist, src = dst; *src; src++) {
+ 	if (*src == ':') {
+ 	    *elem++ = dst;
+ 	    *src = '\0';
+ 	    dst = src + 1;
+ 	}
+     }
+     *elem = dst;
+ 
+     return elemlist;
+ }
+ 
+ /*
+ void _XmuStringToBitmapInitCache (c)
+     register XmuCvtCache *c;
+ {
+     c->string_to_bitmap.bitmapFilePath = NULL;
+ }
+ 
+ void _XmuStringToBitmapFreeCache (c)
+     register XmuCvtCache *c;
+ {
+     if (c->string_to_bitmap.bitmapFilePath) {
+ 	if (c->string_to_bitmap.bitmapFilePath[0]) 
+ 	  free (c->string_to_bitmap.bitmapFilePath[0]);
+ 	free ((char *) (c->string_to_bitmap.bitmapFilePath));
+     }
+ }
+ */
+ #endif	/* XPM */
*** /dev/null	Mon Aug 31 10:12:24 1992
--- patchlevel.h	Mon Aug 31 11:21:45 1992
***************
*** 0 ****
--- 1 ----
+ #define PATCHLEVEL 1
*** /dev/null	Mon Aug 31 10:12:24 1992
--- pscont.c	Mon Aug 31 11:21:46 1992
***************
*** 0 ****
--- 1,233 ----
+ /*
+  *	pscont.c : pstwm current screen controll SAMPLE program.
+  *	by mukawa@ctec.tn-sec.ntt.jp
+  *	at 28 Aug 1992
+  */
+ #include	<stdio.h>
+ #include	<X11/IntrinsicP.h>
+ #include	<X11/StringDefs.h>
+ #include	<X11/Xatom.h>
+ 
+ #include	<X11/Shell.h>
+ #include	<X11/Xaw/Form.h>
+ #include	<X11/Xaw/Label.h>
+ #include	<X11/Xaw/Command.h>
+ 
+ #include	"pstwm.h"
+ 
+ XtAppContext	appCon;
+ Widget		appShell;
+ Widget		pmode;
+ XtIntervalId	timer;
+ Display		*dpy;
+ Window		rootWin;
+ Window		acWin;
+ 
+ GetPseudoScreenNumProp(w)
+ Window	w;
+ {                                                        
+ 	int		scrNum;
+ 	Atom		_PSTWM_SCREEN_NUM;
+ 	Atom		retAtom;
+ 	int		retFormat;
+ 	unsigned long	retLen, retAfter;
+ 	unsigned long	*retProp;
+ 
+         _PSTWM_SCREEN_NUM = XInternAtom(dpy, PSTWM_SCREEN_NUM, False);
+ 	XGetWindowProperty(dpy, w, _PSTWM_SCREEN_NUM, 0, 8192,
+ 			False, XA_INTEGER, &retAtom, &retFormat, &retLen,
+ 			&retAfter,(unsigned char **)&retProp);
+ 
+ 	if(retAtom == None || retProp == NULL)
+ 		return(-2);
+ 
+ 	scrNum = (int)*retProp;
+ 	XFree(retProp);
+ 	return(scrNum);
+ }
+ 
+ SetPseudoScreenNumProp(w, snum)
+ Window	w;
+ unsigned long	snum;
+ {
+ 	Atom	_PSTWM_SCREEN_NUM;
+ 
+         _PSTWM_SCREEN_NUM = XInternAtom(dpy, PSTWM_SCREEN_NUM, False);
+ 	XChangeProperty(dpy, w, _PSTWM_SCREEN_NUM,
+ 			XA_INTEGER, 32, PropModeReplace,
+ 			(unsigned char *)&snum, 1);
+ }
+ 
+ static void	ChgScrn(w, closure, callData)
+ Widget		w;
+ XtPointer	closure, callData;
+ {
+ 	int	sn = (int)closure;
+ 	static int	state = 0;
+ 
+ 	SetPseudoScreenNumProp(acWin, sn);
+ 	if(acWin != rootWin && sn == -1) {
+ 		if(state == 0) {
+ 			XtVaSetValues(pmode,
+ 				XtNlabel, "mode=each",
+ 				NULL);
+ 			state = 1;
+ 		}
+ 		else {
+ 			XtVaSetValues(pmode,
+ 				XtNlabel, "mode=all",
+ 				NULL);
+ 			state = 0;
+ 		}
+ 	}
+ }
+ 
+ XtTimerCallbackProc	AutoChangePSWin(w, clientData, callData)
+ Widget			w;
+ XtPointer		clientData, callData;
+ {
+ 	static int	psn = 0, sn = 5;
+ 
+ 	SetPseudoScreenNumProp(acWin, psn);
+ 	if(++psn > 5)
+ 		psn = 0;
+ 	timer = XtAppAddTimeOut(appCon, (unsigned long)(1 * 1000),
+ 			AutoChangePSWin, (XtPointer)0);
+ }
+ 
+ static void	StartAutoChange(w, closure, callData)
+ Widget		w;
+ XtPointer	closure, callData;
+ {
+ 	static int	state = 0;
+ 
+ 	if(state) {
+ 		XtRemoveTimeOut(timer);
+ 		XtVaSetValues(w,
+ 			XtNlabel, "auto change",
+ 			NULL);
+ 		state = 0;
+ 	}
+ 	else {
+ 		AutoChangePSWin();
+ 		XtVaSetValues(w,
+ 			XtNlabel, "changing !!",
+ 			NULL);
+ 		state = 1;
+ 	}
+ }
+ 
+ static void	AutoChangeMode(w, closure, callData)
+ Widget		w;
+ XtPointer	closure, callData;
+ {
+ 	if(acWin == rootWin) {
+ 		acWin = XtWindow(appShell);
+ 		XtVaSetValues(w,
+ 			XtNlabel, "this window",
+ 			NULL);
+ 	}
+ 	else {
+ 		acWin = rootWin;
+ 		XtVaSetValues(w,
+ 			XtNlabel, "root window",
+ 			NULL);
+ 	}
+ }
+ 
+ main(ac, av)
+ int	ac;
+ char	**av;
+ {
+ 	int	scrNum;
+ 	Widget	outer, atc, rorw, sw1, sw2, sw3, sw4, sw5, sw6;
+ 
+ 	XtToolkitInitialize ();
+ 	appCon = XtCreateApplicationContext();
+ 
+ 	dpy = XtOpenDisplay(appCon, NULL, av[0], "Pscont", NULL, 0, &ac, av);
+ 	if(!dpy) {
+ 		XtWarning ("%s: can't open display, exiting...", *av);
+ 		exit(-1);
+ 	}
+ 
+ 	rootWin = acWin = XDefaultRootWindow(dpy);
+ 
+ 	appShell = XtAppCreateShell(av[0], "Pscont",
+ 			applicationShellWidgetClass, dpy, NULL, 0);
+ 
+ 	if(ac != 1) {
+ 		XtDestroyApplicationContext(appCon);
+ 		exit(-1);
+ 	}
+ 
+ 	outer = XtVaCreateManagedWidget("outer", formWidgetClass, appShell,
+ 			NULL);
+ 	atc = XtVaCreateManagedWidget("atc", commandWidgetClass, outer,
+ 			XtNlabel, "auto change",
+ 			XtNtop, XawChainTop,
+ 			XtNleft, XawChainLeft,
+ 			NULL);
+ 	XtAddCallback(atc, XtNcallback, StartAutoChange, (XtPointer)0);
+ 
+ 	rorw = XtVaCreateManagedWidget("rorw", commandWidgetClass, outer,
+ 			XtNlabel, "root window",
+ 			XtNtop, XawChainTop,
+ 			XtNfromHoriz, atc,
+ 			XtNright, XawChainRight,
+ 			NULL);
+ 	XtAddCallback(rorw, XtNcallback, AutoChangeMode, (XtPointer)0);
+ 
+ 	pmode = XtVaCreateManagedWidget("pmode", commandWidgetClass, outer,
+ 			XtNlabel, "mode=all",
+ 			XtNleft, XawChainLeft,
+ 			XtNright, XawChainRight,
+ 			XtNfromVert, atc,
+ 			NULL);
+ 	XtAddCallback(pmode, XtNcallback, ChgScrn, (XtPointer)-1);
+ 
+ 	sw1 = XtVaCreateManagedWidget("sw1", commandWidgetClass, outer,
+ 			XtNlabel, "screen 1",
+ 			XtNleft, XawChainLeft,
+ 			XtNfromVert, pmode,
+ 			NULL);
+ 	XtAddCallback(sw1, XtNcallback, ChgScrn, (XtPointer)0);
+ 
+ 	sw2 = XtVaCreateManagedWidget("sw2", commandWidgetClass, outer,
+ 			XtNlabel, "screen 2",
+ 			XtNfromHoriz, sw1,
+ 			XtNfromVert, pmode,
+ 			NULL);
+ 	XtAddCallback(sw2, XtNcallback, ChgScrn, (XtPointer)1);
+ 	sw3 = XtVaCreateManagedWidget("sw3", commandWidgetClass, outer,
+ 			XtNlabel, "screen 3",
+ 			XtNfromHoriz, sw2,
+ 			XtNfromVert, pmode,
+ 			NULL);
+ 	XtAddCallback(sw3, XtNcallback, ChgScrn, (XtPointer)2);
+ 	sw4 = XtVaCreateManagedWidget("sw4", commandWidgetClass, outer,
+ 			XtNlabel, "screen 4",
+ 			XtNleft, XawChainLeft,
+ 			XtNfromVert, sw1,
+ 			NULL);
+ 	XtAddCallback(sw4, XtNcallback, ChgScrn, (XtPointer)3);
+ 	sw5 = XtVaCreateManagedWidget("sw5", commandWidgetClass, outer,
+ 			XtNlabel, "screen 5",
+ 			XtNfromHoriz, sw4,
+ 			XtNfromVert, sw2,
+ 			NULL);
+ 	XtAddCallback(sw5, XtNcallback, ChgScrn, (XtPointer)4);
+ 	sw6 = XtVaCreateManagedWidget("sw6", commandWidgetClass, outer,
+ 			XtNlabel, "screen 6",
+ 			XtNfromHoriz, sw5,
+ 			XtNfromVert, sw3,
+ 			XtNright, XawChainRight,
+ 			NULL);
+ 	XtAddCallback(sw6, XtNcallback, ChgScrn, (XtPointer)5);
+ 
+ 	XtRealizeWidget(appShell);
+ 
+ 	SetPseudoScreenNumProp(XtWindow(appShell), -1);
+ 
+ 	XtAppMainLoop(appCon);
+ }
*** /dev/null	Mon Aug 31 10:12:24 1992
--- pseudoscreen.c	Mon Aug 31 11:21:46 1992
***************
*** 0 ****
--- 1,975 ----
+ /*
+  *	pseudoscreen.c : Pseudo Screen routines for pstwm
+  *	mukawa@ctec.tn-sec.ntt.jp
+  *	10 Aug 1992
+  */
+ 
+ #include <stdio.h>
+ #include "twm.h"
+ #include "util.h"
+ #include "parse.h"
+ #include "screen.h"
+ #include "resize.h"
+ #include "add_window.h"
+ #include <X11/Xos.h>
+ #include <X11/Xatom.h>
+ #include <X11/Xmu/CharSet.h>
+ 
+ GetPseudoScreenNumProp(w)
+ Window	w;
+ {                                                        
+ 	int		i;
+ 	Atom		retAtom;
+ 	int		retFormat;
+ 	unsigned long	retLen, retAfter;
+ 	unsigned long	*retProp, scrNum;
+ 
+ 	XGetWindowProperty(dpy, w, _PSTWM_SCREEN_NUM, 0, 8192,
+ 			False, XA_INTEGER, &retAtom, &retFormat, &retLen,
+ 			&retAfter,(unsigned char **)&retProp);
+ 
+ 	if(retAtom == None || retProp == NULL)
+ 		return(-2);
+ 
+ 	scrNum = *retProp;
+ 	XFree(retProp);
+ 	return(scrNum);
+ }
+ 
+ SetPseudoScreenNumProp(w, snum)
+ Window	w;
+ unsigned long	snum;
+ {
+ 	XChangeProperty(dpy, w, _PSTWM_SCREEN_NUM,
+ 			XA_INTEGER, 32, PropModeReplace,
+ 			(unsigned char *)&snum, 1);
+ }
+ 
+ GetStringWidthAndHeight(xfs, str, width, height)
+ XFontStruct	*xfs;
+ char		*str;
+ int		*width, *height;
+ {
+ 	int		len = strlen(str);
+ 	int		direct, ascent, descent;
+ 	XCharStruct	xcs;
+ 
+ 	XTextExtents(xfs, str, len, &direct, &ascent, &descent, &xcs);
+ 	*width = xcs.lbearing + xcs.rbearing;
+ 	*height = ascent + descent;
+ }
+ 
+ GetMbStringWidthAndHeight(xfs, str, width, height)
+ XFontSet	*xfs;
+ unsigned char	*str;
+ int		*width, *height;
+ {
+ 	int		len = strlen(str);
+ 	XRectangle	oie, ole;
+ 
+ 	XmbTextExtents(xfs, str, len, &oie, &ole);
+ 	*width = ole.width;
+ 	*height = ole.height;
+ }
+ 
+ void CreatePseudoScreenTitle()
+ {
+ 	Window			fsd;
+ 	XSetWindowAttributes	xswat;
+ 	Pixmap			pixm;
+ 	int			i, x, y, width, height;
+ 	char		*mes = Scr->PseudoScreenTitle[Scr->PseudoCurScreen];
+ 
+ 	GetMbStringWidthAndHeight(Scr->PSTitleFontSet.fontset,
+ 			mes, &width, &height);
+ 
+ 	if(HasShape)
+ 		xswat.background_pixel = Scr->PseudoScreenTitleC.fore;
+ 	else
+ 		xswat.background_pixel = Scr->PseudoScreenTitleC.back;
+ 	xswat.override_redirect = True;
+ 
+ 	Scr->PseudoScreenTitleWindowW = width;
+ 	Scr->PseudoScreenTitleWindowH = height;
+ 
+ 	switch(Scr->PseudoScreenTitleWindowP) {
+ 	  case 0:	/* not appointed geometry (default down-right) */
+ 	  case 4:	/* downright */
+ 		x = Scr->MyDisplayWidth - width - 4;
+ 		y = Scr->MyDisplayHeight - height - 4;
+ 		break;
+ 	  case 1:	/* upleft */
+ 		x = 4;
+ 		y = 0;
+ 		break;
+ 	  case 2:	/* upright */
+ 		x = Scr->MyDisplayWidth - width - 4;
+ 		y = 0;
+ 		break;
+ 	  case 3:	/* downleft */
+ 		x = 4;
+ 		y = Scr->MyDisplayHeight - height - 4;
+ 		break;
+ 	  default:/*  case 5: *//* appointed geomerty */
+ 		x = Scr->PseudoScreenTitleWindowX;
+ 		y = Scr->PseudoScreenTitleWindowY;
+ 		break;
+ 	}
+ 
+ 	fsd = Scr->PseudoScreenTitleWindow = XCreateWindow(
+ 			dpy, Scr->Root, x, y, width, height, 0,
+ 			Scr->d_depth, CopyFromParent, CopyFromParent,
+ 			CWBackPixel|CWOverrideRedirect, &xswat);
+ 
+ 	if(!HasShape) {
+ 		XSelectInput(dpy, fsd, VisibilityChangeMask|ExposureMask);
+ 		Scr->PseudoScreenTitleGC = XCreateGC(dpy, fsd, 0, 0);
+ 		XSetForeground(dpy, Scr->PseudoScreenTitleGC,
+ 				Scr->PseudoScreenTitleC.fore);
+ 	}
+ 	else
+ 		XSelectInput(dpy, fsd, VisibilityChangeMask);
+ 	if(HasShape) {
+ 		pixm = XCreatePixmap(dpy, Scr->Root, width, height, 1);
+ 		Scr->ShapeGC = XCreateGC(dpy, pixm, 0, 0);
+ 		XSetForeground(dpy, Scr->ShapeGC, 0);
+ 		XFillRectangle(dpy, pixm, Scr->ShapeGC, 0, 0, width, height);
+ 		XSetForeground(dpy, Scr->ShapeGC, 1);
+ 		XmbDrawString(dpy, pixm, Scr->PSTitleFontSet.fontset,
+ 			Scr->ShapeGC, 0, height-2, mes, strlen(mes));
+ 		XShapeCombineMask(dpy,fsd,ShapeBounding,0,0,pixm,ShapeSet);
+ 		XFreePixmap(dpy, pixm);
+ 	}
+ 	XMapWindow(dpy, fsd);
+ }
+ 
+ 
+ void CreatePseudoScreenCB()
+ {
+ 	Window			pscbw;
+ 	XSetWindowAttributes	xswat;
+ 	Pixmap			pixm;
+ 	int			i, x, y, width, height, xswam;
+ 
+ 	xswat.background_pixel = Scr->PseudoScreenCBC.back;
+ 	xswat.override_redirect = True;
+ 
+ 	if(Scr->PseudoScreenCBPmWidthM != 0) {
+ 		Scr->ChangeButtonW = (Scr->PseudoScreenCBPmWidthM + 6) * 6;
+ 		Scr->ChangeButtonH = Scr->PseudoScreenCBPmHeightM;
+ 	}
+ 
+ 	switch(Scr->ChangeButtonP) {
+ 	  case 0:	/* not appointed geometry (default down-right) */
+ 	  case 4:	/* downright */
+ 		x = Scr->MyDisplayWidth - Scr->ChangeButtonW - 4;
+ 		if(Scr->PseudoScreenTitleWindowP == 0
+ 				|| Scr->PseudoScreenTitleWindowP == 4)
+ 			y = Scr->MyDisplayHeight - Scr->ChangeButtonH -
+ 				Scr->PseudoScreenTitleWindowH - 8;
+ 		else
+ 			y = Scr->MyDisplayHeight - Scr->ChangeButtonH - 4;
+ 		break;
+ 	  case 1:	/* upleft */
+ 		x = 4;
+ 		if(Scr->PseudoScreenTitleWindowP == 1)
+ 			y = Scr->PseudoScreenTitleWindowH + 4;
+ 		else
+ 			y = 4;
+ 		break;
+ 	  case 2:	/* upright */
+ 		x = Scr->MyDisplayWidth - Scr->ChangeButtonW - 4;
+ 		if(Scr->PseudoScreenTitleWindowP == 2)
+ 			y = Scr->PseudoScreenTitleWindowH + 4;
+ 		else
+ 			y = 4;
+ 		break;
+ 	  case 3:	/* downleft */
+ 		x = 4;
+ 		if(Scr->PseudoScreenTitleWindowP == 3)
+ 			y = Scr->MyDisplayHeight - Scr->ChangeButtonH -
+ 					Scr->PseudoScreenTitleWindowH - 8;
+ 		else
+ 			y = Scr->MyDisplayHeight - Scr->ChangeButtonH - 4;
+ 		break;
+ 	  default:/* 5 *//* appointed geomerty */
+ 		x = Scr->ChangeButtonX;
+ 		y = Scr->ChangeButtonY;
+ 		break;
+ 	}
+ 
+ 	if(Scr->PseudoScreenCBPmWidthM != 0) {
+ 		width = Scr->PseudoScreenCBPmWidthM;
+ 		height = Scr->PseudoScreenCBPmHeightM;
+ 	}
+ 	else {
+ 		width = Scr->ChangeButtonW/6 - 6;
+ 		height = Scr->ChangeButtonH;
+ 	}
+ 
+ 	xswat.border_pixel = Scr->PseudoScreenCBBorderColor;
+ 	xswat.cursor = Scr->ChangeButtonCursor;
+ 
+ 	for(i = 0; i < 6; ++i) {
+ 		if(Scr->PseudoScreenCBPm[i] != None) {
+ 			xswam = CWBackPixmap|CWBorderPixel|CWCursor|
+ 					CWOverrideRedirect;
+ 			if(Scr->PseudoScreenCBPmDepth[i] == 1 &&
+ 						Scr->d_depth > 1) {
+ 				pixm = XCreatePixmap(dpy, Scr->Root,
+ 					Scr->PseudoScreenCBPmWidth[i],
+ 					Scr->PseudoScreenCBPmHeight[i],
+ 					Scr->d_depth);
+ 				XSetForeground(dpy, Scr->NormalGC,
+ 					Scr->PseudoScreenCBC.fore);
+ 				XSetBackground(dpy, Scr->NormalGC,
+ 					Scr->PseudoScreenCBC.back);
+ 				XCopyPlane(dpy,Scr->PseudoScreenCBPm[i],
+ 					pixm, Scr->NormalGC, 0, 0,
+ 					Scr->PseudoScreenCBPmWidth[i],
+ 					Scr->PseudoScreenCBPmHeight[i],
+ 					0, 0, 1);
+ 				XFreePixmap(dpy,
+ 					Scr->PseudoScreenCBPm[i]);
+ 				Scr->PseudoScreenCBPm[i] = pixm;
+ 			}
+ 			xswat.background_pixmap = Scr->PseudoScreenCBPm[i];
+ 			if(i == Scr->PseudoCurScreen) {
+ 				if(Scr->PseudoScreenCBPmDepth[6] == 1 &&
+ 						Scr->d_depth > 1) {
+ 					pixm = XCreatePixmap(dpy, Scr->Root,
+ 						Scr->PseudoScreenCBPmWidth[6],
+ 						Scr->PseudoScreenCBPmHeight[6],
+ 						Scr->d_depth);
+ 					XSetForeground(dpy, Scr->NormalGC,
+ 						Scr->PseudoScreenCBAC.fore);
+ 					XSetBackground(dpy, Scr->NormalGC,
+ 						Scr->PseudoScreenCBAC.back);
+ 					XCopyPlane(dpy,Scr->PseudoScreenCBPm[6],
+ 						pixm, Scr->NormalGC, 0, 0,
+ 						Scr->PseudoScreenCBPmWidth[6],
+ 						Scr->PseudoScreenCBPmHeight[6],
+ 						0, 0, 1);
+ 					XFreePixmap(dpy,
+ 						Scr->PseudoScreenCBPm[6]);
+ 					Scr->PseudoScreenCBPm[6] = pixm;
+ 				}
+ 				xswat.background_pixmap =
+ 						Scr->PseudoScreenCBPm[6];
+ 			}
+ 		}
+ 		else {
+ 			xswam = CWBackPixel|CWBorderPixel|CWCursor|
+ 					CWOverrideRedirect;
+ 			if(i == Scr->PseudoCurScreen)
+ 				xswat.background_pixel =
+ 						Scr->PseudoScreenCBAC.back;
+ 			else
+ 				xswat.background_pixel =
+ 						Scr->PseudoScreenCBC.back;
+ 		}
+ 
+ 		Scr->PseudoScreenCBWindow[i] = XCreateWindow(
+ 			dpy, Scr->Root, x + (width + 6) * i, y,
+ 			width, height, 1,
+ 			Scr->d_depth, CopyFromParent, Scr->d_visual,
+ 			xswam, &xswat);
+ 		XSelectInput(dpy, Scr->PseudoScreenCBWindow[i],
+ 			ExposureMask|ButtonPressMask|VisibilityChangeMask);
+ 		XMapWindow(dpy, Scr->PseudoScreenCBWindow[i]);
+ 	}
+ }
+ 
+ void RemakePseudoScreenTitle()
+ {
+ 	Pixmap		pixm;
+ 	int		i, x, y, width, height;
+ 	char		*mes = Scr->PseudoScreenTitle[Scr->PseudoCurScreen];
+ 
+ 	GetMbStringWidthAndHeight(Scr->PSTitleFontSet.fontset,
+ 			mes, &width, &height);
+ 
+ 	Scr->PseudoScreenTitleWindowW = width;
+ 	Scr->PseudoScreenTitleWindowH = height;
+ 
+ 	switch(Scr->PseudoScreenTitleWindowP) {
+ 	  case 0:	/* not appointed geometry (default down-right) */
+ 	  case 4:	/* downright */
+ 		x = Scr->MyDisplayWidth - width - 4;
+ 		y = Scr->MyDisplayHeight - height - 6;
+ 		break;
+ 	  case 1:	/* upleft */
+ 		x = 4;
+ 		y = 0;
+ 		break;
+ 	  case 2:	/* upright */
+ 		x = Scr->MyDisplayWidth - width - 4;
+ 		y = 0;
+ 		break;
+ 	  case 3:	/* downleft */
+ 		x = 4;
+ 		y = Scr->MyDisplayHeight - height - 6;
+ 		break;
+ 	  default:/*  case 5: *//* appointed geomerty */
+ 		x = Scr->PseudoScreenTitleWindowX;
+ 		y = Scr->PseudoScreenTitleWindowY;
+ 		break;
+ 	}
+ 
+ 	XMoveResizeWindow(dpy, Scr->PseudoScreenTitleWindow, x, y, 
+ 			width, height);
+ 	if (HasShape) {
+ 		pixm = XCreatePixmap(dpy, Scr->Root, width, height, 1);
+ 		XSetForeground(dpy, Scr->ShapeGC, 0);
+ 		XFillRectangle(dpy, pixm, Scr->ShapeGC, 0, 0, width, height);
+ 		XSetForeground(dpy, Scr->ShapeGC, 1);
+ 		XmbDrawString(dpy, pixm, Scr->PSTitleFontSet.fontset,
+ 			Scr->ShapeGC, 0, height-2, mes, strlen(mes));
+ 		XShapeCombineMask(dpy, Scr->PseudoScreenTitleWindow,
+ 				ShapeBounding, 0, 0, pixm, ShapeSet);
+ 		XFreePixmap(dpy, pixm);
+ 	}
+ 	XClearWindow(dpy, Scr->PseudoScreenTitleWindow);
+ }
+ 
+ void CreatePSMapDisplay()
+ {
+ 	register int		i;
+ 	int			x, y, width, height, widths, heights, xswam;
+ 	int			widthd, heightd;
+ 	XSetWindowAttributes	xswat;
+ 	char			*geometry;
+ 	Pixel			background;
+ 	Pixmap			pixm;
+ 	XSizeHints		*sizeHints;
+ 	XWMHints		*wmHints;
+ 	XClassHint		*classHints;
+ 	static XTextProperty	wName = {
+ 			(unsigned char *)"PSMap Display", XA_STRING, 8, 13};
+ 	static XTextProperty	iName = {
+ 			(unsigned char *)"PSMap", XA_STRING, 8, 5};
+ 
+ 	Scr->PSMapWindowCW = widths  =
+ 			Scr->MyDisplayWidth/Scr->PSMapDisplayScale;
+ 	Scr->PSMapWindowCH = heights =
+ 			Scr->MyDisplayHeight/Scr->PSMapDisplayScale;
+ 
+ 	Scr->PSMapWindowW = width = (widths + 2) * 3;
+ 	Scr->PSMapWindowH = height = (heights + 2) * 2;
+ 
+ 	sizeHints = XAllocSizeHints();
+ 	sizeHints->flags = PBaseSize;
+ 	sizeHints->base_width = width;
+ 	sizeHints->base_height = height;
+ 	sizeHints->min_width = width;
+ 	sizeHints->min_height = height;
+ 	sizeHints->max_width = width;
+ 	sizeHints->max_height = height;
+ 
+ #define	MAX_SCALE	(30)
+ #define	MIN_SCALE	(4)
+ 
+ 	sizeHints->min_width = (Scr->MyDisplayWidth/MAX_SCALE + 2) * 3;
+ 	sizeHints->min_height = (Scr->MyDisplayHeight/MAX_SCALE + 2) * 2;
+ 	sizeHints->max_width = (Scr->MyDisplayWidth/MIN_SCALE + 2) * 3;
+ 	sizeHints->max_height = (Scr->MyDisplayHeight/MIN_SCALE + 2) * 2;
+ 
+ 	XWMGeometry(dpy, Scr->screen, Scr->PSMapDisplayPosition, NULL, 1,
+ 			sizeHints, &x, &y, &widthd, &heightd,
+ 			&sizeHints->win_gravity);
+ 	sizeHints->flags = USPosition|PWinGravity|PMinSize|PMaxSize;
+ 
+ 	wmHints = XAllocWMHints();
+ 	wmHints->initial_state = NormalState;
+ 	wmHints->flags = StateHint;
+ 
+ 	classHints = XAllocClassHint();
+ 	classHints->res_name = "PSMapDisplay";
+ 	classHints->res_class = "TWM";
+ 
+ 	xswam = CWBackPixel|CWEventMask;
+ 	xswat.background_pixel = Scr->White;
+ 	xswat.event_mask = ExposureMask | ButtonPressMask;
+ 
+ 	Scr->PSMapWindow = XCreateWindow(dpy, Scr->Root, x, y,
+ 				width, height, 1,
+ 				Scr->d_depth, CopyFromParent,
+ 				Scr->d_visual, xswam, &xswat);
+ 
+ 	for(i = 0; i < 6; ++i) {
+ 		if(Scr->PseudoCurScreen == i)
+ 			background = Scr->PSMapDisplayActiveC.back;
+ 		else
+ 			background = Scr->PSMapDisplayC.back;
+ 
+ 		Scr->PSMapWindowC[i] = XCreateSimpleWindow(dpy,
+ 			Scr->PSMapWindow,
+ 			(widths+2)*(i%3), (heights+2)*(i/3),
+ 			widths, heights,
+ 			1, Scr->PSMapDisplayBorderColor, background);
+ 		if(Scr->PSMapDisplayPm[i] != None) {
+ 			if(Scr->PSMapDisplayPmDepth[i] == 1 &&
+ 						Scr->d_depth > 1) {
+ 				pixm = XCreatePixmap(dpy, Scr->PSMapWindow,
+ 					Scr->PSMapDisplayPmWidth[i],
+ 					Scr->PSMapDisplayPmHeight[i],
+ 					Scr->d_depth);
+ 				XSetForeground(dpy, Scr->NormalGC,
+ 					Scr->PSMapDisplayC.fore);
+ 				XSetBackground(dpy, Scr->NormalGC,
+ 					Scr->PSMapDisplayC.back);
+ 				XCopyPlane(dpy, Scr->PSMapDisplayPm[i],
+ 					pixm, Scr->NormalGC, 0, 0,
+ 					Scr->PSMapDisplayPmWidth[i],
+ 					Scr->PSMapDisplayPmHeight[i],
+ 					0, 0, 1);
+ 				XFreePixmap(dpy, Scr->PSMapDisplayPm[i]);
+ 				Scr->PSMapDisplayPm[i] = pixm;
+ 			}
+ 			else
+ 				pixm = Scr->PSMapDisplayPm[i];
+ 		}
+ 		else
+ 			pixm = NULL;
+ 		if(i == Scr->PseudoCurScreen) {
+ 			if(Scr->PSMapDisplayPm[6] == None)
+ 				pixm = NULL;
+ 			else if(Scr->PSMapDisplayPmDepth[6] == 1 &&
+ 					Scr->d_depth > 1) {
+ 				pixm = XCreatePixmap(dpy, Scr->Root,
+ 					Scr->PSMapDisplayPmWidth[6],
+ 					Scr->PSMapDisplayPmHeight[6],
+ 					Scr->d_depth);
+ 				XSetForeground(dpy, Scr->NormalGC,
+ 					Scr->PSMapDisplayActiveC.fore);
+ 				XSetBackground(dpy, Scr->NormalGC,
+ 					Scr->PSMapDisplayActiveC.back);
+ 				XCopyPlane(dpy,Scr->PSMapDisplayPm[6],
+ 					pixm, Scr->NormalGC, 0, 0,
+ 					Scr->PSMapDisplayPmWidth[6],
+ 					Scr->PSMapDisplayPmHeight[6],
+ 					0, 0, 1);
+ 				XFreePixmap(dpy,Scr->PSMapDisplayPm[6]);
+ 				Scr->PSMapDisplayPm[6] = pixm;
+ 			}
+ 			else
+ 				pixm = Scr->PSMapDisplayPm[6];
+ 		}
+ 		if(pixm != NULL) {
+ 			XSetWindowBackgroundPixmap(dpy, Scr->PSMapWindowC[i],
+ 					pixm);
+ 			XClearWindow(dpy, Scr->PSMapWindowC[i]);
+ 		}
+ 		XGrabButton(dpy, Button1, 0L, Scr->PSMapWindowC[i], True,
+ 			ButtonPressMask|ButtonReleaseMask|ButtonMotionMask,
+ 			GrabModeAsync, GrabModeAsync, Scr->PSMapWindowC[i],
+ 			None);
+ 		XMapWindow(dpy, Scr->PSMapWindowC[i]);
+ 	}
+ 
+ 	/* for dumy window..... */
+ 	Scr->PSMapWindowC[6] = XCreateSimpleWindow(dpy,
+ 			Scr->PSMapWindow, 0, 0, 10, 10, 1, 0, 0);
+ 
+ 	XGrabButton(dpy, Button3, 0L, Scr->PSMapWindow, True,
+ 			ButtonPressMask|ButtonReleaseMask|ButtonMotionMask,
+ 			GrabModeAsync, GrabModeAsync, Scr->PSMapWindow, None);
+ 	XSetWMProperties(dpy, Scr->PSMapWindow, &wName, &iName, NULL, 0,
+ 			sizeHints, wmHints, classHints);
+ }
+ 
+ static TwmWindow	*mpsmw;
+ 
+ void	MapPSMapDisplay()
+ {
+ 	static int	first = TRUE;
+ 	void HandlePSMapExpose();
+ 
+ 	if(first) {
+ 		SimulateMapRequest(Scr->PSMapWindow, TRUE);
+ 		XSelectInput(dpy, Scr->PSMapWindow, ExposureMask);
+ 		if(XFindContext(dpy, Scr->PSMapWindow, PSMapContext,
+ 				(caddr_t *)&mpsmw) == XCNOENT)
+ 			mpsmw = NULL;
+ 		XClearArea(dpy, Scr->PSMapWindow, 0, 0, 9999, 9999, True);
+ 		first = FALSE;
+ 	}
+ 	else if(mpsmw != NULL)
+ 		XMapRaised(dpy, mpsmw->frame);
+ 	Scr->PSMapDisplayState = TRUE;
+ }
+ 
+ void	UnmapPSMapDisplay()
+ {
+ 	if(mpsmw != NULL)
+ 		XUnmapWindow(dpy, mpsmw->frame);
+ 	Scr->PSMapDisplayState = FALSE;
+ }
+ 
+ void	ResizePSMapWindow()
+ {
+ 	register TwmWindow	*t;
+ 	register int		i, width, height, scale;
+ 
+ 	scale = Scr->PSMapDisplayScale;
+ 	Scr->PSMapWindowCW = width = Scr->MyDisplayWidth/scale;
+ 	Scr->PSMapWindowCH = height = Scr->MyDisplayHeight/scale;
+ 	Scr->PSMapWindowW = (width + 2) * 3;
+ 	Scr->PSMapWindowH = (height + 2) * 2;
+ 
+ 	for(i = 0 ;i < 6; ++i)
+ 		XMoveResizeWindow(dpy, Scr->PSMapWindowC[i],
+ 			(width+2)*(i%3), (height+2)*(i/3), width, height);
+ 
+ 	for(t = Scr->TwmRoot.next; t != NULL; t = t->next) {
+ 		if(t->psmapWindow) {
+ 			XMoveResizeWindow(dpy, t->psmapWindow,
+ 				t->frame_x/scale, t->frame_y/scale,
+ 				t->frame_width/scale, t->frame_height/scale);
+ 		}
+ 		if(t->psmapIcon) {
+ 			int	x, y, w, h, b, d;
+ 			Window	rw;
+ 			XGetGeometry(dpy, t->icon_w, &rw,
+ 					&x, &y, &w, &h, &b, &d);
+ 			XMoveResizeWindow(dpy, t->psmapIcon,
+ 				x/scale, y/scale, w/scale, h/scale);
+ 		}
+ 	}
+ }
+ 
+ 
+ void		MapFrame(tmp_win)
+ TwmWindow	*tmp_win;
+ {
+ 	XMapWindow(dpy, tmp_win->w);
+ 	if(tmp_win->PseudoScreen == Scr->PseudoCurScreen || 
+ 			tmp_win->PseudoScreen == -1) {
+ 		XMapWindow(dpy, tmp_win->frame);
+ 		tmp_win->psmapped = TRUE;
+ 	}
+ 	if(tmp_win->psmapWindow)
+ 		XMapWindow(dpy, tmp_win->psmapWindow);
+ }
+ 
+ void		UnmapFrame(tmp_win)
+ TwmWindow	*tmp_win;
+ {
+ 	tmp_win->psmapped = FALSE;
+ 	XUnmapWindow(dpy, tmp_win->frame);
+ 	if(!tmp_win->iconmgr && tmp_win->w != Scr->PSMapWindow)
+ 		XUnmapWindow(dpy, tmp_win->w);
+ 
+ 	if(tmp_win->psmapWindow)
+ 		XUnmapWindow(dpy, tmp_win->psmapWindow);
+ }
+ 
+ void		RaiseFrame(tmp_win)
+ TwmWindow	*tmp_win;
+ {
+ 	XRaiseWindow(dpy, tmp_win->frame);
+ 	if(tmp_win->psmapWindow)
+ 		XRaiseWindow(dpy, tmp_win->psmapWindow);
+ }
+ 
+ void		LowerFrame(tmp_win)
+ TwmWindow	*tmp_win;
+ {
+ 	XLowerWindow(dpy, tmp_win->frame);
+ 	if(tmp_win->psmapWindow)
+ 		XLowerWindow(dpy, tmp_win->psmapWindow);
+ }
+ 
+ void		MapIcon(tmp_win)
+ TwmWindow	*tmp_win;
+ {
+ 	if(tmp_win->PseudoScreen == Scr->PseudoCurScreen ||
+ 			tmp_win->PseudoScreen == -1) {
+ 		XMapRaised(dpy, tmp_win->icon_w);
+ 		tmp_win->psmapped = TRUE;
+ 	}
+ 	else
+ 		XRaiseWindow(dpy, tmp_win->icon_w);
+ 	if(tmp_win->psmapIcon)
+ 		XMapRaised(dpy, tmp_win->psmapIcon);
+ }
+ 
+ void		UnmapIcon(tmp_win)
+ TwmWindow	*tmp_win;
+ {
+ 	tmp_win->psmapped = FALSE;
+ 	XUnmapWindow(dpy, tmp_win->icon_w);
+ 	if(tmp_win->psmapIcon)
+ 		XUnmapWindow(dpy, tmp_win->psmapIcon);
+ }
+ 
+ void		RaiseIcon(tmp_win)
+ TwmWindow	*tmp_win;
+ {
+ 	XRaiseWindow(dpy, tmp_win->icon_w);
+ 	if(tmp_win->psmapIcon)
+ 		XRaiseWindow(dpy, tmp_win->psmapIcon);
+ }
+ 
+ void		LowerIcon(tmp_win)
+ TwmWindow	*tmp_win;
+ {
+ 	XLowerWindow(dpy, tmp_win->icon_w);
+ 	if(tmp_win->psmapIcon)
+ 		XLowerWindow(dpy, tmp_win->psmapIcon);
+ }
+ 
+ void		MoveIcon(tmp_win, x ,y)
+ TwmWindow	*tmp_win;
+ int		x, y;
+ {
+ 	XMoveWindow(dpy, tmp_win->icon_w, x, y);
+ 	if(tmp_win->psmapIcon)
+ 		XMoveWindow(dpy, tmp_win->psmapIcon,
+ 				x/Scr->PSMapDisplayScale,
+ 				y/Scr->PSMapDisplayScale);
+ }
+ 
+ Window	CreatePSMapWin(tmp_win, x, y, width, height, background, border)
+ TwmWindow	*tmp_win;
+ int		x, y, width, height;
+ Pixel		background, border;
+ {
+ 	Window	pmsw;
+ 	int	winNum;
+ 
+ 	if(tmp_win->PseudoScreen == -1)
+ 		winNum = 6;
+ 	else
+ 		winNum = tmp_win->PseudoScreen;
+ 
+ 	x /= Scr->PSMapDisplayScale;
+ 	y /= Scr->PSMapDisplayScale;
+ 	width /= Scr->PSMapDisplayScale;
+ 	height /= Scr->PSMapDisplayScale;
+ 	if(width == 0)	width = 1;
+ 	if(height == 0)	height = 1;
+ 	pmsw = XCreateSimpleWindow(dpy, Scr->PSMapWindowC[winNum],
+ 		x, y, width, height, 1, border, background);
+ 	XGrabButton(dpy, Button2, 0L, pmsw,
+ 		True, ButtonPressMask|ButtonReleaseMask|ButtonMotionMask,
+ 		GrabModeAsync, GrabModeAsync, Scr->PSMapWindow, None);
+ 	XSelectInput(dpy, pmsw, KeyPressMask | ExposureMask);
+ 	XSaveContext(dpy, pmsw, TwmContext, (caddr_t)tmp_win);
+ 	XSaveContext(dpy, pmsw, PSMapContext, (caddr_t)tmp_win);
+ 	XSaveContext(dpy, pmsw, ScreenContext, (caddr_t)Scr);
+ 	return(pmsw);
+ }
+ 
+ void HandlePSTitleExpose()
+ {
+ 	char	*mes = Scr->PseudoScreenTitle[Scr->PseudoCurScreen];
+ 
+ 	XmbDrawString(dpy, Scr->PseudoScreenTitleWindow,
+ 			Scr->PSTitleFontSet.fontset,
+ 			Scr->PseudoScreenTitleGC,
+ 			0, Scr->PseudoScreenTitleWindowH - 2,
+ 			mes, strlen(mes));
+ }
+ 
+ void HandleCBExpose(w)
+ int	w;
+ {
+ 	static char	*num[] = { "1", "2", "3", "4", "5", "6", };
+ 	int		width, height;
+ 
+ 	if(Scr->PseudoScreenCBPm[w] == None) {
+ 		if(w == Scr->PseudoCurScreen)
+ 			XSetForeground(dpy, Scr->PseudoScreenCBGC,
+ 				Scr->PseudoScreenCBAC.fore);
+ 		else
+ 			XSetForeground(dpy, Scr->PseudoScreenCBGC,
+ 				Scr->PseudoScreenCBC.fore);
+ 
+ 		GetStringWidthAndHeight(Scr->PSCBFontSet.font, num[w],
+ 				&width, &height);
+ 		XDrawString(dpy, Scr->PseudoScreenCBWindow[w],
+ 			Scr->PseudoScreenCBGC,
+ 			(Scr->ChangeButtonW/6 - 6 - width)/2,
+ 			Scr->ChangeButtonH - (Scr->ChangeButtonH - height)/2,
+ 			num[w], 1);
+ 	}
+ }
+ 
+ void HandlePSMapExpose()
+ {
+ /*
+ 	register int	i, x, y, width, height;
+ 	width = Scr->PSMapWindowW/3;
+ 	height = Scr->PSMapWindowH/2;
+ 
+ 	for(i = 0; i < 6; ++i) {
+ 		if(Scr->PseudoCurScreen == i)
+ 			XFillRectangle(dpy, Scr->PSMapWindow, Scr->PSMapGC,
+ 					i*width - Scr->PSMapWindowW*(i/3),
+ 					(i/3)*height, width-1, height-1);
+ 		else
+ 			XDrawRectangle(dpy, Scr->PSMapWindow, Scr->PSMapGC,
+ 					i*width - Scr->PSMapWindowW*(i/3),
+ 					(i/3)*height, width-1, height-1);
+ 	}
+ */
+ }
+ 
+ void HandlePSTitleButtonPress(ev, w)
+ XEvent	*ev;
+ int	w;
+ {
+ 	if(ev->xbutton.button == Button1 || 
+ 			ev->xbutton.button == Button2)
+ 		SetPseudoScreenNumProp(Scr->Root, w);
+ 	else if(ev->xbutton.button == Button3) {
+ 		if(Scr->PSMapDisplayState == TRUE)
+ 			UnmapPSMapDisplay();
+ 		else
+ 			MapPSMapDisplay();
+ 	}
+ }
+ 
+ void	HandlePSMapButtonPress3(ev)
+ XEvent	*ev;
+ {
+ 	if(ev->xbutton.button == Button3)
+ 		UnmapPSMapDisplay();
+ }
+ 
+ void	HandlePSMapButtonPress1(ev, scrn)
+ XEvent	*ev;
+ int	scrn;
+ {
+ 	if(ev->xbutton.button == Button1)
+ 		SetPseudoScreenNumProp(Scr->Root, scrn);
+ }
+ 
+ static int	obx, oby, psmwX, psmwY, opsmwX, opsmwY, firstMotion;
+ int		TitleAndButtonAutoRaise = TRUE;
+ 
+ void	RaisePsMapWindow()
+ {
+ 	register TwmWindow	*t;
+ 
+ 	for(t = Scr->TwmRoot.next; t != NULL; t = t->next) {
+ 		if(t->psmapDisplay) {
+ 			XRaiseWindow(dpy, t->frame);
+ 			break;
+ 		}
+ 	}
+ }
+ 
+ void		HandlePSMapButtonPress2(ev, tmp_win)
+ XEvent		*ev;
+ TwmWindow	*tmp_win;
+ {
+ 	int			i, w, h, b, d;
+ 	Window			rw;
+ 	register TwmWindow	*t;
+ 
+ 	if(!Scr->NoGrabServer)
+ 		XGrabServer(dpy);
+ /*
+ 	XRaiseWindow(dpy, tmp_win->psmapWindow);
+ 	if(tmp_win->icon)
+ 		RaiseIcon(tmp_win);
+ 	else
+ 		XRaiseWindow(dpy, tmp_win->frame);
+ */
+ 	TitleAndButtonAutoRaise = FALSE;
+ 	XLowerWindow(dpy, Scr->PseudoScreenTitleWindow);
+ 	for(i = 0; i < 6; ++i)
+ 		XLowerWindow(dpy, Scr->PseudoScreenCBWindow[i]);
+ 
+ 	RaisePsMapWindow();
+ 
+ 	XGetGeometry(dpy, ev->xbutton.window, &rw, &opsmwX, &opsmwY,
+ 			&w, &h, &b, &d);
+ 	psmwX = opsmwX - ev->xbutton.x;
+ 	psmwY = opsmwY - ev->xbutton.y;
+ 	opsmwX += ((tmp_win->PseudoScreen % 3) * (Scr->PSMapWindowCW + 2) + 1);
+ 	opsmwY += ((tmp_win->PseudoScreen / 3) * (Scr->PSMapWindowCH + 2) + 1);
+ 	obx = ev->xbutton.x + opsmwX;
+ 	oby = ev->xbutton.y + opsmwY;
+ 	firstMotion = 1;
+ }
+ 
+ void		HandlePSMapMotionNotify(ev, tmp_win)
+ XEvent		*ev;
+ TwmWindow	*tmp_win;
+ {
+ 	int	lastX, lastY;
+ 
+ 	if(firstMotion && Scr->NoRaiseMove == FALSE) {
+ 		XRaiseWindow(dpy, tmp_win->psmapWindow);
+ 		if(tmp_win->icon)
+ 			RaiseIcon(tmp_win);
+ 		else
+ 			XRaiseWindow(dpy, tmp_win->frame);
+ 		RaisePsMapWindow();
+ 		firstMotion = 0;
+ 	}
+ 
+ 	lastX = ev->xbutton.x + psmwX + 1 +
+ 		((tmp_win->PseudoScreen % 3) * (Scr->PSMapWindowCW + 2));
+ 	lastY = ev->xbutton.y + psmwY + 1 +
+ 		((tmp_win->PseudoScreen / 3) * (Scr->PSMapWindowCH + 2));
+ 
+ 	if(tmp_win->icon)
+ 		MoveOutline(Scr->PSMapWindow, lastX, lastY,
+ 			tmp_win->icon_w_width/Scr->PSMapDisplayScale + 2,
+ 			tmp_win->icon_w_height/Scr->PSMapDisplayScale + 2,1,0);
+ 	else
+ 		MoveOutline(Scr->PSMapWindow, lastX, lastY,
+ 			tmp_win->frame_width/Scr->PSMapDisplayScale + 2,
+ 			tmp_win->frame_height/Scr->PSMapDisplayScale + 2,
+ 			tmp_win->frame_bw,
+ 			tmp_win->title_height/Scr->PSMapDisplayScale);
+ 
+ }
+ 
+ RaiseTitles()
+ {
+ 	register int	i;
+ 
+ 	TitleAndButtonAutoRaise = TRUE;
+ 	XRaiseWindow(dpy, Scr->PseudoScreenTitleWindow);
+ 	for(i = 0; i < 6; ++i)
+ 		XRaiseWindow(dpy, Scr->PseudoScreenCBWindow[i]);
+ }
+ 
+ void		HandlePSMapButtonRelease(ev, tmp_win)
+ XEvent		*ev;
+ TwmWindow	*tmp_win;
+ {
+ 	int	bx, by, orx, ory, psx, psy, lastX, lastY, scrn, oscrn;
+ 
+ 	MoveOutline(Scr->PSMapWindow, 0, 0, 0, 0, 0, 0);
+ 
+ 	bx = ev->xbutton.x + opsmwX;
+ 	by = ev->xbutton.y + opsmwY;
+ 	if(obx == bx && oby == by) {
+ 		/*
+ 		if(tmp_win->icon)
+ 			RaiseIcon(tmp_win);
+ 		else
+ 			RaiseFrame(tmp_win);
+ 		*/
+ 		RaiseTitles();
+ 		XUngrabServer(dpy);
+ 		return;
+ 	}
+ 
+ 	lastX = ev->xbutton.x + psmwX;
+ 	lastY = ev->xbutton.y + psmwY;
+ 	orx = tmp_win->PseudoScreen % 3;
+ 	ory = tmp_win->PseudoScreen / 3;
+ 
+ 	if(0 < bx && bx < Scr->PSMapWindowCW)
+ 		psx = 0;
+ 	else if(Scr->PSMapWindowCW + 2 < bx && bx < Scr->PSMapWindowCW * 2 + 2)
+ 		psx = 1;
+ 	else if(Scr->PSMapWindowCW * 2 + 4 < bx &&
+ 			bx < Scr->PSMapWindowCW * 3 + 4)
+ 		psx = 2;
+ 	else {
+ 		XBell(dpy, 0);
+ 		RaiseTitles();
+ 		XUngrabServer(dpy);
+ 		return;
+ 	}
+ 
+ 	if(0 < by && by < Scr->PSMapWindowCH)
+ 		psy = 0;
+ 	else if(Scr->PSMapWindowCH + 2 < by && by < Scr->PSMapWindowCH * 2 + 2)
+ 		psy = 1;
+ 	else {
+ 		XBell(dpy, 0);
+ 		RaiseTitles();
+ 		XUngrabServer(dpy);
+ 		return;
+ 	}
+ 
+ 	lastX -= ((Scr->PSMapWindowCW + 2) * (psx - orx));
+ 	lastY -= ((Scr->PSMapWindowCH + 2) * (psy - ory));
+ 	scrn = psy * 3 + psx;
+ 
+ 	oscrn = tmp_win->PseudoScreen;
+ 	if(oscrn != scrn && Scr->PseudoCurScreen != scrn)
+ 		MovePseudoScreenTo(tmp_win, scrn);
+ 		/* realy, i want to use SetPseudoScreenNumProp()
+ 		 * in place of MovePseudoScreenTo().But, that screen
+ 		 * changing action is NOT good feeling...^_^;
+ 		 */
+ 
+ 	if(tmp_win->icon) {
+ 		MoveIcon(tmp_win, lastX * Scr->PSMapDisplayScale,
+ 				lastY * Scr->PSMapDisplayScale);
+ 	}
+ 	else {
+ 		tmp_win->frame_x = lastX * Scr->PSMapDisplayScale;
+ 		tmp_win->frame_y = lastY * Scr->PSMapDisplayScale;
+ 		XMoveWindow(dpy, tmp_win->frame,
+ 				tmp_win->frame_x, tmp_win->frame_y);
+ 		XMoveWindow(dpy, tmp_win->psmapWindow, lastX, lastY);
+ 	}
+ 
+ 	if(oscrn != scrn && Scr->PseudoCurScreen == scrn)
+ 		MovePseudoScreenTo(tmp_win, scrn);
+ 
+ 	if(oscrn != scrn)
+ 		SetPseudoScreenNumProp(tmp_win->w, scrn);
+ 		/* same above comment, too. */
+ 
+ 	RaiseTitles();
+ 	XUngrabServer(dpy);
+ }
+ 
+ #ifdef	notdef
+ PrintEvents(ev)
+ long	ev;
+ {
+ 	static char	*evs[] = {
+ 	"NoEventMask", "KeyPressMask", "KeyReleaseMask",
+ 	"ButtonPressMask", "ButtonReleaseMask", "EnterWindowMask",
+ 	"LeaveWindowMask", "PointerMotionMask", "PointerMotionHintMask",
+ 	"Button1MotionMask", "Button2MotionMask", "Button3MotionMask",
+ 	"Button4MotionMask", "Button5MotionMask",  "ButtonMotionMask",
+ 	"KeymapStateMask", "ExposureMask", "VisibilityChangeMask",
+ 	"StructureNotifyMask", "ResizeRedirectMask", "SubstructureNotifyMask",
+ 	"SubstructureRedirectMask", "FocusChangeMask", "PropertyChangeMask",
+ 	"ColormapChangeMask", "OwnerGrabButtonMask"
+ 	};
+ 	register int i;
+ 
+ 	for(i = 0; i < 25; ++i)
+ 		if(ev & (1L<<i))
+ 			printf("%s\n", evs[i]);
+ }
+ 
+ DispWindowAttr(w)
+ Window	w;
+ {
+ 	XWindowAttributes	xwattr;
+ 	Status			stat;
+ 
+ 	stat = XGetWindowAttributes(dpy, w, &xwattr);
+ 	if(stat == BadDrawable || stat == BadWindow) {
+ 		printf("XGetWindowAttributes error!!\n");
+ 		return;
+ 	}
+ 	else
+ 		printf("zzz = %d\n", stat);
+ 
+ /*	printf("all  = %x\n", xwattr.all_event_masks);
+ 	PrintEvents(xwattr.all_event_masks);	*/
+ 
+ 	printf("your = %x\n", xwattr.your_event_mask);
+ 	PrintEvents(xwattr.your_event_mask);
+ 
+ 	printf("map state = %d\n", xwattr.map_state);
+ }
+ #endif
+ 
*** /dev/null	Mon Aug 31 10:12:24 1992
--- pstwm.h	Mon Aug 31 11:21:48 1992
***************
*** 0 ****
--- 1,7 ----
+ /*
+  *	pstwm.h : Pseudo Screen definition for pstwm.
+  *	mukawa@ctec.tn-sec.ntt.jp
+  *	10 Aug '92
+  */
+ 
+ #define	PSTWM_SCREEN_NUM	"PSTWM_SCREEN_NUM"
*** /dev/null	Mon Aug 31 10:12:24 1992
--- tiff.c	Mon Aug 31 11:21:52 1992
***************
*** 0 ****
--- 1,470 ----
+ /*
+  *
+  *	TIFF file function routines
+  *
+  *	18 Nov 1991 mukawa@ctec.tn-sec.ntt.jp
+  *
+  */
+ /*
+  *	This source program's original is
+  * ---------------------------------------------
+  * xtiff.c - view a TIFF file in an X window
+  * Dan Sears
+  * Chris Sears
+  * ---------------------------------------------
+  */
+ 
+ #ifdef	XTIFF
+ 
+ #include <stdio.h>
+ #include <math.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <tiffio.h>
+ #include "twm.h"
+ #include "screen.h"
+ 
+ #define	ROUND(x)	(u_short) ((x) + 0.5)
+ #define	SCALE(x, s)	(((x) * 65535L) / (s))
+ 
+ static u_long		tfWidth, tfHeight;
+ static u_short		tfDepth, tfPhotometricInterpretation;
+ static double		tfUnitMap, tfGrayResponseUnitMap[] = {
+ 				-1, -10, -100, -1000, -10000, -100000
+ 			};
+ 
+ static u_short		*redMap = NULL, *greenMap = NULL,
+ 			*blueMap = NULL, *grayMap = NULL;
+ static u_short		colormapSize;
+ static u_char		*imageMemory;
+ 
+ TIFF	*OpenTIFFFile(fileName)
+ char	*fileName;
+ {
+ 	TIFF	*tff;
+ 
+ 	if((tff = TIFFOpen(fileName, "r")) == NULL) {
+ 	/*	fprintf(stderr, "Can't open %s as a TIFF file\n", fileName);*/
+ 		return(NULL);
+ 	}
+ 
+ #ifdef	notdef
+ 	if(TIFFReadDirectory(tff) == True)
+ 		/* display first page only !!
+ 		 */
+ 		TIFFSetDirectory(tff, 0);
+ #endif
+ 	return(tff);
+ }
+ 
+ CheckAndCorrectColormap()
+ {
+ 	register int i;
+ 
+ 	for(i = 0; i < colormapSize; i++)
+ 		if((redMap[i] > 255)||(greenMap[i] > 255)||(blueMap[i] > 255))
+ 			return;
+ 
+ 	for(i = 0; i < colormapSize; i++) {
+ 		redMap[i] = SCALE(redMap[i], 255);
+ 		greenMap[i] = SCALE(greenMap[i], 255);
+ 		blueMap[i] = SCALE(blueMap[i], 255);
+ 	}
+ }
+ 
+ GetTIFFHeader(tff)
+ TIFF	*tff;
+ {
+ 	register int	i;
+ 	u_short		tfBitsPerSample, tfSamplesPerPixel, tfGrayResponseUnit;
+ 			/*tfPlanarConfiguration */
+ 
+ 	TIFFGetField(tff, TIFFTAG_IMAGEWIDTH, &tfWidth);
+ 	TIFFGetField(tff, TIFFTAG_IMAGELENGTH, &tfHeight);
+ 
+ 	/*
+ 	 * If the following tags aren't present then use the TIFF defaults.
+ 	 */
+ 	if (!TIFFGetField(tff, TIFFTAG_BITSPERSAMPLE, &tfBitsPerSample))
+ 		tfBitsPerSample = 1;
+ 	if (!TIFFGetField(tff, TIFFTAG_SAMPLESPERPIXEL, &tfSamplesPerPixel))
+ 		tfSamplesPerPixel = 1;
+ /*
+ 	if (!TIFFGetField(tff, TIFFTAG_PLANARCONFIG, &tfPlanarConfiguration))
+ 		tfPlanarConfiguration = PLANARCONFIG_CONTIG;
+ */
+ 	if (!TIFFGetField(tff, TIFFTAG_GRAYRESPONSEUNIT, &tfGrayResponseUnit))
+ 		tfGrayResponseUnit = 2;
+ 	tfUnitMap = tfGrayResponseUnitMap[tfGrayResponseUnit];
+ 	colormapSize = 1 << tfBitsPerSample;
+ 	tfDepth = tfBitsPerSample * tfSamplesPerPixel;
+ 
+ 	/*
+ 	 * If TIFFTAG_PHOTOMETRIC is not present then assign
+ 	 *	a reasonable default.
+ 	 * The TIFF 5.0 specification doesn't give a default.
+ 	 */
+ 	if(!TIFFGetField(tff, TIFFTAG_PHOTOMETRIC,
+ 			&tfPhotometricInterpretation)) {
+ 		if(tfSamplesPerPixel != 1)
+ 			tfPhotometricInterpretation = PHOTOMETRIC_RGB;
+ 		else if(tfBitsPerSample == 1)
+ 			tfPhotometricInterpretation = PHOTOMETRIC_MINISBLACK;
+ 		else if(TIFFGetField(tff, TIFFTAG_COLORMAP,
+ 				&redMap, &greenMap, &blueMap)) {
+ 			tfPhotometricInterpretation = PHOTOMETRIC_PALETTE;
+ 			free(redMap); free(greenMap); free(blueMap);
+ 			redMap = greenMap = blueMap = NULL;
+ 		}
+ 		else
+ 			tfPhotometricInterpretation = PHOTOMETRIC_MINISBLACK;
+ 	}
+ 
+ 	/*
+ 	 * Given TIFFTAG_PHOTOMETRIC extract or create the response curves.
+ 	 */
+ 	switch(tfPhotometricInterpretation) {
+ 	  case PHOTOMETRIC_RGB:
+ 		if(!TIFFGetField(tff, TIFFTAG_COLORRESPONSECURVE,
+ 				&redMap, &greenMap, &blueMap)) {
+ 			redMap = (u_short *)malloc(colormapSize * sizeof(u_short));
+ 			greenMap = (u_short *)malloc(colormapSize * sizeof(u_short));
+ 			blueMap = (u_short *)malloc(colormapSize * sizeof(u_short));
+ 			if(redMap==NULL || greenMap==NULL || blueMap==NULL) {
+ 				fprintf(stderr, "can't alloc memory\n");
+ 				free(redMap); free(greenMap); free(blueMap);
+ 				return(0);
+ 			}
+ 			for (i = 0; i < colormapSize; i++)
+ 				redMap[i] = greenMap[i] = blueMap[i]
+ 						= SCALE(i, colormapSize - 1);
+ 		} else
+ 			CheckAndCorrectColormap();
+ 		return(1);
+ 	  case PHOTOMETRIC_PALETTE:
+ 		if(TIFFGetField(tff, TIFFTAG_COLORMAP,
+ 				&redMap, &greenMap, &blueMap))
+ 			CheckAndCorrectColormap();
+ 		else {
+ 			redMap = (u_short *)malloc(colormapSize *
+ 					sizeof(u_short));
+ 			greenMap = (u_short *)malloc(colormapSize *
+ 					sizeof(u_short));
+ 			blueMap = (u_short *)malloc(colormapSize *
+ 					sizeof(u_short));
+ 			if(redMap == NULL || greenMap == NULL 
+ 					| blueMap == NULL) {
+ 				fprintf(stderr, "can't alloc memory\n");
+ 				free(redMap); free(greenMap); free(blueMap);
+ 				return(0);
+ 			}
+ 			for(i = 0; i < colormapSize; i++)
+ 				redMap[i] = greenMap[i] = blueMap[i]
+ 						= SCALE(i, colormapSize - 1);
+ 		}
+ 		return(1);
+ 	  case PHOTOMETRIC_MINISWHITE:
+ 		redMap = (u_short *)malloc(colormapSize * sizeof(u_short));
+ 		greenMap = (u_short *)malloc(colormapSize * sizeof(u_short));
+ 		blueMap = (u_short *)malloc(colormapSize * sizeof(u_short));
+ 		if(redMap == NULL || greenMap == NULL | blueMap == NULL) {
+ 			fprintf(stderr, "can't alloc memory\n");
+ 			free(redMap); free(greenMap); free(blueMap);
+ 			return(0);
+ 		}
+ 		if(!TIFFGetField(tff, TIFFTAG_GRAYRESPONSECURVE, &grayMap))
+ 			for (i = 0; i < colormapSize; i++)
+ 				redMap[i] = greenMap[i] = blueMap[i]
+ 					= SCALE(colormapSize - 1 - i,
+ 							colormapSize - 1);
+ 		else {
+ 			redMap[colormapSize - 1] = greenMap[colormapSize - 1]
+ 					= blueMap[colormapSize - 1] = 0;
+ 			for (i = 0; i < colormapSize - 1; i++)
+ 				redMap[i] = greenMap[i] = blueMap[i] =
+ 					(u_short)(65535.0 - (65535.0 * pow(10.0,
+ 					(double)grayMap[i] / tfUnitMap)));
+ 			free(grayMap);
+ 		}
+ 		return(1);
+ 	  case PHOTOMETRIC_MINISBLACK:
+ 		redMap = (u_short *)malloc(colormapSize * sizeof(u_short));
+ 		greenMap = (u_short *)malloc(colormapSize * sizeof(u_short));
+ 		blueMap = (u_short *)malloc(colormapSize * sizeof(u_short));
+ 		if(redMap == NULL || greenMap == NULL | blueMap == NULL) {
+ 			fprintf(stderr, "can't alloc memory\n");
+ 			free(redMap); free(greenMap); free(blueMap);
+ 			return(0);
+ 		}
+ 		if(!TIFFGetField(tff, TIFFTAG_GRAYRESPONSECURVE, &grayMap))
+ 			for (i = 0; i < colormapSize; i++) {
+ 				redMap[i] = greenMap[i] = blueMap[i]
+ 					= SCALE(i, colormapSize - 1);
+ 			}
+ 		else {
+ 			redMap[0] = greenMap[0] = blueMap[0] = 0;
+ 			for (i = 1; i < colormapSize; i++)
+ 				redMap[i] = greenMap[i] = blueMap[i] =
+ 					(u_short)(65535.0 * pow(10.0,
+ 					(double) grayMap[i] / tfUnitMap));
+ 			free(grayMap);
+ 		}
+ 		return(1);
+ 	  default:
+ 		fprintf(stderr,
+ 			"Can't display photometric interpretation type %d\n",
+ 			tfPhotometricInterpretation);
+ 		return(0);
+ 	}
+ }
+ 
+ GetTIFFImage(tff)
+ TIFF	*tff;
+ {
+ 	register u_char	*scan_line, *output_p, *input_p;
+ 	register int	i, j, k;
+ 	u_short		tfBytesPerRow;
+ 
+ 	scan_line = (u_char *)malloc(tfBytesPerRow = TIFFScanlineSize(tff));
+ 	if(scan_line == NULL) {
+ 		fprintf(stderr, "can't alloc memory\n");
+ 		return(0);
+ 	}
+ 
+ 	if(Scr->d_depth == tfDepth) {
+ 		output_p = imageMemory = (u_char *)
+ 				malloc(tfBytesPerRow * tfHeight);
+ 		if(imageMemory == NULL) {
+ 			free(scan_line);
+ 			fprintf(stderr, "can't alloc memory\n");
+ 			return(0);
+ 		}
+ 		for (i = 0; i < tfHeight; i++, output_p += tfBytesPerRow)
+ 			if(TIFFReadScanline(tff, output_p, i,0) < 0)
+ 				break;
+ 	} else if ((Scr->d_depth == 8) && (tfDepth == 4)) {
+ 		output_p = imageMemory = (u_char *)
+ 			malloc(tfBytesPerRow * 2 * tfHeight + 2);
+ 		if(imageMemory == NULL) {
+ 			free(scan_line);
+ 			fprintf(stderr, "can't alloc memory\n");
+ 			return(0);
+ 		}
+ 		for(i = 0; i < tfHeight; i++) {
+ 			if(TIFFReadScanline(tff,scan_line,i, 0) < 0)
+ 				break;
+ 			output_p = &imageMemory[i * tfWidth];
+ 			input_p = scan_line;
+ 			for(j = 0;j < tfWidth;j += 2, input_p++){
+ 				*output_p++ = *input_p >> 4;
+ 				*output_p++ = *input_p & 0xf;
+ 			}
+ 		}
+ 	} else if ((Scr->d_depth == 8) && (tfDepth == 2)) {
+ 		output_p = imageMemory = (u_char *)
+ 			malloc(tfBytesPerRow * 4 * tfHeight + 4);
+ 		if(imageMemory == NULL) {
+ 			free(scan_line);
+ 			fprintf(stderr, "can't alloc memory\n");
+ 			return(0);
+ 		}
+ 		for (i = 0; i < tfHeight; i++) {
+ 			if(TIFFReadScanline(tff,scan_line,i, 0) < 0)
+ 				break;
+ 			output_p = &imageMemory[i * tfWidth];
+ 			input_p = scan_line;
+ 			for (j = 0; j < tfWidth; j += 4, input_p++) {
+ 				*output_p++ = *input_p >> 6;
+ 				*output_p++ = (*input_p >> 4) & 3;
+ 				*output_p++ = (*input_p >> 2) & 3;
+ 				*output_p++ = *input_p & 3;
+ 			}
+ 		}
+ 	} else if ((Scr->d_depth == 8) && (tfDepth == 1)) {
+ 		output_p = imageMemory = (u_char *)
+ 			malloc(tfBytesPerRow * 8 * tfHeight + 8);
+ 		if(imageMemory == NULL) {
+ 			free(scan_line);
+ 			fprintf(stderr, "can't alloc memory\n");
+ 			return(0);
+ 		}
+ 		for (i = 0; i < tfHeight; i++) {
+ 			if(TIFFReadScanline(tff, scan_line, i, 0) < 0)
+ 				break;
+ 			output_p = &imageMemory[i * tfWidth];
+ 			input_p = scan_line;
+ 			for (j = 0; j < tfWidth; j += 8, input_p++) {
+ 				for(k = 7; k >= 0; --k)
+ 					*output_p++ = (*input_p >> k) & 1;
+ 			}
+ 		}
+ 	} else if((Scr->d_depth == 4) && (tfDepth == 2)) {
+ 		output_p = imageMemory = (u_char *)
+ 			malloc(tfBytesPerRow * 2 * tfHeight + 2);
+ 		if(imageMemory == NULL) {
+ 			free(scan_line);
+ 			fprintf(stderr, "can't alloc memory\n");
+ 			return(0);
+ 		}
+ 		for(i = 0; i < tfHeight; i++) {
+ 			if(TIFFReadScanline(tff,scan_line,i, 0) < 0)
+ 				break;
+ 			output_p = &imageMemory[i * tfWidth];
+ 			input_p = scan_line;
+ 			for (j = 0;j < tfWidth;j += 4,input_p++) {
+ 				*output_p++ = ((*input_p>>6) << 4)|
+ 						((*input_p >> 4) & 3);
+ 				*output_p++ = (((*input_p>>2) & 3)<<4)|
+ 						(*input_p & 3);
+ 			}
+ 		}
+ 	} else {
+ 		fprintf(stderr,
+ 		"Can't handle %d-bit TIFF file on an %d-bit display\n",
+ 				tfDepth, Scr->d_depth);
+ 		return(0);
+ 	}
+ 	free(scan_line);
+ 	return(1);
+ }
+ 
+ Pixmap	CreateXPixmap()
+ {
+ 	Pixmap		pxm;
+ 	XImage		*ximage;
+ 	XGCValues	gc_values;
+ 	GC		gc;
+ 	XColor		xcol;
+ 	u_long		pxl;
+ 	int		x, y;
+ 	short		*allocMap1;
+ 	u_long		*allocMap2;
+ 
+ 	ximage = XCreateImage(dpy, Scr->d_visual, Scr->d_depth,
+ 		Scr->d_depth == 1 ? XYBitmap : ZPixmap, 0,
+ 		(char *)imageMemory, tfWidth, tfHeight, 8, 0);
+ 
+ 	/*
+ 	 * libtiff converts LSB data into MSB but doesn't change
+ 	 * the FillOrder tag.
+ 	 */
+ 	if (Scr->d_depth == 1)
+ 		ximage->bitmap_bit_order = MSBFirst;
+ 	if (Scr->d_depth <= 8)
+ 		ximage->byte_order = MSBFirst;
+ 
+ 	allocMap1 = (short *)malloc(colormapSize * sizeof(short));
+ 	if(allocMap1 == NULL) {
+ 		XDestroyImage(ximage);
+ 		free(ximage->data);
+ 		XFree(ximage);
+ 		fprintf(stderr, "can't alloc memory\n");
+ 		return(None);
+ 	}
+ 	bzero((char *)allocMap1, colormapSize * sizeof(short));
+ 
+ 	allocMap2 = (u_long *)malloc(colormapSize * sizeof(u_long));
+ 	if(allocMap2 == NULL) {
+ 		free(allocMap1);
+ 		XDestroyImage(ximage);
+ 		free(ximage->data);
+ 		XFree(ximage);
+ 		fprintf(stderr, "can't alloc memory\n");
+ 		return(None);
+ 	}
+ 	bzero((char *)allocMap2, colormapSize * sizeof(u_long));
+ 
+ 	for(y = 0; y < tfHeight; ++y) {
+ 		for(x = 0; x < tfWidth; ++x) {
+ 			pxl = XGetPixel(ximage, x, y);
+ 			if(!allocMap1[pxl]) {
+ 				xcol.red = redMap[pxl];
+ 				xcol.green = greenMap[pxl];
+ 				xcol.blue = blueMap[pxl];
+ 				if(!XAllocColor(dpy,
+ 				    Scr->TwmRoot.cmaps.cwins[0]->colormap->c,
+ 						&xcol)) {
+ 					fprintf(stderr, "can't alloc color\n");
+ 					allocMap2[pxl] = Scr->Black;
+ 				}
+ 				else
+ 					allocMap2[pxl] = xcol.pixel;
+ 				allocMap1[pxl] = 1;
+ 				/*printf("alloc color = %d (%d %d %d) = %d\n",
+ 					pxl, redMap[pxl], greenMap[pxl],
+ 					blueMap[pxl], xcol.pixel);*/
+ 			}
+ 			XPutPixel(ximage, x, y, allocMap2[pxl]);
+ 		}
+ 	}
+ 	free(allocMap1);
+ 	free(allocMap2);
+ 
+ 	/*
+ 	 * create the pixmap and load the image
+ 	 */
+ 	pxm = XCreatePixmap(dpy, Scr->Root,
+ 			ximage->width, ximage->height, Scr->d_depth);
+ 
+ 	if(Scr->d_depth == 1) {
+ 		gc_values.foreground = 1;
+ 		gc_values.background = 0;
+ 		gc = XCreateGC(dpy, pxm,
+ 				GCForeground | GCBackground, &gc_values);
+ 		XPutImage(dpy, pxm, gc, ximage, 0, 0, 0, 0,
+ 				ximage->width, ximage->height);
+ 	}
+ 	else {
+ 		gc_values.function = GXcopy;
+ 		gc_values.plane_mask = AllPlanes;
+ 		gc_values.foreground = Scr->Black;
+ 		gc_values.background = Scr->White;
+ 		gc = XCreateGC(dpy, pxm,
+ 			GCFunction|GCPlaneMask|GCForeground|GCBackground,
+ 			&gc_values);
+ 		XPutImage(dpy, pxm, gc, ximage, 0, 0, 0, 0,
+ 				ximage->width, ximage->height);
+ 	}
+ 	XFreeGC(dpy, gc);
+ 	XDestroyImage(ximage);
+ 	free(ximage->data);
+ 	XFree(ximage);
+ 	return(pxm);
+ }
+ 
+ Pixmap		ReadTiffToPixmap(fname, widthp, heightp, depthp)
+ char		*fname;
+ unsigned int	*widthp, *heightp, *depthp;
+ {
+ 	struct stat	statbuf;
+ 	TIFF		*tfFile;
+ 	Pixmap		status;
+ 
+ 	if(stat(fname, &statbuf) == -1)
+ 	    return(None);
+ 
+ 	if((tfFile = OpenTIFFFile(fname)) == (TIFF *)NULL)
+ 		return(None);
+ 
+ 	if(!GetTIFFHeader(tfFile)) {
+ 		TIFFClose(tfFile);
+ 		return(None);
+ 	}
+ 
+ 	if(!GetTIFFImage(tfFile)) {
+ 		TIFFClose(tfFile);
+ 		return(None);
+ 	}
+ 
+ 	*widthp = tfWidth;
+ 	*heightp = tfHeight;
+ 	*depthp = tfDepth;
+ 
+ 	status = CreateXPixmap();
+ 
+ 	TIFFClose(tfFile);
+ 
+ 	return(status);
+ }
+ 
+ #endif	/* XTIFF */
