bell: Clean up the bell code

Fix some old comments and rework it so that it's based on MetaWindow,
not the XKB event structs.
This commit is contained in:
Jasper St. Pierre 2014-08-18 19:47:26 -04:00
parent 277df44cfb
commit 6b8dda0d00

View File

@ -70,10 +70,8 @@
* If the configure script found we had no XKB, this does not exist. * If the configure script found we had no XKB, this does not exist.
*/ */
static void static void
bell_flash_fullscreen (MetaDisplay *display, bell_flash_fullscreen (MetaDisplay *display)
XkbAnyEvent *xkb_ev)
{ {
g_assert (xkb_ev->xkb_type == XkbBellNotify);
meta_compositor_flash_screen (display->compositor, display->screen); meta_compositor_flash_screen (display->compositor, display->screen);
} }
@ -138,30 +136,17 @@ bell_flash_window_frame (MetaWindow *window)
* @display: The display the bell event came in on * @display: The display the bell event came in on
* @xkb_ev: The bell event we just received * @xkb_ev: The bell event we just received
* *
* Flashes the frame of the focussed window. If there is no focussed window, * Flashes the frame of the focused window. If there is no focused window,
* flashes the screen. * flashes the screen.
*/ */
static void static void
bell_flash_frame (MetaDisplay *display, bell_flash_frame (MetaDisplay *display,
XkbAnyEvent *xkb_ev) MetaWindow *window)
{ {
XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
MetaWindow *window;
g_assert (xkb_ev->xkb_type == XkbBellNotify);
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
if (!window && (display->focus_window))
{
window = display->focus_window;
}
if (window && window->frame) if (window && window->frame)
{ bell_flash_window_frame (window);
bell_flash_window_frame (window); else
} bell_flash_fullscreen (display);
else /* revert to fullscreen flash if there's no focussed window */
{
bell_flash_fullscreen (display, xkb_ev);
}
} }
/** /**
@ -171,69 +156,73 @@ bell_flash_frame (MetaDisplay *display,
* *
* Gives the user some kind of visual bell substitute, in response to a * 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. * 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.
*/
/*
* Bug: This should be merged with meta_bell_notify().
*/ */
static void static void
bell_visual_notify (MetaDisplay *display, bell_visual_notify (MetaDisplay *display,
XkbAnyEvent *xkb_ev) MetaWindow *window)
{ {
switch (meta_prefs_get_visual_bell_type ()) switch (meta_prefs_get_visual_bell_type ())
{ {
case G_DESKTOP_VISUAL_BELL_FULLSCREEN_FLASH: case G_DESKTOP_VISUAL_BELL_FULLSCREEN_FLASH:
bell_flash_fullscreen (display, xkb_ev); bell_flash_fullscreen (display);
break; break;
case G_DESKTOP_VISUAL_BELL_FRAME_FLASH: case G_DESKTOP_VISUAL_BELL_FRAME_FLASH:
bell_flash_frame (display, xkb_ev); /* does nothing yet */ bell_flash_frame (display, window);
break; break;
} }
} }
static gboolean
bell_audible_notify (MetaDisplay *display,
MetaWindow *window)
{
#ifdef HAVE_LIBCANBERRA
ca_proplist *p;
int res;
ca_proplist_create (&p);
ca_proplist_sets (p, CA_PROP_EVENT_ID, "bell-window-system");
ca_proplist_sets (p, CA_PROP_EVENT_DESCRIPTION, _("Bell event"));
ca_proplist_sets (p, CA_PROP_CANBERRA_CACHE_CONTROL, "permanent");
if (window)
{
ca_proplist_sets (p, CA_PROP_WINDOW_NAME, window->title);
ca_proplist_setf (p, CA_PROP_WINDOW_X11_XID, "%lu", (unsigned long)window->xwindow);
ca_proplist_sets (p, CA_PROP_APPLICATION_NAME, window->res_name);
ca_proplist_setf (p, CA_PROP_APPLICATION_PROCESS_ID, "%d", window->net_wm_pid);
}
res = ca_context_play_full (ca_gtk_context_get (), 1, p, NULL, NULL);
ca_proplist_destroy (p);
return res == CA_SUCCESS || res == CA_ERROR_DISABLED;
#endif /* HAVE_LIBCANBERRA */
return FALSE;
}
void void
meta_bell_notify (MetaDisplay *display, meta_bell_notify (MetaDisplay *display,
XkbAnyEvent *xkb_ev) XkbAnyEvent *xkb_ev)
{ {
MetaWindow *window;
XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent*) xkb_ev;
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
if (!window && display->focus_window && display->focus_window->frame)
window = display->focus_window;
/* flash something */ /* flash something */
if (meta_prefs_get_visual_bell ()) if (meta_prefs_get_visual_bell ())
bell_visual_notify (display, xkb_ev); bell_visual_notify (display, window);
#ifdef HAVE_LIBCANBERRA
if (meta_prefs_bell_is_audible ()) if (meta_prefs_bell_is_audible ())
{ {
ca_proplist *p; if (!bell_audible_notify (display, window))
XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent*) xkb_ev;
MetaWindow *window;
int res;
ca_proplist_create (&p);
ca_proplist_sets (p, CA_PROP_EVENT_ID, "bell-window-system");
ca_proplist_sets (p, CA_PROP_EVENT_DESCRIPTION, _("Bell event"));
ca_proplist_sets (p, CA_PROP_CANBERRA_CACHE_CONTROL, "permanent");
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
if (!window && (display->focus_window) && (display->focus_window->frame))
window = display->focus_window;
if (window)
{ {
ca_proplist_sets (p, CA_PROP_WINDOW_NAME, window->title); /* Force a classic bell if the libcanberra bell failed. */
ca_proplist_setf (p, CA_PROP_WINDOW_X11_XID, "%lu", (unsigned long)window->xwindow);
ca_proplist_sets (p, CA_PROP_APPLICATION_NAME, window->res_name);
ca_proplist_setf (p, CA_PROP_APPLICATION_PROCESS_ID, "%d", window->net_wm_pid);
}
/* First, we try to play a real sound ... */
res = ca_context_play_full (ca_gtk_context_get (), 1, p, NULL, NULL);
ca_proplist_destroy (p);
if (res != CA_SUCCESS && res != CA_ERROR_DISABLED)
{
/* ...and in case that failed we use the classic X11 bell. */
XkbForceDeviceBell (display->xdisplay, XkbForceDeviceBell (display->xdisplay,
xkb_bell_event->device, xkb_bell_event->device,
xkb_bell_event->bell_class, xkb_bell_event->bell_class,
@ -241,7 +230,6 @@ meta_bell_notify (MetaDisplay *display,
xkb_bell_event->percent); xkb_bell_event->percent);
} }
} }
#endif /* HAVE_LIBCANBERRA */
} }
void void