[gimp] app: split GimpDisplay in two classes: GimpDisplay and GimpDisplayImpl



commit b92dd2c8e31c2b555a11ca9d225088c8a648d566
Author: Michael Natterer <mitch gimp org>
Date:   Wed Sep 4 14:27:18 2019 +0200

    app: split GimpDisplay in two classes: GimpDisplay and GimpDisplayImpl
    
    GimpDisplay contains only the ID logic and the "gimp" and "config"
    pointers, and lives in the core.
    
    GimpDisplayImpl is a subclass and contains all the actual display
    stuff. The subclass is only an implementation detail and doesn't
    appear in any API.
    
    Remove all hacks which pass displays as gpointer, GObject or
    GimpObject through the core, or even lookup its type by name,
    just use GimpDisplay.

 app/actions/gimpgeglprocedure.c      |   9 +-
 app/actions/procedure-commands.c     |   2 +-
 app/actions/vectors-commands.c       |   2 +-
 app/core/Makefile.am                 |   2 +
 app/core/core-types.h                |   2 +
 app/core/gimp-gui.c                  |  50 ++-----
 app/core/gimp-gui.h                  |  27 ++--
 app/core/gimpcontext.c               |  21 +--
 app/core/gimpcontext.h               |   8 +-
 app/core/gimpdisplay.c               | 195 +++++++++++++++++++++++++++
 app/core/gimpdisplay.h               |  61 +++++++++
 app/core/gimpparamspecs.c            |  37 +++---
 app/core/gimpparamspecs.h            |  14 +-
 app/display/display-types.h          |   1 -
 app/display/gimpdisplay.c            | 248 ++++++++++-------------------------
 app/display/gimpdisplay.h            |  44 +++----
 app/file/file-open.c                 |   2 +-
 app/gui/gui-vtable.c                 |  50 +++----
 app/pdb/display-cmds.c               |   9 +-
 app/pdb/gimpprocedure.c              |   9 +-
 app/pdb/gimpprocedure.h              |   4 +-
 app/pdb/progress-cmds.c              |   2 +-
 app/plug-in/gimpgpparams.c           |   1 +
 app/plug-in/gimpplugin-progress.c    |   5 +-
 app/plug-in/gimpplugin-progress.h    |   2 +-
 app/plug-in/gimppluginmanager-call.c |   7 +-
 app/plug-in/gimppluginmanager-call.h |   2 +-
 app/plug-in/gimppluginprocedure.c    |   4 +-
 app/plug-in/gimptemporaryprocedure.c |   4 +-
 app/widgets/gimpdockwindow.c         |  18 +--
 app/widgets/gimpdrawabletreeview.c   |   4 +-
 libgimp/gimpgpparams-body.c          |  28 +---
 libgimp/gimpparamspecs.c             |  20 +--
 pdb/groups/display.pdb               |   5 +-
 pdb/pdb.pl                           |   4 +-
 35 files changed, 496 insertions(+), 407 deletions(-)
---
diff --git a/app/actions/gimpgeglprocedure.c b/app/actions/gimpgeglprocedure.c
index c56946cb29..7305c44460 100644
--- a/app/actions/gimpgeglprocedure.c
+++ b/app/actions/gimpgeglprocedure.c
@@ -38,6 +38,7 @@
 #include "core/gimp-memsize.h"
 #include "core/gimpcontainer.h"
 #include "core/gimpcontext.h"
+#include "core/gimpdisplay.h"
 #include "core/gimpdrawable-operation.h"
 #include "core/gimpimage.h"
 #include "core/gimplayermask.h"
@@ -45,8 +46,6 @@
 #include "core/gimpsettings.h"
 #include "core/gimptoolinfo.h"
 
-#include "display/gimpdisplay.h"
-
 #include "tools/gimpoperationtool.h"
 #include "tools/tool_manager.h"
 
@@ -80,7 +79,7 @@ static void     gimp_gegl_procedure_execute_async       (GimpProcedure  *procedu
                                                          GimpContext    *context,
                                                          GimpProgress   *progress,
                                                          GimpValueArray *args,
-                                                         GimpObject     *display);
+                                                         GimpDisplay    *display);
 
 
 G_DEFINE_TYPE (GimpGeglProcedure, gimp_gegl_procedure,
@@ -269,7 +268,7 @@ gimp_gegl_procedure_execute_async (GimpProcedure  *procedure,
                                    GimpContext    *context,
                                    GimpProgress   *progress,
                                    GimpValueArray *args,
-                                   GimpObject     *display)
+                                   GimpDisplay    *display)
 {
   GimpGeglProcedure *gegl_procedure = GIMP_GEGL_PROCEDURE (procedure);
   GimpRunMode        run_mode;
@@ -396,7 +395,7 @@ gimp_gegl_procedure_execute_async (GimpProcedure  *procedure,
                                              gimp_procedure_get_help_id (procedure));
         }
 
-      tool_manager_initialize_active (gimp, GIMP_DISPLAY (display));
+      tool_manager_initialize_active (gimp, display);
 
       if (settings)
         gimp_filter_tool_set_config (GIMP_FILTER_TOOL (active_tool),
diff --git a/app/actions/procedure-commands.c b/app/actions/procedure-commands.c
index bcb4586a0d..db3dff9c0c 100644
--- a/app/actions/procedure-commands.c
+++ b/app/actions/procedure-commands.c
@@ -343,7 +343,7 @@ procedure_commands_run_procedure_async (GimpProcedure  *procedure,
   gimp_procedure_execute_async (procedure, gimp,
                                 gimp_get_user_context (gimp),
                                 progress, args,
-                                GIMP_OBJECT (display), &error);
+                                display, &error);
 
   if (error)
     {
diff --git a/app/actions/vectors-commands.c b/app/actions/vectors-commands.c
index 5a2967ac10..120e600b73 100644
--- a/app/actions/vectors-commands.c
+++ b/app/actions/vectors-commands.c
@@ -410,7 +410,7 @@ vectors_selection_to_vectors_cmd_callback (GimpAction *action,
   gimp_procedure_execute_async (procedure, image->gimp,
                                 action_data_get_context (data),
                                 GIMP_PROGRESS (display), args,
-                                GIMP_OBJECT (display), &error);
+                                display, &error);
 
   gimp_value_array_unref (args);
 
diff --git a/app/core/Makefile.am b/app/core/Makefile.am
index be90e742ed..a2d6f0a2de 100644
--- a/app/core/Makefile.am
+++ b/app/core/Makefile.am
@@ -175,6 +175,8 @@ libappcore_a_sources = \
        gimpdatafactory.h                       \
        gimpdataloaderfactory.c                 \
        gimpdataloaderfactory.h                 \
+       gimpdisplay.c                           \
+       gimpdisplay.h                           \
        gimpdocumentlist.c                      \
        gimpdocumentlist.h                      \
        gimpdrawable.c                          \
diff --git a/app/core/core-types.h b/app/core/core-types.h
index afb27e8211..d31040d06b 100644
--- a/app/core/core-types.h
+++ b/app/core/core-types.h
@@ -96,6 +96,8 @@ typedef struct _GimpAuxItem                     GimpAuxItem;
 typedef struct _Gimp                            Gimp;
 typedef struct _GimpImage                       GimpImage;
 
+typedef struct _GimpDisplay                     GimpDisplay;
+
 
 /*  containers  */
 
diff --git a/app/core/gimp-gui.c b/app/core/gimp-gui.c
index b854fd68d3..42786b8786 100644
--- a/app/core/gimp-gui.c
+++ b/app/core/gimp-gui.c
@@ -28,6 +28,7 @@
 #include "gimp-gui.h"
 #include "gimpcontainer.h"
 #include "gimpcontext.h"
+#include "gimpdisplay.h"
 #include "gimpimage.h"
 #include "gimpprogress.h"
 #include "gimpwaitable.h"
@@ -52,8 +53,6 @@ gimp_gui_init (Gimp *gimp)
   gimp->gui.get_user_time          = NULL;
   gimp->gui.get_theme_dir          = NULL;
   gimp->gui.get_icon_theme_dir     = NULL;
-  gimp->gui.display_get_by_id      = NULL;
-  gimp->gui.display_get_id         = NULL;
   gimp->gui.display_get_window_id  = NULL;
   gimp->gui.display_create         = NULL;
   gimp->gui.display_delete         = NULL;
@@ -310,7 +309,7 @@ gimp_get_window_strategy (Gimp *gimp)
   return NULL;
 }
 
-GimpObject *
+GimpDisplay *
 gimp_get_empty_display (Gimp *gimp)
 {
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
@@ -321,37 +320,12 @@ gimp_get_empty_display (Gimp *gimp)
   return NULL;
 }
 
-GimpObject *
-gimp_get_display_by_id (Gimp *gimp,
-                        gint  id)
-{
-  g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
-
-  if (gimp->gui.display_get_by_id)
-    return gimp->gui.display_get_by_id (gimp, id);
-
-  return NULL;
-}
-
-gint
-gimp_get_display_id (Gimp       *gimp,
-                     GimpObject *display)
-{
-  g_return_val_if_fail (GIMP_IS_GIMP (gimp), -1);
-  g_return_val_if_fail (GIMP_IS_OBJECT (display), -1);
-
-  if (gimp->gui.display_get_id)
-    return gimp->gui.display_get_id (display);
-
-  return -1;
-}
-
 guint32
-gimp_get_display_window_id (Gimp       *gimp,
-                            GimpObject *display)
+gimp_get_display_window_id (Gimp        *gimp,
+                            GimpDisplay *display)
 {
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), -1);
-  g_return_val_if_fail (GIMP_IS_OBJECT (display), -1);
+  g_return_val_if_fail (GIMP_IS_DISPLAY (display), -1);
 
   if (gimp->gui.display_get_window_id)
     return gimp->gui.display_get_window_id (display);
@@ -359,7 +333,7 @@ gimp_get_display_window_id (Gimp       *gimp,
   return -1;
 }
 
