173 lines
5.7 KiB
C
173 lines
5.7 KiB
C
/************************************************************
|
|
Copyright (c) 1995 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 "xkbevd.h"
|
|
|
|
/***====================================================================***/
|
|
|
|
static char *
|
|
AppendBellNotifyArg(char *sink, char *arg, XkbEvent *ev)
|
|
{
|
|
if (uStringEqual(arg, "device") || uStringEqual(arg, "D"))
|
|
sprintf(sink, "%d", ev->bell.device);
|
|
else if (uStringEqual(arg, "volume") || uStringEqual(arg, "v"))
|
|
sprintf(sink, "%d", ev->bell.percent);
|
|
else if (uStringEqual(arg, "pitch") || uStringEqual(arg, "p"))
|
|
sprintf(sink, "%d", ev->bell.pitch);
|
|
else if (uStringEqual(arg, "duration") || uStringEqual(arg, "d"))
|
|
sprintf(sink, "%d", ev->bell.duration);
|
|
else if (uStringEqual(arg, "class") || uStringEqual(arg, "c"))
|
|
sprintf(sink, "%d", ev->bell.bell_class);
|
|
else if (uStringEqual(arg, "id") || uStringEqual(arg, "i"))
|
|
sprintf(sink, "%d", ev->bell.bell_id);
|
|
else if (uStringEqual(arg, "window") || uStringEqual(arg, "w"))
|
|
sprintf(sink, "0x%x", (unsigned int) ev->bell.window);
|
|
else if (uStringEqual(arg, "name") || uStringEqual(arg, "n"))
|
|
sprintf(sink, "%s", XkbAtomText(dpy, ev->bell.name, XkbMessage));
|
|
return sink;
|
|
}
|
|
|
|
static char *
|
|
AppendAccessXNotifyArg(char *sink, char *arg, XkbEvent *ev)
|
|
{
|
|
if (uStringEqual(arg, "device") || uStringEqual(arg, "D"))
|
|
sprintf(sink, "%d", ev->accessx.device);
|
|
else if (uStringEqual(arg, "detail") || uStringEqual(arg, "d")) {
|
|
sprintf(sink, "%s",
|
|
XkbAccessXDetailText(ev->accessx.detail, XkbMessage));
|
|
}
|
|
else if (uStringEqual(arg, "keycode") || uStringEqual(arg, "key") ||
|
|
uStringEqual(arg, "k"))
|
|
sprintf(sink, "%d", ev->accessx.keycode);
|
|
else if (uStringEqual(arg, "skdelay") || uStringEqual(arg, "s"))
|
|
sprintf(sink, "%d", ev->accessx.sk_delay);
|
|
else if (uStringEqual(arg, "bkdelay") || uStringEqual(arg, "b"))
|
|
sprintf(sink, "%d", ev->accessx.debounce_delay);
|
|
return sink;
|
|
}
|
|
|
|
static char *
|
|
AppendActionMessageArg(char *sink, char *arg, XkbEvent *ev)
|
|
{
|
|
if (uStringEqual(arg, "device") || uStringEqual(arg, "D"))
|
|
sprintf(sink, "%d", ev->message.device);
|
|
else if (uStringEqual(arg, "message") || uStringEqual(arg, "m"))
|
|
sprintf(sink, "%s", ev->message.message);
|
|
else if (uStringEqual(arg, "keycode") || uStringEqual(arg, "key") ||
|
|
uStringEqual(arg, "k"))
|
|
sprintf(sink, "%d", ev->message.keycode);
|
|
else if (uStringEqual(arg, "press") || uStringEqual(arg, "p"))
|
|
sprintf(sink, "%s", (ev->message.press ? "press" : "release"));
|
|
else if (uStringEqual(arg, "event") || uStringEqual(arg, "e"))
|
|
sprintf(sink, "%s",
|
|
(ev->message.key_event_follows ? "event" : "no_event"));
|
|
return sink;
|
|
}
|
|
|
|
static char *
|
|
AppendEventArg(char *sink, char *arg, XkbEvent *ev)
|
|
{
|
|
switch (ev->any.xkb_type) {
|
|
case XkbBellNotify:
|
|
sink = AppendBellNotifyArg(sink, arg, ev);
|
|
break;
|
|
case XkbAccessXNotify:
|
|
sink = AppendAccessXNotifyArg(sink, arg, ev);
|
|
break;
|
|
case XkbActionMessage:
|
|
sink = AppendActionMessageArg(sink, arg, ev);
|
|
break;
|
|
default:
|
|
return sink;
|
|
}
|
|
sink += strlen(sink);
|
|
return sink;
|
|
}
|
|
|
|
static void
|
|
CopyEventArg(char **sink_inout, char **source_inout, XkbEvent *ev)
|
|
{
|
|
char buf[1024];
|
|
char *source, *sink;
|
|
char *arg;
|
|
|
|
arg = buf;
|
|
source = *source_inout;
|
|
sink = *sink_inout;
|
|
if (*source == '$') {
|
|
*sink++ = '$';
|
|
source++;
|
|
*sink++ = '\0';
|
|
*sink_inout = sink;
|
|
*source_inout = source;
|
|
return;
|
|
}
|
|
else if (*source == '(') {
|
|
source++;
|
|
while ((*source != ')') && (*source != '\0')) {
|
|
*arg++ = *source++;
|
|
}
|
|
if (*source == '\0') {
|
|
*sink++ = '$';
|
|
*sink++ = '\0';
|
|
*sink_inout = sink;
|
|
return;
|
|
}
|
|
source++;
|
|
*arg++ = '\0';
|
|
arg = buf;
|
|
}
|
|
else {
|
|
arg[0] = *source++;
|
|
arg[1] = '\0';
|
|
}
|
|
sink = AppendEventArg(sink, arg, ev);
|
|
*sink_inout = sink;
|
|
*source_inout = source;
|
|
return;
|
|
}
|
|
|
|
char *
|
|
SubstituteEventArgs(char *cmd, XkbEvent *ev)
|
|
{
|
|
static char buf[1024];
|
|
char *source, *sink;
|
|
|
|
if (index(cmd, '$') == NULL)
|
|
return cmd;
|
|
buf[0] = '\0';
|
|
sink = buf;
|
|
source = cmd;
|
|
while (*source != '\0') {
|
|
if (*source == '$') {
|
|
source++;
|
|
CopyEventArg(&sink, &source, ev);
|
|
}
|
|
*sink++ = *source++;
|
|
}
|
|
return buf;
|
|
}
|