]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/DEVEL/lablgtk/lablgtk_20000829-0.1.0/examples/testdnd.ml
Initial revision
[helm.git] / helm / DEVEL / lablgtk / lablgtk_20000829-0.1.0 / examples / testdnd.ml
diff --git a/helm/DEVEL/lablgtk/lablgtk_20000829-0.1.0/examples/testdnd.ml b/helm/DEVEL/lablgtk/lablgtk_20000829-0.1.0/examples/testdnd.ml
new file mode 100644 (file)
index 0000000..8c10f7b
--- /dev/null
@@ -0,0 +1,510 @@
+(* this is a translation in Caml of the gtk+ example testdnd.c  *)
+
+
+open Gaux
+open Gtk
+open GObj
+open GMain
+
+(* GtkThread.start() *)
+
+let drag_icon_xpm = [|
+"36 48 9 1";
+"      c None";
+".     c #020204";
+"+     c #8F8F90";
+"@     c #D3D3D2";
+"#     c #AEAEAC";
+"$     c #ECECEC";
+"%     c #A2A2A4";
+"&     c #FEFEFC";
+"*     c #BEBEBC";
+"               .....................";
+"              ..&&&&&&&&&&&&&&&&&&&.";
+"             ...&&&&&&&&&&&&&&&&&&&.";
+"            ..&.&&&&&&&&&&&&&&&&&&&.";
+"           ..&&.&&&&&&&&&&&&&&&&&&&.";
+"          ..&&&.&&&&&&&&&&&&&&&&&&&.";
+"         ..&&&&.&&&&&&&&&&&&&&&&&&&.";
+"        ..&&&&&.&&&@&&&&&&&&&&&&&&&.";
+"       ..&&&&&&.*$%$+$&&&&&&&&&&&&&.";
+"      ..&&&&&&&.%$%$+&&&&&&&&&&&&&&.";
+"     ..&&&&&&&&.#&#@$&&&&&&&&&&&&&&.";
+"    ..&&&&&&&&&.#$**#$&&&&&&&&&&&&&.";
+"   ..&&&&&&&&&&.&@%&%$&&&&&&&&&&&&&.";
+"  ..&&&&&&&&&&&.&&&&&&&&&&&&&&&&&&&.";
+" ..&&&&&&&&&&&&.&&&&&&&&&&&&&&&&&&&.";
+"................&$@&&&@&&&&&&&&&&&&.";
+".&&&&&&&+&&#@%#+@#@*$%$+$&&&&&&&&&&.";
+".&&&&&&&+&&#@#@&&@*%$%$+&&&&&&&&&&&.";
+".&&&&&&&+&$%&#@&#@@#&#@$&&&&&&&&&&&.";
+".&&&&&&@#@@$&*@&@#@#$**#$&&&&&&&&&&.";
+".&&&&&&&&&&&&&&&&&&&@%&%$&&&&&&&&&&.";
+".&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.";
+".&&&&&&&&$#@@$&&&&&&&&&&&&&&&&&&&&&.";
+".&&&&&&&&&+&$+&$&@&$@&&$@&&&&&&&&&&.";
+".&&&&&&&&&+&&#@%#+@#@*$%&+$&&&&&&&&.";
+".&&&&&&&&&+&&#@#@&&@*%$%$+&&&&&&&&&.";
+".&&&&&&&&&+&$%&#@&#@@#&#@$&&&&&&&&&.";
+".&&&&&&&&@#@@$&*@&@#@#$#*#$&&&&&&&&.";
+".&&&&&&&&&&&&&&&&&&&&&$%&%$&&&&&&&&.";
+".&&&&&&&&&&$#@@$&&&&&&&&&&&&&&&&&&&.";
+".&&&&&&&&&&&+&$%&$$@&$@&&$@&&&&&&&&.";
+".&&&&&&&&&&&+&&#@%#+@#@*$%$+$&&&&&&.";
+".&&&&&&&&&&&+&&#@#@&&@*#$%$+&&&&&&&.";
+".&&&&&&&&&&&+&$+&*@&#@@#&#@$&&&&&&&.";
+".&&&&&&&&&&$%@@&&*@&@#@#$#*#&&&&&&&.";
+".&&&&&&&&&&&&&&&&&&&&&&&$%&%$&&&&&&.";
+".&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.";
+".&&&&&&&&&&&&&&$#@@$&&&&&&&&&&&&&&&.";
+".&&&&&&&&&&&&&&&+&$%&$$@&$@&&$@&&&&.";
+".&&&&&&&&&&&&&&&+&&#@%#+@#@*$%$+$&&.";
+".&&&&&&&&&&&&&&&+&&#@#@&&@*#$%$+&&&.";
+".&&&&&&&&&&&&&&&+&$+&*@&#@@#&#@$&&&.";
+".&&&&&&&&&&&&&&$%@@&&*@&@#@#$#*#&&&.";
+".&&&&&&&&&&&&&&&&&&&&&&&&&&&$%&%$&&.";
+".&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.";
+".&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.";
+".&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.";
+"...................................." |]
+
+
+
+let trashcan_closed_xpm = [|
+"64 80 17 1";
+"      c None";
+".     c #030304";
+"+     c #5A5A5C";
+"@     c #323231";
+"#     c #888888";
+"$     c #1E1E1F";
+"%     c #767677";
+"&     c #494949";
+"*     c #9E9E9C";
+"=     c #111111";
+"-     c #3C3C3D";
+";     c #6B6B6B";
+">     c #949494";
+",     c #282828";
+"'     c #808080";
+")     c #545454";
+"!     c #AEAEAC";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                       ==......=$$...===                        ";
+"                 ..$------)+++++++++++++@$$...                  ";
+"             ..=@@-------&+++++++++++++++++++-....              ";
+"          =.$$@@@-&&)++++)-,$$$$=@@&+++++++++++++,..$           ";
+"         .$$$$@@&+++++++&$$$@@@@-&,$,-++++++++++;;;&..          ";
+"        $$$$,@--&++++++&$$)++++++++-,$&++++++;%%'%%;;$@         ";
+"       .-@@-@-&++++++++-@++++++++++++,-++++++;''%;;;%*-$        ";
+"       +------++++++++++++++++++++++++++++++;;%%%;;##*!.        ";
+"        =+----+++++++++++++++++++++++;;;;;;;;;;;;%'>>).         ";
+"         .=)&+++++++++++++++++;;;;;;;;;;;;;;%''>>#>#@.          ";
+"          =..=&++++++++++++;;;;;;;;;;;;;%###>>###+%==           ";
+"           .&....=-+++++%;;####''''''''''##'%%%)..#.            ";
+"           .+-++@....=,+%#####'%%%%%%%%%;@$-@-@*++!.            ";
+"           .+-++-+++-&-@$$=$=......$,,,@;&)+!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           =+-++-+++-+++++++++!++++!++++!+++!++!+++=            ";
+"            $.++-+++-+++++++++!++++!++++!+++!++!+.$             ";
+"              =.++++++++++++++!++++!++++!+++!++.=               ";
+"                 $..+++++++++++++++!++++++...$                  ";
+"                      $$=.............=$$                       ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                "  |]
+
+let trashcan_open_xpm = [|
+"64 80 17 1";
+"      c None";
+".     c #030304";
+"+     c #5A5A5C";
+"@     c #323231";
+"#     c #888888";
+"$     c #1E1E1F";
+"%     c #767677";
+"&     c #494949";
+"*     c #9E9E9C";
+"=     c #111111";
+"-     c #3C3C3D";
+";     c #6B6B6B";
+">     c #949494";
+",     c #282828";
+"'     c #808080";
+")     c #545454";
+"!     c #AEAEAC";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                      .=.==.,@                  ";
+"                                   ==.,@-&&&)-=                 ";
+"                                 .$@,&++;;;%>*-                 ";
+"                               $,-+)+++%%;;'#+.                 ";
+"                            =---+++++;%%%;%##@.                 ";
+"                           @)++++++++;%%%%'#%$                  ";
+"                         $&++++++++++;%%;%##@=                  ";
+"                       ,-++++)+++++++;;;'#%)                    ";
+"                      @+++&&--&)++++;;%'#'-.                    ";
+"                    ,&++-@@,,,,-)++;;;'>'+,                     ";
+"                  =-++&@$@&&&&-&+;;;%##%+@                      ";
+"                =,)+)-,@@&+++++;;;;%##%&@                       ";
+"               @--&&,,@&)++++++;;;;'#)@                         ";
+"              ---&)-,@)+++++++;;;%''+,                          ";
+"            $--&)+&$-+++++++;;;%%'';-                           ";
+"           .,-&+++-$&++++++;;;%''%&=                            ";
+"          $,-&)++)-@++++++;;%''%),                              ";
+"         =,@&)++++&&+++++;%'''+$@&++++++                        ";
+"        .$@-++++++++++++;'#';,........=$@&++++                  ";
+"       =$@@&)+++++++++++'##-.................=&++               ";
+"      .$$@-&)+++++++++;%#+$.....................=)+             ";
+"      $$,@-)+++++++++;%;@=........................,+            ";
+"     .$$@@-++++++++)-)@=............................            ";
+"     $,@---)++++&)@===............................,.            ";
+"    $-@---&)))-$$=..............................=)!.            ";
+"     --&-&&,,$=,==...........................=&+++!.            ";
+"      =,=$..=$+)+++++&@$=.............=$@&+++++!++!.            ";
+"           .)-++-+++++++++++++++++++++++++++!++!++!.            ";
+"           .+-++-+++++++++++++++++++++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!+++!!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           .+-++-+++-+++++++++!++++!++++!+++!++!++!.            ";
+"           =+-++-+++-+++++++++!++++!++++!+++!++!+++=            ";
+"            $.++-+++-+++++++++!++++!++++!+++!++!+.$             ";
+"              =.++++++++++++++!++++!++++!+++!++.=               ";
+"                 $..+++++++++++++++!++++++...$                  ";
+"                      $$==...........==$$                       ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                ";
+"                                                                "  |]
+
+let window = GWindow.window ~title:"DnD Test" ()
+let _ = window#misc#realize ()
+
+let drag_icon =
+  GDraw.pixmap_from_xpm_d ~data:drag_icon_xpm ~window ()
+
+let trashcan_open =
+  GDraw.pixmap_from_xpm_d ~data:trashcan_open_xpm ~window ()
+
+let trashcan_closed =
+  GDraw.pixmap_from_xpm_d ~data:trashcan_closed_xpm ~window ()
+
+let targets = [
+  { target = "STRING"; flags = []; info = 0};
+  { target = "text/plain"; flags = []; info = 0};
+  { target = "text/uri-list"; flags = []; info = 2};
+  { target = "application/x-rootwin-drop"; flags = []; info = 1}
+]
+
+class drag_handler = object
+  method private beginning (_ : drag_context) = ()
+  method private data_delete (_ : drag_context) = ()
+  method private data_get (_ : drag_context) (_ : selection_data)
+      ~info:(_ : int) ~time:(_ : int) = ()
+  method private data_received (_ : drag_context) ~x:(_ : int) ~y:(_ : int)
+      (_ : selection_data) ~info:(_ : int) ~time:(_ : int) = ()
+  method private drop (_ : drag_context) ~x:(_ : int) ~y:(_ : int)
+      ~time:(_ : int) = false
+  method private ending (_ : drag_context) = ()
+  method private leave (_ : drag_context) ~time:(_ : int) = ()
+  method private motion (_ : drag_context) ~x:(_ : int) ~y:(_ : int)
+      ~time:(_ : int) = false
+end
+
+
+class target_drag ?packing ?show () =
+  let pixmap = GMisc.pixmap trashcan_closed ?packing ?show () in
+object (self)
+  inherit widget pixmap#as_widget
+  inherit drag_handler
+  val mutable have_drag = false
+
+  method leave _ ~time =
+    print_endline "leave"; flush stdout;
+    have_drag <- false;
+    pixmap#set_pixmap trashcan_closed
+
+  method motion context ~x ~y ~time =
+    if not have_drag then begin
+      have_drag <- true;
+      pixmap#set_pixmap trashcan_open
+    end;
+    let source_typename =
+      try
+       context#source_widget#misc#get_type
+      with Gpointer.Null -> "unknown"
+    in
+    Printf.printf "motion, source %s\n" source_typename; flush stdout;
+    context#status [context#suggested_action] ~time;
+    true
+
+  method drop context ~x ~y ~time =
+    prerr_endline "drop"; flush stdout;
+    have_drag <- false;
+    pixmap#set_pixmap trashcan_closed;
+    match context#targets with
+    | [] -> false
+    | d :: _ -> pixmap#drag#get_data d ~context ~time; true
+
+  method data_received context ~x ~y data ~info ~time =
+    if data#format = 8 then begin
+      Printf.printf "Received \"%s\" in trashcan\n" data#data;
+      flush stdout;
+      context#finish ~success:true ~del:false ~time
+    end
+    else context#finish ~success:false ~del:false ~time
+
+  initializer
+    pixmap#drag#dest_set targets ~actions:[`COPY;`MOVE];
+    pixmap#drag#connect#leave ~callback:self#leave;
+    pixmap#drag#connect#motion ~callback:self#motion;
+    pixmap#drag#connect#drop ~callback:self#drop;
+    pixmap#drag#connect#data_received ~callback:self#data_received;
+    ()
+end
+
+class label_drag ?packing ?show () =
+  let label = GMisc.label ~text:"Drop Here\n" ?packing ?show () in
+object (self)
+  inherit widget label#as_widget
+  inherit drag_handler
+  method data_received context ~x ~y data ~info ~time =
+    if data#format = 8 then  begin
+      Printf.printf "Received \"%s\" in label\n" data#data;
+      flush stdout;
+      context#finish ~success:true ~del:false ~time
+    end
+    else context#finish ~success:false ~del:false ~time
+
+  initializer
+    label#drag#dest_set targets ~actions:[`COPY; `MOVE ];
+    label#drag#connect#data_received ~callback:self#data_received;
+    ()
+end
+
+class source_drag ?packing ?show () =
+  let button = GButton.button ~label:"Drag Here\n" ?packing ?show () in
+object (self)
+  inherit widget button#as_widget
+  inherit drag_handler
+  method data_get _ data ~info ~time =
+    if info = 1 then begin
+      print_endline "I was dropped on the rootwin"; flush stdout
+    end
+    else if info = 2 then
+      data#set ~typ:data#target ~format:8
+       ~data:"file:///home/otaylor/images/weave.png"
+    else
+      data#set ~typ:data#target ~format:8 ~data:"I'm Data!"
+
+  method data_delete _ =
+    print_endline "Delete the data!"; flush stdout
+
+  initializer
+    button#drag#source_set targets
+      ~modi:[`BUTTON1; `BUTTON3 ] ~actions:[`COPY; `MOVE ];
+    button#drag#source_set_icon drag_icon;
+    button#drag#connect#data_get ~callback:self#data_get;
+    button#drag#connect#data_delete ~callback:self#data_delete;
+    ()
+end
+
+class popup () = object (self)
+  inherit drag_handler
+  val mutable popup_window = (None : GWindow.window option)
+  val mutable popped_up = false
+  val mutable in_popup = false
+  val mutable popdown_timer = None
+  val mutable popup_timer = None
+
+  method timer = popup_timer
+  method remove_timer () =
+    may popup_timer
+      ~f:(fun pdt -> Timeout.remove pdt; popup_timer <- None)
+  method add_timer time ~callback =
+    popup_timer <- Some (Timeout.add ~ms:time ~callback)
+
+  method popdown () =
+    popdown_timer <- None;
+    may popup_window ~f:(fun w -> w#misc#hide ());
+    popped_up <- false;
+    false
+
+  method motion (_ : drag_context) ~x ~y ~time =
+    if not in_popup then begin
+      in_popup <- true;
+      may popdown_timer ~f:
+       begin fun pdt ->
+         print_endline "removed popdown"; flush stdout;
+         Timeout.remove pdt;
+         popdown_timer <- None
+       end
+    end;
+    true
+
+  method leave (_ : drag_context) ~time =
+    if in_popup then begin
+      in_popup <- false;
+      if popdown_timer = None then begin
+       print_endline "added popdown"; flush stdout;
+       popdown_timer <- Some (Timeout.add ~ms:500 ~callback:self#popdown)
+      end
+    end
+
+  method popup () =
+    if not popped_up then begin
+      if popup_window = None then begin
+       let w = GWindow.window ~kind:`POPUP ~position:`MOUSE () in
+       popup_window <- Some w;
+       let table = GPack.table ~rows:3 ~columns:3 ~packing:w#add () in
+       for i = 0 to 2 do
+         for j = 0 to 2 do
+           let button =
+             GButton.button ~label:(string_of_int i ^ "," ^ string_of_int j)
+               ~packing:(table#attach ~left:i ~top:j ~expand:`BOTH) ()
+           in
+           button#drag#dest_set targets ~actions:[`COPY; `MOVE ];
+           button#drag#connect#motion ~callback:self#motion;
+           button#drag#connect#leave ~callback:self#leave;
+         done
+       done
+      end;
+      may popup_window ~f:(fun w -> w#show ());
+      popped_up <- true
+    end;
+    popdown_timer <- Some (Timeout.add ~ms:500 ~callback:self#popdown);
+    print_endline "added popdown"; flush stdout;
+    self#remove_timer ();
+    false
+end
+
+class popsite ?packing ?show () =
+  let label = GMisc.label ~text:"Popup\n" ?packing ?show ()
+  and popup = new popup () in
+object (self)
+  inherit widget label#as_widget
+  inherit drag_handler
+  method motion _ ~x ~y ~time =
+    if popup#timer = None then begin
+      print_endline "added popdown"; flush stdout;
+      popup#add_timer 500 ~callback:popup#popup
+    end;
+    true
+
+  method leave _ ~time =
+    popup#remove_timer ()
+
+  initializer
+    label#drag#dest_set targets ~actions:[`COPY; `MOVE ];
+    label#drag#connect#motion ~callback:self#motion;
+    label#drag#connect#leave ~callback:self#leave;
+    ()
+end
+
+let main () =
+  window#connect#destroy ~callback: Main.quit;
+  let table = GPack.table ~rows:2 ~columns:2 ~packing:window#add () in
+  let attach = table#attach ~expand:`BOTH in
+  new label_drag ~packing:(attach ~left:0 ~top:0) ();
+  new target_drag ~packing:(attach ~left:1 ~top:0) ();
+  new source_drag ~packing:(attach ~left:0 ~top:1) ();
+  new popsite ~packing:(attach ~left:1 ~top:1) ();
+
+  window#show ();
+  Main.main ()
+
+let _ =
+  main ()