// GENERATED — DO NOT EDIT

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/class.Application.html).
pub type Application

///|
pub(open) trait IApplication {
  fn as_application(Self) -> Application
  fn add_window(Self, &IWindow) -> Unit = _
  fn get_active_window(Self) -> Window? = _
  fn get_menu_by_id(Self, String) -> @gio.Menu? = _
  fn get_menubar(Self) -> @gio.MenuModel? = _
  fn get_window_by_id(Self, UInt) -> Window? = _
  fn get_windows(Self) -> Array[Window] = _
  fn inhibit(Self, &IWindow?, ApplicationInhibitFlags, String?) -> UInt = _
  fn remove_window(Self, &IWindow) -> Unit = _
  fn set_accels_for_action(Self, String, Array[String]) -> Unit = _
  fn set_menubar(Self, &@gio.IMenuModel?) -> Unit = _
  fn uninhibit(Self, UInt) -> Unit = _
  fn connect_query_end(Self, (Application) -> Unit) -> UInt64 = _
  fn connect_window_added(Self, (Application, Window) -> Unit) -> UInt64 = _
  fn connect_window_removed(Self, (Application, Window) -> Unit) -> UInt64 = _
}

///|
pub impl IApplication for Application with fn as_application(self) {
  self
}

///|
/// Implementation contract for Application.window_added. Self is the retained MoonBit state; the second parameter is the invoked Application object.
pub(open) trait VApplicationWindowAdded {
  fn window_added(Self, Application, &IWindow) -> Unit
}

///|
/// Implementation contract for Application.window_removed. Self is the retained MoonBit state; the second parameter is the invoked Application object.
pub(open) trait VApplicationWindowRemoved {
  fn window_removed(Self, Application, &IWindow) -> Unit
}

///|
#borrow(application_id)
extern "c" fn moonbit_gtk_application_new(
  application_id : @glib.Nullable[Bytes],
  flags : Int,
) -> Application = "moonbit_gtk_application_new"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/ctor.Application.new.html).
pub fn Application::new(
  application_id : String?,
  flags : @gio.ApplicationFlags,
) -> Application {
  moonbit_gtk_application_new(
    match application_id {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
    flags.to_int(),
  )
}

///|
#borrow(self_, window)
extern "c" fn moonbit_gtk_application_add_window(
  self_ : Application,
  window : Window,
) = "moonbit_gtk_application_add_window"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.add_window.html).
pub fn Application::add_window(self : Application, window : &IWindow) -> Unit {
  moonbit_gtk_application_add_window(self, window.as_window())
}

///|
#borrow(self_)
extern "c" fn moonbit_gtk_application_get_active_window(
  self_ : Application,
) -> @glib.Nullable[Window] = "moonbit_gtk_application_get_active_window"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.get_active_window.html).
pub fn Application::get_active_window(self : Application) -> Window? {
  let raw_result = moonbit_gtk_application_get_active_window(self)
  raw_result.to_option()
}

///|
#borrow(self_, id)
extern "c" fn moonbit_gtk_application_get_menu_by_id(
  self_ : Application,
  id : Bytes,
) -> @glib.Nullable[@gio.Menu] = "moonbit_gtk_application_get_menu_by_id"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.get_menu_by_id.html).
pub fn Application::get_menu_by_id(
  self : Application,
  id : String,
) -> @gio.Menu? {
  let raw_result = moonbit_gtk_application_get_menu_by_id(
    self,
    @encoding/utf8.encode(id),
  )
  raw_result.to_option()
}

///|
#borrow(self_)
extern "c" fn moonbit_gtk_application_get_menubar(
  self_ : Application,
) -> @glib.Nullable[@gio.MenuModel] = "moonbit_gtk_application_get_menubar"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.get_menubar.html).
pub fn Application::get_menubar(self : Application) -> @gio.MenuModel? {
  let raw_result = moonbit_gtk_application_get_menubar(self)
  raw_result.to_option()
}

