[options]
girs_directories = ["../gir-files"]
library = "GLib"
version = "2.0"
min_cfg_version = "2.56"
target_path = "."
work_mode = "normal"
single_version_file = true
deprecate_by_min_version = true
trust_return_value_nullability = true

generate = [
    "GLib.ConvertError",
    "GLib.DateDay",
    "GLib.DateMonth",
    "GLib.DateWeekday",
    "GLib.DateYear",
    "GLib.FileError",
    "GLib.FileSetContentsFlags",
    "GLib.IOCondition",
    "GLib.KeyFileError",
    "GLib.KeyFileFlags",
    "GLib.LogLevelFlags",
    "GLib.LogWriterOutput",
    "GLib.MainContextFlags",
    "GLib.MarkupError",
    "GLib.NormalizeMode",
    "GLib.OptionArg",
    "GLib.OptionFlags",
    "GLib.SeekType",
    "GLib.SpawnFlags",
    "GLib.Time",
    "GLib.TimeType",
    "GLib.UnicodeType",
    "GLib.UriError",
    "GLib.UriFlags",
    "GLib.UriHideFlags",
    "GLib.UriParamsFlags",
    "GLib.VariantClass",
]

manual = [
    "GLib.ByteArray",
    "GLib.Bytes",
    "GLib.Error",
    "GLib.UserDirectory",
    "GLib.Variant",
    "GLib.VariantType",
    "GObject.Object",
]

