diff options
author | kraxel <kraxel> | 2006-10-26 12:04:51 +0000 |
---|---|---|
committer | kraxel <kraxel> | 2006-10-26 12:04:51 +0000 |
commit | a528dd2172edb6fc4a152c2cd5f2b1f1b64a5531 (patch) | |
tree | 4e17d5a13289673dd083653b5b43ba1e169c6028 /vnc.c | |
parent | e6a41d6e4b49d519f579bf0d8d2998e575ca441c (diff) | |
download | xenwatch-a528dd2172edb6fc4a152c2cd5f2b1f1b64a5531.tar.gz |
vnc kbd mess ...
Diffstat (limited to 'vnc.c')
-rw-r--r-- | vnc.c | 198 |
1 files changed, 60 insertions, 138 deletions
@@ -25,9 +25,11 @@ struct vnc_window { rfbClient *client; GIOChannel *ch; guint id; - /* gtk windows */ + /* gtk */ GtkWidget *win; GtkWidget *draw; + GdkCursor *on,*off; + /* x11 */ XImage *ximage; void *shm; GC gc; @@ -40,132 +42,28 @@ struct vnc_window { /* ------------------------------------------------------------------ */ /* data tables */ -rfbKeySym linux_uskbd[] = { - [ 9 ] = XK_Escape, - [ 10 ] = XK_1, - [ 11 ] = XK_2, - [ 12 ] = XK_3, - [ 13 ] = XK_4, - [ 14 ] = XK_5, - [ 15 ] = XK_6, - [ 16 ] = XK_7, - [ 17 ] = XK_8, - [ 18 ] = XK_9, - [ 19 ] = XK_0, - [ 20 ] = XK_minus, - [ 21 ] = XK_equal, - [ 22 ] = XK_BackSpace, - - [ 23 ] = XK_Tab, - [ 24 ] = XK_q, - [ 25 ] = XK_w, - [ 26 ] = XK_e, - [ 27 ] = XK_r, - [ 28 ] = XK_t, - [ 29 ] = XK_y, - [ 30 ] = XK_u, - [ 31 ] = XK_i, - [ 32 ] = XK_o, - [ 33 ] = XK_p, - [ 34 ] = XK_bracketleft, - [ 35 ] = XK_bracketright, - [ 36 ] = XK_Return, - - [ 37 ] = XK_Control_L, - [ 38 ] = XK_a, - [ 39 ] = XK_s, - [ 40 ] = XK_d, - [ 41 ] = XK_f, - [ 42 ] = XK_g, - [ 43 ] = XK_h, - [ 44 ] = XK_j, - [ 45 ] = XK_k, - [ 46 ] = XK_l, - [ 47 ] = XK_semicolon, - [ 48 ] = XK_apostrophe, - [ 49 ] = XK_grave, - - [ 50 ] = XK_Shift_L, - [ 51 ] = XK_backslash, - [ 52 ] = XK_z, - [ 53 ] = XK_x, - [ 54 ] = XK_c, - [ 55 ] = XK_v, - [ 56 ] = XK_b, - [ 57 ] = XK_n, - [ 58 ] = XK_m, - [ 59 ] = XK_comma, - [ 60 ] = XK_period, - [ 61 ] = XK_slash, - [ 62 ] = XK_Shift_R, - - [ 63 ] = XK_KP_Multiply, - [ 64 ] = XK_Alt_L, - [ 65 ] = XK_space, - [ 66 ] = XK_Caps_Lock, - - [ 67 ] = XK_F1, - [ 68 ] = XK_F2, - [ 69 ] = XK_F3, - [ 70 ] = XK_F4, - [ 71 ] = XK_F5, - [ 72 ] = XK_F6, - [ 73 ] = XK_F7, - [ 74 ] = XK_F8, - [ 75 ] = XK_F9, - [ 76 ] = XK_F10, - [ 77 ] = XK_Num_Lock, - [ 78 ] = XK_Scroll_Lock, - - [ 79 ] = XK_KP_Home, - [ 80 ] = XK_KP_Up, - [ 81 ] = XK_KP_Prior, - [ 82 ] = XK_KP_Subtract, - [ 83 ] = XK_KP_Left, - [ 84 ] = XK_KP_Begin, - [ 85 ] = XK_KP_Right, - [ 86 ] = XK_KP_Add, - [ 87 ] = XK_KP_End, - [ 88 ] = XK_KP_Down, - [ 89 ] = XK_KP_Next, - [ 90 ] = XK_KP_Insert, - [ 91 ] = XK_KP_Delete, - - [ 93 ] = XK_Mode_switch, -#if 0 - [ 94 ] = XK_FIXME, /* Hmm, the intl kbd 105 th key ... */ -#endif - - [ 95 ] = XK_F11, - [ 96 ] = XK_F12, - [ 97 ] = XK_Home, - [ 98 ] = XK_Up, - [ 99 ] = XK_Prior, - [ 100 ] = XK_Left, - [ 102 ] = XK_Right, - [ 103 ] = XK_End, - [ 104 ] = XK_Down, - [ 105 ] = XK_Next, - [ 106 ] = XK_Insert, - [ 107 ] = XK_Delete, - - [ 108 ] = XK_KP_Enter, - [ 109 ] = XK_Control_R, - [ 110 ] = XK_Pause, - [ 111 ] = XK_Print, - [ 112 ] = XK_KP_Divide, - [ 113 ] = XK_Alt_R, - [ 115 ] = XK_Super_L, - [ 116 ] = XK_Super_R, - [ 117 ] = XK_Menu, - [ 124 ] = XK_ISO_Level3_Shift, - [ 126 ] = XK_KP_Equal, +rfbKeySym linux_uskbd[][2] = { +#include "linux-uskbd.h" }; static int linux_uskbd_size = sizeof(linux_uskbd)/sizeof(linux_uskbd[0]); /* ------------------------------------------------------------------ */ /* helper functions */ +static GdkCursor* empty_cursor(void) +{ + static char bits[32]; + GdkCursor *cursor; + GdkPixmap *pixmap; + GdkColor fg = { 0, 0, 0, 0 }; + GdkColor bg = { 0, 0, 0, 0 }; + + pixmap = gdk_bitmap_create_from_data(NULL, bits, 16, 16); + cursor = gdk_cursor_new_from_pixmap(pixmap, pixmap, &fg, &bg, 0, 0); + gdk_pixmap_unref(pixmap); + return cursor; +} + static void vnc_blit(struct vnc_window *vnc, char *reason, int x, int y, int w, int h) { @@ -199,6 +97,8 @@ static void vnc_window_conf(struct vnc_window *vnc) vnc->client->width, vnc->client->height); gtk_window_set_title(GTK_WINDOW(vnc->win), title); gtk_widget_set_size_request(vnc->draw, vnc->client->width, vnc->client->height); + if (vnc->draw->window) + gdk_window_set_cursor(vnc->draw->window, vnc->off); } static void vnc_release(struct vnc_window *vnc) @@ -388,22 +288,36 @@ static gboolean expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer dat return TRUE; } -static gboolean button_cb(GtkWidget *widget, GdkEventButton *event, - gpointer data) +static void send_mouse(struct vnc_window *vnc, int x, int y, int x11state) { - struct vnc_window *vnc = data; int rfbstate = 0; - if (event->state & Button1Mask) + if (x11state & Button1Mask) rfbstate |= rfbButton1Mask; - if (event->state & Button2Mask) + if (x11state & Button2Mask) rfbstate |= rfbButton2Mask; - if (event->state & Button3Mask) - rfbstate |= rfbButton4Mask; - if (1 || vnc->debug) - fprintf(stderr,"%s: +%lf+%lf x11state 0x%x rfbstate 0x%x\n", __FUNCTION__, - event->x, event->y, event->state, rfbstate); - SendPointerEvent(vnc->client, event->x, event->y, rfbstate); + if (x11state & Button3Mask) + rfbstate |= rfbButton3Mask; + + if (vnc->debug) + fprintf(stderr,"%s: +%d+%d x11state 0x%x rfbstate 0x%x\n", + __FUNCTION__, x, y, x11state, rfbstate); + SendPointerEvent(vnc->client, x, y, rfbstate); +} + +static gboolean button_cb(GtkWidget *widget, GdkEventButton *event, + gpointer data) +{ + struct vnc_window *vnc = data; + send_mouse(vnc, event->x, event->y, event->state); + return TRUE; +} + +static gboolean motion_cb(GtkWidget *widget, GdkEventMotion *event, + gpointer data) +{ + struct vnc_window *vnc = data; + send_mouse(vnc, event->x, event->y, event->state); return TRUE; } @@ -426,15 +340,18 @@ static gboolean key_cb_uskbd(GtkWidget *widget, GdkEventKey *event, { struct vnc_window *vnc = data; rfbKeySym keysym = 0; - int keydown; + int shift,keydown; - if (event->hardware_keycode < linux_uskbd_size) - keysym = linux_uskbd[event->hardware_keycode]; + keydown = (8 == event->type); + shift = (event->state & GDK_SHIFT_MASK) ? 1 : 0; + if (event->hardware_keycode < linux_uskbd_size) { + keysym = linux_uskbd[event->hardware_keycode][shift]; + if (0 == keysym) + keysym = linux_uskbd[event->hardware_keycode][0]; + } if (vnc->debug || 0 == keysym) fprintf(stderr,"%s[%d]: called: keycode %d => keysym %d\n", __FUNCTION__, event->type, event->hardware_keycode, keysym); - keydown = (8 == event->type); - if (keysym) SendKeyEvent(vnc->client, keysym, keydown ? TRUE : FALSE); return TRUE; @@ -492,6 +409,8 @@ GtkWidget *vnc_open(char *hostname, int displayno, vnc->win = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(vnc->win), "destroy", G_CALLBACK(destroy_cb), vnc); + vnc->on = gdk_cursor_new(GDK_LEFT_PTR); + vnc->off = empty_cursor(); /* gtk drawing area */ vnc->draw = gtk_drawing_area_new(); @@ -500,6 +419,7 @@ GtkWidget *vnc_open(char *hostname, int displayno, gtk_widget_add_events(vnc->draw, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | + GDK_POINTER_MOTION_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_EXPOSURE_MASK); @@ -511,6 +431,8 @@ GtkWidget *vnc_open(char *hostname, int displayno, G_CALLBACK(button_cb), vnc); g_signal_connect(G_OBJECT(vnc->draw), "button-release-event", G_CALLBACK(button_cb), vnc); + g_signal_connect(G_OBJECT(vnc->draw), "motion-notify-event", + G_CALLBACK(motion_cb), vnc); if (keysyms) { g_signal_connect(G_OBJECT(vnc->draw), "key-press-event", G_CALLBACK(key_cb_local), vnc); @@ -524,8 +446,8 @@ GtkWidget *vnc_open(char *hostname, int displayno, } /* show window */ - vnc_window_conf(vnc); gtk_widget_show_all(vnc->win); + vnc_window_conf(vnc); return vnc->win; err: |