aboutsummaryrefslogtreecommitdiffstats
path: root/vnc.c
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 /vnc.c
parente6a41d6e4b49d519f579bf0d8d2998e575ca441c (diff)
downloadxenwatch-a528dd2172edb6fc4a152c2cd5f2b1f1b64a5531.tar.gz
vnc kbd mess ...
Diffstat (limited to 'vnc.c')
-rw-r--r--vnc.c198
1 files changed, 60 insertions, 138 deletions
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: