--- gtags.el-orig	2012-10-22 19:51:02.000000000 -0400
+++ gtags.el	2013-09-02 22:13:00.707114400 -0400
@@ -170,89 +170,68 @@
 (if (or (not gtags-global-command) (equal gtags-global-command ""))
     (setq gtags-global-command "global"))
 
-;; Key mapping of gtags-mode.
-(if gtags-suggested-key-mapping
-    (progn
-      ; Current key mapping.
-      (define-key gtags-mode-map (concat gtags-prefix-key "h") 'gtags-display-browser)
-      (define-key gtags-mode-map "\C-]" 'gtags-find-tag-from-here)
-      (define-key gtags-mode-map "\C-t" 'gtags-pop-stack)
-      (define-key gtags-mode-map (concat gtags-prefix-key "P") 'gtags-find-file)
-      (define-key gtags-mode-map (concat gtags-prefix-key "f") 'gtags-parse-file)
-      (define-key gtags-mode-map (concat gtags-prefix-key "g") 'gtags-find-with-grep)
-      (define-key gtags-mode-map (concat gtags-prefix-key "I") 'gtags-find-with-idutils)
-      (define-key gtags-mode-map (concat gtags-prefix-key "s") 'gtags-find-symbol)
-      (define-key gtags-mode-map (concat gtags-prefix-key "r") 'gtags-find-rtag)
-      (define-key gtags-mode-map (concat gtags-prefix-key "t") 'gtags-find-tag)
-      (define-key gtags-mode-map (concat gtags-prefix-key "d") 'gtags-find-tag)
-      (define-key gtags-mode-map (concat gtags-prefix-key "v") 'gtags-visit-rootdir)
-      ; common
-      (define-key gtags-mode-map "\e*" 'gtags-pop-stack)
-      (define-key gtags-mode-map "\e." 'gtags-find-tag)
-      (define-key gtags-mode-map "\C-x4." 'gtags-find-tag-other-window)
-      (if gtags-disable-pushy-mouse-mapping nil
-        (if gtags-running-xemacs nil
-          (define-key gtags-mode-map [mouse-3] 'gtags-pop-stack)
-          (define-key gtags-mode-map [mouse-2] 'gtags-find-tag-by-event))
-        (if (not gtags-running-xemacs) nil
-          (define-key gtags-mode-map 'button3 'gtags-pop-stack)
-          (define-key gtags-mode-map 'button2 'gtags-find-tag-by-event))))
-)
-;; Key mapping of old gtags-mode (obsoleted)
-(if (and gtags-suggested-key-mapping gtags-use-old-key-map)
-    (progn
-      ; Old key mapping
-      (define-key gtags-mode-map "\eh" 'gtags-display-browser)
-      (define-key gtags-mode-map "\C-]" 'gtags-find-tag-from-here)
-      (define-key gtags-mode-map "\C-t" 'gtags-pop-stack)
-      (define-key gtags-mode-map "\eP" 'gtags-find-file)
-      (define-key gtags-mode-map "\ef" 'gtags-parse-file)
-      (define-key gtags-mode-map "\eg" 'gtags-find-with-grep)
-      (define-key gtags-mode-map "\eI" 'gtags-find-with-idutils)
-      (define-key gtags-mode-map "\es" 'gtags-find-symbol)
-      (define-key gtags-mode-map "\er" 'gtags-find-rtag)
-      (define-key gtags-mode-map "\et" 'gtags-find-tag)
-      (define-key gtags-mode-map "\ev" 'gtags-visit-rootdir)
-      ; common
-      (define-key gtags-mode-map "\e*" 'gtags-pop-stack)
-      (define-key gtags-mode-map "\e." 'gtags-find-tag)
-      (define-key gtags-mode-map "\C-x4." 'gtags-find-tag-other-window)
-      (if gtags-disable-pushy-mouse-mapping nil
-        (if gtags-running-xemacs nil
-          (define-key gtags-mode-map [mouse-3] 'gtags-pop-stack)
-          (define-key gtags-mode-map [mouse-2] 'gtags-find-tag-by-event))
-        (if (not gtags-running-xemacs) nil
-          (define-key gtags-mode-map 'button3 'gtags-pop-stack)
-          (define-key gtags-mode-map 'button2 'gtags-find-tag-by-event))))
-)
+(defun gtags-bind-custom-keys ()
+  ;; Kludge to bind keys after gtags-mode is loaded.
+  (if gtags-suggested-key-mapping
+      (progn ; bind suggested keys
+	(if gtags-use-old-key-map
+	    (progn ; binding old obsolete key map, if thats what is wanted.
+	      (define-key gtags-mode-map "\eh" 'gtags-display-browser)
+	      (define-key gtags-mode-map "\C-]" 'gtags-find-tag-from-here)
+	      (define-key gtags-mode-map "\C-t" 'gtags-pop-stack)
+	      (define-key gtags-mode-map "\eP" 'gtags-find-file)
+	      (define-key gtags-mode-map "\ef" 'gtags-parse-file)
+	      (define-key gtags-mode-map "\eg" 'gtags-find-with-grep)
+	      (define-key gtags-mode-map "\eI" 'gtags-find-with-idutils)
+	      (define-key gtags-mode-map "\es" 'gtags-find-symbol)
+	      (define-key gtags-mode-map "\er" 'gtags-find-rtag)
+	      (define-key gtags-mode-map "\et" 'gtags-find-tag)
+	      (define-key gtags-mode-map "\ev" 'gtags-visit-rootdir))
+	  (progn ; binding current key map.
+	    (define-key gtags-mode-map (concat gtags-prefix-key "h") 'gtags-display-browser)
+	    (define-key gtags-mode-map "\C-]" 'gtags-find-tag-from-here)
+	    (define-key gtags-mode-map "\C-t" 'gtags-pop-stack)
+	    (define-key gtags-mode-map (concat gtags-prefix-key "P") 'gtags-find-file)
+	    (define-key gtags-mode-map (concat gtags-prefix-key "f") 'gtags-parse-file)
+	    (define-key gtags-mode-map (concat gtags-prefix-key "g") 'gtags-find-with-grep)
+	    (define-key gtags-mode-map (concat gtags-prefix-key "I") 'gtags-find-with-idutils)
+	    (define-key gtags-mode-map (concat gtags-prefix-key "s") 'gtags-find-symbol)
+	    (define-key gtags-mode-map (concat gtags-prefix-key "r") 'gtags-find-rtag)
+	    (define-key gtags-mode-map (concat gtags-prefix-key "t") 'gtags-find-tag)
+	    (define-key gtags-mode-map (concat gtags-prefix-key "d") 'gtags-find-tag)
+	    (define-key gtags-mode-map (concat gtags-prefix-key "v") 'gtags-visit-rootdir)))
+	(progn ; binding unchanged key map.
+	  (define-key gtags-mode-map "\e*" 'gtags-pop-stack)
+	  (define-key gtags-mode-map "\e." 'gtags-find-tag)
+	  (define-key gtags-mode-map "\C-x4." 'gtags-find-tag-other-window)
+					; select buffer gtags key map
+	  (define-key gtags-select-mode-map "\e*" 'gtags-pop-stack)
+	  (define-key gtags-select-mode-map "\^?" 'scroll-down)
+	  (define-key gtags-select-mode-map " " 'scroll-up)
+	  (define-key gtags-select-mode-map "\C-b" 'scroll-down)
+	  (define-key gtags-select-mode-map "\C-f" 'scroll-up)
+	  (define-key gtags-select-mode-map "k" 'previous-line)
+	  (define-key gtags-select-mode-map "j" 'next-line)
+	  (define-key gtags-select-mode-map "p" 'previous-line)
+	  (define-key gtags-select-mode-map "n" 'next-line)
+	  (define-key gtags-select-mode-map "q" 'gtags-pop-stack)
+	  (define-key gtags-select-mode-map "u" 'gtags-pop-stack)
+	  (define-key gtags-select-mode-map "\C-o" 'gtags-select-tag-other-window)
+	  (define-key gtags-select-mode-map "\e." 'gtags-select-tag)
+					; handle mouse map
+	  (if (not gtags-disable-pushy-mouse-mapping)
+	      (if gtags-running-xemacs
+		  (progn
+		    (define-key gtags-mode-map 'button3 'gtags-pop-stack)
+		    (define-key gtags-mode-map 'button2 'gtags-find-tag-by-event))
+		(progn
+		  (define-key gtags-mode-map [mouse-3] 'gtags-pop-stack)
+		  (define-key gtags-mode-map [mouse-2] 'gtags-find-tag-by-event))))))))
+
 
-;; Key mapping of gtags-select-mode.
 ; The map of key "\C-t" and "\C-m" is always carried out..
 (define-key gtags-select-mode-map "\C-t" 'gtags-pop-stack)
 (define-key gtags-select-mode-map "\C-m" 'gtags-select-tag)
-(if gtags-suggested-key-mapping
-    (progn
-      (define-key gtags-select-mode-map "\e*" 'gtags-pop-stack)
-      (define-key gtags-select-mode-map "\^?" 'scroll-down)
-      (define-key gtags-select-mode-map " " 'scroll-up)
-      (define-key gtags-select-mode-map "\C-b" 'scroll-down)
-      (define-key gtags-select-mode-map "\C-f" 'scroll-up)
-      (define-key gtags-select-mode-map "k" 'previous-line)
-      (define-key gtags-select-mode-map "j" 'next-line)
-      (define-key gtags-select-mode-map "p" 'previous-line)
-      (define-key gtags-select-mode-map "n" 'next-line)
-      (define-key gtags-select-mode-map "q" 'gtags-pop-stack)
-      (define-key gtags-select-mode-map "u" 'gtags-pop-stack)
-      (define-key gtags-select-mode-map "\C-o" 'gtags-select-tag-other-window)
-      (define-key gtags-select-mode-map "\e." 'gtags-select-tag)
-      (if gtags-disable-pushy-mouse-mapping nil
-        (if gtags-running-xemacs nil
-          (define-key gtags-select-mode-map [mouse-3] 'gtags-pop-stack)
-          (define-key gtags-select-mode-map [mouse-2] 'gtags-select-tag-by-event))
-        (if (not gtags-running-xemacs) nil
-          (define-key gtags-select-mode-map 'button3 'gtags-pop-stack)
-          (define-key gtags-select-mode-map 'button2 'gtags-select-tag-by-event))))
-)
 
 ;;
 ;; TRAMP support
@@ -882,13 +861,14 @@
       (setq minor-mode-alist (cons '(gtags-mode " Gtags") minor-mode-alist)))
   (or (assq 'gtags-mode minor-mode-map-alist)
       (setq minor-mode-map-alist
-      (cons (cons 'gtags-mode gtags-mode-map) minor-mode-map-alist)))
+	    (cons (cons 'gtags-mode gtags-mode-map) minor-mode-map-alist)))
   (setq gtags-mode
-      (if (null forces) (not gtags-mode)
-        (> (prefix-numeric-value forces) 0)))
+	(if (null forces) (not gtags-mode)
+	  (> (prefix-numeric-value forces) 0)))
   (if gtags-mode
       (add-hook 'after-save-hook 'gtags-auto-update)
-      (remove-hook 'after-save-hook 'gtags-auto-update))
+    (remove-hook 'after-save-hook 'gtags-auto-update))
+  (gtags-bind-custom-keys)
   (run-hooks 'gtags-mode-hook)
 )
 
