This diff adds the capability to toggle on and off the system bell within mg via the 'audible-bell' command. It also introduces the 'visible-bell' command: the modeline will flash instead. However, both can be used together, if so desired. Comments/oks?
-lum Index: Makefile =================================================================== RCS file: /cvs/src/usr.bin/mg/Makefile,v retrieving revision 1.27 diff -u -r1.27 Makefile --- Makefile 18 Jun 2012 07:13:26 -0000 1.27 +++ Makefile 30 May 2013 18:33:42 -0000 @@ -15,7 +15,7 @@ # CFLAGS+=-Wall -DFKEYS -DREGEX -DXKEYS -SRCS= autoexec.c basic.c buffer.c cinfo.c dir.c display.c \ +SRCS= autoexec.c basic.c bell.c buffer.c cinfo.c dir.c display.c \ echo.c extend.c file.c fileio.c funmap.c help.c kbd.c keymap.c \ line.c macro.c main.c match.c modes.c paragraph.c random.c \ re_search.c region.c search.c spawn.c tty.c ttyio.c ttykbd.c \ Index: basic.c =================================================================== RCS file: /cvs/src/usr.bin/mg/basic.c,v retrieving revision 1.39 diff -u -r1.39 basic.c --- basic.c 25 Mar 2013 11:41:44 -0000 1.39 +++ basic.c 30 May 2013 18:33:42 -0000 @@ -43,8 +43,10 @@ while (n--) { if (curwp->w_doto == 0) { if ((lp = lback(curwp->w_dotp)) == curbp->b_headp) { - if (!(f & FFRAND)) + if (!(f & FFRAND)) { + dobeep(); ewprintf("Beginning of buffer"); + } return (FALSE); } curwp->w_dotp = lp; @@ -85,8 +87,10 @@ curwp->w_dotp = lforw(curwp->w_dotp); if (curwp->w_dotp == curbp->b_headp) { curwp->w_dotp = lback(curwp->w_dotp); - if (!(f & FFRAND)) + if (!(f & FFRAND)) { + dobeep(); ewprintf("End of buffer"); + } return (FALSE); } curwp->w_doto = 0; @@ -283,7 +287,7 @@ lp = curwp->w_linep; while (n--) if ((lp = lforw(lp)) == curbp->b_headp) { - ttbeep(); + dobeep(); ewprintf("End of buffer"); return(TRUE); } @@ -332,7 +336,7 @@ lp = lback(lp); } if (lp == curwp->w_linep) { - ttbeep(); + dobeep(); ewprintf("Beginning of buffer"); } curwp->w_linep = lp; Index: bell.c =================================================================== RCS file: bell.c diff -N bell.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ bell.c 30 May 2013 18:33:42 -0000 @@ -0,0 +1,57 @@ +/* $OpenBSD$ */ + +/* + * This file is in the public domain. + * + */ +/* + * Control how mg communicates with the user. + */ + +#include "def.h" + +void +bellinit(void) +{ + doaudiblebell = 1; + dovisiblebell = 0; + donebell = 0; +} + +void +dobeep(void) +{ + if (doaudiblebell) { + ttbeep(); + } + if (dovisiblebell) { + sgarbf = TRUE; + update(CNONE); + usleep(50000); + } + donebell = 1; +} + +/* ARGSUSED */ +int +toggleaudiblebell(int f, int n) +{ + if (f & FFARG) + doaudiblebell = n > 0; + else + doaudiblebell = !doaudiblebell; + + return (TRUE); +} + +/* ARGSUSED */ +int +togglevisiblebell(int f, int n) +{ + if (f & FFARG) + dovisiblebell = n > 0; + else + dovisiblebell = !dovisiblebell; + + return (TRUE); +} Index: def.h =================================================================== RCS file: /cvs/src/usr.bin/mg/def.h,v retrieving revision 1.137 diff -u -r1.137 def.h --- def.h 30 May 2013 04:17:25 -0000 1.137 +++ def.h 30 May 2013 18:33:42 -0000 @@ -424,7 +424,7 @@ int vtresize(int, int, int); void vtinit(void); void vttidy(void); -void update(void); +void update(int); int linenotoggle(int, int); int colnotoggle(int, int); @@ -681,6 +681,12 @@ int globalwdtoggle(int, int); int compile(int, int); +/* bell.c */ +void bellinit(void); +int toggleaudiblebell(int, int); +int togglevisiblebell(int, int); +void dobeep(void); + /* * Externals. */ @@ -704,6 +710,9 @@ extern int tthue; extern int defb_nmodes; extern int defb_flag; +extern int doaudiblebell; +extern int dovisiblebell; +extern int donebell; extern char cinfo[]; extern char *keystrings[]; extern char pat[NPAT]; Index: display.c =================================================================== RCS file: /cvs/src/usr.bin/mg/display.c,v retrieving revision 1.40 diff -u -r1.40 display.c --- display.c 25 Mar 2013 11:41:44 -0000 1.40 +++ display.c 30 May 2013 18:33:42 -0000 @@ -68,7 +68,7 @@ int vtputs(const char *); void vteeol(void); void updext(int, int); -void modeline(struct mgwin *); +void modeline(struct mgwin *, int); void setscores(int, int); void traceback(int, int, int, int); void ucopy(struct video *, struct video *); @@ -403,7 +403,7 @@ * virtual and physical screens the same. */ void -update(void) +update(int modelinecolor) { struct line *lp; struct mgwin *wp; @@ -503,7 +503,7 @@ } } if ((wp->w_rflag & WFMODE) != 0) - modeline(wp); + modeline(wp, modelinecolor); wp->w_rflag = 0; wp->w_frame = 0; } @@ -796,7 +796,7 @@ * characters may never be seen. */ void -modeline(struct mgwin *wp) +modeline(struct mgwin *wp, int modelinecolor) { int n, md; struct buffer *bp; @@ -804,7 +804,7 @@ int len; n = wp->w_toprow + wp->w_ntrows; /* Location. */ - vscreen[n]->v_color = CMODE; /* Mode line color. */ + vscreen[n]->v_color = modelinecolor; /* Mode line color. */ vscreen[n]->v_flag |= (VFCHG | VFHBAD); /* Recompute, display. */ vtmove(n, 0); /* Seek to right line. */ bp = wp->w_bufp; Index: echo.c =================================================================== RCS file: /cvs/src/usr.bin/mg/echo.c,v retrieving revision 1.54 diff -u -r1.54 echo.c --- echo.c 3 Nov 2012 16:28:14 -0000 1.54 +++ echo.c 30 May 2013 18:33:42 -0000 @@ -756,7 +756,7 @@ free_file_list(wholelist); popbuftop(bp, WEPHEM); /* split the screen and put up the help * buffer */ - update(); /* needed to make the new stuff actually + update(CMODE); /* needed to make the new stuff actually * appear */ ttmove(oldrow, oldcol); /* update leaves cursor in arbitrary place */ ttcolor(oldhue); /* with arbitrary color */ Index: funmap.c =================================================================== RCS file: /cvs/src/usr.bin/mg/funmap.c,v retrieving revision 1.46 diff -u -r1.46 funmap.c --- funmap.c 22 May 2013 19:23:45 -0000 1.46 +++ funmap.c 30 May 2013 18:33:42 -0000 @@ -21,6 +21,7 @@ static struct funmap functnames[] = { {apropos_command, "apropos",}, + {toggleaudiblebell, "audible-bell",}, {auto_execute, "auto-execute",}, {fillmode, "auto-fill-mode",}, {indentmode, "auto-indent-mode",}, @@ -200,6 +201,7 @@ {universal_argument, "universal-argument",}, {upperregion, "upcase-region",}, {upperword, "upcase-word",}, + {togglevisiblebell, "visible-bell",}, {tagsvisit, "visit-tags-table",}, {showcpos, "what-cursor-position",}, {filewrite, "write-file",}, Index: kbd.c =================================================================== RCS file: /cvs/src/usr.bin/mg/kbd.c,v retrieving revision 1.25 diff -u -r1.25 kbd.c --- kbd.c 12 Apr 2012 04:47:59 -0000 1.25 +++ kbd.c 30 May 2013 18:33:42 -0000 @@ -81,7 +81,7 @@ /* avoid problems with % */ ewprintf("%s", prompt); /* put the cursor back */ - update(); + update(CMODE); epresf = KCLEAR; } if (promptp > prompt) Index: main.c =================================================================== RCS file: /cvs/src/usr.bin/mg/main.c,v retrieving revision 1.70 diff -u -r1.70 main.c --- main.c 28 Dec 2012 16:12:50 -0000 1.70 +++ main.c 30 May 2013 18:33:42 -0000 @@ -18,6 +18,9 @@ int lastflag; /* flags, last command */ int curgoal; /* goal column */ int startrow; /* row to start */ +int doaudiblebell; /* audible bell toggle */ +int dovisiblebell; /* visible bell toggle */ +int donebell; /* done't wring bell */ struct buffer *curbp; /* current buffer */ struct buffer *bheadp; /* BUFFER list head */ struct mgwin *curwp; /* current window */ @@ -93,13 +96,14 @@ dirinit(); /* Get current directory. */ edinit(bp); /* Buffers, windows. */ ttykeymapinit(); /* Symbols, bindings. */ + bellinit(); /* Audible and visible bell. */ /* * doing update() before reading files causes the error messages from * the file I/O show up on the screen. (and also an extra display of * the mode line if there are files specified on the command line.) */ - update(); + update(CMODE); /* user startup file. */ if ((cp = startupfile(NULL)) != NULL) @@ -171,7 +175,7 @@ do_redraw(0, 0, TRUE); winch_flag = 0; } - update(); + update(CMODE); lastflag = thisflag; thisflag = 0; @@ -183,9 +187,11 @@ /* FALLTHRU */ case FALSE: default: - ttbeep(); + if (!donebell) + dobeep(); macrodef = FALSE; } + donebell = 0; } } Index: match.c =================================================================== RCS file: /cvs/src/usr.bin/mg/match.c,v retrieving revision 1.16 diff -u -r1.16 match.c --- match.c 4 Jun 2009 02:23:37 -0000 1.16 +++ match.c 30 May 2013 18:33:42 -0000 @@ -45,7 +45,7 @@ return (s); /* unbalanced -- warn user */ if (balance() != TRUE) - ttbeep(); + dobeep(); } return (TRUE); } @@ -152,13 +152,13 @@ curwp->w_doto = cbo; curwp->w_rflag |= WFMOVE; - update(); /* show match */ + update(CMODE); /* show match */ ttwait(1000); /* wait for key or 1 second */ curwp->w_dotp = tlp; /* return to old position */ curwp->w_doto = tbo; curwp->w_rflag |= WFMOVE; - update(); + update(CMODE); } else { /* match is not in this window, so display line in echo area */ bufo = 0; Index: mg.1 =================================================================== RCS file: /cvs/src/usr.bin/mg/mg.1,v retrieving revision 1.78 diff -u -r1.78 mg.1 --- mg.1 27 May 2013 19:28:51 -0000 1.78 +++ mg.1 30 May 2013 18:33:43 -0000 @@ -361,6 +361,8 @@ and list all .Nm commands that contain that string. +.It audible-bell +Toggle the audible system bell. .It auto-execute Register an auto-execute hook; that is, specify a filename pattern (conforming to the shell's filename globbing rules) and an associated @@ -897,6 +899,8 @@ .It upcase-word Move the cursor forward by the specified number of words. As it moves, convert any characters to upper case. +.It visible-bell +Toggle the visible bell. If this toggle is on, the modeline will flash. .It visit-tags-table Record name of the tags file to be used for subsequent find-tag. .It what-cursor-position Index: re_search.c =================================================================== RCS file: /cvs/src/usr.bin/mg/re_search.c,v retrieving revision 1.26 diff -u -r1.26 re_search.c --- re_search.c 21 Jan 2011 19:10:13 -0000 1.26 +++ re_search.c 30 May 2013 18:33:43 -0000 @@ -149,7 +149,7 @@ */ while (re_forwsrch() == TRUE) { retry: - update(); + update(CMODE); switch (getkey(FALSE)) { case ' ': plen = re_match[0].rm_eo - re_match[0].rm_so; @@ -191,7 +191,7 @@ stopsearch: curwp->w_rflag |= WFFULL; - update(); + update(CMODE); if (!inmacro) { if (rcnt == 0) ewprintf("(No replacements done)"); Index: search.c =================================================================== RCS file: /cvs/src/usr.bin/mg/search.c,v retrieving revision 1.41 diff -u -r1.41 search.c --- search.c 7 Sep 2012 19:01:56 -0000 1.41 +++ search.c 30 May 2013 18:33:44 -0000 @@ -192,7 +192,7 @@ is_prompt(dir, TRUE, success); for (;;) { - update(); + update(CMODE); switch (c = getkey(FALSE)) { case CCHR('['): @@ -248,7 +248,7 @@ is_lpush(); pptr = strlen(pat); if (forwchar(FFRAND, 1) == FALSE) { - ttbeep(); + dobeep(); success = FALSE; ewprintf("Failed I-search: %s", pat); } else { @@ -256,7 +256,7 @@ is_cpush(SRCH_MARK); else { (void)backchar(FFRAND, 1); - ttbeep(); + dobeep(); success = FALSE; ewprintf("Failed I-search: %s", pat); } @@ -285,14 +285,14 @@ is_lpush(); pptr = strlen(pat); if (backchar(FFRAND, 1) == FALSE) { - ttbeep(); + dobeep(); success = FALSE; } else { if (is_find(SRCH_BACK) != FALSE) is_cpush(SRCH_MARK); else { (void)forwchar(FFRAND, 1); - ttbeep(); + dobeep(); success = FALSE; } } @@ -322,7 +322,7 @@ break; if (pptr == NPAT - 1) { - ttbeep(); + dobeep(); break; } firstc = 0; @@ -335,7 +335,7 @@ if (dir == SRCH_FORW) { curwp->w_doto = cbo; curwp->w_rflag |= WFMOVE; - update(); + update(CMODE); } } is_prompt(dir, pptr < 0, success); @@ -373,7 +373,7 @@ if (pptr == 0) success = TRUE; if (pptr == NPAT - 1) - ttbeep(); + dobeep(); else { pat[pptr++] = c; pat[pptr] = '\0'; @@ -384,7 +384,7 @@ is_cpush(c); else { success = FALSE; - ttbeep(); + dobeep(); is_cpush(SRCH_ACCM); } } else @@ -579,7 +579,7 @@ */ while (forwsrch() == TRUE) { retry: - update(); + update(CMODE); switch (getkey(FALSE)) { case 'y': case ' ': @@ -618,7 +618,7 @@ } stopsearch: curwp->w_rflag |= WFFULL; - update(); + update(CMODE); if (rcnt == 1) ewprintf("Replaced 1 occurrence"); else @@ -647,7 +647,7 @@ plen = strlen(pat); while (forwsrch() == TRUE) { - update(); + update(CMODE); if (lreplace((RSIZE)plen, news) == FALSE) return (FALSE); @@ -655,7 +655,7 @@ } curwp->w_rflag |= WFFULL; - update(); + update(CMODE); if (rcnt == 1) ewprintf("Replaced 1 occurrence"); Index: window.c =================================================================== RCS file: /cvs/src/usr.bin/mg/window.c,v retrieving revision 1.28 diff -u -r1.28 window.c --- window.c 1 Aug 2011 12:15:23 -0000 1.28 +++ window.c 30 May 2013 18:33:44 -0000 @@ -97,7 +97,7 @@ } wp->w_ntrows = nrow - wp->w_toprow - 2; sgarbf = TRUE; - update(); + update(CMODE); } else sgarbf = TRUE; return (TRUE);