Use libcanberra to play system bell and workspace switch sounds
svn path=/trunk/; revision=4137
This commit is contained in:
parent
66ee22c3e6
commit
f1782868f9
14
ChangeLog
14
ChangeLog
@ -1,3 +1,17 @@
|
|||||||
|
2009-02-11 Matthias Clasen <mclasen@redhat.com>
|
||||||
|
|
||||||
|
Bug 557921 – [PATCH] Sound event support to metacity
|
||||||
|
|
||||||
|
Patch by Lennart Poettering
|
||||||
|
|
||||||
|
* configure.in: Require libcanberra-gtk
|
||||||
|
|
||||||
|
* src/core/bell.c (meta_bell_notify): Play the alert sound from
|
||||||
|
the sound theme instead of the dreaded system bell.
|
||||||
|
|
||||||
|
* src/core/workspace.c (meta_workspace_activate_with_focus): Play
|
||||||
|
a sound on workspace switch.
|
||||||
|
|
||||||
2009-02-11 Thomas Thurman <tthurman@gnome.org>
|
2009-02-11 Thomas Thurman <tthurman@gnome.org>
|
||||||
|
|
||||||
Session must be saved before display close, and display
|
Session must be saved before display close, and display
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include "bell.h"
|
#include "bell.h"
|
||||||
#include "screen-private.h"
|
#include "screen-private.h"
|
||||||
#include "prefs.h"
|
#include "prefs.h"
|
||||||
|
#include <canberra-gtk.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flashes one entire screen. This is done by making a window the size of the
|
* Flashes one entire screen. This is done by making a window the size of the
|
||||||
@ -223,7 +224,7 @@ bell_flash_window_frame (MetaWindow *window)
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
bell_flash_frame (MetaDisplay *display,
|
bell_flash_frame (MetaDisplay *display,
|
||||||
XkbAnyEvent *xkb_ev)
|
XkbAnyEvent *xkb_ev)
|
||||||
{
|
{
|
||||||
XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
|
XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
|
||||||
MetaWindow *window;
|
MetaWindow *window;
|
||||||
@ -280,6 +281,46 @@ meta_bell_notify (MetaDisplay *display,
|
|||||||
/* 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, xkb_ev);
|
||||||
|
|
||||||
|
if (meta_prefs_bell_is_audible ())
|
||||||
|
{
|
||||||
|
ca_proplist *p;
|
||||||
|
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_ENABLE, "1");
|
||||||
|
|
||||||
|
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);
|
||||||
|
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,
|
||||||
|
xkb_bell_event->device,
|
||||||
|
xkb_bell_event->bell_class,
|
||||||
|
xkb_bell_event->bell_id,
|
||||||
|
xkb_bell_event->percent);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif /* HAVE_XKB */
|
#endif /* HAVE_XKB */
|
||||||
|
|
||||||
@ -321,8 +362,7 @@ meta_bell_init (MetaDisplay *display)
|
|||||||
XkbChangeEnabledControls (display->xdisplay,
|
XkbChangeEnabledControls (display->xdisplay,
|
||||||
XkbUseCoreKbd,
|
XkbUseCoreKbd,
|
||||||
XkbAudibleBellMask,
|
XkbAudibleBellMask,
|
||||||
meta_prefs_bell_is_audible ()
|
0);
|
||||||
? XkbAudibleBellMask : 0);
|
|
||||||
if (visual_bell_auto_reset) {
|
if (visual_bell_auto_reset) {
|
||||||
XkbSetAutoResetControls (display->xdisplay,
|
XkbSetAutoResetControls (display->xdisplay,
|
||||||
XkbAudibleBellMask,
|
XkbAudibleBellMask,
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "prefs.h"
|
#include "prefs.h"
|
||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <canberra-gtk.h>
|
||||||
|
|
||||||
void meta_workspace_queue_calc_showing (MetaWorkspace *workspace);
|
void meta_workspace_queue_calc_showing (MetaWorkspace *workspace);
|
||||||
static void set_active_space_hint (MetaScreen *screen);
|
static void set_active_space_hint (MetaScreen *screen);
|
||||||
@ -306,6 +307,63 @@ meta_workspace_queue_calc_showing (MetaWorkspace *workspace)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void workspace_switch_sound(MetaWorkspace *from,
|
||||||
|
MetaWorkspace *to) {
|
||||||
|
|
||||||
|
MetaWorkspaceLayout layout;
|
||||||
|
int i, nw, x, y, fi, ti;
|
||||||
|
const char *e;
|
||||||
|
|
||||||
|
nw = meta_screen_get_n_workspaces(from->screen);
|
||||||
|
fi = meta_workspace_index(from);
|
||||||
|
ti = meta_workspace_index(to);
|
||||||
|
|
||||||
|
meta_screen_calc_workspace_layout(from->screen,
|
||||||
|
nw,
|
||||||
|
fi,
|
||||||
|
&layout);
|
||||||
|
|
||||||
|
for (i = 0; i < nw; i++)
|
||||||
|
if (layout.grid[i] == ti)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (i >= nw) {
|
||||||
|
meta_bug("Failed to find destination workspace in layout\n");
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
|
y = i / layout.cols;
|
||||||
|
x = i % layout.cols;
|
||||||
|
|
||||||
|
/* We priorize horizontal over vertical movements here. The
|
||||||
|
rationale for this is that horizontal movements are probably more
|
||||||
|
interesting for sound effects because speakers are usually
|
||||||
|
positioned on a horizontal and not a vertical axis. i.e. your
|
||||||
|
spatial "Woosh!" effects will easily be able to encode horizontal
|
||||||
|
movement but not such much vertical movement. */
|
||||||
|
|
||||||
|
if (x < layout.current_col)
|
||||||
|
e = "desktop-switch-left";
|
||||||
|
else if (x > layout.current_col)
|
||||||
|
e = "desktop-switch-right";
|
||||||
|
else if (y < layout.current_row)
|
||||||
|
e = "desktop-switch-up";
|
||||||
|
else if (y > layout.current_row)
|
||||||
|
e = "desktop-switch-down";
|
||||||
|
else {
|
||||||
|
meta_bug("Uh, origin and destination workspace at same logic position!\n");
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
|
ca_context_play(ca_gtk_context_get(), 1,
|
||||||
|
CA_PROP_EVENT_ID, e,
|
||||||
|
CA_PROP_EVENT_DESCRIPTION, "Desktop switched",
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
finish:
|
||||||
|
meta_screen_free_workspace_layout (&layout);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_workspace_activate_with_focus (MetaWorkspace *workspace,
|
meta_workspace_activate_with_focus (MetaWorkspace *workspace,
|
||||||
MetaWindow *focus_this,
|
MetaWindow *focus_this,
|
||||||
@ -320,6 +378,9 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
|
|||||||
if (workspace->screen->active_workspace == workspace)
|
if (workspace->screen->active_workspace == workspace)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (workspace->screen->active_workspace)
|
||||||
|
workspace_switch_sound(workspace->screen->active_workspace, workspace);
|
||||||
|
|
||||||
/* Note that old can be NULL; e.g. when starting up */
|
/* Note that old can be NULL; e.g. when starting up */
|
||||||
old = workspace->screen->active_workspace;
|
old = workspace->screen->active_workspace;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user