[gimp] app: add screen and monitor to all display and image window constructors



commit 7f23fbec34bd5790f0fab41a0975beed2786b8d8
Author: Michael Natterer <mitch gimp org>
Date:   Fri May 2 20:20:46 2014 +0200

    app: add screen and monitor to all display and image window constructors
    
    so they appear on the proper monitor as well.

 app/actions/buffers-commands.c          |    6 ++++-
 app/actions/data-commands.c             |    4 +++
 app/actions/debug-commands.c            |   10 ++++----
 app/actions/documents-commands.c        |    3 ++
 app/actions/edit-commands.c             |    6 ++++-
 app/actions/file-commands.c             |    4 +++
 app/actions/image-commands.c            |    8 +++---
 app/actions/images-commands.c           |    5 +++-
 app/actions/templates-commands.c        |    8 ++++-
 app/actions/view-commands.c             |    4 ++-
 app/app.c                               |    4 ++-
 app/core/gimp-gui.c                     |    7 ++++-
 app/core/gimp-gui.h                     |    8 ++++-
 app/core/gimp-utils.c                   |    2 +
 app/dialogs/file-open-dialog.c          |    3 ++
 app/dialogs/file-open-location-dialog.c |    3 ++
 app/dialogs/image-new-dialog.c          |    9 +++++-
 app/display/gimpdisplay.c               |    9 +++++-
 app/display/gimpdisplay.h               |    4 ++-
 app/display/gimpdisplayshell-dnd.c      |   21 +++++++++++++---
 app/display/gimpimagewindow.c           |   41 ++++++++++++++++++++++++++++--
 app/display/gimpimagewindow.h           |    4 ++-
 app/file/file-open.c                    |   16 ++++++++++-
 app/file/file-open.h                    |    8 +++++-
 app/gui/gimpdbusservice.c               |    4 ++-
 app/gui/gimpuiconfigurer.c              |    4 ++-
 app/gui/gui-vtable.c                    |   15 +++++++++--
 app/gui/gui.c                           |    8 +++---
 app/pdb/display-cmds.c                  |    2 +-
 app/tests/gimp-app-test-utils.c         |    3 +-
 app/widgets/gimpsessioninfo.c           |    2 +
 app/widgets/gimptoolbox-dnd.c           |   22 +++++++++++++----
 app/widgets/gimptoolbox.c               |   11 ++++++--
 tools/pdbgen/pdb/display.pdb            |    2 +-
 34 files changed, 214 insertions(+), 56 deletions(-)
---
diff --git a/app/actions/buffers-commands.c b/app/actions/buffers-commands.c
index f288adb..030020e 100644
--- a/app/actions/buffers-commands.c
+++ b/app/actions/buffers-commands.c
@@ -32,6 +32,7 @@
 #include "widgets/gimpbufferview.h"
 #include "widgets/gimpcontainerview.h"
 #include "widgets/gimpcontainerview-utils.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "display/gimpdisplay.h"
 #include "display/gimpdisplayshell.h"
@@ -84,11 +85,14 @@ buffers_paste_as_new_cmd_callback (GtkAction *action,
 
       if (image)
         {
+          GtkWidget *widget = GTK_WIDGET (editor);
           GimpImage *new_image;
 
           new_image = gimp_image_new_from_buffer (image->gimp, image, buffer);
           gimp_create_display (image->gimp, new_image,
-                               GIMP_UNIT_PIXEL, 1.0);
+                               GIMP_UNIT_PIXEL, 1.0,
+                               G_OBJECT (gtk_widget_get_screen (widget)),
+                               gimp_widget_get_monitor (widget));
           g_object_unref (new_image);
         }
     }
diff --git a/app/actions/data-commands.c b/app/actions/data-commands.c
index badb0f0..7479d4b 100644
--- a/app/actions/data-commands.c
+++ b/app/actions/data-commands.c
@@ -42,6 +42,7 @@
 #include "widgets/gimpmessagedialog.h"
 #include "widgets/gimpwidgets-utils.h"
 #include "widgets/gimpwindowstrategy.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "dialogs/data-delete-dialog.h"
 
