|
|
1.1 root 1: /*
2: * @(#)scrollbar.c 1.11 (Berkeley/CSRG) 9/18/87
3: * $Source: /u1/X/xterm/RCS/scrollbar.c,v $
4: * $Header: scrollbar.c,v 10.100 86/12/01 14:45:27 jg Rel $
5: */
6:
7: #include <stdio.h>
8: #include <sys/time.h>
9: #include <X/Xlib.h>
10: #include <setjmp.h>
11: #include "scrollbar.h"
12: #include "ptyx.h"
13: #include "data.h"
14: #include "error.h"
15: #ifdef MODEMENU
16: #include "menu.h"
17: #endif MODEMENU
18:
19: #include "button.ic"
20: #include "dark.ic"
21: #include "light.ic"
22: #include "upline.ic"
23: #include "downline.ic"
24: #include "uppage.ic"
25: #include "downpage.ic"
26: #include "top.ic"
27: #include "bottom.ic"
28: #include "saveoff.ic"
29: #include "saveon.ic"
30: #include "sbcursor.cursor"
31: #include "sbcursor_mask.cursor"
32: #ifndef lint
33: static char csrg_id[] = "@(#)scrollbar.c 1.11\t(Berkeley/CSRG)\t9/18/87";
34: static char sccs_id[] = "@(#)scrollbar.c\tX10/6.6B\t12/26/86";
35: #endif lint
36:
37: static struct timeval stepspeed;
38:
39: ScrollBar *
40: CreateScrollBar(w, x, y, height, fg, bg, bordertile, val, valregion,
41: topval, botval, arrow)
42: Window w;
43: int x, y, height, fg, bg, val, valregion, topval, botval;
44: Pixmap bordertile;
45: Cursor arrow;
46: {
47: register ScrollBar *sb;
48: register int i;
49: Pixmap btile, bgnd;
50: extern char *calloc();
51: static Window Make_tiled_window();
52: extern Pixmap Make_tile();
53:
54: if(!w || height < MINSCROLLBARHEIGHT ||
55: (sb = (ScrollBar *)calloc(1, sizeof(ScrollBar))) == NULL)
56: return(NULL);
57: btile = bordertile;
58: if(bg == BlackPixel && fg == WhitePixel) {
59: bg = WhitePixel;
60: fg = BlackPixel;
61: if(btile == WhitePixmap)
62: btile = BlackPixmap;
63: }
64: sb->fg = fg;
65: sb->bg = bg;
66: sb->cursor = XCreateCursor(sbcursor_width, sbcursor_height,
67: sbcursor_bits, sbcursor_mask_bits,
68: sbcursor_x_hot, sbcursor_y_hot,
69: fg, bg, GXcopy);
70: if((sb->bar = Make_tiled_window(light_width, light_height, light_bits,
71: fg, bg, &bgnd, w, x, y, (SCROLLBARWIDTH - 1), height, 1, bordertile))
72: == NULL)
73: goto failed_bar;
74: if((sb->button = XCreateWindow(sb->bar, -1, -1, (SCROLLBARWIDTH - 1),
75: BUTTONHEIGHT - 1, 1, btile, bgnd)) == NULL)
76: goto failed_button;
77: if((sb->save = XCreateWindow(sb->bar, -1, BUTTONHEIGHT - 1,
78: (SCROLLBARWIDTH - 1), BUTTONHEIGHT - 1, 1, btile, bgnd)) == NULL)
79: goto failed_save;
80: if((sb->region = Make_tiled_window(dark_width, dark_height, dark_bits,
81: fg, bg, &bgnd, sb->bar, 0, 0, (SCROLLBARWIDTH - 1), 10, 0,
82: (Pixmap)NULL)) == NULL) {
83: XDestroyWindow(sb->save);
84: failed_save:
85: XDestroyWindow(sb->button);
86: failed_button:
87: XDestroyWindow(sb->bar);
88: failed_bar:
89: free((char *)sb);
90: return(NULL);
91: }
92: sb->savebits[SAVE_OFF] = saveoff_bits;
93: sb->savebits[SAVE_ON] = saveon_bits;
94: sb->buttonbits[BUTTON_UPLINE / 2] = upline_bits;
95: sb->buttonbits[BUTTON_DOWNLINE / 2] = downline_bits;
96: sb->buttonbits[BUTTON_UPPAGE / 2] = uppage_bits;
97: sb->buttonbits[BUTTON_DOWNPAGE / 2] = downpage_bits;
98: sb->buttonbits[BUTTON_TOP / 2] = top_bits;
99: sb->buttonbits[BUTTON_BOTTOM / 2] = bottom_bits;
100: sb->buttonbits[BUTTON_NORMAL / 2] = button_bits;
101: XDefineCursor(sb->bar, sb->cursor);
102: XSelectInput(sb->bar, ButtonPressed | ButtonReleased | ExposeWindow |
103: EnterWindow | LeaveWindow | UnmapWindow);
104: XSelectInput(sb->button, EnterWindow | LeaveWindow);
105: XMapWindow(sb->button); /* will really map when bar is mapped */
106: XMapWindow(sb->save); /* will really map when bar is mapped */
107: sb->buttonstate = sb->buttonset = BUTTON_NORMAL;
108: sb->savestate = sb->saveset = SAVE_ON;
109: sb->set.value = val;
110: sb->set.regionheight = valregion;
111: sb->set.topvalue = topval;
112: sb->set.bottomvalue = botval;
113: sb->set.height = height - BARSTART;
114: return(sb);
115: }
116:
117: ShowScrollBar(sb)
118: register ScrollBar *sb;
119: {
120: if(sb->visible)
121: return;
122: sb->visible = 1;
123: if(sb->regionvisible) {
124: XUnmapWindow(sb->region);
125: sb->regionvisible = 0;
126: }
127: XMapWindow(sb->bar);
128: DrawScrollRegion(sb);
129: sb->action = SHOW;
130: }
131:
132: HideScrollBar(sb)
133: register ScrollBar *sb;
134: {
135: if(!sb->visible)
136: return;
137: sb->visible = 0;
138: XUnmapWindow(sb->bar);
139: }
140:
141: DrawScrollRegion(sb)
142: register ScrollBar *sb;
143: {
144: register int region, temp;
145:
146: if(sb->set.regionheight <= 0)
147: sb->set.regionheight = 0;
148: if((region = sb->set.topvalue - sb->set.bottomvalue) >= 0) {
149: if(sb->set.value > sb->set.topvalue)
150: sb->set.value = sb->set.topvalue;
151: else if(sb->set.value < sb->set.bottomvalue)
152: sb->set.value = sb->set.bottomvalue;
153: } else {
154: region = -region;
155: if(sb->set.value < sb->set.topvalue)
156: sb->set.value = sb->set.topvalue;
157: else if(sb->set.value > sb->set.bottomvalue)
158: sb->set.value = sb->set.bottomvalue;
159: }
160: if(sb->set.value == sb->set.topvalue) {
161: sb->set.pixelheight = (region == 0) ? sb->set.height :
162: (sb->set.height - 1) * sb->set.regionheight /
163: (sb->set.regionheight + region);
164: sb->set.y = BARSTART;
165: } else if(sb->set.value == sb->set.bottomvalue) {
166: sb->set.pixelheight = (sb->set.height - 1) *
167: sb->set.regionheight / (sb->set.regionheight + region);
168: sb->set.y = BARSTART + sb->set.height - sb->set.pixelheight;
169: } else {
170: if(sb->set.topvalue >= sb->set.bottomvalue) {
171: temp = sb->set.topvalue - 1;
172: region = temp - (sb->set.bottomvalue + 1);
173: sb->set.y = temp - sb->set.value;
174: } else {
175: temp = sb->set.topvalue + 1;
176: region = (sb->set.bottomvalue - 1) - temp;
177: sb->set.y = sb->set.value - temp;
178: }
179: sb->set.y = (BARSTART + 1) + sb->set.y * (sb->set.height - 2) /
180: (temp = sb->set.regionheight + region);
181: sb->set.pixelheight = (sb->set.height - 2) *
182: sb->set.regionheight / temp;
183: }
184: if(sb->set.pixelheight <= 0)
185: sb->set.pixelheight = 1;
186: if(sb->set.regionheight == 0) {
187: sb->state = sb->set;
188: if(sb->regionvisible) {
189: XUnmapWindow(sb->region);
190: sb->regionvisible = 0;
191: }
192: return;
193: }
194: if(!sb->visible || sb->regionvisible
195: && sb->state.y == sb->set.y
196: && sb->state.pixelheight == sb->set.pixelheight) {
197: sb->state = sb->set;
198: return;
199: }
200: sb->state = sb->set;
201: XConfigureWindow(sb->region, 0, sb->state.y, (SCROLLBARWIDTH - 1),
202: sb->state.pixelheight);
203: if(!sb->regionvisible) {
204: XMapWindow(sb->region);
205: sb->regionvisible = 1;
206: }
207: }
208:
209: DrawButton(sb)
210: register ScrollBar *sb;
211: {
212: register int fg, bg;
213:
214: if(sb->visible && sb->buttonstate != sb->buttonset) {
215: if((sb->buttonstate = sb->buttonset) & HILITED) {
216: fg = sb->bg;
217: bg = sb->fg;
218: } else {
219: fg = sb->fg;
220: bg = sb->bg;
221: }
222: XBitmapBitsPut(sb->button, 0, 0, SCROLLBARWIDTH - 1,
223: BUTTONHEIGHT - 1, sb->buttonbits[sb->buttonstate / 2],
224: fg, bg, (Bitmap)0, GXcopy, AllPlanes);
225: }
226: }
227:
228: DrawSave(sb)
229: register ScrollBar *sb;
230: {
231: if(sb->visible && sb->savestate != sb->saveset)
232: XBitmapBitsPut(sb->save, 0, 0, SCROLLBARWIDTH - 1,
233: BUTTONHEIGHT - 1, sb->savebits[sb->savestate = sb->saveset],
234: sb->fg, sb->bg, (Bitmap)0, GXcopy, AllPlanes);
235: }
236:
237: ResizeScrollBar(sb, x, y, height, region)
238: register ScrollBar *sb;
239: int x, y, height, region;
240: {
241: register int act;
242:
243: act = sb->action;
244: sb->action = NONE;
245: switch(act) {
246: case SHOW:
247: return;
248: case HIDE:
249: HideScrollBar(sb);
250: return;
251: }
252: if(!sb->visible)
253: return;
254: if(sb->regionvisible) {
255: XUnmapWindow(sb->region);
256: sb->regionvisible = 0;
257: }
258: XConfigureWindow(sb->bar, x, y, (SCROLLBARWIDTH - 1), height);
259: sb->set.height = height - BARSTART;
260: sb->set.regionheight = region;
261: DrawScrollRegion(sb);
262: }
263:
264: PositionRegion(sb, y)
265: register ScrollBar *sb;
266: register int y;
267: {
268: if(y <= BARSTART)
269: sb->set.value = sb->set.topvalue;
270: else if(y >= BARSTART + sb->set.height *
271: (sb->set.bottomvalue - sb->set.topvalue) /
272: (sb->set.bottomvalue + sb->set.regionheight - sb->set.topvalue))
273: sb->set.value = sb->set.bottomvalue;
274: else
275: sb->set.value = sb->set.topvalue + (y - BARSTART) *
276: (sb->set.bottomvalue + sb->set.regionheight - sb->set.topvalue)
277: / sb->set.height;
278: DrawScrollRegion(sb);
279: return(sb->state.value);
280: }
281:
282: ButtonRegion(sb)
283: register ScrollBar *sb;
284: {
285: register int reverse, pagesize;
286:
287: if(!(sb->buttonset & HILITED))
288: return(sb->set.value);
289: reverse = (sb->set.bottomvalue > sb->set.topvalue);
290: pagesize = sb->set.regionheight - 1;
291: switch(sb->buttonset) {
292: case BUTTON_UPLINEHI:
293: if(reverse)
294: sb->set.value--;
295: else
296: sb->set.value++;
297: break;
298: case BUTTON_DOWNLINEHI:
299: if(reverse)
300: sb->set.value++;
301: else
302: sb->set.value--;
303: break;
304: case BUTTON_UPPAGEHI:
305: if(reverse)
306: sb->set.value -= pagesize;
307: else
308: sb->set.value += pagesize;
309: break;
310: case BUTTON_DOWNPAGEHI:
311: if(reverse)
312: sb->set.value += pagesize;
313: else
314: sb->set.value -= pagesize;
315: break;
316: case BUTTON_TOPHI:
317: sb->set.value = sb->set.topvalue;
318: break;
319: case BUTTON_BOTTOMHI:
320: sb->set.value = sb->set.bottomvalue;
321: }
322: DrawScrollRegion(sb);
323: return(sb->set.value);
324: }
325:
326: DownButtonDown(term, reply, pty)
327: Terminal *term;
328: register XKeyOrButtonEvent *reply;
329: int pty; /* file descriptor of pty */
330: {
331: register Screen *screen = &term->screen;
332: register ScrollBar *sb = screen->sb;
333: register Window window = reply->subwindow;
334:
335: if(!window || window == sb->region) {
336: register int page = sb->set.regionheight;
337: register int height = sb->set.height + BARSTART;
338:
339: if (reply->detail & ShiftMask)
340: sb->set.value += page * (height - reply->y) / height;
341: else
342: sb->set.value += page * reply->y / height;
343: DrawScrollRegion(sb);
344: WindowScroll(screen, sb->set.value);
345: sb->buttonset = BUTTON_DOWNLINEHI;
346: stepspeed.tv_usec = PAUSETIME;
347: screen->timeout = &stepspeed;
348: return;
349: }
350: if(window == sb->save) {
351: SetSaveState(sb, !GetSaveState(sb));
352: return;
353: }
354: if(window != sb->button) {
355: Bell();
356: return;
357: }
358: if(reply->detail & ControlMask)
359: sb->buttonset = BUTTON_BOTTOMHI;
360: else if(reply->detail & ShiftMask)
361: sb->buttonset = BUTTON_DOWNPAGEHI;
362: else {
363: sb->buttonset = BUTTON_DOWNLINEHI;
364: stepspeed.tv_usec = PAUSETIME;
365: screen->timeout = &stepspeed;
366: WindowScroll(screen, ButtonRegion(screen->sb));
367: }
368: DrawButton(sb);
369: }
370:
371: UpButtonDown(term, reply, pty)
372: Terminal *term;
373: register XKeyOrButtonEvent *reply;
374: int pty; /* file descriptor of pty */
375: {
376: register Screen *screen = &term->screen;
377: register ScrollBar *sb = screen->sb;
378: register Window window = reply->subwindow;
379:
380: if(window == sb->save) {
381: SetSaveState(sb, !GetSaveState(sb));
382: return;
383: }
384: if(!window || window == sb->region) {
385: register int page = sb->set.regionheight;
386: register int height = sb->set.height + BARSTART;
387:
388: if (reply->detail & ShiftMask)
389: sb->set.value -= page * (height - reply->y) / height;
390: else
391: sb->set.value -= page * reply->y / height;
392: DrawScrollRegion(sb);
393: WindowScroll(screen, sb->set.value);
394: sb->buttonset = BUTTON_UPLINEHI;
395: stepspeed.tv_usec = PAUSETIME;
396: screen->timeout = &stepspeed;
397: return;
398: }
399: if(window != sb->button) {
400: Bell();
401: return;
402: }
403: if(reply->detail & ControlMask)
404: sb->buttonset = BUTTON_TOPHI;
405: else if(reply->detail & ShiftMask)
406: sb->buttonset = BUTTON_UPPAGEHI;
407: else {
408: sb->buttonset = BUTTON_UPLINEHI;
409: stepspeed.tv_usec = PAUSETIME;
410: screen->timeout = &stepspeed;
411: WindowScroll(screen, ButtonRegion(screen->sb));
412: }
413: DrawButton(sb);
414: }
415:
416: ButtonUp(term, reply, pty)
417: Terminal *term;
418: XKeyOrButtonEvent *reply;
419: int pty; /* file descriptor of pty */
420: {
421: register Screen *screen = &term->screen;
422: register ScrollBar *sb = screen->sb;
423: register int state;
424:
425: if((state = GetButtonState(sb)) == BUTTON_NORMAL)
426: return;
427: /* don't scroll further on line mode */
428: if(state > BUTTON_DOWNLINEHI)
429: WindowScroll(screen, ButtonRegion(sb));
430: sb->buttonset = BUTTON_NORMAL;
431: DrawButton(sb);
432: screen->timeout = NULL;
433: XUngrabMouse();
434: }
435:
436: WindowScroll(screen, top)
437: register Screen *screen;
438: int top;
439: {
440: register int i, lines;
441: register int scrolltop, scrollheight, refreshtop;
442:
443: if((i = screen->topline - top) == 0)
444: return;
445: if(screen->cursor_state)
446: HideCursor();
447: lines = i > 0 ? i : -i;
448: if(lines > screen->max_row + 1)
449: lines = screen->max_row + 1;
450: scrollheight = screen->max_row - lines + 1;
451: if(i > 0)
452: refreshtop = scrolltop = 0;
453: else {
454: scrolltop = lines;
455: refreshtop = scrollheight;
456: }
457: if(scrollheight > 0) {
458: if (screen->multiscroll && scrollheight == 1 &&
459: screen->topline == 0 && screen->top_marg == 0 &&
460: screen->bot_marg == screen->max_row) {
461: if (screen->incopy < 0 && screen->scrolls == 0)
462: CopyWait (screen);
463: screen->scrolls++;
464: } else {
465: if (screen->incopy)
466: CopyWait (screen);
467: screen->incopy = -1;
468: }
469: XMoveArea(VWindow(screen), screen->border, scrolltop *
470: FontHeight(screen) + screen->border + Titlebar(screen),
471: screen->border, (scrolltop + i) * FontHeight(screen) +
472: screen->border + Titlebar(screen), Width(screen),
473: scrollheight * FontHeight(screen));
474: }
475: screen->topline = top;
476: XTileSet(VWindow(screen), screen->border, refreshtop * FontHeight(screen) +
477: screen->border + Titlebar(screen), Width(screen), lines *
478: FontHeight(screen), screen->bgndtile);
479: ScrnRefresh(screen, refreshtop, 0, lines, screen->max_col + 1);
480: }
481:
482: ScrollBarOn(screen, show, init)
483: register Screen *screen;
484: int show, init;
485: {
486: register int border = 2 * screen->border;
487: register int i;
488: char *realloc(), *calloc();
489:
490: if(screen->scrollbar)
491: return;
492: if(!screen->sb) {
493: if((screen->sb = CreateScrollBar(VWindow(screen),
494: Width(screen) + border, Titlebar(screen) - 1,
495: Height(screen) + border, screen->foreground,
496: screen->background, screen->bordertile, 0,
497: screen->max_row + 1, 0, 0, screen->arrow)) == NULL) {
498: Bell();
499: return;
500: }
501: if((screen->allbuf = (ScrnBuf) realloc(screen->buf,
502: 2*(screen->max_row + 2 + screen->savelines) * sizeof(char *)))
503: == NULL)
504: Error (ERROR_SBRALLOC);
505: screen->buf = &screen->allbuf[2 * screen->savelines];
506: bcopy ((char *)screen->allbuf, (char *)screen->buf,
507: 2 * (screen->max_row + 2) * sizeof (char *));
508: for(i = 2 * screen->savelines - 1 ; i >= 0 ; i--)
509: if((screen->allbuf[i] =
510: calloc(screen->max_col + 1, sizeof(char))) == NULL)
511: Error (ERROR_SBRALLOC2);
512: screen->sb->saveset = !screen->alternate;
513: } else {
514: XConfigureWindow(screen->sb->bar, FullWidth(screen),
515: Titlebar(screen) - 1, (SCROLLBARWIDTH - 1),
516: i = FullHeight(screen) - Titlebar(screen));
517: screen->sb->set.height = i - BARSTART;
518: screen->sb->set.regionheight = screen->max_row + 1;
519: }
520: if(show) {
521: screen->scrollbar = SCROLLBARWIDTH;
522: ShowScrollBar(screen->sb);
523: if(!init) {
524: XSetResizeHint(VWindow(screen), border + SCROLLBARWIDTH,
525: border + Titlebar(screen) + screen->statusheight,
526: FontWidth(screen), FontHeight(screen));
527: XChangeWindow(VWindow(screen), (screen->max_col + 1) *
528: FontWidth(screen) + border + SCROLLBARWIDTH,
529: FontHeight(screen) * (screen->max_row + 1) +
530: screen->statusheight + border + Titlebar(screen));
531: }
532: }
533: }
534:
535: ScrollBarOff(screen)
536: register Screen *screen;
537: {
538: register int border = 2 * screen->border;
539:
540: if(!screen->scrollbar)
541: return;
542: screen->sb->action = HIDE;
543: screen->scrollbar = 0;
544: XSetResizeHint(VWindow(screen), border, border + Titlebar(screen) +
545: screen->statusheight, FontWidth(screen), FontHeight(screen));
546: XChangeWindow(VWindow(screen), (screen->max_col + 1) * FontWidth(screen) +
547: border, FontHeight(screen) * (screen->max_row + 1) + screen->statusheight
548: + border + Titlebar(screen));
549: }
550:
551: ClearLinesOffTop(screen)
552: register Screen *screen;
553: {
554: if(!screen->sb)
555: return;
556: if(screen->topline)
557: WindowScroll(screen, 0);
558: SetScrollBarTop(screen->sb, 0);
559: DrawScrollRegion(screen->sb);
560: }
561:
562: SetSaveState(sb, state)
563: register ScrollBar *sb;
564: int state;
565: {
566: extern Terminal term;
567: register Screen *screen = &term.screen;
568:
569: if(screen->alternate)
570: return;
571: if(screen->scroll_amt)
572: FlushScroll(screen);
573: sb->saveset = state;
574: DrawSave(sb);
575: }
576:
577: SetButtonState(sb, state)
578: register ScrollBar *sb;
579: int state;
580: {
581: sb->buttonset = state;
582: DrawButton(sb);
583: }
584:
585: static Window
586: Make_tiled_window(bitmap_width, bitmap_height, bitmap_bits, foreground,
587: background, bgnd, parent, x, y, width, height, borderwidth, bordertile)
588: int bitmap_width, bitmap_height, foreground, background, x, y, width,
589: height, borderwidth;
590: short *bitmap_bits;
591: Window parent;
592: Pixmap *bgnd, bordertile;
593: {
594: register Pixmap pix;
595: register Window w;
596: extern Pixmap Make_tile();
597:
598: if((pix = Make_tile(bitmap_width, bitmap_height, bitmap_bits,
599: foreground, background)) == NULL)
600: return(NULL);
601: w = XCreateWindow(parent, x, y, width, height, borderwidth, bordertile,
602: pix);
603: *bgnd = pix;
604: return(w);
605: }
606:
607: Pixmap
608: Make_tile(bitmap_width, bitmap_height, bitmap_bits, foreground, background)
609: int bitmap_width, bitmap_height, foreground, background;
610: short *bitmap_bits;
611: {
612: register Bitmap bm;
613: register Pixmap pix;
614:
615: if((bm = XStoreBitmap(bitmap_width, bitmap_height, bitmap_bits))
616: == NULL)
617: return(NULL);
618: pix = XMakePixmap(bm, foreground, background);
619: XFreeBitmap(bm);
620: return(pix);
621: }
622:
623: ScrollToBottom(sb)
624: register ScrollBar *sb;
625: {
626: SetScrollBarValue(sb, GetScrollBarBottom(sb));
627: DrawScrollRegion(sb);
628: WindowScroll(&term.screen, GetScrollBarValue(sb));
629: }
630:
631: #ifdef MODEMENU
632: #define SMENU_SCROLLKEY 0
633: #define SMENU_SCROLLINPUT (SMENU_SCROLLKEY+1)
634: #define SMENU_LINESTOP (SMENU_SCROLLINPUT+1)
635: #define SMENU_LINE (SMENU_LINESTOP+1)
636: #define SMENU_CLEARTOP (SMENU_LINE+1)
637: #define SMENU_HIDE (SMENU_CLEARTOP+1)
638:
639: static char *stext[] = {
640: "Scroll to Bottom on Key",
641: "Scroll to Bottom on Input",
642: "Lines Off Top Saved",
643: "-",
644: "Clear Lines Off Top",
645: "Hide Scrollbar",
646: 0,
647: };
648:
649:
650: static int salternate;
651: static int slinestop;
652: static int sscrollinput;
653: static int sscrollkey;
654:
655: Menu *ssetupmenu(menu)
656: register Menu **menu;
657: {
658: register Screen *screen = &term.screen;
659: register char **cp;
660:
661: if (*menu == NULL) {
662: if ((*menu = NewMenu("Scrollbar", re_verse)) == NULL)
663: return(NULL);
664: for(cp = stext ; *cp ; cp++)
665: AddMenuItem(*menu, *cp);
666: if(sscrollkey = screen->scrollkey)
667: CheckItem(*menu, SMENU_SCROLLKEY);
668: if(sscrollinput = screen->scrollinput)
669: CheckItem(*menu, SMENU_SCROLLINPUT);
670: if(slinestop = (screen->sb && GetSaveState(screen->sb)))
671: CheckItem(*menu, SMENU_LINESTOP);
672: if(salternate = screen->alternate)
673: DisableItem(*menu, SMENU_LINESTOP);
674: DisableItem(*menu, SMENU_LINE);
675: return(*menu);
676: }
677: if(sscrollkey != screen->scrollkey)
678: SetItemCheck(*menu, SMENU_SCROLLKEY, (sscrollkey =
679: screen->scrollkey));
680: if(sscrollinput != screen->scrollinput)
681: SetItemCheck(*menu, SMENU_SCROLLINPUT, (sscrollinput =
682: screen->scrollinput));
683: if(screen->sb && slinestop != GetSaveState(screen->sb))
684: SetItemCheck(*menu, SMENU_LINESTOP, (slinestop =
685: GetSaveState(screen->sb)));
686: if(salternate != screen->alternate)
687: SetItemDisable(*menu, SMENU_LINESTOP, (salternate =
688: screen->alternate));
689: return(*menu);
690: }
691:
692: sdomenufunc(item)
693: int item;
694: {
695: register Screen *screen = &term.screen;
696:
697: switch (item) {
698: case SMENU_SCROLLKEY:
699: screen->scrollkey = !screen->scrollkey;
700: break;
701:
702: case SMENU_SCROLLINPUT:
703: screen->scrollinput = !screen->scrollinput;
704: break;
705:
706: case SMENU_LINESTOP:
707: SetSaveState(screen->sb, !GetSaveState(screen->sb));
708: break;
709:
710: case SMENU_CLEARTOP:
711: ClearLinesOffTop(screen);
712: break;
713:
714: case SMENU_HIDE:
715: ScrollBarOff(screen);
716: break;
717: }
718: }
719: #endif MODEMENU
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.