diff options
Diffstat (limited to '')
-rw-r--r-- | app/config/gimpconfig-dump.c | 644 |
1 files changed, 644 insertions, 0 deletions
diff --git a/app/config/gimpconfig-dump.c b/app/config/gimpconfig-dump.c new file mode 100644 index 0000000..1a2b376 --- /dev/null +++ b/app/config/gimpconfig-dump.c @@ -0,0 +1,644 @@ +/* GIMP - The GNU Image Manipulation Program + * Copyright (C) 1995 Spencer Kimball and Peter Mattis + * + * GimpConfig object property dumper. + * Copyright (C) 2001-2006 Sven Neumann <sven@gimp.org> + * + * 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 <stdlib.h> +#include <string.h> + +#include <cairo.h> +#include <gegl.h> +#include <gdk-pixbuf/gdk-pixbuf.h> + +#ifdef G_OS_WIN32 +#include <gio/gwin32outputstream.h> +#else +#include <gio/gunixoutputstream.h> +#endif + +#include "libgimpbase/gimpbase.h" +#include "libgimpcolor/gimpcolor.h" +#include "libgimpconfig/gimpconfig.h" + +#include "config-types.h" + +#include "gimpconfig-dump.h" +#include "gimprc.h" + + + +static void dump_gimprc_system (GimpConfig *rc, + GimpConfigWriter *writer, + GOutputStream *output); +static void dump_gimprc_manpage (GimpConfig *rc, + GimpConfigWriter *writer, + GOutputStream *output); +static gchar * dump_describe_param (GParamSpec *param_spec); +static void dump_with_linebreaks (GOutputStream *output, + const gchar *text); + + +gboolean +gimp_config_dump (GObject *gimp, + GimpConfigDumpFormat format) +{ + GOutputStream *output; + GimpConfigWriter *writer; + GimpConfig *rc; + + g_return_val_if_fail (G_IS_OBJECT (gimp), FALSE); + + rc = g_object_new (GIMP_TYPE_RC, + "gimp", gimp, + NULL); + +#ifdef G_OS_WIN32 + output = g_win32_output_stream_new ((gpointer) 1, FALSE); +#else + output = g_unix_output_stream_new (1, FALSE); +#endif + + writer = gimp_config_writer_new_stream (output, NULL, NULL); + + switch (format) + { + case GIMP_CONFIG_DUMP_NONE: + break; + + case GIMP_CONFIG_DUMP_GIMPRC: + gimp_config_writer_comment (writer, + "Dump of the GIMP default configuration"); + gimp_config_writer_linefeed (writer); + gimp_config_serialize_properties (rc, writer); + gimp_config_writer_linefeed (writer); + break; + + case GIMP_CONFIG_DUMP_GIMPRC_SYSTEM: + dump_gimprc_system (rc, writer, output); + break; + + case GIMP_CONFIG_DUMP_GIMPRC_MANPAGE: + dump_gimprc_manpage (rc, writer, output); + break; + } + + gimp_config_writer_finish (writer, NULL, NULL); + g_object_unref (output); + g_object_unref (rc); + + return TRUE; +} + + +static const gchar system_gimprc_header[] = +"This is the system-wide gimprc file. Any change made in this file " +"will affect all users of this system, provided that they are not " +"overriding the default values in their personal gimprc file.\n" +"\n" +"Lines that start with a '#' are comments. Blank lines are ignored.\n" +"\n" +"By default everything in this file is commented out. The file then " +"documents the default values and shows what changes are possible.\n" +"\n" +"The variable ${gimp_dir} is set to the value of the environment " +"variable GIMP2_DIRECTORY or, if that is not set, the compiled-in " +"default value is used. If GIMP2_DIRECTORY is not an absolute path, " +"it is interpreted relative to your home directory."; + +static void +dump_gimprc_system (GimpConfig *rc, + GimpConfigWriter *writer, + GOutputStream *output) +{ + GObjectClass *klass; + GParamSpec **property_specs; + guint n_property_specs; + guint i; + + gimp_config_writer_comment (writer, system_gimprc_header); + gimp_config_writer_linefeed (writer); + + klass = G_OBJECT_GET_CLASS (rc); + property_specs = g_object_class_list_properties (klass, &n_property_specs); + + for (i = 0; i < n_property_specs; i++) + { + GParamSpec *prop_spec = property_specs[i]; + gchar *comment; + + if (! (prop_spec->flags & GIMP_CONFIG_PARAM_SERIALIZE)) + continue; + + if (prop_spec->flags & GIMP_CONFIG_PARAM_IGNORE) + continue; + + comment = dump_describe_param (prop_spec); + if (comment) + { + gimp_config_writer_comment (writer, comment); + g_free (comment); + } + + gimp_config_writer_comment_mode (writer, TRUE); + gimp_config_writer_linefeed (writer); + + if (! strcmp (prop_spec->name, "num-processors")) + { + gimp_config_writer_open (writer, "num-processors"); + gimp_config_writer_printf (writer, "1"); + gimp_config_writer_close (writer); + } + else if (! strcmp (prop_spec->name, "tile-cache-size")) + { + gimp_config_writer_open (writer, "tile-cache-size"); + gimp_config_writer_printf (writer, "2g"); + gimp_config_writer_close (writer); + } + else if (! strcmp (prop_spec->name, "undo-size")) + { + gimp_config_writer_open (writer, "undo-size"); + gimp_config_writer_printf (writer, "1g"); + gimp_config_writer_close (writer); + } + else if (! strcmp (prop_spec->name, "mypaint-brush-path")) + { + gchar *path = g_strdup_printf ("@mypaint_brushes_dir@%s" + "~/.mypaint/brushes", + G_SEARCHPATH_SEPARATOR_S); + + gimp_config_writer_open (writer, "mypaint-brush-path"); + gimp_config_writer_string (writer, path); + gimp_config_writer_close (writer); + + g_free (path); + } + else + { + gimp_config_serialize_property (rc, prop_spec, writer); + } + + gimp_config_writer_comment_mode (writer, FALSE); + gimp_config_writer_linefeed (writer); + } + + g_free (property_specs); +} + + +static const gchar man_page_header[] = +".\\\" This man-page is auto-generated by gimp --dump-gimprc-manpage.\n" +"\n" +".TH GIMPRC 5 \"Version @GIMP_VERSION@\" \"GIMP Manual Pages\"\n" +".SH NAME\n" +"gimprc \\- gimp configuration file\n" +".SH DESCRIPTION\n" +"The\n" +".B gimprc\n" +"file is a configuration file read by GIMP when it starts up. There\n" +"are two of these: one system-wide one stored in\n" +"@gimpsysconfdir@/gimprc and a per-user @manpage_gimpdir@/gimprc\n" +"which may override system settings.\n" +"\n" +"Comments are introduced by a hash sign (#), and continue until the end\n" +"of the line. Blank lines are ignored.\n" +"\n" +"The\n" +".B gimprc\n" +"file associates values with properties. These properties may be set\n" +"by lisp-like assignments of the form:\n" +".IP\n" +"\\f3(\\f2property\\-name\\ value\\f3)\\f1\n" +".TP\n" +"where:\n" +".TP 10\n" +".I property\\-name\n" +"is one of the property names described below.\n" +".TP\n" +".I value\n" +"is the value the property is to be set to.\n" +".PP\n" +"\n" +"Either spaces or tabs may be used to separate the name from the value.\n" +".PP\n" +".SH PROPERTIES\n" +"Valid properties and their default values are:\n" +"\n"; + +static const gchar *man_page_path = +".PP\n" +".SH PATH EXPANSION\n" +"Strings of type PATH are expanded in a manner similar to\n" +".BR bash (1).\n" +"Specifically: tilde (~) is expanded to the user's home directory. Note that\n" +"the bash feature of being able to refer to other user's home directories\n" +"by writing ~userid/ is not valid in this file.\n" +"\n" +"${variable} is expanded to the current value of an environment variable.\n" +"There are a few variables that are pre-defined:\n" +".TP\n" +".I gimp_dir\n" +"The personal gimp directory which is set to the value of the environment\n" +"variable GIMP2_DIRECTORY or to @manpage_gimpdir@.\n" +".TP\n" +".I gimp_data_dir\n" +"Base for paths to shareable data, which is set to the value of the\n" +"environment variable GIMP2_DATADIR or to the compiled-in default value\n" +"@gimpdatadir@.\n" +".TP\n" +".I gimp_plug_in_dir\n" +"Base to paths for architecture-specific plug-ins and modules, which is set\n" +"to the value of the environment variable GIMP2_PLUGINDIR or to the\n" +"compiled-in default value @gimpplugindir@.\n" +".TP\n" +".I gimp_sysconf_dir\n" +"Path to configuration files, which is set to the value of the environment\n" +"variable GIMP2_SYSCONFDIR or to the compiled-in default value \n" +"@gimpsysconfdir@.\n" +".TP\n" +".I gimp_cache_dir\n" +"Path to cached files, which is set to the value of the environment\n" +"variable GIMP2_CACHEDIR or to the system default for per-user cached files.\n" +".TP\n" +".I gimp_temp_dir\n" +"Path to temporary files, which is set to the value of the environment\n" +"variable GIMP2_TEMPDIR or to the system default for temporary files.\n" +"\n"; + +static const gchar man_page_footer[] = +".SH FILES\n" +".TP\n" +".I @gimpsysconfdir@/gimprc\n" +"System-wide configuration file\n" +".TP\n" +".I @manpage_gimpdir@/gimprc\n" +"Per-user configuration file\n" +"\n" +".SH \"SEE ALSO\"\n" +".BR gimp (1)\n"; + + +static void +dump_gimprc_manpage (GimpConfig *rc, + GimpConfigWriter *writer, + GOutputStream *output) +{ + GObjectClass *klass; + GParamSpec **property_specs; + guint n_property_specs; + guint i; + + g_output_stream_printf (output, NULL, NULL, NULL, + "%s", man_page_header); + + klass = G_OBJECT_GET_CLASS (rc); + property_specs = g_object_class_list_properties (klass, &n_property_specs); + + for (i = 0; i < n_property_specs; i++) + { + GParamSpec *prop_spec = property_specs[i]; + gchar *desc; + gboolean success; + + if (! (prop_spec->flags & GIMP_CONFIG_PARAM_SERIALIZE)) + continue; + + if (prop_spec->flags & GIMP_CONFIG_PARAM_IGNORE) + continue; + + g_output_stream_printf (output, NULL, NULL, NULL, + ".TP\n"); + + if (! strcmp (prop_spec->name, "num-processors")) + { + gimp_config_writer_open (writer, "num-processors"); + gimp_config_writer_printf (writer, "1"); + gimp_config_writer_close (writer); + + success = TRUE; + } + else if (! strcmp (prop_spec->name, "tile-cache-size")) + { + gimp_config_writer_open (writer, "tile-cache-size"); + gimp_config_writer_printf (writer, "2g"); + gimp_config_writer_close (writer); + + success = TRUE; + } + else if (! strcmp (prop_spec->name, "undo-size")) + { + gimp_config_writer_open (writer, "undo-size"); + gimp_config_writer_printf (writer, "1g"); + gimp_config_writer_close (writer); + + success = TRUE; + } + else if (! strcmp (prop_spec->name, "mypaint-brush-path")) + { + gchar *path = g_strdup_printf ("@mypaint_brushes_dir@%s" + "~/.mypaint/brushes", + G_SEARCHPATH_SEPARATOR_S); + + gimp_config_writer_open (writer, "mypaint-brush-path"); + gimp_config_writer_string (writer, path); + gimp_config_writer_close (writer); + + g_free (path); + + success = TRUE; + } + else + { + success = gimp_config_serialize_property (rc, prop_spec, writer); + } + + if (success) + { + g_output_stream_printf (output, NULL, NULL, NULL, + "\n"); + + desc = dump_describe_param (prop_spec); + + dump_with_linebreaks (output, desc); + + g_output_stream_printf (output, NULL, NULL, NULL, + "\n"); + + g_free (desc); + } + } + + g_free (property_specs); + + g_output_stream_printf (output, NULL, NULL, NULL, + "%s", man_page_path); + g_output_stream_printf (output, NULL, NULL, NULL, + "%s", man_page_footer); +} + + +static const gchar display_format_description[] = +"This is a format string; certain % character sequences are recognised and " +"expanded as follows:\n" +"\n" +"%% literal percent sign\n" +"%f bare filename, or \"Untitled\"\n" +"%F full path to file, or \"Untitled\"\n" +"%p PDB image id\n" +"%i view instance number\n" +"%t image type (RGB, grayscale, indexed)\n" +"%z zoom factor as a percentage\n" +"%s source scale factor\n" +"%d destination scale factor\n" +"%Dx expands to x if the image is dirty, the empty string otherwise\n" +"%Cx expands to x if the image is clean, the empty string otherwise\n" +"%B expands to (modified) if the image is dirty, the empty string otherwise\n" +"%A expands to (clean) if the image is clean, the empty string otherwise\n" +"%Nx expands to x if the image is export-dirty, the empty string otherwise\n" +"%Ex expands to x if the image is export-clean, the empty string otherwise\n" +"%l the number of layers\n" +"%L the number of layers (long form)\n" +"%m memory used by the image\n" +"%n the name of the active layer/channel\n" +"%P the PDB id of the active layer/channel\n" +"%w image width in pixels\n" +"%W image width in real-world units\n" +"%h image height in pixels\n" +"%H image height in real-world units\n" +"%M the image size expressed in megapixels\n" +"%u unit symbol\n" +"%U unit abbreviation\n" +"%x the width of the active layer/channel in pixels\n" +"%X the width of the active layer/channel in real-world units\n" +"%y the height of the active layer/channel in pixels\n" +"%Y the height of the active layer/channel in real-world units\n" +"%o the name of the image's color profile\n\n"; + + +static gchar * +dump_describe_param (GParamSpec *param_spec) +{ + const gchar *blurb = g_param_spec_get_blurb (param_spec); + const gchar *values = NULL; + + if (!blurb) + { + g_warning ("FIXME: Property '%s' has no blurb.", param_spec->name); + + blurb = g_strdup_printf ("The %s property has no description.", + param_spec->name); + } + + if (GIMP_IS_PARAM_SPEC_RGB (param_spec)) + { + if (gimp_param_spec_rgb_has_alpha (param_spec)) + values = + "The color is specified in the form (color-rgba red green blue " + "alpha) with channel values as floats in the range of 0.0 to 1.0."; + else + values = + "The color is specified in the form (color-rgb red green blue) " + "with channel values as floats in the range of 0.0 to 1.0."; + } + else if (GIMP_IS_PARAM_SPEC_MEMSIZE (param_spec)) + { + values = + "The integer size can contain a suffix of 'B', 'K', 'M' or 'G' which " + "makes GIMP interpret the size as being specified in bytes, kilobytes, " + "megabytes or gigabytes. If no suffix is specified the size defaults " + "to being specified in kilobytes."; + } + else if (GIMP_IS_PARAM_SPEC_CONFIG_PATH (param_spec)) + { + switch (gimp_param_spec_config_path_type (param_spec)) + { + case GIMP_CONFIG_PATH_FILE: + values = "This is a single filename."; + break; + + case GIMP_CONFIG_PATH_FILE_LIST: + switch (G_SEARCHPATH_SEPARATOR) + { + case ':': + values = "This is a colon-separated list of files."; + break; + case ';': + values = "This is a semicolon-separated list of files."; + break; + default: + g_warning ("unhandled G_SEARCHPATH_SEPARATOR value"); + break; + } + break; + + case GIMP_CONFIG_PATH_DIR: + values = "This is a single folder."; + break; + + case GIMP_CONFIG_PATH_DIR_LIST: + switch (G_SEARCHPATH_SEPARATOR) + { + case ':': + values = "This is a colon-separated list of folders to search."; + break; + case ';': + values = "This is a semicolon-separated list of folders to search."; + break; + default: + g_warning ("unhandled G_SEARCHPATH_SEPARATOR value"); + break; + } + break; + } + } + else if (GIMP_IS_PARAM_SPEC_UNIT (param_spec)) + { + values = + "The unit can be one inches, millimeters, points or picas plus " + "those in your user units database."; + } + else if (g_type_is_a (param_spec->value_type, GIMP_TYPE_CONFIG)) + { + values = "This is a parameter list."; + } + else + { + switch (G_TYPE_FUNDAMENTAL (param_spec->value_type)) + { + case G_TYPE_BOOLEAN: + values = "Possible values are yes and no."; + break; + case G_TYPE_INT: + case G_TYPE_UINT: + case G_TYPE_LONG: + case G_TYPE_ULONG: + values = "This is an integer value."; + break; + case G_TYPE_FLOAT: + case G_TYPE_DOUBLE: + values = "This is a float value."; + break; + case G_TYPE_STRING: + /* eek */ + if (strcmp (g_param_spec_get_name (param_spec), "image-title-format") + && + strcmp (g_param_spec_get_name (param_spec), "image-status-format")) + { + values = "This is a string value."; + } + else + { + values = display_format_description; + } + break; + case G_TYPE_ENUM: + { + GEnumClass *enum_class; + GEnumValue *enum_value; + GString *str; + gint i; + + enum_class = g_type_class_peek (param_spec->value_type); + + str = g_string_new (blurb); + + g_string_append (str, " Possible values are "); + + for (i = 0, enum_value = enum_class->values; + i < enum_class->n_values; + i++, enum_value++) + { + g_string_append (str, enum_value->value_nick); + + switch (enum_class->n_values - i) + { + case 1: + g_string_append_c (str, '.'); + break; + case 2: + g_string_append (str, " and "); + break; + default: + g_string_append (str, ", "); + break; + } + } + + return g_string_free (str, FALSE); + } + break; + default: + break; + } + } + + if (!values) + g_warning ("FIXME: Can't tell anything about a %s.", + g_type_name (param_spec->value_type)); + + if (strcmp (blurb, "") == 0) + return g_strdup_printf ("%s", values); + else + return g_strdup_printf ("%s %s", blurb, values); +} + + +#define LINE_LENGTH 78 + +static void +dump_with_linebreaks (GOutputStream *output, + const gchar *text) +{ + gint len = strlen (text); + + while (len > 0) + { + const gchar *t; + gint i, space; + + /* groff doesn't like lines to start with a single quote */ + if (*text == '\'') + g_output_stream_printf (output, NULL, NULL, NULL, + "\\&"); /* a zero width space */ + + for (t = text, i = 0, space = 0; + *t != '\n' && (i <= LINE_LENGTH || space == 0) && i < len; + t++, i++) + { + if (g_ascii_isspace (*t)) + space = i; + } + + if (i > LINE_LENGTH && space && *t != '\n') + i = space; + + g_output_stream_write_all (output, text, i, NULL, NULL, NULL); + g_output_stream_printf (output, NULL, NULL, NULL, + "\n"); + + if (*t == '\n') + g_output_stream_printf (output, NULL, NULL, NULL, + ".br\n"); + + i++; + + text += i; + len -= i; + } +} |