123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- /************************************************************
- 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;
- }
|