[gimp/gimp-attributes-wip: 102/102] Merge remote-tracking branch 'remotes/origin/master' into gimp-attributes-wip



commit 1d7e002b6fcb6162e26c961edaa832e59c41403f
Merge: 0c93185 ef66ea2
Author: Hartmut Kuhse <hk_priv gmx de>
Date:   Mon Mar 9 08:33:01 2015 +0100

    Merge remote-tracking branch 'remotes/origin/master' into gimp-attributes-wip
    
    Conflicts:
        configure.ac

 AUTHORS                                     |    5 +
 HACKING                                     |    7 +
 app/Makefile.am                             |    5 +-
 app/actions/brushes-actions.c               |   17 +-
 app/actions/data-commands.c                 |   34 +
 app/actions/data-commands.h                 |   32 +-
 app/actions/documents-actions.c             |   25 +-
 app/actions/documents-commands.c            |   29 +
 app/actions/documents-commands.h            |   38 +-
 app/actions/drawable-actions.c              |   14 +
 app/actions/drawable-commands.c             |   64 +
 app/actions/drawable-commands.h             |    4 +
 app/actions/dynamics-actions.c              |   15 +-
 app/actions/file-actions.c                  |   36 +-
 app/actions/file-commands.c                 |   54 +
 app/actions/file-commands.h                 |   56 +-
 app/actions/filters-actions.c               |    6 +
 app/actions/gradient-editor-commands.c      |   50 +-
 app/actions/gradients-actions.c             |   17 +-
 app/actions/palettes-actions.c              |   17 +-
 app/actions/patterns-actions.c              |   17 +-
 app/actions/tool-presets-actions.c          |   15 +-
 app/config/gimpguiconfig.c                  |   31 +
 app/config/gimpguiconfig.h                  |    6 +-
 app/config/gimprc-blurbs.h                  |    6 +
 app/core/gimp.c                             |   11 +
 app/core/gimpcontext.c                      |   48 +
 app/core/gimpcontext.h                      |    3 +
 app/core/gimpdatafactory.c                  |   73 +-
 app/core/gimpdatafactory.h                  |    1 +
 app/core/gimplayer-floating-sel.c           |   22 +-
 app/core/gimptoolpreset.c                   |   44 +-
 app/dialogs/dialogs.c                       |    1 +
 app/dialogs/preferences-dialog.c            |   11 +-
 app/display/Makefile.am                     |    2 +
 app/display/gimpcanvasbufferpreview.c       |  259 +
 app/display/gimpcanvasbufferpreview.h       |   56 +
 app/main.c                                  |    1 +
 app/operations/gimpoperationequalize.c      |   42 +-
 app/operations/gimpoperationequalize.h      |    3 +-
 app/paint/gimpclone.c                       |    1 +
 app/paint/gimpdodgeburn.c                   |    1 +
 app/paint/gimperaser.c                      |    1 +
 app/paint/gimpheal.c                        |    1 +
 app/paint/gimpsmudge.c                      |    1 +
 app/pdb/internal-procs.c                    |    2 +-
 app/pdb/plug-in-compat-cmds.c               |  531 +
 app/sanity.c                                |    4 +-
 app/tools/Makefile.am                       |    8 +
 app/tools/gimp-tools.c                      |   13 +
 app/tools/gimpcagetool.c                    |   26 +-
 app/tools/gimpgegltool.c                    |    1 +
 app/tools/gimphandletransformoptions.c      |  201 +
 app/tools/gimphandletransformoptions.h      |   54 +
 app/tools/gimphandletransformtool.c         |  998 ++
 app/tools/gimphandletransformtool.h         |   60 +
 app/tools/gimpnpointdeformationoptions.c    |  256 +
 app/tools/gimpnpointdeformationoptions.h    |   67 +
 app/tools/gimpnpointdeformationtool.c       | 1032 ++
 app/tools/gimpnpointdeformationtool.h       |   95 +
 app/tools/gimptransformoptions.h            |    9 +-
 app/tools/gimptransformtool.c               |    9 +-
 app/tools/gimptransformtool.h               |    2 +-
 app/tools/tools-enums.c                     |   31 +
 app/tools/tools-enums.h                     |   12 +
 app/widgets/gimpbrusheditor.c               |   95 +-
 app/widgets/gimpdataeditor.c                |    3 +-
 app/widgets/gimpdatafactoryview.c           |    4 +-
 app/widgets/gimpdockable.c                  |   51 +-
 app/widgets/gimpdockbook.c                  |   81 +-
 app/widgets/gimphelp-ids.h                  |   13 +
 app/widgets/gimppanedbox.c                  |   33 +-
 app/widgets/gimpsessioninfo.c               |    2 +-
 app/widgets/gimptoolbox.c                   |   67 +-
 authors.xml                                 |    5 +
 configure.ac                                |   14 +-
 data/patterns/Animal/.gitignore             |    2 +
 data/patterns/Animal/Makefile.am            |   10 +
 data/patterns/{ => Animal}/leather.pat      |  Bin 12320 -> 12320 bytes
 data/patterns/{ => Animal}/leopard.pat      |  Bin 11936 -> 11936 bytes
 data/patterns/Fabric/.gitignore             |    2 +
 data/patterns/Fabric/Makefile.am            |    8 +
 data/patterns/{ => Fabric}/burlap.pat       |  Bin 27679 -> 27679 bytes
 data/patterns/Food/.gitignore               |    2 +
 data/patterns/Food/Makefile.am              |    9 +
 data/patterns/{ => Food}/choc_swirl.pat     |  Bin 7540 -> 7540 bytes
 data/patterns/{ => Food}/java.pat           |  Bin 12317 -> 12317 bytes
 data/patterns/Legacy/.gitignore             |    2 +
 data/patterns/{ => Legacy}/3dgreen.pat      |  Bin 6108 -> 6108 bytes
 data/patterns/Legacy/Makefile.am            |   22 +
 data/patterns/{ => Legacy}/Stripes1px.pat   |  Bin 9253 -> 9253 bytes
 data/patterns/{ => Legacy}/Stripes2px.pat   |  Bin 9248 -> 9248 bytes
 data/patterns/{ => Legacy}/blue.pat         |  Bin 6108 -> 6108 bytes
 data/patterns/{ => Legacy}/bluegrid.pat     |  Bin 1909 -> 1909 bytes
 data/patterns/{ => Legacy}/bluesquares.pat  |  Bin 48037 -> 48037 bytes
 data/patterns/{ => Legacy}/blueweb.pat      |  Bin 12321 -> 12321 bytes
 data/patterns/{ => Legacy}/fibers.pat       |  Bin 7531 -> 7531 bytes
 data/patterns/{ => Legacy}/nops.pat         |  Bin 49181 -> 49181 bytes
 data/patterns/{ => Legacy}/pastel.pat       |  Bin 12325 -> 12325 bytes
 data/patterns/{ => Legacy}/qube1.pat        |  Bin 5331 -> 5331 bytes
 data/patterns/{ => Legacy}/recessed.pat     |  Bin 6433 -> 6433 bytes
 data/patterns/{ => Legacy}/redcube.pat      |  Bin 12322 -> 12322 bytes
 data/patterns/{ => Legacy}/sm_squares.pat   |  Bin 7538 -> 7538 bytes
 data/patterns/{ => Legacy}/warning.pat      |  Bin 1233 -> 1233 bytes
 data/patterns/Makefile.am                   |   74 +-
 data/patterns/Paper/.gitignore              |    2 +
 data/patterns/Paper/Makefile.am             |    9 +
 data/patterns/{ => Paper}/crinklepaper.pat  |  Bin 49191 -> 49191 bytes
 data/patterns/{ => Paper}/paper.pat         |  Bin 10030 -> 10030 bytes
 data/patterns/Plant/.gitignore              |    2 +
 data/patterns/Plant/Makefile.am             |    8 +
 data/patterns/{ => Plant}/leaves.pat        |  Bin 7537 -> 7537 bytes
 data/patterns/Sky/.gitignore                |    2 +
 data/patterns/Sky/Makefile.am               |   11 +
 data/patterns/{ => Sky}/lightning.pat       |  Bin 40723 -> 40723 bytes
 data/patterns/{ => Sky}/sky.pat             |  Bin 11002 -> 11002 bytes
 data/patterns/{ => Sky}/starfield.pat       |  Bin 49186 -> 49186 bytes
 data/patterns/Stone/.gitignore              |    2 +
 data/patterns/{ => Stone}/Craters.pat       |  Bin 39707 -> 39707 bytes
 data/patterns/Stone/Makefile.am             |   22 +
 data/patterns/{ => Stone}/Moonfoot.pat      |  Bin 14442 -> 14442 bytes
 data/patterns/{ => Stone}/amethyst.pat      |  Bin 12321 -> 12321 bytes
 data/patterns/{ => Stone}/brick.pat         |  Bin 27679 -> 27679 bytes
 data/patterns/{ => Stone}/cracked.pat       |  Bin 62238 -> 62238 bytes
 data/patterns/{ => Stone}/granite1.pat      |  Bin 10035 -> 10035 bytes
 data/patterns/{ => Stone}/ground1.pat       |  Bin 30034 -> 30034 bytes
 data/patterns/{ => Stone}/marble1.pat       |  Bin 16418 -> 16418 bytes
 data/patterns/{ => Stone}/marble2.pat       |  Bin 16418 -> 16418 bytes
 data/patterns/{ => Stone}/marble3.pat       |  Bin 12322 -> 12322 bytes
 data/patterns/{ => Stone}/pink_marble.pat   |  Bin 49188 -> 49188 bytes
 data/patterns/{ => Stone}/rock.pat          |  Bin 30510 -> 30510 bytes
 data/patterns/{ => Stone}/slate.pat         |  Bin 16414 -> 16414 bytes
 data/patterns/{ => Stone}/stone33.pat       |  Bin 73038 -> 73038 bytes
 data/patterns/{ => Stone}/terra.pat         |  Bin 12318 -> 12318 bytes
 data/patterns/Water/.gitignore              |    2 +
 data/patterns/Water/Makefile.am             |   11 +
 data/patterns/{ => Water}/electric.pat      |  Bin 9638 -> 9638 bytes
 data/patterns/{ => Water}/ice.pat           |  Bin 43228 -> 43228 bytes
 data/patterns/{ => Water}/pool.pat          |  Bin 6111 -> 6111 bytes
 data/patterns/{ => Water}/rain.pat          |  Bin 35021 -> 35021 bytes
 data/patterns/Wood/.gitignore               |    2 +
 data/patterns/Wood/Makefile.am              |   20 +
 data/patterns/{ => Wood}/bark.pat           |  Bin 22174 -> 22174 bytes
 data/patterns/{ => Wood}/burlwood.pat       |  Bin 27681 -> 27681 bytes
 data/patterns/{ => Wood}/corkboard.pat      |  Bin 10097 -> 10097 bytes
 data/patterns/{ => Wood}/parque1.pat        |  Bin 12322 -> 12322 bytes
 data/patterns/{ => Wood}/parque2.pat        |  Bin 12322 -> 12322 bytes
 data/patterns/{ => Wood}/parque3.pat        |  Bin 12322 -> 12322 bytes
 data/patterns/{ => Wood}/pine.pat           |  Bin 10781 -> 10781 bytes
 data/patterns/{ => Wood}/walnut.pat         |  Bin 49183 -> 49183 bytes
 data/patterns/{ => Wood}/wood1.pat          |  Bin 27690 -> 27690 bytes
 data/patterns/{ => Wood}/wood2.pat          |  Bin 30030 -> 30030 bytes
 data/patterns/{ => Wood}/wood3.pat          |  Bin 7532 -> 7532 bytes
 data/patterns/{ => Wood}/wood4.pat          |  Bin 7532 -> 7532 bytes
 data/patterns/{ => Wood}/wood5.pat          |  Bin 27677 -> 27677 bytes
 icons/16/gimp-tool-handle-transform.png     |  Bin 0 -> 1166 bytes
 icons/16/gimp-tool-n-point-deformation.png  |  Bin 0 -> 1083 bytes
 icons/22/gimp-tool-handle-transform.png     |  Bin 0 -> 2084 bytes
 icons/22/gimp-tool-n-point-deformation.png  |  Bin 0 -> 1626 bytes
 icons/Makefile.am                           |    4 +
 libgimpbase/gimpbase.def                    |    1 +
 libgimpbase/gimpunit.c                      |    6 +-
 libgimpbase/gimputils.c                     |  181 +
 libgimpbase/gimputils.h                     |   76 +-
 libgimpcolor/gimprgb.h                      |   16 +-
 libgimpwidgets/gimpdialog.c                 |  330 +-
 libgimpwidgets/gimppreviewarea.c            |   46 +-
 libgimpwidgets/gimpstock.c                  |    2 +
 libgimpwidgets/gimpstock.h                  |    2 +
 menus/brushes-menu.xml                      |    1 +
 menus/documents-menu.xml                    |    1 +
 menus/dynamics-menu.xml                     |    1 +
 menus/gradients-menu.xml                    |    1 +
 menus/image-menu.xml.in                     |   14 +-
 menus/palettes-menu.xml                     |    1 +
 menus/patterns-menu.xml                     |    1 +
 menus/tool-presets-menu.xml                 |    1 +
 plug-ins/common/.gitignore                  |    4 -
 plug-ins/common/Makefile.am                 |   36 -
 plug-ins/common/edge.c                      |  838 --
 plug-ins/common/file-gegl.c                 |   55 +-
 plug-ins/common/file-gif-save.c             |   86 +-
 plug-ins/common/file-raw-data.c             |   51 +-
 plug-ins/common/gimprc.common               |    2 -
 plug-ins/common/lcms.c                      |    5 +-
 plug-ins/common/plugin-defs.pl              |    2 -
 plug-ins/common/value-propagate.c           | 1296 ---
 plug-ins/pygimp/gimpmodule.c                |    5 +
 plug-ins/pygimp/plug-ins/file-openraster.py |  181 +-
 plug-ins/pygimp/pygimp-drawable.c           |   98 +-
 plug-ins/pygimp/pygimp-image.c              |    8 +
 plug-ins/twain/tw_local.h                   |    6 +-
 plug-ins/twain/tw_mac.c                     |    5 +-
 po-libgimp/eu.po                            | 1378 ++-
 po-libgimp/it.po                            |   40 +-
 po-plug-ins/POTFILES.in                     |    2 -
 po-plug-ins/eu.po                           | 8848 ++++++++-------
 po-plug-ins/it.po                           |  336 +-
 po-python/eu.po                             |  241 +-
 po-script-fu/eu.po                          | 3032 +++---
 po-tags/eu.po                               |   31 +-
 po-tips/eu.po                               |  445 +-
 po/POTFILES.in                              |    4 +
 po/eu.po                                    | 9441 ++++++++++------
 po/it.po                                    | 1324 ++-
 po/sv.po                                    |15792 +++++++++++----------------
 tools/pdbgen/pdb/plug_in_compat.pdb         |  316 +
 207 files changed, 26680 insertions(+), 23098 deletions(-)
