[qemu] Add access to the monito vt over VNC.

Recognize ctrl+alt+1/2/3 to switch among screens.

Signed-off-by: Yang Xiaowei <xiaowei.yang@intel.com>
Signed-off-by: Christian Limpach <Christian.Limpach@xensource.com>
This commit is contained in:
chris@kneesaa.uk.xensource.com committed 2006-07-26 14:52:47 +01:00
1 parent f1b0353ce1
commit 3c2eba856f
3 files changed
+190 -8

No files matched your search

+1
View File
@@ -33,3 +33,4 @@ vnc-cleanup
vnc-fixes
vnc-start-vncviewer
vnc-title-domain-name
vnc-access-monitor-vt
+112
View File
@@ -0,0 +1,112 @@
Index: ioemu/vnc.c
===================================================================
--- ioemu.orig/vnc.c 2006-07-26 14:33:57.906165040 +0100
+++ ioemu/vnc.c 2006-07-26 14:44:09.972552689 +0100
@@ -32,6 +32,10 @@
#include "vnc_keysym.h"
#include "keymaps.c"
+#define XK_MISCELLANY
+#define XK_LATIN1
+#include <X11/keysymdef.h>
+
typedef struct Buffer
{
size_t capacity;
@@ -64,6 +68,7 @@
Buffer output;
Buffer input;
kbd_layout_t *kbd_layout;
+ int ctl_keys; /* Ctrl+Alt starts calibration */
VncReadEvent *read_handler;
size_t read_handler_expect;
@@ -679,16 +684,80 @@
static void do_key_event(VncState *vs, int down, uint32_t sym)
{
- int keycode;
+ sym &= 0xFFFF;
- keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
+ if (is_graphic_console()) {
+ int keycode;
- if (keycode & 0x80)
- kbd_put_keycode(0xe0);
- if (down)
- kbd_put_keycode(keycode & 0x7f);
- else
- kbd_put_keycode(keycode | 0x80);
+ keycode = keysym2scancode(vs->kbd_layout, sym);
+ if (keycode & 0x80)
+ kbd_put_keycode(0xe0);
+ if (down)
+ kbd_put_keycode(keycode & 0x7f);
+ else
+ kbd_put_keycode(keycode | 0x80);
+ } else if (down) {
+ int qemu_keysym = 0;
+
+ if (sym <= 128) /* normal ascii */
+ qemu_keysym = sym;
+ else {
+ switch (sym) {
+ case XK_Up: qemu_keysym = QEMU_KEY_UP; break;
+ case XK_Down: qemu_keysym = QEMU_KEY_DOWN; break;
+ case XK_Left: qemu_keysym = QEMU_KEY_LEFT; break;
+ case XK_Right: qemu_keysym = QEMU_KEY_RIGHT; break;
+ case XK_Home: qemu_keysym = QEMU_KEY_HOME; break;
+ case XK_End: qemu_keysym = QEMU_KEY_END; break;
+ case XK_Page_Up: qemu_keysym = QEMU_KEY_PAGEUP; break;
+ case XK_Page_Down: qemu_keysym = QEMU_KEY_PAGEDOWN; break;
+ case XK_BackSpace: qemu_keysym = QEMU_KEY_BACKSPACE; break;
+ case XK_Delete: qemu_keysym = QEMU_KEY_DELETE; break;
+ case XK_Return:
+ case XK_Linefeed: qemu_keysym = sym; break;
+ default: break;
+ }
+ }
+ if (qemu_keysym != 0)
+ kbd_put_keysym(qemu_keysym);
+ }
+
+ if (down) {
+ switch (sym) {
+ case XK_Control_L:
+ vs->ctl_keys |= 1;
+ break;
+
+ case XK_Alt_L:
+ vs->ctl_keys |= 2;
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ switch (sym) {
+ case XK_Control_L:
+ vs->ctl_keys &= ~1;
+ break;
+
+ case XK_Alt_L:
+ vs->ctl_keys &= ~2;
+ break;
+
+ case XK_1 ... XK_9:
+ if ((vs->ctl_keys & 3) != 3)
+ break;
+
+ console_select(sym - XK_1);
+ if (is_graphic_console()) {
+ /* tell the vga console to redisplay itself */
+ vga_hw_invalidate();
+ vnc_dpy_update(vs->ds, 0, 0, vs->ds->width, vs->ds->height);
+ }
+ break;
+ }
+ }
}
static void key_event(VncState *vs, int down, uint32_t sym)
+77 -8
View File
@@ -32,6 +32,10 @@
#include "vnc_keysym.h"
#include "keymaps.c"
#define XK_MISCELLANY
#define XK_LATIN1
#include <X11/keysymdef.h>
typedef struct Buffer
{
size_t capacity;
@@ -64,6 +68,7 @@ struct VncState
Buffer output;
Buffer input;
kbd_layout_t *kbd_layout;
int ctl_keys; /* Ctrl+Alt starts calibration */
VncReadEvent *read_handler;
size_t read_handler_expect;
@@ -679,16 +684,80 @@ static void pointer_event(VncState *vs, int button_mask, int x, int y)
static void do_key_event(VncState *vs, int down, uint32_t sym)
{
int keycode;
sym &= 0xFFFF;
keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
if (is_graphic_console()) {
int keycode;
if (keycode & 0x80)
kbd_put_keycode(0xe0);
if (down)
kbd_put_keycode(keycode & 0x7f);
else
kbd_put_keycode(keycode | 0x80);
keycode = keysym2scancode(vs->kbd_layout, sym);
if (keycode & 0x80)
kbd_put_keycode(0xe0);
if (down)
kbd_put_keycode(keycode & 0x7f);
else
kbd_put_keycode(keycode | 0x80);
} else if (down) {
int qemu_keysym = 0;
if (sym <= 128) /* normal ascii */
qemu_keysym = sym;
else {
switch (sym) {
case XK_Up: qemu_keysym = QEMU_KEY_UP; break;
case XK_Down: qemu_keysym = QEMU_KEY_DOWN; break;
case XK_Left: qemu_keysym = QEMU_KEY_LEFT; break;
case XK_Right: qemu_keysym = QEMU_KEY_RIGHT; break;
case XK_Home: qemu_keysym = QEMU_KEY_HOME; break;
case XK_End: qemu_keysym = QEMU_KEY_END; break;
case XK_Page_Up: qemu_keysym = QEMU_KEY_PAGEUP; break;
case XK_Page_Down: qemu_keysym = QEMU_KEY_PAGEDOWN; break;
case XK_BackSpace: qemu_keysym = QEMU_KEY_BACKSPACE; break;
case XK_Delete: qemu_keysym = QEMU_KEY_DELETE; break;
case XK_Return:
case XK_Linefeed: qemu_keysym = sym; break;
default: break;
}
}
if (qemu_keysym != 0)
kbd_put_keysym(qemu_keysym);
}
if (down) {
switch (sym) {
case XK_Control_L:
vs->ctl_keys |= 1;
break;
case XK_Alt_L:
vs->ctl_keys |= 2;
break;
default:
break;
}
} else {
switch (sym) {
case XK_Control_L:
vs->ctl_keys &= ~1;
break;
case XK_Alt_L:
vs->ctl_keys &= ~2;
break;
case XK_1 ... XK_9:
if ((vs->ctl_keys & 3) != 3)
break;
console_select(sym - XK_1);
if (is_graphic_console()) {
/* tell the vga console to redisplay itself */
vga_hw_invalidate();
vnc_dpy_update(vs->ds, 0, 0, vs->ds->width, vs->ds->height);
}
break;
}
}
}
static void key_event(VncState *vs, int down, uint32_t sym)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.