v09i006: TWM with a virtual root window, Part05/09
Tom LaStrange
toml at marvin.Solbourne.COM
Thu Aug 30 05:33:29 AEST 1990
Submitted-by: toml at marvin.Solbourne.COM (Tom LaStrange)
Posting-number: Volume 9, Issue 6
Archive-name: tvtwm/part05
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting test in a file
# 3. Execute the file with /bin/sh (not csh) to create the files:
#
#parse.c
#resize.c
#
# Created by toml () on Wed Aug 29 08:43:34 MDT 1990
#
if test -f 'parse.c'
then
echo shar: will not over-write existing file "parse.c"
else
echo extracting "parse.c"
sed 's/^X//' >parse.c <<'SHAR_EOF'
X/*****************************************************************************/
X/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/
X/** Salt Lake City, Utah **/
X/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/
X/** Cambridge, Massachusetts **/
X/** **/
X/** All Rights Reserved **/
X/** **/
X/** Permission to use, copy, modify, and distribute this software and **/
X/** its documentation for any purpose and without fee is hereby **/
X/** granted, provided that the above copyright notice appear in all **/
X/** copies and that both that copyright notice and this permis- **/
X/** sion notice appear in supporting documentation, and that the **/
X/** names of Evans & Sutherland and M.I.T. not be used in advertising **/
X/** in publicity pertaining to distribution of the software without **/
X/** specific, written prior permission. **/
X/** **/
X/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/
X/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/
X/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/
X/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/
X/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/
X/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/
X/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/
X/** OR PERFORMANCE OF THIS SOFTWARE. **/
X/*****************************************************************************/
X
X
X/***********************************************************************
X *
X * $XConsortium: parse.c,v 1.45 90/03/15 14:23:02 jim Exp $
X *
X * parse the .twmrc file
X *
X * 17-Nov-87 Thomas E. LaStrange File created
X *
X ***********************************************************************/
X
X#if !defined(lint) && !defined(SABER)
Xstatic char RCSinfo[]=
X"$XConsortium: parse.c,v 1.45 90/03/15 14:23:02 jim Exp $";
X#endif
X
X#include <stdio.h>
X#include <X11/Xos.h>
X#include <X11/Xmu/CharSet.h>
X#include "twm.h"
X#include "screen.h"
X#include "menus.h"
X#include "util.h"
X#include "gram.h"
X#include "parse.h"
X#include "vdt.h"
X
X#ifndef SYSTEM_INIT_FILE
X#define SYSTEM_INIT_FILE "/usr/lib/X11/twm/system.twmrc"
X#endif
X#define BUF_LEN 300
X
Xstatic FILE *twmrc;
Xstatic int ptr = 0;
Xstatic int len = 0;
Xstatic char buff[BUF_LEN+1];
Xstatic char overflowbuff[20]; /* really only need one */
Xstatic int overflowlen;
Xstatic char **stringListSource, *currentString;
Xstatic int ParseUsePPosition();
Xstatic int ParseState();
X
Xextern int yylineno;
Xextern int mods;
X
Xint ConstrainedMoveTime = 400; /* milliseconds, event times */
X
Xstatic int twmFileInput(), twmStringListInput();
Xvoid twmUnput();
Xint (*twmInputFunc)();
X
Xextern char *defTwmrc[]; /* default bindings */
X
X
X/***********************************************************************
X *
X * Procedure:
X * ParseTwmrc - parse the .twmrc file
X *
X * Inputs:
X * filename - the filename to parse. A NULL indicates $HOME/.twmrc
X *
X ***********************************************************************
X */
X
Xstatic int doparse (ifunc, srctypename, srcname)
X int (*ifunc)();
X char *srctypename;
X char *srcname;
X{
X mods = 0;
X ptr = 0;
X len = 0;
X yylineno = 1;
X ParseError = FALSE;
X twmInputFunc = ifunc;
X overflowlen = 0;
X
X yyparse();
X
X if (ParseError) {
X fprintf (stderr, "%s: errors found in twm %s",
X ProgramName, srctypename);
X if (srcname) fprintf (stderr, " \"%s\"", srcname);
X fprintf (stderr, "\n");
X }
X return (ParseError ? 0 : 1);
X}
X
X
Xint ParseTwmrc (filename)
X char *filename;
X{
X int i;
X char *home = NULL;
X int homelen = 0;
X char *cp = NULL;
X char tmpfilename[257];
X
X /*
X * If filename given, try it, else try ~/.twmrc.# then ~/.twmrc. Then
X * 0. -f filename
X * 1. .tvtwmrc.#
X * 2. .tvtwmrc
X * 3. .twmrc.#
X * 4. .twmrc
X * 5. system.twmrc
X */
X for (twmrc = NULL, i = 0; !twmrc && i < 6; i++) {
X switch (i) {
X case 0: /* -f filename */
X cp = filename;
X break;
X
X case 1: /* ~/.twmrc.screennum */
X if (!filename) {
X home = getenv ("HOME");
X if (home) {
X homelen = strlen (home);
X cp = tmpfilename;
X (void) sprintf (tmpfilename, "%s/.tvtwmrc.%d",
X home, Scr->screen);
X break;
X }
X }
X continue;
X
X case 2: /* ~/.tvtwmrc */
X if (home) {
X tmpfilename[homelen + 9] = '\0';
X }
X break;
X
X case 3: /* ~/.twmrc.screennum */
X if (!filename) {
X home = getenv ("HOME");
X if (home) {
X homelen = strlen (home);
X cp = tmpfilename;
X (void) sprintf (tmpfilename, "%s/.twmrc.%d",
X home, Scr->screen);
X break;
X }
X }
X continue;
X
X case 4: /* ~/.twmrc */
X if (home) {
X tmpfilename[homelen + 7] = '\0';
X }
X break;
X
X case 5: /* system.twmrc */
X cp = SYSTEM_INIT_FILE;
X break;
X }
X
X if (cp) twmrc = fopen (cp, "r");
X }
X
X if (twmrc) {
X int status;
X
X if (filename && cp != filename) {
X fprintf (stderr,
X "%s: unable to open twmrc file %s, using %s instead\n",
X ProgramName, filename, cp);
X }
X status = doparse (twmFileInput, "file", cp);
X fclose (twmrc);
X return status;
X } else {
X if (filename) {
X fprintf (stderr,
X "%s: unable to open twmrc file %s, using built-in defaults instead\n",
X ProgramName, filename);
X }
X return ParseStringList (defTwmrc);
X }
X}
X
Xint ParseStringList (sl)
X char **sl;
X{
X stringListSource = sl;
X currentString = *sl;
X return doparse (twmStringListInput, "string list", (char *)NULL);
X}
X
X
X/***********************************************************************
X *
X * Procedure:
X * twmFileInput - redefinition of the lex input routine for file input
X *
X * Returned Value:
X * the next input character
X *
X ***********************************************************************
X */
X
Xstatic int twmFileInput()
X{
X if (overflowlen) return (int) overflowbuff[--overflowlen];
X
X while (ptr == len)
X {
X if (fgets(buff, BUF_LEN, twmrc) == NULL)
X return NULL;
X
X yylineno++;
X
X ptr = 0;
X len = strlen(buff);
X }
X return ((int)buff[ptr++]);
X}
X
Xstatic int twmStringListInput()
X{
X if (overflowlen) return (int) overflowbuff[--overflowlen];
X
X /*
X * return the character currently pointed to
X */
X if (currentString) {
X unsigned int c = (unsigned int) *currentString++;
X
X if (c) return c; /* if non-nul char */
X currentString = *++stringListSource; /* advance to next bol */
X return '\n'; /* but say that we hit last eol */
X }
X return 0; /* eof */
X}
X
X
X/***********************************************************************
X *
X * Procedure:
X * twmUnput - redefinition of the lex unput routine
X *
X * Inputs:
X * c - the character to push back onto the input stream
X *
X ***********************************************************************
X */
X
Xvoid twmUnput (c)
X int c;
X{
X if (overflowlen < sizeof overflowbuff) {
X overflowbuff[overflowlen++] = (char) c;
X } else {
X twmrc_error_prefix ();
X fprintf (stderr, "unable to unput character (%d)\n",
X c);
X }
X}
X
X
X/***********************************************************************
X *
X * Procedure:
X * TwmOutput - redefinition of the lex output routine
X *
X * Inputs:
X * c - the character to print
X *
X ***********************************************************************
X */
X
Xvoid
XTwmOutput(c)
X{
X putchar(c);
X}
X
X
X/**********************************************************************
X *
X * Parsing table and routines
X *
X ***********************************************************************/
X
Xtypedef struct _TwmKeyword {
X char *name;
X int value;
X int subnum;
X} TwmKeyword;
X
X#define kw0_NoDefaults 1
X#define kw0_AutoRelativeResize 2
X#define kw0_ForceIcons 3
X#define kw0_NoIconManagers 4
X#define kw0_OpaqueMove 5
X#define kw0_InterpolateMenuColors 6
X#define kw0_NoVersion 7
X#define kw0_SortIconManager 8
X#define kw0_NoGrabServer 9
X#define kw0_NoMenuShadows 10
X#define kw0_NoRaiseOnMove 11
X#define kw0_NoRaiseOnResize 12
X#define kw0_NoRaiseOnDeiconify 13
X#define kw0_DontMoveOff 14
X#define kw0_NoBackingStore 15
X#define kw0_NoSaveUnders 16
X#define kw0_RestartPreviousState 17
X#define kw0_ClientBorderWidth 18
X#define kw0_NoTitleFocus 19
X#define kw0_RandomPlacement 20
X#define kw0_DecorateTransients 21
X#define kw0_ShowIconManager 22
X#define kw0_NoCaseSensitive 23
X#define kw0_NoRaiseOnWarp 24
X#define kw0_WarpUnmapped 25
X
X#define kws_UsePPosition 1
X#define kws_IconFont 2
X#define kws_ResizeFont 3
X#define kws_MenuFont 4
X#define kws_TitleFont 5
X#define kws_IconManagerFont 6
X#define kws_UnknownIcon 7
X#define kws_IconDirectory 8
X#define kws_MaxWindowSize 9
X#define kws_VirtualDesktop 10
X#define kws_PannerState 11
X#define kws_PannerGeometry 12
X#define kws_VirtualDesktopBackgroundPixmap 13
X#define kws_PannerBackgroundPixmap 14
X
X#define kwn_ConstrainedMoveTime 1
X#define kwn_MoveDelta 2
X#define kwn_XorValue 3
X#define kwn_FramePadding 4
X#define kwn_TitlePadding 5
X#define kwn_ButtonIndent 6
X#define kwn_BorderWidth 7
X#define kwn_IconBorderWidth 8
X#define kwn_TitleButtonBorderWidth 9
X#define kwn_PannerScale 10
X
X#define kwcl_BorderColor 1
X#define kwcl_IconManagerHighlight 2
X#define kwcl_BorderTileForeground 3
X#define kwcl_BorderTileBackground 4
X#define kwcl_TitleForeground 5
X#define kwcl_TitleBackground 6
X#define kwcl_IconForeground 7
X#define kwcl_IconBackground 8
X#define kwcl_IconBorderColor 9
X#define kwcl_IconManagerForeground 10
X#define kwcl_IconManagerBackground 11
X
X#define kwc_DefaultForeground 1
X#define kwc_DefaultBackground 2
X#define kwc_MenuForeground 3
X#define kwc_MenuBackground 4
X#define kwc_MenuTitleForeground 5
X#define kwc_MenuTitleBackground 6
X#define kwc_MenuShadowColor 7
X#define kwc_VirtualDesktopForeground 8
X#define kwc_VirtualDesktopBackground 9
X#define kwc_PannerForeground 10
X#define kwc_PannerBackground 11
X
X
X/*
X * The following is sorted alphabetically according to name (which must be
X * in lowercase and only contain the letters a-z). It is fed to a binary
X * search to parse keywords.
X */
Xstatic TwmKeyword keytable[] = {
X { "all", ALL, 0 },
X { "autoraise", AUTO_RAISE, 0 },
X { "autorelativeresize", KEYWORD, kw0_AutoRelativeResize },
X { "bordercolor", CLKEYWORD, kwcl_BorderColor },
X { "bordertilebackground", CLKEYWORD, kwcl_BorderTileBackground },
X { "bordertileforeground", CLKEYWORD, kwcl_BorderTileForeground },
X { "borderwidth", NKEYWORD, kwn_BorderWidth },
X { "button", BUTTON, 0 },
X { "buttonindent", NKEYWORD, kwn_ButtonIndent },
X { "c", CONTROL, 0 },
X { "center", JKEYWORD, J_CENTER },
X { "clientborderwidth", KEYWORD, kw0_ClientBorderWidth },
X { "color", COLOR, 0 },
X { "constrainedmovetime", NKEYWORD, kwn_ConstrainedMoveTime },
X { "control", CONTROL, 0 },
X { "cursors", CURSORS, 0 },
X { "decoratetransients", KEYWORD, kw0_DecorateTransients },
X { "defaultbackground", CKEYWORD, kwc_DefaultBackground },
X { "defaultforeground", CKEYWORD, kwc_DefaultForeground },
X { "defaultfunction", DEFAULT_FUNCTION, 0 },
X { "destroy", KILL, 0 },
X { "donticonifybyunmapping", DONT_ICONIFY_BY_UNMAPPING, 0 },
X { "dontmoveoff", KEYWORD, kw0_DontMoveOff },
X { "dontsqueezetitle", DONT_SQUEEZE_TITLE, 0 },
X { "east", DKEYWORD, D_EAST },
X { "f", FRAME, 0 },
X { "f.autoraise", FKEYWORD, F_AUTORAISE },
X { "f.backiconmgr", FKEYWORD, F_BACKICONMGR },
X { "f.beep", FKEYWORD, F_BEEP },
X { "f.bottomzoom", FKEYWORD, F_BOTTOMZOOM },
X { "f.circledown", FKEYWORD, F_CIRCLEDOWN },
X { "f.circleup", FKEYWORD, F_CIRCLEUP },
X { "f.colormap", FSKEYWORD, F_COLORMAP },
X { "f.cut", FSKEYWORD, F_CUT },
X { "f.cutfile", FKEYWORD, F_CUTFILE },
X { "f.deiconify", FKEYWORD, F_DEICONIFY },
X { "f.delete", FKEYWORD, F_DELETE },
X { "f.deltastop", FKEYWORD, F_DELTASTOP },
X { "f.destroy", FKEYWORD, F_DESTROY },
X { "f.downiconmgr", FKEYWORD, F_DOWNICONMGR },
X { "f.exec", FSKEYWORD, F_EXEC },
X { "f.file", FSKEYWORD, F_FILE },
X { "f.focus", FKEYWORD, F_FOCUS },
X { "f.forcemove", FKEYWORD, F_FORCEMOVE },
X { "f.forwiconmgr", FKEYWORD, F_FORWICONMGR },
X { "f.fullzoom", FKEYWORD, F_FULLZOOM },
X { "f.function", FSKEYWORD, F_FUNCTION },
X { "f.hbzoom", FKEYWORD, F_BOTTOMZOOM },
X { "f.hideiconmgr", FKEYWORD, F_HIDELIST },
X { "f.horizoom", FKEYWORD, F_HORIZOOM },
X { "f.htzoom", FKEYWORD, F_TOPZOOM },
X { "f.hzoom", FKEYWORD, F_HORIZOOM },
X { "f.iconify", FKEYWORD, F_ICONIFY },
X { "f.identify", FKEYWORD, F_IDENTIFY },
X { "f.lefticonmgr", FKEYWORD, F_LEFTICONMGR },
X { "f.leftzoom", FKEYWORD, F_LEFTZOOM },
X { "f.lower", FKEYWORD, F_LOWER },
X { "f.menu", FSKEYWORD, F_MENU },
X { "f.move", FKEYWORD, F_MOVE },
X { "f.nexticonmgr", FKEYWORD, F_NEXTICONMGR },
X { "f.nop", FKEYWORD, F_NOP },
X { "f.pandown", FKEYWORD, F_SCROLLDOWN },
X { "f.panleft", FKEYWORD, F_SCROLLLEFT },
X { "f.panner", FKEYWORD, F_PANNER },
X { "f.panright", FKEYWORD, F_SCROLLRIGHT },
X { "f.panup", FKEYWORD, F_SCROLLUP },
X { "f.previconmgr", FKEYWORD, F_PREVICONMGR },
X { "f.quit", FKEYWORD, F_QUIT },
X { "f.raise", FKEYWORD, F_RAISE },
X { "f.raiselower", FKEYWORD, F_RAISELOWER },
X { "f.refresh", FKEYWORD, F_REFRESH },
X { "f.resize", FKEYWORD, F_RESIZE },
X { "f.restart", FKEYWORD, F_RESTART },
X { "f.righticonmgr", FKEYWORD, F_RIGHTICONMGR },
X { "f.rightzoom", FKEYWORD, F_RIGHTZOOM },
X { "f.saveyourself", FKEYWORD, F_SAVEYOURSELF },
X { "f.scrolldown", FKEYWORD, F_SCROLLDOWN },
X { "f.scrollhome", FKEYWORD, F_SCROLLHOME },
X { "f.scrollleft", FKEYWORD, F_SCROLLLEFT },
X { "f.scrollright", FKEYWORD, F_SCROLLRIGHT },
X { "f.scrollup", FKEYWORD, F_SCROLLUP },
X { "f.showiconmgr", FKEYWORD, F_SHOWLIST },
X { "f.sorticonmgr", FKEYWORD, F_SORTICONMGR },
X { "f.source", FSKEYWORD, F_BEEP }, /* XXX - don't work */
X { "f.stick", FKEYWORD, F_STICK },
X { "f.title", FKEYWORD, F_TITLE },
X { "f.topzoom", FKEYWORD, F_TOPZOOM },
X { "f.twmrc", FKEYWORD, F_RESTART },
X { "f.unfocus", FKEYWORD, F_UNFOCUS },
X { "f.upiconmgr", FKEYWORD, F_UPICONMGR },
X { "f.version", FKEYWORD, F_VERSION },
X { "f.vlzoom", FKEYWORD, F_LEFTZOOM },
X { "f.vrzoom", FKEYWORD, F_RIGHTZOOM },
X { "f.warpring", FSKEYWORD, F_WARPRING },
X { "f.warpto", FSKEYWORD, F_WARPTO },
X { "f.warptoiconmgr", FSKEYWORD, F_WARPTOICONMGR },
X { "f.warptoscreen", FSKEYWORD, F_WARPTOSCREEN },
X { "f.winrefresh", FKEYWORD, F_WINREFRESH },
X { "f.zoom", FKEYWORD, F_ZOOM },
X { "forceicons", KEYWORD, kw0_ForceIcons },
X { "frame", FRAME, 0 },
X { "framepadding", NKEYWORD, kwn_FramePadding },
X { "function", FUNCTION, 0 },
X { "i", ICON, 0 },
X { "icon", ICON, 0 },
X { "iconbackground", CLKEYWORD, kwcl_IconBackground },
X { "iconbordercolor", CLKEYWORD, kwcl_IconBorderColor },
X { "iconborderwidth", NKEYWORD, kwn_IconBorderWidth },
X { "icondirectory", SKEYWORD, kws_IconDirectory },
X { "iconfont", SKEYWORD, kws_IconFont },
X { "iconforeground", CLKEYWORD, kwcl_IconForeground },
X { "iconifybyunmapping", ICONIFY_BY_UNMAPPING, 0 },
X { "iconmanagerbackground", CLKEYWORD, kwcl_IconManagerBackground },
X { "iconmanagerdontshow", ICONMGR_NOSHOW, 0 },
X { "iconmanagerfont", SKEYWORD, kws_IconManagerFont },
X { "iconmanagerforeground", CLKEYWORD, kwcl_IconManagerForeground },
X { "iconmanagergeometry", ICONMGR_GEOMETRY, 0 },
X { "iconmanagerhighlight", CLKEYWORD, kwcl_IconManagerHighlight },
X { "iconmanagers", ICONMGRS, 0 },
X { "iconmanagershow", ICONMGR_SHOW, 0 },
X { "iconmgr", ICONMGR, 0 },
X { "iconregion", ICON_REGION, 0 },
X { "icons", ICONS, 0 },
X { "interpolatemenucolors", KEYWORD, kw0_InterpolateMenuColors },
X { "l", LOCK, 0 },
X { "left", JKEYWORD, J_LEFT },
X { "lefttitlebutton", LEFT_TITLEBUTTON, 0 },
X { "lock", LOCK, 0 },
X { "m", META, 0 },
X { "maketitle", MAKE_TITLE, 0 },
X { "maxwindowsize", SKEYWORD, kws_MaxWindowSize },
X { "menu", MENU, 0 },
X { "menubackground", CKEYWORD, kwc_MenuBackground },
X { "menufont", SKEYWORD, kws_MenuFont },
X { "menuforeground", CKEYWORD, kwc_MenuForeground },
X { "menushadowcolor", CKEYWORD, kwc_MenuShadowColor },
X { "menutitlebackground", CKEYWORD, kwc_MenuTitleBackground },
X { "menutitleforeground", CKEYWORD, kwc_MenuTitleForeground },
X { "meta", META, 0 },
X { "mod", META, 0 }, /* fake it */
X { "monochrome", MONOCHROME, 0 },
X { "move", MOVE, 0 },
X { "movedelta", NKEYWORD, kwn_MoveDelta },
X { "nobackingstore", KEYWORD, kw0_NoBackingStore },
X { "nocasesensitive", KEYWORD, kw0_NoCaseSensitive },
X { "nodefaults", KEYWORD, kw0_NoDefaults },
X { "nograbserver", KEYWORD, kw0_NoGrabServer },
X { "nohighlight", NO_HILITE, 0 },
X { "noiconmanagers", KEYWORD, kw0_NoIconManagers },
X { "nomenushadows", KEYWORD, kw0_NoMenuShadows },
X { "noraiseondeiconify", KEYWORD, kw0_NoRaiseOnDeiconify },
X { "noraiseonmove", KEYWORD, kw0_NoRaiseOnMove },
X { "noraiseonresize", KEYWORD, kw0_NoRaiseOnResize },
X { "noraiseonwarp", KEYWORD, kw0_NoRaiseOnWarp },
X { "north", DKEYWORD, D_NORTH },
X { "nosaveunders", KEYWORD, kw0_NoSaveUnders },
X { "nostackmode", NO_STACKMODE, 0 },
X { "notitle", NO_TITLE, 0 },
X { "notitlefocus", KEYWORD, kw0_NoTitleFocus },
X { "notitlehighlight", NO_TITLE_HILITE, 0 },
X { "noversion", KEYWORD, kw0_NoVersion },
X { "opaquemove", KEYWORD, kw0_OpaqueMove },
X { "pannerbackground", CKEYWORD, kwc_PannerBackground },
X { "pannerbackgroundpixmap", SKEYWORD, kws_PannerBackgroundPixmap },
X { "pannerforeground", CKEYWORD, kwc_PannerForeground },
X { "pannergeometry", SKEYWORD, kws_PannerGeometry },
X { "pannerscale", NKEYWORD, kwn_PannerScale },
X { "pannerstate", SKEYWORD, kws_PannerState },
X { "pixmaps", PIXMAPS, 0 },
X { "r", ROOT, 0 },
X { "randomplacement", KEYWORD, kw0_RandomPlacement },
X { "resize", RESIZE, 0 },
X { "resizefont", SKEYWORD, kws_ResizeFont },
X { "restartpreviousstate", KEYWORD, kw0_RestartPreviousState },
X { "right", JKEYWORD, J_RIGHT },
X { "righttitlebutton", RIGHT_TITLEBUTTON, 0 },
X { "root", ROOT, 0 },
X { "s", SHIFT, 0 },
X { "select", SELECT, 0 },
X { "shift", SHIFT, 0 },
X { "showiconmanager", KEYWORD, kw0_ShowIconManager },
X { "sorticonmanager", KEYWORD, kw0_SortIconManager },
X { "south", DKEYWORD, D_SOUTH },
X { "squeezetitle", SQUEEZE_TITLE, 0 },
X { "starticonified", START_ICONIFIED, 0 },
X { "sticky", STICKY, 0 },
X { "t", TITLE, 0 },
X { "title", TITLE, 0 },
X { "titlebackground", CLKEYWORD, kwcl_TitleBackground },
X { "titlebuttonborderwidth", NKEYWORD, kwn_TitleButtonBorderWidth },
X { "titlefont", SKEYWORD, kws_TitleFont },
X { "titleforeground", CLKEYWORD, kwcl_TitleForeground },
X { "titlehighlight", TITLE_HILITE, 0 },
X { "titlepadding", NKEYWORD, kwn_TitlePadding },
X { "unknownicon", SKEYWORD, kws_UnknownIcon },
X { "usepposition", SKEYWORD, kws_UsePPosition },
X { "virtualdesktop", SKEYWORD, kws_VirtualDesktop },
X { "virtualdesktopbackground",CKEYWORD, kwc_VirtualDesktopBackground },
X { "virtualdesktopbackgroundpixmap",SKEYWORD,
X kws_VirtualDesktopBackgroundPixmap },
X { "virtualdesktopforeground",CKEYWORD, kwc_VirtualDesktopForeground },
X { "w", WINDOW, 0 },
X { "wait", WAIT, 0 },
X { "warpcursor", WARP_CURSOR, 0 },
X { "warpunmapped", KEYWORD, kw0_WarpUnmapped },
X { "west", DKEYWORD, D_WEST },
X { "window", WINDOW, 0 },
X { "windowfunction", WINDOW_FUNCTION, 0 },
X { "windowring", WINDOW_RING, 0 },
X { "xorvalue", NKEYWORD, kwn_XorValue },
X { "zoom", ZOOM, 0 },
X};
X
Xstatic int numkeywords = (sizeof(keytable)/sizeof(keytable[0]));
X
Xint parse_keyword (s, nump)
X char *s;
X int *nump;
X{
X register int lower = 0, upper = numkeywords - 1;
X
X XmuCopyISOLatin1Lowered (s, s);
X while (lower <= upper) {
X int middle = (lower + upper) / 2;
X TwmKeyword *p = &keytable[middle];
X int res = strcmp (p->name, s);
X
X if (res < 0) {
X lower = middle + 1;
X } else if (res == 0) {
X *nump = p->subnum;
X return p->value;
X } else {
X upper = middle - 1;
X }
X }
X return ERRORTOKEN;
X}
X
X
X
X/*
X * action routines called by grammar
X */
X
Xint do_single_keyword (keyword)
X int keyword;
X{
X switch (keyword) {
X case kw0_NoDefaults:
X Scr->NoDefaults = TRUE;
X return 1;
X
X case kw0_AutoRelativeResize:
X Scr->AutoRelativeResize = TRUE;
X return 1;
X
X case kw0_ForceIcons:
X if (Scr->FirstTime) Scr->ForceIcon = TRUE;
X return 1;
X
X case kw0_NoIconManagers:
X Scr->NoIconManagers = TRUE;
X return 1;
X
X case kw0_OpaqueMove:
X Scr->OpaqueMove = TRUE;
X return 1;
X
X case kw0_InterpolateMenuColors:
X if (Scr->FirstTime) Scr->InterpolateMenuColors = TRUE;
X return 1;
X
X case kw0_NoVersion:
X /* obsolete */
X return 1;
X
X case kw0_SortIconManager:
X if (Scr->FirstTime) Scr->SortIconMgr = TRUE;
X return 1;
X
X case kw0_NoGrabServer:
X Scr->NoGrabServer = TRUE;
X return 1;
X
X case kw0_NoMenuShadows:
X if (Scr->FirstTime) Scr->Shadow = FALSE;
X return 1;
X
X case kw0_NoRaiseOnMove:
X if (Scr->FirstTime) Scr->NoRaiseMove = TRUE;
X return 1;
X
X case kw0_NoRaiseOnResize:
X if (Scr->FirstTime) Scr->NoRaiseResize = TRUE;
X return 1;
X
X case kw0_NoRaiseOnDeiconify:
X if (Scr->FirstTime) Scr->NoRaiseDeicon = TRUE;
X return 1;
X
X case kw0_DontMoveOff:
X Scr->DontMoveOff = TRUE;
X return 1;
X
X case kw0_NoBackingStore:
X Scr->BackingStore = FALSE;
X return 1;
X
X case kw0_NoSaveUnders:
X Scr->SaveUnder = FALSE;
X return 1;
X
X case kw0_RestartPreviousState:
X RestartPreviousState = True;
X return 1;
X
X case kw0_ClientBorderWidth:
X if (Scr->FirstTime) Scr->ClientBorderWidth = TRUE;
X return 1;
X
X case kw0_NoTitleFocus:
X Scr->TitleFocus = FALSE;
X return 1;
X
X case kw0_RandomPlacement:
X Scr->RandomPlacement = TRUE;
X return 1;
X
X case kw0_DecorateTransients:
X Scr->DecorateTransients = TRUE;
X return 1;
X
X case kw0_ShowIconManager:
X Scr->ShowIconManager = TRUE;
X return 1;
X
X case kw0_NoCaseSensitive:
X Scr->CaseSensitive = FALSE;
X return 1;
X
X case kw0_NoRaiseOnWarp:
X Scr->NoRaiseWarp = TRUE;
X return 1;
X
X case kw0_WarpUnmapped:
X Scr->WarpUnmapped = TRUE;
X return 1;
X }
X
X return 0;
X}
X
X
Xint do_string_keyword (keyword, s)
X int keyword;
X char *s;
X{
X switch (keyword) {
X case kws_VirtualDesktopBackgroundPixmap:
X Scr->vdtPixmap = s;
X return 1;
X
X case kws_PannerBackgroundPixmap:
X Scr->PannerPixmap = s;
X return 1;
X
X case kws_VirtualDesktop:
X {
X int status, width, height, x, y;
X
X status = XParseGeometry(s, &x, &y, &width, &height);
X if ((status & (WidthValue & HeightValue)) != (WidthValue & HeightValue)) {
X twmrc_error_prefix();
X fprintf (stderr,
X "ignoring invalid VirtualDesktop geometry \"%s\"\n", s);
X } else {
X Scr->VirtualDesktop = True;
X Scr->vdtWidth = width;
X Scr->vdtHeight = height;
X }
X return 1;
X }
X
X case kws_PannerState:
X {
X int state = ParseState(s);
X if (state < 0) {
X twmrc_error_prefix();
X fprintf (stderr,
X "ignoring invalid PannerState argument \"%s\"\n", s);
X } else {
X Scr->PannerState = state;
X }
X return 1;
X }
X
X case kws_PannerGeometry:
X {
X int status, width, height, x, y;
X status = XParseGeometry(s, &x, &y, &width, &height);
X if ((status & (XValue & YValue)) != (XValue & YValue)) {
X twmrc_error_prefix();
X fprintf (stderr,
X "ignoring invalid PannerGeometry \"%s\"\n", s);
X } else {
X Scr->PannerGeometry = s;
X }
X return 1;
X }
X
X case kws_UsePPosition:
X {
X int ppos = ParseUsePPosition (s);
X if (ppos < 0) {
X twmrc_error_prefix();
X fprintf (stderr,
X "ignoring invalid UsePPosition argument \"%s\"\n", s);
X } else {
X Scr->UsePPosition = ppos;
X }
X return 1;
X }
X
X case kws_IconFont:
X if (!Scr->HaveFonts) Scr->IconFont.name = s;
X return 1;
X
X case kws_ResizeFont:
X if (!Scr->HaveFonts) Scr->SizeFont.name = s;
X return 1;
X
X case kws_MenuFont:
X if (!Scr->HaveFonts) Scr->MenuFont.name = s;
X return 1;
X
X case kws_TitleFont:
X if (!Scr->HaveFonts) Scr->TitleBarFont.name = s;
X return 1;
X
X case kws_IconManagerFont:
X if (!Scr->HaveFonts) Scr->IconManagerFont.name = s;
X return 1;
X
X case kws_UnknownIcon:
X if (Scr->FirstTime) GetUnknownIcon (s);
X return 1;
X
X case kws_IconDirectory:
X if (Scr->FirstTime) Scr->IconDirectory = ExpandFilename (s);
X return 1;
X
X case kws_MaxWindowSize:
X JunkMask = XParseGeometry (s, &JunkX, &JunkY, &JunkWidth, &JunkHeight);
X if ((JunkMask & (WidthValue | HeightValue)) !=
X (WidthValue | HeightValue)) {
X twmrc_error_prefix();
X fprintf (stderr, "bad MaxWindowSize \"%s\"\n", s);
X return 0;
X }
X if (JunkWidth <= 0 || JunkHeight <= 0) {
X twmrc_error_prefix();
X fprintf (stderr, "MaxWindowSize \"%s\" must be positive\n", s);
X return 0;
X }
X Scr->MaxWindowWidth = JunkWidth;
X Scr->MaxWindowHeight = JunkHeight;
X return 1;
X }
X
X return 0;
X}
X
X
Xint do_number_keyword (keyword, num)
X int keyword;
X int num;
X{
X switch (keyword) {
X case kwn_PannerScale:
X if (num > 0)
X Scr->PannerScale = num;
X return 1;
X
X case kwn_ConstrainedMoveTime:
X ConstrainedMoveTime = num;
X return 1;
X
X case kwn_MoveDelta:
X Scr->MoveDelta = num;
X return 1;
X
X case kwn_XorValue:
X if (Scr->FirstTime) Scr->XORvalue = num;
X return 1;
X
X case kwn_FramePadding:
X if (Scr->FirstTime) Scr->FramePadding = num;
X return 1;
X
X case kwn_TitlePadding:
X if (Scr->FirstTime) Scr->TitlePadding = num;
X return 1;
X
X case kwn_ButtonIndent:
X if (Scr->FirstTime) Scr->ButtonIndent = num;
X return 1;
X
X case kwn_BorderWidth:
X if (Scr->FirstTime) Scr->BorderWidth = num;
X return 1;
X
X case kwn_IconBorderWidth:
X if (Scr->FirstTime) Scr->IconBorderWidth = num;
X return 1;
X
X case kwn_TitleButtonBorderWidth:
X if (Scr->FirstTime) Scr->TBInfo.border = num;
X return 1;
X
X }
X
X return 0;
X}
X
Xname_list **do_colorlist_keyword (keyword, colormode, s)
X int keyword;
X int colormode;
X char *s;
X{
X switch (keyword) {
X case kwcl_BorderColor:
X GetColor (colormode, &Scr->BorderColor, s);
X return &Scr->BorderColorL;
X
X case kwcl_IconManagerHighlight:
X GetColor (colormode, &Scr->IconManagerHighlight, s);
X return &Scr->IconManagerHighlightL;
X
X case kwcl_BorderTileForeground:
X GetColor (colormode, &Scr->BorderTileC.fore, s);
X return &Scr->BorderTileForegroundL;
X
X case kwcl_BorderTileBackground:
X GetColor (colormode, &Scr->BorderTileC.back, s);
X return &Scr->BorderTileBackgroundL;
X
X case kwcl_TitleForeground:
X GetColor (colormode, &Scr->TitleC.fore, s);
X return &Scr->TitleForegroundL;
X
X case kwcl_TitleBackground:
X GetColor (colormode, &Scr->TitleC.back, s);
X return &Scr->TitleBackgroundL;
X
X case kwcl_IconForeground:
X GetColor (colormode, &Scr->IconC.fore, s);
X return &Scr->IconForegroundL;
X
X case kwcl_IconBackground:
X GetColor (colormode, &Scr->IconC.back, s);
X return &Scr->IconBackgroundL;
X
X case kwcl_IconBorderColor:
X GetColor (colormode, &Scr->IconBorderColor, s);
X return &Scr->IconBorderColorL;
X
X case kwcl_IconManagerForeground:
X GetColor (colormode, &Scr->IconManagerC.fore, s);
X return &Scr->IconManagerFL;
X
X case kwcl_IconManagerBackground:
X GetColor (colormode, &Scr->IconManagerC.back, s);
X return &Scr->IconManagerBL;
X }
X
X return NULL;
X}
X
Xint do_color_keyword (keyword, colormode, s)
X int keyword;
X int colormode;
X char *s;
X{
X switch (keyword) {
X case kwc_PannerBackground:
X GetColor (colormode, &Scr->PannerC.back, s);
X Scr->PannerBackgroundSet = True;
X return 1;
X
X case kwc_PannerForeground:
X GetColor (colormode, &Scr->PannerC.fore, s);
X return 1;
X
X case kwc_VirtualDesktopBackground:
X GetColor (colormode, &Scr->vdtC.back, s);
X Scr->vdtBackgroundSet = True;
X return 1;
X
X case kwc_VirtualDesktopForeground:
X GetColor (colormode, &Scr->vdtC.fore, s);
X return 1;
X
X case kwc_DefaultForeground:
X GetColor (colormode, &Scr->DefaultC.fore, s);
X return 1;
X
X case kwc_DefaultBackground:
X GetColor (colormode, &Scr->DefaultC.back, s);
X return 1;
X
X case kwc_MenuForeground:
X GetColor (colormode, &Scr->MenuC.fore, s);
X return 1;
X
X case kwc_MenuBackground:
X GetColor (colormode, &Scr->MenuC.back, s);
X return 1;
X
X case kwc_MenuTitleForeground:
X GetColor (colormode, &Scr->MenuTitleC.fore, s);
X return 1;
X
X case kwc_MenuTitleBackground:
X GetColor (colormode, &Scr->MenuTitleC.back, s);
X return 1;
X
X case kwc_MenuShadowColor:
X GetColor (colormode, &Scr->MenuShadowColor, s);
X return 1;
X
X }
X
X return 0;
X}
X
X
Xstatic int ParseUsePPosition (s)
X register char *s;
X{
X XmuCopyISOLatin1Lowered (s, s);
X
X if (strcmp (s, "off") == 0) {
X return PPOS_OFF;
X } else if (strcmp (s, "on") == 0) {
X return PPOS_ON;
X } else if (strcmp (s, "non-zero") == 0 ||
X strcmp (s, "nonzero") == 0) {
X return PPOS_NON_ZERO;
X }
X
X return -1;
X}
X
Xstatic int ParseState (s)
X register char *s;
X{
X XmuCopyISOLatin1Lowered (s, s);
X
X if (strcmp (s, "withdrawn") == 0) {
X return WithdrawnState;
X } else if (strcmp (s, "normal") == 0) {
X return NormalState;
X } else if (strcmp (s, "iconic") == 0) {
X return IconicState;
X }
X
X return -1;
X}
X
X
Xdo_squeeze_entry (list, name, justify, num, denom)
X name_list **list; /* squeeze or dont-squeeze list */
X char *name; /* window name */
X int justify; /* left, center, right */
X int num; /* signed num */
X int denom; /* 0 or indicates fraction denom */
X{
X int absnum = (num < 0 ? -num : num);
X
X if (denom < 0) {
X twmrc_error_prefix();
X fprintf (stderr, "negative SqueezeTitle denominator %d\n", denom);
X return;
X }
X if (absnum > denom && denom != 0) {
X twmrc_error_prefix();
X fprintf (stderr, "SqueezeTitle fraction %d/%d outside window\n",
X num, denom);
X return;
X }
X if (denom == 1) {
X twmrc_error_prefix();
X fprintf (stderr, "useless SqueezeTitle faction %d/%d, assuming 0/0\n",
X num, denom);
X num = 0;
X denom = 0;
X }
X
X#ifdef SHAPE
X if (HasShape) {
X SqueezeInfo *sinfo;
X sinfo = (SqueezeInfo *) malloc (sizeof(SqueezeInfo));
X
X if (!sinfo) {
X twmrc_error_prefix();
X fprintf (stderr, "unable to allocate %d bytes for squeeze info\n",
X sizeof(SqueezeInfo));
X return;
X }
X sinfo->justify = justify;
X sinfo->num = num;
X sinfo->denom = denom;
X AddToList (list, name, (char *) sinfo);
X }
X#endif
X}
SHAR_EOF
if test 31268 -ne "`wc -c < parse.c`"
then
echo shar: error transmitting "parse.c" '(should have been 31268 characters)'
fi
fi
if test -f 'resize.c'
then
echo shar: will not over-write existing file "resize.c"
else
echo extracting "resize.c"
sed 's/^X//' >resize.c <<'SHAR_EOF'
X/*****************************************************************************/
X/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/
X/** Salt Lake City, Utah **/
X/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/
X/** Cambridge, Massachusetts **/
X/** **/
X/** All Rights Reserved **/
X/** **/
X/** Permission to use, copy, modify, and distribute this software and **/
X/** its documentation for any purpose and without fee is hereby **/
X/** granted, provided that the above copyright notice appear in all **/
X/** copies and that both that copyright notice and this permis- **/
X/** sion notice appear in supporting documentation, and that the **/
X/** names of Evans & Sutherland and M.I.T. not be used in advertising **/
X/** in publicity pertaining to distribution of the software without **/
X/** specific, written prior permission. **/
X/** **/
X/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/
X/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/
X/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/
X/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/
X/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/
X/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/
X/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/
X/** OR PERFORMANCE OF THIS SOFTWARE. **/
X/*****************************************************************************/
X
X
X/***********************************************************************
X *
X * $XConsortium: resize.c,v 1.69 90/03/27 11:55:03 jim Exp $
X *
X * window resizing borrowed from the "wm" window manager
X *
X * 11-Dec-87 Thomas E. LaStrange File created
X *
X ***********************************************************************/
X
X#if !defined(lint) && !defined(SABER)
Xstatic char RCSinfo[]=
X"$XConsortium: resize.c,v 1.69 90/03/27 11:55:03 jim Exp $";
X#endif
X
X#include <stdio.h>
X#include "twm.h"
X#include "parse.h"
X#include "util.h"
X#include "resize.h"
X#include "add_window.h"
X#include "screen.h"
X
X#define MINHEIGHT 0 /* had been 32 */
X#define MINWIDTH 0 /* had been 60 */
X
Xstatic int dragx; /* all these variables are used */
Xstatic int dragy; /* in resize operations */
Xstatic int dragWidth;
Xstatic int dragHeight;
X
Xstatic int origx;
Xstatic int origy;
Xstatic int origWidth;
Xstatic int origHeight;
X
Xstatic int clampTop;
Xstatic int clampBottom;
Xstatic int clampLeft;
Xstatic int clampRight;
Xstatic int clampDX;
Xstatic int clampDY;
X
Xstatic int last_width;
Xstatic int last_height;
X
X
Xstatic void do_auto_clamp (tmp_win, evp)
X TwmWindow *tmp_win;
X XEvent *evp;
X{
X Window junkRoot;
X int x, y, h, v, junkbw;
X unsigned int junkMask;
X
X switch (evp->type) {
X case ButtonPress:
X x = evp->xbutton.x_root;
X y = evp->xbutton.y_root;
X break;
X case KeyPress:
X x = evp->xkey.x_root;
X y = evp->xkey.y_root;
X break;
X default:
X if (!XQueryPointer (dpy, Scr->Root, &junkRoot, &junkRoot,
X &x, &y, &junkbw, &junkbw, &junkMask))
X return;
X }
X
X h = ((x - dragx) / (dragWidth < 3 ? 1 : (dragWidth / 3)));
X v = ((y - dragy - tmp_win->title_height) /
X (dragHeight < 3 ? 1 : (dragHeight / 3)));
X
X if (h <= 0) {
X clampLeft = 1;
X clampDX = (x - dragx);
X } else if (h >= 2) {
X clampRight = 1;
X clampDX = (x - dragx - dragWidth);
X }
X
X if (v <= 0) {
X clampTop = 1;
X clampDY = (y - dragy);
X } else if (v >= 2) {
X clampBottom = 1;
X clampDY = (y - dragy - dragHeight);
X }
X}
X
X
X/***********************************************************************
X *
X * Procedure:
X * StartResize - begin a window resize operation
X *
X * Inputs:
X * ev - the event structure (button press)
X * tmp_win - the TwmWindow pointer
X * fromtitlebar - action invoked from titlebar button
X *
X ***********************************************************************
X */
X
Xvoid
XStartResize(evp, tmp_win, fromtitlebar)
XXEvent *evp;
XTwmWindow *tmp_win;
XBool fromtitlebar;
X{
X Window junkRoot;
X unsigned int junkbw, junkDepth;
X
X ResizeWindow = tmp_win->frame;
X XGrabServer(dpy);
X XGrabPointer(dpy, Scr->Root, True,
X ButtonPressMask | ButtonReleaseMask,
X GrabModeAsync, GrabModeAsync,
X Scr->Root, Scr->ResizeCursor, CurrentTime);
X
X XGetGeometry(dpy, (Drawable) tmp_win->frame, &junkRoot,
X &dragx, &dragy, (unsigned int *)&dragWidth, (unsigned int *)&dragHeight, &junkbw,
X &junkDepth);
X dragx += tmp_win->frame_bw;
X dragy += tmp_win->frame_bw;
X origx = dragx;
X origy = dragy;
X origWidth = dragWidth;
X origHeight = dragHeight;
X clampTop = clampBottom = clampLeft = clampRight = clampDX = clampDY = 0;
X
X if (Scr->AutoRelativeResize && !fromtitlebar)
X do_auto_clamp (tmp_win, evp);
X
X Scr->SizeStringOffset = SIZE_HINDENT;
X XResizeWindow (dpy, Scr->SizeWindow,
X Scr->SizeStringWidth + SIZE_HINDENT * 2,
X Scr->SizeFont.height + SIZE_VINDENT * 2);
X XMapRaised(dpy, Scr->SizeWindow);
X InstallRootColormap();
X last_width = 0;
X last_height = 0;
X DisplaySize(tmp_win, origWidth, origHeight);
X MoveOutline (Scr->Root, dragx - tmp_win->frame_bw,
X dragy - tmp_win->frame_bw, dragWidth + 2 * tmp_win->frame_bw,
X dragHeight + 2 * tmp_win->frame_bw,
X tmp_win->frame_bw, tmp_win->title_height);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * AddStartResize - begin a window resize operation from AddWindow
X *
X * Inputs:
X * tmp_win - the TwmWindow pointer
X *
X ***********************************************************************
X */
X
Xvoid
XAddStartResize(tmp_win, x, y, w, h)
XTwmWindow *tmp_win;
Xint x, y, w, h;
X{
X XGrabServer(dpy);
X XGrabPointer(dpy, Scr->Root, True,
X ButtonReleaseMask,
X GrabModeAsync, GrabModeAsync,
X Scr->Root, Scr->ResizeCursor, CurrentTime);
X
X dragx = x + tmp_win->frame_bw;
X dragy = y + tmp_win->frame_bw;
X origx = dragx;
X origy = dragy;
X dragWidth = origWidth = w - 2 * tmp_win->frame_bw;
X dragHeight = origHeight = h - 2 * tmp_win->frame_bw;
X clampTop = clampBottom = clampLeft = clampRight = clampDX = clampDY = 0;
X
X if (Scr->AutoRelativeResize) {
X clampRight = clampBottom = 1;
X }
X
X last_width = 0;
X last_height = 0;
X DisplaySize(tmp_win, origWidth, origHeight);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * DoResize - move the rubberband around. This is called for
X * each motion event when we are resizing
X *
X * Inputs:
X * x_root - the X corrdinate in the root window
X * y_root - the Y corrdinate in the root window
X * tmp_win - the current twm window
X *
X ***********************************************************************
X */
X
Xvoid
XDoResize(x_root, y_root, tmp_win)
Xint x_root;
Xint y_root;
XTwmWindow *tmp_win;
X{
X int action;
X
X action = 0;
X
X x_root -= clampDX;
X y_root -= clampDY;
X
X if (clampTop) {
X int delta = y_root - dragy;
X if (dragHeight - delta < MINHEIGHT) {
X delta = dragHeight - MINHEIGHT;
X clampTop = 0;
X }
X dragy += delta;
X dragHeight -= delta;
X action = 1;
X }
X else if (y_root <= dragy/* ||
X y_root == findRootInfo(root)->rooty*/) {
X dragy = y_root;
X dragHeight = origy + origHeight -
X y_root;
X clampBottom = 0;
X clampTop = 1;
X clampDY = 0;
X action = 1;
X }
X if (clampLeft) {
X int delta = x_root - dragx;
X if (dragWidth - delta < MINWIDTH) {
X delta = dragWidth - MINWIDTH;
X clampLeft = 0;
X }
X dragx += delta;
X dragWidth -= delta;
X action = 1;
X }
X else if (x_root <= dragx/* ||
X x_root == findRootInfo(root)->rootx*/) {
X dragx = x_root;
X dragWidth = origx + origWidth -
X x_root;
X clampRight = 0;
X clampLeft = 1;
X clampDX = 0;
X action = 1;
X }
X if (clampBottom) {
X int delta = y_root - dragy - dragHeight;
X if (dragHeight + delta < MINHEIGHT) {
X delta = MINHEIGHT - dragHeight;
X clampBottom = 0;
X }
X dragHeight += delta;
X action = 1;
X }
X else if (y_root >= dragy + dragHeight - 1/* ||
X y_root == findRootInfo(root)->rooty
X + findRootInfo(root)->rootheight - 1*/) {
X dragy = origy;
X dragHeight = 1 + y_root - dragy;
X clampTop = 0;
X clampBottom = 1;
X clampDY = 0;
X action = 1;
X }
X if (clampRight) {
X int delta = x_root - dragx - dragWidth;
X if (dragWidth + delta < MINWIDTH) {
X delta = MINWIDTH - dragWidth;
X clampRight = 0;
X }
X dragWidth += delta;
X action = 1;
X }
X else if (x_root >= dragx + dragWidth - 1/* ||
X x_root == findRootInfo(root)->rootx +
X findRootInfo(root)->rootwidth - 1*/) {
X dragx = origx;
X dragWidth = 1 + x_root - origx;
X clampLeft = 0;
X clampRight = 1;
X clampDX = 0;
X action = 1;
X }
X
X if (action) {
X ConstrainSize (tmp_win, &dragWidth, &dragHeight);
X if (clampLeft)
X dragx = origx + origWidth - dragWidth;
X if (clampTop)
X dragy = origy + origHeight - dragHeight;
X MoveOutline(Scr->Root,
X dragx - tmp_win->frame_bw,
X dragy - tmp_win->frame_bw,
X dragWidth + 2 * tmp_win->frame_bw,
X dragHeight + 2 * tmp_win->frame_bw,
X tmp_win->frame_bw, tmp_win->title_height);
X }
X
X DisplaySize(tmp_win, dragWidth, dragHeight);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * DisplaySize - display the size in the dimensions window
X *
X * Inputs:
X * tmp_win - the current twm window
X * width - the width of the rubber band
X * height - the height of the rubber band
X *
X ***********************************************************************
X */
X
Xvoid
XDisplaySize(tmp_win, width, height)
XTwmWindow *tmp_win;
Xint width;
Xint height;
X{
X char str[100];
X int dwidth;
X int dheight;
X
X if (last_width == width && last_height == height)
X return;
X
X last_width = width;
X last_height = height;
X
X dheight = height - tmp_win->title_height;
X dwidth = width;
X
X /*
X * ICCCM says that PMinSize is the default is no PBaseSize is given,
X * and vice-versa.
X */
X if (tmp_win->hints.flags&(PMinSize|PBaseSize) && tmp_win->hints.flags & PResizeInc)
X {
X if (tmp_win->hints.flags & PBaseSize) {
X dwidth -= tmp_win->hints.base_width;
X dheight -= tmp_win->hints.base_height;
X } else {
X dwidth -= tmp_win->hints.min_width;
X dheight -= tmp_win->hints.min_height;
X }
X }
X
X if (tmp_win->hints.flags & PResizeInc)
X {
X dwidth /= tmp_win->hints.width_inc;
X dheight /= tmp_win->hints.height_inc;
X }
X
X if (tmp_win->w == Scr->Panner) {
X dwidth *= Scr->PannerScale;
X dheight *= Scr->PannerScale;
X }
X (void) sprintf (str, " %4d x %-4d ", dwidth, dheight);
X XRaiseWindow(dpy, Scr->SizeWindow);
X FBF(Scr->DefaultC.fore, Scr->DefaultC.back, Scr->SizeFont.font->fid);
X XDrawImageString (dpy, Scr->SizeWindow, Scr->NormalGC,
X Scr->SizeStringOffset,
X Scr->SizeFont.font->ascent + SIZE_VINDENT,
X str, 13);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * EndResize - finish the resize operation
X *
X ***********************************************************************
X */
X
Xvoid
XEndResize()
X{
X TwmWindow *tmp_win;
X
X#ifdef DEBUG
X fprintf(stderr, "EndResize\n");
X#endif
X
X MoveOutline(Scr->Root, 0, 0, 0, 0, 0, 0);
X XUnmapWindow(dpy, Scr->SizeWindow);
X
X XFindContext(dpy, ResizeWindow, TwmContext, (caddr_t *)&tmp_win);
X
X ConstrainSize (tmp_win, &dragWidth, &dragHeight);
X
X if (dragWidth != tmp_win->frame_width ||
X dragHeight != tmp_win->frame_height)
X tmp_win->zoomed = ZOOM_NONE;
X
X SetupWindow (tmp_win, dragx - tmp_win->frame_bw, dragy - tmp_win->frame_bw,
X dragWidth, dragHeight, -1);
X
X if (tmp_win->iconmgr)
X {
X int ncols = tmp_win->iconmgrp->cur_columns;
X if (ncols == 0) ncols = 1;
X
X tmp_win->iconmgrp->width = (int) ((dragWidth *
X (long) tmp_win->iconmgrp->columns)
X / ncols);
X PackIconManager(tmp_win->iconmgrp);
X }
X
X if (!Scr->NoRaiseResize)
X RaiseFrame(dpy, tmp_win);
X
X UninstallRootColormap();
X
X ResizeWindow = NULL;
X}
X
X/***********************************************************************
X *
X * Procedure:
X * AddEndResize - finish the resize operation for AddWindow
X *
X ***********************************************************************
X */
X
Xvoid
XAddEndResize(tmp_win)
XTwmWindow *tmp_win;
X{
X
X#ifdef DEBUG
X fprintf(stderr, "AddEndResize\n");
X#endif
X
X ConstrainSize (tmp_win, &dragWidth, &dragHeight);
X AddingX = dragx;
X AddingY = dragy;
X AddingW = dragWidth + (2 * tmp_win->frame_bw);
X AddingH = dragHeight + (2 * tmp_win->frame_bw);
X}
X
X/***********************************************************************
X *
X * Procedure:
X * ConstrainSize - adjust the given width and height to account for the
X * constraints imposed by size hints
X *
X * The general algorithm, especially the aspect ratio stuff, is
X * borrowed from uwm's CheckConsistency routine.
X *
X ***********************************************************************/
X
XConstrainSize (tmp_win, widthp, heightp)
X TwmWindow *tmp_win;
X int *widthp, *heightp;
X{
X#define makemult(a,b) ((b==1) ? (a) : (((int)((a)/(b))) * (b)) )
X#define _min(a,b) (((a) < (b)) ? (a) : (b))
X
X int minWidth, minHeight, maxWidth, maxHeight, xinc, yinc, delta;
X int baseWidth, baseHeight;
X int dwidth = *widthp, dheight = *heightp;
X
X
X dheight -= tmp_win->title_height;
X
X if (tmp_win->hints.flags & PMinSize) {
X minWidth = tmp_win->hints.min_width;
X minHeight = tmp_win->hints.min_height;
X } else if (tmp_win->hints.flags & PBaseSize) {
X minWidth = tmp_win->hints.base_width;
X minHeight = tmp_win->hints.base_height;
X } else
X minWidth = minHeight = 1;
X
X if (tmp_win->hints.flags & PBaseSize) {
X baseWidth = tmp_win->hints.base_width;
X baseHeight = tmp_win->hints.base_height;
X } else if (tmp_win->hints.flags & PMinSize) {
X baseWidth = tmp_win->hints.min_width;
X baseHeight = tmp_win->hints.min_height;
X } else
X baseWidth = baseHeight = 0;
X
X
X if (tmp_win->hints.flags & PMaxSize) {
X maxWidth = _min (Scr->MaxWindowWidth, tmp_win->hints.max_width);
X maxHeight = _min (Scr->MaxWindowHeight, tmp_win->hints.max_height);
X } else {
X maxWidth = Scr->MaxWindowWidth;
X maxHeight = Scr->MaxWindowHeight;
X }
X
X if (tmp_win->hints.flags & PResizeInc) {
X xinc = tmp_win->hints.width_inc;
X yinc = tmp_win->hints.height_inc;
X } else
X xinc = yinc = 1;
X
X /*
X * First, clamp to min and max values
X */
X if (dwidth < minWidth) dwidth = minWidth;
X if (dheight < minHeight) dheight = minHeight;
X
X if (dwidth > maxWidth) dwidth = maxWidth;
X if (dheight > maxHeight) dheight = maxHeight;
X
X
X /*
X * Second, fit to base + N * inc
X */
X dwidth = ((dwidth - baseWidth) / xinc * xinc) + baseWidth;
X dheight = ((dheight - baseHeight) / yinc * yinc) + baseHeight;
X
X
X /*
X * Third, adjust for aspect ratio
X */
X#define maxAspectX tmp_win->hints.max_aspect.x
X#define maxAspectY tmp_win->hints.max_aspect.y
X#define minAspectX tmp_win->hints.min_aspect.x
X#define minAspectY tmp_win->hints.min_aspect.y
X if (tmp_win->hints.flags & PAspect)
X {
X if (dwidth * maxAspectX > dheight * maxAspectY)
X {
X delta = makemult(dwidth * maxAspectY / maxAspectX - dheight,
X yinc);
X if (dheight + delta <= maxHeight) dheight += delta;
X else
X {
X delta = makemult(dwidth - maxAspectX*dheight/maxAspectY,
X xinc);
X if (dwidth - delta >= minWidth) dwidth -= delta;
X }
X }
X
X if (dwidth * minAspectX < dheight * minAspectY)
X {
X delta = makemult(minAspectX * dheight / minAspectY - dwidth,
X xinc);
X if (dwidth + delta <= maxWidth) dwidth += delta;
X else
X {
X delta = makemult(dheight - dwidth*minAspectY/minAspectX,
X yinc);
X if (dheight - delta >= minHeight) dheight -= delta;
X }
X }
X }
X
X
X /*
X * Fourth, account for border width and title height
X */
X *widthp = dwidth;
X *heightp = dheight + tmp_win->title_height;
X}
X
X
X/***********************************************************************
X *
X * Procedure:
X * SetupWindow - set window sizes, this was called from either
X * AddWindow, EndResize, or HandleConfigureNotify.
X *
X * Inputs:
X * tmp_win - the TwmWindow pointer
X * x - the x coordinate of the upper-left outer corner of the frame
X * y - the y coordinate of the upper-left outer corner of the frame
X * w - the width of the frame window w/o border
X * h - the height of the frame window w/o border
X * bw - the border width of the frame window or -1 not to change
X *
X * Special Considerations:
X * This routine will check to make sure the window is not completely
X * off the display, if it is, it'll bring some of it back on.
X *
X * The tmp_win->frame_XXX variables should NOT be updated with the
X * values of x,y,w,h prior to calling this routine, since the new
X * values are compared against the old to see whether a synthetic
X * ConfigureNotify event should be sent. (It should be sent if the
X * window was moved but not resized.)
X *
X ***********************************************************************
X */
X
Xvoid SetupWindow (tmp_win, x, y, w, h, bw)
X TwmWindow *tmp_win;
X int x, y, w, h, bw;
X{
X SetupFrame (tmp_win, x, y, w, h, bw, False);
X}
X
Xvoid SetupFrame (tmp_win, x, y, w, h, bw, sendEvent)
X TwmWindow *tmp_win;
X int x, y, w, h, bw;
X Bool sendEvent; /* whether or not to force a send */
X{
X XWindowChanges frame_wc, xwc;
X unsigned long frame_mask, xwcm;
X int title_width, title_height;
X#ifdef SHAPE
X int reShape;
X#endif
X
X#ifdef DEBUG
X fprintf (stderr, "SetupWindow: x=%d, y=%d, w=%d, h=%d, bw=%d\n",
X x, y, w, h, bw);
X#endif
X
X if (!Scr->VirtualDesktop) {
X if (x >= Scr->MyDisplayWidth)
X x = Scr->MyDisplayWidth - 16; /* one "average" cursor width */
X if (y >= Scr->MyDisplayHeight)
X y = Scr->MyDisplayHeight - 16; /* one "average" cursor width */
X }
X if (bw < 0)
X bw = tmp_win->frame_bw; /* -1 means current frame width */
X
X if (tmp_win->iconmgr) {
X tmp_win->iconmgrp->width = w;
X h = tmp_win->iconmgrp->height + tmp_win->title_height;
X }
X
X /*
X * According to the July 27, 1988 ICCCM draft, we should send a
X * "synthetic" ConfigureNotify event to the client if the window
X * was moved but not resized.
X */
X if (((x != tmp_win->frame_x || y != tmp_win->frame_y) &&
X (w == tmp_win->frame_width && h == tmp_win->frame_height)) ||
X (bw != tmp_win->frame_bw))
X sendEvent = TRUE;
X
X xwcm = CWWidth;
X title_width = xwc.width = w;
X title_height = Scr->TitleHeight + bw;
X
X ComputeWindowTitleOffsets (tmp_win, xwc.width, True);
X
X#ifdef SHAPE
X reShape = (tmp_win->wShaped ? TRUE : FALSE);
X if (tmp_win->squeeze_info) /* check for title shaping */
X {
X title_width = tmp_win->rightx + Scr->TBInfo.rightoff;
X if (title_width < xwc.width)
X {
X xwc.width = title_width;
X if (tmp_win->frame_height != h ||
X tmp_win->frame_width != w ||
X tmp_win->frame_bw != bw ||
X title_width != tmp_win->title_width)
X reShape = TRUE;
X }
X else
X {
X if (!tmp_win->wShaped) reShape = TRUE;
X title_width = xwc.width;
X }
X }
X#endif
X
X tmp_win->title_width = title_width;
X if (tmp_win->title_height) tmp_win->title_height = title_height;
X
X if (tmp_win->title_w) {
X if (bw != tmp_win->frame_bw) {
X xwc.border_width = bw;
X tmp_win->title_x = xwc.x = -bw;
X tmp_win->title_y = xwc.y = -bw;
X xwcm |= (CWX | CWY | CWBorderWidth);
X }
X
X XConfigureWindow(dpy, tmp_win->title_w, xwcm, &xwc);
X }
X
X tmp_win->attr.width = w;
X tmp_win->attr.height = h - tmp_win->title_height;
X
X XMoveResizeWindow (dpy, tmp_win->w, 0, tmp_win->title_height,
X w, h - tmp_win->title_height);
X if (tmp_win->w == Scr->Panner)
X ResizeDesktop(w, h-tmp_win->title_height);
X
X /*
X * fix up frame and assign size/location values in tmp_win
X */
X frame_mask = 0;
X if (bw != tmp_win->frame_bw) {
X frame_wc.border_width = tmp_win->frame_bw = bw;
X frame_mask |= CWBorderWidth;
X }
X frame_wc.x = tmp_win->frame_x = x;
X frame_wc.y = tmp_win->frame_y = y;
X frame_wc.width = tmp_win->frame_width = w;
X frame_wc.height = tmp_win->frame_height = h;
X frame_mask |= (CWX | CWY | CWWidth | CWHeight);
X XConfigureWindow (dpy, tmp_win->frame, frame_mask, &frame_wc);
X
X if (tmp_win->virtualWindow) {
X int width, height;
X width = tmp_win->frame_width / Scr->PannerScale;
X height = tmp_win->frame_height / Scr->PannerScale;
X if (width <= 0)
X width = 1;
X if (height <= 0)
X height = 1;
X XMoveResizeWindow(dpy, tmp_win->virtualWindow,
X tmp_win->frame_x / Scr->PannerScale,
X tmp_win->frame_y / Scr->PannerScale,
X width, height);
X }
X /*
X * fix up highlight window
X */
X if (tmp_win->title_height && tmp_win->hilite_w)
X {
X xwc.width = (tmp_win->rightx - tmp_win->highlightx);
X if (Scr->TBInfo.nright > 0) xwc.width -= Scr->TitlePadding;
X if (xwc.width <= 0) {
X xwc.x = Scr->MyDisplayWidth; /* move offscreen */
X xwc.width = 1;
X } else {
X xwc.x = tmp_win->highlightx;
X }
X
X xwcm = CWX | CWWidth;
X XConfigureWindow(dpy, tmp_win->hilite_w, xwcm, &xwc);
X }
X
X#ifdef SHAPE
X if (HasShape && reShape) {
X SetFrameShape (tmp_win);
X }
X#endif
X
X if (sendEvent)
X SendSyntheticConfigureNotify(tmp_win);
X}
X
Xvoid
XSendSyntheticConfigureNotify(tmp_win)
XTwmWindow *tmp_win;
X{
X XEvent client_event;
X
X client_event.type = ConfigureNotify;
X client_event.xconfigure.display = dpy;
X client_event.xconfigure.event = tmp_win->w;
X client_event.xconfigure.window = tmp_win->w;
X client_event.xconfigure.x = (tmp_win->frame_x + tmp_win->frame_bw - tmp_win->old_bw);
X client_event.xconfigure.y = (tmp_win->frame_y + tmp_win->frame_bw +
X tmp_win->title_height - tmp_win->old_bw);
X if (Scr->VirtualDesktop && !tmp_win->sticky) {
X client_event.xconfigure.x -= Scr->vdtPositionX;
X client_event.xconfigure.y -= Scr->vdtPositionY;
X }
X client_event.xconfigure.width = tmp_win->frame_width;
X client_event.xconfigure.height = tmp_win->frame_height -
X tmp_win->title_height;
X client_event.xconfigure.border_width = tmp_win->old_bw;
X /* Real ConfigureNotify events say we're above title window, so ... */
X /* what if we don't have a title ????? */
X client_event.xconfigure.above = tmp_win->frame;
X client_event.xconfigure.override_redirect = False;
X XSendEvent(dpy, tmp_win->w, False, StructureNotifyMask, &client_event);
X}
X
X
X/**********************************************************************
X * Rutgers mod #1 - rocky.
X * Procedure:
X * fullzoom - zooms window to full height of screen or
X * to full height and width of screen. (Toggles
X * so that it can undo the zoom - even when switching
X * between fullzoom and vertical zoom.)
X *
X * Inputs:
X * tmp_win - the TwmWindow pointer
X *
X *
X **********************************************************************
X */
X
Xvoid
Xfullzoom(tmp_win,flag)
XTwmWindow *tmp_win;
Xint flag;
X{
X Window junkRoot;
X unsigned int junkbw, junkDepth;
X
X XGetGeometry(dpy, (Drawable) tmp_win->frame, &junkRoot,
X &dragx, &dragy, (unsigned int *)&dragWidth, (unsigned int *)&dragHeight, &junkbw,
X &junkDepth);
X
X if (tmp_win->zoomed == flag)
X {
X dragHeight = tmp_win->save_frame_height;
X dragWidth = tmp_win->save_frame_width;
X dragx = tmp_win->save_frame_x;
X dragy = tmp_win->save_frame_y;
X tmp_win->zoomed = ZOOM_NONE;
X }
X else
X {
X if (tmp_win->zoomed == ZOOM_NONE)
X {
X tmp_win->save_frame_x = dragx;
X tmp_win->save_frame_y = dragy;
X tmp_win->save_frame_width = dragWidth;
X tmp_win->save_frame_height = dragHeight;
X tmp_win->zoomed = flag;
X }
X else
X tmp_win->zoomed = flag;
X
X
X switch (flag)
X {
X case ZOOM_NONE:
X break;
X case F_ZOOM:
X dragHeight = Scr->MyDisplayHeight;
X dragy=0;
X break;
X case F_HORIZOOM:
X dragx = 0;
X dragWidth = Scr->MyDisplayWidth;
X break;
X case F_FULLZOOM:
X dragx = 0;
X dragy = 0;
X dragHeight = Scr->MyDisplayHeight;
X dragWidth = Scr->MyDisplayWidth;
X break;
X case F_LEFTZOOM:
X dragx = 0;
X dragy = 0;
X dragHeight = Scr->MyDisplayHeight;
X dragWidth = Scr->MyDisplayWidth/2;
X break;
X case F_RIGHTZOOM:
X dragx = Scr->MyDisplayWidth/2;
X dragy = 0;
X dragHeight = Scr->MyDisplayHeight;
X dragWidth = Scr->MyDisplayWidth/2;
X break;
X case F_TOPZOOM:
X dragx = 0;
X dragy = 0;
X dragHeight = Scr->MyDisplayHeight/2;
X dragWidth = Scr->MyDisplayWidth;
X break;
X case F_BOTTOMZOOM:
X dragx = 0;
X dragy = Scr->MyDisplayHeight/2;
X dragHeight = Scr->MyDisplayHeight/2;
X dragWidth = Scr->MyDisplayWidth;
X break;
X }
X }
X
X if (!Scr->NoRaiseResize)
X RaiseFrame(dpy, tmp_win);
X
X dragHeight -= tmp_win->title_height;
X
X if (tmp_win->hints.flags&PMinSize && tmp_win->hints.flags & PResizeInc)
X {
X dragWidth -= tmp_win->hints.min_width;
X dragHeight -= tmp_win->hints.min_height;
X }
X
X if (tmp_win->hints.flags & PResizeInc)
X {
X dragWidth /= tmp_win->hints.width_inc;
X dragHeight /= tmp_win->hints.height_inc;
X
X dragWidth *= tmp_win->hints.width_inc;
X dragHeight *= tmp_win->hints.height_inc;
X }
X
X if (tmp_win->hints.flags&PMinSize && tmp_win->hints.flags & PResizeInc)
X {
X dragWidth += tmp_win->hints.min_width;
X dragHeight += tmp_win->hints.min_height;
X }
X
X dragHeight += tmp_win->title_height;
X
X SetupWindow (tmp_win, dragx , dragy , dragWidth, dragHeight, -1);
X XUngrabPointer (dpy, CurrentTime);
X XUngrabServer (dpy);
X}
X
X#ifdef SHAPE
XSetFrameShape (tmp)
X TwmWindow *tmp;
X{
X /*
X * see if the titlebar needs to move
X */
X if (tmp->title_w) {
X int oldx = tmp->title_x, oldy = tmp->title_y;
X ComputeTitleLocation (tmp);
X if (oldx != tmp->title_x || oldy != tmp->title_y)
X XMoveWindow (dpy, tmp->title_w, tmp->title_x, tmp->title_y);
X }
X
X /*
X * The frame consists of the shape of the contents window offset by
X * title_height or'ed with the shape of title_w (which is always
X * rectangular).
X */
X if (tmp->wShaped) {
X /*
X * need to do general case
X */
X XShapeCombineShape (dpy, tmp->frame, ShapeBounding,
X 0, tmp->title_height, tmp->w,
X ShapeBounding, ShapeSet);
X if (tmp->title_w) {
X XShapeCombineShape (dpy, tmp->frame, ShapeBounding,
X tmp->title_x + tmp->frame_bw,
X tmp->title_y + tmp->frame_bw,
X tmp->title_w, ShapeBounding,
X ShapeUnion);
X }
X } else {
X /*
X * can optimize rectangular contents window
X */
X if (tmp->squeeze_info) {
X XRectangle newBounding[2];
X XRectangle newClip[2];
X int fbw2 = 2 * tmp->frame_bw;
X
X /*
X * Build the border clipping rectangles; one around title, one
X * around window. The title_[xy] field already have had frame_bw
X * subtracted off them so that they line up properly in the frame.
X *
X * The frame_width and frame_height do *not* include borders.
X */
X /* border */
X newBounding[0].x = tmp->title_x;
X newBounding[0].y = tmp->title_y;
X newBounding[0].width = tmp->title_width + fbw2;
X newBounding[0].height = tmp->title_height;
X newBounding[1].x = -tmp->frame_bw;
X newBounding[1].y = Scr->TitleHeight;
X newBounding[1].width = tmp->attr.width + fbw2;
X newBounding[1].height = tmp->attr.height + fbw2;
X XShapeCombineRectangles (dpy, tmp->frame, ShapeBounding, 0, 0,
X newBounding, 2, ShapeSet, YXBanded);
X /* insides */
X newClip[0].x = tmp->title_x + tmp->frame_bw;
X newClip[0].y = 0;
X newClip[0].width = tmp->title_width;
X newClip[0].height = Scr->TitleHeight;
X newClip[1].x = 0;
X newClip[1].y = tmp->title_height;
X newClip[1].width = tmp->attr.width;
X newClip[1].height = tmp->attr.height;
X XShapeCombineRectangles (dpy, tmp->frame, ShapeClip, 0, 0,
X newClip, 2, ShapeSet, YXBanded);
X } else {
X (void) XShapeCombineMask (dpy, tmp->frame, ShapeBounding, 0, 0,
X None, ShapeSet);
X (void) XShapeCombineMask (dpy, tmp->frame, ShapeClip, 0, 0,
X None, ShapeSet);
X }
X }
X}
X#endif
X
X/*
X * Squeezed Title:
X *
X * tmp->title_x
X * 0 |
X * tmp->title_y ........+--------------+......... -+,- tmp->frame_bw
X * 0 : ......| +----------+ |....... : -++
X * : : | | | | : : ||-Scr->TitleHeight
X * : : | | | | : : ||
X * +-------+ +----------+ +--------+ -+|-tmp->title_height
X * | +---------------------------+ | --+
X * | | | |
X * | | | |
X * | | | |
X * | | | |
X * | | | |
X * | +---------------------------+ |
X * +-------------------------------+
X *
X *
X * Unsqueezed Title:
X *
X * tmp->title_x
X * | 0
X * tmp->title_y +-------------------------------+ -+,tmp->frame_bw
X * 0 | +---------------------------+ | -+'
X * | | | | |-Scr->TitleHeight
X * | | | | |
X * + +---------------------------+ + -+
X * |-+---------------------------+-|
X * | | | |
X * | | | |
X * | | | |
X * | | | |
X * | | | |
X * | +---------------------------+ |
X * +-------------------------------+
X *
X *
X *
X * Dimensions and Positions:
X *
X * frame orgin (0, 0)
X * frame upper left border (-tmp->frame_bw, -tmp->frame_bw)
X * frame size w/o border tmp->frame_width , tmp->frame_height
X * frame/title border width tmp->frame_bw
X * extra title height w/o bdr tmp->title_height = TitleHeight + frame_bw
X * title window height Scr->TitleHeight
X * title origin w/o border (tmp->title_x, tmp->title_y)
X * client origin (0, Scr->TitleHeight + tmp->frame_bw)
X * client size tmp->attr.width , tmp->attr.height
X *
X * When shaping, need to remember that the width and height of rectangles
X * are really deltax and deltay to lower right handle corner, so they need
X * to have -1 subtracted from would normally be the actual extents.
X */
SHAR_EOF
if test 32907 -ne "`wc -c < resize.c`"
then
echo shar: error transmitting "resize.c" '(should have been 32907 characters)'
fi
fi
# end of shell archive
exit 0
dan
----------------------------------------------------
O'Reilly && Associates argv at sun.com / argv at ora.com
Opinions expressed reflect those of the author only.
More information about the Comp.sources.x
mailing list