sanity.c 7.11 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* The GIMP -- an 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 2 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, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#include "config.h"

21
#include <glib.h>
22
23
24
#include <fontconfig/fontconfig.h>
#include <pango/pangoft2.h>

25
#include "libgimpbase/gimpbase.h"
26

27
28
#include "sanity.h"

29
30
#include "gimp-intl.h"

31

32
static gchar * sanity_check_gimp              (void);
33
34
35
36
37
static gchar * sanity_check_glib              (void);
static gchar * sanity_check_fontconfig        (void);
static gchar * sanity_check_freetype          (void);
static gchar * sanity_check_filename_encoding (void);

38

39
/*  public functions  */
40

41
const gchar *
42
sanity_check (void)
43
{
44
45
46
47
  gchar *abort_message = sanity_check_gimp ();

  if (! abort_message)
    abort_message = sanity_check_glib ();
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

  if (! abort_message)
    abort_message = sanity_check_fontconfig ();

  if (! abort_message)
    abort_message = sanity_check_freetype ();

  if (! abort_message)
    abort_message = sanity_check_filename_encoding ();

  return abort_message;
}


/*  private functions  */

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
static gchar *
sanity_check_gimp (void)
{
  if (GIMP_MAJOR_VERSION != gimp_major_version ||
      GIMP_MINOR_VERSION != gimp_minor_version ||
      GIMP_MICRO_VERSION != gimp_micro_version)
    {
      return g_strdup_printf
        ("Libgimp version mismatch!\n\n"
         "The GIMP binary cannot run with a libgimp version\n"
         "other than its own. This is GIMP %d.%d.%d, but the\n"
         "libgimp version is %d.%d.%d.\n\n"
         "Maybe you have GIMP versions in both /usr and /usr/local ?",
         GIMP_MAJOR_VERSION, GIMP_MINOR_VERSION, GIMP_MICRO_VERSION,
         gimp_major_version, gimp_minor_version, gimp_micro_version);
    }

  return NULL;
}

84
85
86
87
88
89
static gchar *
sanity_check_glib (void)
{
  const gchar *mismatch;

#define GLIB_REQUIRED_MAJOR 2
90
#define GLIB_REQUIRED_MINOR 10
91
#define GLIB_REQUIRED_MICRO 2
92

Michael Natterer's avatar
Michael Natterer committed
93
94
95
  mismatch = glib_check_version (GLIB_REQUIRED_MAJOR,
                                 GLIB_REQUIRED_MINOR,
                                 GLIB_REQUIRED_MICRO);
96
97
98
99
100

  if (mismatch)
    {
      return g_strdup_printf
        ("%s\n\n"
Sven Neumann's avatar
Sven Neumann committed
101
         "GIMP requires GLib version %d.%d.%d or later.\n"
102
         "Installed GLib version is %d.%d.%d.\n\n"
103
         "Somehow you or your software packager managed\n"
Sven Neumann's avatar
Sven Neumann committed
104
         "to install GIMP with an older GLib version.\n\n"
105
         "Please upgrade to GLib version %d.%d.%d or later.",
106
107
108
109
110
         mismatch,
         GLIB_REQUIRED_MAJOR, GLIB_REQUIRED_MINOR, GLIB_REQUIRED_MICRO,
         glib_major_version, glib_minor_version, glib_micro_version,
         GLIB_REQUIRED_MAJOR, GLIB_REQUIRED_MINOR, GLIB_REQUIRED_MICRO);
    }
111

112
113
114
115
116
117
118
119
120
121
#undef GLIB_REQUIRED_MAJOR
#undef GLIB_REQUIRED_MINOR
#undef GLIB_REQUIRED_MICRO

  return NULL;
}

