Module Bogue

module Bogue: sig .. end

General purpose GUI (Graphical user interface) library for Ocaml.

Bogue is a lightweight and fast GUI for developing desktop applications, games, or for easy debugging of non-GUI programs.

Bogue is entirely written in ocaml except for the hardware accelerated graphics library SDL2.

This documentation is best viewed on this page. (While on some links may be broken.)

Quick start

For a quick start, see Bogue's general principles, the minimal example, and the tutorials. (Again, if the links don't work, make sure you are viewing this page from here.)

The main modules are

List of Modules

The only thing that open Bogue does is to bring these modules into your namespace. They have quite common names, so beware of conflict. In case of doubt, don't open Bogue, and access the modules by using the Bogue prefix, for instance Bogue.Widget.label. The Widget and Layout modules are probably the ones that you will find yourself using the most, so it's a good idea to alias them:

module W = Bogue.Widget
module L = Bogue.Layout

module Theme: sig .. end

Theme variables.

module Utils: sig .. end


module Time: sig .. end

Time in msec.

module Var: sig .. end

Global variables with mutex.

module Timeout: sig .. end

Delayed actions.

module Trigger: sig .. end

Dealing with events.

module Mixer: sig .. end

Basic audio mixer for sound effects.

module Sync: sig .. end

Synchronized execution queue.

module Draw: sig .. end

Low-level graphics and colors.

module Mouse: sig .. end

Mouse and touchscreen information.

module Tvar: sig .. end

Transform variables

module Avar: sig .. end

Animated variables.

module Selection: sig .. end

Unions of ranges of integers


Widgets are building blocks of the GUI. They also receive all events (mouse focus, etc.) and contain the intelligence of your GUI, through connections (or callbacks, see Widget.connection). However, in order to be displayed, they need to be packed into layouts (Layout.t).

The main module for dealing with widgets is Widget.

module Image: sig .. end

Image widget.

module Style: sig .. end

Line and box styles.

module Label: sig .. end

One-line text widget.

module Button: sig .. end

Button widget with text or icon.

module Slider: sig .. end

Slider widget.

module Check: sig .. end

Checkbox widget.

module Text_display: sig .. end

Multi-line text display widget.

module Text_input: sig .. end

One-line text-input widget.

module Box: sig .. end

Box widget.

module Sdl_area: sig .. end

SDL Area widget.

module Widget: sig .. end

Creating widgets and giving life to them

module Update: sig .. end

Updating widgets


Layouts are rectangular graphical placeholders, in which you should pack all your widgets in order to display your GUI. Sophisticated gadgets are usually obtained by combining several layouts together.

module Layout: sig .. end

The main, all-purpose graphics container.

module Space: sig .. end

Adjust various spacing and sizes of layouts.

module Print: sig .. end

Convert Bogue objects to strings for debugging.

module Snapshot: sig .. end

Create an image from a Layout.

module Long_list: sig .. end

Handle large lists by not displaying all elements at once.

module Tabs: sig .. end

Switch between layouts using Tabs.

module Popup: sig .. end

Put layouts on top of others.

module Menu: sig .. end

Various types of menus.

module Select: sig .. end

Drop-down select list.

module Radiolist: sig .. end

Check list with a single choice.

module Table: sig .. end

Tables with sortable columns and selectable rows.

module Window: sig .. end


The Bogue mainloop

Because a GUI continuously waits for user interaction, everything has to run inside a loop. You start the loop with run, and this is usually the last command of your Bogue code.

module Main: sig .. end

Control the workflow of the GUI mainloop.

module Bogue: Main

Alias for Main


Here is a minimal example with a label and a check box.

open Bogue
module W = Widget
module L = Layout

let main () =

  let b = W.check_box () in
  let l = W.label "Hello world" in
  let layout = L.flat_of_w [b;l] in

  let board = Bogue.of_layout layout in board;;

let () = main ();
  Bogue.quit ()

This can be compiled to bytecode with

ocamlfind ocamlc -package bogue -linkpkg -o minimal -thread

and to native code with

ocamlfind ocamlopt -package bogue -linkpkg -o minimal -thread

Then execute the compiled code:


A window should open which should look like this:

You may also evaluate this code in a Toplevel! (for instance utop, or in an emacs session...). Just insert

#require "bogue";;

at the top, then paste the example code above, and add ;; at the end.