aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkraxel <kraxel>2006-10-26 12:04:51 +0000
committerkraxel <kraxel>2006-10-26 12:04:51 +0000
commita528dd2172edb6fc4a152c2cd5f2b1f1b64a5531 (patch)
tree4e17d5a13289673dd083653b5b43ba1e169c6028
parente6a41d6e4b49d519f579bf0d8d2998e575ca441c (diff)
downloadxenwatch-a528dd2172edb6fc4a152c2cd5f2b1f1b64a5531.tar.gz
vnc kbd mess ...
-rw-r--r--kbdmap.sh27
-rw-r--r--linux-uskbd.h111
-rw-r--r--vnc.c198
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 },
diff --git a/vnc.c b/vnc.c
index b9adad2..1bced25 100644
--- a/vnc.c
+++ b/vnc.c
@@ -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: