diff --git a/TODO b/TODO index 97a5f178..7a663c13 100644 --- a/TODO +++ b/TODO @@ -38,4 +38,3 @@ Future work: - OSX - Windows - Android - - Command line tools for web interface development? diff --git a/gui/ocarina.c b/gui/ocarina.c index d38bce29..5f6ca6ca 100644 --- a/gui/ocarina.c +++ b/gui/ocarina.c @@ -2,6 +2,7 @@ * Copyright 2014 (c) Anna Schumaker. */ #include +#include #include #include #include @@ -13,7 +14,17 @@ #include #include -#define OCARINA_FLAGS (G_APPLICATION_FLAGS_NONE) +#define OCARINA_FLAGS (G_APPLICATION_HANDLES_COMMAND_LINE) + +static const GOptionEntry ocarina_options[] = { + { "next", 'n', 0, G_OPTION_ARG_NONE, NULL, "Play next track", NULL }, + { "pause", 'P', 0, G_OPTION_ARG_NONE, NULL, "Pause playback", NULL }, + { "play", 'p', 0, G_OPTION_ARG_NONE, NULL, "Start playback", NULL }, + { "previous", 'N', 0, G_OPTION_ARG_NONE, NULL, "Play previous track", NULL }, + { "toggle", 't', 0, G_OPTION_ARG_NONE, NULL, "Toggle playback state", NULL }, + { "version", 'v', 0, G_OPTION_ARG_NONE, NULL, "Print version and exit", NULL }, + { NULL }, +}; #ifndef CONFIG_DEBUG const static gchar *OCARINA_APP = "org.gtk.ocarina"; @@ -46,6 +57,44 @@ static void __ocarina_activate(GApplication *application, gpointer data) GTK_WINDOW(gui_builder_widget("o_window"))); } +static int __ocarina_local_options(GApplication *application, + GVariantDict *options, gpointer data) +{ + if (!g_variant_dict_contains(options, "version")) + return -1; + g_printf("Ocarina %s\n", get_version()); + g_printf("GTK+ %u.%u.%u\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); + g_printf("%s\n", gst_version_string()); + g_printf("%s, %s\n", __DATE__, __TIME__); + return 0; +} + +static int __ocarina_command_line(GApplication *application, + GApplicationCommandLine *command, + gpointer data) +{ + GVariantDict *options; + + g_application_activate(application); + + options = g_application_command_line_get_options_dict(command); + if (g_variant_dict_contains(options, "next")) + audio_next(); + else if (g_variant_dict_contains(options, "pause")) + audio_pause(); + else if (g_variant_dict_contains(options, "play")) + audio_play(); + else if (g_variant_dict_contains(options, "previous")) + audio_prev(); + else if (g_variant_dict_contains(options, "toggle")) { + if (audio_cur_state() == GST_STATE_PLAYING) + audio_pause(); + else + audio_play(); + } + return 0; +} + static void __ocarina_startup(GApplication *application, gpointer data) { gchar *ui = find_file_path("ocarina.ui"); @@ -81,12 +130,17 @@ static void __ocarina_shutdown(GApplication *application, gpointer data) int main(int argc, char **argv) { GtkApplication *ocarina = gtk_application_new(OCARINA_APP, OCARINA_FLAGS); - startup_argc = argc; startup_argv = argv; - g_signal_connect(G_APPLICATION(ocarina), "activate", (GCallback)__ocarina_activate, NULL); - g_signal_connect(G_APPLICATION(ocarina), "startup", (GCallback)__ocarina_startup, NULL); - g_signal_connect(G_APPLICATION(ocarina), "shutdown", (GCallback)__ocarina_shutdown, NULL); + g_application_add_main_option_entries(G_APPLICATION(ocarina), ocarina_options); + g_application_add_option_group(G_APPLICATION(ocarina), gst_init_get_option_group()); + + g_signal_connect(G_APPLICATION(ocarina), "activate", (GCallback)__ocarina_activate, NULL); + g_signal_connect(G_APPLICATION(ocarina), "handle-local-options", + (GCallback)__ocarina_local_options, NULL); + g_signal_connect(G_APPLICATION(ocarina), "command-line", (GCallback)__ocarina_command_line, NULL); + g_signal_connect(G_APPLICATION(ocarina), "startup", (GCallback)__ocarina_startup, NULL); + g_signal_connect(G_APPLICATION(ocarina), "shutdown", (GCallback)__ocarina_shutdown, NULL); return g_application_run(G_APPLICATION(ocarina), argc, argv); }