Keypad support
authormalc <av1474@comtv.ru>
Wed, 19 Dec 2012 19:32:46 +0000 (19 23:32 +0400)
committermalc <av1474@comtv.ru>
Wed, 19 Dec 2012 19:32:46 +0000 (19 23:32 +0400)
main.ml
wsi.ml

diff --git a/main.ml b/main.ml
index 0011b59..fc0be28 100644 (file)
--- a/main.ml
+++ b/main.ml
@@ -3016,6 +3016,10 @@ let withoutlastutf8 s =
 
 let textentrykeyboard
     key _mask ((c, text, opthist, onkey, ondone, cancelonempty), onleave) =
+  let key =
+    if key >= 0xffb0 && key <= 0xffb9
+    then key - 0xffb0 + 48 else key
+  in
   let enttext te =
     state.mode <- Textentry (te, onleave);
     state.text <- "";
@@ -3044,15 +3048,15 @@ let textentrykeyboard
         enttext (c, s, opthist, onkey, ondone, cancelonempty)
       )
 
-  | 0xff0d ->
+  | 0xff0d | 0xff8d ->                  (* (kp) enter *)
       ondone text;
       onleave Confirm;
       G.postRedisplay "textentrykeyboard after confirm"
 
-  | 0xff52 -> histaction HCprev
-  | 0xff54 -> histaction HCnext
-  | 0xff50 -> histaction HCfirst
-  | 0xff57 -> histaction HClast
+  | 0xff52 | 0xff97 -> histaction HCprev (* (kp) up *)
+  | 0xff54 | 0xff99 -> histaction HCnext (* (kp) down *)
+  | 0xff50 | 0xff95 -> histaction HCfirst (* (kp) home) *)
+  | 0xff57 | 0xff9c -> histaction HClast (* (kp) end *)
 
   | 0xff1b ->                     (* escape*)
       if String.length text = 0
@@ -3409,7 +3413,7 @@ object (self)
           coe {< m_qsearch = "" >}
         )
 
-    | 0xff0d ->                         (* return *)
+    | 0xff0d | 0xff8d ->                (* (kp) enter *)
         state.text <- "";
         let self = {< m_qsearch = "" >} in
         source#setqsearch "";
@@ -3428,30 +3432,30 @@ object (self)
         | Some uioh -> uioh
         end
 
-    | 0xff9f | 0xffff ->                (* delete *)
+    | 0xff9f | 0xffff ->                (* (kp) delete *)
         coe self
 
-    | 0xff52 -> navigate ~-1            (* up *)
-    | 0xff54 -> navigate   1            (* down *)
-    | 0xff55 -> navigate ~-(fstate.maxrows) (* prior *)
-    | 0xff56 -> navigate   fstate.maxrows (* next *)
+    | 0xff52 | 0xff97 -> navigate ~-1   (* (kp) up *)
+    | 0xff54 | 0xff99 -> navigate   1   (* (kp) down *)
+    | 0xff55 | 0xff9a -> navigate ~-(fstate.maxrows) (* (kp) prior *)
+    | 0xff56 | 0xff9b -> navigate   fstate.maxrows (* (kp) next *)
 
-    | 0xff53 ->                         (* right *)
+    | 0xff53 | 0xff98 ->                (* (kp) right *)
         state.text <- "";
         G.postRedisplay "listview right";
         coe {< m_pan = m_pan - 1 >}
 
-    | 0xff51 ->                         (* left *)
+    | 0xff51 | 0xff96 ->                (* (kp) left *)
         state.text <- "";
         G.postRedisplay "listview left";
         coe {< m_pan = m_pan + 1 >}
 
-    | 0xff50 ->                         (* home *)
+    | 0xff50 | 0xff95 ->                (* (kp) home *)
         let active = find 0 1 in
         G.postRedisplay "listview home";
         set active 0;
 
-    | 0xff57 ->                         (* end *)
+    | 0xff57 | 0xff9c ->                (* (kp) end *)
         let first = max 0 (itemcount - fstate.maxrows) in
         let active = find (itemcount - 1) ~-1 in
         G.postRedisplay "listview end";
@@ -3612,21 +3616,21 @@ object (self)
         G.postRedisplay "outline ctrl-l";
         coe {< m_first = first >}
 
-    | 0xff9f | 0xffff ->                (* delete *)
+    | 0xff9f | 0xffff ->                (* (kp) delete *)
         source#remove m_active;
         G.postRedisplay "outline delete";
         let active = max 0 (m_active-1) in
         coe {< m_first = firstof m_first active;
                m_active = active >}
 
