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