[[object]]
name = "GLib.*"
status = "generate"
    [[object.function]]
    pattern = "(assertion_message_cmpint|assert_warning|assertion_message|assertion_message_cmpnum|assertion_message_cmpstr|warn_message|return_if_fail_warning)"
    ignore = true # Not useful assertions functions
    [[object.function]]
    pattern = "(set_print_handler|set_printerr_handler|vasprintf|vfprintf|vprintf|vsnprintf|vsprintf|stpcpy|sprintf|snprintf|printf|printf_string_upper_bound|printerr|prefix_error|print|fprintf)"
    ignore = true # Not useful string functions
    [[object.function]]
    pattern = "(malloc|malloc0|malloc0_n|malloc_n|memdup|memdup2|realloc|realloc_n|try_malloc||try_malloc0|try_malloc0_n|try_malloc_n|try_realloc|try_realloc_n|free|aligned_alloc|aligned_alloc0|aligned_free|free_sized|aligned_free_sized)"
    ignore = true # Not useful allocations functions
    [[object.function]]
    pattern = "(slice_get_config|slice_get_config_state|slice_set_config|slice_alloc|slice_alloc0|slice_copy|slice_free1|slice_free_chain_with_offset)"
    ignore = true # Not useful slices functions
    [[object.function]]
    pattern = "(path_is_absolute|path_skip_root|rmdir|basename|canonicalize_filename|build_filename|build_filename_valist|build_filenamev|build_path|build_pathv|canonicalize_filename|chdir)"
    ignore = true # Not useful paths functions, use Path/PathBuf
    [[object.function]]
    pattern = "(int64_equal|int64_hash|int_equal|int_hash|double_equal|double_hash|direct_equal|direct_hash)"
    ignore = true # Not useful equal/hash functions, only useful for GHashTable
    [[object.function]]
    pattern = "(clear_handle_id|clear_list|clear_pointer|clear_slist|clear_error|nullify_pointer)"
    ignore = true # Not useful freeing functions
    [[object.function]]
    pattern = "(datalist_.*|dataset_.*)"
    ignore = true # Not useful GData related functions
    [[object.function]]
    pattern = "(path_get_basename|path_get_dirname|file_test)"
    visibility = "crate" # used for tests
    [[object.function]]
    pattern = "(propagate_prefixed_error|set_error|file_error_from_errno|propagate_error|set_error_literal|set_error)"
    ignore = true # Not useful error handling functions
    [[object.function]]
    name = "parse_debug_string"
    ignore = true # useless
    [[object.function]]
    pattern = "(log_.*|logv)"
    ignore = true # needs manual wrappers to make their usage nicer
    [[object.function]]
    pattern = "compute_.*_for_string"
    ignore = true # needs manual wrapper to avoid an unecessary copy of the string
    [[object.function]]
    pattern = "(idle_remove_by_data|qsort_with_data)"
    ignore = true # Unsafe functions
    [[object.function]]
    pattern = "iconv"
    doc_struct_name = "IConv"
    manual = true
    [[object.function]]
    pattern = "convert_with_iconv"
    doc_struct_name = "IConv"
    manual = true
    rename = "convert"
    [[object.function]]
    pattern = "pointer_.*"
    ignore = true # Not usable, uses raw pointers
    [[object.function]]
    pattern = "file_read_link"
    ignore = true # use the ones from the std
    [[object.function]]
    pattern = "pattern_.*"
    ignore = true # use the ones from the std
    [[object.function]]
    pattern = "(markup_collect_attributes|markup_printf_escaped|markup_vprintf_escaped)"
    ignore = true # varargs functions are unbindable
    [[object.function]]
    pattern = "io_.*"
    ignore = true # they are supposed to be used with IOChannel, which doesn't have safe bindings
    [[object.function]]
    name = "file_open_tmp"
    manual = true # Return a RawFd instead of a i32
    [[object.function]]
    pattern = "atomic_.+"
    ignore = true
    [[object.function]]
    pattern = "bit_.*"
    ignore = true # use the ones in the std
    [[object.function]]
    name = "get_current_time"
    ignore = true # Deprecated
    [[object.function]]
    name = "get_filename_charsets"
    manual = true
    [[object.function]]
    pattern = "str.+v"
    #string
    ignore = true
    [[object.function]]
    name = "strv_length"
    #string
    ignore = true
    [[object.function]]
    pattern = "str.+"
    ignore = true
    [[object.function]]
    pattern = "ucs4_.+"
    ignore = true
    [[object.function]]
    pattern = "utf16_.+"
    ignore = true
    [[object.function]]
    pattern = "utf8_.+"
    ignore = true
    [[object.function]]
    pattern = "unichar_.+"
    ignore = true
    [[object.function]]
    pattern = "ascii_.+"
    ignore = true
    [[object.function]]
    name = "assertion_message_error"
    #Quark
    ignore = true
    [[object.function]]
    name = "assertion_message_expr"
    ignore = true # function is useless
    [[object.function]]
    name = "assertion_message_cmpstrv"
    ignore = true # function is useless
    [[object.function]]
    pattern = "test_.+"
    ignore = true # functions are useless
    [[object.function]]
    pattern = "prefix_error_literal"
    ignore = true # functions are useless
    [[object.function]]
    pattern = ".+_error_quark"
    #Quark
    ignore = true
    [[object.function]]
    pattern = "quark_.+_string"
    #Quark
    ignore = true
    [[object.function]]
    name = "spawn_close_pid"
    #Pid
    ignore = true
    [[object.function]]
    pattern = "[gs]et_prgname"
    #manual pathbuf
    ignore = true
    [[object.function]]
    name = "get_user_name"
        [object.function.return]
        string_type = "os_string"
    [[object.function]]
    name = "get_real_name"
        [object.function.return]
        string_type = "os_string"
    [[object.function]]
    pattern = "setenv"
        [[object.function.parameter]]
        name = "variable"
        string_type = "os_string"
        [[object.function.parameter]]
        name = "value"
        string_type = "os_string"
        [object.function.return]
        bool_return_is_error = "Failed to set environment variable"
    [[object.function]]
    pattern = "getenv"
        [[object.function.parameter]]
        name = "variable"
        string_type = "os_string"
        [object.function.return]
        string_type = "os_string"
    [[object.function]]
    name = "unsetenv"
        [[object.function.parameter]]
        name = "variable"
        string_type = "os_string"
    [[object.function]]
    name = "file_get_contents"
    # Use glib::Slice<u8> as return value
    manual = true
    [[object.function]]
    name = "mkstemp"
    # modifies the string passed in
    manual = true
    [[object.function]]
    name = "mkstemp_full"
    # modifies the string passed in
    manual = true
    [[object.function]]
    pattern = "mkdtemp(_full)?"
    # needs to be transfer full, see
    # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2596
    manual = true
    [[object.function]]
    name = "strdup"
    #not needed
    ignore = true
    [[object.function]]
    pattern = "unix_.+"
    cfg_condition = "unix"
    [[object.function]]
    name = "spawn_command_line_async"
    cfg_condition = "unix"
        [[object.function.parameter]]
        name = "command_line"
        string_type = "os_string"
    [[object.function]]
    name = "unix_open_pipe"
    manual = true
    [[object.function]]
    name = "convert_with_fallback"
    manual = true
    [[object.function]]
    name = "unicode_canonical_decomposition"
    #out param not in .gir
    ignore = true
    [[object.function]]
    name = "unicode_canonical_ordering"
    #UCS-4 encoded string
    ignore = true
    [[object.function]]
    name = "convert"
    manual = true
    [[object.function]]
    name = "filename_from_utf8"
    manual = true
    [[object.function]]
    name = "filename_to_utf8"
    manual = true
    [[object.function]]
    name = "locale_from_utf8"
    manual = true
    [[object.function]]
    name = "locale_to_utf8"
    manual = true
    [[object.function]]
    name = "child_watch_source_new"
    # Need manual bindings to be useful
    ignore = true
    [[object.function]]
    name = "idle_source_new"
    # Need manual bindings to be useful
    ignore = true
    [[object.function]]
    name = "timeout_source_new"
    # Need manual bindings to be useful
    ignore = true
    [[object.function]]
    name = "timeout_source_new_seconds"
    # Need manual bindings to be useful
    ignore = true
    [[object.function]]
    name = "unix_signal_source_new"
    # Need manual bindings to be useful
    ignore = true
    [[object.function]]
    pattern = "unix_fd.*"
    # Need manual binding for RawFd
    ignore = true
    [[object.function]]
    name = "close"
    # Need manual binding for RawFd
    ignore = true
    [[object.function]]
    name = "log_writer_is_journald"
    # Need manual binding for RawFd
    ignore = true
    [[object.function]]
    name = "log_writer_supports_color"
    # Need manual binding for RawFd
    ignore = true
    [[object.function]]
    name = "unix_set_fd_nonblocking"
    # Need manual binding for RawFd
    ignore = true
    [[object.function]]
    name = "environ_getenv"
    # manual input &[OsString]
    ignore = true
    [[object.function]]
    pattern = "environ_(un)?setenv"
    # unusable
    ignore = true
    [[object.function]]
    name = "get_charset"
    # boolean return value
    ignore = true
    [[object.function]]
    name = "get_environ"
        [object.function.return]
        string_type = "os_string"
    [[object.function]]
    name = "listenv"
        [object.function.return]
        string_type = "os_string"
    [[object.function]]
    name = "shell_parse_argv"
        [[object.function.parameter]]
        name = "command_line"
        string_type = "os_string"
        [[object.function.parameter]]
        name = "argvp"
        string_type = "os_string"
    [[object.function]]
    name = "shell_quote"
        [[object.function.parameter]]
        name = "unquoted_string"
        string_type = "os_string"
        [object.function.return]
        string_type = "os_string"
    [[object.function]]
    name = "shell_unquote"
        [[object.function.parameter]]
        name = "quoted_string"
        string_type = "os_string"
        [object.function.return]
        string_type = "os_string"
    [[object.function]]
    name = "intern_static_string"
    ignore = true
    [[object.function]]
    name = "intern_string"
    ignore = true
    [[object.function]]
    # Pid conversion issue
    name = "child_watch_add"
    ignore = true
    [[object.function]]
    # Pid conversion issue
    name = "child_watch_add_full"
    ignore = true
    # idle_* and timeout_* are manually implemented
    [[object.function]]
    name = "idle_add"
    ignore = true
    [[object.function]]
    name = "idle_add_full"
    ignore = true
    [[object.function]]
    name = "idle_add_once"
    ignore = true
    [[object.function]]
    name = "timeout_add"
    ignore = true
    [[object.function]]
    name = "timeout_add_full"
    ignore = true
    [[object.function]]
    name = "timeout_add_once"
    ignore = true
    [[object.function]]
    name = "timeout_add_seconds"
    ignore = true
    [[object.function]]
    name = "timeout_add_seconds_full"
    ignore = true
    [[object.function]]
    name = "timeout_add_seconds_once"
    ignore = true # we have a manual impl already
    [[object.function]]
    name = "unix_signal_add"
    ignore = true
    [[object.function]]
    name = "unix_signal_add_full"
    ignore = true
    [[object.function]]
    pattern = "rc_box_.+"
    #need manual implementation
    ignore = true
    [[object.function]]
    pattern = "ref_count_.+"
    #need manual implementation
    ignore = true
    [[object.function]]
    pattern = "ref_string_.+"
    #need manual implementation
    ignore = true
    [[object.function]]
    name = "spawn_async_with_fds"
    # generates invalid FDs
    ignore = true
    [[object.function]]
    name = "spawn_async_with_pipes"
    # generates invalid FDs
    ignore = true
    [[object.function]]
    name = "log_set_handler"
    # leaks closure
    ignore = true
    [[object.function]]
    name = "log_default_handler"
    # last argument is unused
    ignore = true
    [[object.function]]
    name = "log_set_handler_full"
    # from_glib_borrow on non-pointer objects
    ignore = true
    [[object.function]]
    name = "log_set_writer_func"
    # from_glib_borrow on non-pointer objects
    ignore = true
    [[object.function]]
    name = "log_structured"
    # implemented with a macro because of var args and weird arguments pairing
    ignore = true
    [[object.function]]
    name = "log"
    # implemented with a macro because of var args
    ignore = true
    [[object.function]]
    name = "log_set_default_handler"
    # It returned the old callback, which is problematic
    ignore = true
    [[object.function]]
    name = "log_remove_handler"
    # Change handler_id parameter type to LogHandlerId
    ignore = true
    [[object.function]]
    name = "log_set_always_fatal"
    # update of arguments and return type
    ignore = true
    [[object.function]]
    name = "log_variant"
    # usage of LogLevelFlags
    ignore = true
    [[object.function]]
    name = "log_set_fatal_mask"
    # update of arguments and return type
    ignore = true
    [[object.constant]]
    pattern = "DIR_SEPARATOR(_S)?"
    #not cross-platform
    ignore = true
    [[object.constant]]
    pattern = "SEARCHPATH_SEPARATOR(_S)?"
    #not cross-platform
    ignore = true
    [[object.constant]]
    name = "MODULE_SUFFIX"
    #not cross-platform
    ignore = true
    [[object.constant]]
    pattern = "GU?INT(16)?(32)?(64)?(PTR)?_FORMAT"
    #for C printf
    ignore = true
    [[object.constant]]
    pattern = "GU?INT(16)?(32)?(64)?(PTR)?_MODIFIER"
    #for C printf
    ignore = true
    [[object.constant]]
    pattern = "GS?SIZE_(FORMAT)?(MODIFIER)?"
    #for C printf
    ignore = true
    [[object.constant]]
    pattern = "GNUC_(PRETTY_)?FUNCTION"
    #for C printf
    ignore = true
    [[object.constant]]
    pattern = "PID_FORMAT"
    #for C printf
    ignore = true
    [[object.constant]]
    pattern = "POLLFD_FORMAT"
    #for C printf
    ignore = true
    [[object.function]]
    name = "variant_get_gtype"
    # get_type() function that should be used in StaticType impl instead
    ignore = true
    [[object.function]]
    pattern = "unichar_((break_)?type|get_(script|mirror_char)|combining_class|is(mark|graph|punct|title|defined|wide(_cjk)?|zerowidth)|totitle|(fully_)?decompose|compose)"
    manual = true # defined as extension methods on char

