summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/Makefile.am5
-rw-r--r--test/previewer-plug.c92
-rw-r--r--test/previewer.c184
3 files changed, 155 insertions, 126 deletions
diff --git a/test/Makefile.am b/test/Makefile.am
index fa84755..94132dd 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1,5 +1,4 @@
-AM_CFLAGS = -I$(top_srcdir)/src $(E_CFLAGS) $(MOZILLA_CFLAGS) \
- -DPLUG_PROCESS=\"$(abs_builddir)/previewer-plug$(EXEEXT)\"
+AM_CFLAGS = -I$(top_srcdir)/src $(E_CFLAGS) $(MOZILLA_CFLAGS)
# use gtk3 if it's available
if ENABLE_GTK3
@@ -10,4 +9,4 @@ AM_CFLAGS += $(EVINCE2_CFLAGS)
LDADD = $(top_builddir)/src/libevbp2-viewer.la
endif
-noinst_PROGRAMS = mime previewer previewer-plug
+noinst_PROGRAMS = mime previewer
diff --git a/test/previewer-plug.c b/test/previewer-plug.c
deleted file mode 100644
index 239a611..0000000
--- a/test/previewer-plug.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2011, 2012 Dan Nicholson <dbn.lists@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
-
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include <gtk/gtk.h>
-#if GTK_MAJOR_VERSION > 2
-#include <gtk/gtkx.h>
-#endif
-#include <gdk/gdkx.h>
-#include "evbp-viewer.h"
-
-static inline void
-no_debug(const gchar *domain, GLogLevelFlags level,
- const gchar *message, gpointer data)
-{
-}
-
-int
-main(int argc, char *argv[])
-{
- Window win;
- GFile *file;
- gchar *uri;
- GtkWidget *plug;
- GtkWidget *box, *button;
- GtkWidget *viewer;
- GError *error = NULL;
-
- gtk_init(&argc, &argv);
-
- if (!getenv("EVBP_DEBUG"))
- g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, no_debug, NULL);
-
- if (argc < 3) {
- g_printerr("No socket ID or filename supplied\n");
- exit(EXIT_FAILURE);
- }
- win = (Window)strtoul(argv[1], NULL, 10);
- g_debug("Received socket window ID %lu\n", (unsigned long)win);
- file = g_file_new_for_commandline_arg(argv[2]);
- uri = g_file_get_uri(file);
- g_object_unref(file);
-
- if (!ev_init()) {
- g_printerr("No evince backends found\n");
- exit(EXIT_FAILURE);
- }
- ev_stock_icons_init();
-
- /* create a plug and add our widget with a quit button */
- plug = gtk_plug_new(win);
- box = gtk_vbox_new(FALSE, 10);
- gtk_container_add(GTK_CONTAINER(plug), box);
- button = gtk_button_new_with_label("Quit");
- g_signal_connect(button, "clicked", G_CALLBACK(gtk_main_quit), NULL);
- gtk_box_pack_end(GTK_BOX(box), button, FALSE, FALSE, 0);
- viewer = evbp_viewer_new();
- gtk_box_pack_start(GTK_BOX(box), viewer, TRUE, TRUE, 0);
- gtk_widget_show_all(plug);
-
- /* load the file */
- if (!evbp_viewer_load_uri(EVBP_VIEWER(viewer), uri, &error)) {
- g_printerr("could not open '%s': %s\n", uri, error->message);
- g_error_free(error);
- exit(EXIT_FAILURE);
- }
- g_free(uri);
-
- gtk_main();
-
- ev_shutdown();
- ev_stock_icons_shutdown();
-
- return 0;
-}
diff --git a/test/previewer.c b/test/previewer.c
index bc78b57..100f81e 100644
--- a/test/previewer.c
+++ b/test/previewer.c
@@ -25,10 +25,27 @@
#include <gtk/gtkx.h>
#endif
#include <gdk/gdkx.h>
-
-#ifndef PLUG_PROCESS
-#define PLUG_PROCESS "./previewer-plug"
-#endif
+#include "evbp-viewer.h"
+
+enum run_mode {
+ MODE_EMBEDDED,
+ MODE_SOCKET,
+ MODE_PLUG
+};
+
+static gboolean opt_fork = FALSE;
+static gboolean opt_plug = FALSE;
+static gint64 opt_sockwin = 0;
+
+static GOptionEntry options[] = {
+ { "fork", 'f', 0, G_OPTION_ARG_NONE, &opt_fork,
+ "Start a separate process for the plug", NULL },
+ { "plug", 'p', 0, G_OPTION_ARG_NONE, &opt_plug,
+ "Be the plug process", NULL },
+ { "socket", 's', 0, G_OPTION_ARG_INT64, &opt_sockwin,
+ "Socket window ID for the plug to use", "W" },
+ { NULL }
+};
static inline void
no_debug(const gchar *domain, GLogLevelFlags level,
@@ -36,54 +53,159 @@ no_debug(const gchar *domain, GLogLevelFlags level,
{
}
+static void
+plug_added_cb(GtkSocket *socket, gpointer data)
+{
+ GtkWidget *window = GTK_WIDGET(data);
+
+ g_debug("Plug added to socket, showing toplevel window");
+ gtk_widget_show_all(window);
+}
+
+static gboolean
+plug_removed_cb(GtkSocket *socket, gpointer data)
+{
+ g_debug("Plug removed from socket");
+ return FALSE;
+}
+
int
main(int argc, char *argv[])
{
+ GOptionContext *opt;
+ int mode;
GtkWidget *window;
+ GtkWidget *box;
GtkWidget *socket;
- Window win;
- gchar *cmd;
+ GtkWidget *button;
+ GtkWidget *plug;
+ GtkWidget *viewer;
+ Window sockwin = 0;
+ GFile *file;
+ gchar *uri = NULL;
GError *error = NULL;
- gtk_init(&argc, &argv);
-
if (!getenv("EVBP_DEBUG"))
g_log_set_handler(G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, no_debug, NULL);
+ opt = g_option_context_new("- test EvbpViewer embedding");
+ g_option_context_add_main_entries(opt, options, NULL);
+ if (!g_option_context_parse(opt, &argc, &argv, &error)) {
+ g_printerr("%s\n", error->message);
+ exit(EXIT_FAILURE);
+ }
+ g_option_context_free(opt);
+
+ /* figure out how we're executing */
+ if (opt_plug) {
+ mode = MODE_PLUG;
+ g_debug("Running in separate process for plug");
+ } else if (opt_fork) {
+ mode = MODE_SOCKET;
+ g_debug("Running in separate process for socket");
+ } else {
+ mode = MODE_EMBEDDED;
+ g_debug("Running with socket and plug in same process");
+ }
+
+ /* process can only be the plug if a socket window was supplied */
+ if (mode == MODE_PLUG) {
+ if (opt_sockwin == 0) {
+ g_printerr("No socket window supplied for plug\n");
+ exit(EXIT_FAILURE);
+ }
+ sockwin = (Window)opt_sockwin;
+ }
+
if (argc < 2) {
g_printerr("No file supplied to open\n");
exit(EXIT_FAILURE);
}
- g_set_application_name("Evince Previewer Socket Test");
- gtk_window_set_default_icon_name("evince");
+ gtk_init(&argc, &argv);
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size(GTK_WINDOW(window), 800, 800);
- g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
+ if (mode != MODE_SOCKET) {
+ g_debug("Initializing evince");
+ if (!ev_init()) {
+ g_printerr("No evince backends found\n");
+ exit(EXIT_FAILURE);
+ }
+ ev_stock_icons_init();
+
+ file = g_file_new_for_commandline_arg(argv[1]);
+ uri = g_file_get_uri(file);
+ g_object_unref(file);
+ g_debug("Using uri \"%s\" for file \"%s\"", uri, argv[1]);
+ }
- /* create a socket to embed the viewer in */
- socket = gtk_socket_new();
- g_signal_connect(socket, "plug-removed", G_CALLBACK(gtk_main_quit), NULL);
- gtk_container_add(GTK_CONTAINER(window), socket);
- gtk_widget_show_all(window);
+ if (mode != MODE_PLUG) {
+ g_set_application_name("Evince Previewer Socket Test");
+ gtk_window_set_default_icon_name("evince");
+
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_default_size(GTK_WINDOW(window), 800, 800);
+ g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
+
+ /* box with button to quit */
+ box = gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(window), box);
+ button = gtk_button_new_with_label("Quit");
+ gtk_box_pack_end(GTK_BOX(box), button, FALSE, FALSE, 0);
+ g_signal_connect(button, "clicked", G_CALLBACK(gtk_main_quit), NULL);
+
+ /* create a socket to embed the viewer in */
+ socket = gtk_socket_new();
+ g_signal_connect(socket, "plug-added", G_CALLBACK(plug_added_cb),
+ window);
+ g_signal_connect(socket, "plug-removed", G_CALLBACK(plug_removed_cb),
+ NULL);
+ gtk_box_pack_start(GTK_BOX(box), socket, TRUE, TRUE, 0);
+
+ /* get the socket window ID to pass to the plug process */
+ gtk_widget_realize(socket);
+ sockwin = gtk_socket_get_id(GTK_SOCKET(socket));
+ g_debug("The ID of the socket window is %lu",
+ (unsigned long)sockwin);
+ }
- /* get the socket window ID to pass to the plug process */
- win = gtk_socket_get_id(GTK_SOCKET(socket));
- g_debug("The ID of the socket window is %lu\n", (unsigned long)win);
-
- /* spawn the plug process with the file */
- cmd = g_strdup_printf("\"%s\" %lu \"%s\"", PLUG_PROCESS,
- (unsigned long)win, argv[1]);
- if (!g_spawn_command_line_async(cmd, &error)) {
- g_printerr("Failed to spawn plug process '%s': %s\n", cmd,
- error->message);
- g_error_free(error);
- exit(EXIT_FAILURE);
+ if (mode != MODE_SOCKET) {
+ /* create a plug to for the socket */
+ g_debug("Creating plug from window %lu", (unsigned long)sockwin);
+ plug = gtk_plug_new(sockwin);
+ viewer = evbp_viewer_new();
+ gtk_container_add(GTK_CONTAINER(plug), viewer);
+ gtk_widget_show_all(plug);
+
+ /* load the file */
+ if (!evbp_viewer_load_uri(EVBP_VIEWER(viewer), uri, &error)) {
+ g_printerr("could not open '%s': %s\n", uri, error->message);
+ g_error_free(error);
+ exit(EXIT_FAILURE);
+ }
+ g_free(uri);
+ } else {
+ gchar *cmd;
+
+ /* spawn the plug process */
+ cmd = g_strdup_printf("\"%s\" -p -s %lu \"%s\"", argv[0],
+ (unsigned long)sockwin, argv[1]);
+ g_debug("Executing separate plug process: %s", cmd);
+ if (!g_spawn_command_line_async(cmd, &error)) {
+ g_printerr("Failed to spawn plug process '%s': %s\n", cmd,
+ error->message);
+ g_error_free(error);
+ exit(EXIT_FAILURE);
+ }
+ g_free(cmd);
}
- g_free(cmd);
gtk_main();
+ if (mode != MODE_SOCKET) {
+ g_debug("Shutting down evince");
+ ev_shutdown();
+ ev_stock_icons_shutdown();
+ }
+
return 0;
}