summaryrefslogtreecommitdiff
path: root/xkbbell.c
diff options
context:
space:
mode:
Diffstat (limited to 'xkbbell.c')
-rw-r--r--xkbbell.c225
1 files changed, 225 insertions, 0 deletions
diff --git a/xkbbell.c b/xkbbell.c
new file mode 100644
index 0000000..b733ef7
--- /dev/null
+++ b/xkbbell.c
@@ -0,0 +1,225 @@
+/* $Xorg: xkbbell.c,v 1.4 2000/08/17 19:54:51 cpqbld Exp $ */
+/************************************************************
+Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
+
+Permission to use, copy, modify, and distribute this
+software and its documentation for any purpose and without
+fee is hereby granted, provided that the above copyright
+notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting
+documentation, and that the name of Silicon Graphics not be
+used in advertising or publicity pertaining to distribution
+of the software without specific prior written permission.
+Silicon Graphics makes no representation about the suitability
+of this software for any purpose. It is provided "as is"
+without any express or implied warranty.
+
+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
+THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+********************************************************/
+
+#include <stdio.h>
+#include <X11/Xproto.h>
+#include <X11/Xlib.h>
+#include <X11/X.h>
+#include <X11/XKBlib.h>
+#include <X11/extensions/XI.h>
+
+static char *dpyName = NULL;
+static int volume = 0;
+static int devSpec = XkbUseCoreKbd;
+static int class= -1;
+static int id= -1;
+static char * bellName;
+static Atom nameAtom = None;
+static int synch= 0;
+static int win = None;
+static int force = 0;
+static int nobeep = 0;
+
+int
+parseArgs(argc,argv)
+ int argc;
+ char *argv[];
+{
+int i;
+
+ for (i=1;i<argc;i++) {
+ if ( strcmp(argv[i],"-display")==0 ) {
+ if ( ++i<argc ) dpyName= argv[i];
+ else {
+ fprintf(stderr,"Must specify a display with -display option\n");
+ return 0;
+ }
+ }
+ else if ((strcmp(argv[i],"-help")==0) || (strcmp(argv[i],"-usage")==0)){
+ return 0;
+ }
+ else if ( strcmp(argv[i],"-synch")==0 ) {
+ synch= 1;
+ }
+ else if ( strcmp(argv[i],"-force")==0 ) {
+ force= 1;
+ }
+ else if ( strcmp(argv[i],"-nobeep")==0 ) {
+ nobeep= 1;
+ }
+ else if ( strcmp(argv[i],"-dev")==0 ) {
+ if ( ++i<argc ) {
+ if (sscanf(argv[i]," %i ",&devSpec)!=1) {
+ fprintf(stderr,"Device ID must be an integer\n");
+ return 0;
+ }
+ }
+ else {
+ fprintf(stderr,"Must specify a device ID with -dev option\n");
+ return 0;
+ }
+ }
+ else if ( strcmp(argv[i],"-kf")==0 ) {
+ if ( ++i<argc ) {
+ if (sscanf(argv[i]," %i ",&id)!=1) {
+ fprintf(stderr,"Keyboard feedback ID must be an integer\n");
+ return 0;
+ }
+ class= KbdFeedbackClass;
+ }
+ else {
+ fprintf(stderr,"Must specify a keyboard feedback ID for -kf\n");
+ return 0;
+ }
+ }
+ else if ( strcmp(argv[i],"-bf")==0 ) {
+ if ( ++i<argc ) {
+ if (sscanf(argv[i]," %i ",&id)!=1) {
+ fprintf(stderr,"Bell feedback ID must be an integer\n");
+ return 0;
+ }
+ class= BellFeedbackClass;
+ }
+ else {
+ fprintf(stderr,"Must specify a bell feedback ID for -bf\n");
+ return 0;
+ }
+ }
+ else if ( strcmp(argv[i],"-v")==0 ) {
+ if ( ++i<argc ) {
+ if ((sscanf(argv[i]," %i ",&volume)!=1)||
+ (volume<-100)||(volume>100)) {
+ fprintf(stderr,"Volume must be in the range -100..100\n");
+ return 0;
+ }
+ }
+ else {
+ fprintf(stderr,"Must specify volume for -v\n");
+ return 0;
+ }
+ }
+ else if ( strcmp(argv[i],"-w")==0 ) {
+ if ( ++i<argc ) {
+ if (sscanf(argv[i]," %i ",&win)!=1) {
+ fprintf(stderr,"Must specify a numeric window ID\n");
+ return 0;
+ }
+ }
+ else {
+ fprintf(stderr,"Must specify a window ID for -w\n");
+ return 0;
+ }
+ }
+ else {
+ if ( i<argc-1 ) {
+ fprintf(stderr,"Bell name must be the last argument\n");
+ return 0;
+ }
+ bellName= argv[i];
+ }
+ }
+ return 1;
+}
+
+int
+main(argc,argv)
+ int argc;
+ char *argv[];
+{
+Display *dpy;
+int i1,i2,i3,i4,i5;
+
+
+ if (!parseArgs(argc,argv)) {
+ fprintf(stderr,"Usage: %s [ <options> ] <name>\n",argv[0]);
+ fprintf(stderr,"Where legal options are:\n");
+ fprintf(stderr,"-help print this message\n");
+ fprintf(stderr,"-usage print this message\n");
+ fprintf(stderr,"-display <dpy> specifies display to use\n");
+ fprintf(stderr,"-synch turn on synchronization\n");
+ fprintf(stderr,"-dev <id> specifies device to use\n");
+ fprintf(stderr,"-force force audible bell\n");
+ fprintf(stderr,"-nobeep suppress server bell, event only\n");
+ fprintf(stderr,"-bf <id> specifies bell feedback to use\n");
+ fprintf(stderr,"-kf <id> specifies keyboard feedback to use\n");
+ fprintf(stderr,"-v <volume> specifies volume to use\n");
+ fprintf(stderr,"-w <id> specifies window to use\n");
+ fprintf(stderr,"If neither device nor feedback are specified, %s uses the\n",argv[0]);
+ fprintf(stderr,"default values for the core keyboard device.\n");
+ return 1;
+ }
+ dpy = XOpenDisplay(dpyName);
+ if ( !dpy ) {
+ fprintf(stderr,"Couldn't open display \"%s\"\n",XDisplayName(dpyName));
+ return 1;
+ }
+ if (synch)
+ XSynchronize(dpy,1);
+ i1= XkbMajorVersion;
+ i2= XkbMinorVersion;
+ if ( !XkbLibraryVersion(&i1,&i2) ) {
+ fprintf(stderr,"Warning! X library built with XKB version %d.%02d\n",
+ i1,i2);
+ fprintf(stderr," but %s was built with %d.%02d\n",argv[0],
+ XkbMajorVersion,XkbMinorVersion);
+ fprintf(stderr," Trying anyway\n");
+ }
+ if ( !XkbQueryExtension(dpy,&i1,&i2,&i3,&i4,&i5)>0 ) {
+ if ((i4!=0)||(i5!=0))
+ fprintf(stderr,"server supports incompatible XKB version %d.%02d\n",
+ i4,i5);
+ else fprintf(stderr,"XkbQueryExtension failed\n");
+ fprintf(stderr,"Trying anyway\n");
+ }
+ if (force && (nameAtom!=None))
+ fprintf(stderr,"Warning! Name ignored for forced bell requests\n");
+ if (bellName!='\0')
+ nameAtom = XInternAtom(dpy,bellName,0);
+ if ((devSpec==XkbUseCoreKbd)&&(class<0)) {
+ Bool ok;
+ if (force) ok= XkbForceBell(dpy,volume);
+ else if (nobeep) ok= XkbBellEvent(dpy,win,volume,nameAtom);
+ else ok= XkbBell(dpy,win,volume,nameAtom);
+ if (!ok)
+ fprintf(stderr,"XkbBell request failed\n");
+ }
+ else {
+ Bool ok;
+ if (class<0) class= KbdFeedbackClass;
+ if (id<0) id= 0;
+ if (force)
+ ok= XkbForceDeviceBell(dpy,devSpec,class,id,volume);
+ else if (nobeep)
+ ok= XkbDeviceBellEvent(dpy,win,devSpec,class,id,volume,nameAtom);
+ else ok= XkbDeviceBell(dpy,win,devSpec,class,id,volume,nameAtom);
+ if (!ok)
+ fprintf(stderr,"XkbDeviceBell request failed\n");
+ }
+BAIL:
+ XCloseDisplay(dpy);
+ return 0;
+}