[[object]]
name = "GLib.Checksum"
status = "generate"
concurrency = "send+sync"
    [[object.function]]
    name = "get_digest"
    #wrong array definition
    manual = true
    [[object.function]]
    name = "get_string"
    #consume
    manual = true

[[object]]
name = "GLib.ChecksumType"
status = "generate"
    [[object.member]]
    name = "sha384"
    version = "2.52"

[[object]]
name = "GLib.DateTime"
status = "generate"
concurrency = "send+sync"
    [[object.function]]
    name = "new_local"
    rename = "from_local"
    [[object.function]]
    name = "new_now"
    rename = "now"
    [[object.function]]
    name = "new_now_local"
    rename = "now_local"
    [[object.function]]
    name = "new_now_utc"
    rename = "now_utc"
    [[object.function]]
    name = "new_utc"
    rename = "from_utc"
    [[object.function]]
    pattern = ".+"
        [object.function.return]
        nullable_return_is_error = "Invalid date"

[[object]]
name = "GLib.FileTest" # used for tests
status = "generate"
visibility = "crate"

[[object]]
name = "GLib.FormatSizeFlags"
status = "generate"
    [[object.member]]
    name = "only_value"
    version = "2.74"
    [[object.member]]
    name = "only_unit"
    version = "2.74"

