diff options
-rw-r--r-- | vnc-client.c | 6 | ||||
-rw-r--r-- | vnc.c | 36 | ||||
-rw-r--r-- | vnc.h | 1 |
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); @@ -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); @@ -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); |