///|
#borrow(self_)
extern "c" fn moonbit_gtk_application_get_window_by_id(
  self_ : Application,
  id : UInt,
) -> @glib.Nullable[Window] = "moonbit_gtk_application_get_window_by_id"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.get_window_by_id.html).
pub fn Application::get_window_by_id(self : Application, id : UInt) -> Window? {
  let raw_result = moonbit_gtk_application_get_window_by_id(self, id)
  raw_result.to_option()
}

///|
#borrow(self_, result)
extern "c" fn moonbit_gtk_application_get_windows(
  self_ : Application,
  result : Ref[FixedArray[Window]],
) = "moonbit_gtk_application_get_windows"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.get_windows.html).
pub fn Application::get_windows(self : Application) -> Array[Window] {
  let result_ref : Ref[FixedArray[Window]] = Ref([])
  moonbit_gtk_application_get_windows(self, result_ref)
  let values : Array[Window] = Array::new(capacity=result_ref.val.length())
  for value in result_ref.val {
    values.push(value)
  }
  values
}

///|
#borrow(self_, window, reason)
extern "c" fn moonbit_gtk_application_inhibit(
  self_ : Application,
  window : @glib.Nullable[Window],
  flags : Int,
  reason : @glib.Nullable[Bytes],
) -> UInt = "moonbit_gtk_application_inhibit"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.inhibit.html).
pub fn Application::inhibit(
  self : Application,
  window : &IWindow?,
  flags : ApplicationInhibitFlags,
  reason : String?,
) -> UInt {
  moonbit_gtk_application_inhibit(
    self,
    match window {
      Some(v) => @glib.Nullable::some(v.as_window())
      None => @glib.Nullable::null()
    },
    flags.to_int(),
    match reason {
      Some(s) => @glib.Nullable::some(@encoding/utf8.encode(s))
      None => @glib.Nullable::null()
    },
  )
}

///|
#borrow(self_, window)
extern "c" fn moonbit_gtk_application_remove_window(
  self_ : Application,
  window : Window,
) = "moonbit_gtk_application_remove_window"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.remove_window.html).
pub fn Application::remove_window(
  self : Application,
  window : &IWindow,
) -> Unit {
  moonbit_gtk_application_remove_window(self, window.as_window())
}

///|
#borrow(self_, detailed_action_name, __sa_accels)
extern "c" fn moonbit_gtk_application_set_accels_for_action(
  self_ : Application,
  detailed_action_name : Bytes,
  __sa_accels : FixedArray[Bytes],
) = "moonbit_gtk_application_set_accels_for_action"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.set_accels_for_action.html).
pub fn Application::set_accels_for_action(
  self : Application,
  detailed_action_name : String,
  accels : Array[String],
) -> Unit {
  moonbit_gtk_application_set_accels_for_action(
    self,
    @encoding/utf8.encode(detailed_action_name),
    FixedArray::from_array(accels.map(fn(s) { @encoding/utf8.encode(s) })),
  )
}

///|
#borrow(self_, menubar)
extern "c" fn moonbit_gtk_application_set_menubar(
  self_ : Application,
  menubar : @glib.Nullable[@gio.MenuModel],
) = "moonbit_gtk_application_set_menubar"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.set_menubar.html).
pub fn Application::set_menubar(
  self : Application,
  menubar : &@gio.IMenuModel?,
) -> Unit {
  moonbit_gtk_application_set_menubar(
    self,
    match menubar {
      Some(v) => @glib.Nullable::some(v.as_menu_model())
      None => @glib.Nullable::null()
    },
  )
}

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/method.Application.uninhibit.html).
#borrow(self)
pub extern "c" fn Application::uninhibit(self : Application, cookie : UInt) = "moonbit_gtk_application_uninhibit"

///|
#borrow(instance)
extern "c" fn gtk_application_connect_query_end(
  instance : Application,
  function : FuncRef[(Application, (Application) -> Unit) -> Unit],
  closure : (Application) -> Unit,
) -> UInt64 = "moonbit_gtk_application_connect_query_end"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/signal.Application.query-end.html).
pub fn Application::connect_query_end(
  self : Application,
  f : (Application) -> Unit,
) -> UInt64 {
  gtk_application_connect_query_end(self, fn(instance_, f) { f(instance_) }, f)
}

