summaryrefslogtreecommitdiffstats
path: root/app/gimp-version.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/gimp-version.c')
-rw-r--r--app/gimp-version.c311
1 files changed, 311 insertions, 0 deletions
diff --git a/app/gimp-version.c b/app/gimp-version.c
new file mode 100644
index 0000000..e56149a
--- /dev/null
+++ b/app/gimp-version.c
@@ -0,0 +1,311 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <cairo.h>
+#include <fontconfig/fontconfig.h>
+#include <pango/pango.h>
+#include <pango/pangoft2.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gegl.h>
+
+#ifndef GIMP_CONSOLE_COMPILATION
+#include <gtk/gtk.h>
+#endif
+
+#include "libgimpbase/gimpbase.h"
+
+#include "about.h"
+#include "git-version.h"
+
+#include "gimp-intl.h"
+#include "gimp-version.h"
+
+
+static gchar *
+gimp_library_version (const gchar *package,
+ gint build_time_major,
+ gint build_time_minor,
+ gint build_time_micro,
+ gint run_time_major,
+ gint run_time_minor,
+ gint run_time_micro,
+ gboolean localized)
+{
+ gchar *lib_version;
+ gchar *build_time_version;
+ gchar *run_time_version;
+
+ build_time_version = g_strdup_printf ("%d.%d.%d",
+ build_time_major,
+ build_time_minor,
+ build_time_micro);
+ run_time_version = g_strdup_printf ("%d.%d.%d",
+ run_time_major,
+ run_time_minor,
+ run_time_micro);
+
+ /* show versions of libraries used by GIMP */
+ lib_version = g_strdup_printf (localized ?
+ _("using %s version %s (compiled against version %s)") :
+ "using %s version %s (compiled against version %s)",
+ package, run_time_version, build_time_version);
+ g_free (run_time_version);
+ g_free (build_time_version);
+
+ return lib_version;
+}
+
+static gchar *
+gimp_library_versions (gboolean localized)
+{
+ gchar *lib_versions;
+ gchar *lib_version;
+ gchar *temp;
+ gint babl_major_version;
+ gint babl_minor_version;
+ gint babl_micro_version;
+ gint gegl_major_version;
+ gint gegl_minor_version;
+ gint gegl_micro_version;
+
+ babl_get_version (&babl_major_version,
+ &babl_minor_version,
+ &babl_micro_version);
+
+ lib_versions = gimp_library_version ("babl",
+ BABL_MAJOR_VERSION,
+ BABL_MINOR_VERSION,
+ BABL_MICRO_VERSION,
+ babl_major_version,
+ babl_minor_version,
+ babl_micro_version,
+ localized);
+
+ gegl_get_version (&gegl_major_version,
+ &gegl_minor_version,
+ &gegl_micro_version);
+
+ lib_version = gimp_library_version ("GEGL",
+ GEGL_MAJOR_VERSION,
+ GEGL_MINOR_VERSION,
+ GEGL_MICRO_VERSION,
+ gegl_major_version,
+ gegl_minor_version,
+ gegl_micro_version,
+ localized);
+
+ temp = g_strdup_printf ("%s\n%s", lib_versions, lib_version);
+ g_free (lib_versions);
+ g_free (lib_version);
+ lib_versions = temp;
+
+ lib_version = gimp_library_version ("GLib",
+ GLIB_MAJOR_VERSION,
+ GLIB_MINOR_VERSION,
+ GLIB_MICRO_VERSION,
+ glib_major_version,
+ glib_minor_version,
+ glib_micro_version,
+ localized);
+ temp = g_strdup_printf ("%s\n%s", lib_versions, lib_version);
+ g_free (lib_versions);
+ g_free (lib_version);
+ lib_versions = temp;
+
+ lib_version = gimp_library_version ("GdkPixbuf",
+ GDK_PIXBUF_MAJOR,
+ GDK_PIXBUF_MINOR,
+ GDK_PIXBUF_MICRO,
+ gdk_pixbuf_major_version,
+ gdk_pixbuf_minor_version,
+ gdk_pixbuf_micro_version,
+ localized);
+ temp = g_strdup_printf ("%s\n%s", lib_versions, lib_version);
+ g_free (lib_versions);
+ g_free (lib_version);
+ lib_versions = temp;
+
+#ifndef GIMP_CONSOLE_COMPILATION
+ lib_version = gimp_library_version ("GTK+",
+ GTK_MAJOR_VERSION,
+ GTK_MINOR_VERSION,
+ GTK_MICRO_VERSION,
+ gtk_major_version,
+ gtk_minor_version,
+ gtk_micro_version,
+ localized);
+ temp = g_strdup_printf ("%s\n%s", lib_versions, lib_version);
+ g_free (lib_versions);
+ g_free (lib_version);
+ lib_versions = temp;
+#endif
+
+ lib_version = gimp_library_version ("Pango",
+ PANGO_VERSION_MAJOR,
+ PANGO_VERSION_MINOR,
+ PANGO_VERSION_MICRO,
+ pango_version () / 100 / 100,
+ pango_version () / 100 % 100,
+ pango_version () % 100,
+ localized);
+ temp = g_strdup_printf ("%s\n%s", lib_versions, lib_version);
+ g_free (lib_versions);
+ g_free (lib_version);
+ lib_versions = temp;
+
+ lib_version = gimp_library_version ("Fontconfig",
+ FC_MAJOR, FC_MINOR, FC_REVISION,
+ FcGetVersion () / 100 / 100,
+ FcGetVersion () / 100 % 100,
+ FcGetVersion () % 100,
+ localized);
+ temp = g_strdup_printf ("%s\n%s", lib_versions, lib_version);
+ g_free (lib_versions);
+ g_free (lib_version);
+ lib_versions = temp;
+
+ lib_version = g_strdup_printf (localized ?
+ _("using %s version %s (compiled against version %s)") :
+ "using %s version %s (compiled against version %s)",
+ "Cairo", cairo_version_string (), CAIRO_VERSION_STRING);
+ temp = g_strdup_printf ("%s\n%s\n", lib_versions, lib_version);
+ g_free (lib_versions);
+ g_free (lib_version);
+ lib_versions = temp;
+
+ return lib_versions;
+}
+
+void
+gimp_version_show (gboolean be_verbose)
+{
+ gchar *version = gimp_version (be_verbose, TRUE);
+
+ g_print ("%s", version);
+
+ g_free (version);
+}
+
+gchar *
+gimp_version (gboolean be_verbose,
+ gboolean localized)
+{
+ gchar *version;
+ gchar *temp;
+
+ version = g_strdup_printf (localized ? _("%s version %s") : "%s version %s",
+ GIMP_NAME, GIMP_VERSION);;
+ temp = g_strconcat (version, "\n", NULL);
+ g_free (version);
+ version = temp;
+
+ if (be_verbose)
+ {
+ gchar *verbose_info;
+ gchar *lib_versions;
+ gchar *flatpak_info = NULL;
+
+ lib_versions = gimp_library_versions (localized);
+ verbose_info = g_strdup_printf ("git-describe: %s\n"
+ "Build: %s rev %d for %s\n"
+ "# C compiler #\n%s\n"
+ "# Libraries #\n%s",
+ GIMP_GIT_VERSION,
+ GIMP_BUILD_ID,
+ gimp_version_get_revision (),
+ GIMP_BUILD_PLATFORM_FAMILY,
+ CC_VERSION,
+ lib_versions);
+ g_free (lib_versions);
+
+ /* This file should be available at root path in a flatpak
+ * environment. Just add its contents to the verbose output if it
+ * exists. Silently ignore otherwise.
+ */
+ if (g_file_get_contents ("/.flatpak-info", &flatpak_info, NULL, NULL))
+ {
+ temp = g_strdup_printf ("\n# Flatpak info #\n%s",
+ flatpak_info);
+ g_free (flatpak_info);
+ flatpak_info = temp;
+ }
+ temp = g_strconcat (version, verbose_info, flatpak_info, NULL);
+ g_free (version);
+ g_free (verbose_info);
+ g_free (flatpak_info);
+
+ version = temp;
+ }
+
+ return version;
+}
+
+gint
+gimp_version_get_revision (void)
+{
+ GKeyFile *key_file;
+ gchar *gimp_release;
+ gint revision = 0;
+
+ key_file = g_key_file_new ();
+
+ /* The gimp-release file is inspired by /etc/os-release and similar
+ * distribution files. Right now its main use is to number the package
+ * revision. This information is not a build variable because a new
+ * package version does not necessarily imply a rebuild (maybe just
+ * installed data or dependencies change).
+ */
+ gimp_release = g_build_filename (gimp_data_directory (), "gimp-release", NULL);
+ /* Absence of the file is not an error. Actually most third-party
+ * builds probably won't install such file.
+ */
+ if (g_key_file_load_from_file (key_file, gimp_release, G_KEY_FILE_NONE, NULL))
+ {
+ if (g_key_file_has_key (key_file, "package", "revision", NULL))
+ revision = g_key_file_get_integer (key_file, "package", "revision", NULL);
+ }
+ g_key_file_free (key_file);
+ g_free (gimp_release);
+
+ return revision;
+}
+
+gboolean
+gimp_version_check_update (void)
+{
+ GKeyFile *key_file;
+ gchar *gimp_release;
+ gboolean check_update = FALSE;
+
+ key_file = g_key_file_new ();
+
+ gimp_release = g_build_filename (gimp_data_directory (), "gimp-release", NULL);
+ if (g_key_file_load_from_file (key_file, gimp_release, G_KEY_FILE_NONE, NULL))
+ {
+ check_update = TRUE;
+
+ if (g_key_file_has_key (key_file, "package", "check-update", NULL))
+ check_update = g_key_file_get_boolean (key_file, "package", "check-update", NULL);
+ }
+ g_key_file_free (key_file);
+ g_free (gimp_release);
+
+ return check_update;
+}