[[object]]
name = "GLib.IConv"
status = "manual"
concurrency = "send"
    [[object.function]]
    name = "open"
    rename = "new"
    constructor = true

[[object]]
name = "GLib.KeyFile"
status = "generate"
    [[object.function]]
    name = "load_from_data_dirs"
    manual = true
    [[object.function]]
    name = "load_from_dirs"
    manual = true
    [[object.function]]
    name = "save_to_file"
    # file parameter needs to be a PathBuf
    manual = true
    [[object.function]]
    name = "set_locale_string_list"
    #[&str] to *mut i8
    ignore = true
    [[object.function]]
    name = "set_string_list"
    #[&str] to *mut i8
    ignore = true
    [[object.function]]
    name = "to_data"
    manual = true
    [[object.function]]
    name = "set_double_list"
    #wrong array type
    ignore = true
    [[object.function]]
    name = "set_integer_list"
    #wrong array type
    ignore = true
    [[object.function]]
    name = "get_groups"
    #return slice of str pointers
    manual = true
    [[object.function]]
    name = "get_keys"
    #return slice of str pointers
    manual = true
    [[object.function]]
    name = "get_boolean"
    #boolean return value needs to be returned
    manual = true
    [[object.function]]
    name = "has_key"
    #boolean return value needs to be returned
    manual = true
    [[object.function]]
    name = "get_boolean_list"
    #boolean array needs to be converted to Vec<bool>
    manual = true
    [[object.function]]
    name = "get_string"
    # can return an error but still a value to be freed
    manual = true
    [[object.function]]
    name = "get_string_list"
    # can return an error but still a value to be freed
    manual = true
    [[object.function]]
    name = "get_locale_string"
    # can return an error but still a value to be freed
    manual = true
    [[object.function]]
    name = "get_locale_string_list"
    # can return an error but still a value to be freed
    manual = true
    [[object.function]]
    name = "get_comment"
        [[object.function.parameter]]
        name = "key"
        nullable = true