///|
#borrow(instance)
extern "c" fn gtk_application_connect_window_added(
  instance : Application,
  function : FuncRef[
    (Application, Window, (Application, Window) -> Unit) -> Unit,
  ],
  closure : (Application, Window) -> Unit,
) -> UInt64 = "moonbit_gtk_application_connect_window_added"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/signal.Application.window-added.html).
pub fn Application::connect_window_added(
  self : Application,
  f : (Application, Window) -> Unit,
) -> UInt64 {
  gtk_application_connect_window_added(
    self,
    fn(instance_, window, f) { f(instance_, window) },
    f,
  )
}

///|
#borrow(instance)
extern "c" fn gtk_application_connect_window_removed(
  instance : Application,
  function : FuncRef[
    (Application, Window, (Application, Window) -> Unit) -> Unit,
  ],
  closure : (Application, Window) -> Unit,
) -> UInt64 = "moonbit_gtk_application_connect_window_removed"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/signal.Application.window-removed.html).
pub fn Application::connect_window_removed(
  self : Application,
  f : (Application, Window) -> Unit,
) -> UInt64 {
  gtk_application_connect_window_removed(
    self,
    fn(instance_, window, f) { f(instance_, window) },
    f,
  )
}

///|
#borrow(self_)
extern "c" fn moonbit_gtk_application_get_screensaver_active(
  self_ : Application,
) -> Int = "moonbit_gtk_application_get_screensaver_active"

///|
/// [Upstream documentation](https://docs.gtk.org/gtk4/property.Application.screensaver-active.html).
pub fn Application::get_screensaver_active(self : Application) -> Bool {
  moonbit_gtk_application_get_screensaver_active(self) != 0
}

///|
impl IApplication with fn add_window(self, window) -> Unit {
  self.as_application().add_window(window)
}

///|
impl IApplication with fn get_active_window(self) -> Window? {
  self.as_application().get_active_window()
}

///|
impl IApplication with fn get_menu_by_id(self, id) -> @gio.Menu? {
  self.as_application().get_menu_by_id(id)
}

///|
impl IApplication with fn get_menubar(self) -> @gio.MenuModel? {
  self.as_application().get_menubar()
}

///|
impl IApplication with fn get_window_by_id(self, id) -> Window? {
  self.as_application().get_window_by_id(id)
}

///|
impl IApplication with fn get_windows(self) -> Array[Window] {
  self.as_application().get_windows()
}

///|
impl IApplication with fn inhibit(self, window, flags, reason) -> UInt {
  self.as_application().inhibit(window, flags, reason)
}

///|
impl IApplication with fn remove_window(self, window) -> Unit {
  self.as_application().remove_window(window)
}

///|
impl IApplication with fn set_accels_for_action(
  self,
  detailed_action_name,
  accels,
) -> Unit {
  self.as_application().set_accels_for_action(detailed_action_name, accels)
}

///|
impl IApplication with fn set_menubar(self, menubar) -> Unit {
  self.as_application().set_menubar(menubar)
}

///|
impl IApplication with fn uninhibit(self, cookie) -> Unit {
  self.as_application().uninhibit(cookie)
}

///|
impl IApplication with fn connect_query_end(self, f) -> UInt64 {
  self.as_application().connect_query_end(f)
}

///|
impl IApplication with fn connect_window_added(self, f) -> UInt64 {
  self.as_application().connect_window_added(f)
}

///|
impl IApplication with fn connect_window_removed(self, f) -> UInt64 {
  self.as_application().connect_window_removed(f)
}

///|
pub fn Application::as_gio_application(self : Application) -> @gio.Application = "%identity"

///|
pub impl @gio.IApplication for Application with fn as_application(self) {
  self.as_gio_application()
}

///|
pub fn Application::as_gobject_object(self : Application) -> @gobject.Object = "%identity"

///|
pub impl @gobject.IObject for Application with fn as_object(self) {
  self.as_gobject_object()
}

///|
pub fn Application::as_gio_action_group(self : Application) -> @gio.ActionGroup = "%identity"

///|
pub impl @gio.IActionGroup for Application with fn as_action_group(self) {
  self.as_gio_action_group()
}