From 3a87c4a134cc702dc01ca1e39faab93253e3d195 Mon Sep 17 00:00:00 2001 From: Javier Date: Sun, 15 Feb 2015 03:15:17 +0100 Subject: use libunique-1.0 to force a unique instance --- gplay.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 9 deletions(-) (limited to 'gplay.c') diff --git a/gplay.c b/gplay.c index f531414..09368fc 100644 --- a/gplay.c +++ b/gplay.c @@ -5,6 +5,7 @@ #include #include #include +#include static GtkWindow *main_win = NULL; static GtkWidget *video_widget; @@ -427,6 +428,28 @@ static gboolean main_win_handle_key_press(GtkWidget *widget, GdkEventKey *event, } } +static UniqueResponse app_handle_message_received(UniqueApp *app, gint command, UniqueMessageData *data, guint timestamp, gpointer user_data) +{ + switch (command) { + case UNIQUE_ACTIVATE: + gtk_window_present_with_time(main_win, timestamp); + return UNIQUE_RESPONSE_OK; + case UNIQUE_OPEN: + if (data) { + gchar **uris = unique_message_data_get_uris(data); + if (uris && uris[0]) { + open_media(uris[0]); + play_media(); + return UNIQUE_RESPONSE_OK; + } + } + + /* Fallthrough */ + default: + return UNIQUE_RESPONSE_FAIL; + } +} + static void create_ui() { main_win = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); @@ -493,6 +516,11 @@ static void create_ui() gtk_container_add(GTK_CONTAINER(slider_tool), GTK_WIDGET(slider_widget)); gtk_toolbar_insert(toolbar, slider_tool, -1); + const GtkTargetEntry drop_targets[] = {{ "text/uri-list", 0, 0 }}; + gtk_drag_dest_set(GTK_WIDGET(main_win), GTK_DEST_DEFAULT_ALL, + drop_targets, G_N_ELEMENTS(drop_targets), + GDK_ACTION_DEFAULT); + gtk_window_set_default_size(main_win, 350, 20); gtk_widget_show_all(GTK_WIDGET(vbox)); @@ -521,7 +549,9 @@ int main(int argc, char **argv) { GOptionContext *ctx = g_option_context_new(_(" - simple gtk media player")); gchar **filenames = NULL; + gboolean new_instance = FALSE; const GOptionEntry entries[] = { + { "new", 'n', 0, G_OPTION_ARG_NONE, &new_instance, NULL }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, NULL }, { NULL } }; @@ -541,25 +571,45 @@ int main(int argc, char **argv) g_option_context_free(ctx); - create_ui(); - create_gst(); + UniqueApp *app = unique_app_new("com.javispedro.gplay", NULL); - if (filenames && *filenames) { + gchar *uri = NULL; + if (filenames && filenames[0]) { const char *file = filenames[0]; if (gst_uri_is_valid(file)) { - open_media(file); + uri = g_strdup(file); } else { - char *uri = gst_filename_to_uri(file, &error); - if (uri) { - open_media(uri); - g_free(uri); - } else { + uri = gst_filename_to_uri(file, &error); + if (!uri) { g_printerr("Invalid filename '%s':%s", file, error->message); g_error_free(error); return EXIT_FAILURE; } } + } + + if (unique_app_is_running(app) & !new_instance && uri) { + UniqueMessageData *data = unique_message_data_new(); + gchar *uris[] = { uri, NULL }; + + unique_message_data_set_uris(data, uris); + + if (unique_app_send_message(app, UNIQUE_OPEN, data) == UNIQUE_RESPONSE_OK) { + g_free(uri); + return EXIT_SUCCESS; + } + } + + g_signal_connect(app, "message-received", + G_CALLBACK(app_handle_message_received), NULL); + + create_ui(); + create_gst(); + + if (uri) { + open_media(uri); play_media(); + g_free(uri); } gtk_widget_show(GTK_WIDGET(main_win)); -- cgit v1.2.3