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@xxxxxxxxxxxxxx> > --- > 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list