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 | |
parent | e6a41d6e4b49d519f579bf0d8d2998e575ca441c (diff) | |
download | xenwatch-a528dd2172edb6fc4a152c2cd5f2b1f1b64a5531.tar.gz |
vnc kbd mess ...
-rw-r--r-- | kbdmap.sh | 27 | ||||
-rw-r--r-- | linux-uskbd.h | 111 | ||||
-rw-r--r-- | vnc.c | 198 |
3 files changed, 198 insertions, 138 deletions
diff --git a/kbdmap.sh b/kbdmap.sh new file mode 100644 index 0000000..64db08a --- /dev/null +++ b/kbdmap.sh @@ -0,0 +1,27 @@ +#!/bin/sh +xmodmap -pke | while read line; do + set -- $line + sep="" + shift + keycode="$1" + shift + shift + if test "$1" = ""; then + continue + fi + printf " [ %3s ] = { " "$keycode" + while test "$1" != ""; do + case "$1" in + NoSymbol | XF86_*) + keysym="0" + ;; + *) + keysym="XK_$1" + ;; + esac + echo -n "${sep}${keysym}" + sep=", " + shift + done + echo " }," +done diff --git a/linux-uskbd.h b/linux-uskbd.h new file mode 100644 index 0000000..5c0d5ca --- /dev/null +++ b/linux-uskbd.h @@ -0,0 +1,111 @@ + [ 9 ] = { XK_Escape }, + [ 10 ] = { XK_1, XK_exclam }, + [ 11 ] = { XK_2, XK_at }, + [ 12 ] = { XK_3, XK_numbersign }, + [ 13 ] = { XK_4, XK_dollar }, + [ 14 ] = { XK_5, XK_percent }, + [ 15 ] = { XK_6, XK_asciicircum }, + [ 16 ] = { XK_7, XK_ampersand }, + [ 17 ] = { XK_8, XK_asterisk }, + [ 18 ] = { XK_9, XK_parenleft }, + [ 19 ] = { XK_0, XK_parenright }, + [ 20 ] = { XK_minus, XK_underscore }, + [ 21 ] = { XK_equal, XK_plus }, + [ 22 ] = { XK_BackSpace, XK_Terminate_Server }, + [ 23 ] = { XK_Tab, XK_ISO_Left_Tab }, + [ 24 ] = { XK_q, XK_Q }, + [ 25 ] = { XK_w, XK_W }, + [ 26 ] = { XK_e, XK_E }, + [ 27 ] = { XK_r, XK_R }, + [ 28 ] = { XK_t, XK_T }, + [ 29 ] = { XK_y, XK_Y }, + [ 30 ] = { XK_u, XK_U }, + [ 31 ] = { XK_i, XK_I }, + [ 32 ] = { XK_o, XK_O }, + [ 33 ] = { XK_p, XK_P }, + [ 34 ] = { XK_bracketleft, XK_braceleft }, + [ 35 ] = { XK_bracketright, XK_braceright }, + [ 36 ] = { XK_Return }, + [ 37 ] = { XK_Control_L }, + [ 38 ] = { XK_a, XK_A }, + [ 39 ] = { XK_s, XK_S }, + [ 40 ] = { XK_d, XK_D }, + [ 41 ] = { XK_f, XK_F }, + [ 42 ] = { XK_g, XK_G }, + [ 43 ] = { XK_h, XK_H }, + [ 44 ] = { XK_j, XK_J }, + [ 45 ] = { XK_k, XK_K }, + [ 46 ] = { XK_l, XK_L }, + [ 47 ] = { XK_semicolon, XK_colon }, + [ 48 ] = { XK_apostrophe, XK_quotedbl }, + [ 49 ] = { XK_grave, XK_asciitilde }, + [ 50 ] = { XK_Shift_L }, + [ 51 ] = { XK_backslash, XK_bar }, + [ 52 ] = { XK_z, XK_Z }, + [ 53 ] = { XK_x, XK_X }, + [ 54 ] = { XK_c, XK_C }, + [ 55 ] = { XK_v, XK_V }, + [ 56 ] = { XK_b, XK_B }, + [ 57 ] = { XK_n, XK_N }, + [ 58 ] = { XK_m, XK_M }, + [ 59 ] = { XK_comma, XK_less }, + [ 60 ] = { XK_period, XK_greater }, + [ 61 ] = { XK_slash, XK_question }, + [ 62 ] = { XK_Shift_R }, + [ 63 ] = { XK_KP_Multiply, 0 }, + [ 64 ] = { XK_Alt_L, XK_Meta_L }, + [ 65 ] = { XK_space }, + [ 66 ] = { XK_Caps_Lock }, + [ 67 ] = { XK_F1, 0 }, + [ 68 ] = { XK_F2, 0 }, + [ 69 ] = { XK_F3, 0 }, + [ 70 ] = { XK_F4, 0 }, + [ 71 ] = { XK_F5, 0 }, + [ 72 ] = { XK_F6, 0 }, + [ 73 ] = { XK_F7, 0 }, + [ 74 ] = { XK_F8, 0 }, + [ 75 ] = { XK_F9, 0 }, + [ 76 ] = { XK_F10, 0 }, + [ 77 ] = { XK_Num_Lock, XK_Pointer_EnableKeys }, + [ 78 ] = { XK_Scroll_Lock }, + [ 79 ] = { XK_KP_Home, XK_KP_7 }, + [ 80 ] = { XK_KP_Up, XK_KP_8 }, + [ 81 ] = { XK_KP_Prior, XK_KP_9 }, + [ 82 ] = { XK_KP_Subtract, 0 }, + [ 83 ] = { XK_KP_Left, XK_KP_4 }, + [ 84 ] = { XK_KP_Begin, XK_KP_5 }, + [ 85 ] = { XK_KP_Right, XK_KP_6 }, + [ 86 ] = { XK_KP_Add, 0 }, + [ 87 ] = { XK_KP_End, XK_KP_1 }, + [ 88 ] = { XK_KP_Down, XK_KP_2 }, + [ 89 ] = { XK_KP_Next, XK_KP_3 }, + [ 90 ] = { XK_KP_Insert, XK_KP_0 }, + [ 91 ] = { XK_KP_Delete, XK_KP_Decimal }, + [ 93 ] = { XK_Mode_switch }, + [ 95 ] = { XK_F11, 0 }, + [ 96 ] = { XK_F12, 0 }, + [ 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, XK_Multi_key }, + [ 110 ] = { XK_Pause, XK_Break }, + [ 111 ] = { XK_Print, XK_Sys_Req }, + [ 112 ] = { XK_KP_Divide, 0 }, + [ 113 ] = { XK_Alt_R, XK_Meta_R }, + [ 115 ] = { XK_Super_L }, + [ 116 ] = { XK_Super_R, XK_Multi_key }, + [ 117 ] = { XK_Menu }, + [ 124 ] = { XK_ISO_Level3_Shift }, + [ 125 ] = { 0, XK_Alt_L }, + [ 126 ] = { XK_KP_Equal }, + [ 127 ] = { 0, XK_Super_L }, + [ 128 ] = { 0, XK_Hyper_L }, + [ 156 ] = { 0, XK_Meta_L }, @@ -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: |