Attached patch adds some escape accelerators and installs the accelerators
of the buttons into the proper places (or at least those I found), so
one can:
- use escape in dialog boxes (except in some boxes where escape does not
work when some text field is active, but outside it alwas works).
- add additional hotkeys for those buttons via the normal X resource
mechanism

Hochachtungsvoll,
        Bernhard R. Link
diff -r -u gv-3.6.1/src/dialog.c gv-patched/src/dialog.c
--- gv-3.6.1/src/dialog.c       2004-11-11 13:21:04.000000000 +0100
+++ gv-patched/src/dialog.c     2006-07-23 13:45:31.041080277 +0200
@@ -134,6 +134,7 @@
    }
    widgets_preferButton(pref,1);
    widgets_preferButton(pref_old,0);
+   XtInstallAccelerators(dialogText,pref_old);
    XtInstallAccelerators(dialogText,pref);
    ENDMESSAGE(action_preferDialogPopupButton)
 }
diff -r -u gv-3.6.1/src/FileSel.c gv-patched/src/FileSel.c
--- gv-3.6.1/src/FileSel.c      2004-12-08 00:55:59.000000000 +0100
+++ gv-patched/src/FileSel.c    2006-07-23 14:27:37.404572826 +0200
@@ -192,11 +192,6 @@
 <Btn3Down>:    FS_textfieldFocusAction() extend-start()\
 "; 
 
