[comp.windows.x.motif] Problems with certain keyboard accelerators

jerryl@is.Morgan.COM (Jerry Liebelson) (05/15/91)

Hi --

 Below is a simple program that creates an ApplicationShell containing
a BulletinBoard widget which contains a single PushButton widget. I install
accelerators for a lot of the keys on a Sun-4 keyboard that will trigger
the button's callback routine.

 PROBLEM: I can't get the following keys to trigger the callback:
         F1, F4, F10, Arrow Keys, Insert, Delete, BackSpace
   I know the arrow keys are involved with the tab grouping, so I call
   XmRemoveTabGroup, but to no avail. And I realize that F10 is a default
   accelerator for the MenuBar widget.  Basically, I want to have the
   complete freedom to bind any key on a Sun-4 keyboard to what I want.
   How can I get these keys to trigger the callback?
   
   Thanks.
-- 
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
|        Jerry Liebelson         |      EMAIL: jerryl@is.morgan.com          |
|      Information Systems       |             uunet!is.morgan.com!jerryl    |
|      Morgan Stanley, Inc.      |      VOICE: (212) 703-2409                |
|      1633 Broadway 36th Floor  |      FAX:   (212) 703-2371                |
|      New York, NY 10019        |                                           |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------- cut here  -------------------------------------
#include <stdio.h>
#include <Intrinsic.h>
#include <StringDefs.h>
#include <keysym.h>
#include <Xm/BulletinB.h>
#include <Xm/PushB.h>

void  ButtonCallback();

Widget AppShell;
static String Accelerators=
{
  "#override \n\
            Shift<KeyPress>R15:  ArmAndActivate() \n\
             Shift<KeyPress>R9:  ArmAndActivate() \n\
             Shift<KeyPress>R7:  ArmAndActivate() \n\
               Shift<KeyPress>R13:  ArmAndActivate() \n\
               Shift<KeyPress>Tab:  ArmAndActivate() \n\
               Shift<KeyPress>F21:  ArmAndActivate() \n\
               Shift<KeyPress>F22:  ArmAndActivate() \n\
               Shift<KeyPress>F23:  ArmAndActivate() \n\
               Shift<KeyPress>F24:  ArmAndActivate() \n\
               Shift<KeyPress>F25:  ArmAndActivate() \n\
               Shift<KeyPress>F26:  ArmAndActivate() \n\
               Shift<KeyPress>F28:  ArmAndActivate() \n\
               Shift<KeyPress>F30:  ArmAndActivate() \n\
               Shift<KeyPress>F31:  ArmAndActivate() \n\
               Shift<KeyPress>F32:  ArmAndActivate() \n\
               Shift<KeyPress>F34:  ArmAndActivate() \n\
               Shift<KeyPress>Left:  ArmAndActivate() \n\
               Shift<KeyPress>Down:  ArmAndActivate() \n\
               Shift<KeyPress>Right:  ArmAndActivate() \n\
               Shift<KeyPress>Up:  ArmAndActivate() \n\
               Shift<KeyPress>Help:  ArmAndActivate() \n\
               Shift<KeyPress>KP_Add:  ArmAndActivate() \n\
               Shift<KeyPress>KP_Subtract:  ArmAndActivate() \n\
               Shift<KeyPress>KP_Enter:  ArmAndActivate() \n\
               Shift<KeyPress>Return:  ArmAndActivate() \n\
               Shift<KeyPress>Insert:  ArmAndActivate() \n\
               Shift<KeyPress>BackSpace:  ArmAndActivate() \n\
               Shift<KeyPress>Delete: ArmAndActivate() \n\
               Shift<KeyPress>Num_Lock: ArmAndActivate() \n\
             <KeyPress>R15:  ArmAndActivate() \n\
             <KeyPress>R9:  ArmAndActivate() \n\
             <KeyPress>R7:  ArmAndActivate() \n\
               <KeyPress>R13:  ArmAndActivate() \n\
               <KeyPress>Tab:  ArmAndActivate() \n\
               <KeyPress>F1:  ArmAndActivate() \n\
               <KeyPress>F2:  ArmAndActivate() \n\
               <KeyPress>F3:  ArmAndActivate() \n\
               <KeyPress>F4:  ArmAndActivate() \n\
               <KeyPress>F5:  ArmAndActivate() \n\
               <KeyPress>F6:  ArmAndActivate() \n\
               <KeyPress>F7:  ArmAndActivate() \n\
               <KeyPress>F8:  ArmAndActivate() \n\
               <KeyPress>F9:  ArmAndActivate() \n\
               <KeyPress>F10:  ArmAndActivate() \n\
               <KeyPress>F11:  ArmAndActivate() \n\
               <KeyPress>F12:  ArmAndActivate() \n\
               <KeyPress>F13:  ArmAndActivate() \n\
               <KeyPress>F14:  ArmAndActivate() \n\
               <KeyPress>F15:  ArmAndActivate() \n\
               <KeyPress>F16:  ArmAndActivate() \n\
               <KeyPress>F17:  ArmAndActivate() \n\
               <KeyPress>F18:  ArmAndActivate() \n\
               <KeyPress>F19:  ArmAndActivate() \n\
               <KeyPress>F20:  ArmAndActivate() \n\
               <KeyPress>F21:  ArmAndActivate() \n\
               <KeyPress>F22:  ArmAndActivate() \n\
               <KeyPress>F23:  ArmAndActivate() \n\
               <KeyPress>F24:  ArmAndActivate() \n\
               <KeyPress>F25:  ArmAndActivate() \n\
               <KeyPress>F26:  ArmAndActivate() \n\
               <KeyPress>F28:  ArmAndActivate() \n\
               <KeyPress>F30:  ArmAndActivate() \n\
               <KeyPress>F31:  ArmAndActivate() \n\
               <KeyPress>F32:  ArmAndActivate() \n\
               <KeyPress>F34:  ArmAndActivate() \n\
               <KeyPress>Left:  ArmAndActivate() \n\
               <KeyPress>Down:  ArmAndActivate() \n\
               <KeyPress>Right:  ArmAndActivate() \n\
               <KeyPress>Up:  ArmAndActivate() \n\
               <KeyPress>Help:  ArmAndActivate() \n\
               <KeyPress>KP_Add:  ArmAndActivate() \n\
               <KeyPress>KP_Subtract:  ArmAndActivate() \n\
               <KeyPress>KP_Enter:  ArmAndActivate() \n\
               <KeyPress>Return:  ArmAndActivate() \n\
               <KeyPress>Insert:  ArmAndActivate() \n\
               <KeyPress>BackSpace:  ArmAndActivate() \n\
               <KeyPress>Delete: ArmAndActivate() \n\
               <KeyPress>Num_Lock: ArmAndActivate()"
};

