gnome3.gpaste: hard-code paths

GPaste GNOME Shell extension uses GPaste library generated via introspection. Previously, we added the gpaste package to services.xserver.desktopManager.gnome3.sessionPath option, which
added its typelib directory to GI_TYPELIB_PATH environment variable globally, in order for GNOME Shell to be able to find it. This is not very Nix-y, though, so we have decided to patch the code to
append the path to the GI repository search path.

Additionally, the code relies on GPaste’s GSettings schemas, so we had to hard-code the paths to them as well. We ignored the GNOME Shell’s schemas, since they will already be available for the
extension inside GNOME Shell program.
This commit is contained in:
Jan Tojnar 2018-07-23 04:11:03 +02:00
parent 0e1c01451f
commit f63d94eba3
No known key found for this signature in database
GPG key ID: 7FAB2A15F7A607A4
3 changed files with 71 additions and 1 deletions

View file

@ -21,7 +21,6 @@ with lib;
config = mkIf config.services.gnome3.gpaste.enable {
environment.systemPackages = [ pkgs.gnome3.gpaste ];
services.dbus.packages = [ pkgs.gnome3.gpaste ];
services.xserver.desktopManager.gnome3.sessionPath = [ pkgs.gnome3.gpaste ];
systemd.packages = [ pkgs.gnome3.gpaste ];
};
}

View file

@ -10,6 +10,22 @@ stdenv.mkDerivation rec {
sha256 = "1zfx73qpw976hyzp5k569lywsq2b6dbnnzf2cvhjvn3mvkw8pin2";
};
patches = [
./fix-paths.patch
];
# TODO: switch to substituteAll with placeholder
# https://github.com/NixOS/nix/issues/1846
# https://github.com/NixOS/nixpkgs/pull/37693
postPatch = ''
substituteInPlace src/gnome-shell/extension.js \
--subst-var-by typelibPath "$out/lib/girepository-1.0"
substituteInPlace src/gnome-shell/prefs.js \
--subst-var-by typelibPath "$out/lib/girepository-1.0"
substituteInPlace src/libgpaste/settings/gpaste-settings.c \
--subst-var-by gschemasCompiled "$out/share/gsettings-schemas/${name}/glib-2.0/schemas"
'';
nativeBuildInputs = [ autoreconfHook pkgconfig vala wrapGAppsHook ];
buildInputs = [ glib gjs mutter gnome3.adwaita-icon-theme
gtk3 gnome3.gnome-control-center dbus

View file

@ -0,0 +1,55 @@
--- a/src/gnome-shell/extension.js
+++ b/src/gnome-shell/extension.js
@@ -7,6 +7,8 @@
const Config = imports.misc.config;
+imports.gi.GIRepository.Repository.prepend_search_path('@typelibPath@');
+
imports.gi.versions.Clutter = Config.LIBMUTTER_API_VERSION;
imports.gi.versions.GLib = '2.0';
imports.gi.versions.GPaste = '1.0';
--- a/src/gnome-shell/prefs.js
+++ b/src/gnome-shell/prefs.js
@@ -7,6 +7,8 @@
const Gettext = imports.gettext;
+imports.gi.GIRepository.Repository.prepend_search_path('@typelibPath@');
+
const GPaste = imports.gi.GPaste;
const ExtensionUtils = imports.misc.extensionUtils;
--- a/src/libgpaste/settings/gpaste-settings.c
+++ b/src/libgpaste/settings/gpaste-settings.c
@@ -22,6 +22,8 @@
typedef struct
{
+ GSettingsSchemaSource *schema_source;
+ GSettingsSchema *schema;
GSettings *settings;
GSettings *shell_settings;
@@ -919,6 +921,8 @@
{
g_signal_handler_disconnect (settings, priv->c_signals[C_CHANGED]);
g_clear_object (&priv->settings);
+ g_settings_schema_unref (priv->schema);
+ g_settings_schema_source_unref (priv->schema_source);
}
if (shell_settings)
@@ -1000,7 +1004,11 @@
g_paste_settings_init (GPasteSettings *self)
{
GPasteSettingsPrivate *priv = g_paste_settings_get_instance_private (self);
- GSettings *settings = priv->settings = g_settings_new (G_PASTE_SETTINGS_NAME);
+
+ // library used by introspection requires schemas but we cannot set XDG_DATA_DIRS for the library
+ GSettingsSchemaSource *schema_source = priv->schema_source = g_settings_schema_source_new_from_directory ("@gschemasCompiled@", NULL, FALSE, NULL);
+ priv->schema = g_settings_schema_source_lookup (schema_source, G_PASTE_SETTINGS_NAME, FALSE);
+ GSettings *settings = priv->settings = g_settings_new_full (priv->schema, NULL, NULL);
priv->history_name = NULL;
priv->launch_ui = NULL;