---
diff --cc app/main.c
index 18db832,18db832..4531b32
--- a/app/main.c
+++ b/app/main.c
@@@ -353,6 -353,6 +353,7 @@@ main (int    argc
  
    basename = g_path_get_basename (argv[0]);
    g_set_prgname (basename);
++  g_setenv ("GIMP_PROG_BASENAME", basename, TRUE);
    g_free (basename);
  
    /* Check argv[] for "--verbose" first */
diff --cc configure.ac
index 98a71d8,8c0099a..6082838
--- a/configure.ac
+++ b/configure.ac
@@@ -65,8 -65,8 +65,8 @@@ m4_define([pygtk_required_version], [2.
  m4_define([poppler_required_version], [0.12.4])
  m4_define([poppler_data_required_version], [0.4.7])
  m4_define([libgudev_required_version], [167])
 -m4_define([gexiv2_required_version], [0.6.1])
 +m4_define([gexiv2_required_version], [0.10.3])
- m4_define([lcms_required_version], [2.2])
+ m4_define([lcms_required_version], [2.6])
  m4_define([libpng_required_version], [1.2.37])
  m4_define([liblzma_required_version], [5.0.0])
  m4_define([openexr_required_version], [1.6.1])
diff --cc libgimpwidgets/gimpdialog.c
index 75cfef4,75cfef4..ed6fe80
--- a/libgimpwidgets/gimpdialog.c
+++ b/libgimpwidgets/gimpdialog.c
@@@ -22,6 -22,6 +22,10 @@@
  #include "config.h"
  
  #include <gtk/gtk.h>
++#include <glib/gstdio.h>
++
++#include "libgimpconfig/gimpconfig.h"
++#include "libgimpbase/gimpbase.h"
  
  #include "gimpwidgetstypes.h"
  
@@@ -56,6 -56,6 +60,11 @@@ struct _GimpDialogPrivat
    GimpHelpFunc  help_func;
    gchar        *help_id;
    GtkWidget    *help_button;
++  gchar        *allocation_rc;
++  gint          dialog_width;
++  gint          dialog_height;
++  gint          dialog_x;
++  gint          dialog_y;
  };
  
  #define GET_PRIVATE(dialog) G_TYPE_INSTANCE_GET_PRIVATE (dialog, \
@@@ -63,28 -63,28 +72,36 @@@
                                                           GimpDialogPrivate)
  
  
--static void       gimp_dialog_constructed  (GObject      *object);
--static void       gimp_dialog_dispose      (GObject      *object);
--static void       gimp_dialog_finalize     (GObject      *object);
--static void       gimp_dialog_set_property (GObject      *object,
--                                            guint         property_id,
--                                            const GValue *value,
--                                            GParamSpec   *pspec);
--static void       gimp_dialog_get_property (GObject      *object,
--                                            guint         property_id,
--                                            GValue       *value,
--                                            GParamSpec   *pspec);
--
--static void       gimp_dialog_hide         (GtkWidget    *widget);
--static gboolean   gimp_dialog_delete_event (GtkWidget    *widget,
--                                            GdkEventAny  *event);
--
--static void       gimp_dialog_close        (GtkDialog    *dialog);
--
--static void       gimp_dialog_help         (GObject      *dialog);
--static void       gimp_dialog_response     (GtkDialog    *dialog,
--                                            gint          response_id);
--
++static void       gimp_dialog_constructed      (GObject      *object);
++static void       gimp_dialog_dispose          (GObject      *object);
++static void       gimp_dialog_finalize         (GObject      *object);
++static void       gimp_dialog_set_property     (GObject      *object,
++                                                guint         property_id,
++                                                const GValue *value,
++                                                GParamSpec   *pspec);
++static void       gimp_dialog_get_property     (GObject      *object,
++                                                guint         property_id,
++                                                GValue       *value,
++                                                GParamSpec   *pspec);
++
++static void       gimp_dialog_hide             (GtkWidget    *widget);
++static gboolean   gimp_dialog_delete_event     (GtkWidget    *widget,
++                                                GdkEventAny  *event);
++
++static void       gimp_dialog_close            (GtkDialog    *dialog);
++
++static void       gimp_dialog_help             (GObject      *dialog);
++static void       gimp_dialog_response         (GtkDialog    *dialog,
++                                                gint          response_id);
++                                            
++static void       gimp_dialog_read_context     (GtkWidget    *dialog,
++                                                gchar        *name,
++                                                GtkAllocation *allocation);
++static void       gimp_dialog_save_context     (GtkDialog    *dialog,
++                                                GtkAllocation allocation);
++
++void              gimp_dialog_unmap_callback   (GtkDialog    *dialog);
++void              gimp_dialog_map_callback     (GtkDialog    *dialog);
  
  G_DEFINE_TYPE (GimpDialog, gimp_dialog, GTK_TYPE_DIALOG)
  
@@@ -445,7 -445,7 +462,9 @@@ gimp_dialog_new_valist (const gchar    
                          const gchar    *help_id,
                          va_list         args)
  {
--  GtkWidget *dialog;
++  GtkWidget   *dialog;
++  const gchar *prog_name;
++  const gchar *gimp_basename;
  
    g_return_val_if_fail (title != NULL, NULL);
    g_return_val_if_fail (role != NULL, NULL);
@@@ -460,6 -460,6 +479,9 @@@
                           "parent",    parent,
                           NULL);
  
++  prog_name = g_get_prgname ();
++  gimp_basename = g_getenv ("GIMP_PROG_BASENAME");
++
    if (parent)
      {
        if (flags & GTK_DIALOG_DESTROY_WITH_PARENT)
@@@ -467,6 -467,6 +489,27 @@@
                                   G_CALLBACK (gimp_dialog_close),
                                   dialog, G_CONNECT_SWAPPED);
      }
