summaryrefslogtreecommitdiffstats
path: root/metacity-canberra.patch
blob: 53f1441bf245ca15a7ab53c8bf00f48da727d608 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
--- metacity-2.25.144/configure.in	2009-02-01 15:33:42.000000000 -0500
+++ hacked/configure.in	2009-02-09 21:15:32.000000000 -0500
@@ -107,7 +107,7 @@
 fi
 changequote([,])dnl
 
-METACITY_PC_MODULES='gtk+-2.0 >= 2.10.0 pango >= 1.2.0'
+METACITY_PC_MODULES='gtk+-2.0 >= 2.10.0 pango >= 1.2.0 libcanberra-gtk'
 
 AC_ARG_ENABLE(gconf,
   AC_HELP_STRING([--disable-gconf],
--- metacity-2.25.144/src/core/bell.c	2009-02-01 15:33:15.000000000 -0500
+++ hacked/src/core/bell.c	2009-02-09 23:50:43.000000000 -0500
@@ -52,6 +52,7 @@
 #include "bell.h"
 #include "screen-private.h"
 #include "prefs.h"
+#include <canberra-gtk.h>
 
 /**
  * Flashes one entire screen.  This is done by making a window the size of the
@@ -223,7 +224,7 @@
  */
 static void
 bell_flash_frame (MetaDisplay *display, 
-		       XkbAnyEvent *xkb_ev)
+		  XkbAnyEvent *xkb_ev)
 {
   XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
   MetaWindow *window;
@@ -280,6 +281,47 @@
   /* flash something */
   if (meta_prefs_get_visual_bell ()) 
     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_MEDIA_ROLE, "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 */
 
@@ -321,8 +363,7 @@
       XkbChangeEnabledControls (display->xdisplay,
 				XkbUseCoreKbd,
 				XkbAudibleBellMask,
-				meta_prefs_bell_is_audible () 
-				? XkbAudibleBellMask : 0);
+                                0);
       if (visual_bell_auto_reset) {
 	XkbSetAutoResetControls (display->xdisplay,
 				 XkbAudibleBellMask,
--- metacity-2.25.144/src/core/workspace.c	2009-02-01 15:33:15.000000000 -0500
+++ hacked/src/core/workspace.c	2009-02-09 21:15:32.000000000 -0500
@@ -29,6 +29,7 @@
 #include "prefs.h"
 #include <X11/Xatom.h>
 #include <string.h>
+#include <canberra-gtk.h>
 
 void meta_workspace_queue_calc_showing   (MetaWorkspace *workspace);
 static void set_active_space_hint        (MetaScreen *screen);
@@ -306,6 +307,63 @@
     }
 }
 
+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
 meta_workspace_activate_with_focus (MetaWorkspace *workspace,
                                     MetaWindow    *focus_this,
@@ -320,6 +378,9 @@
   if (workspace->screen->active_workspace == workspace)
     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 */
   old = workspace->screen->active_workspace;