-static String TextField_accelerators =
-"#override\n\
-<Key>Return:   set() notify() unset()\
-";
-
 #if 0
 #define FILE_SELECTION_LAYOUT \
 "\
@@ -507,6 +502,7 @@
    if ((BUTTONS_RESOURCE > 0) && (BUTTONS_RESOURCE<5)) {
       if (BUTTONS_RESOURCE > 0) {
          FS_BUTTON1 = ADD_Widget("button1",buttonWidgetClass,new);
+//      FS_BUTTON1->core.accelerators = 
XtParseAcceleratorTable("#override\n<Key>Escape: set() notify()\n");
          BUTTONS += 1;
       }
       if (BUTTONS_RESOURCE > 1) {
@@ -534,6 +530,22 @@
       
CreateTextField(&FS_FILTERFRAME,&FS_FILTER,value,text_trans,"filter",new);
    }
 
+   if (BUTTONS_RESOURCE > 0 && BUTTONS_RESOURCE < 5 ) {
+       XtInstallAccelerators(FS_PATH,FS_BUTTON1);
+       XtInstallAccelerators(FS_FILTER,FS_BUTTON1);
+      if (BUTTONS_RESOURCE > 1) {
+        XtInstallAccelerators(FS_PATH,FS_BUTTON2);
+        XtInstallAccelerators(FS_FILTER,FS_BUTTON2);
+      }
+      if (BUTTONS_RESOURCE > 2) {
+        XtInstallAccelerators(FS_PATH,FS_BUTTON3);
+        XtInstallAccelerators(FS_FILTER,FS_BUTTON3);
+      }
+      if (BUTTONS_RESOURCE > 3) {
+        XtInstallAccelerators(FS_PATH,FS_BUTTON4);
+        XtInstallAccelerators(FS_FILTER,FS_BUTTON4);
+      }
+   }
    SetPreferredButton(new,PREFERRED_BUTTON,TRUE);
 
    {
@@ -929,22 +941,18 @@
    FS_WIDGET   w;
    char        name[10];
    Widget      button;
-   static XtAccelerators accelerators = (XtAccelerators)NULL;
    USE_Arg(2);
 
    BEGINMESSAGE(SetPreferredButton)
-   if (!accelerators) 
accelerators=XtParseAcceleratorTable(TextField_accelerators);
 
    IMESSAGE(position)
    if (IS_BUTTON(position)) {
       POSITION_TO_BUTTON_NAME(position,name);
       button = XtNameToWidget((Widget)FS_FILE_SELECTION,name);
       if (!install) { 
-         SET_Value(button,XtNaccelerators,(XtAccelerators)NULL);
          preferButton(button,0);
          if (PREFERRED_BUTTON==position) PREFERRED_BUTTON=0;
       } else {
-         SET_Value(button,XtNaccelerators,(XtAccelerators)accelerators);
          XtInstallAccelerators(FS_PATH,button);
          XtInstallAccelerators(FS_FILTER,button);
          preferButton(button,1);
diff -r -u gv-3.6.1/src/gv_class.ad gv-patched/src/gv_class.ad
--- gv-3.6.1/src/gv_class.ad    2004-12-19 20:22:37.000000000 +0100
+++ gv-patched/src/gv_class.ad  2006-07-23 14:54:07.977179695 +0200
@@ -923,6 +923,10 @@
 GV.TopLevelShell*Button.accelerators:#override\n\
  <Key>Return:  set() notify() unset()
 
+GV.TopLevelShell*dismiss.accelerators:#override\n\
+ <Key>Escape:  set() notify() unset()\n\
+ <Key>Return:  set() notify() unset()
+
 GV.TopLevelShell*Button.baseTranslations: #replace\n\
  <Key>Return:  set() notify() unset()\n\
  <LeaveWindow>:        unset()         \n\
@@ -934,6 +938,18 @@
 GV*TransientShell*Button.accelerators:#override\n\
  <Key>Return:  set() notify() unset()
 
+GV*TransientShell*cancel.accelerators:#override\n\
+ <Key>Escape:  set() notify() unset()\n\
+ <Key>Return:  set() notify() unset()
+
+GV*TransientShell*button1.accelerators:#override\n\
+ <Key>Escape:  set() notify() unset()\n\
+ <Key>Return:  set() notify() unset()
+
+GV*TransientShell*dismiss.accelerators:#override\n\
+ <Key>Escape:  set() notify() unset()\n\
+ <Key>Return:  set() notify() unset()
+
 GV*TransientShell*Button.baseTranslations: #replace\n\
  <Key>Return:  set() notify() unset()\n\
  <LeaveWindow>:        unset()         \n\
diff -r -u gv-3.6.1/src/gv_misc_res.dat gv-patched/src/gv_misc_res.dat
--- gv-3.6.1/src/gv_misc_res.dat        2004-12-19 17:21:45.000000000 +0100
+++ gv-patched/src/gv_misc_res.dat      2006-07-23 14:54:07.132333370 +0200
@@ -677,6 +677,10 @@
 GV.TopLevelShell*Button.accelerators:#override\n\
  <Key>Return:  set() notify() unset()
 
+GV.TopLevelShell*dismiss.accelerators:#override\n\
+ <Key>Escape:  set() notify() unset()\n\
+ <Key>Return:  set() notify() unset()
+
 GV.TopLevelShell*Button.baseTranslations: #replace\n\
  <Key>Return:  set() notify() unset()\n\
  <LeaveWindow>:        unset()         \n\
@@ -688,6 +692,18 @@
 GV*TransientShell*Button.accelerators:#override\n\
  <Key>Return:  set() notify() unset()
 
+GV*TransientShell*cancel.accelerators:#override\n\
+ <Key>Escape:  set() notify() unset()\n\
+ <Key>Return:  set() notify() unset()
+
+GV*TransientShell*button1.accelerators:#override\n\
+ <Key>Escape:  set() notify() unset()\n\
+ <Key>Return:  set() notify() unset()
+
+GV*TransientShell*dismiss.accelerators:#override\n\
+ <Key>Escape:  set() notify() unset()\n\
+ <Key>Return:  set() notify() unset()
+
 GV*TransientShell*Button.baseTranslations: #replace\n\
  <Key>Return:  set() notify() unset()\n\
  <LeaveWindow>:        unset()         \n\
diff -r -u gv-3.6.1/src/info.c gv-patched/src/info.c
--- gv-3.6.1/src/info.c 2004-11-11 13:21:05.000000000 +0100
+++ gv-patched/src/info.c       2006-07-23 14:57:21.084054258 +0200
@@ -211,6 +211,8 @@
             XtSetArg(args[n], XtNright, XtChainRight);                         
n++;
     infodismiss = XtCreateManagedWidget("dismiss", 
buttonWidgetClass,infoform,args,n);
             XtAddCallback(infodismiss, XtNcallback, cb_popdownInfoPopup,NULL);
+           XtInstallAccelerators(infoform, infodismiss);
+           XtInstallAccelerators(infotext, infodismiss);
    
                                                                                
n=0;
             XtSetArg(args[n], XtNfont, &font);                                 
n++;
diff -r -u gv-3.6.1/src/options_fs.c gv-patched/src/options_fs.c
--- gv-3.6.1/src/options_fs.c   2004-11-11 13:21:05.000000000 +0100
+++ gv-patched/src/options_fs.c 2006-07-23 14:40:02.518024278 +0200
@@ -191,10 +191,13 @@
                                                        n=0;
    w = XtCreateManagedWidget("apply", buttonWidgetClass,optionControl, args, 
n);
          XtAddCallback(w, XtNcallback, options_fs_cb_apply,NULL); 
+        XtInstallAccelerators(optionControl, w);
    w = XtCreateManagedWidget("save", buttonWidgetClass,optionControl, args, n);
          XtAddCallback(w, XtNcallback, options_fs_cb_save,NULL);
+        XtInstallAccelerators(optionControl, w);
    w = XtCreateManagedWidget("dismiss", buttonWidgetClass,optionControl, args, 
n);
          XtAddCallback(w, XtNcallback, 
options_cb_popdown,(XtPointer)gv_options_fs);
+        XtInstallAccelerators(optionControl, w);
  
    scratch_dir      = widgets_createLabeledLineTextField("scratchDir",   
optionControl);
    default_save_dir = widgets_createLabeledLineTextField("saveDir",      
optionControl);
diff -r -u gv-3.6.1/src/options_gs.c gv-patched/src/options_gs.c
--- gv-3.6.1/src/options_gs.c   2004-11-11 13:21:05.000000000 +0100
+++ gv-patched/src/options_gs.c 2006-07-23 14:36:11.455052607 +0200
@@ -307,12 +307,16 @@
                                                        n=0;
    w = XtCreateManagedWidget("apply", buttonWidgetClass,optionControl, args, 
n);
          XtAddCallback(w, XtNcallback, options_gs_cb_apply,NULL); 
+        XtInstallAccelerators(optionControl, w);
    w = XtCreateManagedWidget("save", buttonWidgetClass,optionControl, args, n);
          XtAddCallback(w, XtNcallback, options_gs_cb_save,NULL);
+        XtInstallAccelerators(optionControl, w);
    w = XtCreateManagedWidget("dismiss", buttonWidgetClass,optionControl, args, 
n);
          XtAddCallback(w, XtNcallback, options_cb_popdown, 
(XtPointer)gv_options_gs);
+        XtInstallAccelerators(optionControl, w);
    w = XtCreateManagedWidget("defaults", buttonWidgetClass,optionControl, 
args, n);
          XtAddCallback(w, XtNcallback, options_gs_cb_defaults, NULL);
+        XtInstallAccelerators(optionControl, w);
 
    options_gs_setOptionsAtEntry();
    options_realize(popup,optionControl);
diff -r -u gv-3.6.1/src/options_gv.c gv-patched/src/options_gv.c
--- gv-3.6.1/src/options_gv.c   2004-11-11 13:21:05.000000000 +0100
+++ gv-patched/src/options_gv.c 2006-07-23 14:39:44.812244804 +0200
@@ -549,10 +549,13 @@
                                                        n=0;
    w = XtCreateManagedWidget("apply", buttonWidgetClass,optionControl, args, 
n);
          XtAddCallback(w, XtNcallback, options_gv_cb_apply,NULL); 
+        XtInstallAccelerators(optionControl, w);
    w = XtCreateManagedWidget("save", buttonWidgetClass,optionControl, args, n);
          XtAddCallback(w, XtNcallback, options_gv_cb_save,NULL);
+        XtInstallAccelerators(optionControl, w);
    w = XtCreateManagedWidget("dismiss", buttonWidgetClass,optionControl, args, 
n);
          XtAddCallback(w, XtNcallback, options_cb_popdown, 
(XtPointer)gv_options_gv);
+        XtInstallAccelerators(optionControl, w);
 
    options_gv_setOptionsAtEntry();
    options_realize(popup,optionControl);
diff -r -u gv-3.6.1/src/options_setup.c gv-patched/src/options_setup.c
--- gv-3.6.1/src/options_setup.c        2004-11-12 20:07:56.000000000 +0100
+++ gv-patched/src/options_setup.c      2006-07-23 14:47:40.435731829 +0200
@@ -400,10 +400,13 @@
                                                        n=0;
    w = XtCreateManagedWidget("apply", buttonWidgetClass,optionControl, args, 
n);
          XtAddCallback(w, XtNcallback, options_setup_cb_apply,NULL); 
+        XtInstallAccelerators(optionControl, w);
    w = XtCreateManagedWidget("save", buttonWidgetClass,optionControl, args, n);
          XtAddCallback(w, XtNcallback, options_setup_cb_save,NULL);
+        XtInstallAccelerators(optionControl, w);
    w = XtCreateManagedWidget("dismiss", buttonWidgetClass,optionControl, args, 
n);
          XtAddCallback(w, XtNcallback, 
options_cb_popdown,(XtPointer)gv_options_setup);
+        XtInstallAccelerators(optionControl, w);
  
    miscmenu         = widgets_createLabeledTextField("miscmenu", 
optionControl);
    magmenu          = widgets_createLabeledTextField("magmenu", optionControl);
diff -r -u gv-3.6.1/src/widgets_misc.c gv-patched/src/widgets_misc.c
--- gv-3.6.1/src/widgets_misc.c 2004-12-08 00:55:59.000000000 +0100
+++ gv-patched/src/widgets_misc.c       2006-07-23 14:49:00.781117610 +0200
@@ -94,6 +94,7 @@
 
 static char *LineTextTr =  "\
 <Key>Return: no-op()\n\
+<Key>Escape: no-op()\n\
 <Key>Down: no-op()\n\
 <Key>Up: no-op()\n\
 <Key>Linefeed: no-op()\n\
@@ -157,6 +158,7 @@
 /*##################################################*/
 
 static char *TextTr =  "\
+<Key>Escape: no-op()\n\
 Ctrl<Key>J: no-op()\n\
 Ctrl<Key>M: no-op()\n\
 Ctrl<Key>N: no-op()\n\
diff -r -u gv-3.6.1/src/zoom.c gv-patched/src/zoom.c
--- gv-3.6.1/src/zoom.c 2004-11-11 13:21:05.000000000 +0100
+++ gv-patched/src/zoom.c       2006-07-23 14:52:28.269377061 +0200
@@ -189,6 +189,7 @@
                                                            n=0;
     zdismiss = XtCreateManagedWidget(zoom_dismiss, buttonWidgetClass,zcontrol, 
args, n);
     XtAddCallback(zdismiss, XtNcallback,cb_destroy,(XtPointer)zshell);
+    XtInstallAccelerators(zcontrol, zdismiss);
 
     XtRealizeWidget(zshell);
     {

Reply via email to