[[object]]
name = "GLib.MainContext"
status = "generate"
concurrency = "send+sync"
    [[object.function]]
    name = "prepare"
    # out parameter not marked as such
    manual = true

    [[object.function]]
    name = "find_source_by_id"
    # source id is a newtype
    manual = true

    [[object.function]]
    name = "invoke"
    manual = true
    [[object.function]]
    name = "invoke_full"
    manual = true

    [[object.function]]
    name = "acquire"
    # implemented with a guard type
    manual = true

    [[object.function]]
    name = "release"
    # implemented with a guard type
    manual = true

    [[object.function]]
    name = "push_thread_default"
    # implemented with a guard type
    manual = true

    [[object.function]]
    name = "pop_thread_default"
    # implemented with a guard type
    manual = true

[[object]]
name = "GLib.MainLoop"
status = "generate"
concurrency = "send+sync"

[[object]]
name = "GLib.MarkupParseContext"
status = "generate"
    [[object.function]]
    name = "get_user_data"
    ignore = true # unsafe pointer

[[object]]
name = "GLib.Source"
status = "generate"
concurrency = "send+sync"
    [[object.function]]
    pattern = "set_.+"
    # Setters are generally not thread-safe
    # while GSource itself is
    ignore = true

    [[object.function]]
    pattern = "attach"
    # return type
    ignore = true

    [[object.function]]
    pattern = "get_id"
    # unsafe as it would allow multiple times to remove
    ignore = true

    [[object.function]]
    pattern = "remove"
    # parameter type
    ignore = true

[[object]]
name = "GLib.ThreadPool"
status = "manual"
concurrency = "send+sync"
    [[object.function]]
    name = "new_shared"
    rename = "shared"
    [[object.function]]
    name = "new_exclusive"
    rename = "exclusive"

[[object]]
name = "GLib.TimeSpan"
status = "manual"
conversion_type = "scalar"

[[object]]
name = "GLib.TimeZone"
status = "generate"
concurrency = "send+sync"
    [[object.function]]
    name = "new_identifier"
    rename = "from_identifier"
    [[object.function]]
    name = "new_local"
    rename = "local"
    [[object.function]]
    name = "new_offset"
    rename = "from_offset"
    [[object.function]]
    name = "new_utc"
    rename = "utc"
    [[object.function]]
    name = "adjust_time"
    # in-out parameter
    manual = true

[[object]]
name = "GLib.UnicodeBreakType"
status = "generate"
    [[object.member]]
    name = "close_paranthesis"
    ignore = true

[[object]]
name = "GLib.UnicodeScript"
status = "generate"
    [[object.member]]
    name = "cypro_minoan"
    version = "2.72"
    [[object.member]]
    name = "old_uyghur"
    version = "2.72"
    [[object.member]]
    name = "tangsa"
    version = "2.72"
    [[object.member]]
    name = "toto"
    version = "2.72"
    [[object.member]]
    name = "vithkuqi"
    version = "2.72"
    [[object.member]]
    name = "math"
    version = "2.72"
    [[object.member]]
    name = "kawi"
    version = "2.74"
    [[object.member]]
    name = "nag_mundari"
    version = "2.74"

[[object]]
name = "GLib.Uri"
status = "generate"
concurrency = "send+sync"
