bell.c File Reference

Ring the bell or flash the screen. More...

Go to the source code of this file.

Functions

static void bell_flash_screen (MetaDisplay *display, MetaScreen *screen)
 Flashes one entire screen.
static void bell_flash_fullscreen (MetaDisplay *display, XkbAnyEvent *xkb_ev)
 Flashes one screen, or all screens, in response to a bell event.
static gboolean bell_unflash_frame (gpointer data)
 Makes a frame be not flashed; this is the timeout half of bell_flash_window_frame().
static void bell_flash_window_frame (MetaWindow *window)
 Makes a frame flash and then return to normal shortly afterwards.
static void bell_flash_frame (MetaDisplay *display, XkbAnyEvent *xkb_ev)
 Flashes the frame of the focussed window.
static void bell_visual_notify (MetaDisplay *display, XkbAnyEvent *xkb_ev)
 Gives the user some kind of visual bell substitute, in response to a bell event.
void meta_bell_notify (MetaDisplay *display, XkbAnyEvent *xkb_ev)
 Gives the user some kind of visual bell; in fact, this is our response to any kind of bell request, but we set it up so that we only get notified about visual bells, and X deals with audible ones.
void meta_bell_set_audible (MetaDisplay *display, gboolean audible)
 Turns the bell to audible or visual.
gboolean meta_bell_init (MetaDisplay *display)
 Initialises the bell subsystem.
void meta_bell_shutdown (MetaDisplay *display)
 Shuts down the bell subsystem.
void meta_bell_notify_frame_destroy (MetaFrame *frame)
 Deals with a frame being destroyed.


Detailed Description

Ring the bell or flash the screen.

Sometimes, X programs "ring the bell", whatever that means. Metacity lets the user configure the bell to be audible or visible (aka visual), and if it's visual it can be configured to be frame-flash or fullscreen-flash. We never get told about audible bells; X handles them just fine by itself.

Visual bells come in at meta_bell_notify(), which checks we are actually in visual mode and calls through to bell_visual_notify(). That function then checks what kind of visual flash you like, and calls either bell_flash_fullscreen()-- which calls bell_flash_screen() to do its work-- or bell_flash_frame(), which flashes the focussed window using bell_flash_window_frame(), unless there is no such window, in which case it flashes the screen instead. bell_flash_window_frame() flashes the frame and calls bell_unflash_frame() as a timeout to remove the flash.

The visual bell was the result of a discussion in Bugzilla here: <http://bugzilla.gnome.org/show_bug.cgi?id=99886>.

Several of the functions in this file are ifdeffed out entirely if we are found not to have the XKB extension, which is required to do these clever things with bells; some others are entirely no-ops in that case.

Definition in file bell.c.


Function Documentation

static void bell_flash_frame ( MetaDisplay display,
XkbAnyEvent *  xkb_ev 
) [static]

Flashes the frame of the focussed window.

If there is no focussed window, flashes the screen.

Parameters:
display The display the bell event came in on
xkb_ev The bell event we just received

Definition at line 225 of file bell.c.

References bell_flash_fullscreen(), bell_flash_window_frame(), meta_display_lookup_x_window(), and _AgGetPropertyTask::window.

Referenced by bell_visual_notify().

static void bell_flash_fullscreen ( MetaDisplay display,
XkbAnyEvent *  xkb_ev 
) [static]

Flashes one screen, or all screens, in response to a bell event.

If the event is on a particular window, flash the screen that window is on. Otherwise, flash every screen on this display.

If the configure script found we had no XKB, this does not exist.

Parameters:
display The display the event came in on
xkb_ev The bell event

Definition at line 148 of file bell.c.

References bell_flash_screen(), meta_display_screen_for_xwindow(), screen, and _MetaDisplay::screens.

Referenced by bell_flash_frame(), and bell_visual_notify().

static void bell_flash_screen ( MetaDisplay display,
MetaScreen screen 
) [static]

Flashes one entire screen.

