diff options
author | Ignacio Casal Quinteiro <icq@gnome.org> | 2014-07-29 18:59:21 +0200 |
---|---|---|
committer | Ignacio Casal Quinteiro <icq@gnome.org> | 2014-07-31 13:04:56 +0200 |
commit | 786590fe93682c9b28136ccf65d870b23dd807f7 (patch) | |
tree | a88d0e33fe21a879b1410a15d0cce2e53e91491e | |
parent | 905a8e655c4f50f655cbd90455b26a37b977c563 (diff) |
win32: improve the package installation dir lookup
As an example, the core of gedit is in a private library
placed in %INSTALLDIR%/lib/gedit/libgedit.dll
Before this patch we would get %INSTALLDIR%/lib/gedit as the
installation package dir, while what we actually want is to get
%INSTALLDIR%
https://bugzilla.gnome.org/show_bug.cgi?id=733934
-rw-r--r-- | glib/gwin32.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/glib/gwin32.c b/glib/gwin32.c index 3c60df4c9..ffc5fe2e6 100644 --- a/glib/gwin32.c +++ b/glib/gwin32.c @@ -238,22 +238,43 @@ g_win32_error_message (gint error) gchar * g_win32_get_package_installation_directory_of_module (gpointer hmodule) { + gchar *filename; gchar *retval; gchar *p; wchar_t wc_fn[MAX_PATH]; + /* NOTE: it relies that GetModuleFileNameW returns only canonical paths */ if (!GetModuleFileNameW (hmodule, wc_fn, MAX_PATH)) return NULL; - retval = g_utf16_to_utf8 (wc_fn, -1, NULL, NULL, NULL); + filename = g_utf16_to_utf8 (wc_fn, -1, NULL, NULL, NULL); - if ((p = strrchr (retval, G_DIR_SEPARATOR)) != NULL) + if ((p = strrchr (filename, G_DIR_SEPARATOR)) != NULL) *p = '\0'; - p = strrchr (retval, G_DIR_SEPARATOR); - if (p && (g_ascii_strcasecmp (p + 1, "bin") == 0 || - g_ascii_strcasecmp (p + 1, "lib") == 0)) - *p = '\0'; + retval = g_strdup (filename); + + do + { + p = strrchr (retval, G_DIR_SEPARATOR); + if (p == NULL) + break; + + *p = '\0'; + + if (g_ascii_strcasecmp (p + 1, "bin") == 0 || + g_ascii_strcasecmp (p + 1, "lib") == 0) + break; + } + while (p != NULL); + + if (p == NULL) + { + g_free (retval); + retval = filename; + } + else + g_free (filename); #ifdef G_WITH_CYGWIN /* In Cygwin we need to have POSIX paths */ |