1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 2 3 /** 4 * \file bell.h Ring the bell or flash the screen 5 * 6 * Sometimes, X programs "ring the bell", whatever that means. Marco lets 7 * the user configure the bell to be audible or visible (aka visual), and 8 * if it's visual it can be configured to be frame-flash or fullscreen-flash. 9 * We never get told about audible bells; X handles them just fine by itself. 10 * 11 * The visual bell was the result of a discussion in Bugzilla here: 12 * <http://bugzilla.gnome.org/show_bug.cgi?id=99886>. 13 */ 14 15 /* 16 * Copyright (C) 2002 Sun Microsystems Inc. 17 * 18 * This program is free software; you can redistribute it and/or 19 * modify it under the terms of the GNU General Public License as 20 * published by the Free Software Foundation; either version 2 of the 21 * License, or (at your option) any later version. 22 * 23 * This program is distributed in the hope that it will be useful, but 24 * WITHOUT ANY WARRANTY; without even the implied warranty of 25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 26 * General Public License for more details. 27 * 28 * You should have received a copy of the GNU General Public License 29 * along with this program; if not, write to the Free Software 30 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 31 * 02110-1301, USA. 32 */ 33 34 #include <X11/Xlib.h> 35 #ifdef HAVE_XKB 36 #include <X11/XKBlib.h> 37 #endif 38 #include "display-private.h" 39 #include "frame-private.h" 40 41 #ifndef __BELL_H__ 42 #define __BELL_H__ 43 44 #ifdef HAVE_XKB 45 /** 46 * Gives the user some kind of visual bell; in fact, this is our response 47 * to any kind of bell request, but we set it up so that we only get 48 * notified about visual bells, and X deals with audible ones. 49 * 50 * If the configure script found we had no XKB, this does not exist. 51 * 52 * \param display The display the bell event came in on 53 * \param xkb_ev The bell event we just received 54 */ 55 void meta_bell_notify (MetaDisplay *display, XkbAnyEvent *xkb_ev); 56 #endif 57 58 /** 59 * Turns the bell to audible or visual. This tells X what to do, but 60 * not Marco; you will need to set the "visual bell" pref for that. 61 * 62 * If the configure script found we had no XKB, this is a no-op. 63 * 64 * \param display The display we're configuring 65 * \param audible True for an audible bell, false for a visual bell 66 */ 67 void meta_bell_set_audible (MetaDisplay *display, gboolean audible); 68 69 /** 70 * Initialises the bell subsystem. This involves intialising 71 * XKB (which, despite being a keyboard extension, is the 72 * place to look for bell notifications), then asking it 73 * to send us bell notifications, and then also switching 74 * off the audible bell if we're using a visual one ourselves. 75 * 76 * Unlike most X extensions we use, we only initialise XKB here 77 * (rather than in main()). It's possible that XKB is not 78 * installed at all, but if that was known at build time 79 * we will have HAVE_XKB undefined, which will cause this 80 * function to be a no-op. 81 * 82 * \param display The display which is opening 83 * 84 * \bug There is a line of code that's never run that tells 85 * XKB to reset the bell status after we quit. Bill H said 86 * (<http://bugzilla.gnome.org/show_bug.cgi?id=99886#c12>) 87 * that XFree86's implementation is broken so we shouldn't 88 * call it, but that was in 2002. Is it working now? 89 */ 90 gboolean meta_bell_init (MetaDisplay *display); 91 92 /** 93 * Shuts down the bell subsystem. 94 * 95 * \param display The display which is closing 96 * 97 * \bug This is never called! If we had XkbSetAutoResetControls 98 * enabled in meta_bell_init(), this wouldn't be a problem, but 99 * we don't. 100 */ 101 void meta_bell_shutdown (MetaDisplay *display); 102 103 /** 104 * Deals with a frame being destroyed. This is important because if we're 105 * using a visual bell, we might be flashing the edges of the frame, and 106 * so we'd have a timeout function waiting ready to un-flash them. If the 107 * frame's going away, we can tell the timeout not to bother. 108 * 109 * \param frame The frame which is being destroyed 110 */ 111 void meta_bell_notify_frame_destroy (MetaFrame *frame); 112 113 #endif /* __BELL_H__ */ 114