This is done by making a window the size of the whole screen (or reusing the old one, if it's still around), mapping it, painting it white and then black, and then unmapping it. We set saveunder so that all the windows behind it come back immediately.

Unlike frame flashes, we don't do fullscreen flashes with a timeout; rather, we do them in one go, because we don't have to rely on the theme code redrawing the frame for us in order to do the flash.

Parameters:
display The display which owns the screen (rather redundant)
screen The screen to flash
Bug:
The way I read it, this appears not to do the flash the first time we flash a particular display. Am I wrong?
Bug:
This appears to destroy our current XSync status.

Definition at line 75 of file bell.c.

References _MetaScreen::flash_window, _MetaRectangle::height, meta_display_increment_focus_sentinel(), META_FOCUS_MODE_CLICK, meta_prefs_get_focus_mode(), _MetaDisplay::mouse_mode, NULL, _MetaScreen::rect, _MetaRectangle::width, _MetaDisplay::xdisplay, _MetaScreen::xroot, and _MetaScreen::xscreen.

Referenced by bell_flash_fullscreen().

static void bell_flash_window_frame ( MetaWindow window  )  [static]

Makes a frame flash and then return to normal shortly afterwards.

This is done by setting a flag so that the theme code will temporarily draw the frame as focussed if it's unfocussed and vice versa, and then queueing a redraw. Lastly, we create a timeout so that the flag can be unset and the frame re-redrawn.

If the configure script found we had no XKB, this does not exist.

Parameters:
window The window to flash

Definition at line 208 of file bell.c.

References bell_unflash_frame(), _MetaWindow::frame, _MetaFrame::is_flashing, meta_frame_queue_draw(), and NULL.

Referenced by bell_flash_frame().

static gboolean bell_unflash_frame ( gpointer  data  )  [static]

Makes a frame be not flashed; this is the timeout half of bell_flash_window_frame().

This is done simply by clearing the flash flag and queuing a redraw of the frame.

If the configure script found we had no XKB, this does not exist.

Parameters:
data The frame to unflash, cast to a gpointer so it can go into a callback function.
Returns:
Always FALSE, so we don't get called again.
Bug:
This is the parallel to bell_flash_window_frame(), so it should really be called meta_bell_unflash_window_frame().

Definition at line 188 of file bell.c.

References FALSE, _MetaFrame::is_flashing, and meta_frame_queue_draw().

Referenced by bell_flash_window_frame().

static void bell_visual_notify ( MetaDisplay display,
XkbAnyEvent *  xkb_ev 
) [static]

Gives the user some kind of visual bell substitute, in response to a bell event.

What this is depends on the "visual bell type" pref.

If the configure script found we had no XKB, this does not exist.

Parameters:
display The display the bell event came in on
xkb_ev The bell event we just received
Bug:
This should be merged with meta_bell_notify().

Definition at line 259 of file bell.c.

References bell_flash_frame(), bell_flash_fullscreen(), meta_prefs_get_visual_bell_type(), META_VISUAL_BELL_FRAME_FLASH, META_VISUAL_BELL_FULLSCREEN_FLASH, and META_VISUAL_BELL_INVALID.

Referenced by meta_bell_notify().

gboolean meta_bell_init ( MetaDisplay display  ) 

Initialises the bell subsystem.

This involves intialising XKB (which, despite being a keyboard extension, is the place to look for bell notifications), then asking it to send us bell notifications, and then also switching off the audible bell if we're using a visual one ourselves.

Unlike most X extensions we use, we only initialise XKB here (rather than in main()). It's possible that XKB is not installed at all, but if that was known at build time we will have HAVE_XKB undefined, which will cause this function to be a no-op.

Parameters:
display The display which is opening
Bug:
There is a line of code that's never run that tells XKB to reset the bell status after we quit. Bill H said (<http://bugzilla.gnome.org/show_bug.cgi?id=99886#c12>) that XFree86's implementation is broken so we shouldn't call it, but that was in 2002. Is it working now?

Definition at line 298 of file bell.c.

References FALSE, meta_prefs_bell_is_audible(), NULL, TRUE, and _MetaDisplay::xdisplay.

void meta_bell_notify ( MetaDisplay display,
XkbAnyEvent *  xkb_ev 
)

Gives the user some kind of visual bell; in fact, this is our response to any kind of bell request, but we set it up so that we only get notified about visual bells, and X deals with audible ones.

If the configure script found we had no XKB, this does not exist.

Parameters:
display The display the bell event came in on
xkb_ev The bell event we just received

Definition at line 277 of file bell.c.

References bell_visual_notify(), and meta_prefs_get_visual_bell().

Referenced by event_callback().

void meta_bell_notify_frame_destroy ( MetaFrame frame  ) 

Deals with a frame being destroyed.

This is important because if we're using a visual bell, we might be flashing the edges of the frame, and so we'd have a timeout function waiting ready to un-flash them. If the frame's going away, we can tell the timeout not to bother.

Parameters:
frame The frame which is being destroyed

Definition at line 359 of file bell.c.

References _MetaFrame::is_flashing.

Referenced by meta_window_destroy_frame().

void meta_bell_set_audible ( MetaDisplay display,
gboolean  audible 
)

Turns the bell to audible or visual.

This tells X what to do, but not Metacity; you will need to set the "visual bell" pref for that.

If the configure script found we had no XKB, this is a no-op.

Parameters:
display The display we're configuring
audible True for an audible bell, false for a visual bell

Definition at line 287 of file bell.c.

References _MetaDisplay::xdisplay.

Referenced by prefs_changed_callback().

void meta_bell_shutdown ( MetaDisplay display  ) 

Shuts down the bell subsystem.

Parameters:
display The display which is closing
Bug:
This is never called! If we had XkbSetAutoResetControls enabled in meta_bell_init(), this wouldn't be a problem, but we don't.

Definition at line 339 of file bell.c.

References _MetaDisplay::xdisplay.


Generated on Sat Aug 23 22:04:19 2008 for metacity by  doxygen 1.5.5