Patchwork gnu: Patch libxt's default search path.

login
register
mail settings
Submitter John Darrington
Date Dec. 2, 2016, 4:25 p.m.
Message ID <1480695934-679-1-git-send-email-jmd@gnu.org>
Download mbox | patch
Permalink /patch/18136/
State New
Headers show

Comments

John Darrington - Dec. 2, 2016, 4:25 p.m.
* gnu/packages/patches/libxt-guix-search-paths.patch: New file.
* gnu/packages/xorg.scm (libxt) [source]: Add patch.
---
 gnu/packages/patches/libxt-guix-search-paths.patch | 123 +++++++++++++++++++++
 gnu/packages/xorg.scm                              |   3 +-
 2 files changed, 125 insertions(+), 1 deletion(-)
 create mode 100644 gnu/packages/patches/libxt-guix-search-paths.patch
Ludovic Courtès - Dec. 4, 2016, 9:19 p.m.
John Darrington <jmd@gnu.org> skribis:

> * gnu/packages/patches/libxt-guix-search-paths.patch: New file.
> * gnu/packages/xorg.scm (libxt) [source]: Add patch.
> ---
>  gnu/packages/patches/libxt-guix-search-paths.patch | 123 +++++++++++++++++++++
>  gnu/packages/xorg.scm                              |   3 +-
>  2 files changed, 125 insertions(+), 1 deletion(-)
>  create mode 100644 gnu/packages/patches/libxt-guix-search-paths.patch
>
> diff --git a/gnu/packages/patches/libxt-guix-search-paths.patch b/gnu/packages/patches/libxt-guix-search-paths.patch
> new file mode 100644
> index 0000000..dfeea8a
> --- /dev/null
> +++ b/gnu/packages/patches/libxt-guix-search-paths.patch
> @@ -0,0 +1,123 @@

Please add a comment here explaining what it does and why we chose this
approach.

> + {
> +-#if defined(WIN32)
> +-    static char xfilesearchpath[] = "";
> +-
> +-    return xfilesearchpath;
> +-#else
> +-    return XFILESEARCHPATHDEFAULT;
> +-#endif
> ++  static const char *search_path_default_stem[6] = {

static const char *const *search_path_default_stem[]

> ++    "/lib/X11/%L/%T/%N%C%S",
> ++    "/lib/X11/%l/%T/%N%C%S",
> ++    "/lib/X11/%T/%N%C%S",
> ++    "/lib/X11/%L/%T/%N%S",
> ++    "/lib/X11/%l/%T/%N%S",
> ++    "/lib/X11/%T/%N%S"
> ++  };
> ++
> ++#define SIZEOF_STEMS  (strlen (search_path_default_stem[0])	\
> ++		       + strlen (search_path_default_stem[1])	\
> ++		       + strlen (search_path_default_stem[2])	\
> ++		       + strlen (search_path_default_stem[3])	\
> ++		       + strlen (search_path_default_stem[4])	\
> ++		       + strlen (search_path_default_stem[5]))
> ++
> ++
> ++  int i;
> ++  const char *current_profile = "/run/current-system/profile";
> ++  char *home = getenv ("HOME");
> ++  char *guix_profile = getenv ("GUIX_PROFILE");

GUIX_PROFILE is not meant to be systematically defined, but maybe that’s
good enough.

Could you build, say, xterm against this, check whether this fixes the
ctrl-click issue for instance, and also run it in Valgrind to make sure?

If that works, ok for core-updates or the next ‘staging’ since ‘staging’
is now frozen.

Thanks,
Ludo’.

Patch

