Note the header file ("viewer.h") and the function is private and internal to virt-viewer.
Rich. -- Emerging Technologies, Red Hat - http://et.redhat.com/~rjones/ Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SL4 1TE, United Kingdom. Registered in England and Wales under Company Registration No. 03798903
diff -r fe1efb558b4b src/Makefile.am
--- a/src/Makefile.am Fri Jan 11 17:43:30 2008 -0500
+++ b/src/Makefile.am Fri Jan 25 16:05:40 2008 +0000
@@ -1,6 +1,6 @@
bin_PROGRAMS = virt-viewer
-virt_viewer_SOURCES = main.c
+virt_viewer_SOURCES = main.c viewer.h
virt_viewer_LDADD = @GTKVNC_LIBS@ @GTK2_LIBS@ @LIBXML2_LIBS@ @LIBVIRT_LIBS@
virt_viewer_CFLAGS = @GTKVNC_CFLAGS@ @GTK2_CFLAGS@ @LIBXML2_CFLAGS@ @LIBVIRT_CFLAGS@ @WARN_CFLAGS@
diff -r fe1efb558b4b src/main.c
--- a/src/main.c Fri Jan 11 17:43:30 2008 -0500
+++ b/src/main.c Fri Jan 25 16:05:40 2008 +0000
@@ -35,6 +35,8 @@
#include <sys/socket.h>
#include <sys/un.h>
+#include "viewer.h"
+
// #define DEBUG 1
#ifdef DEBUG
#define DEBUG_LOG(s, ...) fprintf(stderr, (s), ## __VA_ARGS__)
@@ -67,7 +69,7 @@ static const struct keyComboDef keyCombo
{ { GDK_Print }, 1, "_PrintScreen"},
};
-static void viewer_set_title(VncDisplay *vnc, GtkWidget *window, gboolean grabbed)
+static void viewer_set_title(VncDisplay *vnc G_GNUC_UNUSED, GtkWidget *window, gboolean grabbed)
{
char title[1024];
const char *subtitle;
@@ -406,20 +406,39 @@ static GtkWidget *viewer_build_menu(VncD
return menubar;
}
-static GtkWidget *viewer_build_window(VncDisplay *vnc)
+static GtkWidget *viewer_get_toplevel (void *data G_GNUC_UNUSED)
+{
+ GtkWidget *window;
+
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+ return window;
+}
+
+static GtkWidget *viewer_build_window(VncDisplay *vnc,
+ GtkWidget *(*get_toplevel)(void *),
+ void *data,
+ int with_menubar)
{
GtkWidget *window;
GtkWidget *menubar;
GtkWidget *layout;
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- layout = gtk_vbox_new(FALSE, 3);
- menubar = viewer_build_menu(vnc);
-
- gtk_container_add(GTK_CONTAINER(window), layout);
- gtk_container_add(GTK_CONTAINER(layout), menubar);
- gtk_container_add(GTK_CONTAINER(layout), GTK_WIDGET(vnc));
- gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+ /* In the standalone program, calls viewer_get_toplevel above
+ * to make a window. In the browser plugin this calls a function
+ * in the plugin which returns the GtkPlug that we live inside.
+ * In both cases they are GTK_CONTAINERs and NOT resizable.
+ */
+ window = get_toplevel (data);
+
+ if (with_menubar) {
+ layout = gtk_vbox_new(FALSE, 3);
+ menubar = viewer_build_menu(vnc);
+ gtk_container_add(GTK_CONTAINER(window), layout);
+ gtk_container_add(GTK_CONTAINER(layout), menubar);
+ gtk_container_add(GTK_CONTAINER(layout), GTK_WIDGET(vnc));
+ } else
+ gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(vnc));
gtk_signal_connect(GTK_OBJECT(vnc), "vnc-pointer-grab",
GTK_SIGNAL_FUNC(viewer_grab), window);
@@ -440,29 +459,6 @@ static GtkWidget *viewer_build_window(Vn
GTK_SIGNAL_FUNC(viewer_credential), NULL);
return window;
-}
-
-
-static void viewer_version(FILE *out)
-{
- fprintf(out, "%s version %s\n", PACKAGE, VERSION);
-}
-
-static void viewer_help(FILE *out, const char *app)
-{
- fprintf(out, "\n");
- fprintf(out, "syntax: %s [OPTIONS] DOMAIN-NAME|ID|UUID\n", app);
- fprintf(out, "\n");
- viewer_version(out);
- fprintf(out, "\n");
- fprintf(out, "Options:\n\n");
- fprintf(out, " -h, --help display command line help\n");
- fprintf(out, " -v, --verbose display verbose information\n");
- fprintf(out, " -V, --version display version information\n");
- fprintf(out, " -d, --direct direct connection with no automatic tunnels\n");
- fprintf(out, " -c URI, --connect URI connect to hypervisor URI\n");
- fprintf(out, " -w, --wait wait for domain to start\n");
- fprintf(out, "\n");
}
static int viewer_parse_uuid(const char *name, unsigned char *uuid)
@@ -683,12 +679,113 @@ static int viewer_open_tunnel_ssh(const
return viewer_open_tunnel(cmd);
}
-
-int main(int argc, char **argv)
+int
+viewer_start (const char *uri, const char *name,
+ int direct, int waitvnc, int set_verbose,
+ GtkWidget *(*get_toplevel)(void *), void *data,
+ int with_menubar)
{
GtkWidget *window;
GtkWidget *vnc;
+ virConnectPtr conn = NULL;
+ virDomainPtr dom = NULL;
+ char *host = NULL;
+ char *vncport = NULL;
+ char *transport = NULL;
+ char *user = NULL;
+ const char *tmpname = NULL;
+ int port = 0;
+ int fd = -1;
+
+ verbose = set_verbose;
+
+ conn = virConnectOpenReadOnly(uri);
+ if (!conn) {
+ fprintf(stderr, "unable to connect to libvirt %s\n",
+ uri ? uri : "xen");
+ return 2;
+ }
+
+ do {
+ dom = viewer_lookup_domain(conn, name);
+ if (!dom && !waitvnc) {
+ fprintf(stderr, "unable to lookup domain %s\n", name);
+ return 3;
+ }
+ if (!dom)
+ usleep(500*1000);
+ } while (!dom);
+
+ do {
+ viewer_extract_vnc_graphics(dom, &vncport);
+ if (!vncport && !waitvnc) {
+ fprintf(stderr, "unable to find vnc graphics for %s\n", name);
+ return 4;
+ }
+ if (!vncport)
+ usleep(300*1000);
+ } while (!vncport);
+ tmpname = virDomainGetName(dom);
+ if (tmpname != NULL) {
+ domname = strdup(tmpname);
+ }
+ virDomainFree(dom);
+ virConnectClose(conn);
+
+ if (viewer_extract_host(uri, &host, &transport, &user, &port) < 0) {
+ fprintf(stderr, "unable to determine hostname for URI %s\n", uri);
+ return 5;
+ }
+ DEBUG_LOG("Remote host is %s and transport %s user %s\n", host, transport ? transport : "", user ? user : "");
+
+ if (transport && strcasecmp(transport, "ssh") == 0 && !direct)
+ fd = viewer_open_tunnel_ssh(host, port, user, vncport);
+
+ vnc = vnc_display_new();
+ window = viewer_build_window (VNC_DISPLAY(vnc),
+ get_toplevel, data, with_menubar);
+ gtk_widget_realize(vnc);
+
+ vnc_display_set_keyboard_grab(VNC_DISPLAY(vnc), TRUE);
+ vnc_display_set_pointer_grab(VNC_DISPLAY(vnc), TRUE);
+
+ if (fd >= 0)
+ vnc_display_open_fd(VNC_DISPLAY(vnc), fd);
+ else
+ vnc_display_open_host(VNC_DISPLAY(vnc), host, vncport);
+
+ return 0;
+}
+
+#ifndef PLUGIN
+/* Standalone program. */
+
+static void viewer_version(FILE *out)
+{
+ fprintf(out, "%s version %s\n", PACKAGE, VERSION);
+}
+
+static void viewer_help(FILE *out, const char *app)
+{
+ fprintf(out, "\n");
+ fprintf(out, "syntax: %s [OPTIONS] DOMAIN-NAME|ID|UUID\n", app);
+ fprintf(out, "\n");
+ viewer_version(out);
+ fprintf(out, "\n");
+ fprintf(out, "Options:\n\n");
+ fprintf(out, " -h, --help display command line help\n");
+ fprintf(out, " -v, --verbose display verbose information\n");
+ fprintf(out, " -V, --version display version information\n");
+ fprintf(out, " -d, --direct direct connection with no automatic tunnels\n");
+ fprintf(out, " -c URI, --connect URI connect to hypervisor URI\n");
+ fprintf(out, " -w, --wait wait for domain to start\n");
+ fprintf(out, "\n");
+}
+
+int main(int argc, char **argv)
+{
char *uri = NULL;
+ char *name = NULL;
int opt_ind;
const char *sopts = "hVc:";
static const struct option lopts[] = {
@@ -701,17 +798,10 @@ int main(int argc, char **argv)
{ 0, 0, 0, 0 }
};
int ch;
+ int direct = 0;
int waitvnc = 0;
- virConnectPtr conn = NULL;
- virDomainPtr dom = NULL;
- char *host = NULL;
- char *vncport = NULL;
- char *transport = NULL;
- char *user = NULL;
- const char *tmpname = NULL;
- int port = 0;
- int fd = -1;
- int direct = 0;
+ int set_verbose = 0;
+ int ret;
while ((ch = getopt_long(argc, argv, sopts, lopts, &opt_ind)) != -1) {
switch (ch) {
@@ -722,7 +812,7 @@ int main(int argc, char **argv)
viewer_version(stdout);
return 0;
case 'v':
- verbose = 1;
+ set_verbose = 1;
break;
case 'c':
uri = strdup(optarg);
@@ -739,7 +829,6 @@ int main(int argc, char **argv)
}
}
-
if (argc != (optind+1)) {
viewer_help(stderr, argv[0]);
return 1;
@@ -747,64 +836,16 @@ int main(int argc, char **argv)
gtk_init(&argc, &argv);
- conn = virConnectOpenReadOnly(uri);
- if (!conn) {
- fprintf(stderr, "unable to connect to libvirt %s\n",
- uri ? uri : "xen");
- return 2;
- }
-
- do {
- dom = viewer_lookup_domain(conn, argv[optind]);
- if (!dom && !waitvnc) {
- fprintf(stderr, "unable to lookup domain %s\n", argv[optind]);
- return 3;
- }
- if (!dom)
- usleep(500*1000);
- } while (!dom);
-
- do {
- viewer_extract_vnc_graphics(dom, &vncport);
- if (!vncport && !waitvnc) {
- fprintf(stderr, "unable to find vnc graphics for %s\n", argv[optind]);
- return 4;
- }
- if (!vncport)
- usleep(300*1000);
- } while (!vncport);
- tmpname = virDomainGetName(dom);
- if (tmpname != NULL) {
- domname = strdup(tmpname);
- }
- virDomainFree(dom);
- virConnectClose(conn);
-
- if (viewer_extract_host(uri, &host, &transport, &user, &port) < 0) {
- fprintf(stderr, "unable to determine hostname for URI %s\n", uri);
- return 5;
- }
- DEBUG_LOG("Remote host is %s and transport %s user %s\n", host, transport ? transport : "", user ? user : "");
-
- if (transport && strcasecmp(transport, "ssh") == 0 && !direct)
- fd = viewer_open_tunnel_ssh(host, port, user, vncport);
-
- vnc = vnc_display_new();
- window = viewer_build_window(VNC_DISPLAY(vnc));
- gtk_widget_realize(vnc);
-
- vnc_display_set_keyboard_grab(VNC_DISPLAY(vnc), TRUE);
- vnc_display_set_pointer_grab(VNC_DISPLAY(vnc), TRUE);
-
- if (fd >= 0)
- vnc_display_open_fd(VNC_DISPLAY(vnc), fd);
- else
- vnc_display_open_host(VNC_DISPLAY(vnc), host, vncport);
+ name = argv[optind];
+ ret = viewer_start (uri, name, direct, waitvnc, set_verbose,
+ viewer_get_toplevel, NULL, 1);
+ if (ret != 0) return ret;
gtk_main();
return 0;
}
+#endif /* !PLUGIN */
/*
* Local variables:
diff -r fe1efb558b4b src/viewer.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/viewer.h Fri Jan 25 16:05:40 2008 +0000
@@ -0,0 +1,28 @@
+/*
+ * Virt Viewer: A virtual machine console viewer
+ *
+ * Copyright (C) 2007 Red Hat,
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Author: Daniel P. Berrange <[EMAIL PROTECTED]>
+ */
+
+#ifndef VIEWER_H
+#define VIEWER_H
+
+extern int viewer_start (const char *uri, const char *name, int direct, int waitvnc, int set_verbose, GtkWidget *(*get_toplevel)(void *), void *data, int with_menubar);
+
+#endif /* VIEWER_H */
smime.p7s
Description: S/MIME Cryptographic Signature
_______________________________________________ et-mgmt-tools mailing list [email protected] https://www.redhat.com/mailman/listinfo/et-mgmt-tools
