about summary refs log tree commit diff
path: root/pkgs/build-support/make-hardcode-gsettings-patch
diff options
context:
space:
mode:
authorJan Tojnar <jtojnar@gmail.com>2022-12-15 21:20:40 +0100
committerJan Tojnar <jtojnar@gmail.com>2022-12-19 17:38:57 +0100
commit4346dee4243e2f3b900b710cf800a1ee7309d2b1 (patch)
tree09f61b513244f919f37b5433aa973c7445262af9 /pkgs/build-support/make-hardcode-gsettings-patch
parent98e84e79a97155cf748cbca8d1abbd56038c11f9 (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
Diffstat (limited to 'pkgs/build-support/make-hardcode-gsettings-patch')
-rw-r--r--pkgs/build-support/make-hardcode-gsettings-patch/hardcode-gsettings.cocci94
1 files changed, 83 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 bedacf846bc49..a265f5fac384e 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);
++}