Commit cd2b3951 authored by Jehan's avatar Jehan

app: batch commands won't run on existing instance.

parent 71675869
...@@ -14,6 +14,12 @@ ...@@ -14,6 +14,12 @@
<arg type="b" name="success" direction="out" /> <arg type="b" name="success" direction="out" />
</method> </method>
<method name="BatchRun">
<arg type="s" name="interpreter" direction="in" />
<arg type="s" name="command" direction="in" />
<arg type="b" name="success" direction="out" />
</method>
<method name="Activate" /> <method name="Activate" />
<signal name="Opened"> <signal name="Opened">
......
...@@ -34,6 +34,12 @@ ...@@ -34,6 +34,12 @@
#include "display/gimpdisplay.h" #include "display/gimpdisplay.h"
#include "display/gimpdisplayshell.h" #include "display/gimpdisplayshell.h"
/* Dirty hack since we are not supposed to include batch.h
* from an app/ subdir. DBus is a special case. */
#define GIMP_APP_GLUE_COMPILATION
#include "batch.h"
#undef GIMP_APP_GLUE_COMPILATION
#include "gimpdbusservice.h" #include "gimpdbusservice.h"
...@@ -41,8 +47,10 @@ typedef struct ...@@ -41,8 +47,10 @@ typedef struct
{ {
GFile *file; GFile *file;
gboolean as_new; gboolean as_new;
} OpenData;
gchar *interpreter;
gchar *command;
} IdleData;
static void gimp_dbus_service_ui_iface_init (GimpDBusServiceUIIface *iface); static void gimp_dbus_service_ui_iface_init (GimpDBusServiceUIIface *iface);
...@@ -59,6 +67,11 @@ static gboolean gimp_dbus_service_open_as_new (GimpDBusServiceUI *servi ...@@ -59,6 +67,11 @@ static gboolean gimp_dbus_service_open_as_new (GimpDBusServiceUI *servi
GDBusMethodInvocation *invocation, GDBusMethodInvocation *invocation,
const gchar *uri); const gchar *uri);
static gboolean gimp_dbus_service_batch_run (GimpDBusServiceUI *service,
GDBusMethodInvocation *invocation,
const gchar *batch_interpreter,
const gchar *batch_command);
static void gimp_dbus_service_gimp_opened (Gimp *gimp, static void gimp_dbus_service_gimp_opened (Gimp *gimp,
GFile *file, GFile *file,
GimpDBusService *service); GimpDBusService *service);
...@@ -66,12 +79,18 @@ static void gimp_dbus_service_gimp_opened (Gimp *gimp, ...@@ -66,12 +79,18 @@ static void gimp_dbus_service_gimp_opened (Gimp *gimp,
static gboolean gimp_dbus_service_queue_open (GimpDBusService *service, static gboolean gimp_dbus_service_queue_open (GimpDBusService *service,
const gchar *uri, const gchar *uri,
gboolean as_new); gboolean as_new);
static gboolean gimp_dbus_service_queue_batch (GimpDBusService *service,
const gchar *interpreter,
const gchar *command);
static gboolean gimp_dbus_service_open_idle (GimpDBusService *service); static gboolean gimp_dbus_service_process_idle (GimpDBusService *service);
static OpenData * gimp_dbus_service_open_data_new (GimpDBusService *service, static IdleData * gimp_dbus_service_open_data_new (GimpDBusService *service,
const gchar *uri, const gchar *uri,
gboolean as_new); gboolean as_new);
static void gimp_dbus_service_open_data_free (OpenData *data); static IdleData * gimp_dbus_service_batch_data_new (GimpDBusService *service,
const gchar *interpreter,
const gchar *command);
static void gimp_dbus_service_idle_data_free (IdleData *data);
G_DEFINE_TYPE_WITH_CODE (GimpDBusService, gimp_dbus_service, G_DEFINE_TYPE_WITH_CODE (GimpDBusService, gimp_dbus_service,
...@@ -103,6 +122,7 @@ gimp_dbus_service_ui_iface_init (GimpDBusServiceUIIface *iface) ...@@ -103,6 +122,7 @@ gimp_dbus_service_ui_iface_init (GimpDBusServiceUIIface *iface)
iface->handle_activate = gimp_dbus_service_activate; iface->handle_activate = gimp_dbus_service_activate;
iface->handle_open = gimp_dbus_service_open; iface->handle_open = gimp_dbus_service_open;
iface->handle_open_as_new = gimp_dbus_service_open_as_new; iface->handle_open_as_new = gimp_dbus_service_open_as_new;
iface->handle_batch_run = gimp_dbus_service_batch_run;
} }
GObject * GObject *
...@@ -136,7 +156,7 @@ gimp_dbus_service_dispose (GObject *object) ...@@ -136,7 +156,7 @@ gimp_dbus_service_dispose (GObject *object)
while (! g_queue_is_empty (service->queue)) while (! g_queue_is_empty (service->queue))
{ {
gimp_dbus_service_open_data_free (g_queue_pop_head (service->queue)); gimp_dbus_service_idle_data_free (g_queue_pop_head (service->queue));
} }
G_OBJECT_CLASS (parent_class)->dispose (object); G_OBJECT_CLASS (parent_class)->dispose (object);
...@@ -210,6 +230,23 @@ gimp_dbus_service_open_as_new (GimpDBusServiceUI *service, ...@@ -210,6 +230,23 @@ gimp_dbus_service_open_as_new (GimpDBusServiceUI *service,
return TRUE; return TRUE;
} }
gboolean
gimp_dbus_service_batch_run (GimpDBusServiceUI *service,
GDBusMethodInvocation *invocation,
const gchar *batch_interpreter,
const gchar *batch_command)
{
gboolean success;
success = gimp_dbus_service_queue_batch (GIMP_DBUS_SERVICE (service),
batch_interpreter,
batch_command);
gimp_dbus_service_ui_complete_batch_run (service, invocation, success);
return TRUE;
}
static void static void
gimp_dbus_service_gimp_opened (Gimp *gimp, gimp_dbus_service_gimp_opened (Gimp *gimp,
GFile *file, GFile *file,
...@@ -240,7 +277,41 @@ gimp_dbus_service_queue_open (GimpDBusService *service, ...@@ -240,7 +277,41 @@ gimp_dbus_service_queue_open (GimpDBusService *service,
g_source_set_priority (service->source, G_PRIORITY_LOW); g_source_set_priority (service->source, G_PRIORITY_LOW);
g_source_set_callback (service->source, g_source_set_callback (service->source,
(GSourceFunc) gimp_dbus_service_open_idle, service, (GSourceFunc) gimp_dbus_service_process_idle,
service,
NULL);
g_source_attach (service->source, NULL);
g_source_unref (service->source);
}
/* The call always succeeds as it is handled in one way or another.
* Even presenting an error message is considered success ;-)
*/
return TRUE;
}
/*
* Adds a request to run a batch command to the end of the queue and
* starts an idle source if it is not already running.
*/
static gboolean
gimp_dbus_service_queue_batch (GimpDBusService *service,
const gchar *interpreter,
const gchar *command)
{
g_queue_push_tail (service->queue,
gimp_dbus_service_batch_data_new (service,
interpreter,
command));
if (! service->source)
{
service->source = g_idle_source_new ();
g_source_set_priority (service->source, G_PRIORITY_LOW);
g_source_set_callback (service->source,
(GSourceFunc) gimp_dbus_service_process_idle,
service,
NULL); NULL);
g_source_attach (service->source, NULL); g_source_attach (service->source, NULL);
g_source_unref (service->source); g_source_unref (service->source);
...@@ -258,9 +329,9 @@ gimp_dbus_service_queue_open (GimpDBusService *service, ...@@ -258,9 +329,9 @@ gimp_dbus_service_queue_open (GimpDBusService *service,
* removed. * removed.
*/ */
static gboolean static gboolean
gimp_dbus_service_open_idle (GimpDBusService *service) gimp_dbus_service_process_idle (GimpDBusService *service)
{ {
OpenData *data; IdleData *data;
if (! service->gimp->restored) if (! service->gimp->restored)
return TRUE; return TRUE;
...@@ -269,11 +340,20 @@ gimp_dbus_service_open_idle (GimpDBusService *service) ...@@ -269,11 +340,20 @@ gimp_dbus_service_open_idle (GimpDBusService *service)
if (data) if (data)
{ {
file_open_from_command_line (service->gimp, data->file, data->as_new,
NULL, /* FIXME monitor */
0 /* FIXME monitor */);
gimp_dbus_service_open_data_free (data); if (data->file)
file_open_from_command_line (service->gimp, data->file, data->as_new,
NULL, /* FIXME monitor */
0 /* FIXME monitor */);
if (data->command)
{
const gchar *commands[2] = {data->command, 0};
batch_run (service->gimp, data->interpreter,
commands);
}
gimp_dbus_service_idle_data_free (data);
return TRUE; return TRUE;
} }
...@@ -283,22 +363,51 @@ gimp_dbus_service_open_idle (GimpDBusService *service) ...@@ -283,22 +363,51 @@ gimp_dbus_service_open_idle (GimpDBusService *service)
return FALSE; return FALSE;
} }
static OpenData * static IdleData *
gimp_dbus_service_open_data_new (GimpDBusService *service, gimp_dbus_service_open_data_new (GimpDBusService *service,
const gchar *uri, const gchar *uri,
gboolean as_new) gboolean as_new)
{ {
OpenData *data = g_slice_new (OpenData); IdleData *data = g_slice_new (IdleData);
data->file = g_file_new_for_uri (uri);
data->as_new = as_new;
data->interpreter = NULL;
data->command = NULL;
return data;
}
static IdleData *
gimp_dbus_service_batch_data_new (GimpDBusService *service,
const gchar *interpreter,
const gchar *command)
{
IdleData *data = g_slice_new (IdleData);
data->file = NULL;
data->as_new = FALSE;
data->file = g_file_new_for_uri (uri); data->command = g_strdup (command);
data->as_new = as_new;
if (g_strcmp0 (interpreter, "") == 0)
data->interpreter = NULL;
else
data->interpreter = g_strdup (interpreter);
return data; return data;
} }
static void static void
gimp_dbus_service_open_data_free (OpenData *data) gimp_dbus_service_idle_data_free (IdleData *data)
{ {
g_object_unref (data->file); if (data->file)
g_slice_free (OpenData, data); g_object_unref (data->file);
if (data->command)
g_free (data->command);
if (data->interpreter)
g_free (data->interpreter);
g_slice_free (IdleData, data);
} }
...@@ -483,6 +483,9 @@ main (int argc, ...@@ -483,6 +483,9 @@ main (int argc,
g_print ("%s\n", g_print ("%s\n",
_("Another GIMP instance is already running.")); _("Another GIMP instance is already running."));
if (batch_commands)
gimp_unique_batch_run (batch_interpreter, batch_commands);
gdk_notify_startup_complete (); gdk_notify_startup_complete ();
return EXIT_SUCCESS; return EXIT_SUCCESS;
......
...@@ -25,6 +25,11 @@ ...@@ -25,6 +25,11 @@
#include "core/core-types.h" #include "core/core-types.h"
#ifndef GIMP_CONSOLE_COMPILATION
/* for the DBus service names */
#include "gui/gimpdbusservice.h"
#endif
#include "unique.h" #include "unique.h"
...@@ -34,6 +39,8 @@ static gboolean gimp_unique_dbus_open (const gchar **filenames, ...@@ -34,6 +39,8 @@ static gboolean gimp_unique_dbus_open (const gchar **filenames,
static gboolean gimp_unique_win32_open (const gchar **filenames, static gboolean gimp_unique_win32_open (const gchar **filenames,
gboolean as_new); gboolean as_new);
#endif #endif
static gboolean gimp_unique_dbus_batch_run (const gchar *batch_interpreter,
const gchar **batch_commands);
gboolean gboolean
gimp_unique_open (const gchar **filenames, gimp_unique_open (const gchar **filenames,
...@@ -46,15 +53,25 @@ gimp_unique_open (const gchar **filenames, ...@@ -46,15 +53,25 @@ gimp_unique_open (const gchar **filenames,
#endif #endif
} }
gboolean
gimp_unique_batch_run (const gchar *batch_interpreter,
const gchar **batch_commands)
{
#ifdef G_OS_WIN32
g_printerr ("Batch commands cannot be run in existing instance in Win32.\n");
return FALSE;
#else
return gimp_unique_dbus_batch_run (batch_interpreter,
batch_commands);
#endif
}
static gboolean static gboolean
gimp_unique_dbus_open (const gchar **filenames, gimp_unique_dbus_open (const gchar **filenames,
gboolean as_new) gboolean as_new)
{ {
#ifndef GIMP_CONSOLE_COMPILATION #ifndef GIMP_CONSOLE_COMPILATION
/* for the DBus service names */
#include "gui/gimpdbusservice.h"
GDBusConnection *connection; GDBusConnection *connection;
GError *error = NULL; GError *error = NULL;
...@@ -211,3 +228,62 @@ gimp_unique_win32_open (const gchar **filenames, ...@@ -211,3 +228,62 @@ gimp_unique_win32_open (const gchar **filenames,
} }
#endif /* G_OS_WIN32 */ #endif /* G_OS_WIN32 */
static gboolean
gimp_unique_dbus_batch_run (const gchar *batch_interpreter,
const gchar **batch_commands)
{
#ifndef GIMP_CONSOLE_COMPILATION
GDBusConnection *connection;
GError *error = NULL;
connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
if (connection)
{
const gchar *method = "BatchRun";
gboolean success = TRUE;
gint i;
for (i = 0; batch_commands[i] && success; i++)
{
GVariant *result;
const gchar *interpreter;
/* NULL is not a valid string GVariant. */
interpreter = batch_interpreter ? batch_interpreter : "";
result = g_dbus_connection_call_sync (connection,
GIMP_DBUS_SERVICE_NAME,
GIMP_DBUS_SERVICE_PATH,
GIMP_DBUS_INTERFACE_NAME,
method,
g_variant_new ("(ss)",
interpreter,
batch_commands[i]),
NULL,
G_DBUS_CALL_FLAGS_NO_AUTO_START,
-1,
NULL, NULL);
if (result)
g_variant_unref (result);
else
success = FALSE;
}
g_object_unref (connection);
return success;
}
else
{
g_printerr ("%s\n", error->message);
g_clear_error (&error);
}
#endif
return FALSE;
}
...@@ -22,5 +22,8 @@ ...@@ -22,5 +22,8 @@
gboolean gimp_unique_open (const gchar **filenames, gboolean gimp_unique_open (const gchar **filenames,
gboolean as_new); gboolean as_new);
gboolean gimp_unique_batch_run (const gchar *batch_interpreter,
const gchar **batch_commands);
#endif /* __UNIQUE_H__ */ #endif /* __UNIQUE_H__ */
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