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. | |
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.
| 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.
| 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.
| 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.
| display | The display which owns the screen (rather redundant) | |
| screen | The screen to flash |
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.
| 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.
| data | The frame to unflash, cast to a gpointer so it can go into a callback function. |
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.
| display | The display the bell event came in on | |
| xkb_ev | The bell event we just received |
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.
| display | The display which is opening |
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.
| 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.
| 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.
| 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.
| display | The display which is closing |
Definition at line 339 of file bell.c.
References _MetaDisplay::xdisplay.
1.5.5