static Atom WmDeleteWindowAtom, WmProtocolsAtom;

typedef struct
{
  KeySym keySym;  
  char *keyName;
} KEY;

static KEY Keys[] =
{
  XK_F1, "F1",     
  XK_F2, "F2",
  XK_F3, "F3",
  XK_F4, "F4",
  XK_F5, "F5",
  XK_F6, "F6",
  XK_F7, "F7",
  XK_F8, "F8",
  XK_F9, "F9",
  XK_F10, "F10",
  XK_F11, "F11",
  XK_F12, "F12",
  XK_F13, "L3",
  XK_F14, "L4",
  XK_F15, "L5",
  XK_F16, "L6",
  XK_F17, "L7",
  XK_F18, "L8",
  XK_F19, "L9",
  XK_F20, "L10",
  XK_F21, "Pause",
  XK_F22, "PrSc",
  XK_F23, "ScrollLock",
  XK_F24, "R4",
  XK_F25, "R5",
  XK_F26, "R6",
  XK_F31, "KP_5",
  XK_KP_Enter, "KP_Enter",
  XK_Return, "Return",
  XK_Help, "Help",
  XK_Insert, "Insert",
  XK_Delete, "Delete",
  XK_BackSpace, "BackSpace",
  XK_Right, "Right",
  XK_Left, "Left",
  XK_Up, "Up",
  XK_Down, "Down",
  XK_R7, "Home",
  XK_R13, "End",
  XK_R9, "PgUp",
  XK_R15, "PgDn",
  XK_Tab, "TAB",
  XK_KP_Add, "KP_Add",
  XK_KP_Subtract, "KP_Subtract",
  XK_Num_Lock, "NumLock"
};

static int NumKeys = sizeof(Keys)/sizeof(Keys[0]);
/***************************************************************************/
int main(argc, argv)
int argc;
char **argv;
{

  Widget board, button;
  Arg argList[10];
  int i;
  XtAppContext appContext;
  Display *displayPtr;
  char appClass[64];
  

  strcpy(appClass,argv[0]);

    if (islower(appClass[0]))
    appClass[0] = toupper(appClass[0]);
    else if (islower(appClass[1]))
        appClass[1] = toupper(appClass[1]);
    
  AppShell = XtAppInitialize ( 
    &appContext, appClass, NULL, 0,
    &argc, argv,
    NULL, NULL, 0    
    );

  board = XtCreateManagedWidget("board", xmBulletinBoardWidgetClass, AppShell,
    NULL, 0);

  XmRemoveTabGroup(board);

  i=0;
  XtSetArg (argList[i], XmNaccelerators,
     XtParseAcceleratorTable(Accelerators)); i++;
  button = XtCreateManagedWidget("button", xmPushButtonWidgetClass, board,
    argList, i);

  XtAddCallback(button, XmNactivateCallback, ButtonCallback, NULL);


  XtRealizeWidget(AppShell);

  XtInstallAllAccelerators(button, board);

  XtAppMainLoop(appContext);

  exit(-1);
}

void ButtonCallback(widget, clientData, callData)
  Widget widget;
  caddr_t clientData;
  XmAnyCallbackStruct *callData;
{
  char keyString[12];
  KeySym keySym;
  register int i;

  XLookupString(&callData->event->xkey,
     keyString, sizeof(keyString), &keySym, NULL);
  
  if (callData->event->xkey.state & ShiftMask)
      fprintf(stderr, "Shift ");

  for (i = 0; i < NumKeys; i++)
  {
    if (keySym == Keys[i].keySym )    
         fprintf(stderr, Keys[i].keyName);
  }
  fprintf(stderr, " Pressed\n");
}