
On Thu, Jul 21, 2011 at 11:26:59AM +0800, Lai Jiangshan wrote:
Add virtkey lib for usage-improvment and keycode translating. Add 4 internal API for the aim
const char *virKeycodeSetTypeToString(int codeset); int virKeycodeSetTypeFromString(const char *name); int virKeycodeValueFromString(virKeycodeSet codeset, const char *keyname); int virKeycodeValueTranslate(virKeycodeSet from_codeset, virKeycodeSet to_offset, int key_value);
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> --- include/libvirt/libvirt.h.in | 6 ++ src/Makefile.am | 12 +++- src/libvirt_private.syms | 5 ++ src/util/virkey.c | 145 +++++++++++++++++++++++++++++++++++++++++ src/util/virkeycode-mapgen.py | 45 +++++++++++++ src/util/virkeycode.h | 35 ++++++++++ 6 files changed, 247 insertions(+), 1 deletions(-) create mode 100644 src/util/virkey.c create mode 100644 src/util/virkeycode-mapgen.py create mode 100644 src/util/virkeycode.h
Slight mistake there I think. s/virkey.c/virtkeycode.c/
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 40ce0fc..6afd591 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -1788,6 +1788,12 @@ typedef enum { VIR_KEYCODE_SET_ATSET1 = 2, VIR_KEYCODE_SET_ATSET2 = 3, VIR_KEYCODE_SET_ATSET3 = 4, + VIR_KEYCODE_SET_OSX = 5, + VIR_KEYCODE_SET_XT_KBD = 6, + VIR_KEYCODE_SET_USB = 7, + VIR_KEYCODE_SET_WIN32 = 8, + + VIR_KEYCODE_SET_LAST, } virKeycodeSet;
/** diff --git a/src/Makefile.am b/src/Makefile.am index 2a6b0e4..87117de 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -81,7 +81,17 @@ UTIL_SOURCES = \ util/util.c util/util.h \ util/viraudit.c util/viraudit.h \ util/xml.c util/xml.h \ - util/virterror.c util/virterror_internal.h + util/virterror.c util/virterror_internal.h \ + util/virkey.c util/virkeycode.h util/virkeymaps.h
Also s/virkey.c/virkeycode.c/ here
+ +EXTRA_DIST += $(srcdir)/util/virkeymaps.h $(srcdir)/util/keymaps.csv \ + $(srcdir)/util/virkeycode-mapgen.py + +$(srcdir)/util/virkeymaps.h: $(srcdir)/util/keymaps.csv \ + $(srcdir)/util/virkeycode-mapgen.py + python $(srcdir)/util/virkeycode-mapgen.py <$(srcdir)/util/keymaps.csv >$@ + +$(srcdir)/util/virkey.c: $(srcdir)/util/virkeycode.h $(srcdir)/util/virkeymaps.h
I don't think you need the explicit dep rule here. The automake rules will already detect that virkeycode.c has a include of virkeymaps.h and rebuild. You should add virkeymaps.h to the BUILT_SOURCES variable & MAINTAINERCLEANFILES though
EXTRA_DIST += util/threads-pthread.c util/threads-win32.c
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 3e3b1dd..e9ae018 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1097,6 +1097,11 @@ virSetError; virSetErrorLogPriorityFunc; virStrerror;
+# virkeycode.h +virKeycodeSetTypeToString; +virKeycodeSetTypeFromString; +virKeycodeValueFromString; +virKeycodeValueTranslate;
# xml.h virXMLParseFileHelper; diff --git a/src/util/virkey.c b/src/util/virkey.c new file mode 100644 index 0000000..e94768a --- /dev/null +++ b/src/util/virkey.c @@ -0,0 +1,145 @@ + +/* + * Copyright (c) 2011 Lai Jiangshan + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <config.h> +#include "virkeycode.h" +#include <string.h> +#include <stddef.h> + +#define getfield(object, field_type, field_offset) \ + (*(typeof(field_type) *)((char *)(object) + field_offset)) + +struct keycode { + const char *linux_name; + const char *os_x_name; + const char *win32_name; + unsigned short linux_keycode; + unsigned short os_x; + unsigned short atset1; + unsigned short atset2; + unsigned short atset3; + unsigned short xt; + unsigned short xt_kbd; + unsigned short usb; + unsigned short win32; +}; + +#define VIRT_KEY_INTERNAL +#include "virkeymaps.h" + +static unsigned int codeOffset[] = { + [VIR_KEYCODE_SET_LINUX] = + offsetof(struct keycode, linux_keycode), + [VIR_KEYCODE_SET_XT] = + offsetof(struct keycode, xt), + [VIR_KEYCODE_SET_ATSET1] = + offsetof(struct keycode, atset1), + [VIR_KEYCODE_SET_ATSET2] = + offsetof(struct keycode, atset2), + [VIR_KEYCODE_SET_ATSET3] = + offsetof(struct keycode, atset3), + [VIR_KEYCODE_SET_OSX] = + offsetof(struct keycode, os_x), + [VIR_KEYCODE_SET_XT_KBD] = + offsetof(struct keycode, xt_kbd), + [VIR_KEYCODE_SET_USB] = + offsetof(struct keycode, usb), + [VIR_KEYCODE_SET_WIN32] = + offsetof(struct keycode, win32), +}; + +VIR_ENUM_IMPL(virKeycodeSet, VIR_KEYCODE_SET_LAST, + "linux", + "xt", + "atset1", + "atset2", + "atset3", + "os_x", + "xt_kbd", + "usb", + "win32", +); + +static int __virKeycodeValueFromString(unsigned int name_offset, + unsigned int code_offset, + const char *keyname) +{ + int i; + + for (i = 0; i < ARRAY_CARDINALITY(virKeycodes); i++) { + const char *name = getfield(virKeycodes + i, const char *, name_offset); + + if (name && !strcmp(name, keyname)) + return getfield(virKeycodes + i, unsigned short, code_offset); + } + + return -1; +} + +int virKeycodeValueFromString(virKeycodeSet codeset, const char *keyname) +{ + switch (codeset) { + case VIR_KEYCODE_SET_LINUX: + return __virKeycodeValueFromString(offsetof(struct keycode, linux_name), + offsetof(struct keycode, linux_keycode), + keyname); + case VIR_KEYCODE_SET_OSX: + return __virKeycodeValueFromString(offsetof(struct keycode, os_x_name), + offsetof(struct keycode, os_x), + keyname); + case VIR_KEYCODE_SET_WIN32: + return __virKeycodeValueFromString(offsetof(struct keycode, win32_name), + offsetof(struct keycode, win32), + keyname); + default: + return -1; + } +} + +static int __virKeycodeValueTranslate(unsigned int from_offset, + unsigned int to_offset, + int key_value) +{ + int i; + + for (i = 0; ARRAY_CARDINALITY(virKeycodes); i++) { + if (getfield(virKeycodes + i, unsigned short, from_offset) == key_value) + return getfield(virKeycodes + i, unsigned short, to_offset); + } + + return -1; +} + +int virKeycodeValueTranslate(virKeycodeSet from_codeset, + virKeycodeSet to_codeset, + int key_value) +{ + if (key_value <= 0) + return -1; + + key_value = __virKeycodeValueTranslate(codeOffset[from_codeset], + codeOffset[to_codeset], + key_value); + if (key_value <= 0) + return -1; + + return key_value; +}
There's no need for the "__" prefix on static functions here. It just causes code-churn, if we ever decide to then make some of the functions non-static. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|