|
Packit |
bd2e5d |
(***********************************************************************)
|
|
Packit |
bd2e5d |
(* *)
|
|
Packit |
bd2e5d |
(* MLTk, Tcl/Tk interface of OCaml *)
|
|
Packit |
bd2e5d |
(* *)
|
|
Packit |
bd2e5d |
(* Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis *)
|
|
Packit |
bd2e5d |
(* projet Cristal, INRIA Rocquencourt *)
|
|
Packit |
bd2e5d |
(* Jacques Garrigue, Kyoto University RIMS *)
|
|
Packit |
bd2e5d |
(* *)
|
|
Packit |
bd2e5d |
(* Copyright 2002 Institut National de Recherche en Informatique et *)
|
|
Packit |
bd2e5d |
(* en Automatique and Kyoto University. All rights reserved. *)
|
|
Packit |
bd2e5d |
(* This file is distributed under the terms of the GNU Library *)
|
|
Packit |
bd2e5d |
(* General Public License, with the special exception on linking *)
|
|
Packit |
bd2e5d |
(* described in file LICENSE found in the OCaml source tree. *)
|
|
Packit |
bd2e5d |
(* *)
|
|
Packit |
bd2e5d |
(***********************************************************************)
|
|
Packit |
bd2e5d |
open Camltk
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let debug = ref false
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
let vert wid =
|
|
Packit |
bd2e5d |
let newsize = ref 0
|
|
Packit |
bd2e5d |
and pending_resize = ref false
|
|
Packit |
bd2e5d |
and last_last = ref 0.0 in
|
|
Packit |
bd2e5d |
let rec resize () =
|
|
Packit |
bd2e5d |
pending_resize := false;
|
|
Packit |
bd2e5d |
if !debug then
|
|
Packit |
bd2e5d |
(Printf.eprintf "%s Resize %d\n"
|
|
Packit |
bd2e5d |
(Widget.name wid) !newsize; flush stderr);
|
|
Packit |
bd2e5d |
Text.configure wid [TextHeight !newsize];
|
|
Packit |
bd2e5d |
()
|
|
Packit |
bd2e5d |
and check () =
|
|
Packit |
bd2e5d |
let first, last = Text.yview_get wid in
|
|
Packit |
bd2e5d |
check1 first last
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
and check1 first last =
|
|
Packit |
bd2e5d |
let curheight = int_of_string (cget wid CHeight) in
|
|
Packit |
bd2e5d |
if !debug then begin
|
|
Packit |
bd2e5d |
Printf.eprintf "%s C %d %f %f\n"
|
|
Packit |
bd2e5d |
(Widget.name wid) curheight first last;
|
|
Packit |
bd2e5d |
flush stderr
|
|
Packit |
bd2e5d |
end;
|
|
Packit |
bd2e5d |
if first = 0.0 && last = 1.0 then ()
|
|
Packit |
bd2e5d |
(* Don't attempt anything if widget is not visible *)
|
|
Packit |
bd2e5d |
else if not (Winfo.viewable wid) then begin
|
|
Packit |
bd2e5d |
if !debug then
|
|
Packit |
bd2e5d |
(Printf.eprintf "%s C notviewable\n" (Widget.name wid);
|
|
Packit |
bd2e5d |
flush stderr);
|
|
Packit |
bd2e5d |
(* Try again later *)
|
|
Packit |
bd2e5d |
bind wid [[], Expose] (BindSet ([], fun _ ->
|
|
Packit |
bd2e5d |
bind wid [[], Expose] BindRemove;
|
|
Packit |
bd2e5d |
check()))
|
|
Packit |
bd2e5d |
end
|
|
Packit |
bd2e5d |
else begin
|
|
Packit |
bd2e5d |
let delta =
|
|
Packit |
bd2e5d |
if last = 0.0 then 1
|
|
Packit |
bd2e5d |
else if last = !last_last then
|
|
Packit |
bd2e5d |
(* it didn't change since our last resize ! *)
|
|
Packit |
bd2e5d |
1
|
|
Packit |
bd2e5d |
else begin
|
|
Packit |
bd2e5d |
last_last := last;
|
|
Packit |
bd2e5d |
(* never to more than double *)
|
|
Packit |
bd2e5d |
let visible = max 0.5 (last -. first) in
|
|
Packit |
bd2e5d |
max 1 (truncate (float curheight *. (1. -. visible)))
|
|
Packit |
bd2e5d |
end in
|
|
Packit |
bd2e5d |
newsize := max (curheight + delta) !newsize;
|
|
Packit |
bd2e5d |
if !debug then
|
|
Packit |
bd2e5d |
(Printf.eprintf "%s newsize: %d\n" (Widget.name wid) !newsize;
|
|
Packit |
bd2e5d |
flush stderr);
|
|
Packit |
bd2e5d |
if !pending_resize then ()
|
|
Packit |
bd2e5d |
else begin
|
|
Packit |
bd2e5d |
pending_resize := true;
|
|
Packit |
bd2e5d |
Timer.set 300 (fun () -> Frx_after.idle resize)
|
|
Packit |
bd2e5d |
end
|
|
Packit |
bd2e5d |
end
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
and scroll first last =
|
|
Packit |
bd2e5d |
if !debug then
|
|
Packit |
bd2e5d |
(Printf.eprintf "%s V %f %f\n" (Widget.name wid) first last;
|
|
Packit |
bd2e5d |
flush stderr);
|
|
Packit |
bd2e5d |
if first = 0.0 && last = 1.0 then ()
|
|
Packit |
bd2e5d |
else check1 first last
|
|
Packit |
bd2e5d |
in
|
|
Packit |
bd2e5d |
scroll, check
|