XEmacs 21.2.20 "Yoko".
[chise/xemacs-chise.git] / src / sound.c
index 170efbd..0260728 100644 (file)
@@ -25,6 +25,7 @@ Boston, MA 02111-1307, USA.  */
    Hacked on quite a bit by various others. */
 
 #include <config.h>
+#include <time.h>
 #include "lisp.h"
 
 #include "buffer.h"
@@ -45,6 +46,7 @@ Boston, MA 02111-1307, USA.  */
 #endif
 
 int bell_volume;
+int bell_inhibit_time;
 Lisp_Object Vsound_alist;
 Lisp_Object Vsynchronous_sounds;
 Lisp_Object Vnative_sound_only_on_console;
@@ -347,25 +349,28 @@ device).
 */
        (arg, sound, device))
 {
-  struct device *d = decode_device (device);
+  static time_t last_bell_time = (time_t) 0;
+  static struct device *last_bell_device = (struct device*) 0;
+  time_t now;
+  struct device *d = decode_device (device);     
 
   XSETDEVICE (device, d);
+  now = time (0);
 
-  /* #### This is utterly disgusting, and is probably a remnant from
-     legacy code that used `ding'+`message' to signal error instead
-     calling `error'.  As a result, there is no way to beep from Lisp
-     directly, without also invoking this aspect.  Maybe we should
-     define a `ring-bell' function that simply beeps on the console,
-     which `ding' should invoke?  --hniksic */
   if (NILP (arg) && !NILP (Vexecuting_macro))
     /* Stop executing a keyboard macro. */
     error ("Keyboard macro terminated by a command ringing the bell");
+  
+  if (d == last_bell_device && now-last_bell_time < bell_inhibit_time)
+    return Qnil;
   else if (visible_bell && DEVMETH (d, flash, (d)))
     ;
   else
     Fplay_sound (sound, Qnil, device);
-
-  return Qnil;
+  
+  last_bell_time = now;
+  last_bell_device = d;
+  return Qnil;    
 }
 
 DEFUN ("wait-for-sounds", Fwait_for_sounds, 0, 1, 0, /*
@@ -532,6 +537,11 @@ vars_of_sound (void)
 *How loud to be, from 0 to 100.
 */ );
   bell_volume = 50;
+  
+  DEFVAR_INT ("bell-inhibit-time", &bell_inhibit_time /*
+*Don't ring the bell on the same device more than once within this many seconds.
+*/ );
+  bell_inhibit_time = 0;
 
   DEFVAR_LISP ("sound-alist", &Vsound_alist /*
 An alist associating names with sounds.
@@ -559,8 +569,8 @@ You should probably add things to this list by calling the function
 load-sound-file.
 
 Caveats:
- - You can only play audio data if running on the console screen of a
-   Sun SparcStation, SGI, or HP9000s700.
+ - XEmacs must be built with sound support for your system.  Not all
+   systems support sound. 
 
  - The pitch, duration, and volume options are available everywhere, but
    many X servers ignore the `pitch' option.