GitLab repository storage has been migrated to hashed layout. Please contact Infrastructure team if you notice any issues with repositories or hooks.

Commit 49b8176a authored by Sven Neumann's avatar Sven Neumann Committed by Sven Neumann

Allow other applications to open images in GIMP as if they were new images

2007-04-17  Sven Neumann  <sven@gimp.org>

	Allow other applications to open images in GIMP as if they were
	new images (without associating a filename). Fixes bug #423118.

	* app/file/file-open.[ch]: added parameter 'as_new' to
	file_open_image() and its variants.

	* app/actions/data-commands.c
	* app/actions/documents-commands.c
	* app/actions/file-commands.c
	* app/core/gimpimagefile.c
	* app/dialogs/file-open-dialog.c
	* app/dialogs/file-open-location-dialog.c
	* app/widgets/gimptoolbox.c
	* app/widgets/gimptoolbox-dnd.c: changed accordingly.

	* app/app.[ch]
	* app/main.c: added new command-line option '--as-new'.

	* app/widgets/gimpdbusservice.[ch]
	* app/widgets/dbus-service.xml: added new method "OpenAsNew" to the
	D-Bus interface.

	* docs/gimp.1.in: document the new command-line option.


svn path=/trunk/; revision=22264
parent ef339861
2007-04-17 Sven Neumann <sven@gimp.org>
Allow other applications to open images in GIMP as if they were
new images (without associating a filename). Fixes bug #423118.
* app/file/file-open.[ch]: added parameter 'as_new' to
file_open_image() and its variants.
* app/actions/data-commands.c
* app/actions/documents-commands.c
* app/actions/file-commands.c
* app/core/gimpimagefile.c
* app/dialogs/file-open-dialog.c
* app/dialogs/file-open-location-dialog.c
* app/widgets/gimptoolbox.c
* app/widgets/gimptoolbox-dnd.c: changed accordingly.
* app/app.[ch]
* app/main.c: added new command-line option '--as-new'.
* app/widgets/gimpdbusservice.[ch]
* app/widgets/dbus-service.xml: added new method "OpenAsNew" to the
D-Bus interface.
* docs/gimp.1.in: document the new command-line option.
2007-04-17 Sven Neumann <sven@gimp.org>
* plug-ins/script-fu/scripts/neon-logo.scm: applied slightly
......@@ -92,7 +92,8 @@ data_open_as_image_cmd_callback (GtkAction *action,
GimpPDBStatusType status;
GError *error = NULL;
image = file_open_with_display (context->gimp, context, NULL, uri,
image = file_open_with_display (context->gimp, context, NULL,
uri, FALSE,
&status, &error);
if (! image && status != GIMP_PDB_CANCEL)
......
......@@ -309,8 +309,8 @@ documents_open_image (GimpContext *context,
uri = gimp_object_get_name (GIMP_OBJECT (imagefile));
image = file_open_with_display (context->gimp, context, NULL,
uri, &status, &error);
image = file_open_with_display (context->gimp, context, NULL, uri, FALSE,
&status, &error);
if (! image && status != GIMP_PDB_CANCEL)
{
......
......@@ -157,7 +157,7 @@ file_last_opened_cmd_callback (GtkAction *action,
image = file_open_with_display (gimp, action_data_get_context (data),
NULL,
GIMP_OBJECT (imagefile)->name,
GIMP_OBJECT (imagefile)->name, FALSE,
&status, &error);
if (! image && status != GIMP_PDB_CANCEL)
......@@ -566,7 +566,7 @@ file_revert_confirm_response (GtkWidget *dialog,
new_image = file_open_image (gimp, gimp_get_user_context (gimp),
GIMP_PROGRESS (display),
uri, uri, NULL,
uri, uri, FALSE, NULL,
GIMP_RUN_INTERACTIVE,
&status, NULL, &error);
......
......@@ -121,6 +121,7 @@ app_run (const gchar *full_prog_name,
const gchar *session_name,
const gchar *batch_interpreter,
const gchar **batch_commands,
gboolean as_new,
gboolean no_interface,
gboolean no_data,
gboolean no_fonts,
......@@ -224,7 +225,7 @@ app_run (const gchar *full_prog_name,
gint i;
for (i = 0; filenames[i] != NULL; i++)
file_open_from_command_line (gimp, filenames[i]);
file_open_from_command_line (gimp, filenames[i], as_new);
}
#ifndef GIMP_CONSOLE_COMPILATION
......
......@@ -38,6 +38,7 @@ void app_run (const gchar *full_prog_name,
const gchar *session_name,
const gchar *batch_interpreter,
const gchar **batch_commands,
gboolean as_new,
gboolean no_interface,
gboolean no_data,
gboolean no_fonts,
......
......@@ -261,8 +261,9 @@ gimp_imagefile_create_thumbnail (GimpImagefile *imagefile,
GimpPDBStatusType status;
image = file_open_image (imagefile->gimp, context, progress,
thumbnail->image_uri, thumbnail->image_uri,
NULL, GIMP_RUN_NONINTERACTIVE,
thumbnail->image_uri,
thumbnail->image_uri,
FALSE, NULL, GIMP_RUN_NONINTERACTIVE,
&status, &mime_type, NULL);
if (image)
......
......@@ -187,11 +187,9 @@ file_open_dialog_open_image (GtkWidget *open_dialog,
image = file_open_with_proc_and_display (gimp,
gimp_get_user_context (gimp),
GIMP_PROGRESS (open_dialog),
uri,
entered_filename,
uri, entered_filename, FALSE,
load_proc,
&status,
&error);
&status, &error);
if (image)
{
......
......@@ -202,7 +202,7 @@ file_open_location_response (GtkDialog *dialog,
image = file_open_with_proc_and_display (gimp,
gimp_get_user_context (gimp),
GIMP_PROGRESS (box),
uri, text, NULL,
uri, text, FALSE, NULL,
&status, &error);
if (image == NULL && status != GIMP_PDB_CANCEL)
......
......@@ -70,7 +70,8 @@
#include "gimp-intl.h"
static void file_open_sanitize_image (GimpImage *image);
static void file_open_sanitize_image (GimpImage *image,
gboolean as_new);
static void file_open_handle_color_profile (GimpImage *image,
GimpContext *context,
GimpProgress *progress,
......@@ -85,6 +86,7 @@ file_open_image (Gimp *gimp,
GimpProgress *progress,
const gchar *uri,
const gchar *entered_filename,
gboolean as_new,
GimpPlugInProcedure *file_proc,
GimpRunMode run_mode,
GimpPDBStatusType *status,
......@@ -158,7 +160,7 @@ file_open_image (Gimp *gimp,
if (image)
{
file_open_sanitize_image (image);
file_open_sanitize_image (image, as_new);
if (mime_type)
*mime_type = file_proc->mime_type;
......@@ -255,7 +257,7 @@ file_open_thumbnail (Gimp *gimp,
if (image)
{
file_open_sanitize_image (image);
file_open_sanitize_image (image, FALSE);
*mime_type = file_proc->mime_type;
......@@ -279,11 +281,13 @@ file_open_with_display (Gimp *gimp,
GimpContext *context,
GimpProgress *progress,
const gchar *uri,
gboolean as_new,
GimpPDBStatusType *status,
GError **error)
{
return file_open_with_proc_and_display (gimp, context, progress,
uri, uri, NULL, status, error);
uri, uri, as_new, NULL,
status, error);
}
GimpImage *
......@@ -292,6 +296,7 @@ file_open_with_proc_and_display (Gimp *gimp,
GimpProgress *progress,
const gchar *uri,
const gchar *entered_filename,
gboolean as_new,
GimpPlugInProcedure *file_proc,
GimpPDBStatusType *status,
GError **error)
......@@ -307,6 +312,7 @@ file_open_with_proc_and_display (Gimp *gimp,
image = file_open_image (gimp, context, progress,
uri,
entered_filename,
as_new,
file_proc,
GIMP_RUN_INTERACTIVE,
status,
......@@ -315,27 +321,30 @@ file_open_with_proc_and_display (Gimp *gimp,
if (image)
{
GimpDocumentList *documents = GIMP_DOCUMENT_LIST (gimp->documents);
GimpImagefile *imagefile;
gimp_create_display (image->gimp, image, GIMP_UNIT_PIXEL, 1.0);
imagefile = gimp_document_list_add_uri (documents, uri, mime_type);
/* can only create a thumbnail if the passed uri and the
* resulting image's uri match.
*/
if (strcmp (uri, gimp_image_get_uri (image)) == 0)
if (! as_new)
{
/* no need to save a thumbnail if there's a good one already */
if (! gimp_imagefile_check_thumbnail (imagefile))
GimpDocumentList *documents = GIMP_DOCUMENT_LIST (gimp->documents);
GimpImagefile *imagefile;
imagefile = gimp_document_list_add_uri (documents, uri, mime_type);
/* can only create a thumbnail if the passed uri and the
* resulting image's uri match.
*/
if (strcmp (uri, gimp_image_get_uri (image)) == 0)
{
gimp_imagefile_save_thumbnail (imagefile, mime_type, image);
/* no need to save a thumbnail if there's a good one already */
if (! gimp_imagefile_check_thumbnail (imagefile))
{
gimp_imagefile_save_thumbnail (imagefile, mime_type, image);
}
}
}
if (gimp->config->save_document_history)
gimp_recent_list_add_uri (uri, mime_type);
if (gimp->config->save_document_history)
gimp_recent_list_add_uri (uri, mime_type);
}
/* the display owns the image now */
g_object_unref (image);
......@@ -369,7 +378,7 @@ file_open_layers (Gimp *gimp,
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
new_image = file_open_image (gimp, context, progress,
uri, uri,
uri, uri, FALSE,
file_proc,
run_mode,
status, &mime_type, error);
......@@ -464,7 +473,8 @@ file_open_layers (Gimp *gimp,
*/
gboolean
file_open_from_command_line (Gimp *gimp,
const gchar *filename)
const gchar *filename,
gboolean as_new)
{
GError *error = NULL;
gchar *uri;
......@@ -484,7 +494,7 @@ file_open_from_command_line (Gimp *gimp,
image = file_open_with_display (gimp,
gimp_get_user_context (gimp),
NULL,
uri,
uri, as_new,
&status, &error);
if (image)
......@@ -517,8 +527,12 @@ file_open_from_command_line (Gimp *gimp,
/* private functions */
static void
file_open_sanitize_image (GimpImage *image)
file_open_sanitize_image (GimpImage *image,
gboolean as_new)
{
if (as_new)
gimp_object_set_name (GIMP_OBJECT (image), NULL);
/* clear all undo steps */
gimp_image_undo_free (image);
......
......@@ -27,6 +27,7 @@ GimpImage * file_open_image (Gimp *gimp,
GimpProgress *progress,
const gchar *uri,
const gchar *entered_filename,
gboolean as_new,
GimpPlugInProcedure *file_proc,
GimpRunMode run_mode,
GimpPDBStatusType *status,
......@@ -45,6 +46,7 @@ GimpImage * file_open_with_display (Gimp *gimp,
GimpContext *context,
GimpProgress *progress,
const gchar *uri,
gboolean as_new,
GimpPDBStatusType *status,
GError **error);
......@@ -53,6 +55,7 @@ GimpImage * file_open_with_proc_and_display (Gimp *gimp,
GimpProgress *progress,
const gchar *uri,
const gchar *entered_filename,
gboolean as_new,
GimpPlugInProcedure *file_proc,
GimpPDBStatusType *status,
GError **error);
......@@ -69,7 +72,8 @@ GList * file_open_layers (Gimp *gimp,
GError **error);
gboolean file_open_from_command_line (Gimp *gimp,
const gchar *filename);
const gchar *filename,
gboolean as_new);
#endif /* __FILE_OPEN_H__ */
......@@ -106,6 +106,7 @@ static void gimp_open_console_window (void);
#endif
static gboolean gimp_dbus_open (const gchar **filenames,
gboolean as_new,
gboolean be_verbose);
......@@ -115,6 +116,7 @@ static const gchar *session_name = NULL;
static const gchar *batch_interpreter = NULL;
static const gchar **batch_commands = NULL;
static const gchar **filenames = NULL;
static gboolean as_new = FALSE;
static gboolean no_interface = FALSE;
static gboolean no_data = FALSE;
static gboolean no_fonts = FALSE;
......@@ -160,6 +162,11 @@ static const GOptionEntry main_entries[] =
G_OPTION_ARG_NONE, &new_instance,
N_("Start a new GIMP instance"), NULL
},
{
"as-new", 'a', 0,
G_OPTION_ARG_NONE, &as_new,
N_("Open images as new"), NULL
},
{
"no-interface", 'i', 0,
G_OPTION_ARG_NONE, &no_interface,
......@@ -362,7 +369,7 @@ main (int argc,
if (! new_instance)
{
if (gimp_dbus_open (filenames, be_verbose))
if (gimp_dbus_open (filenames, as_new, be_verbose))
return EXIT_SUCCESS;
}
......@@ -379,6 +386,7 @@ main (int argc,
session_name,
batch_interpreter,
batch_commands,
as_new,
no_interface,
no_data,
no_fonts,
......@@ -681,6 +689,7 @@ gimp_sigfatal_handler (gint sig_num)
static gboolean
gimp_dbus_open (const gchar **filenames,
gboolean as_new,
gboolean be_verbose)
{
#ifndef GIMP_CONSOLE_COMPILATION
......@@ -700,13 +709,14 @@ gimp_dbus_open (const gchar **filenames,
if (filenames)
{
gint i;
const gchar *method = as_new ? "OpenAsNew" : "Open";
gint i;
for (i = 0, success = TRUE; filenames[i] && success; i++)
{
gboolean retval; /* ignored */
success = dbus_g_proxy_call (proxy, "Open", &error,
success = dbus_g_proxy_call (proxy, method, &error,
G_TYPE_STRING, filenames[i],
G_TYPE_INVALID,
G_TYPE_BOOLEAN, &retval,
......
......@@ -9,6 +9,10 @@
<arg type="s" name="filename" direction="in" />
<arg type="b" name="success" direction="out" />
</method>
<method name="OpenAsNew">
<arg type="s" name="filename" direction="in" />
<arg type="b" name="success" direction="out" />
</method>
<method name="Activate" />
</interface>
......
......@@ -78,7 +78,22 @@ gimp_dbus_service_open (GimpDBusService *service,
g_return_val_if_fail (filename != NULL, FALSE);
g_return_val_if_fail (success != NULL, FALSE);
*success = file_open_from_command_line (service->gimp, filename);
*success = file_open_from_command_line (service->gimp, filename, FALSE);
return TRUE;
}
gboolean
gimp_dbus_service_open_as_new (GimpDBusService *service,
const gchar *filename,
gboolean *success,
GError **dbus_error)
{
g_return_val_if_fail (GIMP_IS_DBUS_SERVICE (service), FALSE);
g_return_val_if_fail (filename != NULL, FALSE);
g_return_val_if_fail (success != NULL, FALSE);
*success = file_open_from_command_line (service->gimp, filename, TRUE);
return TRUE;
}
......
......@@ -62,6 +62,10 @@ gboolean gimp_dbus_service_open (GimpDBusService *service,
const gchar *filename,
gboolean *success,
GError **dbus_error);
gboolean gimp_dbus_service_open_as_new (GimpDBusService *service,
const gchar *filename,
gboolean *success,
GError **dbus_error);
gboolean gimp_dbus_service_activate (GimpDBusService *service,
GError **dbus_error);
......
......@@ -148,7 +148,7 @@ gimp_toolbox_drop_uri_list (GtkWidget *widget,
GError *error = NULL;
image = file_open_with_display (context->gimp, context, NULL,
uri, &status, &error);
uri, FALSE, &status, &error);
if (! image && status != GIMP_PDB_CANCEL)
{
......
......@@ -902,7 +902,7 @@ toolbox_paste_received (GtkClipboard *clipboard,
GError *error = NULL;
image = file_open_with_display (context->gimp, context, NULL,
copy, &status, &error);
copy, FALSE, &status, &error);
if (! image && status != GIMP_PDB_CANCEL)
{
......
......@@ -7,7 +7,7 @@ gimp - an image manipulation and paint program.
.SH SYNOPSIS
.B gimp
[\-h] [\-\-help] [\-\-help-all] [\-\-help-gtk] [-v] [\-\-version]
[\-\-license] [\-\-verbose] [\-n] [\-\-new\-instance]
[\-\-license] [\-\-verbose] [\-n] [\-\-new\-instance] [\-a] [\-\-as\-new]
[\-i] [\-\-no\-interface] [\-d] [\-\-no\-data] [\-f] [\-\-no\-fonts]
[\-s] [\-\-no\-splash] [\-\-no\-shm] [\-\-no\-cpu\-accel]
[\-\-display \fIdisplay\fP] [\-\-session \fI<name>\fP]
......@@ -69,13 +69,17 @@ Output license information and exit.
.B \-\-verbose
Be verbose and create information on standard output.
.TP 8
.B \-i, \-\-no\-interface
Run without a user interface.
.TP 8
.B \-n, \-\-new\-instance
Do not attempt to reuse an already running GIMP instance. Always start a
new one.
.TP 8
.B \-a, \-\-as\-new
Open filenames passed on the command-line as new images, don't set the
filename on them.
.TP 8
.B \-i, \-\-no\-interface
Run without a user interface.
.TP 8
.B \-d, \-\-no\-data
Do not load patterns, gradients, palettes, or brushes. Often useful
in non-interactive situations where startup time is to be minimized.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment