gtk2/gdk/gdkkeynames.c
Matthias Clasen 3c8b5b490c Convert the gdk keyval-keyname tables to a big string + offsets. (#168901)
2005-03-07  Matthias Clasen  <mclasen@redhat.com>

	Convert the gdk keyval-keyname tables to a big string
	+ offsets. (#168901)

	* gdk/gen-keyname-table.pl: Perl script inspired by
	pango/tools/gen-color-table.pl to create the
	gdk_keys_by_keyval and gdk_keys_by_name tables as lists
	of offsets pointing into a big const string.

	* gdk/keynames.txt: List of keyval-keyname pairs.
	* gdk/keyname-table.h: Generated tables.

	* gdk/gdkkeynames.c: Include keyname-table.h and don't
	generate the inverse table at runtime.
2005-03-08 04:35:29 +00:00

105 lines
2.7 KiB
C

/* GDK - The GIMP Drawing Kit
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
*
* 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 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.
*/
/*
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
* file for a list of people on the GTK+ Team. See the ChangeLog
* files for a list of changes. These files are distributed with
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#include <config.h>
#include <glib/gprintf.h>
#include <stdlib.h>
#include <string.h>
#include "gdkalias.h"
#include "gdkkeysyms.h"
#include "gdkinternals.h"
/* Key handling not part of the keymap */
#include "keyname-table.h"
#define GDK_NUM_KEYS (sizeof (gdk_keys_by_keyval) / sizeof (gdk_keys_by_keyval[0]))
static int
gdk_keys_keyval_compare (const void *pkey, const void *pbase)
{
return (*(int *) pkey) - ((struct gdk_key *) pbase)->keyval;
}
gchar*
gdk_keyval_name (guint keyval)
{
static gchar buf[100];
struct gdk_key *found;
/* Check for directly encoded 24-bit UCS characters: */
if ((keyval & 0xff000000) == 0x01000000)
{
g_sprintf (buf, "U+%.04X", (keyval & 0x00ffffff));
return buf;
}
found = bsearch (&keyval, gdk_keys_by_keyval,
GDK_NUM_KEYS, sizeof (struct gdk_key),
gdk_keys_keyval_compare);
if (found != NULL)
{
while ((found > gdk_keys_by_keyval) &&
((found - 1)->keyval == keyval))
found--;
return (gchar *) (keynames + found->offset);
}
else if (keyval != 0)
{
g_sprintf (buf, "%#x", keyval);
return buf;
}
return NULL;
}
static int
gdk_keys_name_compare (const void *pkey, const void *pbase)
{
return strcmp ((const char *) pkey,
(const char *) (keynames + ((const struct gdk_key *) pbase)->offset));
}
guint
gdk_keyval_from_name (const gchar *keyval_name)
{
struct gdk_key *found;
g_return_val_if_fail (keyval_name != NULL, 0);
found = bsearch (keyval_name, gdk_keys_by_name,
GDK_NUM_KEYS, sizeof (struct gdk_key),
gdk_keys_name_compare);
if (found != NULL)
return found->keyval;
else
return GDK_VoidSymbol;
}