++  else
++    {
++      if (dialog && strcmp (prog_name, gimp_basename))
++        {
++          GimpDialogPrivate *private = GET_PRIVATE (dialog);
++          GtkAllocation      allocation;
++
++          g_printerr ("allocating: %s\n", role);
++
++          private->allocation_rc = g_strdup (role);
++          gimp_dialog_read_context(dialog, private->allocation_rc, &allocation);
++
++          private->dialog_x = allocation.x;
++          private->dialog_y = allocation.y;
++          private->dialog_width = allocation.width;
++          private->dialog_height = allocation.height;
++
++          g_signal_connect(GTK_WIDGET(dialog), "unmap", G_CALLBACK(gimp_dialog_unmap_callback), NULL);
++          g_signal_connect (GTK_WIDGET(dialog), "map-event", G_CALLBACK (gimp_dialog_map_callback), NULL);
++        }
++    }
  
    gimp_dialog_add_buttons_valist (GIMP_DIALOG (dialog), args);
  
@@@ -685,3 -685,3 +728,244 @@@ gimp_dialogs_show_help_button (gboolea
  {
    show_help_button = show ? TRUE : FALSE;
  }
++
++enum
++{
++  POS_X,
++  POS_Y,
++  WIDTH,
++  HEIGHT
++};
++
++static void
++gimp_dialog_read_context(GtkWidget *dialog, gchar *name, GtkAllocation *allocation)
++{
++  GimpDialogPrivate *private = GET_PRIVATE (dialog);
++  gchar             *options_path;
++  GFile             *options_dir;
++  GFile             *options_file;
++  GScanner          *scanner;
++  GTokenType         token;
++  GError            *error = NULL;
++  gint               x=0, y=0, width=0, height=0;
++
++  allocation->height = height;
++  allocation->width = width;
++  allocation->x = x;
++  allocation->y = y;
++
++  g_return_if_fail (private->allocation_rc != NULL);
++
++  options_path = g_build_filename (g_strdup (gimp_directory ()),
++                                   "plugin-options",
++                                   NULL);
++
++  options_dir = g_file_new_for_path (options_path);
++  options_file = g_file_get_child(options_dir, g_strconcat (private->allocation_rc, ".rc", NULL));
++
++  scanner = gimp_scanner_new_gfile (options_file, &error);
++
++  if (! scanner)
++    {
++      g_clear_error (&error);
++      g_free (options_path);
++      g_object_unref (options_dir);
++      g_object_unref (options_file);
++      return;
++    }
++
++  g_scanner_scope_add_symbol (scanner, 0, "pos-x",
++                              GINT_TO_POINTER (POS_X));
++  g_scanner_scope_add_symbol (scanner, 0,  "pos-y",
++                              GINT_TO_POINTER (POS_Y));
++  g_scanner_scope_add_symbol (scanner, 0,  "width",
++                              GINT_TO_POINTER (WIDTH));
++  g_scanner_scope_add_symbol (scanner, 0,  "height",
++                              GINT_TO_POINTER (HEIGHT));
++
++  token = G_TOKEN_LEFT_PAREN;
++
++  while (g_scanner_peek_next_token (scanner) == token)
++    {
++      token = g_scanner_get_next_token (scanner);
++
++      switch (token)
++        {
++        case G_TOKEN_LEFT_PAREN:
++          token = G_TOKEN_SYMBOL;
++          break;
++
++        case G_TOKEN_SYMBOL:
++          if (scanner->value.v_symbol == GINT_TO_POINTER (POS_X))
++            {
++              token = G_TOKEN_IDENTIFIER;
++
++              if (! gimp_scanner_parse_int (scanner, &x))
++                break;
++            }
++          else if (scanner->value.v_symbol == GINT_TO_POINTER (POS_Y))
++            {
++              token = G_TOKEN_IDENTIFIER;
++
++              if (! gimp_scanner_parse_int (scanner, &y))
++                break;
++            }
++          else if (scanner->value.v_symbol == GINT_TO_POINTER (WIDTH))
++            {
++              token = G_TOKEN_IDENTIFIER;
++
++              if (! gimp_scanner_parse_int (scanner, &width))
++                break;
++            }
++          else if (scanner->value.v_symbol == GINT_TO_POINTER (HEIGHT))
++            {
++              token = G_TOKEN_IDENTIFIER;
++
++              if (! gimp_scanner_parse_int (scanner, &height))
++                break;
++            }
++          token = G_TOKEN_RIGHT_PAREN;
++
++          break;
++
++        case G_TOKEN_RIGHT_PAREN:
++          token = G_TOKEN_LEFT_PAREN;
++          break;
++
++        default: /* do nothing */
++          break;
++        }
++    }
++
++  if (token != G_TOKEN_LEFT_PAREN)
++    {
++      g_scanner_get_next_token (scanner);
++      g_scanner_unexp_token (scanner, token, NULL, NULL, NULL, "fatal parse error", TRUE);
++    }
++
++  if (error)
++    {
++      g_print("error: %s\n", error->message);
++      g_clear_error (&error);
++    }
++
++  allocation->height = height;
++  allocation->width = width;
++  allocation->x = x;
++  allocation->y = y;
++
++  gimp_scanner_destroy (scanner);
++
++  g_free (options_path);
++  g_object_unref (options_dir);
++  g_object_unref (options_file);
++}
++
++static void
++gimp_dialog_save_context(GtkDialog *dialog, GtkAllocation allocation)
++{
++  GimpDialogPrivate *private = GET_PRIVATE (dialog);
++  gchar             *options_path;
++  GFile             *options_dir;
++  GFile             *options_file;
++  GimpConfigWriter  *writer;
++  GError            *error = NULL;
++
++  g_return_if_fail (private->allocation_rc != NULL);
++
++  options_path = g_build_filename (g_strdup (gimp_directory ()),
++                                   "plugin-options",
++                                   NULL);
++
++  options_dir = g_file_new_for_path (options_path);
++
++  if (! g_file_query_exists (options_dir, NULL))
++    {
++      g_file_make_directory (options_dir, NULL, &error);
++    }
++
++  if (error)
++    {
++      g_clear_error (&error);
++      g_free (options_path);
++      g_object_unref (options_dir);
++      return;
++    }
++
++  g_clear_error (&error);
++
++  options_file = g_file_get_child(options_dir, g_strconcat (private->allocation_rc, ".rc", NULL));
++
++  writer =
++    gimp_config_writer_new_gfile (options_file,
++                                  TRUE,
++                                  "start of file\n",
++                                  NULL);
++  g_object_unref (options_dir);
++  g_object_unref (options_file);
++  g_free (options_path);
++
++  if (!writer)
++    {
++      return;
++    }
++
++  gimp_config_writer_open (writer, "pos-x");
++  gimp_config_writer_printf (writer, "%d", allocation.x);
++  gimp_config_writer_close (writer);
++  gimp_config_writer_open (writer, "pos-y");
++  gimp_config_writer_printf (writer, "%d", allocation.y);
++  gimp_config_writer_close (writer);
++  gimp_config_writer_open (writer, "width");
++  gimp_config_writer_printf (writer, "%d", allocation.width);
++  gimp_config_writer_close (writer);
++  gimp_config_writer_open (writer, "height");
++  gimp_config_writer_printf (writer, "%d", allocation.height);
++  gimp_config_writer_close (writer);
++
++  if (! gimp_config_writer_finish (writer, "end of file", &error))
++    {
++      g_clear_error (&error);
++    }
++}
++
++void
++gimp_dialog_unmap_callback (GtkDialog *dialog)
++{
++  GtkAllocation  allocation;
++  GdkRectangle   rect;
++  gint           dx, dy, dw, dh, dd;
++  gint           monitor;
++  GdkWindow     *window = gtk_widget_get_window (GTK_WIDGET(dialog));
++  GdkScreen     *screen = gtk_widget_get_screen (GTK_WIDGET(dialog));
++
++  gdk_window_get_frame_extents (window, &rect);
++  gdk_window_get_geometry (window, &dx, &dy, &dw, &dh, &dd);
++
++  if (window)
++    monitor = gdk_screen_get_monitor_at_window (screen, window);
++
++  allocation.x=rect.x;
++  allocation.y=rect.y;
++  allocation.width=dw;
++  allocation.height=dh;
++
++  gimp_dialog_save_context(dialog, allocation);
++}
++
++void
++gimp_dialog_map_callback (GtkDialog *dialog)
++{
++  GimpDialogPrivate *private = GET_PRIVATE (dialog);
++  GdkWindow         *window = gtk_widget_get_window (GTK_WIDGET(dialog));
++
++  if(private->dialog_width > 0 && private->dialog_height > 0)
++    {
++      gdk_window_move_resize (window,
++                              private->dialog_x,
++                              private->dialog_y,
++                              private->dialog_width,
++                              private->dialog_height);
++
++    }
++}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]