diff options
author | Jan Tojnar <jtojnar@gmail.com> | 2022-12-15 21:20:40 +0100 |
---|---|---|
committer | Jan Tojnar <jtojnar@gmail.com> | 2022-12-19 17:38:57 +0100 |
commit | 4346dee4243e2f3b900b710cf800a1ee7309d2b1 (patch) | |
tree | 09f61b513244f919f37b5433aa973c7445262af9 | |
parent | 98e84e79a97155cf748cbca8d1abbd56038c11f9 (diff) |
makeHardcodeGsettingsPatch: Support other constructors
In addition to `g_settings_new`, there are three other GSettings constructors:
https://docs.gtk.org/gio/ctor.Settings.new.html
4 files changed, 144 insertions, 11 deletions
diff --git a/pkgs/build-support/make-hardcode-gsettings-patch/hardcode-gsettings.cocci b/pkgs/build-support/make-hardcode-gsettings-patch/hardcode-gsettings.cocci index bedacf846bc4..a265f5fac384 100644 --- a/pkgs/build-support/make-hardcode-gsettings-patch/hardcode-gsettings.cocci +++ b/pkgs/build-support/make-hardcode-gsettings-patch/hardcode-gsettings.cocci @@ -3,7 +3,7 @@ * where GSettings system could look for schemas, we need to point the software to a correct location somehow. * For executables, we handle this using wrappers but this is not an option for libraries like e-d-s. * Instead, we hardcode the schema path when creating the settings. - * A schema path (ie org.gnome.evolution) can be replaced by @EVOLUTION_SCHEMA_PATH@ + * A schema path (ie org.gnome.evolution) can be replaced by @EVOLUTION_SCHEMA_ID@ * which is then replaced at build time by substituteAll. * The mapping is provided in a json file ./glib-schema-to-var.json */ @@ -23,14 +23,13 @@ def resolve_cpp_constant(const_name): with open("./glib-schema-to-var.json") as mapping_file: schema_to_var = json.load(mapping_file); -def get_schema_directory(schema_path): +def get_schema_directory(schema_id): # Sometimes the schema id is referenced using C preprocessor #define constant in the same file # let’s try to resolve it first. - schema_path = resolve_cpp_constant(schema_path.strip()).strip('"') - if schema_path in schema_to_var: - return f'"@{schema_to_var[schema_path]}@"' - raise Exception(f"Unknown schema path {schema_path!r}, please add it to ./glib-schema-to-var.json") - + schema_id = resolve_cpp_constant(schema_id.strip()).strip('"') + if schema_id in schema_to_var: + return f'"@{schema_to_var[schema_id]}@"' + raise Exception(f"Unknown schema path {schema_id!r}, please add it to ./glib-schema-to-var.json") @find_cpp_constants@ identifier const_name; @@ -49,15 +48,15 @@ register_cpp_constant(const_name, val) @depends on ever record_cpp_constants || never record_cpp_constants@ // We want to run after #define constants have been collected but even if there are no #defines. -expression SCHEMA_PATH; +expression SCHEMA_ID; expression settings; // Coccinelle does not like autocleanup macros in + sections, // let’s use fresh id with concatenation to produce the code as a string. fresh identifier schema_source_decl = "g_autoptr(GSettingsSchemaSource) " ## "schema_source"; fresh identifier schema_decl = "g_autoptr(GSettingsSchema) " ## "schema"; -fresh identifier SCHEMA_DIRECTORY = script:python(SCHEMA_PATH) { get_schema_directory(SCHEMA_PATH) }; +fresh identifier SCHEMA_DIRECTORY = script:python(SCHEMA_ID) { get_schema_directory(SCHEMA_ID) }; @@ --settings = g_settings_new(SCHEMA_PATH); +-settings = g_settings_new(SCHEMA_ID); +{ + schema_source_decl; + schema_decl; @@ -65,6 +64,79 @@ fresh identifier SCHEMA_DIRECTORY = script:python(SCHEMA_PATH) { get_schema_dire + g_settings_schema_source_get_default(), + TRUE, + NULL); -+ schema = g_settings_schema_source_lookup(schema_source, SCHEMA_PATH, FALSE); ++ schema = g_settings_schema_source_lookup(schema_source, SCHEMA_ID, FALSE); + settings = g_settings_new_full(schema, NULL, NULL); +} + + +@depends on ever record_cpp_constants || never record_cpp_constants@ +// We want to run after #define constants have been collected but even if there are no #defines. +expression SCHEMA_ID; +expression settings; +expression BACKEND; +// Coccinelle does not like autocleanup macros in + sections, +// let’s use fresh id with concatenation to produce the code as a string. +fresh identifier schema_source_decl = "g_autoptr(GSettingsSchemaSource) " ## "schema_source"; +fresh identifier schema_decl = "g_autoptr(GSettingsSchema) " ## "schema"; +fresh identifier SCHEMA_DIRECTORY = script:python(SCHEMA_ID) { get_schema_directory(SCHEMA_ID) }; +@@ +-settings = g_settings_new_with_backend(SCHEMA_ID, BACKEND); ++{ ++ schema_source_decl; ++ schema_decl; ++ schema_source = g_settings_schema_source_new_from_directory(SCHEMA_DIRECTORY, ++ g_settings_schema_source_get_default(), ++ TRUE, ++ NULL); ++ schema = g_settings_schema_source_lookup(schema_source, SCHEMA_ID, FALSE); ++ settings = g_settings_new_full(schema, BACKEND, NULL); ++} + + +@depends on ever record_cpp_constants || never record_cpp_constants@ +// We want to run after #define constants have been collected but even if there are no #defines. +expression SCHEMA_ID; +expression settings; +expression BACKEND; +expression PATH; +// Coccinelle does not like autocleanup macros in + sections, +// let’s use fresh id with concatenation to produce the code as a string. +fresh identifier schema_source_decl = "g_autoptr(GSettingsSchemaSource) " ## "schema_source"; +fresh identifier schema_decl = "g_autoptr(GSettingsSchema) " ## "schema"; +fresh identifier SCHEMA_DIRECTORY = script:python(SCHEMA_ID) { get_schema_directory(SCHEMA_ID) }; +@@ +-settings = g_settings_new_with_backend_and_path(SCHEMA_ID, BACKEND, PATH); ++{ ++ schema_source_decl; ++ schema_decl; ++ schema_source = g_settings_schema_source_new_from_directory(SCHEMA_DIRECTORY, ++ g_settings_schema_source_get_default(), ++ TRUE, ++ NULL); ++ schema = g_settings_schema_source_lookup(schema_source, SCHEMA_ID, FALSE); ++ settings = g_settings_new_full(schema, BACKEND, PATH); ++} + + +@depends on ever record_cpp_constants || never record_cpp_constants@ +// We want to run after #define constants have been collected but even if there are no #defines. +expression SCHEMA_ID; +expression settings; +expression PATH; +// Coccinelle does not like autocleanup macros in + sections, +// let’s use fresh id with concatenation to produce the code as a string. +fresh identifier schema_source_decl = "g_autoptr(GSettingsSchemaSource) " ## "schema_source"; +fresh identifier schema_decl = "g_autoptr(GSettingsSchema) " ## "schema"; +fresh identifier SCHEMA_DIRECTORY = script:python(SCHEMA_ID) { get_schema_directory(SCHEMA_ID) }; +@@ +-settings = g_settings_new_with_path(SCHEMA_ID, PATH); ++{ ++ schema_source_decl; ++ schema_decl; ++ schema_source = g_settings_schema_source_new_from_directory(SCHEMA_DIRECTORY, ++ g_settings_schema_source_get_default(), ++ TRUE, ++ NULL); ++ schema = g_settings_schema_source_lookup(schema_source, SCHEMA_ID, FALSE); ++ settings = g_settings_new_full(schema, NULL, PATH); ++} diff --git a/pkgs/test/make-hardcode-gsettings-patch/default.nix b/pkgs/test/make-hardcode-gsettings-patch/default.nix index a1339ffb2bc4..6c5d2318c6d8 100644 --- a/pkgs/test/make-hardcode-gsettings-patch/default.nix +++ b/pkgs/test/make-hardcode-gsettings-patch/default.nix @@ -51,6 +51,7 @@ in schemaIdToVariableMapping = { "org.gnome.evolution-data-server.addressbook" = "EDS"; "org.gnome.evolution.calendar" = "EVO"; + "org.gnome.seahorse.nautilus.window" = "SEANAUT"; }; expected = ./fixtures/example-project-patched; }; diff --git a/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched/main.c b/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched/main.c index 42eeeca58494..7822a42b840a 100644 --- a/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched/main.c +++ b/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project-patched/main.c @@ -37,10 +37,49 @@ void schema_id_autoptr() { } } +void schema_id_with_backend() { + GSettings *settings; + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; + schema_source = g_settings_schema_source_new_from_directory("@EDS@", g_settings_schema_source_get_default(), TRUE, NULL); + schema = g_settings_schema_source_lookup(schema_source, "org.gnome.evolution-data-server.addressbook", FALSE); + settings = g_settings_new_full(schema, g_settings_backend_get_default(), NULL); + } + g_object_unref(settings); +} + +void schema_id_with_backend_and_path() { + GSettings *settings; + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; + schema_source = g_settings_schema_source_new_from_directory("@SEANAUT@", g_settings_schema_source_get_default(), TRUE, NULL); + schema = g_settings_schema_source_lookup(schema_source, "org.gnome.seahorse.nautilus.window", FALSE); + settings = g_settings_new_full(schema, g_settings_backend_get_default(), "/org/gnome/seahorse/nautilus/windows/123/"); + } + g_object_unref(settings); +} + +void schema_id_with_path() { + GSettings *settings; + { + g_autoptr(GSettingsSchemaSource) schema_source; + g_autoptr(GSettingsSchema) schema; + schema_source = g_settings_schema_source_new_from_directory("@SEANAUT@", g_settings_schema_source_get_default(), TRUE, NULL); + schema = g_settings_schema_source_lookup(schema_source, "org.gnome.seahorse.nautilus.window", FALSE); + settings = g_settings_new_full(schema, NULL, "/org/gnome/seahorse/nautilus/windows/123/"); + } + g_object_unref(settings); +} + int main() { schema_id_literal(); schema_id_from_constant(); schema_id_autoptr(); + schema_id_with_backend(); + schema_id_with_backend_and_path(); + schema_id_with_path(); return 0; } diff --git a/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project/main.c b/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project/main.c index d83dc09e124e..afcb3686ec84 100644 --- a/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project/main.c +++ b/pkgs/test/make-hardcode-gsettings-patch/fixtures/example-project/main.c @@ -19,10 +19,31 @@ void schema_id_autoptr() { settings = g_settings_new("org.gnome.evolution.calendar"); } +void schema_id_with_backend() { + GSettings *settings; + settings = g_settings_new_with_backend("org.gnome.evolution-data-server.addressbook", g_settings_backend_get_default()); + g_object_unref(settings); +} + +void schema_id_with_backend_and_path() { + GSettings *settings; + settings = g_settings_new_with_backend_and_path("org.gnome.seahorse.nautilus.window", g_settings_backend_get_default(), "/org/gnome/seahorse/nautilus/windows/123/"); + g_object_unref(settings); +} + +void schema_id_with_path() { + GSettings *settings; + settings = g_settings_new_with_path("org.gnome.seahorse.nautilus.window", "/org/gnome/seahorse/nautilus/windows/123/"); + g_object_unref(settings); +} + int main() { schema_id_literal(); schema_id_from_constant(); schema_id_autoptr(); + schema_id_with_backend(); + schema_id_with_backend_and_path(); + schema_id_with_path(); return 0; } |