-GimpObject *
+GimpDisplay *
 gimp_create_display (Gimp      *gimp,
                      GimpImage *image,
                      GimpUnit   unit,
@@ -377,11 +351,11 @@ gimp_create_display (Gimp      *gimp,
 }
 
 void
-gimp_delete_display (Gimp       *gimp,
-                     GimpObject *display)
+gimp_delete_display (Gimp        *gimp,
+                     GimpDisplay *display)
 {
   g_return_if_fail (GIMP_IS_GIMP (gimp));
-  g_return_if_fail (GIMP_IS_OBJECT (display));
+  g_return_if_fail (GIMP_IS_DISPLAY (display));
 
   if (gimp->gui.display_delete)
     gimp->gui.display_delete (display);
@@ -401,11 +375,11 @@ gimp_reconnect_displays (Gimp      *gimp,
 }
 
 GimpProgress *
-gimp_new_progress (Gimp       *gimp,
-                   GimpObject *display)
+gimp_new_progress (Gimp        *gimp,
+                   GimpDisplay *display)
 {
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
-  g_return_val_if_fail (display == NULL || GIMP_IS_OBJECT (display), NULL);
+  g_return_val_if_fail (display == NULL || GIMP_IS_DISPLAY (display), NULL);
 
   if (gimp->gui.progress_new)
     return gimp->gui.progress_new (gimp, display);
diff --git a/app/core/gimp-gui.h b/app/core/gimp-gui.h
index f4db2c894c..f9a465f0d7 100644
--- a/app/core/gimp-gui.h
+++ b/app/core/gimp-gui.h
@@ -53,23 +53,20 @@ struct _GimpGui
   GFile        * (* get_icon_theme_dir)     (Gimp                *gimp);
 
   GimpObject   * (* get_window_strategy)    (Gimp                *gimp);
-  GimpObject   * (* get_empty_display)      (Gimp                *gimp);
-  GimpObject   * (* display_get_by_id)      (Gimp                *gimp,
-                                             gint                 ID);
-  gint           (* display_get_id)         (GimpObject          *display);
-  guint32        (* display_get_window_id)  (GimpObject          *display);
-  GimpObject   * (* display_create)         (Gimp                *gimp,
+  GimpDisplay  * (* get_empty_display)      (Gimp                *gimp);
+  guint32        (* display_get_window_id)  (GimpDisplay         *display);
+  GimpDisplay  * (* display_create)         (Gimp                *gimp,
                                              GimpImage           *image,
                                              GimpUnit             unit,
                                              gdouble              scale,
                                              GObject             *monitor);
-  void           (* display_delete)         (GimpObject          *display);
+  void           (* display_delete)         (GimpDisplay         *display);
   void           (* displays_reconnect)     (Gimp                *gimp,
                                              GimpImage           *old_image,
                                              GimpImage           *new_image);
 
   GimpProgress * (* progress_new)           (Gimp                *gimp,
-                                             GimpObject          *display);
+                                             GimpDisplay         *display);
   void           (* progress_free)          (Gimp                *gimp,
                                              GimpProgress        *progress);
 
@@ -114,20 +111,20 @@ void           gimp_gui_init               (Gimp                *gimp);
 void           gimp_gui_ungrab             (Gimp                *gimp);
 
 GimpObject   * gimp_get_window_strategy    (Gimp                *gimp);
-GimpObject   * gimp_get_empty_display      (Gimp                *gimp);
-GimpObject   * gimp_get_display_by_id      (Gimp                *gimp,
+GimpDisplay  * gimp_get_empty_display      (Gimp                *gimp);
+GimpDisplay  * gimp_get_display_by_id      (Gimp                *gimp,
                                             gint                 ID);
 gint           gimp_get_display_id         (Gimp                *gimp,
-                                            GimpObject          *display);
+                                            GimpDisplay         *display);
 guint32        gimp_get_display_window_id  (Gimp                *gimp,
-                                            GimpObject          *display);
-GimpObject   * gimp_create_display         (Gimp                *gimp,
+                                            GimpDisplay         *display);
+GimpDisplay  * gimp_create_display         (Gimp                *gimp,
                                             GimpImage           *image,
                                             GimpUnit             unit,
                                             gdouble              scale,
                                             GObject             *monitor);
 void           gimp_delete_display         (Gimp                *gimp,
-                                            GimpObject          *display);
+                                            GimpDisplay         *display);
 void           gimp_reconnect_displays     (Gimp                *gimp,
                                             GimpImage           *old_image,
                                             GimpImage           *new_image);
@@ -152,7 +149,7 @@ void           gimp_wait                   (Gimp                *gimp,
                                             ...) G_GNUC_PRINTF (3, 4);
 
 GimpProgress * gimp_new_progress           (Gimp                *gimp,
-                                            GimpObject          *display);
+                                            GimpDisplay         *display);
 void           gimp_free_progress          (Gimp                *gimp,
                                             GimpProgress        *progress);
 
diff --git a/app/core/gimpcontext.c b/app/core/gimpcontext.c
index 14f2f778c5..605d82caa9 100644
--- a/app/core/gimpcontext.c
+++ b/app/core/gimpcontext.c
@@ -39,6 +39,7 @@
 #include "gimpcontainer.h"
 #include "gimpcontext.h"
 #include "gimpdatafactory.h"
+#include "gimpdisplay.h"
 #include "gimpdynamics.h"
 #include "gimpimagefile.h"
 #include "gimpgradient.h"
@@ -121,10 +122,10 @@ static void gimp_context_real_set_image      (GimpContext      *context,
 
 /*  display  */
 static void gimp_context_display_removed     (GimpContainer    *container,
-                                              gpointer          display,
+                                              GimpDisplay      *display,
                                               GimpContext      *context);
 static void gimp_context_real_set_display    (GimpContext      *context,
-                                              gpointer          display);
+                                              GimpDisplay      *display);
 
 /*  tool  */
 static void gimp_context_tool_dirty          (GimpToolInfo     *tool_info,
@@ -420,7 +421,7 @@ gimp_context_class_init (GimpContextClass *klass)
                   G_STRUCT_OFFSET (GimpContextClass, display_changed),
                   NULL, NULL, NULL,
                   G_TYPE_NONE, 1,
-                  GIMP_TYPE_OBJECT);
+                  GIMP_TYPE_DISPLAY);
 
   gimp_context_signals[TOOL_CHANGED] =
     g_signal_new ("tool-changed",
@@ -644,7 +645,7 @@ gimp_context_class_init (GimpContextClass *klass)
   g_object_class_install_property (object_class, GIMP_CONTEXT_PROP_DISPLAY,
                                    g_param_spec_object (gimp_context_prop_names[GIMP_CONTEXT_PROP_DISPLAY],
                                                         NULL, NULL,
-                                                        GIMP_TYPE_OBJECT,
+                                                        GIMP_TYPE_DISPLAY,
                                                         GIMP_PARAM_READWRITE));
 
   GIMP_CONFIG_PROP_OBJECT (object_class, GIMP_CONTEXT_PROP_TOOL,
@@ -1940,7 +1941,7 @@ gimp_context_real_set_image (GimpContext *context,
 /*****************************************************************************/
 /*  display  *****************************************************************/
 
-gpointer
+GimpDisplay *
 gimp_context_get_display (GimpContext *context)
 {
   g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
@@ -1950,10 +1951,10 @@ gimp_context_get_display (GimpContext *context)
 
 void
 gimp_context_set_display (GimpContext *context,
-                          gpointer     display)
+                          GimpDisplay *display)
 {
   g_return_if_fail (GIMP_IS_CONTEXT (context));
-  g_return_if_fail (display == NULL || GIMP_IS_OBJECT (display));
+  g_return_if_fail (display == NULL || GIMP_IS_DISPLAY (display));
 
   context_find_defined (context, GIMP_CONTEXT_PROP_DISPLAY);
 
@@ -1972,7 +1973,7 @@ gimp_context_display_changed (GimpContext *context)
 
 static void
 gimp_context_display_removed (GimpContainer *container,
-                              gpointer       display,
+                              GimpDisplay   *display,
                               GimpContext   *context)
 {
   if (context->display == display)
@@ -1981,9 +1982,9 @@ gimp_context_display_removed (GimpContainer *container,
 
 static void
 gimp_context_real_set_display (GimpContext *context,
-                               gpointer     display)
+                               GimpDisplay *display)
 {
-  GimpObject *old_display;
+  GimpDisplay *old_display;
 
   if (context->display == display)
     {
diff --git a/app/core/gimpcontext.h b/app/core/gimpcontext.h
index 7f15a4a01c..82ff26a752 100644
--- a/app/core/gimpcontext.h
+++ b/app/core/gimpcontext.h
@@ -56,7 +56,7 @@ struct _GimpContext
   guint32               serialize_props;
 
   GimpImage            *image;
-  gpointer              display;
+  GimpDisplay          *display;
 
   GimpToolInfo         *tool_info;
   gchar                *tool_name;
@@ -111,7 +111,7 @@ struct _GimpContextClass
   void (* image_changed)      (GimpContext          *context,
                                GimpImage            *image);
   void (* display_changed)    (GimpContext          *context,
-                               gpointer              display);
+                               GimpDisplay          *display);
 
   void (* tool_changed)       (GimpContext          *context,
                                GimpToolInfo         *tool_info);
@@ -222,9 +222,9 @@ void             gimp_context_image_changed       (GimpContext     *context);
 
 
 /*  display  */
-gpointer         gimp_context_get_display         (GimpContext     *context);
+GimpDisplay    * gimp_context_get_display         (GimpContext     *context);
 void             gimp_context_set_display         (GimpContext     *context,
-                                                   gpointer         display);
+                                                   GimpDisplay     *display);
 void             gimp_context_display_changed     (GimpContext     *context);
 
 
diff --git a/app/core/gimpdisplay.c b/app/core/gimpdisplay.c
new file mode 100644
index 0000000000..a8aba94ba3
--- /dev/null
+++ b/app/core/gimpdisplay.c
@@ -0,0 +1,195 @@
+/* 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 <gegl.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+#include "libgimpbase/gimpbase.h"
+#include "libgimpmath/gimpmath.h"
+
+#include "core-types.h"
+
+#include "config/gimpguiconfig.h"
+
+#include "core/gimp.h"
+#include "core/gimpcontainer.h"
+#include "core/gimpcontext.h"
+
+#include "gimpdisplay.h"
+
+#include "gimp-intl.h"
+
+enum
+{
+  PROP_0,
+  PROP_ID,
+  PROP_GIMP
+};
+
+
+struct _GimpDisplayPrivate
+{
+  gint id; /* unique identifier for this display */
+};
+
+
+/*  local function prototypes  */
+
+static void     gimp_display_set_property           (GObject             *object,
+                                                     guint                property_id,
+                                                     const GValue        *value,
+                                                     GParamSpec          *pspec);
+static void     gimp_display_get_property           (GObject             *object,
+                                                     guint                property_id,
+                                                     GValue              *value,
+                                                     GParamSpec          *pspec);
+
+
+G_DEFINE_TYPE_WITH_PRIVATE (GimpDisplay, gimp_display, GIMP_TYPE_OBJECT)
+
+#define parent_class gimp_display_parent_class
+
+
+static void
+gimp_display_class_init (GimpDisplayClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->set_property = gimp_display_set_property;
+  object_class->get_property = gimp_display_get_property;
+
+  g_object_class_install_property (object_class, PROP_ID,
+                                   g_param_spec_int ("id",
+                                                     NULL, NULL,
+                                                     0, G_MAXINT, 0,
+                                                     GIMP_PARAM_READABLE));
+
+  g_object_class_install_property (object_class, PROP_GIMP,
+                                   g_param_spec_object ("gimp",
+                                                        NULL, NULL,
+                                                        GIMP_TYPE_GIMP,
+                                                        GIMP_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT_ONLY));
+}
+
+static void
+gimp_display_init (GimpDisplay *display)
+{
+  display->priv = gimp_display_get_instance_private (display);
+}
+
+static void
+gimp_display_set_property (GObject      *object,
+                           guint         property_id,
+                           const GValue *value,
+                           GParamSpec   *pspec)
+{
+  GimpDisplay        *display = GIMP_DISPLAY (object);
+  GimpDisplayPrivate *private = display->priv;
+
+  switch (property_id)
+    {
+    case PROP_GIMP:
+      {
+        gint id;
+
+        display->gimp = g_value_get_object (value); /* don't ref the gimp */
+        display->config = GIMP_DISPLAY_CONFIG (display->gimp->config);
+
+        do
+          {
+            id = display->gimp->next_display_id++;
+
+            if (display->gimp->next_display_id == G_MAXINT)
+              display->gimp->next_display_id = 1;
+          }
+        while (gimp_display_get_by_id (display->gimp, id));
+
+        private->id = id;
+      }
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+static void
+gimp_display_get_property (GObject    *object,
+                           guint       property_id,
+                           GValue     *value,
+                           GParamSpec *pspec)
+{
+  GimpDisplay *display = GIMP_DISPLAY (object);
+
+  switch (property_id)
+    {
+    case PROP_ID:
+      g_value_set_int (value, display->priv->id);
+      break;
+
+    case PROP_GIMP:
+      g_value_set_object (value, display->gimp);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+/*  public functions  */
+
+gint
+gimp_display_get_id (GimpDisplay *display)
+{
+  g_return_val_if_fail (GIMP_IS_DISPLAY (display), -1);
+
+  return display->priv->id;
+}
+
+GimpDisplay *
+gimp_display_get_by_id (Gimp *gimp,
+                        gint  id)
+{
+  GList *list;
+
+  g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
+
+  for (list = gimp_get_display_iter (gimp);
+       list;
+       list = g_list_next (list))
+    {
+      GimpDisplay *display = list->data;
+
+      if (gimp_display_get_id (display) == id)
+        return display;
+    }
+
+  return NULL;
+}
+
+Gimp *
+gimp_display_get_gimp (GimpDisplay *display)
+{
+  g_return_val_if_fail (GIMP_IS_DISPLAY (display), NULL);
+
+  return display->gimp;
+}
diff --git a/app/core/gimpdisplay.h b/app/core/gimpdisplay.h
new file mode 100644
index 0000000000..2ea00c80d4
--- /dev/null
+++ b/app/core/gimpdisplay.h
@@ -0,0 +1,61 @@
+/* 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/>.
+ */
+
+#ifndef __GIMP_DISPLAY_H__
+#define __GIMP_DISPLAY_H__
+
+
+#include "gimpobject.h"
+
+
+#define GIMP_TYPE_DISPLAY            (gimp_display_get_type ())
+#define GIMP_DISPLAY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_DISPLAY, GimpDisplay))
+#define GIMP_DISPLAY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DISPLAY, GimpDisplayClass))
+#define GIMP_IS_DISPLAY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_DISPLAY))
+#define GIMP_IS_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DISPLAY))
+#define GIMP_DISPLAY_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_DISPLAY, GimpDisplayClass))
+
+
+typedef struct _GimpDisplayClass   GimpDisplayClass;
+typedef struct _GimpDisplayPrivate GimpDisplayPrivate;
+
+struct _GimpDisplay
+{
+  GimpObject          parent_instance;
+
+  Gimp               *gimp;
+  GimpDisplayConfig  *config;
+
+  GimpDisplayPrivate *priv;
+};
+
+struct _GimpDisplayClass
+{
+  GimpObjectClass     parent_class;
+};
+
+
+GType         gimp_display_get_type  (void) G_GNUC_CONST;
+
+gint          gimp_display_get_id    (GimpDisplay *display);
+GimpDisplay * gimp_display_get_by_id (Gimp        *gimp,
+                                      gint         id);
+
+Gimp        * gimp_display_get_gimp  (GimpDisplay *display);
+
+
+#endif /*  __GIMP_DISPLAY_H__  */
diff --git a/app/core/gimpparamspecs.c b/app/core/gimpparamspecs.c
index 5182261f4c..1b096ef10d 100644
--- a/app/core/gimpparamspecs.c
+++ b/app/core/gimpparamspecs.c
@@ -25,6 +25,7 @@
 #include "core-types.h"
 
 #include "gimp.h"
+#include "gimpdisplay.h"
 #include "gimpimage.h"
 #include "gimplayer.h"
 #include "gimplayermask.h"
@@ -383,7 +384,7 @@ gimp_param_image_init (GParamSpec *pspec)
 
 static gboolean
 gimp_param_image_validate (GParamSpec *pspec,
-                              GValue     *value)
+                           GValue     *value)
 {
   GimpParamSpecImage *ispec = GIMP_PARAM_SPEC_IMAGE (pspec);
   GimpImage          *image = value->data[0].v_pointer;
@@ -876,10 +877,10 @@ gimp_param_spec_vectors (const gchar *name,
  * GIMP_TYPE_PARAM_DISPLAY
  */
 
-static void       gimp_param_display_class_init  (GParamSpecClass *klass);
-static void       gimp_param_display_init        (GParamSpec      *pspec);
-static gboolean   gimp_param_display_validate    (GParamSpec      *pspec,
-                                                     GValue          *value);
+static void       gimp_param_display_class_init (GParamSpecClass *klass);
+static void       gimp_param_display_init       (GParamSpec      *pspec);
+static gboolean   gimp_param_display_validate   (GParamSpec      *pspec,
+                                                 GValue          *value);
 
 GType
 gimp_param_display_get_type (void)
@@ -909,33 +910,29 @@ gimp_param_display_get_type (void)
 static void
 gimp_param_display_class_init (GParamSpecClass *klass)
 {
-  klass->value_type = g_type_from_name ("GimpDisplay");
-
-  g_assert (klass->value_type != G_TYPE_NONE);
-
+  klass->value_type     = GIMP_TYPE_DISPLAY;
   klass->value_validate = gimp_param_display_validate;
 }
 
 static void
 gimp_param_display_init (GParamSpec *pspec)
 {
-  GimpParamSpecDisplay *ispec = GIMP_PARAM_SPEC_DISPLAY (pspec);
+  GimpParamSpecDisplay *dspec = GIMP_PARAM_SPEC_DISPLAY (pspec);
 
-  ispec->none_ok = FALSE;
+  dspec->none_ok = FALSE;
 }
 
 static gboolean
 gimp_param_display_validate (GParamSpec *pspec,
                              GValue     *value)
 {
-  GimpParamSpecDisplay *ispec   = GIMP_PARAM_SPEC_DISPLAY (pspec);
-  GObject              *display = value->data[0].v_pointer;
+  GimpParamSpecDisplay *dspec   = GIMP_PARAM_SPEC_DISPLAY (pspec);
+  GimpDisplay          *display = value->data[0].v_pointer;
 
-  if (! ispec->none_ok && display == NULL)
+  if (! dspec->none_ok && display == NULL)
     return TRUE;
 
-  if (display && ! g_value_type_compatible (G_OBJECT_TYPE (display),
-                                            G_PARAM_SPEC_VALUE_TYPE (pspec)))
+  if (display && ! GIMP_IS_DISPLAY (display))
     {
       g_object_unref (display);
       value->data[0].v_pointer = NULL;
@@ -952,12 +949,12 @@ gimp_param_spec_display (const gchar *name,
                          gboolean     none_ok,
                          GParamFlags  flags)
 {
-  GimpParamSpecDisplay *ispec;
+  GimpParamSpecDisplay *dspec;
 
-  ispec = g_param_spec_internal (GIMP_TYPE_PARAM_DISPLAY,
+  dspec = g_param_spec_internal (GIMP_TYPE_PARAM_DISPLAY,
                                  name, nick, blurb, flags);
 
-  ispec->none_ok = none_ok ? TRUE : FALSE;
+  dspec->none_ok = none_ok ? TRUE : FALSE;
 
-  return G_PARAM_SPEC (ispec);
+  return G_PARAM_SPEC (dspec);
 }
diff --git a/app/core/gimpparamspecs.h b/app/core/gimpparamspecs.h
index c89a615718..0405835b4e 100644
--- a/app/core/gimpparamspecs.h
+++ b/app/core/gimpparamspecs.h
@@ -210,13 +210,13 @@ struct _GimpParamSpecChannel
   GimpParamSpecDrawable parent_instance;
 };
 
-GType         gimp_param_channel_get_type (void) G_GNUC_CONST;
+GType        gimp_param_channel_get_type (void) G_GNUC_CONST;
 
-GParamSpec  * gimp_param_spec_channel     (const gchar  *name,
-                                           const gchar  *nick,
-                                           const gchar  *blurb,
-                                           gboolean      none_ok,
-                                           GParamFlags   flags);
+GParamSpec * gimp_param_spec_channel     (const gchar  *name,
+                                          const gchar  *nick,
+                                          const gchar  *blurb,
+                                          gboolean      none_ok,
+                                          GParamFlags   flags);
 
 
 /*
@@ -305,7 +305,7 @@ GParamSpec * gimp_param_spec_vectors     (const gchar  *name,
  */
 
 #define GIMP_VALUE_HOLDS_DISPLAY(value)   (G_TYPE_CHECK_VALUE_TYPE ((value),\
-                                           GIMP_TYPE_OBJECT))
+                                           GIMP_TYPE_DISPLAY))
 
 #define GIMP_TYPE_PARAM_DISPLAY           (gimp_param_display_get_type ())
 #define GIMP_PARAM_SPEC_DISPLAY(pspec)    (G_TYPE_CHECK_INSTANCE_CAST ((pspec), GIMP_TYPE_PARAM_DISPLAY, 
GimpParamSpecDisplay))
diff --git a/app/display/display-types.h b/app/display/display-types.h
index 6de751dc1c..302f465d19 100644
--- a/app/display/display-types.h
+++ b/app/display/display-types.h
@@ -28,7 +28,6 @@ typedef struct _GimpCanvas               GimpCanvas;
 typedef struct _GimpCanvasGroup          GimpCanvasGroup;
 typedef struct _GimpCanvasItem           GimpCanvasItem;
 
-typedef struct _GimpDisplay              GimpDisplay;
 typedef struct _GimpDisplayShell         GimpDisplayShell;
 typedef struct _GimpMotionBuffer         GimpMotionBuffer;
 
diff --git a/app/display/gimpdisplay.c b/app/display/gimpdisplay.c
index 7c7bfafadb..905cdc7142 100644
--- a/app/display/gimpdisplay.c
+++ b/app/display/gimpdisplay.c
@@ -59,19 +59,13 @@
 enum
 {
   PROP_0,
-  PROP_ID,
-  PROP_GIMP,
   PROP_IMAGE,
   PROP_SHELL
 };
 
 
-typedef struct _GimpDisplayPrivate GimpDisplayPrivate;
-
-struct _GimpDisplayPrivate
+struct _GimpDisplayImplPrivate
 {
-  gint            ID;           /*  unique identifier for this display  */
-
   GimpImage      *image;        /*  pointer to the associated image     */
   gint            instance;     /*  the instance # of this display as
                                  *  taken from the image at creation    */
@@ -80,9 +74,6 @@ struct _GimpDisplayPrivate
   cairo_region_t *update_region;
 };
 
-#define GIMP_DISPLAY_GET_PRIVATE(display) \
-        ((GimpDisplayPrivate *) gimp_display_get_instance_private ((GimpDisplay *) (display)))
-
 
 /*  local function prototypes  */
 
@@ -125,35 +116,22 @@ static void     gimp_display_paint_area             (GimpDisplay         *displa
                                                      gint                 h);
 
 
-G_DEFINE_TYPE_WITH_CODE (GimpDisplay, gimp_display, GIMP_TYPE_OBJECT,
-                         G_ADD_PRIVATE (GimpDisplay)
+G_DEFINE_TYPE_WITH_CODE (GimpDisplayImpl, gimp_display_impl, GIMP_TYPE_DISPLAY,
+                         G_ADD_PRIVATE (GimpDisplayImpl)
                          G_IMPLEMENT_INTERFACE (GIMP_TYPE_PROGRESS,
                                                 gimp_display_progress_iface_init))
 
-#define parent_class gimp_display_parent_class
+#define parent_class gimp_display_impl_parent_class
 
 
 static void
-gimp_display_class_init (GimpDisplayClass *klass)
+gimp_display_impl_class_init (GimpDisplayImplClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   object_class->set_property = gimp_display_set_property;
   object_class->get_property = gimp_display_get_property;
 
-  g_object_class_install_property (object_class, PROP_ID,
-                                   g_param_spec_int ("id",
-                                                     NULL, NULL,
-                                                     0, G_MAXINT, 0,
-                                                     GIMP_PARAM_READABLE));
-
-  g_object_class_install_property (object_class, PROP_GIMP,
-                                   g_param_spec_object ("gimp",
-                                                        NULL, NULL,
-                                                        GIMP_TYPE_GIMP,
-                                                        GIMP_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT_ONLY));
-
   g_object_class_install_property (object_class, PROP_IMAGE,
                                    g_param_spec_object ("image",
                                                         NULL, NULL,
@@ -168,8 +146,9 @@ gimp_display_class_init (GimpDisplayClass *klass)
 }
 
 static void
-gimp_display_init (GimpDisplay *display)
+gimp_display_impl_init (GimpDisplayImpl *display)
 {
+  display->priv = gimp_display_impl_get_instance_private (display);
 }
 
 static void
@@ -192,31 +171,8 @@ gimp_display_set_property (GObject      *object,
                            const GValue *value,
                            GParamSpec   *pspec)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (object);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
-
   switch (property_id)
     {
-    case PROP_GIMP:
-      {
-        gint ID;
-
-        display->gimp = g_value_get_object (value); /* don't ref the gimp */
-        display->config = GIMP_DISPLAY_CONFIG (display->gimp->config);
-
-        do
-          {
-            ID = display->gimp->next_display_id++;
-
-            if (display->gimp->next_display_id == G_MAXINT)
-              display->gimp->next_display_id = 1;
-          }
-        while (gimp_display_get_by_id (display->gimp, ID));
-
-        private->ID = ID;
-      }
-      break;
-
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
@@ -229,25 +185,16 @@ gimp_display_get_property (GObject    *object,
                            GValue     *value,
                            GParamSpec *pspec)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (object);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImpl *display = GIMP_DISPLAY_IMPL (object);
 
   switch (property_id)
     {
-    case PROP_ID:
-      g_value_set_int (value, private->ID);
-      break;
-
-    case PROP_GIMP:
-      g_value_set_object (value, display->gimp);
-      break;
-
     case PROP_IMAGE:
-      g_value_set_object (value, private->image);
+      g_value_set_object (value, display->priv->image);
       break;
 
     case PROP_SHELL:
-      g_value_set_object (value, private->shell);
+      g_value_set_object (value, display->priv->shell);
       break;
 
     default:
@@ -261,11 +208,11 @@ gimp_display_progress_start (GimpProgress *progress,
                              gboolean      cancellable,
                              const gchar  *message)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (progress);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImpl *display = GIMP_DISPLAY_IMPL (progress);
 
-  if (private->shell)
-    return gimp_progress_start (GIMP_PROGRESS (private->shell), cancellable,
+  if (display->priv->shell)
+    return gimp_progress_start (GIMP_PROGRESS (display->priv->shell),
+                                cancellable,
                                 "%s", message);
 
   return NULL;
@@ -274,21 +221,19 @@ gimp_display_progress_start (GimpProgress *progress,
 static void
 gimp_display_progress_end (GimpProgress *progress)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (progress);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImpl *display = GIMP_DISPLAY_IMPL (progress);
 
-  if (private->shell)
-    gimp_progress_end (GIMP_PROGRESS (private->shell));
+  if (display->priv->shell)
+    gimp_progress_end (GIMP_PROGRESS (display->priv->shell));
 }
 
 static gboolean
 gimp_display_progress_is_active (GimpProgress *progress)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (progress);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImpl *display = GIMP_DISPLAY_IMPL (progress);
 
-  if (private->shell)
-    return gimp_progress_is_active (GIMP_PROGRESS (private->shell));
+  if (display->priv->shell)
+    return gimp_progress_is_active (GIMP_PROGRESS (display->priv->shell));
 
   return FALSE;
 }
@@ -297,32 +242,31 @@ static void
 gimp_display_progress_set_text (GimpProgress *progress,
                                 const gchar  *message)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (progress);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImpl *display = GIMP_DISPLAY_IMPL (progress);
 
-  if (private->shell)
-    gimp_progress_set_text_literal (GIMP_PROGRESS (private->shell), message);
+  if (display->priv->shell)
+    gimp_progress_set_text_literal (GIMP_PROGRESS (display->priv->shell),
+                                    message);
 }
 
 static void
 gimp_display_progress_set_value (GimpProgress *progress,
                                  gdouble       percentage)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (progress);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImpl *display = GIMP_DISPLAY_IMPL (progress);
 
-  if (private->shell)
-    gimp_progress_set_value (GIMP_PROGRESS (private->shell), percentage);
+  if (display->priv->shell)
+    gimp_progress_set_value (GIMP_PROGRESS (display->priv->shell),
+                             percentage);
 }
 
 static gdouble
 gimp_display_progress_get_value (GimpProgress *progress)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (progress);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImpl *display = GIMP_DISPLAY_IMPL (progress);
 
-  if (private->shell)
-    return gimp_progress_get_value (GIMP_PROGRESS (private->shell));
+  if (display->priv->shell)
+    return gimp_progress_get_value (GIMP_PROGRESS (display->priv->shell));
 
   return 0.0;
 }
@@ -330,21 +274,19 @@ gimp_display_progress_get_value (GimpProgress *progress)
 static void
 gimp_display_progress_pulse (GimpProgress *progress)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (progress);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImpl *display = GIMP_DISPLAY_IMPL (progress);
 
-  if (private->shell)
-    gimp_progress_pulse (GIMP_PROGRESS (private->shell));
+  if (display->priv->shell)
+    gimp_progress_pulse (GIMP_PROGRESS (display->priv->shell));
 }
 
 static guint32
 gimp_display_progress_get_window_id (GimpProgress *progress)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (progress);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImpl *display = GIMP_DISPLAY_IMPL (progress);
 
-  if (private->shell)
-    return gimp_progress_get_window_id (GIMP_PROGRESS (private->shell));
+  if (display->priv->shell)
+    return gimp_progress_get_window_id (GIMP_PROGRESS (display->priv->shell));
 
   return 0;
 }
@@ -356,11 +298,10 @@ gimp_display_progress_message (GimpProgress        *progress,
                                const gchar         *domain,
                                const gchar         *message)
 {
-  GimpDisplay        *display = GIMP_DISPLAY (progress);
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImpl *display = GIMP_DISPLAY_IMPL (progress);
 
-  if (private->shell)
-    return gimp_progress_message (GIMP_PROGRESS (private->shell), gimp,
+  if (display->priv->shell)
+    return gimp_progress_message (GIMP_PROGRESS (display->priv->shell), gimp,
                                   severity, domain, message);
 
   return FALSE;
@@ -385,10 +326,10 @@ gimp_display_new (Gimp              *gimp,
                   GimpDialogFactory *dialog_factory,
                   GdkMonitor        *monitor)
 {
-  GimpDisplay        *display;
-  GimpDisplayPrivate *private;
-  GimpImageWindow    *window = NULL;
-  GimpDisplayShell   *shell;
+  GimpDisplay            *display;
+  GimpDisplayImplPrivate *private;
+  GimpImageWindow        *window = NULL;
+  GimpDisplayShell       *shell;
 
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
   g_return_val_if_fail (image == NULL || GIMP_IS_IMAGE (image), NULL);
@@ -398,11 +339,11 @@ gimp_display_new (Gimp              *gimp,
   if (gimp->no_interface)
     return NULL;
 
-  display = g_object_new (GIMP_TYPE_DISPLAY,
+  display = g_object_new (GIMP_TYPE_DISPLAY_IMPL,
                           "gimp", gimp,
                           NULL);
 
-  private = GIMP_DISPLAY_GET_PRIVATE (display);
+  private = GIMP_DISPLAY_IMPL (display)->priv;
 
   /*  refs the image  */
   if (image)
@@ -472,12 +413,12 @@ gimp_display_new (Gimp              *gimp,
 void
 gimp_display_delete (GimpDisplay *display)
 {
-  GimpDisplayPrivate *private;
-  GimpTool           *active_tool;
+  GimpDisplayImplPrivate *private;
+  GimpTool               *active_tool;
 
   g_return_if_fail (GIMP_IS_DISPLAY (display));
 
-  private = GIMP_DISPLAY_GET_PRIVATE (display);
+  private = GIMP_DISPLAY_IMPL (display)->priv;
 
   /* remove the display from the list */
   gimp_container_remove (display->gimp->displays, GIMP_OBJECT (display));
@@ -548,39 +489,6 @@ gimp_display_close (GimpDisplay *display)
     }
 }
 
-gint
-gimp_display_get_id (GimpDisplay *display)
-{
-  GimpDisplayPrivate *private;
-
-  g_return_val_if_fail (GIMP_IS_DISPLAY (display), -1);
-
-  private = GIMP_DISPLAY_GET_PRIVATE (display);
-
-  return private->ID;
-}
-
-GimpDisplay *
-gimp_display_get_by_id (Gimp *gimp,
-                        gint  id)
-{
-  GList *list;
-
-  g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
-
-  for (list = gimp_get_display_iter (gimp);
-       list;
-       list = g_list_next (list))
-    {
-      GimpDisplay *display = list->data;
-
-      if (gimp_display_get_id (display) == id)
-        return display;
-    }
-
-  return NULL;
-}
-
 /**
  * gimp_display_get_action_name:
  * @display:
@@ -597,34 +505,26 @@ gimp_display_get_action_name (GimpDisplay *display)
                           gimp_display_get_id (display));
 }
 
-Gimp *
-gimp_display_get_gimp (GimpDisplay *display)
-{
-  g_return_val_if_fail (GIMP_IS_DISPLAY (display), NULL);
-
-  return display->gimp;
-}
-
 GimpImage *
 gimp_display_get_image (GimpDisplay *display)
 {
   g_return_val_if_fail (GIMP_IS_DISPLAY (display), NULL);
 
-  return GIMP_DISPLAY_GET_PRIVATE (display)->image;
+  return GIMP_DISPLAY_IMPL (display)->priv->image;
 }
 
 void
 gimp_display_set_image (GimpDisplay *display,
                         GimpImage   *image)
 {
-  GimpDisplayPrivate *private;
-  GimpImage          *old_image = NULL;
-  GimpDisplayShell   *shell;
+  GimpDisplayImplPrivate *private;
+  GimpImage              *old_image = NULL;
+  GimpDisplayShell       *shell;
 
   g_return_if_fail (GIMP_IS_DISPLAY (display));
   g_return_if_fail (image == NULL || GIMP_IS_IMAGE (image));
 
-  private = GIMP_DISPLAY_GET_PRIVATE (display);
+  private = GIMP_DISPLAY_IMPL (display)->priv;
 
   shell = gimp_display_get_shell (display);
 
@@ -694,36 +594,28 @@ gimp_display_set_image (GimpDisplay *display,
 gint
 gimp_display_get_instance (GimpDisplay *display)
 {
-  GimpDisplayPrivate *private;
-
   g_return_val_if_fail (GIMP_IS_DISPLAY (display), 0);
 
-  private = GIMP_DISPLAY_GET_PRIVATE (display);
-
-  return private->instance;
+  return GIMP_DISPLAY_IMPL (display)->priv->instance;
 }
 
 GimpDisplayShell *
 gimp_display_get_shell (GimpDisplay *display)
 {
-  GimpDisplayPrivate *private;
-
   g_return_val_if_fail (GIMP_IS_DISPLAY (display), NULL);
 
-  private = GIMP_DISPLAY_GET_PRIVATE (display);
-
-  return GIMP_DISPLAY_SHELL (private->shell);
+  return GIMP_DISPLAY_SHELL (GIMP_DISPLAY_IMPL (display)->priv->shell);
 }
 
 void
 gimp_display_empty (GimpDisplay *display)
 {
-  GimpDisplayPrivate *private;
-  GList              *iter;
+  GimpDisplayImplPrivate *private;
+  GList                 *iter;
 
   g_return_if_fail (GIMP_IS_DISPLAY (display));
 
-  private = GIMP_DISPLAY_GET_PRIVATE (display);
+  private = GIMP_DISPLAY_IMPL (display)->priv;
 
   g_return_if_fail (GIMP_IS_IMAGE (private->image));
 
@@ -746,12 +638,12 @@ gimp_display_fill (GimpDisplay *display,
                    GimpUnit     unit,
                    gdouble      scale)
 {
-  GimpDisplayPrivate *private;
+  GimpDisplayImplPrivate *private;
 
   g_return_if_fail (GIMP_IS_DISPLAY (display));
   g_return_if_fail (GIMP_IS_IMAGE (image));
 
-  private = GIMP_DISPLAY_GET_PRIVATE (display);
+  private = GIMP_DISPLAY_IMPL (display)->priv;
 
   g_return_if_fail (private->image == NULL);
 
@@ -769,11 +661,11 @@ gimp_display_update_area (GimpDisplay *display,
                           gint         w,
                           gint         h)
 {
-  GimpDisplayPrivate *private;
+  GimpDisplayImplPrivate *private;
 
   g_return_if_fail (GIMP_IS_DISPLAY (display));
 
-  private = GIMP_DISPLAY_GET_PRIVATE (display);
+  private = GIMP_DISPLAY_IMPL (display)->priv;
 
   if (now)
     {
@@ -824,7 +716,7 @@ gimp_display_flush_now (GimpDisplay *display)
 static void
 gimp_display_flush_update_region (GimpDisplay *display)
 {
-  GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display);
+  GimpDisplayImplPrivate *private = GIMP_DISPLAY_IMPL (display)->priv;
 
   if (private->update_region)
     {
@@ -856,12 +748,12 @@ gimp_display_paint_area (GimpDisplay *display,
                          gint         w,
                          gint         h)
 {
-  GimpDisplayPrivate *private      = GIMP_DISPLAY_GET_PRIVATE (display);
-  GimpDisplayShell   *shell        = gimp_display_get_shell (display);
-  gint                image_width  = gimp_image_get_width  (private->image);
-  gint                image_height = gimp_image_get_height (private->image);
-  gint                x1, y1, x2, y2;
-  gdouble             x1_f, y1_f, x2_f, y2_f;
+  GimpDisplayImplPrivate *private      = GIMP_DISPLAY_IMPL (display)->priv;
+  GimpDisplayShell       *shell        = gimp_display_get_shell (display);
+  gint                    image_width  = gimp_image_get_width  (private->image);
+  gint                    image_height = gimp_image_get_height (private->image);
+  gint                    x1, y1, x2, y2;
+  gdouble                 x1_f, y1_f, x2_f, y2_f;
 
   /*  Bounds check  */
   x1 = CLAMP (x,     0, image_width);
diff --git a/app/display/gimpdisplay.h b/app/display/gimpdisplay.h
index 43d70d59b0..6fbb5154fa 100644
--- a/app/display/gimpdisplay.h
+++ b/app/display/gimpdisplay.h
@@ -15,39 +15,41 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-#ifndef __GIMP_DISPLAY_H__
-#define __GIMP_DISPLAY_H__
+#ifndef __GIMP_DISPLAY_IMPL_H__
+#define __GIMP_DISPLAY_IMPL_H__
 
 
-#include "core/gimpobject.h"
+#include "core/gimpdisplay.h"
 
 
-#define GIMP_TYPE_DISPLAY            (gimp_display_get_type ())
-#define GIMP_DISPLAY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_DISPLAY, GimpDisplay))
-#define GIMP_DISPLAY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DISPLAY, GimpDisplayClass))
-#define GIMP_IS_DISPLAY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_DISPLAY))
-#define GIMP_IS_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DISPLAY))
-#define GIMP_DISPLAY_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_DISPLAY, GimpDisplayClass))
+#define GIMP_TYPE_DISPLAY_IMPL            (gimp_display_impl_get_type ())
+#define GIMP_DISPLAY_IMPL(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_DISPLAY_IMPL, 
GimpDisplayImpl))
+#define GIMP_DISPLAY_IMPL_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DISPLAY_IMPL, 
GimpDisplayImplClass))
+#define GIMP_IS_DISPLAY_IMPL(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_DISPLAY_IMPL))
+#define GIMP_IS_DISPLAY_IMPL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DISPLAY_IMPL))
+#define GIMP_DISPLAY_IMPL_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_DISPLAY_IMPL, 
GimpDisplayImplClass))
 
 
-typedef struct _GimpDisplayClass GimpDisplayClass;
+typedef struct _GimpDisplayImpl        GimpDisplayImpl;
+typedef struct _GimpDisplayImplClass   GimpDisplayImplClass;
+typedef struct _GimpDisplayImplPrivate GimpDisplayImplPrivate;
 
-struct _GimpDisplay
+
+struct _GimpDisplayImpl
 {
-  GimpObject         parent_instance;
+  GimpDisplay             parent_instance;
 
-  Gimp              *gimp;
-  GimpDisplayConfig *config;
+  GimpDisplayImplPrivate *priv;
 
 };
 
-struct _GimpDisplayClass
+struct _GimpDisplayImplClass
 {
-  GimpObjectClass  parent_class;
+  GimpDisplayClass  parent_class;
 };
 
 
-GType              gimp_display_get_type        (void) G_GNUC_CONST;
+GType              gimp_display_impl_get_type   (void) G_GNUC_CONST;
 
 GimpDisplay      * gimp_display_new             (Gimp              *gimp,
                                                  GimpImage         *image,
@@ -59,14 +61,8 @@ GimpDisplay      * gimp_display_new             (Gimp              *gimp,
 void               gimp_display_delete          (GimpDisplay       *display);
 void               gimp_display_close           (GimpDisplay       *display);
 
-gint               gimp_display_get_id          (GimpDisplay       *display);
-GimpDisplay      * gimp_display_get_by_id       (Gimp              *gimp,
-                                                 gint               id);
-
 gchar            * gimp_display_get_action_name (GimpDisplay       *display);
 
-Gimp             * gimp_display_get_gimp        (GimpDisplay       *display);
-
 GimpImage        * gimp_display_get_image       (GimpDisplay       *display);
 void               gimp_display_set_image       (GimpDisplay       *display,
                                                  GimpImage         *image);
@@ -92,4 +88,4 @@ void               gimp_display_flush           (GimpDisplay       *display);
 void               gimp_display_flush_now       (GimpDisplay       *display);
 
 
-#endif /*  __GIMP_DISPLAY_H__  */
+#endif /*  __GIMP_DISPLAY_IMPL_H__  */
diff --git a/app/file/file-open.c b/app/file/file-open.c
index b87e6e7005..9f3a21b96d 100644
--- a/app/file/file-open.c
+++ b/app/file/file-open.c
@@ -682,7 +682,7 @@ file_open_from_command_line (Gimp     *gimp,
 
 {
   GimpImage         *image;
-  GimpObject        *display;
+  GimpDisplay       *display;
   GimpPDBStatusType  status;
   gboolean           success = FALSE;
   GError            *error   = NULL;
diff --git a/app/gui/gui-vtable.c b/app/gui/gui-vtable.c
index 09487382f1..191c5b1a75 100644
--- a/app/gui/gui-vtable.c
+++ b/app/gui/gui-vtable.c
@@ -128,17 +128,14 @@ static guint32        gui_get_user_time          (Gimp                *gimp);
 static GFile        * gui_get_theme_dir          (Gimp                *gimp);
 static GFile        * gui_get_icon_theme_dir     (Gimp                *gimp);
 static GimpObject   * gui_get_window_strategy    (Gimp                *gimp);
-static GimpObject   * gui_get_empty_display      (Gimp                *gimp);
-static GimpObject   * gui_display_get_by_id      (Gimp                *gimp,
-                                                  gint                 ID);
-static gint           gui_display_get_id         (GimpObject          *display);
-static guint32        gui_display_get_window_id  (GimpObject          *display);
-static GimpObject   * gui_display_create         (Gimp                *gimp,
+static GimpDisplay  * gui_get_empty_display      (Gimp                *gimp);
+static guint32        gui_display_get_window_id  (GimpDisplay         *display);
+static GimpDisplay  * gui_display_create         (Gimp                *gimp,
                                                   GimpImage           *image,
                                                   GimpUnit             unit,
                                                   gdouble              scale,
                                                   GObject             *monitor);
-static void           gui_display_delete         (GimpObject          *display);
+static void           gui_display_delete         (GimpDisplay         *display);
 static void           gui_displays_reconnect     (Gimp                *gimp,
                                                   GimpImage           *old_image,
                                                   GimpImage           *new_image);
@@ -146,7 +143,7 @@ static gboolean       gui_wait                   (Gimp                *gimp,
                                                   GimpWaitable        *waitable,
                                                   const gchar         *message);
 static GimpProgress * gui_new_progress           (Gimp                *gimp,
-                                                  GimpObject          *display);
+                                                  GimpDisplay         *display);
 static void           gui_free_progress          (Gimp                *gimp,
                                                   GimpProgress        *progress);
 static gboolean       gui_pdb_dialog_new         (Gimp                *gimp,
@@ -203,8 +200,6 @@ gui_vtable_init (Gimp *gimp)
   gimp->gui.get_icon_theme_dir     = gui_get_icon_theme_dir;
   gimp->gui.get_window_strategy    = gui_get_window_strategy;
   gimp->gui.get_empty_display      = gui_get_empty_display;
-  gimp->gui.display_get_by_id      = gui_display_get_by_id;
-  gimp->gui.display_get_id         = gui_display_get_id;
   gimp->gui.display_get_window_id  = gui_display_get_window_id;
   gimp->gui.display_create         = gui_display_create;
   gimp->gui.display_delete         = gui_display_delete;
@@ -345,16 +340,16 @@ gui_get_window_strategy (Gimp *gimp)
     return gimp_multi_window_strategy_get_singleton ();
 }
 
-static GimpObject *
+static GimpDisplay *
 gui_get_empty_display (Gimp *gimp)
 {
-  GimpObject *display = NULL;
+  GimpDisplay *display = NULL;
 
   if (gimp_container_get_n_children (gimp->displays) == 1)
     {
-      display = gimp_container_get_first_child (gimp->displays);
+      display = (GimpDisplay *) gimp_container_get_first_child (gimp->displays);
 
-      if (gimp_display_get_image (GIMP_DISPLAY (display)))
+      if (gimp_display_get_image (display))
         {
           /* The display was not empty */
           display = NULL;
@@ -364,21 +359,8 @@ gui_get_empty_display (Gimp *gimp)
   return display;
 }
 
-static GimpObject *
-gui_display_get_by_id (Gimp *gimp,
-                       gint  id)
-{
-  return (GimpObject *) gimp_display_get_by_id (gimp, id);
-}
-
-static gint
-gui_display_get_id (GimpObject *display)
-{
-  return gimp_display_get_id (GIMP_DISPLAY (display));
-}
-
 static guint32
-gui_display_get_window_id (GimpObject *display)
+gui_display_get_window_id (GimpDisplay *display)
 {
   GimpDisplay      *disp  = GIMP_DISPLAY (display);
   GimpDisplayShell *shell = gimp_display_get_shell (disp);
@@ -394,7 +376,7 @@ gui_display_get_window_id (GimpObject *display)
   return 0;
 }
 
-static GimpObject *
+static GimpDisplay *
 gui_display_create (Gimp      *gimp,
                     GimpImage *image,
                     GimpUnit   unit,
@@ -433,13 +415,13 @@ gui_display_create (Gimp      *gimp,
       gimp_context_set_display (context, display);
     }
 
-  return GIMP_OBJECT (display);
+  return display;
 }
 
 static void
-gui_display_delete (GimpObject *display)
+gui_display_delete (GimpDisplay *display)
 {
-  gimp_display_close (GIMP_DISPLAY (display));
+  gimp_display_close (display);
 }
 
 static void
@@ -563,8 +545,8 @@ gui_wait (Gimp         *gimp,
 }
 
 static GimpProgress *
-gui_new_progress (Gimp       *gimp,
-                  GimpObject *display)
+gui_new_progress (Gimp        *gimp,
+                  GimpDisplay *display)
 {
   g_return_val_if_fail (display == NULL || GIMP_IS_DISPLAY (display), NULL);
 
diff --git a/app/pdb/display-cmds.c b/app/pdb/display-cmds.c
index c98d6e4ba1..2f84486fc8 100644
--- a/app/pdb/display-cmds.c
+++ b/app/pdb/display-cmds.c
@@ -29,6 +29,7 @@
 
 #include "core/gimp.h"
 #include "core/gimpcontainer.h"
+#include "core/gimpdisplay.h"
 #include "core/gimpimage.h"
 #include "core/gimpparamspecs.h"
 
@@ -54,7 +55,7 @@ display_id_is_valid_invoker (GimpProcedure         *procedure,
 
   if (success)
     {
-      valid = (gimp_get_display_by_id (gimp, display_id) != NULL);
+      valid = (gimp_display_get_by_id (gimp, display_id) != NULL);
     }
 
   return_vals = gimp_procedure_get_return_values (procedure, success,
@@ -77,7 +78,7 @@ display_new_invoker (GimpProcedure         *procedure,
   gboolean success = TRUE;
   GimpValueArray *return_vals;
   GimpImage *image;
-  GimpObject *display = NULL;
+  GimpDisplay *display = NULL;
 
   image = g_value_get_object (gimp_value_array_index (args, 0));
 
@@ -117,7 +118,7 @@ display_delete_invoker (GimpProcedure         *procedure,
                         GError               **error)
 {
   gboolean success = TRUE;
-  GimpObject *display;
+  GimpDisplay *display;
 
   display = g_value_get_object (gimp_value_array_index (args, 0));
 
@@ -140,7 +141,7 @@ display_get_window_handle_invoker (GimpProcedure         *procedure,
 {
   gboolean success = TRUE;
   GimpValueArray *return_vals;
-  GimpObject *display;
+  GimpDisplay *display;
   gint window = 0;
 
   display = g_value_get_object (gimp_value_array_index (args, 0));
diff --git a/app/pdb/gimpprocedure.c b/app/pdb/gimpprocedure.c
index d2de0ffdf5..1bcf01ee6f 100644
--- a/app/pdb/gimpprocedure.c
+++ b/app/pdb/gimpprocedure.c
@@ -30,6 +30,7 @@
 #include "core/gimp.h"
 #include "core/gimp-memsize.h"
 #include "core/gimpchannel.h"
+#include "core/gimpdisplay.h"
 #include "core/gimplayer.h"
 #include "core/gimpparamspecs.h"
 #include "core/gimpprogress.h"
@@ -66,7 +67,7 @@ static void        gimp_procedure_real_execute_async    (GimpProcedure   *proced
                                                          GimpContext     *context,
                                                          GimpProgress    *progress,
                                                          GimpValueArray  *args,
-                                                         GimpObject      *display);
+                                                         GimpDisplay     *display);
 
 static void          gimp_procedure_free_strings        (GimpProcedure   *procedure);
 static gboolean      gimp_procedure_validate_args       (GimpProcedure   *procedure,
@@ -220,7 +221,7 @@ gimp_procedure_real_execute_async (GimpProcedure  *procedure,
                                    GimpContext    *context,
                                    GimpProgress   *progress,
                                    GimpValueArray *args,
-                                   GimpObject     *display)
+                                   GimpDisplay    *display)
 {
   GimpValueArray *return_vals;
   GError         *error = NULL;
@@ -496,7 +497,7 @@ gimp_procedure_execute_async (GimpProcedure  *procedure,
                               GimpContext    *context,
                               GimpProgress   *progress,
                               GimpValueArray *args,
-                              GimpObject     *display,
+                              GimpDisplay    *display,
                               GError        **error)
 {
   g_return_if_fail (GIMP_IS_PROCEDURE (procedure));
@@ -504,7 +505,7 @@ gimp_procedure_execute_async (GimpProcedure  *procedure,
   g_return_if_fail (GIMP_IS_CONTEXT (context));
   g_return_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress));
   g_return_if_fail (args != NULL);
-  g_return_if_fail (display == NULL || GIMP_IS_OBJECT (display));
+  g_return_if_fail (display == NULL || GIMP_IS_DISPLAY (display));
   g_return_if_fail (error == NULL || *error == NULL);
 
   if (gimp_procedure_validate_args (procedure,
diff --git a/app/pdb/gimpprocedure.h b/app/pdb/gimpprocedure.h
index 5990c25c38..d3cdcf42af 100644
--- a/app/pdb/gimpprocedure.h
+++ b/app/pdb/gimpprocedure.h
@@ -87,7 +87,7 @@ struct _GimpProcedureClass
                                        GimpContext     *context,
                                        GimpProgress    *progress,
                                        GimpValueArray  *args,
-                                       GimpObject      *display);
+                                       GimpDisplay     *display);
 };
 
 
@@ -150,7 +150,7 @@ void             gimp_procedure_execute_async      (GimpProcedure    *procedure,
                                                     GimpContext      *context,
                                                     GimpProgress     *progress,
                                                     GimpValueArray   *args,
-                                                    GimpObject       *display,
+                                                    GimpDisplay      *display,
                                                     GError          **error);
 
 gint             gimp_procedure_name_compare       (GimpProcedure    *proc1,
diff --git a/app/pdb/progress-cmds.c b/app/pdb/progress-cmds.c
index af91745e59..535246a672 100644
--- a/app/pdb/progress-cmds.c
+++ b/app/pdb/progress-cmds.c
@@ -48,7 +48,7 @@ progress_init_invoker (GimpProcedure         *procedure,
 {
   gboolean success = TRUE;
   const gchar *message;
-  GimpObject *gdisplay;
+  GimpDisplay *gdisplay;
 
   message = g_value_get_string (gimp_value_array_index (args, 0));
   gdisplay = g_value_get_object (gimp_value_array_index (args, 1));
diff --git a/app/plug-in/gimpgpparams.c b/app/plug-in/gimpgpparams.c
index cab548e018..4fa6b70e38 100644
--- a/app/plug-in/gimpgpparams.c
+++ b/app/plug-in/gimpgpparams.c
@@ -31,6 +31,7 @@
 #include "plug-in-types.h"
 
 #include "core/gimp.h"
+#include "core/gimpdisplay.h"
 #include "core/gimpimage.h"
 #include "core/gimplayer.h"
 #include "core/gimplayermask.h"
diff --git a/app/plug-in/gimpplugin-progress.c b/app/plug-in/gimpplugin-progress.c
index af90092181..df22e1d227 100644
--- a/app/plug-in/gimpplugin-progress.c
+++ b/app/plug-in/gimpplugin-progress.c
@@ -27,6 +27,7 @@
 #include "plug-in-types.h"
 
 #include "core/gimp.h"
+#include "core/gimpdisplay.h"
 #include "core/gimpparamspecs.h"
 #include "core/gimppdbprogress.h"
 #include "core/gimpprogress.h"
@@ -91,12 +92,12 @@ gimp_plug_in_progress_detach (GimpProgress *progress)
 void
 gimp_plug_in_progress_start (GimpPlugIn  *plug_in,
                              const gchar *message,
-                             GimpObject  *display)
+                             GimpDisplay *display)
 {
   GimpPlugInProcFrame *proc_frame;
 
   g_return_if_fail (GIMP_IS_PLUG_IN (plug_in));
-  g_return_if_fail (display == NULL || GIMP_IS_OBJECT (display));
+  g_return_if_fail (display == NULL || GIMP_IS_DISPLAY (display));
 
   proc_frame = gimp_plug_in_get_proc_frame (plug_in);
 
diff --git a/app/plug-in/gimpplugin-progress.h b/app/plug-in/gimpplugin-progress.h
index 56e5285be7..43514fa46d 100644
--- a/app/plug-in/gimpplugin-progress.h
+++ b/app/plug-in/gimpplugin-progress.h
@@ -26,7 +26,7 @@ gint       gimp_plug_in_progress_detach        (GimpProgress        *progress);
 
 void       gimp_plug_in_progress_start         (GimpPlugIn          *plug_in,
                                                 const gchar         *message,
-                                                GimpObject          *display);
+                                                GimpDisplay         *display);
 void       gimp_plug_in_progress_end           (GimpPlugIn          *plug_in,
                                                 GimpPlugInProcFrame *proc_frame);
 void       gimp_plug_in_progress_set_text      (GimpPlugIn          *plug_in,
diff --git a/app/plug-in/gimppluginmanager-call.c b/app/plug-in/gimppluginmanager-call.c
index be645d8bae..e85d94e934 100644
--- a/app/plug-in/gimppluginmanager-call.c
+++ b/app/plug-in/gimppluginmanager-call.c
@@ -37,6 +37,7 @@
 #include "config/gimpguiconfig.h"
 
 #include "core/gimp.h"
+#include "core/gimpdisplay.h"
 #include "core/gimpprogress.h"
 
 #include "pdb/gimppdbcontext.h"
@@ -151,7 +152,7 @@ gimp_plug_in_manager_call_run (GimpPlugInManager   *manager,
                                GimpPlugInProcedure *procedure,
                                GimpValueArray      *args,
                                gboolean             synchronous,
-                               GimpObject          *display)
+                               GimpDisplay         *display)
 {
   GimpValueArray *return_vals = NULL;
   GimpPlugIn     *plug_in;
@@ -161,7 +162,7 @@ gimp_plug_in_manager_call_run (GimpPlugInManager   *manager,
   g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), NULL);
   g_return_val_if_fail (GIMP_IS_PLUG_IN_PROCEDURE (procedure), NULL);
   g_return_val_if_fail (args != NULL, NULL);
-  g_return_val_if_fail (display == NULL || GIMP_IS_OBJECT (display), NULL);
+  g_return_val_if_fail (display == NULL || GIMP_IS_DISPLAY (display), NULL);
 
   plug_in = gimp_plug_in_new (manager, context, progress, procedure, NULL);
 
@@ -194,7 +195,7 @@ gimp_plug_in_manager_call_run (GimpPlugInManager   *manager,
           return return_vals;
         }
 
-      display_id = display ? gimp_get_display_id (manager->gimp, display) : -1;
+      display_id = display ? gimp_display_get_id (display) : -1;
 
       icon_theme_dir = gimp_get_icon_theme_dir (manager->gimp);
 
diff --git a/app/plug-in/gimppluginmanager-call.h b/app/plug-in/gimppluginmanager-call.h
index c456ab3b74..405452e2a8 100644
--- a/app/plug-in/gimppluginmanager-call.h
+++ b/app/plug-in/gimppluginmanager-call.h
@@ -45,7 +45,7 @@ GimpValueArray * gimp_plug_in_manager_call_run      (GimpPlugInManager      *man
                                                      GimpPlugInProcedure    *procedure,
                                                      GimpValueArray         *args,
                                                      gboolean                synchronous,
-                                                     GimpObject             *display);
+                                                     GimpDisplay            *display);
 
 /*  Run a temp plug-in proc as if it were a procedure database procedure
  */
diff --git a/app/plug-in/gimppluginprocedure.c b/app/plug-in/gimppluginprocedure.c
index 3a006abb80..a88bdbfdd8 100644
--- a/app/plug-in/gimppluginprocedure.c
+++ b/app/plug-in/gimppluginprocedure.c
@@ -82,7 +82,7 @@ static void     gimp_plug_in_procedure_execute_async   (GimpProcedure  *procedur
                                                         GimpContext    *context,
                                                         GimpProgress   *progress,
                                                         GimpValueArray *args,
-                                                        GimpObject     *display);
+                                                        GimpDisplay    *display);
 
 static GFile  * gimp_plug_in_procedure_real_get_file   (GimpPlugInProcedure *procedure);
 
@@ -412,7 +412,7 @@ gimp_plug_in_procedure_execute_async (GimpProcedure  *procedure,
                                       GimpContext    *context,
                                       GimpProgress   *progress,
                                       GimpValueArray *args,
-                                      GimpObject     *display)
+                                      GimpDisplay    *display)
 {
   GimpPlugInProcedure *plug_in_procedure = GIMP_PLUG_IN_PROCEDURE (procedure);
   GError              *error             = NULL;
diff --git a/app/plug-in/gimptemporaryprocedure.c b/app/plug-in/gimptemporaryprocedure.c
index e0a269a500..849ee3962a 100644
--- a/app/plug-in/gimptemporaryprocedure.c
+++ b/app/plug-in/gimptemporaryprocedure.c
@@ -49,7 +49,7 @@ static void        gimp_temporary_procedure_execute_async (GimpProcedure  *proce
                                                            GimpContext    *context,
                                                            GimpProgress   *progress,
                                                            GimpValueArray *args,
-                                                           GimpObject     *display);
+                                                           GimpDisplay    *display);
 
 static GFile     * gimp_temporary_procedure_get_file      (GimpPlugInProcedure *procedure);
 
@@ -109,7 +109,7 @@ gimp_temporary_procedure_execute_async (GimpProcedure  *procedure,
                                         GimpContext    *context,
                                         GimpProgress   *progress,
                                         GimpValueArray *args,
-                                        GimpObject     *display)
+                                        GimpDisplay    *display)
 {
   GimpTemporaryProcedure *temp_procedure = GIMP_TEMPORARY_PROCEDURE (procedure);
   GimpValueArray         *return_vals;
diff --git a/app/widgets/gimpdockwindow.c b/app/widgets/gimpdockwindow.c
index ac63c96c29..fd3f78da53 100644
--- a/app/widgets/gimpdockwindow.c
+++ b/app/widgets/gimpdockwindow.c
@@ -139,7 +139,7 @@ static GimpAlignmentType
                                                                    GimpDock                   *dock);
 static gboolean        gimp_dock_window_should_add_to_recent      (GimpDockWindow             *dock_window);
 static void            gimp_dock_window_display_changed           (GimpDockWindow             *dock_window,
-                                                                   GimpObject                 *display,
+                                                                   GimpDisplay                *display,
                                                                    GimpContext                *context);
 static void            gimp_dock_window_image_changed             (GimpDockWindow             *dock_window,
                                                                    GimpImage                  *image,
@@ -155,7 +155,7 @@ static void            gimp_dock_window_dock_removed              (GimpDockWindo
                                                                    GimpDock                   *dock,
                                                                    GimpDockColumns            *dock_columns);
 static void            gimp_dock_window_factory_display_changed   (GimpContext                *context,
-                                                                   GimpObject                 *display,
+                                                                   GimpDisplay                *display,
                                                                    GimpDock                   *dock);
 static void            gimp_dock_window_factory_image_changed     (GimpContext                *context,
                                                                    GimpImage                  *image,
@@ -844,7 +844,7 @@ gimp_dock_window_image_flush (GimpImage      *image,
 {
   if (image == gimp_context_get_image (dock_window->p->context))
     {
-      GimpObject *display = gimp_context_get_display (dock_window->p->context);
+      GimpDisplay *display = gimp_context_get_display (dock_window->p->context);
 
       if (display)
         gimp_ui_manager_update (dock_window->p->ui_manager, display);
@@ -919,7 +919,7 @@ gimp_dock_window_dock_removed (GimpDockWindow  *dock_window,
 
 static void
 gimp_dock_window_factory_display_changed (GimpContext *context,
-                                          GimpObject  *display,
+                                          GimpDisplay *display,
                                           GimpDock    *dock)
 {
   GimpDockWindow *dock_window = GIMP_DOCK_WINDOW (dock);
@@ -942,7 +942,7 @@ gimp_dock_window_factory_image_changed (GimpContext *context,
 
 static void
 gimp_dock_window_display_changed (GimpDockWindow *dock_window,
-                                  GimpObject     *display,
+                                  GimpDisplay    *display,
                                   GimpContext    *context)
 {
   /*  make sure auto-follow-active works both ways  */
@@ -991,9 +991,9 @@ gimp_dock_window_image_changed (GimpDockWindow *dock_window,
     }
   else if (image != NULL && ! gimp_container_is_empty (display_container))
     {
-      GimpObject *display;
-      GimpImage  *display_image;
-      gboolean    find_display = TRUE;
+      GimpDisplay *display;
+      GimpImage   *display_image;
+      gboolean     find_display = TRUE;
 
       display = gimp_context_get_display (context);
 
@@ -1018,7 +1018,7 @@ gimp_dock_window_image_changed (GimpDockWindow *dock_window,
                list;
                list = g_list_next (list))
             {
-              display = GIMP_OBJECT (list->data);
+              display = list->data;
 
               g_object_get (display, "image", &display_image, NULL);
 
diff --git a/app/widgets/gimpdrawabletreeview.c b/app/widgets/gimpdrawabletreeview.c
index 5b17d7953a..7b9919db9b 100644
--- a/app/widgets/gimpdrawabletreeview.c
+++ b/app/widgets/gimpdrawabletreeview.c
@@ -183,9 +183,9 @@ gimp_drawable_tree_view_select_item (GimpContainerView *view,
         {
           Gimp        *gimp    = image->gimp;
           GimpContext *context = gimp_get_user_context (gimp);
-          GObject     *display = gimp_context_get_display (context);
+          GimpDisplay *display = gimp_context_get_display (context);
 
-          gimp_message_literal (gimp, display, GIMP_MESSAGE_WARNING,
+          gimp_message_literal (gimp, G_OBJECT (display), GIMP_MESSAGE_WARNING,
                                 _("Cannot select item while a floating "
                                   "selection is active."));
         }
diff --git a/libgimp/gimpgpparams-body.c b/libgimp/gimpgpparams-body.c
index a60bdc1eb9..0a2991bad4 100644
--- a/libgimp/gimpgpparams-body.c
+++ b/libgimp/gimpgpparams-body.c
@@ -341,9 +341,9 @@ _gimp_param_spec_to_gp_param_def (GParamSpec *pspec,
       GType        value_type = G_PARAM_SPEC_VALUE_TYPE (pspec);
       const gchar *type_name  = NULL;
 
-      if (! strcmp (g_type_name (value_type), "GimpDisplay"))
+      if (g_type_is_a (value_type, GIMP_TYPE_DISPLAY))
         {
-          /* strcmp() because GimpDisplay is not visible from app/plug-in */
+          /* g_type_is_a() because the core has a GimpDisplay subclasses */
           type_name = "GimpParamDisplay";
         }
       else if (value_type == GIMP_TYPE_IMAGE)
@@ -416,14 +416,14 @@ get_item_by_id (gpointer gimp,
 #endif
 }
 
-static GObject *
+static GimpDisplay *
 get_display_by_id (gpointer gimp,
                    gint     id)
 {
 #ifdef LIBGIMP_COMPILATION
-  return (GObject *) gimp_display_get_by_id (id);
+  return gimp_display_get_by_id (id);
 #else
-  return (GObject *) gimp_get_display_by_id (gimp, id);
+  return gimp_display_get_by_id (gimp, id);
 #endif
 }
 
@@ -835,25 +835,11 @@ _gimp_value_to_gp_param (const GValue *value,
     }
   else if (GIMP_VALUE_HOLDS_DISPLAY (value))
     {
-      GObject *display = g_value_get_object (value);
-      gint     id      = -1;
-
-#if 0
-      if (full_copy)
-        {
-          g_free (param->type_name);
-          param->type_name = "GObject";
-        }
-      else
-        param->type_name = (gchar *) "GObject";
-#endif
+      GimpDisplay *display = g_value_get_object (value);
 
       param->param_type = GP_PARAM_TYPE_INT;
 
-      if (display)
-        g_object_get (display, "id", &id, NULL);
-
-      param->data.d_int = id;
+      param->data.d_int = display ? gimp_display_get_id (display) : -1;
     }
   else if (G_VALUE_HOLDS_PARAM (value))
     {
diff --git a/libgimp/gimpparamspecs.c b/libgimp/gimpparamspecs.c
index bcfd76f662..3bc3e69019 100644
--- a/libgimp/gimpparamspecs.c
+++ b/libgimp/gimpparamspecs.c
@@ -222,10 +222,10 @@ gimp_param_item_validate (GParamSpec *pspec,
  **/
 GParamSpec *
 gimp_param_spec_item (const gchar *name,
-                         const gchar *nick,
-                         const gchar *blurb,
-                         gboolean     none_ok,
-                         GParamFlags  flags)
+                      const gchar *nick,
+                      const gchar *blurb,
+                      gboolean     none_ok,
+                      GParamFlags  flags)
 {
   GimpParamSpecItem *ispec;
 
@@ -894,9 +894,9 @@ gimp_param_display_class_init (GParamSpecClass *klass)
 static void
 gimp_param_display_init (GParamSpec *pspec)
 {
-  GimpParamSpecDisplay *ispec = GIMP_PARAM_SPEC_DISPLAY (pspec);
+  GimpParamSpecDisplay *dspec = GIMP_PARAM_SPEC_DISPLAY (pspec);
 
-  ispec->none_ok = FALSE;
+  dspec->none_ok = FALSE;
 }
 
 static gboolean
@@ -944,12 +944,12 @@ gimp_param_spec_display (const gchar *name,
                          gboolean     none_ok,
                          GParamFlags  flags)
 {
-  GimpParamSpecDisplay *ispec;
+  GimpParamSpecDisplay *dspec;
 
-  ispec = g_param_spec_internal (GIMP_TYPE_PARAM_DISPLAY,
+  dspec = g_param_spec_internal (GIMP_TYPE_PARAM_DISPLAY,
                                  name, nick, blurb, flags);
 
-  ispec->none_ok = none_ok ? TRUE : FALSE;
+  dspec->none_ok = none_ok ? TRUE : FALSE;
 
-  return G_PARAM_SPEC (ispec);
+  return G_PARAM_SPEC (dspec);
 }
diff --git a/pdb/groups/display.pdb b/pdb/groups/display.pdb
index 932335c001..4ca4042ec1 100644
--- a/pdb/groups/display.pdb
+++ b/pdb/groups/display.pdb
@@ -39,7 +39,7 @@ HELP
     %invoke = (
        code => <<'CODE'
 {
-  valid = (gimp_get_display_by_id (gimp, display_id) != NULL);
+  valid = (gimp_display_get_by_id (gimp, display_id) != NULL);
 }
 CODE
     );
@@ -210,7 +210,8 @@ CODE
 }
 
 
-@headers = qw("core/gimp.h");
+@headers = qw("core/gimp.h"
+              "core/gimpdisplay.h");
 
 @procs = qw(display_id_is_valid
             display_new
diff --git a/pdb/pdb.pl b/pdb/pdb.pl
index de0affbf4e..4400980d90 100644
--- a/pdb/pdb.pl
+++ b/pdb/pdb.pl
@@ -152,8 +152,8 @@ package Gimp::CodeGen::pdb;
                     gtype           => 'GIMP_TYPE_DISPLAY',
                     type            => 'GimpDisplay *',
                     const_type      => 'GimpDisplay *',
-                    app_type        => 'GimpObject *',
-                    app_const_type  => 'GimpObject *',
+                    app_type        => 'GimpDisplay *',
+                    app_const_type  => 'GimpDisplay *',
                     init_value      => 'NULL',
                     out_annotate    => '(transfer none)',
                     get_value_func  => '$var = g_value_get_object ($value)',


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