diff --git a/bin/system-info.c b/bin/system-info.c index e8fab9c45ceeddc025ce474c5eb35db58aee97c0..37ad0dcb2131c0f78c17c9004e9fd364709034e5 100644 --- a/bin/system-info.c +++ b/bin/system-info.c @@ -125,6 +125,8 @@ #include <json-glib/json-glib.h> +#include <steam-runtime-tools/utils-internal.h> + enum { OPTION_HELP = 1, @@ -212,153 +214,92 @@ divert_stdout_to_stderr (GError **error) } static void -jsonify_library_issues (JsonBuilder *builder, - SrtLibraryIssues issues) +jsonify_flags (JsonBuilder *builder, + GType flags_type, + unsigned int values) { - if ((issues & SRT_LIBRARY_ISSUES_CANNOT_LOAD) != 0) - json_builder_add_string_value (builder, "cannot-load"); + GFlagsClass *class; + GFlagsValue *flags_value; + + g_return_if_fail (G_TYPE_IS_FLAGS (flags_type)); + + class = g_type_class_ref (flags_type); + + while (values != 0) + { + flags_value = g_flags_get_first_value (class, values); - if ((issues & SRT_LIBRARY_ISSUES_MISSING_SYMBOLS) != 0) - json_builder_add_string_value (builder, "missing-symbols"); + if (flags_value == NULL) + break; - if ((issues & SRT_LIBRARY_ISSUES_MISVERSIONED_SYMBOLS) != 0) - json_builder_add_string_value (builder, "misversioned-symbols"); + json_builder_add_string_value (builder, flags_value->value_nick); + values &= ~flags_value->value; + } + + if (values) + { + gchar *rest = g_strdup_printf ("0x%x", values); + + json_builder_add_string_value (builder, rest); + + g_free (rest); + } - if ((issues & SRT_LIBRARY_ISSUES_INTERNAL_ERROR) != 0) - json_builder_add_string_value (builder, "internal-error"); + g_type_class_unref (class); +} - if ((issues & SRT_LIBRARY_ISSUES_UNKNOWN_EXPECTATIONS) != 0) - json_builder_add_string_value (builder, "unknown-expectations"); +static void +jsonify_library_issues (JsonBuilder *builder, + SrtLibraryIssues issues) +{ + jsonify_flags (builder, SRT_TYPE_LIBRARY_ISSUES, issues); } static void jsonify_graphics_issues (JsonBuilder *builder, SrtGraphicsIssues issues) { - if ((issues & SRT_GRAPHICS_ISSUES_CANNOT_LOAD) != 0) - json_builder_add_string_value (builder, "cannot-load"); - - if ((issues & SRT_GRAPHICS_ISSUES_INTERNAL_ERROR) != 0) - json_builder_add_string_value (builder, "internal-error"); - - if ((issues & SRT_GRAPHICS_ISSUES_SOFTWARE_RENDERING) != 0) - json_builder_add_string_value (builder, "software-rendering"); - - if ((issues & SRT_GRAPHICS_ISSUES_TIMEOUT) != 0) - json_builder_add_string_value (builder, "timeout"); - - if ((issues & SRT_GRAPHICS_ISSUES_CANNOT_DRAW) != 0) - json_builder_add_string_value (builder, "cannot-draw"); + jsonify_flags (builder, SRT_TYPE_GRAPHICS_ISSUES, issues); } static void jsonify_graphics_library_vendor (JsonBuilder *builder, SrtGraphicsLibraryVendor vendor) { - if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN) - json_builder_add_string_value (builder, "unknown"); - - else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_GLVND) - json_builder_add_string_value (builder, "glvnd"); - - else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_UNKNOWN_NON_GLVND) - json_builder_add_string_value (builder, "unknown-non-glvnd"); - - else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_MESA) - json_builder_add_string_value (builder, "mesa"); - - else if (vendor == SRT_GRAPHICS_LIBRARY_VENDOR_NVIDIA) - json_builder_add_string_value (builder, "nvidia"); + const char *s = srt_enum_value_to_nick (SRT_TYPE_GRAPHICS_LIBRARY_VENDOR, vendor); + if (s != NULL) + { + json_builder_add_string_value (builder, s); + } else - json_builder_add_string_value (builder, "unexpected-vendor"); + { + gchar *fallback = g_strdup_printf ("(unknown value %d)", vendor); + + json_builder_add_string_value (builder, fallback); + g_free (fallback); + } } static void jsonify_steam_issues (JsonBuilder *builder, SrtSteamIssues issues) { - if ((issues & SRT_STEAM_ISSUES_INTERNAL_ERROR) != 0) - json_builder_add_string_value (builder, "internal-error"); - - if ((issues & SRT_STEAM_ISSUES_CANNOT_FIND) != 0) - json_builder_add_string_value (builder, "cannot-find"); - - if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_STEAM_NOT_SYMLINK) != 0) - json_builder_add_string_value (builder, "dot-steam-steam-not-symlink"); - - if ((issues & SRT_STEAM_ISSUES_CANNOT_FIND_DATA) != 0) - json_builder_add_string_value (builder, "cannot-find-data"); - - if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_STEAM_NOT_DIRECTORY) != 0) - json_builder_add_string_value (builder, "dot-steam-steam-not-directory"); - - if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_ROOT_NOT_SYMLINK) != 0) - json_builder_add_string_value (builder, "dot-steam-root-not-symlink"); - - if ((issues & SRT_STEAM_ISSUES_DOT_STEAM_ROOT_NOT_DIRECTORY) != 0) - json_builder_add_string_value (builder, "dot-steam-root-not-directory"); + jsonify_flags (builder, SRT_TYPE_STEAM_ISSUES, issues); } static void jsonify_runtime_issues (JsonBuilder *builder, SrtRuntimeIssues issues) { - if ((issues & SRT_RUNTIME_ISSUES_INTERNAL_ERROR) != 0) - json_builder_add_string_value (builder, "internal-error"); - - if ((issues & SRT_RUNTIME_ISSUES_DISABLED) != 0) - json_builder_add_string_value (builder, "disabled"); - - if ((issues & SRT_RUNTIME_ISSUES_NOT_RUNTIME) != 0) - json_builder_add_string_value (builder, "not-runtime"); - - if ((issues & SRT_RUNTIME_ISSUES_UNOFFICIAL) != 0) - json_builder_add_string_value (builder, "unofficial"); - - if ((issues & SRT_RUNTIME_ISSUES_UNEXPECTED_LOCATION) != 0) - json_builder_add_string_value (builder, "unexpected-location"); - - if ((issues & SRT_RUNTIME_ISSUES_UNEXPECTED_VERSION) != 0) - json_builder_add_string_value (builder, "unexpected-version"); - - if ((issues & SRT_RUNTIME_ISSUES_NOT_IN_LD_PATH) != 0) - json_builder_add_string_value (builder, "not-in-ld-path"); - - if ((issues & SRT_RUNTIME_ISSUES_NOT_IN_PATH) != 0) - json_builder_add_string_value (builder, "not-in-path"); - - if ((issues & SRT_RUNTIME_ISSUES_NOT_IN_ENVIRONMENT) != 0) - json_builder_add_string_value (builder, "not-in-environment"); - - if ((issues & SRT_RUNTIME_ISSUES_NOT_USING_NEWER_HOST_LIBRARIES) != 0) - json_builder_add_string_value (builder, "not-using-newer-host-libraries"); + jsonify_flags (builder, SRT_TYPE_RUNTIME_ISSUES, issues); } static void jsonify_locale_issues (JsonBuilder *builder, SrtLocaleIssues issues) { - if ((issues & SRT_LOCALE_ISSUES_INTERNAL_ERROR) != 0) - json_builder_add_string_value (builder, "internal-error"); - - if ((issues & SRT_LOCALE_ISSUES_DEFAULT_MISSING) != 0) - json_builder_add_string_value (builder, "default-missing"); - - if ((issues & SRT_LOCALE_ISSUES_DEFAULT_NOT_UTF8) != 0) - json_builder_add_string_value (builder, "default-not-utf8"); - - if ((issues & SRT_LOCALE_ISSUES_C_UTF8_MISSING) != 0) - json_builder_add_string_value (builder, "c-utf8-missing"); - - if ((issues & SRT_LOCALE_ISSUES_EN_US_UTF8_MISSING) != 0) - json_builder_add_string_value (builder, "en-us-utf8-missing"); - - if ((issues & SRT_LOCALE_ISSUES_I18N_SUPPORTED_MISSING) != 0) - json_builder_add_string_value (builder, "i18n-supported-missing"); - - if ((issues & SRT_LOCALE_ISSUES_I18N_LOCALES_EN_US_MISSING) != 0) - json_builder_add_string_value (builder, "i18n-locales-en-us-missing"); + jsonify_flags (builder, SRT_TYPE_LOCALE_ISSUES, issues); } static void diff --git a/steam-runtime-tools/graphics-internal.h b/steam-runtime-tools/graphics-internal.h index 88148a202af7576c1f86f29cbe0986cf8ef61a35..196c2d435f2d942856d1b072a8b7c5c88b2b7406 100644 --- a/steam-runtime-tools/graphics-internal.h +++ b/steam-runtime-tools/graphics-internal.h @@ -27,6 +27,7 @@ #pragma once #include "steam-runtime-tools/steam-runtime-tools.h" +#include "steam-runtime-tools/utils-internal.h" /* * _srt_graphics_new: @@ -117,24 +118,25 @@ static inline int _srt_graphics_hash_key(SrtWindowSystem window_system, static inline const gchar * _srt_graphics_window_system_string (SrtWindowSystem window_system) { - if (window_system == SRT_WINDOW_SYSTEM_X11) - return "x11"; - else if (window_system == SRT_WINDOW_SYSTEM_GLX) - return "glx"; - else if (window_system == SRT_WINDOW_SYSTEM_EGL_X11) + const gchar *result = srt_enum_value_to_nick (SRT_TYPE_WINDOW_SYSTEM, window_system); + + if (window_system == SRT_WINDOW_SYSTEM_EGL_X11) return "egl_x11"; + + if (result != NULL) + return result; + return "unknown window system"; } static inline const gchar * _srt_graphics_rendering_interface_string (SrtRenderingInterface rendering_interface) { - if (rendering_interface == SRT_RENDERING_INTERFACE_GL) - return "gl"; - else if (rendering_interface == SRT_RENDERING_INTERFACE_GLESV2) - return "glesv2"; - else if (rendering_interface == SRT_RENDERING_INTERFACE_VULKAN) - return "vulkan"; + const gchar *result = srt_enum_value_to_nick (SRT_TYPE_RENDERING_INTERFACE, rendering_interface); + + if (result != NULL) + return result; + return "unknown rendering interface"; } diff --git a/steam-runtime-tools/utils-internal.h b/steam-runtime-tools/utils-internal.h index 396a76acb7679b63099a41758a4e94ea7afed8bc..5b93333fb553749a8d7cdebf1d0ee87550898278 100644 --- a/steam-runtime-tools/utils-internal.h +++ b/steam-runtime-tools/utils-internal.h @@ -48,3 +48,7 @@ G_GNUC_INTERNAL const char *_srt_find_myself (const char **helpers_path_out, G_GNUC_INTERNAL gboolean _srt_process_timeout_wait_status (int wait_status, int *exit_status, int *terminating_signal); + +const char *srt_enum_value_to_nick (GType enum_type, + int value); + diff --git a/steam-runtime-tools/utils.c b/steam-runtime-tools/utils.c index d324b5db26576b4c61ce57d29f7e7eafe63484cd..0440ceb709bc53063fb348be7f18ce51adab48ff 100644 --- a/steam-runtime-tools/utils.c +++ b/steam-runtime-tools/utils.c @@ -409,6 +409,40 @@ _srt_filter_gameoverlayrenderer (const gchar *input) return ret; } +/** + * srt_enum_value_to_nick + * @enum_type: The type of the enumeration. + * @value: The enumeration value to stringify. + * + * Get the #GEnumValue.value-nick of a given enumeration value. + * For example, `srt_enum_value_to_nick (SRT_TYPE_WINDOW_SYSTEM, SRT_WINDOW_SYSTEM_EGL_X11)` + * returns `"egl-x11"`. + * + * Returns: (transfer none): A string representation + * of the given enumeration value. + */ +const char * +srt_enum_value_to_nick (GType enum_type, + int value) +{ + GEnumClass *class; + GEnumValue *enum_value; + const char *result; + + g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL); + + class = g_type_class_ref (enum_type); + enum_value = g_enum_get_value (class, value); + + if (enum_value != NULL) + result = enum_value->value_nick; + else + result = NULL; + + g_type_class_unref (class); + return result; +} + #if !GLIB_CHECK_VERSION(2, 36, 0) static void _srt_constructor (void) __attribute__((__constructor__)); static void