1/************************************************************
2Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
3
4Permission to use, copy, modify, and distribute this
5software and its documentation for any purpose and without
6fee is hereby granted, provided that the above copyright
7notice appear in all copies and that both that copyright
8notice and this permission notice appear in supporting
9documentation, and that the name of Silicon Graphics not be
10used in advertising or publicity pertaining to distribution
11of the software without specific prior written permission.
12Silicon Graphics makes no representation about the suitability
13of this software for any purpose. It is provided "as is"
14without any express or implied warranty.
15
16SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
23THE USE OR PERFORMANCE OF THIS SOFTWARE.
24
25********************************************************/
26
27#ifdef HAVE_CONFIG_H
28#include <config.h>
29#endif
30#include <stdio.h>
31#include "Xlibint.h"
32#include <X11/extensions/XKBproto.h>
33#include "XKBlibint.h"
34
35
36Bool
37XkbDeviceBell(Display *dpy,
38              Window window,
39              int deviceID,
40              int bellClass,
41              int bellID,
42              int percent,
43              Atom name)
44{
45    register xkbBellReq *req;
46    XkbInfoPtr xkbi;
47
48    if ((dpy->flags & XlibDisplayNoXkb) ||
49        (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL)))
50        return False;
51    LockDisplay(dpy);
52    xkbi = dpy->xkb_info;
53    GetReq(kbBell, req);
54    req->reqType = xkbi->codes->major_opcode;
55    req->xkbReqType = X_kbBell;
56    req->deviceSpec = deviceID;
57    req->window = (CARD32) window;
58    req->bellClass = (CARD16) bellClass;
59    req->bellID = (CARD16) bellID;
60    req->percent = percent;
61    req->forceSound = False;
62    req->eventOnly = False;
63    req->pitch = 0;
64    req->duration = 0;
65    req->name = (CARD32) name;
66    req->pad1 = 0;
67    req->pad2 = 0;
68    UnlockDisplay(dpy);
69    SyncHandle();
70    return True;
71}
72
73Bool
74XkbForceDeviceBell(Display *dpy,
75                   int deviceID,
76                   int bellClass,
77                   int bellID,
78                   int percent)
79{
80    register xkbBellReq *req;
81    XkbInfoPtr xkbi;
82
83    if ((dpy->flags & XlibDisplayNoXkb) ||
84        (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL)))
85        return False;
86    LockDisplay(dpy);
87    xkbi = dpy->xkb_info;
88    GetReq(kbBell, req);
89    req->reqType = xkbi->codes->major_opcode;
90    req->xkbReqType = X_kbBell;
91    req->deviceSpec = deviceID;
92    req->window = (CARD32) None;
93    req->bellClass = (CARD16) bellClass;
94    req->bellID = (CARD16) bellID;
95    req->percent = percent;
96    req->forceSound = True;
97    req->eventOnly = False;
98    req->pitch = 0;
99    req->duration = 0;
100    req->name = None;
101    req->pad1 = 0;
102    req->pad2 = 0;
103    UnlockDisplay(dpy);
104    SyncHandle();
105    return True;
106}
107
108Bool
109XkbDeviceBellEvent(Display *dpy,
110                   Window window,
111                   int deviceID,
112                   int bellClass,
113                   int bellID,
114                   int percent,
115                   Atom name)
116{
117    register xkbBellReq *req;
118    XkbInfoPtr xkbi;
119
120    if ((dpy->flags & XlibDisplayNoXkb) ||
121        (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL)))
122        return False;
123    LockDisplay(dpy);
124    xkbi = dpy->xkb_info;
125    GetReq(kbBell, req);
126    req->reqType = xkbi->codes->major_opcode;
127    req->xkbReqType = X_kbBell;
128    req->deviceSpec = deviceID;
129    req->window = (CARD32) window;
130    req->bellClass = (CARD16) bellClass;
131    req->bellID = (CARD16) bellID;
132    req->percent = percent;
133    req->forceSound = False;
134    req->eventOnly = True;
135    req->pitch = 0;
136    req->duration = 0;
137    req->name = (CARD32) name;
138    req->pad1 = 0;
139    req->pad2 = 0;
140    UnlockDisplay(dpy);
141    SyncHandle();
142    return True;
143}
144
145Bool
146XkbBell(Display *dpy, Window window, int percent, Atom name)
147{
148    if ((dpy->flags & XlibDisplayNoXkb) ||
149        (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) {
150        XBell(dpy, percent);
151        return False;
152    }
153    return XkbDeviceBell(dpy, window, XkbUseCoreKbd,
154                         XkbDfltXIClass, XkbDfltXIId, percent, name);
155}
156
157Bool
158XkbForceBell(Display *dpy, int percent)
159{
160    if ((dpy->flags & XlibDisplayNoXkb) ||
161        (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) {
162        XBell(dpy, percent);
163        return False;
164    }
165    return XkbForceDeviceBell(dpy, XkbUseCoreKbd, XkbDfltXIClass, XkbDfltXIId,
166                              percent);
167}
168
169Bool
170XkbBellEvent(Display *dpy, Window window, int percent, Atom name)
171{
172    if ((dpy->flags & XlibDisplayNoXkb) ||
173        (!dpy->xkb_info && !XkbUseExtension(dpy, NULL, NULL))) {
174        return False;
175    }
176    /* class 0 = KbdFeedbackClass (X Input Extension) */
177    return XkbDeviceBellEvent(dpy, window, XkbUseCoreKbd,
178                              XkbDfltXIClass, XkbDfltXIId, percent, name);
179}
180