Implement -e or --execute to perform various commands
Currently any GtkAction in MidoriBrowser is recognized as a command, no arguments are supported. Commands affect either a newly run instance or a currently running one.
This commit is contained in:
parent
7bab565d0e
commit
abccaf02da
3 changed files with 112 additions and 2 deletions
|
@ -1269,6 +1269,7 @@ midori_load_session (gpointer data)
|
||||||
KatzeArray* session;
|
KatzeArray* session;
|
||||||
KatzeItem* item;
|
KatzeItem* item;
|
||||||
guint i;
|
guint i;
|
||||||
|
gchar** command = g_object_get_data (G_OBJECT (app), "execute-command");
|
||||||
|
|
||||||
browser = midori_app_create_browser (app);
|
browser = midori_app_create_browser (app);
|
||||||
midori_app_add_browser (app, browser);
|
midori_app_add_browser (app, browser);
|
||||||
|
@ -1323,6 +1324,9 @@ midori_load_session (gpointer data)
|
||||||
(GWeakNotify)(midori_browser_weak_notify_cb), browser);
|
(GWeakNotify)(midori_browser_weak_notify_cb), browser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (command)
|
||||||
|
midori_app_send_command (app, command);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1401,6 +1405,7 @@ main (int argc,
|
||||||
gchar* config;
|
gchar* config;
|
||||||
gboolean run;
|
gboolean run;
|
||||||
gchar* snapshot;
|
gchar* snapshot;
|
||||||
|
gboolean execute;
|
||||||
gboolean version;
|
gboolean version;
|
||||||
gchar** uris;
|
gchar** uris;
|
||||||
MidoriApp* app;
|
MidoriApp* app;
|
||||||
|
@ -1420,6 +1425,8 @@ main (int argc,
|
||||||
{ "snapshot", 's', 0, G_OPTION_ARG_STRING, &snapshot,
|
{ "snapshot", 's', 0, G_OPTION_ARG_STRING, &snapshot,
|
||||||
N_("Take a snapshot of the specified URI"), NULL },
|
N_("Take a snapshot of the specified URI"), NULL },
|
||||||
#endif
|
#endif
|
||||||
|
{ "execute", 'e', 0, G_OPTION_ARG_NONE, &execute,
|
||||||
|
N_("Execute the specified command"), NULL },
|
||||||
{ "version", 'V', 0, G_OPTION_ARG_NONE, &version,
|
{ "version", 'V', 0, G_OPTION_ARG_NONE, &version,
|
||||||
N_("Display program version"), NULL },
|
N_("Display program version"), NULL },
|
||||||
{ G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &uris,
|
{ G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &uris,
|
||||||
|
@ -1463,6 +1470,7 @@ main (int argc,
|
||||||
config = NULL;
|
config = NULL;
|
||||||
run = FALSE;
|
run = FALSE;
|
||||||
snapshot = NULL;
|
snapshot = NULL;
|
||||||
|
execute = FALSE;
|
||||||
version = FALSE;
|
version = FALSE;
|
||||||
uris = NULL;
|
uris = NULL;
|
||||||
error = NULL;
|
error = NULL;
|
||||||
|
@ -1594,8 +1602,9 @@ main (int argc,
|
||||||
{
|
{
|
||||||
GtkWidget* dialog;
|
GtkWidget* dialog;
|
||||||
|
|
||||||
/* TODO: Open as many tabs as we have uris, seperated by pipes */
|
if (execute)
|
||||||
if (uris)
|
result = midori_app_send_command (app, uris);
|
||||||
|
else if (uris) /* TODO: Open a tab per URI, seperated by pipes */
|
||||||
result = midori_app_instance_send_uris (app, uris);
|
result = midori_app_instance_send_uris (app, uris);
|
||||||
else
|
else
|
||||||
result = midori_app_instance_send_new_browser (app);
|
result = midori_app_instance_send_new_browser (app);
|
||||||
|
@ -1755,6 +1764,9 @@ main (int argc,
|
||||||
}
|
}
|
||||||
g_string_free (error_messages, TRUE);
|
g_string_free (error_messages, TRUE);
|
||||||
|
|
||||||
|
/* If -e or --execute was specified, "uris" refers to the command. */
|
||||||
|
if (!execute)
|
||||||
|
{
|
||||||
/* Open as many tabs as we have uris, seperated by pipes */
|
/* Open as many tabs as we have uris, seperated by pipes */
|
||||||
i = 0;
|
i = 0;
|
||||||
while (uris && uris[i])
|
while (uris && uris[i])
|
||||||
|
@ -1772,6 +1784,7 @@ main (int argc,
|
||||||
g_free (uri);
|
g_free (uri);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
katze_assign (config_file, build_config_filename ("config"));
|
katze_assign (config_file, build_config_filename ("config"));
|
||||||
if (is_writable (config_file))
|
if (is_writable (config_file))
|
||||||
|
@ -1870,6 +1883,9 @@ main (int argc,
|
||||||
katze_item_set_parent (KATZE_ITEM (_session), app);
|
katze_item_set_parent (KATZE_ITEM (_session), app);
|
||||||
g_idle_add (midori_load_session, _session);
|
g_idle_add (midori_load_session, _session);
|
||||||
|
|
||||||
|
if (execute)
|
||||||
|
g_object_set_data (G_OBJECT (app), "execute-command", uris);
|
||||||
|
|
||||||
gtk_main ();
|
gtk_main ();
|
||||||
|
|
||||||
#if HAVE_HILDON
|
#if HAVE_HILDON
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
typedef gpointer MidoriAppInstance;
|
typedef gpointer MidoriAppInstance;
|
||||||
#define MidoriAppInstanceNull NULL
|
#define MidoriAppInstanceNull NULL
|
||||||
#include <unique/unique.h>
|
#include <unique/unique.h>
|
||||||
|
#define MIDORI_UNIQUE_COMMAND 1
|
||||||
#else
|
#else
|
||||||
typedef gint MidoriAppInstance;
|
typedef gint MidoriAppInstance;
|
||||||
#define MidoriAppInstanceNull -1
|
#define MidoriAppInstanceNull -1
|
||||||
|
@ -203,6 +204,7 @@ _midori_app_add_browser (MidoriApp* app,
|
||||||
|
|
||||||
katze_array_add_item (app->browsers, browser);
|
katze_array_add_item (app->browsers, browser);
|
||||||
|
|
||||||
|
app->browser = browser;
|
||||||
#if HAVE_UNIQUE
|
#if HAVE_UNIQUE
|
||||||
if (app->instance)
|
if (app->instance)
|
||||||
unique_app_watch_window (app->instance, GTK_WINDOW (browser));
|
unique_app_watch_window (app->instance, GTK_WINDOW (browser));
|
||||||
|
@ -395,6 +397,14 @@ midori_app_command_received (MidoriApp* app,
|
||||||
gchar** uris,
|
gchar** uris,
|
||||||
GdkScreen* screen)
|
GdkScreen* screen)
|
||||||
{
|
{
|
||||||
|
if (!screen)
|
||||||
|
{
|
||||||
|
if (app->browser && gtk_widget_has_screen (GTK_WIDGET (app->browser)))
|
||||||
|
screen = gtk_widget_get_screen (GTK_WIDGET (app->browser));
|
||||||
|
else
|
||||||
|
screen = gdk_screen_get_default ();
|
||||||
|
}
|
||||||
|
|
||||||
if (g_str_equal (command, "activate"))
|
if (g_str_equal (command, "activate"))
|
||||||
{
|
{
|
||||||
gtk_window_set_screen (GTK_WINDOW (app->browser), screen);
|
gtk_window_set_screen (GTK_WINDOW (app->browser), screen);
|
||||||
|
@ -453,6 +463,13 @@ midori_app_command_received (MidoriApp* app,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (g_str_equal (command, "command"))
|
||||||
|
{
|
||||||
|
if (!uris || !app->browser)
|
||||||
|
return FALSE;
|
||||||
|
midori_browser_activate_action (app->browser, *uris);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -483,6 +500,13 @@ midori_browser_message_received_cb (UniqueApp* instance,
|
||||||
/* g_strfreev (uris); */
|
/* g_strfreev (uris); */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case MIDORI_UNIQUE_COMMAND:
|
||||||
|
{
|
||||||
|
gchar** uris = unique_message_data_get_uris (message);
|
||||||
|
success = midori_app_command_received (app, "command", uris, screen);
|
||||||
|
/* g_strfreev (uris); */
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
success = FALSE;
|
success = FALSE;
|
||||||
break;
|
break;
|
||||||
|
@ -524,6 +548,20 @@ midori_app_io_channel_watch_cb (GIOChannel* channel,
|
||||||
g_strfreev (uris);
|
g_strfreev (uris);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (strncmp (buf, "command", 7) == 0)
|
||||||
|
{
|
||||||
|
guint i = 0;
|
||||||
|
gchar** uris = g_new (gchar, 100);
|
||||||
|
while (fd_gets (sock, buf, sizeof (buf)) != -1 && *buf != '.')
|
||||||
|
{
|
||||||
|
uris[i++] = g_strdup (g_strstrip (buf));
|
||||||
|
if (i == 99)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
uris[i] = NULL;
|
||||||
|
midori_app_command_received (app, "command", uris, screen);
|
||||||
|
g_strfreev (uris);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_window_present (GTK_WINDOW (app->browser));
|
gtk_window_present (GTK_WINDOW (app->browser));
|
||||||
|
@ -563,6 +601,7 @@ midori_app_create_instance (MidoriApp* app,
|
||||||
|
|
||||||
#if HAVE_UNIQUE
|
#if HAVE_UNIQUE
|
||||||
instance = unique_app_new (instance_name, NULL);
|
instance = unique_app_new (instance_name, NULL);
|
||||||
|
unique_app_add_command (instance, "midori-command", MIDORI_UNIQUE_COMMAND);
|
||||||
g_signal_connect (instance, "message-received",
|
g_signal_connect (instance, "message-received",
|
||||||
G_CALLBACK (midori_browser_message_received_cb), app);
|
G_CALLBACK (midori_browser_message_received_cb), app);
|
||||||
#else
|
#else
|
||||||
|
@ -883,6 +922,57 @@ midori_app_instance_send_uris (MidoriApp* app,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* midori_app_send_command:
|
||||||
|
* @app: a #MidoriApp
|
||||||
|
* @command: a string vector of a command to execute
|
||||||
|
*
|
||||||
|
* Sends a command to an instance of Midori, which
|
||||||
|
* is either the current process or an already running
|
||||||
|
* instance with the same name on the default display.
|
||||||
|
*
|
||||||
|
* Names of GtkAction objects of MidoriBrowser are recognized as commands.
|
||||||
|
*
|
||||||
|
* Return value: %TRUE if the message was sent successfully
|
||||||
|
*
|
||||||
|
* Since: 0.1.8
|
||||||
|
**/
|
||||||
|
gboolean
|
||||||
|
midori_app_send_command (MidoriApp* app,
|
||||||
|
gchar** command)
|
||||||
|
{
|
||||||
|
#if HAVE_UNIQUE
|
||||||
|
UniqueMessageData* message;
|
||||||
|
UniqueResponse response;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* g_return_val_if_fail (MIDORI_IS_APP (app), FALSE); */
|
||||||
|
g_return_val_if_fail (command != NULL, FALSE);
|
||||||
|
|
||||||
|
if (!midori_app_instance_is_running (app))
|
||||||
|
return midori_app_command_received (app, "command", command, NULL);
|
||||||
|
|
||||||
|
#if HAVE_UNIQUE
|
||||||
|
if (app->instance)
|
||||||
|
{
|
||||||
|
message = unique_message_data_new ();
|
||||||
|
unique_message_data_set_uris (message, command);
|
||||||
|
response = unique_app_send_message (app->instance,
|
||||||
|
MIDORI_UNIQUE_COMMAND, message);
|
||||||
|
unique_message_data_free (message);
|
||||||
|
if (response == UNIQUE_RESPONSE_OK)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (app->instance > -1)
|
||||||
|
{
|
||||||
|
send_open_command (app->instance, "command", command);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* midori_app_add_browser:
|
* midori_app_add_browser:
|
||||||
* @app: a #MidoriApp
|
* @app: a #MidoriApp
|
||||||
|
|
|
@ -54,6 +54,10 @@ gboolean
|
||||||
midori_app_instance_send_uris (MidoriApp* app,
|
midori_app_instance_send_uris (MidoriApp* app,
|
||||||
gchar** uris);
|
gchar** uris);
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
midori_app_send_command (MidoriApp* app,
|
||||||
|
gchar** command);
|
||||||
|
|
||||||
void
|
void
|
||||||
midori_app_add_browser (MidoriApp* app,
|
midori_app_add_browser (MidoriApp* app,
|
||||||
MidoriBrowser* browser);
|
MidoriBrowser* browser);
|
||||||
|
|
Loading…
Reference in a new issue