jkh@COGSCI.BERKELEY.EDU (Jordan K. Hubbard) (12/13/87)
# This is a shell archive. Remove anything before this line, then # unpack it by saving it in a file and typing "sh file". (Files # unpacked will be owned by you and have default permissions.) # # This archive contains: # uwm.patches.1 # This is archive 2 of 3. Apply with patch -p # echo x - uwm.patches.1 sed 's/^ //' > "uwm.patches.1" << '//E*O*F uwm.patches.1//' *** uwm.new/Bindings.c Mon Dec 7 00:59:27 1987 --- uwm.new/Bindings.c Sat Dec 12 09:52:26 1987 *************** *** 48,55 */ char *DefaultBindings[] = { ! "resetbindings;resetvariables;resetmenus;noautoselect;delta=5;freeze", ! "grid;zap;pushabsolute;push=1;hiconpad=5;viconpad=5;hmenupad=3;vmenupad=0", "iconfont=fixed;menufont=fixed;resizefont=fixed;volume=0", "f.newiconify=m:w|i:delta l", "f.raise=m:w|i:delta l", --- 48,56 ----- */ char *DefaultBindings[] = { ! "resetbindings;resetvariables;resetmenus;noautoselect;noautoraise;title", ! "rootresizebox;delta=5;freeze;grid;zap", ! "pushabsolute;push=1;hiconpad=5;viconpad=5;hmenupad=3;vmenupad=0", "iconfont=fixed;menufont=fixed;resizefont=fixed;volume=0", "f.newiconify=m:w|i:delta l", "f.raise=m:w|i:delta l", *** uwm.new/GetButton.c Mon Dec 7 00:59:31 1987 --- uwm.new/GetButton.c Sat Dec 12 19:05:30 1987 *************** *** 41,46 * 002 -- L. Guarino Reid, DEC Ultrix Engineering Group * April 16, 1987 * Convert to X11 */ #ifndef lint --- 41,48 ----- * 002 -- L. Guarino Reid, DEC Ultrix Engineering Group * April 16, 1987 * Convert to X11 + * 003 -- J. Hubbard, U.C. Berkeley. + * December 3, 1987. */ #ifndef lint *************** *** 59,64 #include <X11/Xatom.h> #define ICONSTR (icon_str ? icon_str : "") Bool GetButton(button_event) XEvent *button_event; /* Button event packet. */ --- 61,68 ----- #include <X11/Xatom.h> #define ICONSTR (icon_str ? icon_str : "") + /* Amount of padding between text in a title bar and the edge of the bar */ + #define PAD 1 Bool GetButton(b_ev) XEvent *b_ev; /* Button event packet. */ *************** *** 60,67 #define ICONSTR (icon_str ? icon_str : "") ! Bool GetButton(button_event) ! XEvent *button_event; /* Button event packet. */ { #define STRLEN 50 XKeyPressedEvent *kp_event; /* Key pressed event. */ --- 64,71 ----- /* Amount of padding between text in a title bar and the edge of the bar */ #define PAD 1 ! Bool GetButton(b_ev) ! XEvent *b_ev; /* Button event packet. */ { #define STRLEN 50 XKeyPressedEvent *kp_event; /* Key pressed event. */ *************** *** 79,84 char kbd_str[STRLEN]; /* Keyboard string. */ int nbytes; /* Keyboard string length. */ int i; /* Iteration counter. */ /* --- 83,91 ----- char kbd_str[STRLEN]; /* Keyboard string. */ int nbytes; /* Keyboard string length. */ int i; /* Iteration counter. */ + extern int Fheight; /* the height of a title bar */ + Window win; /* scratch */ + TitleData *dat; /* ditto */ /* *************** *** 85,91 * Get next event from input queue and store it in the event packet * passed to GetButton. */ ! XNextEvent(dpy, button_event); /* * The event occured on the root window, check for substructure --- 92,98 ----- * Get next event from input queue and store it in the event packet * passed to GetButton. */ ! XNextEvent(dpy, b_ev); /* * The event occured on the root window, check for substructure *************** *** 91,97 * The event occured on the root window, check for substructure * changes. Otherwise, it must be a mouse button event. */ ! if (((XAnyEvent *)button_event)->window == RootWindow(dpy, scr)) { switch (button_event->type) { --- 98,104 ----- * The event occured on the root window, check for substructure * changes. Otherwise, it must be a mouse button event. */ ! if (b_ev->xany.window == RootWindow(dpy, scr)) { switch (b_ev->type) { case CreateNotify: *************** *** 93,99 */ if (((XAnyEvent *)button_event)->window == RootWindow(dpy, scr)) { ! switch (button_event->type) { case CreateNotify: case UnmapNotify: --- 100,115 ----- */ if (b_ev->xany.window == RootWindow(dpy, scr)) { ! switch (b_ev->type) { ! case CreateNotify: ! case UnmapNotify: ! case ReparentNotify: ! case ConfigureNotify: ! case GravityNotify: ! case MapNotify: ! case MappingNotify: ! case CirculateNotify: ! return(FALSE); case MapRequest: CheckMap(b_ev->xmap.window); *************** *** 95,112 switch (button_event->type) { ! case CreateNotify: ! case UnmapNotify: ! case ReparentNotify: ! case ConfigureNotify: ! case GravityNotify: ! case MapNotify: ! case MappingNotify: ! case CirculateNotify: return(FALSE); ! ! case MapRequest: ! CheckMap(((XMapEvent *)button_event)->window); ! return(FALSE); case ConfigureRequest: Configure((XConfigureEvent *)button_event); --- 111,119 ----- case CirculateNotify: return(FALSE); ! case MapRequest: ! CheckMap(b_ev->xmap.window); ! return(FALSE); case ConfigureRequest: Configure((XConfigureEvent *)b_ev); *************** *** 108,116 CheckMap(((XMapEvent *)button_event)->window); return(FALSE); ! case ConfigureRequest: ! Configure((XConfigureEvent *)button_event); ! return(FALSE); case CirculateRequest: Circulate((XCirculateEvent *)button_event); --- 115,123 ----- CheckMap(b_ev->xmap.window); return(FALSE); ! case ConfigureRequest: ! Configure((XConfigureEvent *)b_ev); ! return(FALSE); case CirculateRequest: Circulate((XCirculateEvent *)b_ev); *************** *** 112,120 Configure((XConfigureEvent *)button_event); return(FALSE); ! case CirculateRequest: ! Circulate((XCirculateEvent *)button_event); ! return(FALSE); case DestroyNotify: RemoveIcon(((XDestroyWindowEvent *)button_event)->window); --- 119,127 ----- Configure((XConfigureEvent *)b_ev); return(FALSE); ! case CirculateRequest: ! Circulate((XCirculateEvent *)b_ev); ! return(FALSE); case DestroyNotify: RemoveIcon(b_ev->xdestroywindow.window); *************** *** 116,124 Circulate((XCirculateEvent *)button_event); return(FALSE); ! case DestroyNotify: ! RemoveIcon(((XDestroyWindowEvent *)button_event)->window); ! return(FALSE); case FocusIn: if (((XFocusInEvent *)button_event)->detail --- 123,131 ----- Circulate((XCirculateEvent *)b_ev); return(FALSE); ! case DestroyNotify: ! RemoveIcon(b_ev->xdestroywindow.window); ! return(FALSE); case FocusIn: if (b_ev->xfocus.detail == NotifyPointerRoot) { *************** *** 120,134 RemoveIcon(((XDestroyWindowEvent *)button_event)->window); return(FALSE); ! case FocusIn: ! if (((XFocusInEvent *)button_event)->detail ! == NotifyPointerRoot) { ! if (FocusSetByUser) { ! XSetInputFocus(dpy, PointerRoot, None, CurrentTime); ! FocusSetByUser = FALSE; ! } ! } ! return (FALSE); case FocusOut: if (((XFocusOutEvent *)button_event)->detail --- 127,141 ----- RemoveIcon(b_ev->xdestroywindow.window); return(FALSE); ! case FocusIn: ! if (b_ev->xfocus.detail == NotifyPointerRoot) { ! if (FocusSetByUser) { ! XSetInputFocus(dpy, PointerRoot, None, ! CurrentTime); ! FocusSetByUser = FALSE; ! } ! } ! return (FALSE); case FocusOut: if (b_ev->xfocus.detail == NotifyPointerRoot) { *************** *** 130,143 } return (FALSE); ! case FocusOut: ! if (((XFocusOutEvent *)button_event)->detail ! == NotifyPointerRoot) { ! if (!FocusSetByUser) { ! XSetInputFocus(dpy, PointerRoot, None, CurrentTime); ! } ! } ! return (FALSE); case ButtonPress: case ButtonRelease: --- 137,149 ----- } return (FALSE); ! case FocusOut: ! if (b_ev->xfocus.detail == NotifyPointerRoot) { ! if (FocusSetByUser == FALSE) ! XSetInputFocus(dpy, PointerRoot, None, ! CurrentTime); ! } ! return (FALSE); case ButtonPress: case ButtonRelease: *************** *** 139,147 } return (FALSE); ! case ButtonPress: ! case ButtonRelease: ! return(TRUE); default: printf("uwm internal error: unexpected event on Root Window\n"); --- 145,153 ----- } return (FALSE); ! case ButtonPress: ! case ButtonRelease: ! return(TRUE); default: printf("uwm internal error: unexpected event on Root Window\n"); *************** *** 143,152 case ButtonRelease: return(TRUE); ! default: ! printf("uwm internal error: unexpected event on Root Window\n"); ! return(FALSE); ! } } /* --- 149,158 ----- case ButtonRelease: return(TRUE); ! default: ! printf("uwm internal error: unexpected event on Root Window\n"); ! return(FALSE); ! } } /* *************** *** 153,167 * If the event type is EnterWindow, LeaveWindow, or MouseMoved, * we are processing a menu. * If the event type is ButtonPress or ButtonRelease, ! * we have a button event. */ ! switch (button_event->type) { ! case EnterNotify: ! case LeaveNotify: ! case MotionNotify: ! case ButtonPress: ! case ButtonRelease: ! return(TRUE); ! default: break; } /* --- 159,227 ----- * If the event type is EnterWindow, LeaveWindow, or MouseMoved, * we are processing a menu. * If the event type is ButtonPress or ButtonRelease, ! * we have a button event. ! * If it's an expose, then we may have exposed a title bar. ! * If it's a Notify, we've probably frobbed a titled window. ! */ ! ! win = b_ev->xany.window; ! ! switch (b_ev->type) { ! ! case EnterNotify: ! HandleFocusIn(b_ev); ! return(FALSE); ! ! case LeaveNotify: ! HandleFocusOut(b_ev); ! return(FALSE); ! ! case ConfigureRequest: ! if ((dat = GetTitleInfo(win)) != NULL) { ! ConfigureTitle(dat, b_ev->xconfigure.x, ! b_ev->xconfigure.y - (Fheight + 2), ! b_ev->xconfigure.width, b_ev->xconfigure.height); ! } ! return(FALSE); ! ! case MapNotify: ! case MapRequest: ! break; ! ! case DestroyNotify: ! if ((dat = GetTitleInfo(win)) != NULL) { ! DestroyTitle(dat, True); ! return(FALSE); ! } ! break; ! ! case UnmapNotify: ! if ((dat = GetTitleInfo(win)) != NULL) { ! XUnmapWindow(dpy, dat->parent); ! return(FALSE); ! } ! break; ! ! case MotionNotify: ! case ButtonPress: ! case ButtonRelease: ! return(TRUE); ! ! case Expose: ! if ((dat = GetTitleInfo(win)) != NULL && dat->title == win) { ! if (b_ev->xexpose.count == 0) { ! while (Eventp(dat->title, Expose, True)); ! PaintTitle(dat); ! } ! return(FALSE); ! } ! break; ! ! default: ! /* fprintf(stderr, "non root event type: %d window %x (%d, %d)\n", ! b_ev->type, b_ev->xbutton.window, ! b_ev->xbutton.x, b_ev->xbutton.y); */ ! break; } /* *************** *** 165,172 } /* ! * Ok, if the event is not on the root window it must be an event on ! * one of the icons owned by uwm. */ icon = ((XAnyEvent *)button_event)->window; --- 225,232 ----- } /* ! * Ok, if the event is not on the root window and it's not a title bar, ! * it must be an event on one of the icons owned by uwm. */ icon = b_ev->xany.window; *************** *** 168,174 * Ok, if the event is not on the root window it must be an event on * one of the icons owned by uwm. */ ! icon = ((XAnyEvent *)button_event)->window; /* * Find out current information about the icon window. --- 228,234 ----- * Ok, if the event is not on the root window and it's not a title bar, * it must be an event on one of the icons owned by uwm. */ ! icon = b_ev->xany.window; /* * Find out current information about the icon window. *************** *** 180,192 * If the event is an UnmapWindow event or a ConfigureNotify event, * then return FALSE. */ ! if (button_event->type == MapNotify || ! button_event->type == UnmapNotify || ! button_event->type == CreateNotify || ! button_event->type == ReparentNotify || ! button_event->type == GravityNotify || ! button_event->type == CirculateNotify || ! button_event->type == ConfigureNotify) return(FALSE); /* --- 240,252 ----- * If the event is an UnmapWindow event or a ConfigureNotify event, * then return FALSE. */ ! if (b_ev->type == MapNotify || ! b_ev->type == UnmapNotify || ! b_ev->type == CreateNotify || ! b_ev->type == ReparentNotify || ! b_ev->type == GravityNotify || ! b_ev->type == CirculateNotify || ! b_ev->type == ConfigureNotify) return(FALSE); /* *************** *** 208,214 * is not of zero length, simply repaint the text in the icon window * and return FALSE. */ ! if (button_event->type == Expose && (!Freeze || Frozen == 0)) { if (icon_info.width != XTextWidth(IFontInfo, ICONSTR, strlen(ICONSTR))+(HIconPad << 1)) { XResizeWindow(dpy, icon, --- 268,274 ----- * is not of zero length, simply repaint the text in the icon window * and return FALSE. */ ! if (b_ev->type == Expose && (!Freeze || Frozen == 0)) { if (icon_info.width != XTextWidth(IFontInfo, ICONSTR, strlen(ICONSTR))+(HIconPad << 1)) { XResizeWindow(dpy, icon, *************** *** 231,237 /* * If we have gotten this far event can only be a key pressed event. */ ! kp_event = (XKeyPressedEvent *) button_event; /* * We convert the key pressed event to ascii. --- 291,297 ----- /* * If we have gotten this far event can only be a key pressed event. */ ! kp_event = (XKeyPressedEvent *) b_ev; /* * We convert the key pressed event to ascii. *************** *** 356,361 Bool configureit = False; Window jW; int border_width, j; /* * Gather info about the event window. --- 416,422 ----- Bool configureit = False; Window jW; int border_width, j; + TitleData *dat = 0; /* * Gather info about the event window. *************** *** 364,370 /* if it's a transient window, we won't rubber-band * note that this call always sets transient_for. */ ! if (XGetTransientForHint( dpy, window, &transient_for )) { XGetGeometry( dpy, window, &jW, &x, &y, &w, &h, &border_width, &j ); } else { --- 425,431 ----- /* if it's a transient window, we won't rubber-band * note that this call always sets transient_for. */ ! if (XGetTransientForHint( dpy, window, &transient_for )) XGetGeometry( dpy, window, &jW, &x, &y, &w, &h, &border_width, &j ); else { if ((wmhints = XGetWMHints(dpy, window))) { *************** *** 366,372 */ if (XGetTransientForHint( dpy, window, &transient_for )) { XGetGeometry( dpy, window, &jW, &x, &y, &w, &h, &border_width, &j ); - } else { if ((wmhints = XGetWMHints(dpy, window)) && (wmhints->flags&StateHint) && --- 427,432 ----- */ if (XGetTransientForHint( dpy, window, &transient_for )) XGetGeometry( dpy, window, &jW, &x, &y, &w, &h, &border_width, &j ); else { if ((wmhints = XGetWMHints(dpy, window))) { if ((wmhints->flags&StateHint) && *************** *** 368,381 XGetGeometry( dpy, window, &jW, &x, &y, &w, &h, &border_width, &j ); } else { ! if ((wmhints = XGetWMHints(dpy, window)) && ! (wmhints->flags&StateHint) && ! (wmhints->initial_state == IconicState)) { ! /* window will remain created size -- no rubberbanding */ ! /* note that Iconify only uses its first argument */ ! Iconify(window, 0, 0, 0, 0); ! return; ! } sizehints.flags = 0; --- 428,457 ----- if (XGetTransientForHint( dpy, window, &transient_for )) XGetGeometry( dpy, window, &jW, &x, &y, &w, &h, &border_width, &j ); else { ! if ((wmhints = XGetWMHints(dpy, window))) { ! if ((wmhints->flags&StateHint) && ! (wmhints->initial_state == IconicState)) ! { ! /* window will remain created size -- no rubberbanding */ ! /* note that Iconify only uses its first argument */ ! XFree(wmhints); ! Iconify(window, 0, 0, 0, 0); ! return; ! } ! XFree(wmhints); ! } ! if (Titles) { ! if ((dat = GetTitleInfo(window)) == NULL) { ! AddTitle(window, False); ! dat = GetTitleInfo(window); ! if (!dat) ! Error("uwm: Can't get info for new title!"); ! } ! else { ! window = dat->parent; ! } ! } ! sizehints.flags = 0; XGetSizeHints(dpy, window, &sizehints, XA_WM_NORMAL_HINTS); CheckConsistency(&sizehints); *************** *** 377,383 return; } ! sizehints.flags = 0; XGetSizeHints(dpy, window, &sizehints, XA_WM_NORMAL_HINTS); CheckConsistency(&sizehints); --- 453,464 ----- } sizehints.flags = 0; ! XGetSizeHints(dpy, window, &sizehints, XA_WM_NORMAL_HINTS); ! CheckConsistency(&sizehints); ! AskUser(dpy, scr, window, &x, &y, &w, &h, &sizehints); ! if (x != sizehints.x || y != sizehints.y || w != sizehints.width || ! h != sizehints.height) ! configureit = True; sizehints.flags |= (USPosition | USSize); sizehints.x = x; *************** *** 379,390 sizehints.flags = 0; ! XGetSizeHints(dpy, window, &sizehints, XA_WM_NORMAL_HINTS); ! CheckConsistency(&sizehints); ! AskUser(dpy, scr, window, &x, &y, &w, &h, &sizehints); ! if (x != sizehints.x || y != sizehints.y || ! w != sizehints.width || h != sizehints.height) ! configureit = True; sizehints.flags |= (USPosition | USSize); sizehints.x = x; --- 460,474 ----- h != sizehints.height) configureit = True; ! sizehints.flags |= (USPosition | USSize); ! sizehints.x = x; ! sizehints.y = y; ! sizehints.width = w; ! sizehints.height = h; ! XSetSizeHints(dpy, window, &sizehints, XA_WM_NORMAL_HINTS); ! if (dat) ! XSetSizeHints(dpy, dat->parent, &sizehints, XA_WM_NORMAL_HINTS); ! } if (x < 0 || y < 0) { if (transient_for == None) /* need the border width */ *************** *** 386,398 w != sizehints.width || h != sizehints.height) configureit = True; ! sizehints.flags |= (USPosition | USSize); ! sizehints.x = x; ! sizehints.y = y; ! sizehints.width = w; ! sizehints.height = h; ! XSetSizeHints(dpy, window, &sizehints, XA_WM_NORMAL_HINTS); ! } if (x<0 || y<0) { if (transient_for == None) /* need the border width */ --- 470,478 ----- XSetSizeHints(dpy, dat->parent, &sizehints, XA_WM_NORMAL_HINTS); } ! if (x < 0 || y < 0) { ! if (transient_for == None) /* need the border width */ ! XGetGeometry(dpy, window, &jW, &j, &j, &j, &j, &border_width, &j); if (x<0) x += DisplayWidth(dpy, scr) - w - (border_width<<1); if (y<0) y += DisplayHeight(dpy, scr) - h - (border_width<<1); *************** *** 394,403 XSetSizeHints(dpy, window, &sizehints, XA_WM_NORMAL_HINTS); } - if (x<0 || y<0) { - if (transient_for == None) /* need the border width */ - XGetGeometry( dpy, window, &jW, &j, &j, &j, &j, &border_width, &j ); - if (x<0) x += DisplayWidth(dpy, scr) - w - (border_width<<1); if (y<0) y += DisplayHeight(dpy, scr) - h - (border_width<<1); --- 474,479 ----- if (transient_for == None) /* need the border width */ XGetGeometry(dpy, window, &jW, &j, &j, &j, &j, &border_width, &j); if (x<0) x += DisplayWidth(dpy, scr) - w - (border_width<<1); if (y<0) y += DisplayHeight(dpy, scr) - h - (border_width<<1); *************** *** 403,413 configureit = True; } ! ! if (configureit) ! XMoveResizeWindow(dpy, window, x, y, w, h); ! ! XMapRaised(dpy, window); } Configure(event) --- 479,495 ----- configureit = True; } ! if (configureit) { ! if (dat != NULL) ! ConfigureTitle(dat, x, y, w, h); ! else ! XMoveResizeWindow(dpy, window, x, y, w, h); ! } ! if (!dat) ! XMapRaised(dpy, window); ! else ! XMapRaised(dpy, dat->parent); ! XSelectInput(dpy, window, (EnterWindowMask | LeaveWindowMask)); } Configure(event) *************** *** 413,427 Configure(event) XConfigureRequestEvent *event; { ! XWindowChanges values; ! ! values.x = event->x; ! values.y = event->y; ! values.width = event->width; ! values.height = event->height; ! values.border_width = event->border_width; ! values.stack_mode = event->detail; ! values.sibling = event->above; XConfigureWindow(event->display, event->window, event->value_mask, &values); } --- 495,502 ----- Configure(event) XConfigureRequestEvent *event; { ! XWindowChanges values; ! TitleData *dat; values.x = event->x; values.y = event->y; *************** *** 423,429 values.stack_mode = event->detail; values.sibling = event->above; ! XConfigureWindow(event->display, event->window, event->value_mask, &values); } Circulate(event) --- 498,512 ----- XWindowChanges values; TitleData *dat; ! values.x = event->x; ! values.y = event->y; ! values.width = event->width; ! values.height = event->height; ! values.border_width = event->border_width; ! values.stack_mode = event->detail; ! values.sibling = event->above; ! ! XConfigureWindow(event->display, event->window, event->value_mask, &values); } Circulate(event) *************** *** 434,437 else XLowerWindow(event->display, event->window); } - --- 517,519 ----- else XLowerWindow(event->display, event->window); } *** uwm.new/Imakefile Mon Dec 7 00:59:32 1987 --- uwm.new/Imakefile Sat Dec 12 19:23:34 1987 *************** *** 1,4 ! LOCAL_LIBRARIES = $(XLIB) SYS_LIBRARIES = -ll OTHERSRCS = gram.y lex.l YFLAGS = -d --- 1,4 ----- ! LOCAL_LIBRARIES = $(XLIB) $(XRM) SYS_LIBRARIES = -ll OTHERSRCS = gram.y lex.l YFLAGS = -d *************** *** 7,13 Cursors.c Focus.c GetButton.c GridBox.c Iconify.c Icons.c Lower.c\ Menu.c Move.c MoveOpaque.c NewIconify.c Pause.c Push.c Error.c\ Raise.c Refresh.c Resize.c Restart.c RubberBand.c StoreBox.c \ ! StoreZap.c XError.c uwm.c OBJS= gram.o lex.o globals.o Beep.o Bindings.o CircleDown.o CircleUp.o\ Cursors.o Focus.o GetButton.o GridBox.o Iconify.o Icons.o Lower.o\ --- 7,13 ----- Cursors.c Focus.c GetButton.c GridBox.c Iconify.c Icons.c Lower.c\ Menu.c Move.c MoveOpaque.c NewIconify.c Pause.c Push.c Error.c\ Raise.c Refresh.c Resize.c Restart.c RubberBand.c StoreBox.c \ ! StoreZap.c XError.c uwm.c FocusChange.c TitleBar.c OBJS= gram.o lex.o globals.o Beep.o Bindings.o CircleDown.o CircleUp.o\ Cursors.o Focus.o GetButton.o GridBox.o Iconify.o Icons.o Lower.o\ *************** *** 13,19 Cursors.o Focus.o GetButton.o GridBox.o Iconify.o Icons.o Lower.o\ Menu.o Move.o MoveOpaque.o NewIconify.o Pause.o Push.o Error.o\ Raise.o Refresh.o Resize.o Restart.o RubberBand.o StoreBox.o \ ! StoreZap.o XError.o uwm.o ComplexProgramTarget(uwm) --- 13,19 ----- Cursors.o Focus.o GetButton.o GridBox.o Iconify.o Icons.o Lower.o\ Menu.o Move.o MoveOpaque.o NewIconify.o Pause.o Push.o Error.o\ Raise.o Refresh.o Resize.o Restart.o RubberBand.o StoreBox.o \ ! StoreZap.o XError.o uwm.o FocusChange.o TitleBar.o ComplexProgramTarget(uwm) *** uwm.new/Makefile Mon Dec 7 00:59:33 1987 --- uwm.new/Makefile Sat Dec 12 19:23:49 1987 *************** *** 5,11 # Ignore this message if you are not using imake. # ! TOP = ./../.. AS = as CC = cc CPP = /lib/cpp --- 5,11 ----- # Ignore this message if you are not using imake. # ! TOP = /usr/src/X.V11R1 AS = as CC = cc CPP = /lib/cpp *************** *** 67,73 RM_CMD = rm -f *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a \ tags TAGS make.log ! LOCAL_LIBRARIES = $(XLIB) SYS_LIBRARIES = -ll OTHERSRCS = gram.y lex.l YFLAGS = -d --- 67,73 ----- RM_CMD = rm -f *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a \ tags TAGS make.log ! LOCAL_LIBRARIES = $(XLIB) $(XRM) SYS_LIBRARIES = -ll OTHERSRCS = gram.y lex.l YFLAGS = -d *************** *** 76,82 Cursors.c Focus.c GetButton.c GridBox.c Iconify.c Icons.c Lower.c\ Menu.c Move.c MoveOpaque.c NewIconify.c Pause.c Push.c Error.c\ Raise.c Refresh.c Resize.c Restart.c RubberBand.c StoreBox.c \ ! StoreZap.c XError.c uwm.c OBJS= gram.o lex.o globals.o Beep.o Bindings.o CircleDown.o CircleUp.o\ Cursors.o Focus.o GetButton.o GridBox.o Iconify.o Icons.o Lower.o\ --- 76,82 ----- Cursors.c Focus.c GetButton.c GridBox.c Iconify.c Icons.c Lower.c\ Menu.c Move.c MoveOpaque.c NewIconify.c Pause.c Push.c Error.c\ Raise.c Refresh.c Resize.c Restart.c RubberBand.c StoreBox.c \ ! StoreZap.c XError.c uwm.c FocusChange.c TitleBar.c OBJS= gram.o lex.o globals.o Beep.o Bindings.o CircleDown.o CircleUp.o\ Cursors.o Focus.o GetButton.o GridBox.o Iconify.o Icons.o Lower.o\ *************** *** 82,88 Cursors.o Focus.o GetButton.o GridBox.o Iconify.o Icons.o Lower.o\ Menu.o Move.o MoveOpaque.o NewIconify.o Pause.o Push.o Error.o\ Raise.o Refresh.o Resize.o Restart.o RubberBand.o StoreBox.o \ ! StoreZap.o XError.o uwm.o PROGRAM = uwm --- 82,88 ----- Cursors.o Focus.o GetButton.o GridBox.o Iconify.o Icons.o Lower.o\ Menu.o Move.o MoveOpaque.o NewIconify.o Pause.o Push.o Error.o\ Raise.o Refresh.o Resize.o Restart.o RubberBand.o StoreBox.o \ ! StoreZap.o XError.o uwm.o FocusChange.o TitleBar.o PROGRAM = uwm *************** *** 132,223 Makefiles:: - # DO NOT DELETE - - globals.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - globals.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - globals.o: /usr/include/sys/types.h ./../../X11/X.h - Beep.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Beep.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Beep.o: /usr/include/sys/types.h ./../../X11/X.h - Bindings.o: ./../../X11/copyright.h - CircleDown.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - CircleDown.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - CircleDown.o: /usr/include/sys/types.h ./../../X11/X.h - CircleUp.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - CircleUp.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - CircleUp.o: /usr/include/sys/types.h ./../../X11/X.h - Cursors.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Cursors.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Cursors.o: /usr/include/sys/types.h ./../../X11/X.h ./../../X11/cursorfont.h - Focus.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Focus.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Focus.o: /usr/include/sys/types.h ./../../X11/X.h - GetButton.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - GetButton.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - GetButton.o: /usr/include/sys/types.h ./../../X11/X.h ./../../X11/Xutil.h - GetButton.o: ./../../X11/Xatom.h - GridBox.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - GridBox.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - GridBox.o: /usr/include/sys/types.h ./../../X11/X.h - Iconify.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Iconify.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Iconify.o: /usr/include/sys/types.h ./../../X11/X.h - Icons.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Icons.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Icons.o: /usr/include/sys/types.h ./../../X11/X.h ./../../X11/Xutil.h - Icons.o: ./../../X11/Xatom.h - Lower.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Lower.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Lower.o: /usr/include/sys/types.h ./../../X11/X.h - Menu.o: ./../../X11/copyright.h /usr/include/signal.h uwm.h - Menu.o: /usr/include/errno.h /usr/include/stdio.h /usr/include/strings.h - Menu.o: ./../../X11/Xlib.h /usr/include/sys/types.h ./../../X11/X.h - Move.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Move.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Move.o: /usr/include/sys/types.h ./../../X11/X.h - MoveOpaque.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - MoveOpaque.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - MoveOpaque.o: /usr/include/sys/types.h ./../../X11/X.h - NewIconify.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - NewIconify.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - NewIconify.o: /usr/include/sys/types.h ./../../X11/X.h - Pause.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Pause.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Pause.o: /usr/include/sys/types.h ./../../X11/X.h - Push.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Push.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Push.o: /usr/include/sys/types.h ./../../X11/X.h - Error.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Error.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Error.o: /usr/include/sys/types.h ./../../X11/X.h - Raise.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Raise.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Raise.o: /usr/include/sys/types.h ./../../X11/X.h - Refresh.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Refresh.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Refresh.o: /usr/include/sys/types.h ./../../X11/X.h - Resize.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Resize.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Resize.o: /usr/include/sys/types.h ./../../X11/X.h ./../../X11/Xutil.h - Resize.o: ./../../X11/Xatom.h - Restart.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - Restart.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - Restart.o: /usr/include/sys/types.h ./../../X11/X.h - RubberBand.o: ./../../X11/copyright.h /usr/include/stdio.h - RubberBand.o: /usr/include/strings.h ./../../X11/Xlib.h - RubberBand.o: /usr/include/sys/types.h ./../../X11/X.h ./../../X11/Xutil.h - RubberBand.o: ./../../X11/cursorfont.h uwm.h /usr/include/errno.h - StoreBox.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - StoreBox.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - StoreBox.o: /usr/include/sys/types.h ./../../X11/X.h - StoreZap.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - StoreZap.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - StoreZap.o: /usr/include/sys/types.h ./../../X11/X.h - XError.o: ./../../X11/copyright.h uwm.h /usr/include/errno.h - XError.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - XError.o: /usr/include/sys/types.h ./../../X11/X.h - uwm.o: ./../../X11/copyright.h /usr/include/sys/time.h - uwm.o: /usr/include/sys/time.h uwm.h /usr/include/errno.h - uwm.o: /usr/include/stdio.h /usr/include/strings.h ./../../X11/Xlib.h - uwm.o: /usr/include/sys/types.h ./../../X11/X.h /usr/include/fcntl.h --- 132,134 ----- Makefiles:: *** uwm.new/Menu.c Mon Dec 7 00:59:33 1987 --- uwm.new/Menu.c Sat Dec 12 09:52:38 1987 *************** *** 93,98 return(status); } Bool Menu(window, mask, button, x, y, menu) Window window; /* Event window. */ int mask; /* Button/key mask. */ --- 93,105 ----- return(status); } + /* + * Hack variable to prevent autoraise of neighboring windows during menu op. + * Set in MapMenu and UnmapMenu. Also used by GetButton to prevent autoraise + * during configure/map ops. + */ + Bool Snatched; + Bool Menu(window, mask, button, x, y, menu) Window window; /* Event window. */ int mask; /* Button/key mask. */ *************** *** 317,322 return(func_stat); break; default: Error("Menu -> Internal type error."); } --- 324,334 ----- return(func_stat); break; + case IsVar: + *(ml->text) = *ml->aux; + UnmapMenu(menu); + break; + default: Error("Menu -> Internal type error."); } *************** *** 461,466 * Map the window and draw the text items. */ XMapWindow(dpy, w); DisplayLine(w, 0, menu->width, menu->iheight, menu->name, menu->bg.pixel, menu->fg.pixel, 0); --- 473,479 ----- * Map the window and draw the text items. */ XMapWindow(dpy, w); + Snatched = True; DisplayLine(w, 0, menu->width, menu->iheight, menu->name, menu->bg.pixel, menu->fg.pixel, 0); *************** *** 501,506 * Unmap and flush. */ XUnmapWindow(dpy, menu->w); XFlush(dpy); } --- 514,520 ----- * Unmap and flush. */ XUnmapWindow(dpy, menu->w); + Snatched = False; XFlush(dpy); } *** uwm.new/Resize.c Mon Dec 7 00:59:36 1987 --- uwm.new/Resize.c Sat Dec 12 18:48:50 1987 *************** *** 1,5 #ifndef lint ! static char *rcsid_Resize_c = "$Header: Resize.c,v 1.18 87/09/09 12:01:04 swick Exp $"; #endif lint #include <X11/copyright.h> --- 1,5 ----- #ifndef lint ! static char *rcsid_Resize_c = "$Header: Resize.c,v 1.18 87/09/09 12:01:04 swick Exp $"; #endif lint #include <X11/copyright.h> *************** *** 35,40 * 000 -- M. Gancarz, DEC Ultrix Engineering Group * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group * Convert to X11 */ #ifndef lint --- 35,43 ----- * 000 -- M. Gancarz, DEC Ultrix Engineering Group * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group * Convert to X11 + * 002 -- Jordan Hubbard, U.C. berkeley. + * Added alternate placement of resize window, code for title bar + * support. */ #ifndef lint *************** *** 49,54 #define min(a,b) ( (a) > (b) ? (b) : (a) ) #define makemult(a, b) ((b==1) ? (a) : (((int)((a) / (b))) * (b)) ) Bool Resize(window, mask, button, x0, y0) Window window; /* Event window. */ int mask; /* Button/key mask. */ --- 52,59 ----- #define min(a,b) ( (a) > (b) ? (b) : (a) ) #define makemult(a, b) ((b==1) ? (a) : (((int)((a) / (b))) * (b)) ) + extern Bool Snatched; + Bool Resize(window, mask, button, x0, y0) Window window; /* Event window. */ int mask; /* Button/key mask. */ *************** *** 55,85 int button; /* Button event detail. */ int x0, y0; /* Event mouse position. */ { ! XWindowAttributes window_info; /* Event window info. */ ! int x1, y1; /* fixed box corner */ ! int x2, y2; /* moving box corner */ ! int x, y; ! int xinc, yinc; ! int minwidth, minheight; ! int maxwidth, maxheight; ! int defwidth, defheight; ! int ox, oy; /* which quadrant of window */ ! int pop_x, pop_y; /* location of pop window */ ! int hsize, vsize; /* dynamic size */ ! int delta; ! int root_x, root_y; /* root window coordinates */ ! int ptrmask; /* pointer status word */ ! int num_vectors; /* Number of vectors to XDraw. */ ! Window assoc; /* Window represented by the icon. */ ! Window sub_win; /* Mouse query sub window. */ ! Window root; /* Root query window. */ ! XEvent button_event; /* Button event packet. */ ! XSegment box[MAX_BOX_VECTORS]; /* Box drawing vertex buffer. */ ! XSegment zap[MAX_ZAP_VECTORS]; /* Zap drawing vertex buffer. */ ! Bool stop; /* Should the window stop changing? */ ! XSizeHints sizehints; ! XWindowChanges values; ! int width_offset, height_offset; /* to subtract if resize increments */ /* * Do nothing if the event window is the root window. --- 60,136 ----- int button; /* Button event detail. */ int x0, y0; /* Event mouse position. */ { ! XWindowAttributes window_info; /* Event window info. */ ! int x1, y1; /* fixed box corner */ ! int x2, y2; /* moving box corner */ ! int x, y; ! int dx; ! int xinc, yinc; ! int minwidth, minheight; ! int maxwidth, maxheight; ! int defwidth, defheight; ! int ox, oy; /* which quadrant of window */ ! int pop_x, pop_y; /* location of pop window */ ! int hsize, vsize; /* dynamic size */ ! int delta; ! int root_x, root_y; /* root window coordinates */ ! int ptrmask; /* pointer status word */ ! int num_vectors; /* Number of vectors to XDraw. */ ! Window assoc; /* Window represented by the icon. */ ! Window sub_win; /* Mouse query sub window. */ ! Window root; /* Root query window. */ ! XEvent button_event; /* Button event packet. */ ! XSegment box[MAX_BOX_VECTORS]; /* Box drawing vertex buffer. */ ! XSegment zap[MAX_ZAP_VECTORS]; /* Zap drawing vertex buffer. */ ! Bool stop; /* Should the window stop changing? */ ! XSizeHints sizehints; ! XWindowChanges values; ! int width_offset, height_offset; /* to subtract if resize increments */ ! TitleData *dat; ! ! /* ! * Do nothing if the event window is the root window. ! */ ! if (window == RootWindow(dpy, scr)) ! return(FALSE); ! ! /* ! * Gather info about the event window. ! */ ! status = XGetWindowAttributes(dpy, window, &window_info); ! if (status == FAILURE) return(FALSE); ! ! /* ! * Do not resize an icon window (NULL for assoc means don't create too). ! */ ! if (IsIcon(window, x, y, FALSE, NULL)) ! return(FALSE); ! ! /* ! * Clear the vector buffers. ! */ ! bzero(box, sizeof(box)); ! if (Zap) bzero(zap, sizeof(zap)); ! ! /* ! * If we are here then we have a resize operation in progress. ! */ ! ! /* ! * Turn on the resize cursor. ! */ ! XChangeActivePointerGrab(dpy, EVENTMASK, ArrowCrossCursor, CurrentTime); ! ! /* ! * calculate fixed point (x1, y1) and varying point (x2, y2). ! */ ! ! hsize = defwidth = window_info.width; ! vsize = defheight = window_info.height; ! x1 = window_info.x; ! y1 = window_info.y; ! if ((dat = GetTitleInfo(window)) != NULL) { /* compensate for title bar */ ! XWindowAttributes xwa; XGetWindowAttributes(dpy, dat->title, &xwa); dx = xwa.height + 2; *************** *** 81,382 XWindowChanges values; int width_offset, height_offset; /* to subtract if resize increments */ ! /* ! * Do nothing if the event window is the root window. ! */ ! if (window == RootWindow(dpy, scr)) ! return(FALSE); ! ! /* ! * Gather info about the event window. ! */ ! status = XGetWindowAttributes(dpy, window, &window_info); ! if (status == FAILURE) return(FALSE); ! ! /* ! * Do not resize an icon window (NULL for assoc means don't create too). ! */ ! if (IsIcon(window, x, y, FALSE, NULL)) ! return(FALSE); ! ! /* ! * Clear the vector buffers. ! */ ! bzero(box, sizeof(box)); ! if (Zap) bzero(zap, sizeof(zap)); ! ! /* ! * If we are here then we have a resize operation in progress. ! */ ! ! /* ! * Turn on the resize cursor. ! */ ! XChangeActivePointerGrab(dpy, EVENTMASK, ArrowCrossCursor, CurrentTime); ! ! /* ! * calculate fixed point (x1, y1) and varying point (x2, y2). ! */ ! ! hsize = defwidth = window_info.width; ! vsize = defheight = window_info.height; ! x1 = window_info.x; ! y1 = window_info.y; ! x2 = x1 + hsize; ! y2 = y1 + vsize; ! ! /* ! * Get the event window resize hint. ! */ ! sizehints.flags = 0; ! XGetSizeHints(dpy, window, &sizehints, XA_WM_NORMAL_HINTS); ! CheckConsistency(&sizehints); ! ! /* until there are better WM_HINTS, we'll assume that the client's ! * minimum width and height are the appropriate offsets to subtract ! * when resizing with an explicit resize increment. ! */ ! if (sizehints.flags&PMinSize && sizehints.flags&PResizeInc) { ! width_offset = sizehints.min_width; ! height_offset = sizehints.min_height; ! } else ! width_offset = height_offset = 0; ! ! /* ! * decide what resize mode we are in. Always rubberband if window ! * is too small. ! */ ! if (window_info.width > 2 && window_info.height > 2) { ! ox = ((x0 - window_info.x) * 3) / window_info.width; ! oy = ((y0 - window_info.y) * 3) / window_info.height; ! if ((ox + oy) & 1) { ! if (ox & 1) { ! /* fix up size hints so that we will never change width */ ! sizehints.min_width = sizehints.max_width = window_info.width; ! if ((sizehints.flags&PMinSize) == 0) { ! sizehints.min_height = 0; ! sizehints.flags |= PMinSize; ! } ! if ((sizehints.flags&PMaxSize) == 0) { ! sizehints.max_height = DisplayHeight(dpy, scr); ! sizehints.flags |= PMaxSize; ! } ! } ! if (oy & 1) { ! /* fix up size hints so that we will never change height */ ! sizehints.min_height = sizehints.max_height = window_info.height; ! if ((sizehints.flags&PMinSize)==0) { ! sizehints.min_width = 0; ! sizehints.flags |= PMinSize; ! } ! if ((sizehints.flags&PMaxSize)==0) { ! sizehints.max_width = DisplayWidth(dpy, scr); ! sizehints.flags |= PMaxSize; ! } ! } ! } ! } ! else ox = oy = 2; ! ! /* change fixed point to one that shouldn't move */ ! if (oy == 0) { ! y = y1; y1 = y2; y2 = y; ! } ! if (ox == 0) { ! x = x1; x1 = x2; x2 = x; ! } ! ! ! if (sizehints.flags&PMinSize) { ! minwidth = sizehints.min_width; ! minheight = sizehints.min_height; ! } else { ! minwidth = 0; ! minheight = 0; ! } ! if (sizehints.flags&PMaxSize) { ! maxwidth = max(sizehints.max_width, minwidth); ! maxheight = max(sizehints.max_height, minheight); ! } else { ! maxwidth = DisplayWidth(dpy, scr); ! maxheight = DisplayHeight(dpy, scr); ! } ! if (sizehints.flags&PResizeInc) { ! xinc = sizehints.width_inc; ! yinc = sizehints.height_inc; ! } else { ! xinc = 1; ! yinc = 1; ! } ! ! switch (ox) { ! case 0: pop_x = x1 - PWidth; break; ! case 1: pop_x = x1 + (hsize-PWidth)/2; break; ! case 2: pop_x = x1; break; ! } ! switch (oy) { ! case 0: pop_y = y1 - PHeight; break; ! case 1: pop_y = y1 + (vsize-PHeight)/2; break; ! case 2: pop_y = y1; break; ! } ! values.x = pop_x; ! values.y = pop_y; ! values.stack_mode = Above; ! XConfigureWindow(dpy, Pop, CWX|CWY|CWStackMode, &values); ! XMapWindow(dpy, Pop); ! ! if (Grid) { ! num_vectors = StoreGridBox( ! box, ! MIN(x1, x2), MIN(y1, y2), ! MAX(x1, x2), MAX(y1, y2) ! ); ! } ! else { ! num_vectors = StoreBox( ! box, ! MIN(x1, x2), MIN(y1, y2), ! MAX(x1, x2), MAX(y1, y2) ! ); ! } ! ! /* ! * If we freeze the server, then we will draw solid ! * lines instead of flickering ones during resizing. ! */ ! if (Freeze) XGrabServer(dpy); ! ! /* ! * Process any pending exposure events before drawing the box. ! */ ! while (QLength(dpy) > 0) { ! XPeekEvent(dpy, &button_event); ! if (((XAnyEvent *)&button_event)->window == RootWindow(dpy, scr)) ! break; ! GetButton(&button_event); ! } ! ! /* ! * Now draw the box. ! */ ! DrawBox(); ! Frozen = window; ! ! stop = FALSE; ! x = -1; y = -1; ! ! while (!stop) { ! if (x != x2 || y != y2) { ! ! x = x2; y = y2; ! ! /* ! * If we've frozen the server, then erase ! * the old box. ! */ ! if (Freeze) ! DrawBox(); ! ! if (Grid) { ! num_vectors = StoreGridBox( ! box, ! MIN(x1, x), MIN(y1, y), ! MAX(x1, x), MAX(y1, y) ! ); ! } ! else { ! num_vectors = StoreBox( ! box, ! MIN(x1, x), MIN(y1, y), ! MAX(x1, x), MAX(y1, y) ! ); ! } ! ! if (Freeze) ! DrawBox(); ! ! { ! int Hsize = (hsize - width_offset) / xinc; ! int Vsize = (vsize - height_offset) / yinc; ! int pos = 4; ! ! PText[0] = (Hsize>99) ? (Hsize / 100 + '0') : ' '; ! PText[1] = (Hsize>9) ? ((Hsize / 10) % 10 + '0') : ' '; ! PText[2] = Hsize % 10 + '0'; ! if (Vsize>99) PText[pos++] = Vsize / 100 + '0'; ! if (Vsize>9) PText[pos++] = (Vsize / 10) % 10 + '0'; ! PText[pos++] = Vsize % 10 + '0'; ! while (pos<7) PText[pos++] = ' '; ! } ! ! /* ! * If the font is not fixed width we have to ! * clear the window to guarantee that the characters ! * that were there before are erased. ! */ ! if (!(PFontInfo->per_char)) XClearWindow(dpy, Pop); ! XDrawImageString( ! dpy, Pop, PopGC, ! PPadding, PPadding+PFontInfo->ascent, ! PText, PTextSize); ! } ! ! if (!Freeze) { ! DrawBox(); ! DrawBox(); ! } ! ! if (XPending(dpy) && GetButton(&button_event)) { ! ! if ((button_event.type != ButtonPress) && ! (button_event.type != ButtonRelease)) { ! continue; /* spurious menu event... */ ! } ! ! if (Freeze) { ! DrawBox(); ! Frozen = (Window)0; ! XUngrabServer(dpy); ! } ! ! if ((button_event.type == ButtonRelease) && ! (((XButtonReleasedEvent *)&button_event)->button == button)){ ! x2 = ((XButtonReleasedEvent *)&button_event)->x; ! y2 = ((XButtonReleasedEvent *)&button_event)->y; ! stop = TRUE; ! } ! else { ! XUnmapWindow(dpy, Pop); ! ResetCursor(button); ! return(TRUE); ! } ! } ! else { ! XQueryPointer(dpy, RootWindow(dpy, scr), &root, ! &sub_win, &root_x, &root_y, &x2, &y2, &ptrmask); ! } ! ! ! hsize = max(min(abs (x2 - x1), maxwidth), minwidth); ! hsize = makemult(hsize-minwidth, xinc)+minwidth; ! ! vsize = max(min(abs(y2 - y1), maxheight), minheight); ! vsize = makemult(vsize-minheight, yinc)+minheight; ! ! if (sizehints.flags & PAspect) { ! if ((hsize * sizehints.max_aspect.y > ! vsize * sizehints.max_aspect.x)) { ! delta = makemult( ! (hsize*sizehints.max_aspect.y / ! sizehints.max_aspect.x) ! - vsize, ! yinc); ! if ((vsize+delta <= maxheight)) vsize += delta; ! else { ! delta = makemult(hsize - ! (sizehints.max_aspect.x * vsize/sizehints.max_aspect.y), ! xinc); ! if (hsize-delta >= minwidth) hsize -= delta; } } if (hsize * sizehints.min_aspect.y < vsize * --- 132,316 ----- if ((dat = GetTitleInfo(window)) != NULL) { /* compensate for title bar */ XWindowAttributes xwa; ! XGetWindowAttributes(dpy, dat->title, &xwa); ! dx = xwa.height + 2; ! y1 += dx; ! } ! else ! dx = 0; ! x2 = x1 + hsize; ! y2 = y1 + vsize; ! y2 -= dx; ! /* ! * Get the event window resize hint. ! */ ! sizehints.flags = 0; ! XGetSizeHints(dpy, window, &sizehints, XA_WM_NORMAL_HINTS); ! CheckConsistency(&sizehints); ! ! /* until there are better WM_HINTS, we'll assume that the client's ! * minimum width and height are the appropriate offsets to subtract ! * when resizing with an explicit resize increment. ! */ ! if (sizehints.flags&PMinSize && sizehints.flags&PResizeInc) { ! width_offset = sizehints.min_width; ! height_offset = sizehints.min_height; ! } else ! width_offset = height_offset = 0; ! ! /* ! * decide what resize mode we are in. Always rubberband if window ! * is too small. ! */ ! if (window_info.width > 2 && window_info.height > 2) { ! ox = ((x0 - window_info.x) * 3) / window_info.width; ! oy = ((y0 - window_info.y) * 3) / window_info.height; ! if ((ox + oy) & 1) { ! if (ox & 1) { ! /* fix up size hints so that we will never change width */ ! sizehints.min_width = sizehints.max_width = window_info.width; ! if ((sizehints.flags&PMinSize) == 0) { ! sizehints.min_height = 0; ! sizehints.flags |= PMinSize; ! } ! if ((sizehints.flags&PMaxSize) == 0) { ! sizehints.max_height = DisplayHeight(dpy, scr); ! sizehints.flags |= PMaxSize; ! } ! } ! if (oy & 1) { ! /* fix up size hints so that we will never change height */ ! sizehints.min_height = sizehints.max_height = window_info.height; ! if ((sizehints.flags&PMinSize)==0) { ! sizehints.min_width = 0; ! sizehints.flags |= PMinSize; ! } ! if ((sizehints.flags&PMaxSize)==0) { ! sizehints.max_width = DisplayWidth(dpy, scr); ! sizehints.flags |= PMaxSize; ! } ! } ! } ! } ! else ox = oy = 2; ! ! /* change fixed point to one that shouldn't move */ ! if (oy == 0) { ! y = y1; y1 = y2; y2 = y; ! } ! if (ox == 0) { ! x = x1; x1 = x2; x2 = x; ! } ! ! ! if (sizehints.flags&PMinSize) { ! minwidth = sizehints.min_width; ! minheight = sizehints.min_height; ! } else { ! minwidth = 0; ! minheight = 0; ! } ! if (sizehints.flags&PMaxSize) { ! maxwidth = max(sizehints.max_width, minwidth); ! maxheight = max(sizehints.max_height, minheight); ! } else { ! maxwidth = DisplayWidth(dpy, scr); ! maxheight = DisplayHeight(dpy, scr); ! } ! if (sizehints.flags&PResizeInc) { ! xinc = sizehints.width_inc; ! yinc = sizehints.height_inc; ! } else { ! xinc = 1; ! yinc = 1; ! } ! ! switch (ox) { ! case 0: pop_x = x1 - PWidth; break; ! case 1: pop_x = x1 + (hsize-PWidth)/2; break; ! case 2: pop_x = x1; break; ! } ! switch (oy) { ! case 0: pop_y = y1 - PHeight; break; ! case 1: pop_y = y1 + (vsize-PHeight)/2; break; ! case 2: pop_y = y1; break; ! } ! /* ! * Double expose on the target window is too expensive for some reason ! * or another. Paint the popup window in the upper left hand ! * corner of the screen if ResizeObscure is FALSE. Consistent with the map ! * request popup. ! */ ! if (RootResizeBox == TRUE) ! values.x = values.y = 0; ! else { ! values.x = pop_x; ! values.y = pop_y; ! } ! values.stack_mode = Above; ! XConfigureWindow(dpy, Pop, CWX|CWY|CWStackMode, &values); ! XMapWindow(dpy, Pop); ! ! if (Grid) { ! num_vectors = StoreGridBox( ! box, ! MIN(x1, x2), MIN(y1, y2), ! MAX(x1, x2), MAX(y1, y2) ! ); ! } ! else { ! num_vectors = StoreBox( ! box, ! MIN(x1, x2), MIN(y1, y2), ! MAX(x1, x2), MAX(y1, y2) ! ); ! } ! ! /* ! * If we freeze the server, then we will draw solid ! * lines instead of flickering ones during resizing. ! */ ! if (Freeze) ! XGrabServer(dpy); ! /* protect us from ourselves */ ! Snatched = True; ! /* ! * Process any pending exposure events before drawing the box. ! */ ! while (QLength(dpy) > 0) { ! XPeekEvent(dpy, &button_event); ! if (((XAnyEvent *)&button_event)->window == RootWindow(dpy, scr)) ! break; ! GetButton(&button_event); ! } ! ! /* ! * Now draw the box. ! */ ! DrawBox(); ! Frozen = window; ! ! stop = FALSE; ! x = -1; y = -1; ! ! while (!stop) { ! if (x != x2 || y != y2) { ! ! x = x2; y = y2; ! ! /* ! * If we've frozen the server, then erase ! * the old box. ! */ ! if (Freeze) ! DrawBox(); ! ! if (Grid) { ! num_vectors = StoreGridBox( ! box, ! MIN(x1, x), MIN(y1, y), ! MAX(x1, x), MAX(y1, y) ! ); } else { num_vectors = StoreBox( *************** *** 378,391 xinc); if (hsize-delta >= minwidth) hsize -= delta; } - } - if (hsize * sizehints.min_aspect.y < vsize * - sizehints.min_aspect.x) { - delta = makemult( - (sizehints.min_aspect.x * - vsize/sizehints.min_aspect.y) - hsize, - xinc); - if (hsize+delta <= maxwidth) hsize += delta; else { delta = makemult( vsize - --- 312,317 ----- MAX(x1, x), MAX(y1, y) ); } else { num_vectors = StoreBox( box, *************** *** 387,398 xinc); if (hsize+delta <= maxwidth) hsize += delta; else { ! delta = makemult( ! vsize - ! (hsize*sizehints.min_aspect.y / ! sizehints.min_aspect.x), ! yinc); ! if ((vsize-delta >= minheight)) vsize -= delta; } } --- 313,323 ----- ); } else { ! num_vectors = StoreBox( ! box, ! MIN(x1, x), MIN(y1, y), ! MAX(x1, x), MAX(y1, y) ! ); } if (Freeze) *************** *** 394,425 yinc); if ((vsize-delta >= minheight)) vsize -= delta; } ! } ! ! } ! if (ox == 0) ! x2 = x1 - hsize; ! else ! x2 = x1 + hsize; ! ! if (oy == 0) ! y2 = y1 - vsize; ! else ! y2 = y1 + vsize; ! ! } ! if (x2 < x1) { ! x = x1; x1 = x2; x2 = x; ! } ! if (y2 < y1) { ! y = y1; y1 = y2; y2 = y; ! } ! XUnmapWindow(dpy, Pop); ! if ((x1!=window_info.x) || (y1 != window_info.y) || ! (hsize != window_info.width) || ! (vsize != window_info.height)) ! XMoveResizeWindow(dpy, window, x1, y1, hsize, vsize); ! return(TRUE); } CheckConsistency(hints) --- 319,460 ----- MAX(x1, x), MAX(y1, y) ); } ! ! if (Freeze) ! DrawBox(); ! ! { ! int Hsize = (hsize - width_offset) / xinc; ! int Vsize = (vsize - height_offset) / yinc; ! int pos = 4; ! PText[0] = (Hsize>99) ? (Hsize / 100 + '0') : ' '; ! PText[1] = (Hsize>9) ? ((Hsize / 10) % 10 + '0') : ' '; ! PText[2] = Hsize % 10 + '0'; ! if (Vsize>99) PText[pos++] = Vsize / 100 + '0'; ! if (Vsize>9) PText[pos++] = (Vsize / 10) % 10 + '0'; ! PText[pos++] = Vsize % 10 + '0'; ! while (pos<7) PText[pos++] = ' '; ! } ! ! /* ! * If the font is not fixed width we have to ! * clear the window to guarantee that the characters ! * that were there before are erased. ! */ ! if (!(PFontInfo->per_char)) XClearWindow(dpy, Pop); ! XDrawImageString( ! dpy, Pop, PopGC, ! PPadding, PPadding+PFontInfo->ascent, ! PText, PTextSize); ! } ! ! if (!Freeze) { ! DrawBox(); ! DrawBox(); ! } ! ! if (XPending(dpy) && GetButton(&button_event)) { ! ! if ((button_event.type != ButtonPress) && ! (button_event.type != ButtonRelease)) { ! continue; /* spurious menu event... */ ! } ! ! if (Freeze) { ! DrawBox(); ! Frozen = (Window)0; ! XUngrabServer(dpy); ! } ! ! if ((button_event.type == ButtonRelease) && ! (((XButtonReleasedEvent *)&button_event)->button == button)){ ! x2 = ((XButtonReleasedEvent *)&button_event)->x; ! y2 = ((XButtonReleasedEvent *)&button_event)->y; ! stop = TRUE; ! } ! else { ! XUnmapWindow(dpy, Pop); ! ResetCursor(button); ! Snatched = False; ! return(TRUE); ! } ! } ! else { ! XQueryPointer(dpy, RootWindow(dpy, scr), &root, ! &sub_win, &root_x, &root_y, &x2, &y2, &ptrmask); ! } ! ! ! hsize = max(min(abs (x2 - x1), maxwidth), minwidth); ! hsize = makemult(hsize-minwidth, xinc)+minwidth; ! ! vsize = max(min(abs(y2 - y1), maxheight), minheight); ! vsize = makemult(vsize-minheight, yinc)+minheight; ! ! if (sizehints.flags & PAspect) { ! if ((hsize * sizehints.max_aspect.y > ! vsize * sizehints.max_aspect.x)) { ! delta = makemult( ! (hsize*sizehints.max_aspect.y / ! sizehints.max_aspect.x) ! - vsize, ! yinc); ! if ((vsize+delta <= maxheight)) vsize += delta; ! else { ! delta = makemult(hsize - ! (sizehints.max_aspect.x * vsize/sizehints.max_aspect.y), ! xinc); ! if (hsize-delta >= minwidth) hsize -= delta; ! } ! } ! if (hsize * sizehints.min_aspect.y < vsize * ! sizehints.min_aspect.x) { ! delta = makemult( ! (sizehints.min_aspect.x * ! vsize/sizehints.min_aspect.y) - hsize, ! xinc); ! if (hsize+delta <= maxwidth) hsize += delta; ! else { ! delta = makemult( ! vsize - ! (hsize*sizehints.min_aspect.y / ! sizehints.min_aspect.x), ! yinc); ! if ((vsize-delta >= minheight)) vsize -= delta; ! } ! } ! ! } ! if (ox == 0) ! x2 = x1 - hsize; ! else ! x2 = x1 + hsize; ! ! if (oy == 0) ! y2 = y1 - vsize; ! else ! y2 = y1 + vsize; ! ! } ! if (x2 < x1) { ! x = x1; x1 = x2; x2 = x; ! } ! if (y2 < y1) { ! y = y1; y1 = y2; y2 = y; ! } ! XUnmapWindow(dpy, Pop); ! if ((x1!=window_info.x) || (y1 != window_info.y) || ! (hsize != window_info.width) || ! (vsize != window_info.height)) { ! TitleData *dat; ! ! if ((dat = GetTitleInfo(window)) != NULL) ! ConfigureTitle(dat, x1, y1 - dx, hsize, vsize); ! else ! XMoveResizeWindow(dpy, window, x1, y1, hsize, vsize); ! } ! Snatched = False; ! return(TRUE); } CheckConsistency(hints) *************** *** 425,449 CheckConsistency(hints) XSizeHints *hints; { ! if (hints->min_height < 0) hints->min_height = 0; ! if (hints->min_width < 0) hints->min_width = 0; ! ! if (hints->max_height <= 0 || hints->max_width <= 0) ! hints->flags &= ~PMaxSize; ! ! hints->min_height = min(DisplayHeight(dpy, scr), hints->min_height); ! hints->min_width = min(DisplayWidth(dpy, scr), hints->min_width); ! ! hints->max_height = min(DisplayHeight(dpy, scr), hints->max_height); ! hints->max_width = min(DisplayWidth(dpy, scr), hints->max_width); ! ! if ((hints->flags&PMinSize) && (hints->flags&PMaxSize) && ! ((hints->min_height > hints->max_height) || ! (hints->min_width > hints->max_width))) ! hints->flags &= ~(PMinSize|PMaxSize); ! ! if ((hints->flags&PAspect) && ! (hints->min_aspect.x * hints->max_aspect.y > ! hints->max_aspect.x * hints->min_aspect.y)) ! hints->flags &= ~(PAspect); } --- 460,484 ----- CheckConsistency(hints) XSizeHints *hints; { ! if (hints->min_height < 0) hints->min_height = 0; ! if (hints->min_width < 0) hints->min_width = 0; ! ! if (hints->max_height <= 0 || hints->max_width <= 0) ! hints->flags &= ~PMaxSize; ! ! hints->min_height = min(DisplayHeight(dpy, scr), hints->min_height); ! hints->min_width = min(DisplayWidth(dpy, scr), hints->min_width); ! ! hints->max_height = min(DisplayHeight(dpy, scr), hints->max_height); ! hints->max_width = min(DisplayWidth(dpy, scr), hints->max_width); ! ! if ((hints->flags&PMinSize) && (hints->flags&PMaxSize) && ! ((hints->min_height > hints->max_height) || ! (hints->min_width > hints->max_width))) ! hints->flags &= ~(PMinSize|PMaxSize); ! ! if ((hints->flags&PAspect) && ! (hints->min_aspect.x * hints->max_aspect.y > ! hints->max_aspect.x * hints->min_aspect.y)) ! hints->flags &= ~(PAspect); } *** uwm.new/Restart.c Mon Dec 7 00:59:37 1987 --- uwm.new/Restart.c Sat Dec 12 09:53:40 1987 *************** *** 29,34 * 000 -- M. Gancarz, DEC Ultrix Engineering Group * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group, Western Software Lab. Convert to X11. */ #ifndef lint --- 29,35 ----- * 000 -- M. Gancarz, DEC Ultrix Engineering Group * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group, Western Software Lab. Convert to X11. + * 002 -- Jordan Hubbard, U.C. Berkeley. Titlebar cleanup code. */ #ifndef lint *************** *** 51,56 XBell(dpy, VOLUME_PERCENTAGE(Volume)); XBell(dpy, VOLUME_PERCENTAGE(Volume)); XFlush(dpy); execvp(*Argv, Argv, Environ); fprintf(stderr, "uwm: Restart failed!\n"); } --- 52,58 ----- XBell(dpy, VOLUME_PERCENTAGE(Volume)); XBell(dpy, VOLUME_PERCENTAGE(Volume)); XFlush(dpy); + Cleanup(); execvp(*Argv, Argv, Environ); fprintf(stderr, "uwm: Restart failed!\n"); } *************** *** 61,65 int button; /* Button event detail. */ int x, y; /* Event mouse position. */ { ! exit(0); } --- 63,102 ----- int button; /* Button event detail. */ int x, y; /* Event mouse position. */ { ! Cleanup(); ! exit(0); ! } ! ! DestroyWindow(window, mask, button, x, y) ! Window window; ! int mask; ! int x, y; ! { ! if (window == RootWindow(dpy, scr)) ! return(FALSE); ! XDestroyWindow(dpy, window); ! return(TRUE); ! } ! ! /* ! * Put any necessary cleanup code here, it will be invoked when uwm exits ! * or restarts. Currently just checks for title bar resources. ! */ ! Cleanup() ! { ! Window junk, *windows; ! int nwins; ! ! if (XQueryTree(dpy, DefaultRootWindow(dpy), &junk, &junk, &windows, &nwins) ! != BadWindow) { ! unsigned int i; ! ! for (i = 0; i < nwins; i++) { ! TitleData *data; ! ! if ((data = GetTitleInfo(windows[i])) != NULL) ! DestroyTitle(data, False); ! } ! XFree(windows); ! } } *** uwm.new/globals.c Mon Dec 7 00:59:40 1987 --- uwm.new/globals.c Sat Dec 12 09:53:42 1987 *************** *** 35,40 * 002 -- Loretta Guarino Reid, DEC Ultrix Engineering Group * Western Software Lab. April 17, 1987 * Convert to X11 */ #ifndef lint --- 35,41 ----- * 002 -- Loretta Guarino Reid, DEC Ultrix Engineering Group * Western Software Lab. April 17, 1987 * Convert to X11 + * 003 -- Jordan Hubbard, U.C. Berkeley. Misc new vars. */ #ifndef lint *************** *** 52,57 XFontStruct *IFontInfo; /* Icon text font information. */ XFontStruct *PFontInfo; /* Pop-up text font information. */ XFontStruct *MFontInfo; /* Menu text font information. */ Pixmap GrayPixmap; /* Gray pixmap. */ Pixel IBorder; /* Icon window border pixmap. */ Pixmap IBackground; /* Icon window background pixmap. */ --- 53,60 ----- XFontStruct *IFontInfo; /* Icon text font information. */ XFontStruct *PFontInfo; /* Pop-up text font information. */ XFontStruct *MFontInfo; /* Menu text font information. */ + XFontStruct *TFontInfo; /* Title text font information. */ + XFontStruct *TFontBoldInfo; /* Title text (bold) font information. */ Pixmap GrayPixmap; /* Gray pixmap. */ Pixel IBorder; /* Icon window border pixmap. */ Pixmap IBackground; /* Icon window background pixmap. */ *************** *** 91,96 int VMenuPad; /* Menu vertical padding. */ int MaxColors; /* Maximum number of colors to use. */ int Pushval = 5; /* Number of pixels to push window by. */ int Volume; /* Audible alarm volume. */ int status; /* Routine return status. */ int Maxfd; /* Maximum file descriptors for select(2). */ --- 94,100 ----- int VMenuPad; /* Menu vertical padding. */ int MaxColors; /* Maximum number of colors to use. */ int Pushval = 5; /* Number of pixels to push window by. */ + int RaiseDelay; /* Number of milliseconds delay before autoraise */ int Volume; /* Audible alarm volume. */ int status; /* Routine return status. */ int Maxfd; /* Maximum file descriptors for select(2). */ *************** *** 103,108 Binding *Blist; /* Button/key binding list. */ Bool Autoselect; /* Warp mouse to default menu selection? */ Bool Freeze; /* Freeze server during move/resize? */ Bool Grid; /* Should the m/r box contain a 9 seg. grid. */ Bool NWindow; /* Normalize windows? */ --- 107,113 ----- Binding *Blist; /* Button/key binding list. */ Bool Autoselect; /* Warp mouse to default menu selection? */ + Bool Autoraise; /* Raise window on input focus? */ Bool Freeze; /* Freeze server during move/resize? */ Bool Grid; /* Should the m/r box contain a 9 seg. grid. */ Bool Hilite; /* Should we highlight window borders on focus? */ *************** *** 105,110 Bool Autoselect; /* Warp mouse to default menu selection? */ Bool Freeze; /* Freeze server during move/resize? */ Bool Grid; /* Should the m/r box contain a 9 seg. grid. */ Bool NWindow; /* Normalize windows? */ Bool NIcon; /* Normalize icons? */ Bool Push; /* Relative=TRUE, Absolute=FALSE. */ --- 110,116 ----- Bool Autoraise; /* Raise window on input focus? */ Bool Freeze; /* Freeze server during move/resize? */ Bool Grid; /* Should the m/r box contain a 9 seg. grid. */ + Bool Hilite; /* Should we highlight window borders on focus? */ Bool NWindow; /* Normalize windows? */ Bool NIcon; /* Normalize icons? */ Bool Push; /* Relative=TRUE, Absolute=FALSE. */ *************** *** 108,113 Bool NWindow; /* Normalize windows? */ Bool NIcon; /* Normalize icons? */ Bool Push; /* Relative=TRUE, Absolute=FALSE. */ Bool Reverse; /* Reverse video? */ Bool Zap; /* Should the the zap effect be used. */ Bool WarpOnRaise; /* Warp to upper right corner on raise. */ --- 114,121 ----- Bool NWindow; /* Normalize windows? */ Bool NIcon; /* Normalize icons? */ Bool Push; /* Relative=TRUE, Absolute=FALSE. */ + Bool RootResizeBox; /* Resize window is placed over sized window? */ + Bool Titles; /* Title bar frob on windows? */ Bool Reverse; /* Reverse video? */ Bool Zap; /* Should the the zap effect be used. */ Bool WarpOnRaise; /* Warp to upper right corner on raise. */ *************** *** 124,129 char IFontName[NAME_LEN]; /* Icon font name. */ char PFontName[NAME_LEN]; /* Pop-up font name. */ char MFontName[NAME_LEN]; /* Menu font name. */ char **Argv; /* Pointer to command line parameters. */ char **Environ; /* Pointer to environment. */ --- 132,139 ----- char IFontName[NAME_LEN]; /* Icon font name. */ char PFontName[NAME_LEN]; /* Pop-up font name. */ char MFontName[NAME_LEN]; /* Menu font name. */ + char TFontName[NAME_LEN]; /* Title font name. */ + char TFontBoldName[NAME_LEN]; /* Bold Title font name. */ char **Argv; /* Pointer to command line parameters. */ char **Environ; /* Pointer to environment. */ *************** *** 134,139 * Keyword lookup table for parser. */ Keyword KeywordTable[] = { { "autoselect", IsBoolTrue, &Autoselect,0,0,0 }, { "delay", IsNumeric, 0,&Delay,0,0 }, { "delta", IsNumeric, 0,&Delta,0,0 }, --- 144,151 ----- * Keyword lookup table for parser. */ Keyword KeywordTable[] = { + { "autoraise", IsBoolTrue, &Autoraise,0,0,0 }, + { "raisedelay", IsNumeric, 0,&RaiseDelay,0,0 }, { "autoselect", IsBoolTrue, &Autoselect,0,0,0 }, { "delay", IsNumeric, 0,&Delay,0,0 }, { "delta", IsNumeric, 0,&Delta,0,0 }, *************** *** 138,143 { "delay", IsNumeric, 0,&Delay,0,0 }, { "delta", IsNumeric, 0,&Delta,0,0 }, { "freeze", IsBoolTrue, &Freeze,0,0,0 }, { "iconfont", IsString, 0,0,IFontName,0 }, { "f.beep", IsQuitFunction, 0,0,0,Beep }, { "f.circledown", IsQuitFunction, 0,0,0,CircleDown }, --- 150,156 ----- { "delay", IsNumeric, 0,&Delay,0,0 }, { "delta", IsNumeric, 0,&Delta,0,0 }, { "freeze", IsBoolTrue, &Freeze,0,0,0 }, + { "hilite", IsBoolTrue, &Hilite,0,0,0 }, { "iconfont", IsString, 0,0,IFontName,0 }, { "rootresizebox", IsBoolTrue, &RootResizeBox,0,0,0 }, { "title", IsBoolTrue, &Titles,0,0,0 }, *************** *** 139,144 { "delta", IsNumeric, 0,&Delta,0,0 }, { "freeze", IsBoolTrue, &Freeze,0,0,0 }, { "iconfont", IsString, 0,0,IFontName,0 }, { "f.beep", IsQuitFunction, 0,0,0,Beep }, { "f.circledown", IsQuitFunction, 0,0,0,CircleDown }, { "f.circleup", IsQuitFunction, 0,0,0,CircleUp }, --- 152,161 ----- { "freeze", IsBoolTrue, &Freeze,0,0,0 }, { "hilite", IsBoolTrue, &Hilite,0,0,0 }, { "iconfont", IsString, 0,0,IFontName,0 }, + { "rootresizebox", IsBoolTrue, &RootResizeBox,0,0,0 }, + { "title", IsBoolTrue, &Titles,0,0,0 }, + { "titlefont", IsString, 0,0,TFontName,0 }, + { "titlebold", IsString, 0,0,TFontBoldName,0 }, { "f.beep", IsQuitFunction, 0,0,0,Beep }, { "f.circledown", IsQuitFunction, 0,0,0,CircleDown }, { "f.circleup", IsQuitFunction, 0,0,0,CircleUp }, *************** *** 161,166 { "f.refresh", IsQuitFunction, 0,0,0,Refresh }, { "f.resize", IsDownFunction, 0,0,0,Resize }, { "f.restart", IsQuitFunction, 0,0,0,Restart }, { "grid", IsBoolTrue, &Grid,0,0,0 }, { "hiconpad", IsNumeric, 0,&HIconPad,0,0 }, { "hmenupad", IsNumeric, 0,&HMenuPad,0,0 }, --- 178,186 ----- { "f.refresh", IsQuitFunction, 0,0,0,Refresh }, { "f.resize", IsDownFunction, 0,0,0,Resize }, { "f.restart", IsQuitFunction, 0,0,0,Restart }, + { "f.destroy", IsDownFunction, 0,0,0,DestroyWindow }, + { "f.title", IsFunction, 0,0,0,FAddTitle }, + { "f.notitle", IsFunction, 0,0,0,FDestroyTitle }, { "grid", IsBoolTrue, &Grid,0,0,0 }, { "hiconpad", IsNumeric, 0,&HIconPad,0,0 }, { "hmenupad", IsNumeric, 0,&HMenuPad,0,0 }, *************** *** 167,172 { "maxcolors", IsNumeric, 0,&MaxColors,0,0 }, { "menu", IsMenu, 0,0,0,0 }, { "menufont", IsString, 0,0,MFontName,0 }, { "noautoselect", IsBoolFalse, &Autoselect,0,0,0 }, { "nofreeze", IsBoolFalse, &Freeze,0,0,0 }, { "nogrid", IsBoolFalse, &Grid,0,0,0 }, --- 187,193 ----- { "maxcolors", IsNumeric, 0,&MaxColors,0,0 }, { "menu", IsMenu, 0,0,0,0 }, { "menufont", IsString, 0,0,MFontName,0 }, + { "noautoraise", IsBoolFalse, &Autoraise,0,0,0 }, { "noautoselect", IsBoolFalse, &Autoselect,0,0,0 }, { "nofreeze", IsBoolFalse, &Freeze,0,0,0 }, { "nogrid", IsBoolFalse, &Grid,0,0,0 }, *************** *** 170,175 { "noautoselect", IsBoolFalse, &Autoselect,0,0,0 }, { "nofreeze", IsBoolFalse, &Freeze,0,0,0 }, { "nogrid", IsBoolFalse, &Grid,0,0,0 }, { "nonormali", IsBoolFalse, &NIcon,0,0,0 }, { "nonormalw", IsBoolFalse, &NWindow,0,0,0 }, { "noreverse", IsBoolFalse, &Reverse,0,0,0 }, --- 191,197 ----- { "noautoselect", IsBoolFalse, &Autoselect,0,0,0 }, { "nofreeze", IsBoolFalse, &Freeze,0,0,0 }, { "nogrid", IsBoolFalse, &Grid,0,0,0 }, + { "nohilite", IsBoolFalse, &Hilite,0,0,0 }, { "nonormali", IsBoolFalse, &NIcon,0,0,0 }, { "nonormalw", IsBoolFalse, &NWindow,0,0,0 }, { "norootresizebox",IsBoolFalse, &RootResizeBox,0,0,0 }, *************** *** 172,177 { "nogrid", IsBoolFalse, &Grid,0,0,0 }, { "nonormali", IsBoolFalse, &NIcon,0,0,0 }, { "nonormalw", IsBoolFalse, &NWindow,0,0,0 }, { "noreverse", IsBoolFalse, &Reverse,0,0,0 }, { "normali", IsBoolTrue, &NIcon,0,0,0 }, { "normalw", IsBoolTrue, &NWindow,0,0,0 }, --- 194,200 ----- { "nohilite", IsBoolFalse, &Hilite,0,0,0 }, { "nonormali", IsBoolFalse, &NIcon,0,0,0 }, { "nonormalw", IsBoolFalse, &NWindow,0,0,0 }, + { "norootresizebox",IsBoolFalse, &RootResizeBox,0,0,0 }, { "noreverse", IsBoolFalse, &Reverse,0,0,0 }, { "normali", IsBoolTrue, &NIcon,0,0,0 }, { "normalw", IsBoolTrue, &NWindow,0,0,0 }, *************** *** 175,180 { "noreverse", IsBoolFalse, &Reverse,0,0,0 }, { "normali", IsBoolTrue, &NIcon,0,0,0 }, { "normalw", IsBoolTrue, &NWindow,0,0,0 }, { "nowarpdi", IsBoolFalse, &WarpOnDeIconify,0,0,0 }, { "nowarpi", IsBoolFalse, &WarpOnIconify,0,0,0 }, { "nowarpr", IsBoolFalse, &WarpOnRaise,0,0,0 }, --- 198,204 ----- { "noreverse", IsBoolFalse, &Reverse,0,0,0 }, { "normali", IsBoolTrue, &NIcon,0,0,0 }, { "normalw", IsBoolTrue, &NWindow,0,0,0 }, + { "notitle", IsBoolFalse, &Titles,0,0,0 }, { "nowarpdi", IsBoolFalse, &WarpOnDeIconify,0,0,0 }, { "nowarpi", IsBoolFalse, &WarpOnIconify,0,0,0 }, { "nowarpr", IsBoolFalse, &WarpOnRaise,0,0,0 }, *************** *** 222,227 { "r", ROOT }, { "window", WINDOW }, { "w", WINDOW }, { NULL, NULL } }; --- 246,253 ----- { "r", ROOT }, { "window", WINDOW }, { "w", WINDOW }, + { "t", TITLE }, + { "title", TITLE }, { NULL, NULL } }; *** uwm.new/gram.y Mon Dec 7 00:59:41 1987 --- uwm.new/gram.y Sat Dec 12 09:53:46 1987 *************** *** 31,36 * 000 -- M. Gancarz, DEC Ultrix Engineering Group * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group * Western Software Lab. Convert to X11. */ %{ --- 31,38 ----- * 000 -- M. Gancarz, DEC Ultrix Engineering Group * 001 -- Loretta Guarino Reid, DEC Ultrix Engineering Group * Western Software Lab. Convert to X11. + * 002 -- Jordan Hubbard, U.C. Berkeley. New keywords. Menu + * changes. */ %{ *************** *** 58,63 static MenuLine *ml_ptr; /* Temporary menu line pointer. */ static char *hcolors[4]; /* Color values used in menu hdrs. */ static char *mcolors[2]; /* Color values used in menus. */ MenuLink *menu_link; /* Temporary menu link pointer. */ char *calloc(); --- 60,67 ----- static MenuLine *ml_ptr; /* Temporary menu line pointer. */ static char *hcolors[4]; /* Color values used in menu hdrs. */ static char *mcolors[2]; /* Color values used in menus. */ + static Bool true = TRUE; /* hack */ + static Bool false = FALSE; /* ditto */ MenuLink *menu_link; /* Temporary menu link pointer. */ char *calloc(); *************** *** 233,239 ; contexpr: /* empty */ ! { $$ = ROOT | WINDOW | ICON; } | contmask { $$ = $1; } | contmask '|' contmask --- 237,243 ----- ; contexpr: /* empty */ ! { $$ = ROOT | WINDOW | ICON | TITLE; } | contmask { $$ = $1; } | contmask '|' contmask *************** *** 308,313 if ((ki != -1) && (KeywordTable[ki].type != IsFunction) && (KeywordTable[ki].type != IsQuitFunction) && (KeywordTable[ki].type != IsDownFunction)) { sprintf(msg, "menu action \"%s\" not a function", --- 312,319 ----- if ((ki != -1) && (KeywordTable[ki].type != IsFunction) && (KeywordTable[ki].type != IsQuitFunction) && + (KeywordTable[ki].type != IsBoolTrue) && + (KeywordTable[ki].type != IsBoolFalse) && (KeywordTable[ki].type != IsDownFunction)) { sprintf(msg, "menu action \"%s\" not a function or variable", *************** *** 310,316 (KeywordTable[ki].type != IsQuitFunction) && (KeywordTable[ki].type != IsDownFunction)) { sprintf(msg, ! "menu action \"%s\" not a function", KeywordTable[ki].name); yyerror(msg); } --- 316,322 ----- (KeywordTable[ki].type != IsBoolFalse) && (KeywordTable[ki].type != IsDownFunction)) { sprintf(msg, ! "menu action \"%s\" not a function or variable", KeywordTable[ki].name); yyerror(msg); } *************** *** 317,323 ml_ptr = AllocMenuLine(); if (KeywordTable[ki].type == IsQuitFunction) ml_ptr->type = IsImmFunction; ! else ml_ptr->type = IsUwmFunction; ml_ptr->func = KeywordTable[ki].fptr; $$ = ml_ptr; } --- 323,345 ----- ml_ptr = AllocMenuLine(); if (KeywordTable[ki].type == IsQuitFunction) ml_ptr->type = IsImmFunction; ! /* ! * The following is a KLUDGE. It uses variables that were ! * intended for other purposes but happen to be going where ! * we want to go. The code is intended to add the dubiously ! * useful option of setting boolean uwm variables from menus. ! */ ! else if (KeywordTable[ki].type == IsBoolTrue || ! KeywordTable[ki].type == IsBoolFalse) { ! ml_ptr->type = IsVar; ! ml_ptr->text = (char *)KeywordTable[ki].bptr; ! if (KeywordTable[ki].type == IsBoolTrue) ! ml_ptr->aux = (char *)&true; ! else ! ml_ptr->aux = (char *)&false; ! } ! else ! ml_ptr->type = IsUwmFunction; ml_ptr->func = KeywordTable[ki].fptr; $$ = ml_ptr; } *************** *** 338,344 } | '!' strings { ! $$ = StashMenuLine(IsShellCommand, $2); } | '^' strings { --- 360,366 ----- } | '!' strings { ! $$ = StashMenuLine(IsShellCommand, $2, 0); } | '^' strings { *************** *** 342,348 } | '^' strings { ! $$ = StashMenuLine(IsTextNL, $2); } | '|' strings { --- 364,370 ----- } | '^' strings { ! $$ = StashMenuLine(IsTextNL, $2, 0); } | '|' strings { *************** *** 346,352 } | '|' strings { ! $$ = StashMenuLine(IsText, $2); } ; --- 368,374 ----- } | '|' strings { ! $$ = StashMenuLine(IsText, $2, 0); } ; *************** *** 563,569 bindtofunc(index, mask, context, name) int index; /* Index into keyword table. */ int mask; /* Button/key/modifier mask. */ ! int context; /* ROOT, WINDOW, or ICON. */ char *name; /* Menu, if needed. */ { if (context & ROOT) --- 585,591 ----- bindtofunc(index, mask, context, name) int index; /* Index into keyword table. */ int mask; /* Button/key/modifier mask. */ ! int context; /* ROOT, WINDOW, TITLE or ICON. */ char *name; /* Menu, if needed. */ { if (context & ROOT) *************** *** 572,577 setbinding(ICON, index, mask, name); if (context & WINDOW) setbinding(WINDOW, index, mask, name); } /* --- 594,601 ----- setbinding(ICON, index, mask, name); if (context & WINDOW) setbinding(WINDOW, index, mask, name); + if (context & TITLE) + setbinding(TITLE, index, mask, name); } /* *************** *** 687,693 * Stash the data in a menu line. */ MenuLine * ! StashMenuLine(type, string) int type; char *string; { --- 711,717 ----- * Stash the data in a menu line. */ MenuLine * ! StashMenuLine(type, string, aux) int type; char *string, *aux; { *************** *** 689,695 MenuLine * StashMenuLine(type, string) int type; ! char *string; { MenuLine *ptr; --- 713,719 ----- MenuLine * StashMenuLine(type, string, aux) int type; ! char *string, *aux; { MenuLine *ptr; *************** *** 696,701 ptr = AllocMenuLine(); ptr->type = type; ptr->text = string; return(ptr); } --- 720,726 ----- ptr = AllocMenuLine(); ptr->type = type; ptr->text = string; + ptr->aux = aux; return(ptr); } //E*O*F uwm.patches.1// exit 0