mirror of
git://git.proxmox.com/git/spiceterm.git
synced 2025-09-02 14:15:07 +00:00
use gdk keysyms instead of utf
There is no way to encode function keys with utf!
This commit is contained in:
2
Makefile
2
Makefile
@@ -10,7 +10,7 @@ test_display_no_ssl: ${SOURCES} ${HEADERS} test_display_no_ssl.c
|
|||||||
gcc ${SOURCES} test_display_no_ssl.c -o $@ $(shell pkg-config --cflags --libs spice-protocol,spice-server)
|
gcc ${SOURCES} test_display_no_ssl.c -o $@ $(shell pkg-config --cflags --libs spice-protocol,spice-server)
|
||||||
|
|
||||||
spiceterm: ${SOURCES} ${HEADERS} spiceterm.c
|
spiceterm: ${SOURCES} ${HEADERS} spiceterm.c
|
||||||
gcc ${SOURCES} spiceterm.c -o $@ -lutil $(shell pkg-config --cflags --libs spice-protocol,spice-server)
|
gcc ${SOURCES} spiceterm.c -o $@ -lutil $(shell pkg-config --cflags gdk-3.0) $(shell pkg-config --cflags --libs spice-protocol,spice-server)
|
||||||
|
|
||||||
.PHONY: test1
|
.PHONY: test1
|
||||||
test1: test_display_no_ssl
|
test1: test_display_no_ssl
|
||||||
|
133
spiceterm.c
133
spiceterm.c
@@ -45,6 +45,7 @@
|
|||||||
#include <spice/macros.h>
|
#include <spice/macros.h>
|
||||||
#include <spice/qxl_dev.h>
|
#include <spice/qxl_dev.h>
|
||||||
|
|
||||||
|
#include <gdk/gdkkeysyms.h>
|
||||||
#include "test_display_base.h"
|
#include "test_display_base.h"
|
||||||
|
|
||||||
/* define this for debugging */
|
/* define this for debugging */
|
||||||
@@ -1463,6 +1464,7 @@ static void my_kbd_push_key(SpiceKbdInstance *sin, uint8_t frag)
|
|||||||
vncTerm *vt = SPICE_CONTAINEROF(sin, vncTerm, keyboard_sin);
|
vncTerm *vt = SPICE_CONTAINEROF(sin, vncTerm, keyboard_sin);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
printf("MYKEYCODE %x\n", frag);
|
printf("MYKEYCODE %x\n", frag);
|
||||||
|
|
||||||
if (vt->ibuf_count < (IBUFSIZE - 32)) {
|
if (vt->ibuf_count < (IBUFSIZE - 32)) {
|
||||||
@@ -1474,15 +1476,120 @@ static void my_kbd_push_key(SpiceKbdInstance *sin, uint8_t frag)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void my_kbd_push_unicode(SpiceKbdInstance *sin, uint32_t uc)
|
static void my_kbd_push_keyval(SpiceKbdInstance *sin, uint32_t keySym, int flags)
|
||||||
{
|
{
|
||||||
vncTerm *vt = SPICE_CONTAINEROF(sin, vncTerm, keyboard_sin);
|
vncTerm *vt = SPICE_CONTAINEROF(sin, vncTerm, keyboard_sin);
|
||||||
|
static int control = 0;
|
||||||
|
static int shift = 0;
|
||||||
|
char *esc = NULL;
|
||||||
|
|
||||||
printf("MYKEYVAL %x\n", uc);
|
//fprintf (stderr, "KEYEVENT:%d: %08x\n", flags, keySym);fflush (stderr);
|
||||||
|
if (flags & 1) {
|
||||||
|
fprintf(stderr, "KEYPRESS: %08x\n", keySym);fflush (stderr);
|
||||||
|
|
||||||
if (vt->ibuf_count < (IBUFSIZE - 32)) {
|
if (keySym == GDK_KEY_Shift_L || keySym == GDK_KEY_Shift_R) {
|
||||||
|
shift = 1;
|
||||||
|
} if (keySym == GDK_KEY_Control_L || keySym == GDK_KEY_Control_R) {
|
||||||
|
control = 1;
|
||||||
|
} else if (vt->ibuf_count < (IBUFSIZE - 32)) {
|
||||||
|
|
||||||
|
if (control) {
|
||||||
|
if(keySym >= 'a' && keySym <= 'z')
|
||||||
|
keySym -= 'a' -1;
|
||||||
|
else if (keySym >= 'A' && keySym <= 'Z')
|
||||||
|
keySym -= 'A'-1;
|
||||||
|
else
|
||||||
|
keySym=0xffff;
|
||||||
|
} else {
|
||||||
|
switch (keySym) {
|
||||||
|
case GDK_KEY_Escape:
|
||||||
|
keySym=27; break;
|
||||||
|
case GDK_KEY_Return:
|
||||||
|
keySym='\r'; break;
|
||||||
|
case GDK_KEY_BackSpace:
|
||||||
|
keySym=8; break;
|
||||||
|
case GDK_KEY_Tab:
|
||||||
|
keySym='\t'; break;
|
||||||
|
case GDK_KEY_Delete: /* kdch1 */
|
||||||
|
case GDK_KEY_KP_Delete:
|
||||||
|
esc = "[3~";break;
|
||||||
|
case GDK_KEY_Home: /* khome */
|
||||||
|
case GDK_KEY_KP_Home:
|
||||||
|
esc = "OH";break;
|
||||||
|
case GDK_KEY_End:
|
||||||
|
case GDK_KEY_KP_End: /* kend */
|
||||||
|
esc = "OF";break;
|
||||||
|
case GDK_KEY_Insert: /* kich1 */
|
||||||
|
case GDK_KEY_KP_Insert:
|
||||||
|
esc = "[2~";break;
|
||||||
|
case GDK_KEY_Up:
|
||||||
|
case GDK_KEY_KP_Up: /* kcuu1 */
|
||||||
|
esc = "OA";break;
|
||||||
|
case GDK_KEY_Down: /* kcud1 */
|
||||||
|
case GDK_KEY_KP_Down:
|
||||||
|
esc = "OB";break;
|
||||||
|
case GDK_KEY_Right:
|
||||||
|
case GDK_KEY_KP_Right: /* kcuf1 */
|
||||||
|
esc = "OC";break;
|
||||||
|
case GDK_KEY_Left:
|
||||||
|
case GDK_KEY_KP_Left: /* kcub1 */
|
||||||
|
esc = "OD";break;
|
||||||
|
case GDK_KEY_Page_Up:
|
||||||
|
if (shift) {
|
||||||
|
vncterm_virtual_scroll (vt, -vt->height/2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
esc = "[5~";break;
|
||||||
|
case GDK_KEY_Page_Down:
|
||||||
|
if (shift) {
|
||||||
|
vncterm_virtual_scroll (vt, vt->height/2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
esc = "[6~";break;
|
||||||
|
case GDK_KEY_F1:
|
||||||
|
esc = "OP";break;
|
||||||
|
case GDK_KEY_F2:
|
||||||
|
esc = "OQ";break;
|
||||||
|
case GDK_KEY_F3:
|
||||||
|
esc = "OR";break;
|
||||||
|
case GDK_KEY_F4:
|
||||||
|
esc = "OS";break;
|
||||||
|
case GDK_KEY_F5:
|
||||||
|
esc = "[15~";break;
|
||||||
|
case GDK_KEY_F6:
|
||||||
|
esc = "[17~";break;
|
||||||
|
case GDK_KEY_F7:
|
||||||
|
esc = "[18~";break;
|
||||||
|
case GDK_KEY_F8:
|
||||||
|
esc = "[19~";break;
|
||||||
|
case GDK_KEY_F9:
|
||||||
|
esc = "[20~";break;
|
||||||
|
case GDK_KEY_F10:
|
||||||
|
esc = "[21~";break;
|
||||||
|
case GDK_KEY_F11:
|
||||||
|
esc = "[23~";break;
|
||||||
|
case GDK_KEY_F12:
|
||||||
|
esc = "[24~";break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "KEYPRESS OUT:%s: %d\n", esc, keySym); fflush (stderr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (vt->y_displ != vt->y_base) {
|
||||||
|
vt->y_displ = vt->y_base;
|
||||||
|
vncterm_refresh (vt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (esc) {
|
||||||
|
vncterm_respond_esc(vt, esc);
|
||||||
|
} else if(keySym < 0x100) {
|
||||||
|
if (vt->utf8) {
|
||||||
gchar buf[10];
|
gchar buf[10];
|
||||||
gint len = g_unichar_to_utf8(uc, buf);
|
gint len = g_unichar_to_utf8(keySym, buf);
|
||||||
|
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
int i;
|
int i;
|
||||||
@@ -1490,7 +1597,21 @@ static void my_kbd_push_unicode(SpiceKbdInstance *sin, uint32_t uc)
|
|||||||
vt->ibuf[vt->ibuf_count++] = buf[i];
|
vt->ibuf[vt->ibuf_count++] = buf[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vt->screen->core->watch_update_mask(vt->screen->mwatch, SPICE_WATCH_EVENT_READ|SPICE_WATCH_EVENT_WRITE);
|
} else {
|
||||||
|
vt->ibuf[vt->ibuf_count++] = (char)keySym;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vt->screen->core->watch_update_mask(vt->screen->mwatch,
|
||||||
|
SPICE_WATCH_EVENT_READ|SPICE_WATCH_EVENT_WRITE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & 2) { // UP
|
||||||
|
if (keySym == GDK_KEY_Shift_L || keySym == GDK_KEY_Shift_R) {
|
||||||
|
shift = 0;
|
||||||
|
} else if (keySym == GDK_KEY_Control_L || keySym == GDK_KEY_Control_R) {
|
||||||
|
control = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1504,7 +1625,7 @@ static SpiceKbdInterface my_keyboard_sif = {
|
|||||||
.base.description = "spiceterm keyboard device",
|
.base.description = "spiceterm keyboard device",
|
||||||
.base.major_version = SPICE_INTERFACE_KEYBOARD_MAJOR,
|
.base.major_version = SPICE_INTERFACE_KEYBOARD_MAJOR,
|
||||||
.base.minor_version = SPICE_INTERFACE_KEYBOARD_MINOR,
|
.base.minor_version = SPICE_INTERFACE_KEYBOARD_MINOR,
|
||||||
.push_unicode = my_kbd_push_unicode,
|
.push_keyval = my_kbd_push_keyval,
|
||||||
.push_scan_freg = my_kbd_push_key,
|
.push_scan_freg = my_kbd_push_key,
|
||||||
.get_leds = my_kbd_get_leds,
|
.get_leds = my_kbd_get_leds,
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user