diff --git a/gnu/packages/patches/libxt-guix-search-paths.patch b/gnu/packages/patches/libxt-guix-search-paths.patch
new file mode 100644
index 0000000..dfeea8a
--- /dev/null
+++ b/gnu/packages/patches/libxt-guix-search-paths.patch
@@ -0,0 +1,123 @@ 
+--- libXt-1.1.5/src/Intrinsic.c	2015-05-01 07:36:20.000000000 +0200
++++ Intrinsic.c	2016-12-02 13:30:22.642776165 +0100
+@@ -1303,21 +1303,98 @@
+     } else (void) strcpy(*rest, string);
+ }
+ 
+-/*
+- * default path used if environment variable XFILESEARCHPATH
+- * is not defined.  Also substitued for %D.
+- * The exact value should be documented in the implementation
+- * notes for any Xt implementation.
++
++
++/* 
++   Return the default search path for the function
++   XtResolvePathname to use if XFILESEARCHPATH is 
++   not defined.
++
++   It returns the combination the set of values which are the 6 "stems" below,
++   prepended with "/run/current-system/profile", and $GUIX_PROFILE and 
++   "$HOME/.guix-profile"
+  */
+-static const char *implementation_default_path(void)
++static const char *guix_default_path(void)
+ {
+-#if defined(WIN32)
+-    static char xfilesearchpath[] = "";
+-
+-    return xfilesearchpath;
+-#else
+-    return XFILESEARCHPATHDEFAULT;
+-#endif
++  static const char *search_path_default_stem[6] = {
++    "/lib/X11/%L/%T/%N%C%S",
++    "/lib/X11/%l/%T/%N%C%S",
++    "/lib/X11/%T/%N%C%S",
++    "/lib/X11/%L/%T/%N%S",
++    "/lib/X11/%l/%T/%N%S",
++    "/lib/X11/%T/%N%S"
++  };
++
++#define SIZEOF_STEMS  (strlen (search_path_default_stem[0])	\
++		       + strlen (search_path_default_stem[1])	\
++		       + strlen (search_path_default_stem[2])	\
++		       + strlen (search_path_default_stem[3])	\
++		       + strlen (search_path_default_stem[4])	\
++		       + strlen (search_path_default_stem[5]))
++
++
++  int i;
++  const char *current_profile = "/run/current-system/profile";
++  char *home = getenv ("HOME");
++  char *guix_profile = getenv ("GUIX_PROFILE");
++
++  size_t bytesAllocd = SIZEOF_STEMS + 1; 
++
++  /* This function is evaluated multiple times and the calling
++     code assumes that it is idempotent. So we must not allow
++     (say) a changed environment variable to cause it to return
++     something different. */
++  static char *path = NULL;
++  if (path)
++    return path;
++
++  bytesAllocd += 6 * (1 + strlen (current_profile));
++
++  if (guix_profile != NULL)
++    {
++      bytesAllocd += SIZEOF_STEMS;
++      bytesAllocd += 6 * (1 + strlen (guix_profile));
++    }
++
++  if (home != NULL)
++    {
++      bytesAllocd += SIZEOF_STEMS;
++      bytesAllocd += 6 * (1 + strlen(home) + strlen ("/.guix-profile"));
++    }
++
++  path = XtMalloc(bytesAllocd);
++  if (path == NULL) _XtAllocError(NULL);
++
++  memset (path, 0, bytesAllocd);
++  
++  for (i = 0 ; i < 6 ; ++i)
++    {
++      strcat (path, current_profile);
++      strcat (path, search_path_default_stem[i]);
++      strcat (path, ":");
++    }
++
++  if (guix_profile != NULL)
++    for (i = 0 ; i < 6 ; ++i)
++      {
++	strcat (path, guix_profile);
++	strcat (path, search_path_default_stem[i]);
++	strcat (path, ":");
++      }
++
++  if (home != NULL)
++    for (i = 0 ; i < 6 ; ++i)
++      {
++	strcat (path, home);
++	strcat (path, "/.guix-profile");
++	strcat (path, search_path_default_stem[i]);
++	strcat (path, ":");
++      }
++
++  /* Remove final : */
++  path[strlen(path) - 1] = '\0';
++  
++  return path;
+ }
+ 
+ 
+@@ -1345,7 +1422,7 @@
+ {
+     XtPerDisplay pd;
+     static const char *defaultPath = NULL;
+-    const char *impl_default = implementation_default_path();
++    const char *impl_default = guix_default_path();
+     int idef_len = strlen(impl_default);
+     char *massagedPath;
+     int bytesAllocd, bytesLeft;
diff --git a/gnu/packages/xorg.scm b/gnu/packages/xorg.scm
index 18271b5..71f3b2a 100644
--- a/gnu/packages/xorg.scm
+++ b/gnu/packages/xorg.scm
@@ -5302,7 +5302,8 @@  draggable titlebars and borders.")
                ".tar.bz2"))
         (sha256
           (base32
-            "06lz6i7rbrp19kgikpaz4c97fw7n31k2h2aiikczs482g2zbdvj6"))))
+           "06lz6i7rbrp19kgikpaz4c97fw7n31k2h2aiikczs482g2zbdvj6"))
+        (patches (search-patches "libxt-guix-search-paths.patch"))))
     (build-system gnu-build-system)
     (outputs '("out"
                "doc"))                            ;2 MiB of man pages + XML