@@ -74,12 +75,15 @@ data_open_as_image_cmd_callback (GtkAction *action,
 
       if (uri)
         {
+          GtkWidget         *widget = GTK_WIDGET (view);
           GimpImage         *image;
           GimpPDBStatusType  status;
           GError            *error = NULL;
 
           image = file_open_with_display (context->gimp, context, NULL,
                                           uri, FALSE,
+                                          G_OBJECT (gtk_widget_get_screen (widget)),
+                                          gimp_widget_get_monitor (widget),
                                           &status, &error);
 
           if (! image && status != GIMP_PDB_CANCEL)
diff --git a/app/actions/debug-commands.c b/app/actions/debug-commands.c
index 1581784..474b543 100644
--- a/app/actions/debug-commands.c
+++ b/app/actions/debug-commands.c
@@ -37,14 +37,14 @@
 
 #include "gegl/gimp-gegl-utils.h"
 
-#include "display/gimpdisplay.h"
-#include "display/gimpdisplayshell.h"
-#include "display/gimpimagewindow.h"
-
 #include "widgets/gimpaction.h"
 #include "widgets/gimpmenufactory.h"
 #include "widgets/gimpuimanager.h"
 
+#include "display/gimpdisplay.h"
+#include "display/gimpdisplayshell.h"
+#include "display/gimpimagewindow.h"
+
 #include "menus/menus.h"
 
 #include "actions.h"
@@ -314,7 +314,7 @@ debug_show_image_graph (GimpImage *source_image)
                                       1.0,
                                       GIMP_NORMAL_MODE);
   gimp_image_add_layer (new_image, layer, NULL, 0, FALSE);
-  gimp_create_display (gimp, new_image, GIMP_UNIT_PIXEL, 1.0);
+  gimp_create_display (gimp, new_image, GIMP_UNIT_PIXEL, 1.0, NULL, 0);
 
   /* Cleanup */
   g_object_unref (new_image);
diff --git a/app/actions/documents-commands.c b/app/actions/documents-commands.c
index b189604..3b7a5f2 100644
--- a/app/actions/documents-commands.c
+++ b/app/actions/documents-commands.c
@@ -43,6 +43,7 @@
 #include "widgets/gimpdocumentview.h"
 #include "widgets/gimpmessagebox.h"
 #include "widgets/gimpmessagedialog.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "display/gimpdisplay.h"
 #include "display/gimpdisplay-foreach.h"
@@ -343,6 +344,8 @@ documents_open_image (GtkWidget     *editor,
   uri = gimp_object_get_name (imagefile);
 
   image = file_open_with_display (context->gimp, context, NULL, uri, FALSE,
+                                  G_OBJECT (gtk_widget_get_screen (editor)),
+                                  gimp_widget_get_monitor (editor),
                                   &status, &error);
 
   if (! image && status != GIMP_PDB_CANCEL)
diff --git a/app/actions/edit-commands.c b/app/actions/edit-commands.c
index 53a7a0f..a24ef60 100644
--- a/app/actions/edit-commands.c
+++ b/app/actions/edit-commands.c
@@ -317,7 +317,9 @@ edit_paste_as_new_cmd_callback (GtkAction *action,
 {
   Gimp       *gimp;
   GimpBuffer *buffer;
+  GtkWidget  *widget;
   return_if_no_gimp (gimp, data);
+  return_if_no_widget (widget, data);
 
   buffer = gimp_clipboard_get_buffer (gimp);
 
@@ -329,7 +331,9 @@ edit_paste_as_new_cmd_callback (GtkAction *action,
                                           buffer);
       g_object_unref (buffer);
 
-      gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0);
+      gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0,
+                           G_OBJECT (gtk_widget_get_screen (widget)),
+                           gimp_widget_get_monitor (widget));
       g_object_unref (image);
     }
   else
diff --git a/app/actions/file-commands.c b/app/actions/file-commands.c
index 1ea4cd5..738cb22 100644
--- a/app/actions/file-commands.c
+++ b/app/actions/file-commands.c
@@ -177,11 +177,13 @@ file_open_recent_cmd_callback (GtkAction *action,
   if (imagefile)
     {
       GimpDisplay       *display;
+      GtkWidget         *widget;
       GimpProgress      *progress;
       GimpImage         *image;
       GimpPDBStatusType  status;
       GError            *error = NULL;
       return_if_no_display (display, data);
+      return_if_no_widget (widget, data);
 
       g_object_ref (display);
       g_object_ref (imagefile);
@@ -192,6 +194,8 @@ file_open_recent_cmd_callback (GtkAction *action,
       image = file_open_with_display (gimp, action_data_get_context (data),
                                       progress,
                                       gimp_object_get_name (imagefile), FALSE,
+                                      G_OBJECT (gtk_widget_get_screen (widget)),
+                                      gimp_widget_get_monitor (widget),
                                       &status, &error);
 
       if (! image && status != GIMP_PDB_CANCEL)
diff --git a/app/actions/image-commands.c b/app/actions/image-commands.c
index 28c36e8..1fbd692 100644
--- a/app/actions/image-commands.c
+++ b/app/actions/image-commands.c
@@ -551,10 +551,10 @@ image_duplicate_cmd_callback (GtkAction *action,
 
   new_image = gimp_image_duplicate (image);
 
-  gimp_create_display (new_image->gimp,
-                       new_image,
-                       shell->unit,
-                       gimp_zoom_model_get_factor (shell->zoom));
+  gimp_create_display (new_image->gimp, new_image, shell->unit,
+                       gimp_zoom_model_get_factor (shell->zoom),
+                       G_OBJECT (gtk_widget_get_screen (GTK_WIDGET (shell))),
+                       gimp_widget_get_monitor (GTK_WIDGET (shell)));
 
   g_object_unref (new_image);
 }
diff --git a/app/actions/images-commands.c b/app/actions/images-commands.c
index d314a19..f607e0e 100644
--- a/app/actions/images-commands.c
+++ b/app/actions/images-commands.c
@@ -29,6 +29,7 @@
 
 #include "widgets/gimpcontainerview.h"
 #include "widgets/gimpimageview.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "display/gimpdisplay.h"
 #include "display/gimpdisplayshell.h"
@@ -84,7 +85,9 @@ images_new_view_cmd_callback (GtkAction *action,
 
   if (image && gimp_container_have (container, GIMP_OBJECT (image)))
     {
-      gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0);
+      gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0,
+                           G_OBJECT (gtk_widget_get_screen (GTK_WIDGET (editor))),
+                           gimp_widget_get_monitor (GTK_WIDGET (editor)));
     }
 }
 
diff --git a/app/actions/templates-commands.c b/app/actions/templates-commands.c
index a74fb60..7ea6550 100644
--- a/app/actions/templates-commands.c
+++ b/app/actions/templates-commands.c
@@ -40,6 +40,7 @@
 #include "widgets/gimpmessagedialog.h"
 #include "widgets/gimptemplateeditor.h"
 #include "widgets/gimptemplateview.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "dialogs/template-options-dialog.h"
 
@@ -82,7 +83,7 @@ templates_create_image_cmd_callback (GtkAction *action,
   GimpContainer       *container;
   GimpContext         *context;
   GimpTemplate        *template;
-  return_if_no_gimp(gimp,data);
+  return_if_no_gimp (gimp, data);
 
   container = gimp_container_view_get_container (editor->view);
   context   = gimp_container_view_get_context (editor->view);
@@ -91,10 +92,13 @@ templates_create_image_cmd_callback (GtkAction *action,
 
   if (template && gimp_container_have (container, GIMP_OBJECT (template)))
     {
+      GtkWidget *widget = GTK_WIDGET (editor);
       GimpImage *image;
 
       image = gimp_image_new_from_template (gimp, template, context);
-      gimp_create_display (gimp, image, gimp_template_get_unit (template), 1.0);
+      gimp_create_display (gimp, image, gimp_template_get_unit (template), 1.0,
+                           G_OBJECT (gtk_widget_get_screen (widget)),
+                           gimp_widget_get_monitor (widget));
       g_object_unref (image);
 
       gimp_image_new_set_last_template (gimp, template);
diff --git a/app/actions/view-commands.c b/app/actions/view-commands.c
index 7bed4a6..918a9df 100644
--- a/app/actions/view-commands.c
+++ b/app/actions/view-commands.c
@@ -92,7 +92,9 @@ view_new_cmd_callback (GtkAction *action,
 
   gimp_create_display (display->gimp,
                        gimp_display_get_image (display),
-                       shell->unit, gimp_zoom_model_get_factor (shell->zoom));
+                       shell->unit, gimp_zoom_model_get_factor (shell->zoom),
+                       G_OBJECT (gtk_widget_get_screen (GTK_WIDGET (shell))),
+                       gimp_widget_get_monitor (GTK_WIDGET (shell)));
 }
 
 void
diff --git a/app/app.c b/app/app.c
index 11551ee..7c621cd 100644
--- a/app/app.c
+++ b/app/app.c
@@ -261,7 +261,9 @@ app_run (const gchar         *full_prog_name,
       for (i = 0; filenames[i] != NULL; i++)
         {
           if (run_loop)
-            file_open_from_command_line (gimp, filenames[i], as_new);
+            file_open_from_command_line (gimp, filenames[i], as_new,
+                                         NULL, /* FIXME monitor */
+                                         0 /* FIXME monitor */);
         }
     }
 
diff --git a/app/core/gimp-gui.c b/app/core/gimp-gui.c
index eb1e5b1..27e1c05 100644
--- a/app/core/gimp-gui.c
+++ b/app/core/gimp-gui.c
@@ -325,13 +325,16 @@ GimpObject *
 gimp_create_display (Gimp      *gimp,
                      GimpImage *image,
                      GimpUnit   unit,
-                     gdouble    scale)
+                     gdouble    scale,
+                     GObject   *screen,
+                     gint       monitor)
 {
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
   g_return_val_if_fail (image == NULL || GIMP_IS_IMAGE (image), NULL);
+  g_return_val_if_fail (screen == NULL || G_IS_OBJECT (screen), NULL);
 
   if (gimp->gui.display_create)
-    return gimp->gui.display_create (gimp, image, unit, scale);
+    return gimp->gui.display_create (gimp, image, unit, scale, screen, monitor);
 
   return NULL;
 }
diff --git a/app/core/gimp-gui.h b/app/core/gimp-gui.h
index 582bf19..be6225c 100644
--- a/app/core/gimp-gui.h
+++ b/app/core/gimp-gui.h
@@ -58,7 +58,9 @@ struct _GimpGui
   GimpObject   * (* display_create)        (Gimp                *gimp,
                                             GimpImage           *image,
                                             GimpUnit             unit,
-                                            gdouble              scale);
+                                            gdouble              scale,
+                                            GObject             *screen,
+                                            gint                 monitor);
   void           (* display_delete)        (GimpObject          *display);
   void           (* displays_reconnect)    (Gimp                *gimp,
                                             GimpImage           *old_image,
@@ -111,7 +113,9 @@ guint32        gimp_get_display_window_id (Gimp                *gimp,
 GimpObject   * gimp_create_display        (Gimp                *gimp,
                                            GimpImage           *image,
                                            GimpUnit             unit,
-                                           gdouble              scale);
+                                           gdouble              scale,
+                                           GObject             *screen,
+                                           gint                 monitor);
 void           gimp_delete_display        (Gimp                *gimp,
                                            GimpObject          *display);
 void           gimp_reconnect_displays    (Gimp                *gimp,
diff --git a/app/core/gimp-utils.c b/app/core/gimp-utils.c
index 5a958a6..43f7334 100644
--- a/app/core/gimp-utils.c
+++ b/app/core/gimp-utils.c
@@ -865,6 +865,7 @@ void
 gimp_create_image_from_buffer (Gimp       *gimp,
                                GeglBuffer *buffer)
 {
+#if 0
   GimpImage  *image;
   GimpLayer  *layer;
   const Babl *format;
@@ -888,4 +889,5 @@ gimp_create_image_from_buffer (Gimp       *gimp,
   gimp_image_add_layer (image, layer, NULL, -1, FALSE);
 
   gimp_create_display (gimp, image, GIMP_UNIT_PIXEL, 1.0);
+#endif
 }
diff --git a/app/dialogs/file-open-dialog.c b/app/dialogs/file-open-dialog.c
index 674ccb2..08550ac 100644
--- a/app/dialogs/file-open-dialog.c
+++ b/app/dialogs/file-open-dialog.c
@@ -39,6 +39,7 @@
 
 #include "widgets/gimpfiledialog.h"
 #include "widgets/gimphelp-ids.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "file-open-dialog.h"
 
@@ -216,6 +217,8 @@ file_open_dialog_open_image (GtkWidget           *open_dialog,
                                            GIMP_PROGRESS (open_dialog),
                                            uri, uri, FALSE,
                                            load_proc,
+                                           G_OBJECT (gtk_widget_get_screen (open_dialog)),
+                                           gimp_widget_get_monitor (open_dialog),
                                            &status, &error);
 
   if (! image && status != GIMP_PDB_CANCEL)
diff --git a/app/dialogs/file-open-location-dialog.c b/app/dialogs/file-open-location-dialog.c
index b1f4a78..9bbc30b 100644
--- a/app/dialogs/file-open-location-dialog.c
+++ b/app/dialogs/file-open-location-dialog.c
@@ -37,6 +37,7 @@
 #include "widgets/gimpcontainerentry.h"
 #include "widgets/gimphelp-ids.h"
 #include "widgets/gimpprogressbox.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "file-open-location-dialog.h"
 
@@ -204,6 +205,8 @@ file_open_location_response (GtkDialog *dialog,
                                                    gimp_get_user_context (gimp),
                                                    GIMP_PROGRESS (box),
                                                    uri, text, FALSE, NULL,
+                                                   G_OBJECT (gtk_widget_get_screen (entry)),
+                                                   gimp_widget_get_monitor (entry),
                                                    &status, &error);
 
           if (image == NULL && status != GIMP_PDB_CANCEL)
diff --git a/app/dialogs/image-new-dialog.c b/app/dialogs/image-new-dialog.c
index 2772ec3..0ea833d 100644
--- a/app/dialogs/image-new-dialog.c
+++ b/app/dialogs/image-new-dialog.c
@@ -41,6 +41,7 @@
 #include "widgets/gimpmessagebox.h"
 #include "widgets/gimpmessagedialog.h"
 #include "widgets/gimptemplateeditor.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "image-new-dialog.h"
 
@@ -360,13 +361,17 @@ image_new_create_image (ImageNewDialog *dialog)
   Gimp         *gimp     = dialog->context->gimp;
   GimpImage    *image;
 
-  gtk_widget_destroy (dialog->dialog);
+  gtk_widget_hide (dialog->dialog);
 
   image = gimp_image_new_from_template (gimp, template,
                                         gimp_get_user_context (gimp));
-  gimp_create_display (gimp, image, gimp_template_get_unit (template), 1.0);
+  gimp_create_display (gimp, image, gimp_template_get_unit (template), 1.0,
+                       G_OBJECT (gtk_widget_get_screen (dialog->dialog)),
+                       gimp_widget_get_monitor (dialog->dialog));
   g_object_unref (image);
 
+  gtk_widget_destroy (dialog->dialog);
+
   gimp_image_new_set_last_template (gimp, template);
 
   g_object_unref (template);
diff --git a/app/display/gimpdisplay.c b/app/display/gimpdisplay.c
index 3e0b746..c94b8ab 100644
--- a/app/display/gimpdisplay.c
+++ b/app/display/gimpdisplay.c
@@ -393,7 +393,9 @@ gimp_display_new (Gimp              *gimp,
                   gdouble            scale,
                   GimpMenuFactory   *menu_factory,
                   GimpUIManager     *popup_manager,
-                  GimpDialogFactory *dialog_factory)
+                  GimpDialogFactory *dialog_factory,
+                  GdkScreen         *screen,
+                  gint               monitor)
 {
   GimpDisplay        *display;
   GimpDisplayPrivate *private;
@@ -402,6 +404,7 @@ gimp_display_new (Gimp              *gimp,
 
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
   g_return_val_if_fail (image == NULL || GIMP_IS_IMAGE (image), NULL);
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
 
   /*  If there isn't an interface, never create a display  */
   if (gimp->no_interface)
@@ -443,7 +446,9 @@ gimp_display_new (Gimp              *gimp,
       window = gimp_image_window_new (gimp,
                                       private->image,
                                       menu_factory,
-                                      dialog_factory);
+                                      dialog_factory,
+                                      screen,
+                                      monitor);
     }
 
   /*  create the shell for the image  */
diff --git a/app/display/gimpdisplay.h b/app/display/gimpdisplay.h
index 7296867..21652a0 100644
--- a/app/display/gimpdisplay.h
+++ b/app/display/gimpdisplay.h
@@ -55,7 +55,9 @@ GimpDisplay      * gimp_display_new             (Gimp              *gimp,
                                                  gdouble            scale,
                                                  GimpMenuFactory   *menu_factory,
                                                  GimpUIManager     *popup_manager,
-                                                 GimpDialogFactory *dialog_factory);
+                                                 GimpDialogFactory *dialog_factory,
+                                                 GdkScreen         *screen,
+                                                 gint               monitor);
 void               gimp_display_delete          (GimpDisplay       *display);
 void               gimp_display_close           (GimpDisplay       *display);
 
diff --git a/app/display/gimpdisplayshell-dnd.c b/app/display/gimpdisplayshell-dnd.c
index dff32e3..ae2ea73 100644
--- a/app/display/gimpdisplayshell-dnd.c
+++ b/app/display/gimpdisplayshell-dnd.c
@@ -50,6 +50,7 @@
 #include "vectors/gimpvectors-import.h"
 
 #include "widgets/gimpdnd.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "gimpdisplay.h"
 #include "gimpdisplayshell.h"
@@ -224,7 +225,9 @@ gimp_display_shell_drop_drawable (GtkWidget    *widget,
     {
       image = gimp_image_new_from_drawable (shell->display->gimp,
                                             GIMP_DRAWABLE (viewable));
-      gimp_create_display (shell->display->gimp, image, GIMP_UNIT_PIXEL, 1.0);
+      gimp_create_display (shell->display->gimp, image, GIMP_UNIT_PIXEL, 1.0,
+                           G_OBJECT (gtk_widget_get_screen (widget)),
+                           gimp_widget_get_monitor (widget));
       g_object_unref (image);
 
       return;
@@ -439,7 +442,9 @@ gimp_display_shell_drop_buffer (GtkWidget    *widget,
     {
       image = gimp_image_new_from_buffer (shell->display->gimp, NULL,
                                           GIMP_BUFFER (viewable));
-      gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0);
+      gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0,
+                           G_OBJECT (gtk_widget_get_screen (widget)),
+                           gimp_widget_get_monitor (widget));
       g_object_unref (image);
 
       return;
@@ -556,6 +561,8 @@ gimp_display_shell_drop_uri_list (GtkWidget *widget,
           new_image = file_open_with_display (shell->display->gimp, context,
                                               NULL,
                                               uri, FALSE,
+                                              G_OBJECT (gtk_widget_get_screen (widget)),
+                                              gimp_widget_get_monitor (widget),
                                               &status, &error);
 
           if (! new_image && status != GIMP_PDB_CANCEL)
@@ -567,6 +574,8 @@ gimp_display_shell_drop_uri_list (GtkWidget *widget,
           image = file_open_with_display (shell->display->gimp, context,
                                           GIMP_PROGRESS (shell->display),
                                           uri, FALSE,
+                                          G_OBJECT (gtk_widget_get_screen (widget)),
+                                          gimp_widget_get_monitor (widget),
                                           &status, &error);
 
           if (! image && status != GIMP_PDB_CANCEL)
@@ -617,7 +626,9 @@ gimp_display_shell_drop_component (GtkWidget       *widget,
     {
       dest_image = gimp_image_new_from_component (image->gimp,
                                                   image, component);
-      gimp_create_display (dest_image->gimp, dest_image, GIMP_UNIT_PIXEL, 1.0);
+      gimp_create_display (dest_image->gimp, dest_image, GIMP_UNIT_PIXEL, 1.0,
+                           G_OBJECT (gtk_widget_get_screen (widget)),
+                           gimp_widget_get_monitor (widget));
       g_object_unref (dest_image);
 
       return;
@@ -673,7 +684,9 @@ gimp_display_shell_drop_pixbuf (GtkWidget *widget,
     {
       image = gimp_image_new_from_pixbuf (shell->display->gimp, pixbuf,
                                           _("Dropped Buffer"));
-      gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0);
+      gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0,
+                           G_OBJECT (gtk_widget_get_screen (widget)),
+                           gimp_widget_get_monitor (widget));
       g_object_unref (image);
 
       return;
diff --git a/app/display/gimpimagewindow.c b/app/display/gimpimagewindow.c
index 5634a87..c99e4a9 100644
--- a/app/display/gimpimagewindow.c
+++ b/app/display/gimpimagewindow.c
@@ -86,6 +86,8 @@ enum
   PROP_GIMP,
   PROP_MENU_FACTORY,
   PROP_DIALOG_FACTORY,
+  PROP_INITIAL_SCREEN,
+  PROP_INITIAL_MONITOR
 };
 
 
@@ -112,6 +114,9 @@ struct _GimpImageWindowPrivate
   GdkWindowState     window_state;
 
   const gchar       *entry_id;
+
+  GdkScreen         *initial_screen;
+  gint               initial_monitor;
 };
 
 typedef struct
@@ -293,6 +298,19 @@ gimp_image_window_class_init (GimpImageWindowClass *klass)
                                                         GIMP_PARAM_READWRITE |
                                                         G_PARAM_CONSTRUCT_ONLY));
 
+  g_object_class_install_property (object_class, PROP_INITIAL_SCREEN,
+                                   g_param_spec_object ("initial-screen",
+                                                        NULL, NULL,
+                                                        GDK_TYPE_SCREEN,
+                                                        GIMP_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property (object_class, PROP_INITIAL_MONITOR,
+                                   g_param_spec_int ("initial-monitor",
+                                                     NULL, NULL,
+                                                     0, 16, 0,
+                                                     GIMP_PARAM_READWRITE |
+                                                     G_PARAM_CONSTRUCT_ONLY));
+
   g_type_class_add_private (klass, sizeof (GimpImageWindowPrivate));
 
   gtk_rc_parse_string (image_window_rc_style);
@@ -460,8 +478,8 @@ gimp_image_window_constructed (GObject *object)
   gimp_image_window_session_update (window,
                                     NULL /*new_display*/,
                                     gimp_image_window_config_to_entry_id (config),
-                                    gdk_screen_get_default (), /* FIXME monitor */
-                                    0 /* FIXME monitor */);
+                                    private->initial_screen,
+                                    private->initial_monitor);
 }
 
 static void
@@ -527,6 +545,12 @@ gimp_image_window_set_property (GObject      *object,
     case PROP_DIALOG_FACTORY:
       private->dialog_factory = g_value_get_object (value);
       break;
+    case PROP_INITIAL_SCREEN:
+      private->initial_screen = g_value_get_object (value);
+      break;
+    case PROP_INITIAL_MONITOR:
+      private->initial_monitor = g_value_get_int (value);
+      break;
 
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -551,6 +575,12 @@ gimp_image_window_get_property (GObject    *object,
     case PROP_DIALOG_FACTORY:
       g_value_set_object (value, private->dialog_factory);
       break;
+    case PROP_INITIAL_SCREEN:
+      g_value_set_object (value, private->initial_screen);
+      break;
+    case PROP_INITIAL_MONITOR:
+      g_value_set_int (value, private->initial_monitor);
+      break;
 
     case PROP_MENU_FACTORY:
     default:
@@ -1002,7 +1032,9 @@ GimpImageWindow *
 gimp_image_window_new (Gimp              *gimp,
                        GimpImage         *image,
                        GimpMenuFactory   *menu_factory,
-                       GimpDialogFactory *dialog_factory)
+                       GimpDialogFactory *dialog_factory,
+                       GdkScreen         *screen,
+                       gint               monitor)
 {
   GimpImageWindow *window;
 
@@ -1010,11 +1042,14 @@ gimp_image_window_new (Gimp              *gimp,
   g_return_val_if_fail (GIMP_IS_IMAGE (image) || image == NULL, NULL);
   g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
   g_return_val_if_fail (GIMP_IS_DIALOG_FACTORY (dialog_factory), NULL);
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
 
   window = g_object_new (GIMP_TYPE_IMAGE_WINDOW,
                          "gimp",            gimp,
                          "menu-factory",    menu_factory,
                          "dialog-factory",  dialog_factory,
+                         "initial-screen",  screen,
+                         "initial-monitor", monitor,
                          /* The window position will be overridden by the
                           * dialog factory, it is only really used on first
                           * startup.
diff --git a/app/display/gimpimagewindow.h b/app/display/gimpimagewindow.h
index 14fb14e..ca326f9 100644
--- a/app/display/gimpimagewindow.h
+++ b/app/display/gimpimagewindow.h
@@ -48,7 +48,9 @@ GType              gimp_image_window_get_type             (void) G_GNUC_CONST;
 GimpImageWindow  * gimp_image_window_new                  (Gimp              *gimp,
                                                            GimpImage         *image,
                                                            GimpMenuFactory   *menu_factory,
-                                                           GimpDialogFactory *dialog_factory);
+                                                           GimpDialogFactory *dialog_factory,
+                                                           GdkScreen         *screen,
+                                                           gint               monitor);
 void               gimp_image_window_destroy              (GimpImageWindow   *window);
 
 GimpUIManager    * gimp_image_window_get_ui_manager       (GimpImageWindow  *window);
diff --git a/app/file/file-open.c b/app/file/file-open.c
index 621e46a..5634b62 100644
--- a/app/file/file-open.c
+++ b/app/file/file-open.c
@@ -416,11 +416,14 @@ file_open_with_display (Gimp               *gimp,
                         GimpProgress       *progress,
                         const gchar        *uri,
                         gboolean            as_new,
+                        GObject            *screen,
+                        gint                monitor,
                         GimpPDBStatusType  *status,
                         GError            **error)
 {
   return file_open_with_proc_and_display (gimp, context, progress,
                                           uri, uri, as_new, NULL,
+                                          screen, monitor,
                                           status, error);
 }
 
@@ -432,6 +435,8 @@ file_open_with_proc_and_display (Gimp                *gimp,
                                  const gchar         *entered_filename,
                                  gboolean             as_new,
                                  GimpPlugInProcedure *file_proc,
+                                 GObject             *screen,
+                                 gint                 monitor,
                                  GimpPDBStatusType   *status,
                                  GError             **error)
 {
@@ -441,6 +446,7 @@ file_open_with_proc_and_display (Gimp                *gimp,
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
   g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
   g_return_val_if_fail (progress == NULL || GIMP_IS_PROGRESS (progress), NULL);
+  g_return_val_if_fail (screen == NULL || G_IS_OBJECT (screen), NULL);
   g_return_val_if_fail (status != NULL, NULL);
 
   image = file_open_image (gimp, context, progress,
@@ -479,7 +485,8 @@ file_open_with_proc_and_display (Gimp                *gimp,
           g_free (basename);
         }
 
-      if (gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0))
+      if (gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0,
+                               screen, monitor))
         {
           /*  the display owns the image now  */
           g_object_unref (image);
@@ -598,7 +605,10 @@ file_open_layers (Gimp                *gimp,
 gboolean
 file_open_from_command_line (Gimp        *gimp,
                              const gchar *filename,
-                             gboolean     as_new)
+                             gboolean     as_new,
+                             GObject     *screen,
+                             gint         monitor)
+
 {
   GError   *error   = NULL;
   gchar    *uri;
@@ -606,6 +616,7 @@ file_open_from_command_line (Gimp        *gimp,
 
   g_return_val_if_fail (GIMP_IS_GIMP (gimp), FALSE);
   g_return_val_if_fail (filename != NULL, FALSE);
+  g_return_val_if_fail (screen == NULL || G_IS_OBJECT (screen), FALSE);
 
   /* we accept URI or filename */
   uri = file_utils_any_to_uri (gimp, filename, &error);
@@ -627,6 +638,7 @@ file_open_from_command_line (Gimp        *gimp,
                                       gimp_get_user_context (gimp),
                                       GIMP_PROGRESS (display),
                                       uri, as_new,
+                                      screen, monitor,
                                       &status, &error);
 
       if (image)
diff --git a/app/file/file-open.h b/app/file/file-open.h
index d6651ba..523a62d 100644
--- a/app/file/file-open.h
+++ b/app/file/file-open.h
@@ -49,6 +49,8 @@ GimpImage * file_open_with_display          (Gimp                *gimp,
                                              GimpProgress        *progress,
                                              const gchar         *uri,
                                              gboolean             as_new,
+                                             GObject             *screen,
+                                             gint                 monitor,
                                              GimpPDBStatusType   *status,
                                              GError             **error);
 
@@ -59,6 +61,8 @@ GimpImage * file_open_with_proc_and_display (Gimp                *gimp,
                                              const gchar         *entered_filename,
                                              gboolean             as_new,
                                              GimpPlugInProcedure *file_proc,
+                                             GObject             *screen,
+                                             gint                 monitor,
                                              GimpPDBStatusType   *status,
                                              GError             **error);
 
@@ -75,7 +79,9 @@ GList     * file_open_layers                (Gimp                *gimp,
 
 gboolean    file_open_from_command_line     (Gimp                *gimp,
                                              const gchar         *filename,
-                                             gboolean             as_new);
+                                             gboolean             as_new,
+                                             GObject             *screen,
+                                             gint                 monitor);
 
 
 #endif /* __FILE_OPEN_H__ */
diff --git a/app/gui/gimpdbusservice.c b/app/gui/gimpdbusservice.c
index 9e90c46..f9d00eb 100644
--- a/app/gui/gimpdbusservice.c
+++ b/app/gui/gimpdbusservice.c
@@ -265,7 +265,9 @@ gimp_dbus_service_open_idle (GimpDBusService *service)
 
   if (data)
     {
-      file_open_from_command_line (service->gimp, data->uri, data->as_new);
+      file_open_from_command_line (service->gimp, data->uri, data->as_new,
+                                   NULL, /* FIXME monitor */
+                                   0 /* FIXME monitor */);
 
       gimp_dbus_service_open_data_free (data);
 
diff --git a/app/gui/gimpuiconfigurer.c b/app/gui/gimpuiconfigurer.c
index d53f450..4d051df 100644
--- a/app/gui/gimpuiconfigurer.c
+++ b/app/gui/gimpuiconfigurer.c
@@ -431,7 +431,9 @@ gimp_ui_configurer_separate_shells (GimpUIConfigurer *ui_configurer,
       new_image_window = gimp_image_window_new (ui_configurer->p->gimp,
                                                 NULL,
                                                 global_menu_factory,
-                                                gimp_dialog_factory_get_singleton ());
+                                                gimp_dialog_factory_get_singleton (),
+                                                gtk_widget_get_screen (GTK_WIDGET (source_image_window)),
+                                                gimp_widget_get_monitor (GTK_WIDGET (source_image_window)));
       /* Move the shell there */
       shell = gimp_image_window_get_shell (source_image_window, 1);
 
diff --git a/app/gui/gui-vtable.c b/app/gui/gui-vtable.c
index be513d2..b964876 100644
--- a/app/gui/gui-vtable.c
+++ b/app/gui/gui-vtable.c
@@ -104,7 +104,9 @@ static guint32        gui_display_get_window_id (GimpObject          *display);
 static GimpObject   * gui_display_create        (Gimp                *gimp,
                                                  GimpImage           *image,
                                                  GimpUnit             unit,
-                                                 gdouble              scale);
+                                                 gdouble              scale,
+                                                 GObject             *screen,
+                                                 gint                 monitor);
 static void           gui_display_delete        (GimpObject          *display);
 static void           gui_displays_reconnect    (Gimp                *gimp,
                                                  GimpImage           *old_image,
@@ -340,11 +342,16 @@ static GimpObject *
 gui_display_create (Gimp      *gimp,
                     GimpImage *image,
                     GimpUnit   unit,
-                    gdouble    scale)
+                    gdouble    scale,
+                    GObject   *screen,
+                    gint       monitor)
 {
   GimpContext *context = gimp_get_user_context (gimp);
   GimpDisplay *display = GIMP_DISPLAY (gui_get_empty_display (gimp));
 
+  if (! screen)
+    monitor = gimp_get_monitor_at_pointer ((GdkScreen **) &screen);
+
   if (display)
     {
       gimp_display_fill (display, image, unit, scale);
@@ -358,7 +365,9 @@ gui_display_create (Gimp      *gimp,
       display = gimp_display_new (gimp, image, unit, scale,
                                   global_menu_factory,
                                   image_managers->data,
-                                  gimp_dialog_factory_get_singleton ());
+                                  gimp_dialog_factory_get_singleton (),
+                                  GDK_SCREEN (screen),
+                                  monitor);
    }
 
   if (gimp_context_get_display (context) == display)
diff --git a/app/gui/gui.c b/app/gui/gui.c
index 83bfd87..576209e 100644
--- a/app/gui/gui.c
+++ b/app/gui/gui.c
@@ -572,10 +572,10 @@ gui_restore_after_callback (Gimp               *gimp,
       GimpDisplayShell *shell;
 
       /*  create the empty display  */
-      display = GIMP_DISPLAY (gimp_create_display (gimp,
-                                                   NULL,
-                                                   GIMP_UNIT_PIXEL,
-                                                   1.0));
+      display = GIMP_DISPLAY (gimp_create_display (gimp, NULL,
+                                                   GIMP_UNIT_PIXEL, 1.0,
+                                                   NULL, /* FIXME monitor */
+                                                   0 /* FIXME monitor */));
 
       shell = gimp_display_get_shell (display);
 
diff --git a/app/pdb/display-cmds.c b/app/pdb/display-cmds.c
index c2651ae..89a5e1a 100644
--- a/app/pdb/display-cmds.c
+++ b/app/pdb/display-cmds.c
@@ -78,7 +78,7 @@ display_new_invoker (GimpProcedure         *procedure,
     {
       gimp_image_flush (image);
 
-      display = gimp_create_display (gimp, image, GIMP_UNIT_PIXEL, 1.0);
+      display = gimp_create_display (gimp, image, GIMP_UNIT_PIXEL, 1.0, NULL, 0);
 
       if (display)
         {
diff --git a/app/tests/gimp-app-test-utils.c b/app/tests/gimp-app-test-utils.c
index 844d0b9..395d5a4 100644
--- a/app/tests/gimp-app-test-utils.c
+++ b/app/tests/gimp-app-test-utils.c
@@ -138,7 +138,8 @@ gimp_test_utils_create_image (Gimp *gimp,
   gimp_create_display (gimp,
                        image,
                        GIMP_UNIT_PIXEL,
-                       1.0 /*scale*/);
+                       1.0 /*scale*/,
+                       NULL, 0);
 }
 
 /**
diff --git a/app/widgets/gimpsessioninfo.c b/app/widgets/gimpsessioninfo.c
index 0538790..805fe36 100644
--- a/app/widgets/gimpsessioninfo.c
+++ b/app/widgets/gimpsessioninfo.c
@@ -582,6 +582,8 @@ gimp_session_info_restore (GimpSessionInfo   *info,
                                                      monitor,
                                                      info);
     }
+  else
+    g_printerr ("EEEEK\n");
 
   if (GIMP_IS_SESSION_MANAGED (dialog) && info->p->aux_info)
     gimp_session_managed_set_aux_info (GIMP_SESSION_MANAGED (dialog),
diff --git a/app/widgets/gimptoolbox-dnd.c b/app/widgets/gimptoolbox-dnd.c
index 449294f..6d0d6ff 100644
--- a/app/widgets/gimptoolbox-dnd.c
+++ b/app/widgets/gimptoolbox-dnd.c
@@ -42,6 +42,7 @@
 #include "gimpdnd.h"
 #include "gimptoolbox.h"
 #include "gimptoolbox-dnd.h"
+#include "gimpwidgets-utils.h"
 
 #include "gimp-intl.h"
 
@@ -158,7 +159,10 @@ gimp_toolbox_drop_uri_list (GtkWidget *widget,
       GError            *error = NULL;
 
       image = file_open_with_display (context->gimp, context, NULL,
-                                      uri, FALSE, &status, &error);
+                                      uri, FALSE,
+                                      G_OBJECT (gtk_widget_get_screen (widget)),
+                                      gimp_widget_get_monitor (widget),
+                                      &status, &error);
 
       if (! image && status != GIMP_PDB_CANCEL)
         {
@@ -189,7 +193,9 @@ gimp_toolbox_drop_drawable (GtkWidget    *widget,
 
   new_image = gimp_image_new_from_drawable (context->gimp,
                                             GIMP_DRAWABLE (viewable));
-  gimp_create_display (context->gimp, new_image, GIMP_UNIT_PIXEL, 1.0);
+  gimp_create_display (context->gimp, new_image, GIMP_UNIT_PIXEL, 1.0,
+                       G_OBJECT (gtk_widget_get_screen (widget)),
+                       gimp_widget_get_monitor (widget));
   g_object_unref (new_image);
 }
 
@@ -223,7 +229,9 @@ gimp_toolbox_drop_buffer (GtkWidget    *widget,
 
   image = gimp_image_new_from_buffer (context->gimp, NULL,
                                       GIMP_BUFFER (viewable));
-  gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0);
+  gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0,
+                       G_OBJECT (gtk_widget_get_screen (widget)),
+                       gimp_widget_get_monitor (widget));
   g_object_unref (image);
 }
 
@@ -243,7 +251,9 @@ gimp_toolbox_drop_component (GtkWidget       *widget,
 
   new_image = gimp_image_new_from_component (context->gimp,
                                              image, component);
-  gimp_create_display (new_image->gimp, new_image, GIMP_UNIT_PIXEL, 1.0);
+  gimp_create_display (new_image->gimp, new_image, GIMP_UNIT_PIXEL, 1.0,
+                       G_OBJECT (gtk_widget_get_screen (widget)),
+                       gimp_widget_get_monitor (widget));
   g_object_unref (new_image);
 }
 
@@ -262,6 +272,8 @@ gimp_toolbox_drop_pixbuf (GtkWidget *widget,
 
   new_image = gimp_image_new_from_pixbuf (context->gimp, pixbuf,
                                           _("Dropped Buffer"));
-  gimp_create_display (new_image->gimp, new_image, GIMP_UNIT_PIXEL, 1.0);
+  gimp_create_display (new_image->gimp, new_image, GIMP_UNIT_PIXEL, 1.0,
+                       G_OBJECT (gtk_widget_get_screen (widget)),
+                       gimp_widget_get_monitor (widget));
   g_object_unref (new_image);
 }
diff --git a/app/widgets/gimptoolbox.c b/app/widgets/gimptoolbox.c
index fe31a8e..4f87b31 100644
--- a/app/widgets/gimptoolbox.c
+++ b/app/widgets/gimptoolbox.c
@@ -445,7 +445,7 @@ gimp_toolbox_button_press_event (GtkWidget      *widget,
       clipboard = gtk_widget_get_clipboard (widget, GDK_SELECTION_PRIMARY);
       gtk_clipboard_request_text (clipboard,
                                   toolbox_paste_received,
-                                  g_object_ref (toolbox->p->context));
+                                  g_object_ref (toolbox));
 
       return TRUE;
     }
@@ -771,7 +771,8 @@ toolbox_paste_received (GtkClipboard *clipboard,
                         const gchar  *text,
                         gpointer      data)
 {
-  GimpContext *context = GIMP_CONTEXT (data);
+  GimpToolbox *toolbox = GIMP_TOOLBOX (data);
+  GimpContext *context = toolbox->p->context;
 
   if (text)
     {
@@ -787,12 +788,16 @@ toolbox_paste_received (GtkClipboard *clipboard,
 
       if (strlen (copy))
         {
+          GtkWidget         *widget = GTK_WIDGET (toolbox);
           GimpImage         *image;
           GimpPDBStatusType  status;
           GError            *error = NULL;
 
           image = file_open_with_display (context->gimp, context, NULL,
-                                          copy, FALSE, &status, &error);
+                                          copy, FALSE,
+                                          G_OBJECT (gtk_widget_get_screen (widget)),
+                                          gimp_widget_get_monitor (widget),
+                                          &status, &error);
 
           if (! image && status != GIMP_PDB_CANCEL)
             {
diff --git a/tools/pdbgen/pdb/display.pdb b/tools/pdbgen/pdb/display.pdb
index ca0fa6b..9606191 100644
--- a/tools/pdbgen/pdb/display.pdb
+++ b/tools/pdbgen/pdb/display.pdb
@@ -73,7 +73,7 @@ HELP
 {
   gimp_image_flush (image);
 
-  display = gimp_create_display (gimp, image, GIMP_UNIT_PIXEL, 1.0);
+  display = gimp_create_display (gimp, image, GIMP_UNIT_PIXEL, 1.0, NULL, 0);
 
   if (display)
     {



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