Misc bug fixes
[wmaker-crm.git] / src / wmsound.c
blob3ea9215b9f408345bd021854d84d4f14b70bf99a
1 #include "wconfig.h"
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <X11/X.h>
6 #include <X11/Xlib.h>
7 #include <X11/Xutil.h>
8 #include <X11/Xproto.h>
10 #include "WindowMaker.h"
11 #include "wmsound.h"
13 #ifdef WMSOUND
15 Window soundServer;
16 XEvent sound_event;
18 extern WPreferences wPreferences;
19 extern Atom _XA_WINDOWMAKER_WM_FUNCTION;
21 void
22 wSoundServerGrab(Window wm_win)
24 Window *lstChildren;
25 Window retRoot;
26 Window retParent;
27 int indexCount;
28 u_int numChildren;
29 XClassHint *retHint;
31 if (XQueryTree(dpy, wm_win, &retRoot, &retParent, &lstChildren, &numChildren)) {
32 for (indexCount = 1; indexCount < numChildren; indexCount++) {
33 retHint = XAllocClassHint();
34 if (!retHint) {
35 XFree(lstChildren);
36 return;
39 XGetClassHint (dpy, lstChildren[indexCount], retHint);
41 if (retHint->res_class) {
42 if (strcmp("WMSoundServer", retHint->res_class)==0 ||
43 /*strcmp("WSoundServer", retHint->res_class)==0 ||*/
44 (retHint->res_name &&
45 strcmp("wsoundserver", retHint->res_name)==0 &&
46 strcmp("DockApp", retHint->res_class)==0)) {
48 soundServer = lstChildren[indexCount];
49 XFree(lstChildren);
50 if(retHint) {
51 XFree(retHint);
53 return;
56 XFree(retHint);
57 retHint = 0;
59 XFree(lstChildren);
61 return;
65 void
66 wSoundPlay(long event_sound)
68 if (!soundServer) {
69 wSoundServerGrab(DefaultRootWindow(dpy));
71 if(soundServer!=None && !wPreferences.no_sound) {
72 sound_event.xclient.type = ClientMessage;
73 sound_event.xclient.message_type = _XA_WINDOWMAKER_WM_FUNCTION;
74 sound_event.xclient.format = 32;
75 sound_event.xclient.display = dpy;
76 sound_event.xclient.window = soundServer;
77 sound_event.xclient.data.l[0] = event_sound;
78 if (XSendEvent(dpy, soundServer, False,
79 NoEventMask, &sound_event)==BadWindow) {
80 soundServer = None;
81 return;
82 } else {
83 XFlush(dpy);
88 #endif /* WMSOUND */