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 meta_bell_notify (MetaDisplay *display, XkbAnyEvent *xkb_ev) { /* flash something */ if (meta_prefs_get_visual_bell ()) bell_visual_notify (display, xkb_ev); if (meta_prefs_bell_is_audible ()) { XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent*) xkb_ev; #ifdef HAVE_CANBERRA ca_proplist *p; 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); 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) #else if (1) #endif /* HAVE_CANBERRA */ { /* ...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); } } }
static PyObject* osk_audio_play(PyObject* self, PyObject* args) { OskAudio* audio = (OskAudio*) self; GdkScreen* screen; ca_proplist* props; const char* event_id; float x, y; float xs, ys; int sw, sh, ret; if (!PyArg_ParseTuple(args, "sffff", &event_id, &x, &y, &xs, &ys)) return NULL; screen = gdk_screen_get_default(); sw = gdk_screen_get_width(screen); sh = gdk_screen_get_height(screen); ca_proplist_create(&props); ca_proplist_sets(props, CA_PROP_EVENT_ID, event_id); /* report mouse position for accessibility */ if (x != -1 && y != -1) { ca_proplist_setf(props, CA_PROP_EVENT_MOUSE_X, "%0.0f", x); ca_proplist_setf(props, CA_PROP_EVENT_MOUSE_Y, "%0.0f", y); } /* place in space between speakers */ if (xs != -1 && ys != -1) { /* comment from canberra-gtk.c: * We use these strange format strings here to avoid that libc * applies locale information on the formatting of floating numbers. */ ca_proplist_setf(props, CA_PROP_EVENT_MOUSE_HPOS, "%i.%03i", (int) x / (sw - 1), (int) (1000.0 * x / (sw - 1)) % 1000); ca_proplist_setf(props, CA_PROP_EVENT_MOUSE_VPOS, "%i.%03i", (int) y / (sh - 1), (int) (1000.0 * y / (sh - 1)) % 1000); } ret = ca_context_play_full(audio->ca, DEFAULT_SOUND_ID, props, NULL, NULL); ca_proplist_destroy(props); if (ret < 0) { PyErr_SetString(OSK_EXCEPTION, ca_strerror(ret)); return NULL; } Py_RETURN_NONE; }
static gboolean osk_audio_init_canberra(OskAudio* audio) { GdkScreen* screen; ca_proplist* props; const char* name; int nr; if (ca_context_create(&audio->ca) != CA_SUCCESS) return FALSE; screen = gdk_screen_get_default(); nr = gdk_screen_get_number(screen); name = gdk_display_get_name(gdk_screen_get_display(screen)); /* Set default application properties */ ca_proplist_create(&props); ca_proplist_sets(props, CA_PROP_APPLICATION_NAME, "Onboard"); ca_proplist_sets(props, CA_PROP_APPLICATION_ID, "org.onboard.Onboard"); ca_proplist_sets(props, CA_PROP_APPLICATION_ICON_NAME, "onboard"); ca_proplist_sets(props, CA_PROP_WINDOW_X11_DISPLAY, name); ca_proplist_setf(props, CA_PROP_WINDOW_X11_SCREEN, "%i", nr); ca_context_change_props_full(audio->ca, props); ca_proplist_destroy(props); return TRUE; }
static void play_sound_effect (GdkWindow *window) { ca_context *c; ca_proplist *p = NULL; int res; c = ca_gtk_context_get (); res = ca_proplist_create (&p); if (res < 0) goto done; res = ca_proplist_sets (p, CA_PROP_EVENT_ID, "screen-capture"); if (res < 0) goto done; res = ca_proplist_sets (p, CA_PROP_EVENT_DESCRIPTION, _("Screenshot taken")); if (res < 0) goto done; if (window != NULL) { res = ca_proplist_setf (p, CA_PROP_WINDOW_X11_XID, "%lu", (unsigned long) GDK_WINDOW_XID (window)); if (res < 0) goto done; } ca_context_play_full (c, 0, p, NULL, NULL); done: if (p != NULL) ca_proplist_destroy (p); }