static gchar *
sanity_check_fontconfig (void)
{
122
123
124
125
  gint   fc_version       = FcGetVersion ();
  gint   fc_major_version = fc_version / 100 / 100;
  gint   fc_minor_version = fc_version / 100 % 100;
  gint   fc_micro_version = fc_version % 100;
126
127
128
129
130

#define FC_REQUIRED_MAJOR 2
#define FC_REQUIRED_MINOR 2
#define FC_REQUIRED_MICRO 0

131
132
133
134
  if (fc_version < ((FC_REQUIRED_MAJOR * 10000) +
                    (FC_REQUIRED_MINOR *   100) +
                    (FC_REQUIRED_MICRO *     1)))
    {
135
      return g_strdup_printf
136
        ("The Fontconfig version being used is too old!\n\n"
Sven Neumann's avatar
Sven Neumann committed
137
138
         "GIMP requires Fontconfig version %d.%d.%d or later.\n"
         "The Fontconfig version loaded by GIMP is %d.%d.%d.\n\n"
139
140
141
142
143
144
         "This may be caused by another instance of libfontconfig.so.1\n"
         "being installed in the system, probably in /usr/X11R6/lib.\n"
         "Please correct the situation or report it to someone who can.",
         FC_REQUIRED_MAJOR, FC_REQUIRED_MINOR, FC_REQUIRED_MICRO,
         fc_major_version, fc_minor_version, fc_micro_version);
    }
145
146
147
148

#undef FC_REQUIRED_MAJOR
#undef FC_REQUIRED_MINOR
#undef FC_REQUIRED_MICRO
149

150
151
  return NULL;
}
152

153
154
155
156
157
158
159
160
static gchar *
sanity_check_freetype (void)
{
  FT_Library ft_library;
  FT_Int     ft_major_version;
  FT_Int     ft_minor_version;
  FT_Int     ft_micro_version;
  FT_Int     ft_version;
161
162
163
164
165

#define FT_REQUIRED_MAJOR 2
#define FT_REQUIRED_MINOR 1
#define FT_REQUIRED_MICRO 7

166
167
168
169
170
171
172
  if (FT_Init_FreeType (&ft_library) != 0)
    g_error ("FT_Init_FreeType() failed");

  FT_Library_Version (ft_library,
                      &ft_major_version,
                      &ft_minor_version,
                      &ft_micro_version);
173

174
175
176
177
178
179
180
181
182
183
184
185
186
  if (FT_Done_FreeType (ft_library) != 0)
    g_error ("FT_Done_FreeType() failed");

  ft_version = (ft_major_version * 10000 +
                ft_minor_version *   100 +
                ft_micro_version *     1);

  if (ft_version < ((FT_REQUIRED_MAJOR * 10000) +
                    (FT_REQUIRED_MINOR *   100) +
                    (FT_REQUIRED_MICRO *     1)))
    {
      return g_strdup_printf
        ("FreeType version too old!\n\n"
Sven Neumann's avatar
Sven Neumann committed
187
         "GIMP requires FreeType version %d.%d.%d or later.\n"
188
189
         "Installed FreeType version is %d.%d.%d.\n\n"
         "Somehow you or your software packager managed\n"
Sven Neumann's avatar
Sven Neumann committed
190
         "to install GIMP with an older FreeType version.\n\n"
191
192
193
194
195
         "Please upgrade to FreeType version %d.%d.%d or later.",
         FT_REQUIRED_MAJOR, FT_REQUIRED_MINOR, FT_REQUIRED_MICRO,
         ft_major_version, ft_minor_version, ft_micro_version,
         FT_REQUIRED_MAJOR, FT_REQUIRED_MINOR, FT_REQUIRED_MICRO);
    }
196
197
198
199
200

#undef FT_REQUIRED_MAJOR
#undef FT_REQUIRED_MINOR
#undef FT_REQUIRED_MICRO

201
  return NULL;
202
}
203
204
205
206
207
208
209

static gchar *
sanity_check_filename_encoding (void)
{
  gchar  *result;
  GError *error = NULL;

210
  result = g_filename_to_utf8 ("", -1, NULL, NULL, &error);
211

212
  if (! result)
213
    {
214
215
216
217
218
219
220
221
222
      gchar *msg =
        g_strdup_printf
        (_("The configured filename encoding cannot be converted to UTF-8: "
           "%s\n\n"
           "Please check the value of the environment variable "
           "G_FILENAME_ENCODING."),
         error->message);

      g_error_free (error);
223

224
      return msg;
225
    }
226
227
228
229
230
231

  g_free (result);

  result = g_filename_to_utf8 (gimp_directory (), -1, NULL, NULL, &error);

  if (! result)
232
233
234
    {
      gchar *msg =
        g_strdup_printf
235
236
237
        (_("The name of the directory holding the GIMP user configuration "
           "cannot be converted to UTF-8: "
           "%s\n\n"
238
239
           "Your filesystem probably stores files in an encoding "
           "other than UTF-8 and you didn't tell GLib about this. "
240
           "Please set the environment variable G_FILENAME_ENCODING."),
241
242
243
244
245
246
         error->message);

      g_error_free (error);

      return msg;
    }
247
248
249
250

  g_free (result);

  return NULL;
251
}