sig
  val cast :
    'Gobject.obj -> GtkSourceView2_types.source_undo_manager Gobject.obj
  module S = GtkSourceView2Props.SourceUndoManager.S
  val create :
    GtkSourceView2_types.source_undo_manager Gobject.param list ->
    GtkSourceView2_types.source_undo_manager Gobject.obj
  external can_undo : [> `sourceundomanager ] Gobject.obj -> bool
    = "ml_gtk_source_undo_manager_can_undo"
  external can_redo : [> `sourceundomanager ] Gobject.obj -> bool
    = "ml_gtk_source_undo_manager_can_redo"
  external undo : [> `sourceundomanager ] Gobject.obj -> unit
    = "ml_gtk_source_undo_manager_undo"
  external redo : [> `sourceundomanager ] Gobject.obj -> unit
    = "ml_gtk_source_undo_manager_redo"
  external begin_not_undoable_action :
    [> `sourceundomanager ] Gobject.obj -> unit
    = "ml_gtk_source_undo_manager_begin_not_undoable_action"
  external end_not_undoable_action :
    [> `sourceundomanager ] Gobject.obj -> unit
    = "ml_gtk_source_undo_manager_end_not_undoable_action"
  external can_undo_changed : [> `sourceundomanager ] Gobject.obj -> unit
    = "ml_gtk_source_undo_manager_can_undo_changed"
  external can_redo_changed : [> `sourceundomanager ] Gobject.obj -> unit
    = "ml_gtk_source_undo_manager_can_redo_changed"
  type undo_manager = {
    can_undo : unit -> bool;
    can_redo : unit -> bool;
    undo : unit -> unit;
    redo : unit -> unit;
    begin_not_undoable_action : unit -> unit;
    end_not_undoable_action : unit -> unit;
    can_undo_changed : unit -> unit;
    can_redo_changed : unit -> unit;
  }
  external new_ :
    GtkSourceView2.SourceUndoManager.undo_manager ->
    [ `sourceundomanager ] Gtk.obj = "ml_custom_undo_manager_new"
end