aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vnc-client.c6
-rw-r--r--vnc.c36
-rw-r--r--vnc.h1
3 files changed, 37 insertions, 6 deletions
diff --git a/vnc-client.c b/vnc-client.c
index 41eff13..577fb45 100644
--- a/vnc-client.c
+++ b/vnc-client.c
@@ -26,6 +26,7 @@ static void usage(FILE *fp)
" -d Enable debug output.\n"
" -u Send us kbd layout keysyms.\n"
" -p Show mouse pointer.\n"
+ " -o View only.\n"
"\n"
"-- \n"
"(c) 2006 Gerd Hoffmann <kraxel@suse.de>\n");
@@ -42,7 +43,7 @@ main(int argc, char *argv[])
gtk_init(&argc, &argv);
for (;;) {
- if (-1 == (c = getopt(argc, argv, "hdup")))
+ if (-1 == (c = getopt(argc, argv, "hdupo")))
break;
switch (c) {
case 'd':
@@ -54,6 +55,9 @@ main(int argc, char *argv[])
case 'p':
vnc_flags |= VNC_FLAG_SHOW_MOUSE;
break;
+ case 'o':
+ vnc_flags |= VNC_FLAG_VIEW_ONLY;
+ break;
case 'h':
usage(stdout);
exit(0);
diff --git a/vnc.c b/vnc.c
index f57029b..cfb9f97 100644
--- a/vnc.c
+++ b/vnc.c
@@ -34,7 +34,7 @@ struct vnc_window {
/* gtk */
GtkWidget *win;
GtkWidget *draw;
- GtkWidget *line, *kbd, *res;
+ GtkWidget *line, *res, *kbd, *view;
GdkCursor *on,*off;
int filter_installed;
int input_grabbed;
@@ -45,6 +45,7 @@ struct vnc_window {
Display *dpy;
unsigned char keydown[32];
/* config */
+ int viewonly;
int standalone;
int showpointer;
int uskbd;
@@ -135,7 +136,10 @@ static void vnc_window_texts(struct vnc_window *vnc)
snprintf(textline, sizeof(textline), "%dx%d",
vnc->client->width, vnc->client->height);
gtk_label_set_text(GTK_LABEL(vnc->res), textline);
- gtk_button_set_label(GTK_BUTTON(vnc->kbd), vnc->uskbd ? "kbd: us" : "kbd: local");
+ gtk_button_set_label(GTK_BUTTON(vnc->kbd),
+ vnc->uskbd ? "kbd: us" : "kbd: local");
+ gtk_button_set_label(GTK_BUTTON(vnc->view),
+ vnc->viewonly ? "viewonly" : "input ok");
}
static void vnc_window_conf(struct vnc_window *vnc)
@@ -174,6 +178,8 @@ static void vnc_release(struct vnc_window *vnc)
static void grab_input(struct vnc_window *vnc, guint32 time)
{
+ if (vnc->viewonly)
+ return;
if (vnc->input_grabbed)
return;
gdk_pointer_grab(vnc->draw->window,
@@ -392,6 +398,9 @@ static void send_mouse(struct vnc_window *vnc, int x, int y,
{
int rfbstate = 0;
+ if (vnc->viewonly)
+ return;
+
if (x11state & Button1Mask)
rfbstate |= rfbButton1Mask;
if (x11state & Button2Mask)
@@ -454,7 +463,8 @@ static void key_local(struct vnc_window *vnc, GdkEventKey *event)
fprintf(stderr,"%s[%d]: called: keysym %d\n", __FUNCTION__,
event->type, event->keyval);
keydown = (8 == event->type);
- SendKeyEvent(vnc->client, event->keyval, keydown ? TRUE : FALSE);
+ if (!vnc->viewonly)
+ SendKeyEvent(vnc->client, event->keyval, keydown ? TRUE : FALSE);
}
static void key_uskbd(struct vnc_window *vnc, GdkEventKey *event)
@@ -482,7 +492,7 @@ static void key_uskbd(struct vnc_window *vnc, GdkEventKey *event)
if (vnc->debug || 0 == keysym)
fprintf(stderr,"%s[%d]: called: keycode %d => keysym %d\n", __FUNCTION__,
event->type, event->hardware_keycode, keysym);
- if (keysym)
+ if (keysym && !vnc->viewonly)
SendKeyEvent(vnc->client, keysym, keydown ? TRUE : FALSE);
}
@@ -510,6 +520,14 @@ static void kbd_btn(GtkWidget *widget, gpointer data)
vnc_window_texts(vnc);
}
+static void view_btn(GtkWidget *widget, gpointer data)
+{
+ struct vnc_window *vnc = data;
+
+ vnc->viewonly = !vnc->viewonly;
+ vnc_window_texts(vnc);
+}
+
static GdkFilterReturn event_filter(GdkXEvent *gdkxevent, GdkEvent *gtkevent,
gpointer data)
{
@@ -537,7 +555,8 @@ static GdkFilterReturn event_filter(GdkXEvent *gdkxevent, GdkEvent *gtkevent,
if (vnc->debug)
fprintf(stderr,"%s: KeymapNotify: %-7s %3d\n", __FUNCTION__,
keydown ? "press" : "release", keycode);
- SendKeyEvent(vnc->client, keysym, keydown ? TRUE : FALSE);
+ if (!vnc->viewonly)
+ SendKeyEvent(vnc->client, keysym, keydown ? TRUE : FALSE);
}
}
memcpy(vnc->keydown, xevent->xkeymap.key_vector, 32);
@@ -566,6 +585,7 @@ GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
vnc->standalone = (flags & VNC_FLAG_STANDALONE);
vnc->showpointer = (flags & VNC_FLAG_SHOW_MOUSE);
vnc->uskbd = (flags & VNC_FLAG_US_KBD);
+ vnc->viewonly = (flags & VNC_FLAG_VIEW_ONLY);
vnc->debug = debug_level;
debug_libvnc = debug_level;
@@ -639,8 +659,13 @@ GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
vnc->line = gtk_label_new("status line");
vnc->res = gtk_label_new("vnc screen resolution");
vnc->kbd = gtk_button_new_with_label("keyboard mode");
+ vnc->view = gtk_button_new_with_label("input mode");
g_signal_connect(G_OBJECT(vnc->kbd), "clicked",
G_CALLBACK(kbd_btn), vnc);
+ g_signal_connect(G_OBJECT(vnc->view), "clicked",
+ G_CALLBACK(view_btn), vnc);
+ GTK_WIDGET_UNSET_FLAGS(vnc->kbd, GTK_CAN_FOCUS);
+ GTK_WIDGET_UNSET_FLAGS(vnc->view, GTK_CAN_FOCUS);
/* packing */
vbox = gtk_vbox_new(FALSE, 0);
@@ -661,6 +686,7 @@ GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
gtk_misc_set_padding(GTK_MISC(vnc->res), 3, 1);
gtk_box_pack_start(GTK_BOX(hbox), vnc->kbd, FALSE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), vnc->view, FALSE, TRUE, 0);
/* show window */
gtk_widget_show_all(vnc->win);
diff --git a/vnc.h b/vnc.h
index e7fd0d2..8bf97e3 100644
--- a/vnc.h
+++ b/vnc.h
@@ -1,6 +1,7 @@
#define VNC_FLAG_STANDALONE (1 << 1)
#define VNC_FLAG_US_KBD (1 << 2)
#define VNC_FLAG_SHOW_MOUSE (1 << 3)
+#define VNC_FLAG_VIEW_ONLY (1 << 4)
GtkWidget *vnc_open(char *hostname, int tcpport, unsigned long flags,
int debug_level);