# Run `uncrustify --show-config` to see documentation for these options.
#
# See also: https://gitlab.gnome.org/GNOME/mutter/-/blob/main/doc/coding-style.md

#################################################################################
# CHANGES
#
# The first part of this file controls what automated changes Uncrustify makes.
#################################################################################

# Files are in UTF-8
utf8_force = true

# Unix style newlines
newlines = lf

# We use spaces for alignment
indent_with_tabs = 0

# We use 2 spaces for indenting
indent_columns = 2

# We indent braces 2 spaces deep
indent_brace = 2
indent_case_brace = 2

# We indent 2 spaces for multi-line #define body
pp_multiline_define_body_indent = 2

# We align parameters in function definitions, like this:
#
#     int64_t meta_string_to_date (const char   *date_string,
#                                  int          *offset_p,
#                                  GError      **error)
#
align_func_params = true

# A '*' in a variable definition is considered 'dangling', rather than
# being part of the variable type. This produces the following style of
# alignment:
#
#    meta_string_to_date (const gchar  *date_string,
#                         gint         *offset_p,
#                         GError      **error)
#
align_var_def_star_style = 2  # dangling

# Keep extra spaces which uncrustify thinks are not needed for alignment.
#
# This causes uncrustify to preserve a lot more of the existing alignment
# in Mutter's source code, for example we can keep this:
#
#    meta_string_to_date (const char   *date_string,
#                         int          *offset_p,
#                         GError      **error)
#
# Instead of it being changed to this:
#
#    meta_string_to_date (const char  *date_string,
#                         int         *offset_p,
#                         GError     **error)
#
# Because this setting is enabled, the uncrustify process is not
# idempodent with regards to variable alignment because we still have some
# extra alignment in the sourcecode which uncrustify did not insert, and
# rerunning uncrustify with different settings might remove those extra spaces.
align_keep_extra_space = true

# Ensure arithmetic operators are properly spaced, e.g:
# foo = 1 + (2 / 4);
sp_arith = force
sp_arith_additive = force

# Ensure spaces between assignments, e.g.:
# foo = 2;
# foo += 2;
sp_assign = force

# Enforce spacing around = operator (and -=, etc).
sp_after_assign = force
sp_before_assign = force

# Remove spaces between '*', e.g.:
# char **foo;
sp_between_ptr_star = remove

# Remove space after pointer stars.
sp_after_ptr_star = remove

# But add space before pointer return types and function
sp_after_ptr_star_func = force

# Ensure there is space between '*' and '(', e.g.:
# typedef GNode* (* ForeachFunc) (...);
sp_ptr_star_paren = force

# & for indirections must be together with the variable
sp_after_byref = remove

# Remove spacing around ++ / -- operators.
sp_incdec = remove

# Enforce newlines between arguments at function declarations/definitions,
# enclosing ')' belongs in the last line
nl_func_decl_args = force
nl_func_def_args = force
nl_func_decl_end = remove

# Enforce the right spacing inside/around/after ( ) in typedefs and
# function calls
sp_inside_tparen = remove
sp_func_call_paren = force
sp_after_tparen_close = force

# Also enforce the correct multiline-ness of function
# definitions/declarations/calls
nl_func_decl_args = force
nl_func_def_args = force
nl_func_decl_end = remove
nl_func_call_end = remove
nl_func_call_empty = remove

# Add stars at the beginning of each line in multiline comments
cmt_star_cont = true

# Remove space between glib/gettext i18n function shortcuts and (
set func_call_user _ C_ I_ N_ NC_ P_ Q_
sp_func_call_user_paren = remove

#################################################################################
# IGNORES
#
# The second part of this file controls what Uncrustify ignores.
#################################################################################

# Disable auto-alignment of macros, we often manually align the \ with
# spaces which uncrustify doesn't support.
align_nl_cont = 0

# Ignore spacing in multiline comments.
cmt_indent_multi = false

# Ignore space after casts like `(int)foo`
sp_after_cast = ignore

# Ignore spaces after ; in for (; ; ;) statements.
sp_after_semi_for = ignore
sp_after_semi_for_empty = ignore

# Ignore Space after ! (not) operator, for example:
#
#     if (!home) {
#
sp_not = ignore

# Ignore space around preprocessor '##' operator. We might want a space before
# and no space after, for example in this:
#
#     #define trace(message, ...) \
#         g_debug (message, ##__VA_ARGS__)
#
sp_pp_concat = ignore