-    | 0xff52 -> navigate ~-1            (* up *)
-    | 0xff54 -> navigate 1              (* down *)
-    | 0xff55 ->                         (* prior *)
+    | 0xff52 | 0xff97 -> navigate ~-1   (* (kp) up *)
+    | 0xff54 | 0xff99 -> navigate 1     (* (kp) down *)
+    | 0xff55 | 0xff9a ->                (* (kp) prior *)
         navigate ~-(fstate.maxrows)
-    | 0xff56 ->                         (* next *)
+    | 0xff56 | 0xff9b ->                (* (kp) next *)
         navigate fstate.maxrows
 
-    | 0xff53 ->                         (* [ctrl-]right *)
+    | 0xff53 | 0xff98 ->                (* [ctrl-] (kp) right *)
         let o =
           if ctrl
           then (
@@ -3637,7 +3641,7 @@ object (self)
         in
         coe o
 
-    | 0xff51 ->                         (* [ctrl-]left *)
+    | 0xff51 | 0xff96 ->                (* [ctrl-] (kp) left *)
         let o =
           if ctrl
           then (
@@ -3648,11 +3652,11 @@ object (self)
         in
         coe o
 
-    | 0xff50 ->                         (* home *)
+    | 0xff50 | 0xff95 ->                (* (kp) home *)
         G.postRedisplay "outline home";
         coe {< m_first = 0; m_active = 0 >}
 
-    | 0xff57 ->                         (* end *)
+    | 0xff57 | 0xff9c ->                (* (kp) end *)
         let active = source#getitemcount - 1 in
         let first = max 0 (active - fstate.maxrows) in
         G.postRedisplay "outline end";
@@ -4546,8 +4550,8 @@ let enterinfomode =
         if not (Wsi.withctrl mask)
         then
           match key with
-          | 0xff51 -> coe (self#updownlevel ~-1)
-          | 0xff53 -> coe (self#updownlevel 1)
+          | 0xff51 | 0xff96 -> coe (self#updownlevel ~-1) (* (kp) left *)
+          | 0xff53 | 0xff98 -> coe (self#updownlevel 1) (* (kp) right *)
           | _ -> super#key key mask
         else super#key key mask
     end);
@@ -4744,6 +4748,9 @@ let viewkeyboard key mask =
     in
     any state.layout
   in
+  let key =
+    if key >= 0xffb0 && key < 0xffb9 then key - 0xffb0 + 48 else key
+  in
   match key with
   | 81 ->                               (* Q *)
       exit 0
@@ -4849,7 +4856,7 @@ let viewkeyboard key mask =
   | 57 when ctrl ->                     (* ctrl-9 *)
       togglebirdseye ()
 
-  | (48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 |  57)
+  | (48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57)
       when not ctrl ->                  (* 0..9 *)
       let ondone s =
         let n =
@@ -5157,7 +5164,7 @@ let viewkeyboard key mask =
   | 0xff54 | 0xff52 when ctrl && Wsi.withshift mask ->
       setzoom state.prevzoom
 
-  | 107 | 0xff52 ->                     (* k up *)
+  | 107 | 0xff52 | 0xff97 ->            (* k (kp) up *)
       begin match state.autoscroll with
       | None ->
           begin match state.mode with
@@ -5171,7 +5178,7 @@ let viewkeyboard key mask =
           setautoscrollspeed n false
       end
 
-  | 106 | 0xff54 ->                     (* j down *)
+  | 106 | 0xff54 | 0xff99 ->            (* j (kp) down *)
       begin match state.autoscroll with
       | None ->
           begin match state.mode with
@@ -5201,7 +5208,7 @@ let viewkeyboard key mask =
         G.postRedisplay "lef/right"
       )
 
-  | 0xff55 ->                           (* prior *)
+  | 0xff55 | 0xff9a ->                  (* (kp) prior *)
       let y =
         if ctrl
         then
@@ -5213,7 +5220,7 @@ let viewkeyboard key mask =
       in
       gotoghyll y
 
-  | 0xff56 ->                           (* next *)
+  | 0xff56 | 0xff9b ->                  (* (kp) next *)
       let y =
         if ctrl
         then
@@ -5225,9 +5232,9 @@ let viewkeyboard key mask =
       in
       gotoghyll y
 
-  | 103 | 0xff50 ->                     (* g home *)
+  | 103 | 0xff50 | 0xff95 ->            (* g (kp) home *)
       gotoghyll 0
-  | 71 | 0xff57 ->                      (* G end *)
+  | 71 | 0xff57 | 0xff9c ->             (* G end *)
       gotoghyll (clamp state.maxy)
 
   | 0xff53 when Wsi.withalt mask ->     (* alt-right *)
@@ -5270,7 +5277,7 @@ let linknavkeyboard key mask linknav =
   let doexact (pageno, n) =
     match getopaque pageno, getpage pageno with
     | Some opaque, Some l ->
-        if key = 0xff0d
+        if key = 0xff0d || key = 0xff8d (* (kp)enter *)
         then
           let under = getlink opaque n in
           G.postRedisplay "link gotounder";
@@ -5384,7 +5391,8 @@ let birdseyekeyboard key mask
       let y, h = getpageyh pageno in
       let top = (conf.winh - h) / 2 in
       gotoy (max 0 (y - top))
-  | 0xff0d -> leavebirdseye beye false
+  | 0xff0d                              (* enter *)
+  | 0xff8d -> leavebirdseye beye false  (* kp enter *)
   | 0xff1b -> leavebirdseye beye true   (* escape *)
   | 0xff52 -> upbirdseye incr beye      (* up *)
   | 0xff54 -> downbirdseye incr beye    (* down *)
diff --git a/wsi.ml b/wsi.ml
index 439035a..241b4fd 100644 (file)
--- a/wsi.ml
+++ b/wsi.ml
@@ -63,6 +63,7 @@ type state =
     ; mutable fs         : fs
     ; mutable curcurs    : cursor
     ; mutable capslmask  : int
+    ; mutable numlmask   : int
     ; mutable levl3mask  : int
     ; mutable levl5mask  : int
     }
@@ -92,6 +93,7 @@ let state =
   ; stringatom = 31
   ; curcurs    = CURSOR_INHERIT
   ; capslmask  = 0
+  ; numlmask   = 0
   ; levl3mask  = 0
   ; levl5mask  = 0
   }
@@ -225,6 +227,7 @@ let updmodmap sock resp =
                     match s with
                     | 0xfe03 -> state.levl3mask <- 1 lsl l
                     | 0xfe11 -> state.levl5mask <- 1 lsl l
+                    | 0xff7f -> state.numlmask  <- 1 lsl l
                     | _ -> lloop (i+1)
                 in
                 lloop 0;
@@ -399,17 +402,29 @@ let getmodifiermappingreq () =
 ;;
 
 let getkeysym code mask =
-  let shift = (mask land 1) lxor ((mask land state.capslmask) lsr 1) in
-  let index =
-    let l3 = (mask land state.levl3mask) != 0 in
-    let l4 = (mask land state.levl5mask) != 0 in
-    shift +
-      if l3 then (if l4 then 8 else 4) else (if l4 then 6 else 0)
-  in
-  let keysym = state.keymap.(code-state.mink).(index) in
-  if index land 1 = 1 && keysym = 0
-  then state.keymap.(code-state.mink).(index - 1)
-  else keysym
+  let pkpk = state.keymap.(code-state.mink).(0) in
+  if (pkpk >= 0xff80 && pkpk <= 0xffbd)
+    || (pkpk >= 0x11000000 && pkpk <= 0x1100ffff)
+  then (
+    if mask land state.numlmask != 0
+    then
+      let keysym = state.keymap.(code-state.mink).(1) in
+      if keysym = 0 then pkpk else keysym
+    else pkpk
+  )
+  else (
+    let shift = (mask land 1) lxor ((mask land state.capslmask) lsr 1) in
+    let index =
+      let l3 = (mask land state.levl3mask) != 0 in
+      let l4 = (mask land state.levl5mask) != 0 in
+      shift +
+        if l3 then (if l4 then 8 else 4) else (if l4 then 6 else 0)
+    in
+    let keysym = state.keymap.(code-state.mink).(index) in
+    if index land 1 = 1 && keysym = 0
+    then state.keymap.(code-state.mink).(index - 1)
+    else keysym
+  )
 ;;
 
 let readresp sock =
@@ -504,6 +519,7 @@ let readresp sock =
       state.capslmask <- 0;
       state.levl3mask <- 0;
       state.levl5mask <- 0;
+      state.numlmask  <- 0;
       let s = getmodifiermappingreq () in
       sendwithrep sock s (updmodmap sock);