Why does pressing numlock cause OCaml opengl to crash?

I have no experience with openGL, so maybe I just missed something.

I have this ocaml code using lablGL. For compilation I use

ocamlopt -I + lablGL lablglut.cmxa lablgl.cmxa gl.ml -o gl.opt

or

ocamlc -I + lablGL lablglut.cma lablgl.cma gl.ml -o gl.byte

let keyboard ~key ~x ~y =
  match key with
    | 27 -> exit 0
    | _ -> ignore (Printf.printf "Key: %c %d pressed.\n%!" (char_of_int key) key)
;;

let keyboard_up ~key ~x ~y =
  match key with
    | _ -> ignore (Printf.printf "Key: %c %d released.\n%!" key (int_of_char key))
;;

let special ~key ~x ~y =
  try
    match key with
      | Glut.KEY_F1 -> Printf.printf "F1 pressed.\n%!"
      | Glut.KEY_F2 -> Printf.printf "F2 pressed.\n%!"
      | Glut.KEY_F3 -> Printf.printf "F3 pressed.\n%!"
      | Glut.KEY_F4 -> Printf.printf "F4 pressed.\n%!"
      | Glut.KEY_F5 -> Printf.printf "F5 pressed.\n%!"
      | Glut.KEY_F6 -> Printf.printf "F6 pressed.\n%!"
      | Glut.KEY_F7 -> Printf.printf "F7 pressed.\n%!"
      | Glut.KEY_F8 -> Printf.printf "F8 pressed.\n%!"
      | Glut.KEY_F9 -> Printf.printf "F9 pressed.\n%!"
      | Glut.KEY_F10 -> Printf.printf "F10 pressed.\n%!"
      | Glut.KEY_F11 -> Printf.printf "F11 pressed.\n%!"
      | Glut.KEY_F12 -> Printf.printf "F12 pressed.\n%!"
      | Glut.KEY_LEFT -> Printf.printf "Left pressed.\n%!"
      | Glut.KEY_UP -> Printf.printf "Up pressed.\n%!"
      | Glut.KEY_RIGHT -> Printf.printf "Right pressed.\n%!"
      | Glut.KEY_DOWN -> Printf.printf "Down pressed.\n%!"
      | Glut.KEY_PAGE_UP -> Printf.printf "PgUp pressed.\n%!"
      | Glut.KEY_PAGE_DOWN -> Printf.printf "PgDown pressed.\n%!"
      | Glut.KEY_HOME -> Printf.printf "Home pressed.\n%!"
      | Glut.KEY_END -> Printf.printf "End pressed.\n%!"
      | Glut.KEY_INSERT -> Printf.printf "Insert pressed.\n%!"
  with
    | Glut.BadEnum m -> Printf.printf "%s\n" m
;;

let () =
  ignore (Glut.init Sys.argv);
  ignore (Glut.createWindow ~title:"OpenGL Demo");
  GlClear.color (1.0, 1.0, 1.0);
  Glut.keyboardFunc ~cb:(keyboard);
  Glut.specialFunc ~cb:(special);
  Glut.displayFunc ~cb:(fun () -> GlClear.clear [ `color ]; Gl.flush ());
  Glut.mainLoop ()

And now here is the problem. Pressing numlock or any other numpad key when numlock is off disables the program, throwing an exception. Trying to catch this exception in a special function does not help.

Here is an example.

> ./gl.opt 
Up pressed.
Down pressed.
Key: 1 49 pressed.
Key: 2 50 pressed.
Fatal error: exception Glut.BadEnum("key in special_of_int")

Can someone explain to me why it works this way and how to get around it?

+5
source share
2 answers

, , , :

let rec handlelablglutbug () =
    try
      Glut.mainLoop ();
    with Glut.BadEnum "key in special_of_int" ->
      showtext '!' " LablGlut bug: special key not recognized";
      Glut.swapBuffers ();
      handlelablglutbug ()
  in
  handlelablglutbug ();

, ocaml- glut.. .

+4

, OpenGL , OCaml.

lablGL, , , KEY_UNKNOWN of int , (, "" ).

+3

All Articles