Initial commit.
This commit is contained in:
107
eek/Makefile.am
Normal file
107
eek/Makefile.am
Normal file
@ -0,0 +1,107 @@
|
||||
# Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
# Copyright (C) 2010 Red Hat, Inc.
|
||||
|
||||
# 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
lib_LTLIBRARIES = libeek.la libeek-clutter.la libeek-xkb.la
|
||||
|
||||
libeek_la_SOURCES = \
|
||||
eek-layout.c \
|
||||
eek-layout.h \
|
||||
eek-keyboard.c \
|
||||
eek-keyboard.h \
|
||||
eek-section.c \
|
||||
eek-section.h \
|
||||
eek-key.c \
|
||||
eek-key.h \
|
||||
eek-simple-keyboard.c \
|
||||
eek-simple-keyboard.h \
|
||||
eek-simple-section.c \
|
||||
eek-simple-section.h \
|
||||
eek-simple-key.c \
|
||||
eek-simple-key.h \
|
||||
eek-private.c \
|
||||
eek-private.h \
|
||||
eek-types.h \
|
||||
eek-types.c \
|
||||
eek-keysym.h \
|
||||
eek-keysym.c \
|
||||
eek-special-keysym-labels.h \
|
||||
eek-unicode-keysym-labels.h \
|
||||
eek-keyname-keysym-labels.h \
|
||||
$(NULL)
|
||||
|
||||
libeek_la_CFLAGS = $(GOBJECT2_CFLAGS) $(CAIRO_CFLAGS) $(PANGO_CFLAGS)
|
||||
libeek_la_LIBADD = $(GOBJECT2_LIBS) $(CAIRO_LIBS) $(PANGO_LIBS)
|
||||
|
||||
libeek_clutter_la_SOURCES = \
|
||||
eek-clutter-keyboard.c \
|
||||
eek-clutter-keyboard.h \
|
||||
eek-clutter-section.c \
|
||||
eek-clutter-section.h \
|
||||
eek-clutter-key.c \
|
||||
eek-clutter-key.h \
|
||||
eek-clutter-private.c \
|
||||
eek-clutter-private.h \
|
||||
eek-clutter.h \
|
||||
$(NULL)
|
||||
|
||||
libeek_clutter_la_CFLAGS = $(CLUTTER_CFLAGS)
|
||||
libeek_clutter_la_LIBADD = libeek.la $(CLUTTER_LIBS)
|
||||
|
||||
libeek_xkb_la_SOURCES = \
|
||||
eek-xkb-layout.h \
|
||||
eek-xkb-layout.c \
|
||||
$(NULL)
|
||||
|
||||
libeek_xkb_la_CFLAGS = $(XKB_CFLAGS)
|
||||
libeek_xkb_la_LIBADD = libeek.la $(XKB_LIBS)
|
||||
|
||||
eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek
|
||||
eek_HEADERS = \
|
||||
$(top_srcdir)/eek/eek-keyboard.h \
|
||||
$(top_srcdir)/eek/eek-section.h \
|
||||
$(top_srcdir)/eek/eek-key.h \
|
||||
$(top_srcdir)/eek/eek-layout.h \
|
||||
$(top_srcdir)/eek/eek-keysym.h \
|
||||
$(top_srcdir)/eek/eek-types.h \
|
||||
$(top_srcdir)/eek/eek-clutter-keyboard.h \
|
||||
$(top_srcdir)/eek/eek-clutter-section.h \
|
||||
$(top_srcdir)/eek/eek-clutter-key.h \
|
||||
$(top_srcdir)/eek/eek-xkb-layout.h \
|
||||
$(top_srcdir)/eek/eek.h \
|
||||
$(top_srcdir)/eek/eek-clutter.h \
|
||||
$(top_srcdir)/eek/eek-xkb.h
|
||||
|
||||
eek-keysym.c: eek-special-keysym-labels.h eek-unicode-keysym-labels.h eek-keyname-keysym-labels.h
|
||||
|
||||
eek-special-keysym-labels.h: special-keysym-labels.txt
|
||||
./gen-keysym-labels.py $< special_keysym_labels > $@
|
||||
eek-unicode-keysym-labels.h: unicode-keysym-labels.txt
|
||||
./gen-keysym-labels.py $< unicode_keysym_labels > $@
|
||||
eek-keyname-keysym-labels.h: keyname-keysym-labels.txt
|
||||
./gen-keysym-labels.py $< keyname_keysym_labels > $@
|
||||
|
||||
DISTCLEANFILES = \
|
||||
eek-special-keysym-labels.h \
|
||||
eek-unicode-keysym-labels.h \
|
||||
eek-keyname-keysym-labels.h
|
||||
|
||||
EXTRA_DIST = \
|
||||
gen-keysym-labels.py \
|
||||
special-keysym-labels.txt \
|
||||
unicode-keysym-labels.txt \
|
||||
keyname-keysym-labels.txt
|
||||
558
eek/eek-clutter-key.c
Normal file
558
eek/eek-clutter-key.c
Normal file
@ -0,0 +1,558 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-clutter-key
|
||||
* @short_description: #EekKey implemented as a #ClutterActor
|
||||
*
|
||||
* The #EekClutterKey class implements the #EekKeyIface interface as a
|
||||
* #ClutterActor.
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
#include "eek-clutter-key.h"
|
||||
#include "eek-simple-key.h"
|
||||
#include "eek-keysym.h"
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_KEYSYMS,
|
||||
PROP_COLUMN,
|
||||
PROP_ROW,
|
||||
PROP_OUTLINE,
|
||||
PROP_BOUNDS,
|
||||
PROP_GROUP,
|
||||
PROP_LEVEL,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static void eek_key_iface_init (EekKeyIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (EekClutterKey, eek_clutter_key,
|
||||
CLUTTER_TYPE_GROUP,
|
||||
G_IMPLEMENT_INTERFACE (EEK_TYPE_KEY,
|
||||
eek_key_iface_init));
|
||||
|
||||
#define EEK_CLUTTER_KEY_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CLUTTER_KEY, EekClutterKeyPrivate))
|
||||
|
||||
struct _EekClutterKeyPrivate
|
||||
{
|
||||
EekSimpleKey *simple;
|
||||
};
|
||||
|
||||
static void
|
||||
eek_clutter_key_real_set_keysyms (EekKey *self,
|
||||
guint *keysyms,
|
||||
gint groups,
|
||||
gint levels)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
eek_key_set_keysyms (EEK_KEY(priv->simple), keysyms, groups, levels);
|
||||
}
|
||||
|
||||
static gint
|
||||
eek_clutter_key_real_get_groups (EekKey *self)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_val_if_fail (priv, -1);
|
||||
return eek_key_get_groups (EEK_KEY(priv->simple));
|
||||
}
|
||||
|
||||
static guint
|
||||
eek_clutter_key_real_get_keysym (EekKey *self)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_val_if_fail (priv, EEK_INVALID_KEYSYM);
|
||||
return eek_key_get_keysym (EEK_KEY(priv->simple));
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_real_set_index (EekKey *self,
|
||||
gint column,
|
||||
gint row)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
eek_key_set_index (EEK_KEY(priv->simple), column, row);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_real_get_index (EekKey *self,
|
||||
gint *column,
|
||||
gint *row)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
eek_key_get_index (EEK_KEY(priv->simple), column, row);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_real_set_outline (EekKey *self, EekOutline *outline)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
eek_key_set_outline (EEK_KEY(priv->simple), outline);
|
||||
}
|
||||
|
||||
static EekOutline *
|
||||
eek_clutter_key_real_get_outline (EekKey *self)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_val_if_fail (priv, NULL);
|
||||
return eek_key_get_outline (EEK_KEY(priv->simple));
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_real_set_bounds (EekKey *self, EekBounds *bounds)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
eek_key_set_bounds (EEK_KEY(priv->simple), bounds);
|
||||
|
||||
clutter_actor_set_anchor_point_from_gravity (CLUTTER_ACTOR(self),
|
||||
CLUTTER_GRAVITY_CENTER);
|
||||
clutter_actor_set_position (CLUTTER_ACTOR(self),
|
||||
bounds->x + bounds->w / 2,
|
||||
bounds->y + bounds->h / 2);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_real_get_bounds (EekKey *self,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
return eek_key_get_bounds (EEK_KEY(priv->simple), bounds);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_real_set_keysym_index (EekKey *self,
|
||||
gint group,
|
||||
gint level)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
eek_key_set_index (EEK_KEY(priv->simple), group, level);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_real_get_keysym_index (EekKey *self, gint *group, gint *level)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
return eek_key_get_keysym_index (EEK_KEY(priv->simple), group, level);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_iface_init (EekKeyIface *iface)
|
||||
{
|
||||
iface->set_keysyms = eek_clutter_key_real_set_keysyms;
|
||||
iface->get_groups = eek_clutter_key_real_get_groups;
|
||||
iface->get_keysym = eek_clutter_key_real_get_keysym;
|
||||
iface->set_index = eek_clutter_key_real_set_index;
|
||||
iface->get_index = eek_clutter_key_real_get_index;
|
||||
iface->set_outline = eek_clutter_key_real_set_outline;
|
||||
iface->get_outline = eek_clutter_key_real_get_outline;
|
||||
iface->set_bounds = eek_clutter_key_real_set_bounds;
|
||||
iface->get_bounds = eek_clutter_key_real_get_bounds;
|
||||
iface->set_keysym_index = eek_clutter_key_real_set_keysym_index;
|
||||
iface->get_keysym_index = eek_clutter_key_real_get_keysym_index;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_dispose (GObject *object)
|
||||
{
|
||||
clutter_group_remove_all (CLUTTER_GROUP(object));
|
||||
G_OBJECT_CLASS (eek_clutter_key_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_finalize (GObject *object)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(object);
|
||||
|
||||
g_object_unref (priv->simple);
|
||||
G_OBJECT_CLASS (eek_clutter_key_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_text_on_layout (PangoLayout *layout,
|
||||
const gchar *text,
|
||||
gdouble scale)
|
||||
{
|
||||
PangoFontDescription *font_desc;
|
||||
|
||||
#define FONT_SIZE (720 * 50)
|
||||
/* FIXME: Font should be configurable through a property. */
|
||||
font_desc = pango_font_description_from_string ("Sans");
|
||||
pango_font_description_set_size (font_desc, FONT_SIZE * scale);
|
||||
pango_layout_set_font_description (layout, font_desc);
|
||||
pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
|
||||
pango_layout_set_text (layout, text, -1);
|
||||
pango_font_description_free (font_desc);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_key_on_layout (EekKey *key,
|
||||
PangoLayout *layout)
|
||||
{
|
||||
PangoLayout *buffer;
|
||||
PangoRectangle logical_rect = { 0, };
|
||||
EekBounds bounds;
|
||||
guint keysym;
|
||||
const gchar *label;
|
||||
gdouble scale_x, scale_y;
|
||||
|
||||
eek_key_get_bounds (key, &bounds);
|
||||
keysym = eek_key_get_keysym (key);
|
||||
if (keysym == EEK_INVALID_KEYSYM)
|
||||
return;
|
||||
label = eek_keysym_to_string (keysym);
|
||||
if (!label)
|
||||
label = "";
|
||||
|
||||
/* Compute the layout extents. */
|
||||
buffer = pango_layout_copy (layout);
|
||||
draw_text_on_layout (buffer, label, 1.0);
|
||||
pango_layout_get_extents (buffer, NULL, &logical_rect);
|
||||
scale_x = scale_y = 1.0;
|
||||
if (PANGO_PIXELS(logical_rect.width) > bounds.w)
|
||||
scale_x = bounds.w / PANGO_PIXELS(logical_rect.width);
|
||||
if (PANGO_PIXELS(logical_rect.height) > bounds.h)
|
||||
scale_y = bounds.h / PANGO_PIXELS(logical_rect.height);
|
||||
g_object_unref (buffer);
|
||||
|
||||
/* Actually draw on the layout */
|
||||
draw_text_on_layout (layout, label, scale_x < scale_y ? scale_x : scale_y);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_paint (ClutterActor *self)
|
||||
{
|
||||
PangoLayout *layout;
|
||||
PangoRectangle logical_rect = { 0, };
|
||||
CoglColor color;
|
||||
ClutterGeometry geom;
|
||||
EekBounds bounds;
|
||||
gfloat width, height;
|
||||
gfloat x, y;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_ACTOR(self));
|
||||
g_return_if_fail (EEK_IS_KEY(self));
|
||||
|
||||
/* Draw the background texture first. */
|
||||
CLUTTER_ACTOR_CLASS (eek_clutter_key_parent_class)->paint (self);
|
||||
|
||||
/* Draw the label on the key. */
|
||||
layout = clutter_actor_create_pango_layout (self, NULL);
|
||||
draw_key_on_layout (EEK_KEY(self), layout);
|
||||
pango_layout_get_extents (layout, NULL, &logical_rect);
|
||||
|
||||
/* FIXME: Color should be configurable through a property. */
|
||||
cogl_color_set_from_4ub (&color, 0x80, 0x00, 0x00, 0xff);
|
||||
clutter_actor_get_allocation_geometry (self, &geom);
|
||||
cogl_pango_render_layout (layout,
|
||||
(geom.width - logical_rect.width / PANGO_SCALE) / 2,
|
||||
(geom.height - logical_rect.height / PANGO_SCALE) / 2,
|
||||
&color,
|
||||
0);
|
||||
g_object_unref (layout);
|
||||
}
|
||||
|
||||
/* FIXME: This is a workaround for the bug
|
||||
* http://bugzilla.openedhand.com/show_bug.cgi?id=2137 A developer
|
||||
* says this is not a right way to solve the original problem.
|
||||
*/
|
||||
static void
|
||||
eek_clutter_key_get_preferred_width (ClutterActor *self,
|
||||
gfloat for_height,
|
||||
gfloat *min_width_p,
|
||||
gfloat *natural_width_p)
|
||||
{
|
||||
PangoLayout *layout;
|
||||
PangoFontDescription *font_desc;
|
||||
PangoRectangle logical_rect = { 0, };
|
||||
EekBounds bounds;
|
||||
guint keysym;
|
||||
const gchar *label;
|
||||
gdouble scale = 1.0;
|
||||
|
||||
eek_key_get_bounds (EEK_KEY(self), &bounds);
|
||||
keysym = eek_key_get_keysym (EEK_KEY(self));
|
||||
g_return_if_fail (keysym != EEK_INVALID_KEYSYM);
|
||||
label = eek_keysym_to_string (keysym);
|
||||
if (!label)
|
||||
label = "";
|
||||
|
||||
/* Draw the label on the key. */
|
||||
layout = clutter_actor_create_pango_layout (self, NULL);
|
||||
draw_key_on_layout (EEK_KEY(self), layout);
|
||||
pango_layout_get_extents (layout, NULL, &logical_rect);
|
||||
|
||||
cogl_pango_ensure_glyph_cache_for_layout (layout);
|
||||
g_object_unref (layout);
|
||||
|
||||
CLUTTER_ACTOR_CLASS (eek_clutter_key_parent_class)->get_preferred_width
|
||||
(self, for_height, min_width_p, natural_width_p);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(object);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
switch (prop_id) {
|
||||
/* Properties which affect the appearance of the key as a
|
||||
ClutterActor. */
|
||||
case PROP_BOUNDS:
|
||||
eek_key_set_bounds (EEK_KEY(object),
|
||||
g_value_get_boxed (value));
|
||||
break;
|
||||
case PROP_OUTLINE:
|
||||
eek_key_set_outline (EEK_KEY(object),
|
||||
g_value_get_pointer (value));
|
||||
break;
|
||||
/* Otherwise delegate to priv->simple or the parent. */
|
||||
case PROP_KEYSYMS:
|
||||
case PROP_COLUMN:
|
||||
case PROP_GROUP:
|
||||
case PROP_ROW:
|
||||
case PROP_LEVEL:
|
||||
g_object_set_property (G_OBJECT(priv->simple),
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
default:
|
||||
g_object_set_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekClutterKeyPrivate *priv = EEK_CLUTTER_KEY_GET_PRIVATE(object);
|
||||
EekBounds bounds;
|
||||
|
||||
g_return_if_fail (priv);
|
||||
switch (prop_id) {
|
||||
case PROP_BOUNDS:
|
||||
eek_key_get_bounds (EEK_KEY(object), &bounds);
|
||||
g_value_set_boxed (value, &bounds);
|
||||
break;
|
||||
case PROP_KEYSYMS:
|
||||
case PROP_COLUMN:
|
||||
case PROP_ROW:
|
||||
case PROP_OUTLINE:
|
||||
case PROP_GROUP:
|
||||
case PROP_LEVEL:
|
||||
g_object_get_property (G_OBJECT(priv->simple),
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
default:
|
||||
g_object_get_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_class_init (EekClutterKeyClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (gobject_class,
|
||||
sizeof (EekClutterKeyPrivate));
|
||||
|
||||
actor_class->paint = eek_clutter_key_paint;
|
||||
/* FIXME: This is a workaround for the bug
|
||||
* http://bugzilla.openedhand.com/show_bug.cgi?id=2137 A developer
|
||||
* says this is not a right way to solve the original problem.
|
||||
*/
|
||||
actor_class->get_preferred_width = eek_clutter_key_get_preferred_width;
|
||||
|
||||
gobject_class->set_property = eek_clutter_key_set_property;
|
||||
gobject_class->get_property = eek_clutter_key_get_property;
|
||||
gobject_class->finalize = eek_clutter_key_finalize;
|
||||
gobject_class->dispose = eek_clutter_key_dispose;
|
||||
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_KEYSYMS,
|
||||
"keysyms");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_COLUMN,
|
||||
"column");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_ROW,
|
||||
"row");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_OUTLINE,
|
||||
"outline");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_BOUNDS,
|
||||
"bounds");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_GROUP,
|
||||
"group");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_LEVEL,
|
||||
"level");
|
||||
}
|
||||
|
||||
static void
|
||||
on_key_animate_complete (ClutterAnimation *animation,
|
||||
gpointer user_data)
|
||||
{
|
||||
ClutterActor *actor = (ClutterActor*)user_data;
|
||||
|
||||
/* reset after effect */
|
||||
clutter_actor_set_opacity (actor, 0xff);
|
||||
clutter_actor_set_scale (actor, 1.0, 1.0);
|
||||
}
|
||||
|
||||
static void
|
||||
key_enlarge (ClutterActor *actor)
|
||||
{
|
||||
clutter_actor_set_scale (actor, 1.0, 1.0);
|
||||
clutter_actor_animate (actor, CLUTTER_EASE_IN_SINE, 150,
|
||||
"scale-x", 1.5,
|
||||
"scale-y", 1.5,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
key_shrink (ClutterActor *actor)
|
||||
{
|
||||
clutter_actor_set_scale (actor, 1.5, 1.5);
|
||||
clutter_actor_animate (actor, CLUTTER_EASE_OUT_SINE, 150,
|
||||
"scale-x", 1.0,
|
||||
"scale-y", 1.0,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_event (ClutterActor *actor,
|
||||
ClutterEvent *event,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEY(actor), FALSE);
|
||||
if (clutter_event_get_source (event) == actor) {
|
||||
ClutterActor *section;
|
||||
|
||||
/* Make sure the enlarged key show up on the keys which belong
|
||||
to other sections. */
|
||||
section = clutter_actor_get_parent (actor);
|
||||
clutter_actor_raise_top (section);
|
||||
clutter_actor_raise_top (actor);
|
||||
if (event->type == CLUTTER_BUTTON_PRESS)
|
||||
key_enlarge (actor);
|
||||
else if (event->type == CLUTTER_BUTTON_RELEASE)
|
||||
key_shrink (actor);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_key_init (EekClutterKey *self)
|
||||
{
|
||||
EekClutterKeyPrivate *priv;
|
||||
|
||||
priv = self->priv = EEK_CLUTTER_KEY_GET_PRIVATE(self);
|
||||
priv->simple = g_object_new (EEK_TYPE_SIMPLE_KEY, NULL);
|
||||
|
||||
clutter_actor_set_reactive (CLUTTER_ACTOR(self), TRUE);
|
||||
g_signal_connect (self, "event", G_CALLBACK (on_event), NULL);
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
eek_clutter_key_create_texture (EekClutterKey *key)
|
||||
{
|
||||
EekOutline *outline;
|
||||
EekBounds bounds;
|
||||
ClutterActor *texture;
|
||||
cairo_t *cr;
|
||||
cairo_pattern_t *pat;
|
||||
|
||||
outline = eek_key_get_outline (EEK_KEY(key));
|
||||
eek_key_get_bounds (EEK_KEY(key), &bounds);
|
||||
|
||||
texture = clutter_cairo_texture_new (bounds.w, bounds.h);
|
||||
cr = clutter_cairo_texture_create (CLUTTER_CAIRO_TEXTURE(texture));
|
||||
cairo_set_line_width (cr, 1);
|
||||
cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
|
||||
|
||||
pat = cairo_pattern_create_linear (0.0, 0.0, 0.0, 256.0);
|
||||
cairo_pattern_add_color_stop_rgba (pat, 1, 0.5, 0.5, 0.5, 1);
|
||||
cairo_pattern_add_color_stop_rgba (pat, 0, 1, 1, 1, 1);
|
||||
|
||||
cairo_set_source (cr, pat);
|
||||
|
||||
eek_cairo_draw_rounded_polygon (cr,
|
||||
TRUE,
|
||||
outline->corner_radius,
|
||||
outline->points,
|
||||
outline->num_points);
|
||||
|
||||
cairo_pattern_destroy (pat);
|
||||
|
||||
cairo_set_source_rgba (cr, 0.3, 0.3, 0.3, 0.5);
|
||||
eek_cairo_draw_rounded_polygon (cr,
|
||||
FALSE,
|
||||
outline->corner_radius,
|
||||
outline->points,
|
||||
outline->num_points);
|
||||
cairo_destroy (cr);
|
||||
return texture;
|
||||
}
|
||||
|
||||
void
|
||||
eek_clutter_key_set_texture (EekClutterKey *key,
|
||||
ClutterActor *texture)
|
||||
{
|
||||
clutter_actor_set_position (texture, 0, 0);
|
||||
clutter_container_add_actor (CLUTTER_CONTAINER(key), texture);
|
||||
}
|
||||
60
eek/eek-clutter-key.h
Normal file
60
eek/eek-clutter-key.h
Normal file
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_CLUTTER_KEY_H
|
||||
#define EEK_CLUTTER_KEY_H 1
|
||||
|
||||
#include <clutter/clutter.h>
|
||||
#include "eek-key.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
#define EEK_TYPE_CLUTTER_KEY (eek_clutter_key_get_type())
|
||||
#define EEK_CLUTTER_KEY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_CLUTTER_KEY, EekClutterKey))
|
||||
#define EEK_CLUTTER_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_CLUTTER_KEY, EekClutterKeyClass))
|
||||
#define EEK_IS_CLUTTER_KEY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_CLUTTER_KEY))
|
||||
#define EEK_IS_CLUTTER_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_CLUTTER_KEY))
|
||||
#define EEK_CLUTTER_KEY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_CLUTTER_KEY, EekClutterKeyClass))
|
||||
|
||||
typedef struct _EekClutterKey EekClutterKey;
|
||||
typedef struct _EekClutterKeyClass EekClutterKeyClass;
|
||||
typedef struct _EekClutterKeyPrivate EekClutterKeyPrivate;
|
||||
|
||||
struct _EekClutterKey
|
||||
{
|
||||
/*< private >*/
|
||||
ClutterGroup parent;
|
||||
|
||||
/*< private >*/
|
||||
EekClutterKeyPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekClutterKeyClass
|
||||
{
|
||||
/*< private >*/
|
||||
ClutterGroupClass parent_class;
|
||||
};
|
||||
|
||||
GType eek_clutter_key_get_type (void) G_GNUC_CONST;
|
||||
|
||||
ClutterActor *eek_clutter_key_create_texture (EekClutterKey *key);
|
||||
void eek_clutter_key_set_texture (EekClutterKey *key,
|
||||
ClutterActor *texture);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_CLUTTER_KEY_H */
|
||||
256
eek/eek-clutter-keyboard.c
Normal file
256
eek/eek-clutter-keyboard.c
Normal file
@ -0,0 +1,256 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-clutter-keyboard
|
||||
* @short_description: #EekKeyboard implemented as a #ClutterActor
|
||||
*
|
||||
* The #EekClutterKeyboard class implements the #EekKeyboardIface
|
||||
* interface as a #ClutterActor.
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-clutter-keyboard.h"
|
||||
#include "eek-clutter-private.h"
|
||||
#include "eek-simple-keyboard.h"
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_BOUNDS,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static void eek_keyboard_iface_init (EekKeyboardIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (EekClutterKeyboard, eek_clutter_keyboard,
|
||||
CLUTTER_TYPE_GROUP,
|
||||
G_IMPLEMENT_INTERFACE (EEK_TYPE_KEYBOARD,
|
||||
eek_keyboard_iface_init));
|
||||
|
||||
#define EEK_CLUTTER_KEYBOARD_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CLUTTER_KEYBOARD, EekClutterKeyboardPrivate))
|
||||
|
||||
|
||||
struct _EekClutterKeyboardPrivate
|
||||
{
|
||||
EekSimpleKeyboard *simple;
|
||||
};
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_real_set_bounds (EekKeyboard *self,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
|
||||
|
||||
fflush (stdout);
|
||||
g_return_if_fail (priv);
|
||||
eek_keyboard_set_bounds (EEK_KEYBOARD(priv->simple), bounds);
|
||||
clutter_actor_set_position (CLUTTER_ACTOR(self), bounds->x, bounds->y);
|
||||
clutter_actor_set_size (CLUTTER_ACTOR(self), bounds->w, bounds->h);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_real_get_bounds (EekKeyboard *self,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
return eek_keyboard_get_bounds (EEK_KEYBOARD(priv->simple), bounds);
|
||||
}
|
||||
|
||||
static EekSection *
|
||||
eek_clutter_keyboard_real_create_section (EekKeyboard *self,
|
||||
const gchar *name,
|
||||
gint angle,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSection *section;
|
||||
|
||||
g_return_if_fail (EEK_IS_CLUTTER_KEYBOARD(self));
|
||||
|
||||
section = g_object_new (EEK_TYPE_CLUTTER_SECTION,
|
||||
"name", name,
|
||||
"angle", angle,
|
||||
"bounds", bounds,
|
||||
NULL);
|
||||
|
||||
clutter_container_add_actor (CLUTTER_CONTAINER(self),
|
||||
CLUTTER_ACTOR(section));
|
||||
|
||||
return section;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_real_foreach_section (EekKeyboard *self,
|
||||
GFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekClutterCallbackData data;
|
||||
|
||||
g_return_if_fail (EEK_IS_CLUTTER_KEYBOARD(self));
|
||||
|
||||
data.func = func;
|
||||
data.user_data = user_data;
|
||||
|
||||
clutter_container_foreach (CLUTTER_CONTAINER(self),
|
||||
eek_clutter_callback,
|
||||
&data);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_real_set_layout (EekKeyboard *self,
|
||||
EekLayout *layout)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEYBOARD(self));
|
||||
g_return_if_fail (EEK_IS_LAYOUT(layout));
|
||||
|
||||
EEK_LAYOUT_GET_CLASS(layout)->apply_to_keyboard (layout, self);
|
||||
if (g_object_is_floating (layout))
|
||||
g_object_unref (layout);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_iface_init (EekKeyboardIface *iface)
|
||||
{
|
||||
iface->set_bounds = eek_clutter_keyboard_real_set_bounds;
|
||||
iface->get_bounds = eek_clutter_keyboard_real_get_bounds;
|
||||
iface->create_section = eek_clutter_keyboard_real_create_section;
|
||||
iface->foreach_section = eek_clutter_keyboard_real_foreach_section;
|
||||
iface->set_layout = eek_clutter_keyboard_real_set_layout;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_dispose (GObject *object)
|
||||
{
|
||||
clutter_group_remove_all (CLUTTER_GROUP(object));
|
||||
G_OBJECT_CLASS (eek_clutter_keyboard_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_finalize (GObject *object)
|
||||
{
|
||||
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(object);
|
||||
|
||||
g_object_unref (priv->simple);
|
||||
G_OBJECT_CLASS (eek_clutter_keyboard_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(object);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
switch (prop_id) {
|
||||
case PROP_BOUNDS:
|
||||
eek_keyboard_set_bounds (EEK_KEYBOARD(object),
|
||||
g_value_get_boxed (value));
|
||||
break;
|
||||
default:
|
||||
g_object_set_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekClutterKeyboardPrivate *priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(object);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
switch (prop_id) {
|
||||
case PROP_BOUNDS:
|
||||
eek_keyboard_set_bounds (EEK_KEYBOARD(object),
|
||||
g_value_get_boxed (value));
|
||||
break;
|
||||
default:
|
||||
g_object_set_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_paint (ClutterActor *self)
|
||||
{
|
||||
CLUTTER_ACTOR_CLASS (eek_clutter_keyboard_parent_class)->paint (self);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_class_init (EekClutterKeyboardClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (gobject_class,
|
||||
sizeof (EekClutterKeyboardPrivate));
|
||||
|
||||
gobject_class->set_property = eek_clutter_keyboard_set_property;
|
||||
gobject_class->get_property = eek_clutter_keyboard_get_property;
|
||||
gobject_class->finalize = eek_clutter_keyboard_finalize;
|
||||
gobject_class->dispose = eek_clutter_keyboard_dispose;
|
||||
|
||||
actor_class->paint = eek_clutter_keyboard_paint;
|
||||
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_BOUNDS,
|
||||
"bounds");
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_keyboard_init (EekClutterKeyboard *self)
|
||||
{
|
||||
EekClutterKeyboardPrivate *priv;
|
||||
|
||||
priv = self->priv = EEK_CLUTTER_KEYBOARD_GET_PRIVATE(self);
|
||||
priv->simple = g_object_new (EEK_TYPE_SIMPLE_KEYBOARD, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_clutter_keyboard_new:
|
||||
* @width: max width of the area where the keyboard to be drawn
|
||||
* @height: max height of the area where the keyboard to be drawn
|
||||
*
|
||||
* Create a new #EekClutterKeyboard.
|
||||
*/
|
||||
EekKeyboard*
|
||||
eek_clutter_keyboard_new (gfloat width,
|
||||
gfloat height)
|
||||
{
|
||||
EekBounds bounds;
|
||||
|
||||
bounds.x = bounds.y = 0;
|
||||
bounds.w = width;
|
||||
bounds.h = height;
|
||||
return g_object_new (EEK_TYPE_CLUTTER_KEYBOARD, "bounds", &bounds, NULL);
|
||||
}
|
||||
58
eek/eek-clutter-keyboard.h
Normal file
58
eek/eek-clutter-keyboard.h
Normal file
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_CLUTTER_KEYBOARD_H
|
||||
#define EEK_CLUTTER_KEYBOARD_H 1
|
||||
|
||||
#include "eek-clutter-section.h"
|
||||
#include "eek-keyboard.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
#define EEK_TYPE_CLUTTER_KEYBOARD (eek_clutter_keyboard_get_type())
|
||||
#define EEK_CLUTTER_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_CLUTTER_KEYBOARD, EekKeyboard))
|
||||
#define EEK_CLUTTER_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_CLUTTER_KEYBOARD, EekClutterKeyboardClass))
|
||||
#define EEK_IS_CLUTTER_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_CLUTTER_KEYBOARD))
|
||||
#define EEK_IS_CLUTTER_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_CLUTTER_KEYBOARD))
|
||||
#define EEK_CLUTTER_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_CLUTTER_KEYBOARD, EekClutterKeyboardClass))
|
||||
|
||||
typedef struct _EekClutterKeyboard EekClutterKeyboard;
|
||||
typedef struct _EekClutterKeyboardClass EekClutterKeyboardClass;
|
||||
typedef struct _EekClutterKeyboardPrivate EekClutterKeyboardPrivate;
|
||||
|
||||
struct _EekClutterKeyboard
|
||||
{
|
||||
/*< private >*/
|
||||
ClutterGroup parent;
|
||||
|
||||
EekClutterKeyboardPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekClutterKeyboardClass
|
||||
{
|
||||
/*< private >*/
|
||||
ClutterGroupClass parent_class;
|
||||
};
|
||||
|
||||
GType eek_clutter_keyboard_get_type (void) G_GNUC_CONST;
|
||||
|
||||
EekKeyboard *eek_clutter_keyboard_new (gfloat width,
|
||||
gfloat height);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_CLUTTER_KEYBOARD_H */
|
||||
31
eek/eek-clutter-private.c
Normal file
31
eek/eek-clutter-private.c
Normal file
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-clutter-private.h"
|
||||
|
||||
void
|
||||
eek_clutter_callback (ClutterActor *actor, gpointer user_data)
|
||||
{
|
||||
EekClutterCallbackData *data = user_data;
|
||||
data->func (actor, data->user_data);
|
||||
}
|
||||
34
eek/eek-clutter-private.h
Normal file
34
eek/eek-clutter-private.h
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_CLUTTER_PRIVATE_H
|
||||
#define EEK_CLUTTER_PRIVATE_H 1
|
||||
|
||||
#include <glib/gtypes.h>
|
||||
#include <clutter/clutter.h>
|
||||
|
||||
struct _EekClutterCallbackData {
|
||||
GFunc func;
|
||||
gpointer user_data;
|
||||
};
|
||||
typedef struct _EekClutterCallbackData EekClutterCallbackData;
|
||||
|
||||
void eek_clutter_callback (ClutterActor *actor, gpointer user_data);
|
||||
|
||||
#endif /* EEK_CLUTTER_PRIVATE_H */
|
||||
323
eek/eek-clutter-section.c
Normal file
323
eek/eek-clutter-section.c
Normal file
@ -0,0 +1,323 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-clutter-section
|
||||
* @short_description: #EekSection implemented as a #ClutterActor
|
||||
*
|
||||
* The #EekClutterSection class implements the #EekSectionIface
|
||||
* interface as a #ClutterActor.
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
#include "eek-clutter-section.h"
|
||||
#include "eek-clutter-private.h"
|
||||
#include "eek-simple-section.h"
|
||||
#include <stdio.h>
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_COLUMNS,
|
||||
PROP_ROWS,
|
||||
PROP_ANGLE,
|
||||
PROP_BOUNDS,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static void eek_section_iface_init (EekSectionIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (EekClutterSection, eek_clutter_section,
|
||||
CLUTTER_TYPE_GROUP,
|
||||
G_IMPLEMENT_INTERFACE (EEK_TYPE_SECTION,
|
||||
eek_section_iface_init));
|
||||
|
||||
#define EEK_CLUTTER_SECTION_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CLUTTER_SECTION, EekClutterSectionPrivate))
|
||||
|
||||
struct _EekClutterSectionPrivate
|
||||
{
|
||||
EekSimpleSection *simple;
|
||||
GHashTable *key_outline_texture_hash; /* outline pointer -> texture */
|
||||
};
|
||||
|
||||
static void
|
||||
eek_clutter_section_real_set_dimensions (EekSection *self,
|
||||
gint columns,
|
||||
gint rows)
|
||||
{
|
||||
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
eek_section_set_dimensions (EEK_SECTION(priv->simple), columns, rows);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_real_get_dimensions (EekSection *self,
|
||||
gint *columns,
|
||||
gint *rows)
|
||||
{
|
||||
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
eek_section_get_dimensions (EEK_SECTION(priv->simple), columns, rows);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_real_set_angle (EekSection *self,
|
||||
gint angle)
|
||||
{
|
||||
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
eek_section_set_angle (EEK_SECTION(priv->simple), angle);
|
||||
clutter_actor_set_rotation (CLUTTER_ACTOR(self),
|
||||
CLUTTER_Z_AXIS,
|
||||
angle,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
}
|
||||
|
||||
static gint
|
||||
eek_clutter_section_real_get_angle (EekSection *self)
|
||||
{
|
||||
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_val_if_fail (priv, 0);
|
||||
eek_section_get_angle (EEK_SECTION(priv->simple));
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_real_set_bounds (EekSection *self,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
eek_section_set_bounds (EEK_SECTION(priv->simple), bounds);
|
||||
clutter_actor_set_position (CLUTTER_ACTOR(self), bounds->x, bounds->y);
|
||||
clutter_actor_set_size (CLUTTER_ACTOR(self), bounds->w, bounds->h);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_real_get_bounds (EekSection *self,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
return eek_section_get_bounds (EEK_SECTION(priv->simple), bounds);
|
||||
}
|
||||
|
||||
static EekKey *
|
||||
eek_clutter_section_real_create_key (EekSection *self,
|
||||
const gchar *name,
|
||||
guint *keysyms,
|
||||
gint num_groups,
|
||||
gint num_levels,
|
||||
gint column,
|
||||
gint row,
|
||||
EekOutline *outline,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(self);
|
||||
EekKey *key;
|
||||
EekKeysymMatrix matrix;
|
||||
gint columns, rows;
|
||||
ClutterActor *texture;
|
||||
|
||||
g_return_val_if_fail (priv, NULL);
|
||||
|
||||
eek_section_get_dimensions (self, &columns, &rows);
|
||||
g_return_val_if_fail (column < columns, NULL);
|
||||
g_return_val_if_fail (row < rows, NULL);
|
||||
|
||||
matrix.data = keysyms;
|
||||
matrix.num_groups = num_groups;
|
||||
matrix.num_levels = num_levels;
|
||||
key = g_object_new (EEK_TYPE_CLUTTER_KEY,
|
||||
"name", name,
|
||||
"keysyms", &matrix,
|
||||
"column", column,
|
||||
"row", row,
|
||||
"outline", outline,
|
||||
"bounds", bounds,
|
||||
NULL);
|
||||
g_return_val_if_fail (key, NULL);
|
||||
|
||||
texture = g_hash_table_lookup (priv->key_outline_texture_hash, outline);
|
||||
if (texture == NULL) {
|
||||
texture = eek_clutter_key_create_texture (EEK_CLUTTER_KEY(key));
|
||||
g_hash_table_insert (priv->key_outline_texture_hash, outline, texture);
|
||||
} else
|
||||
texture = clutter_clone_new (texture);
|
||||
|
||||
eek_clutter_key_set_texture (EEK_CLUTTER_KEY(key), texture);
|
||||
clutter_container_add_actor (CLUTTER_CONTAINER(self),
|
||||
CLUTTER_ACTOR(key));
|
||||
return key;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_real_foreach_key (EekSection *self,
|
||||
GFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekClutterCallbackData data;
|
||||
|
||||
g_return_if_fail (EEK_IS_CLUTTER_SECTION(self));
|
||||
|
||||
data.func = func;
|
||||
data.user_data = user_data;
|
||||
|
||||
clutter_container_foreach (CLUTTER_CONTAINER(self),
|
||||
eek_clutter_callback,
|
||||
&data);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_section_iface_init (EekSectionIface *iface)
|
||||
{
|
||||
iface->set_dimensions = eek_clutter_section_real_set_dimensions;
|
||||
iface->get_dimensions = eek_clutter_section_real_get_dimensions;
|
||||
iface->set_angle = eek_clutter_section_real_set_angle;
|
||||
iface->get_angle = eek_clutter_section_real_get_angle;
|
||||
iface->set_bounds = eek_clutter_section_real_set_bounds;
|
||||
iface->get_bounds = eek_clutter_section_real_get_bounds;
|
||||
iface->create_key = eek_clutter_section_real_create_key;
|
||||
iface->foreach_key = eek_clutter_section_real_foreach_key;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_dispose (GObject *object)
|
||||
{
|
||||
clutter_group_remove_all (CLUTTER_GROUP(object));
|
||||
G_OBJECT_CLASS (eek_clutter_section_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_finalize (GObject *object)
|
||||
{
|
||||
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(object);
|
||||
|
||||
g_object_unref (priv->simple);
|
||||
G_OBJECT_CLASS (eek_clutter_section_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_ANGLE:
|
||||
eek_section_set_angle (EEK_SECTION(object),
|
||||
g_value_get_int (value));
|
||||
break;
|
||||
case PROP_BOUNDS:
|
||||
eek_section_set_bounds (EEK_SECTION(object),
|
||||
g_value_get_boxed (value));
|
||||
break;
|
||||
default:
|
||||
g_object_set_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekClutterSectionPrivate *priv = EEK_CLUTTER_SECTION_GET_PRIVATE(object);
|
||||
EekBounds bounds;
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_ANGLE:
|
||||
g_value_set_int (value, eek_section_get_angle (EEK_SECTION(object)));
|
||||
break;
|
||||
case PROP_BOUNDS:
|
||||
eek_section_get_bounds (EEK_SECTION(object), &bounds);
|
||||
g_value_set_boxed (value, &bounds);
|
||||
break;
|
||||
default:
|
||||
g_object_get_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_paint (ClutterActor *self)
|
||||
{
|
||||
ClutterGeometry geom;
|
||||
|
||||
CLUTTER_ACTOR_CLASS (eek_clutter_section_parent_class)->paint (self);
|
||||
|
||||
//clutter_actor_get_allocation_geometry (self, &geom);
|
||||
//cogl_set_source_color4ub (0x80, 0x00, 0x00, 0xff);
|
||||
//cogl_rectangle (0, 0, geom.width, geom.height);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_class_init (EekClutterSectionClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (EekClutterSectionPrivate));
|
||||
|
||||
gobject_class->set_property = eek_clutter_section_set_property;
|
||||
gobject_class->get_property = eek_clutter_section_get_property;
|
||||
gobject_class->finalize = eek_clutter_section_finalize;
|
||||
gobject_class->dispose = eek_clutter_section_dispose;
|
||||
|
||||
actor_class->paint = eek_clutter_section_paint;
|
||||
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_ANGLE,
|
||||
"angle");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_BOUNDS,
|
||||
"bounds");
|
||||
}
|
||||
|
||||
static void
|
||||
eek_clutter_section_init (EekClutterSection *self)
|
||||
{
|
||||
EekClutterSectionPrivate *priv;
|
||||
|
||||
priv = self->priv = EEK_CLUTTER_SECTION_GET_PRIVATE (self);
|
||||
priv->simple = g_object_new (EEK_TYPE_SIMPLE_SECTION, NULL);
|
||||
priv->key_outline_texture_hash =
|
||||
g_hash_table_new_full (g_direct_hash,
|
||||
g_direct_equal,
|
||||
NULL,
|
||||
g_free);
|
||||
}
|
||||
56
eek/eek-clutter-section.h
Normal file
56
eek/eek-clutter-section.h
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_CLUTTER_SECTION_H
|
||||
#define EEK_CLUTTER_SECTION_H 1
|
||||
|
||||
#include "eek-clutter-key.h"
|
||||
#include "eek-section.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
#define EEK_TYPE_CLUTTER_SECTION (eek_clutter_section_get_type())
|
||||
#define EEK_CLUTTER_SECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_CLUTTER_SECTION, EekClutterSection))
|
||||
#define EEK_CLUTTER_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_CLUTTER_SECTION, EekClutterSectionClass))
|
||||
#define EEK_IS_CLUTTER_SECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_CLUTTER_SECTION))
|
||||
#define EEK_IS_CLUTTER_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_CLUTTER_SECTION))
|
||||
#define EEK_CLUTTER_SECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_CLUTTER_SECTION, EekClutterSectionClass))
|
||||
|
||||
typedef struct _EekClutterSection EekClutterSection;
|
||||
typedef struct _EekClutterSectionClass EekClutterSectionClass;
|
||||
typedef struct _EekClutterSectionPrivate EekClutterSectionPrivate;
|
||||
|
||||
struct _EekClutterSection
|
||||
{
|
||||
/*< private >*/
|
||||
ClutterGroup parent;
|
||||
|
||||
/*< private >*/
|
||||
EekClutterSectionPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekClutterSectionClass
|
||||
{
|
||||
/*< private >*/
|
||||
ClutterGroupClass parent_class;
|
||||
};
|
||||
|
||||
GType eek_clutter_section_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_CLUTTER_SECTION_H */
|
||||
26
eek/eek-clutter.h
Normal file
26
eek/eek-clutter.h
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_CLUTTER_H
|
||||
#define EEK_CLUTTER_H 1
|
||||
|
||||
#include "eek.h"
|
||||
#include "eek-clutter-keyboard.h"
|
||||
|
||||
#endif /* EEK_CLUTTER_H */
|
||||
374
eek/eek-key.c
Normal file
374
eek/eek-key.c
Normal file
@ -0,0 +1,374 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-key
|
||||
* @short_description: Base interface of a key
|
||||
* @see_also: #EekSection
|
||||
*
|
||||
* The #EekKeyIface interface represents a key, which is parented to
|
||||
* #EekSectionIface.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-key.h"
|
||||
#include "eek-keysym.h"
|
||||
|
||||
static void
|
||||
eek_key_base_init (gpointer g_iface)
|
||||
{
|
||||
static gboolean is_initialized = FALSE;
|
||||
|
||||
if (!is_initialized) {
|
||||
GParamSpec *pspec;
|
||||
|
||||
/**
|
||||
* EekKey:name:
|
||||
*
|
||||
* The name of #EekKey.
|
||||
*/
|
||||
pspec = g_param_spec_string ("name",
|
||||
"Name",
|
||||
"Name",
|
||||
NULL,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:keysyms:
|
||||
*
|
||||
* The symbol matrix of #EekKey.
|
||||
*/
|
||||
pspec = g_param_spec_boxed ("keysyms",
|
||||
"Keysyms",
|
||||
"Symbol matrix of the key",
|
||||
EEK_TYPE_KEYSYM_MATRIX,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:column:
|
||||
*
|
||||
* The column index of #EekKey in the parent #EekSection.
|
||||
*/
|
||||
pspec = g_param_spec_int ("column",
|
||||
"Column",
|
||||
"Column index of the key in section",
|
||||
-1, G_MAXINT, -1,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:row:
|
||||
*
|
||||
* The row index of #EekKey in the parent #EekSection.
|
||||
*/
|
||||
pspec = g_param_spec_int ("row",
|
||||
"Row",
|
||||
"Row index of the key in section",
|
||||
-1, G_MAXINT, -1,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:outline:
|
||||
*
|
||||
* The pointer to the outline shape of #EekKey.
|
||||
*/
|
||||
/* Use pointer instead of boxed to avoid copy, since we can
|
||||
assume that only a few outline shapes are used in a whole
|
||||
keyboard (unlike labels and bounds). */
|
||||
pspec = g_param_spec_pointer ("outline",
|
||||
"Outline",
|
||||
"Pointer to outline shape of the key",
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:bounds:
|
||||
*
|
||||
* The bounding box of #EekKey.
|
||||
*/
|
||||
pspec = g_param_spec_boxed ("bounds",
|
||||
"Bounds",
|
||||
"Bounding box of the key",
|
||||
EEK_TYPE_BOUNDS,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:group:
|
||||
*
|
||||
* The column index of #EekKey in the label matrix #EekKey:labels.
|
||||
*/
|
||||
pspec = g_param_spec_int ("group",
|
||||
"Group",
|
||||
"Current group of the key",
|
||||
0, 64, 0,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekKey:level:
|
||||
*
|
||||
* The row index of #EekKey in the label matrix #EekKey:labels.
|
||||
*/
|
||||
pspec = g_param_spec_int ("level",
|
||||
"Level",
|
||||
"Current level of the key",
|
||||
0, 3, 0,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
is_initialized = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
GType
|
||||
eek_key_get_type (void)
|
||||
{
|
||||
static GType iface_type = 0;
|
||||
|
||||
if (iface_type == 0) {
|
||||
static const GTypeInfo info = {
|
||||
sizeof (EekKeyIface),
|
||||
eek_key_base_init, /* iface_base_init */
|
||||
NULL /* iface_base_finalize */
|
||||
};
|
||||
|
||||
iface_type = g_type_register_static (G_TYPE_INTERFACE,
|
||||
"EekKey",
|
||||
&info,
|
||||
0);
|
||||
}
|
||||
return iface_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_set_keysyms:
|
||||
* @key: an #EekKey
|
||||
* @keysyms: symbol matrix of @key
|
||||
* @num_groups: the number of groups (rows) of @keysyms
|
||||
* @num_levels: the number of levels (columns) of @keysyms
|
||||
*
|
||||
* Set the symbol matrix of @key to @keysyms. @keysyms is an array of
|
||||
* symbols (unsigned int) and the length must match with @num_groups *
|
||||
* @num_levels.
|
||||
*/
|
||||
void
|
||||
eek_key_set_keysyms (EekKey *key,
|
||||
guint *keysyms,
|
||||
gint num_groups,
|
||||
gint num_levels)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->set_keysyms);
|
||||
(*iface->set_keysyms) (key, keysyms, num_groups, num_levels);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_groups:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* Get the number of groups (rows) of the symbol matrix of @key.
|
||||
*/
|
||||
gint
|
||||
eek_key_get_groups (EekKey *key)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_val_if_fail (iface, -1);
|
||||
g_return_val_if_fail (iface->get_groups, -1);
|
||||
return (*iface->get_groups) (key);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_keysym:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* Get the current symbol of @key. It is depend on the current group,
|
||||
* level, and the symbol matrix of @key. They are set with
|
||||
* eek_key_set_group(), eek_key_set_level(), and eek_key_set_labels(),
|
||||
* respectively.
|
||||
*/
|
||||
guint
|
||||
eek_key_get_keysym (EekKey *key)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_val_if_fail (iface, EEK_INVALID_KEYSYM);
|
||||
g_return_val_if_fail (iface->get_keysym, EEK_INVALID_KEYSYM);
|
||||
return (*iface->get_keysym) (key);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_set_index:
|
||||
* @key: an #EekKey
|
||||
* @column: column index in the section
|
||||
* @row: row index in the section
|
||||
*
|
||||
* Set column and row index of @key in the parent section.
|
||||
*/
|
||||
void
|
||||
eek_key_set_index (EekKey *key,
|
||||
gint column,
|
||||
gint row)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->set_index);
|
||||
(*iface->set_index) (key, column, row);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_index:
|
||||
* @key: an #EekKey
|
||||
* @column: a pointer to where column index in the section is stored
|
||||
* @row: a pointer to where row index in the section is stored
|
||||
*
|
||||
* Get column and row index of @key in the parent section.
|
||||
*/
|
||||
void
|
||||
eek_key_get_index (EekKey *key,
|
||||
gint *column,
|
||||
gint *row)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->get_index);
|
||||
return (*iface->get_index) (key, column, row);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_set_outline:
|
||||
* @key: an #EekKey
|
||||
* @outline: a pointer to the outline shape of @key
|
||||
*
|
||||
* Set outline shape of @key.
|
||||
*/
|
||||
void
|
||||
eek_key_set_outline (EekKey *key,
|
||||
EekOutline *outline)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->set_outline);
|
||||
(*iface->set_outline) (key, outline);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_outline:
|
||||
* @key: an #EekKey
|
||||
*
|
||||
* Get outline shape of @key as a pointer.
|
||||
*/
|
||||
EekOutline *
|
||||
eek_key_get_outline (EekKey *key)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_val_if_fail (iface, NULL);
|
||||
g_return_val_if_fail (iface->get_outline, NULL);
|
||||
return (*iface->get_outline) (key);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_set_bounds:
|
||||
* @key: a #EekKey
|
||||
* @bounds: bounding box of @key
|
||||
*
|
||||
* Set the bounding box of @key to @bounds.
|
||||
*/
|
||||
void
|
||||
eek_key_set_bounds (EekKey *key,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->set_bounds);
|
||||
(*iface->set_bounds) (key, bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_bounds:
|
||||
* @key: a #EekKey
|
||||
* @bounds: the bounding box of @key
|
||||
*
|
||||
* Get the bounding box of @key.
|
||||
*/
|
||||
void
|
||||
eek_key_get_bounds (EekKey *key,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->get_bounds);
|
||||
return (*iface->get_bounds) (key, bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_set_keysym_index:
|
||||
* @key: a #EekKey
|
||||
* @group: row index of the symbol matrix #EekKey:keysyms
|
||||
* @level: column index of the symbol matrix #EekKey:keysyms
|
||||
*
|
||||
* Select a cell of the symbol matrix of @key.
|
||||
*/
|
||||
void
|
||||
eek_key_set_keysym_index (EekKey *key,
|
||||
gint group,
|
||||
gint level)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->set_keysym_index);
|
||||
(*iface->set_keysym_index) (key, group, level);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_key_get_keysym_index:
|
||||
* @key: a #EekKey
|
||||
* @group: a pointer to row index of the symbol matrix #EekKey:keysyms
|
||||
* to be stored
|
||||
* @level: a pointer to column index of the symbol matrix
|
||||
* #EekKey:keysyms to be stored
|
||||
*
|
||||
* Get the current cell position of the symbol matrix of @key.
|
||||
*/
|
||||
void
|
||||
eek_key_get_keysym_index (EekKey *key, gint *column, gint *row)
|
||||
{
|
||||
EekKeyIface *iface = EEK_KEY_GET_IFACE(key);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->get_keysym_index);
|
||||
return (*iface->get_keysym_index) (key, column, row);
|
||||
}
|
||||
103
eek/eek-key.h
Normal file
103
eek/eek-key.h
Normal file
@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_KEY_H
|
||||
#define EEK_KEY_H 1
|
||||
|
||||
#include <glib-object.h>
|
||||
#include "eek-types.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define EEK_TYPE_KEY (eek_key_get_type())
|
||||
#define EEK_KEY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_KEY, EekKey))
|
||||
#define EEK_IS_KEY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_KEY))
|
||||
#define EEK_KEY_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), EEK_TYPE_KEY, EekKeyIface))
|
||||
|
||||
typedef struct _EekKeyIface EekKeyIface;
|
||||
|
||||
struct _EekKeyIface
|
||||
{
|
||||
/*< private >*/
|
||||
GTypeInterface g_iface;
|
||||
|
||||
/*< public >*/
|
||||
void (* set_keysyms) (EekKey *self,
|
||||
guint *keysyms,
|
||||
gint groups,
|
||||
gint levels);
|
||||
gint (* get_groups) (EekKey *self);
|
||||
guint (* get_keysym) (EekKey *self);
|
||||
|
||||
void (* set_index) (EekKey *self,
|
||||
gint column,
|
||||
gint row);
|
||||
void (* get_index) (EekKey *self,
|
||||
gint *column,
|
||||
gint *row);
|
||||
|
||||
void (* set_outline) (EekKey *self,
|
||||
EekOutline *outline);
|
||||
EekOutline *(* get_outline) (EekKey *self);
|
||||
void (* set_bounds) (EekKey *self,
|
||||
EekBounds *bounds);
|
||||
void (* get_bounds) (EekKey *self,
|
||||
EekBounds *bounds);
|
||||
|
||||
void (* set_keysym_index) (EekKey *self,
|
||||
gint group,
|
||||
gint level);
|
||||
void (* get_keysym_index) (EekKey *self,
|
||||
gint *group,
|
||||
gint *level);
|
||||
};
|
||||
|
||||
GType eek_key_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void eek_key_set_keysyms (EekKey *key,
|
||||
guint *keysyms,
|
||||
gint groups,
|
||||
gint levels);
|
||||
gint eek_key_get_groups (EekKey *key);
|
||||
guint eek_key_get_keysym (EekKey *key);
|
||||
|
||||
void eek_key_set_index (EekKey *key,
|
||||
gint column,
|
||||
gint row);
|
||||
void eek_key_get_index (EekKey *key,
|
||||
gint *column,
|
||||
gint *row);
|
||||
|
||||
void eek_key_set_outline (EekKey *key,
|
||||
EekOutline *outline);
|
||||
EekOutline *eek_key_get_outline (EekKey *key);
|
||||
void eek_key_set_bounds (EekKey *key,
|
||||
EekBounds *bounds);
|
||||
void eek_key_get_bounds (EekKey *key,
|
||||
EekBounds *bounds);
|
||||
|
||||
void eek_key_set_keysym_index (EekKey *key,
|
||||
gint group,
|
||||
gint level);
|
||||
void eek_key_get_keysym_index (EekKey *key,
|
||||
gint *group,
|
||||
gint *level);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_KEY_H */
|
||||
181
eek/eek-keyboard.c
Normal file
181
eek/eek-keyboard.c
Normal file
@ -0,0 +1,181 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-keyboard
|
||||
* @short_description: Base interface of a keyboard
|
||||
* @see_also: #EekSection
|
||||
*
|
||||
* The #EekKeyboardIface interface represents a keyboard, which
|
||||
* consists of one or more sections of the #EekSectionIface interface.
|
||||
*
|
||||
* #EekKeyboardIface follows the Builder pattern and is responsible
|
||||
* for creation of sections.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-keyboard.h"
|
||||
|
||||
static void
|
||||
eek_keyboard_base_init (gpointer g_iface)
|
||||
{
|
||||
static gboolean is_initialized = FALSE;
|
||||
|
||||
if (!is_initialized) {
|
||||
GParamSpec *pspec;
|
||||
|
||||
/**
|
||||
* EekKeyboard:bounds:
|
||||
*
|
||||
* The bounding box of #EekKeyboard.
|
||||
*/
|
||||
pspec = g_param_spec_boxed ("bounds",
|
||||
"Bounds",
|
||||
"Bounding box of the keyboard",
|
||||
EEK_TYPE_BOUNDS,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
is_initialized = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
GType
|
||||
eek_keyboard_get_type (void)
|
||||
{
|
||||
static GType iface_type = 0;
|
||||
|
||||
if (iface_type == 0) {
|
||||
static const GTypeInfo info = {
|
||||
sizeof (EekKeyboardIface),
|
||||
eek_keyboard_base_init,
|
||||
NULL
|
||||
};
|
||||
|
||||
iface_type = g_type_register_static (G_TYPE_INTERFACE,
|
||||
"EekKeyboard",
|
||||
&info,
|
||||
0);
|
||||
}
|
||||
return iface_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_set_bounds:
|
||||
* @keyboard: a #EekKeyboard
|
||||
* @bounds: bounding box of the keyboard
|
||||
*
|
||||
* Set the bounding box of @keyboard to @bounds.
|
||||
*/
|
||||
void
|
||||
eek_keyboard_set_bounds (EekKeyboard *keyboard,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekKeyboardIface *iface = EEK_KEYBOARD_GET_IFACE(keyboard);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->set_bounds);
|
||||
(*iface->set_bounds) (keyboard, bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_get_bounds:
|
||||
* @keyboard: a #EekKeyboard
|
||||
* @bounds: the bounding box of @keyboard
|
||||
*
|
||||
* Get the bounding box of @keyboard.
|
||||
*/
|
||||
void
|
||||
eek_keyboard_get_bounds (EekKeyboard *keyboard,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekKeyboardIface *iface = EEK_KEYBOARD_GET_IFACE(keyboard);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->get_bounds);
|
||||
return (*iface->get_bounds) (keyboard, bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_create_section:
|
||||
* @keyboard: a #EekKeyboard
|
||||
* @name: name of the section
|
||||
* @angle: rotation angle of the section
|
||||
* @bounds: bounding box of the section
|
||||
*
|
||||
* Create an #EekSection instance and attach it to @keyboard.
|
||||
*/
|
||||
EekSection *
|
||||
eek_keyboard_create_section (EekKeyboard *keyboard,
|
||||
const gchar *name,
|
||||
gint angle,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekKeyboardIface *iface = EEK_KEYBOARD_GET_IFACE(keyboard);
|
||||
|
||||
g_return_val_if_fail (iface, NULL);
|
||||
g_return_val_if_fail (iface->create_section, NULL);
|
||||
return (*iface->create_section) (keyboard, name, angle, bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_foreach_section:
|
||||
* @keyboard: a #EekKeyboard
|
||||
* @func: a callback of #GFunc
|
||||
* @user_data: a pointer to an object passed to @func
|
||||
*
|
||||
* Iterate over @keyboard's children list.
|
||||
*/
|
||||
void
|
||||
eek_keyboard_foreach_section (EekKeyboard *keyboard,
|
||||
GFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekKeyboardIface *iface = EEK_KEYBOARD_GET_IFACE(keyboard);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->foreach_section);
|
||||
(*iface->foreach_section) (keyboard, func, user_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_keyboard_set_layout:
|
||||
* @keyboard: a #EekKeyboard
|
||||
* @layout: a #EekLayout
|
||||
*
|
||||
* Set the layout of @keyboard to @layout. For the user of EEK, it is
|
||||
* preferable to call this function rather than
|
||||
* eek_layout_apply_to_keyboard(), while the implementation calls it
|
||||
* internally.
|
||||
*/
|
||||
void
|
||||
eek_keyboard_set_layout (EekKeyboard *keyboard,
|
||||
EekLayout *layout)
|
||||
{
|
||||
EekKeyboardIface *iface = EEK_KEYBOARD_GET_IFACE(keyboard);
|
||||
|
||||
g_return_if_fail (iface);
|
||||
g_return_if_fail (iface->set_layout);
|
||||
g_return_if_fail (EEK_IS_LAYOUT(layout));
|
||||
(*iface->set_layout) (keyboard, layout);
|
||||
}
|
||||
78
eek/eek-keyboard.h
Normal file
78
eek/eek-keyboard.h
Normal file
@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_KEYBOARD_H
|
||||
#define EEK_KEYBOARD_H 1
|
||||
|
||||
#include "eek-section.h"
|
||||
#include "eek-layout.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define EEK_TYPE_KEYBOARD (eek_keyboard_get_type())
|
||||
#define EEK_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_KEYBOARD, EekKeyboard))
|
||||
#define EEK_IS_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_KEYBOARD))
|
||||
#define EEK_KEYBOARD_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), EEK_TYPE_KEYBOARD, EekKeyboardIface))
|
||||
|
||||
typedef struct _EekKeyboardIface EekKeyboardIface;
|
||||
|
||||
struct _EekKeyboardIface
|
||||
{
|
||||
/*< private >*/
|
||||
GTypeInterface g_iface;
|
||||
|
||||
/*< public >*/
|
||||
void (* set_bounds) (EekKeyboard *self,
|
||||
EekBounds *bounds);
|
||||
void (* get_bounds) (EekKeyboard *self,
|
||||
EekBounds *bounds);
|
||||
EekSection *(* create_section) (EekKeyboard *self,
|
||||
const gchar *name,
|
||||
gint angle,
|
||||
EekBounds *bounds);
|
||||
|
||||
void (* foreach_section) (EekKeyboard *self,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
|
||||
void (* set_layout) (EekKeyboard *self,
|
||||
EekLayout *layout);
|
||||
};
|
||||
|
||||
GType eek_keyboard_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void eek_keyboard_set_bounds (EekKeyboard *keyboard,
|
||||
EekBounds *bounds);
|
||||
void eek_keyboard_get_bounds (EekKeyboard *keyboard,
|
||||
EekBounds *bounds);
|
||||
|
||||
EekSection *eek_keyboard_create_section (EekKeyboard *keyboard,
|
||||
const gchar *name,
|
||||
gint angle,
|
||||
EekBounds *bounds);
|
||||
|
||||
void eek_keyboard_foreach_section (EekKeyboard *keyboard,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
|
||||
void eek_keyboard_set_layout (EekKeyboard *keyboard,
|
||||
EekLayout *layout);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_KEYBOARD_H */
|
||||
102
eek/eek-keysym.c
Normal file
102
eek/eek-keysym.c
Normal file
@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#include <glib.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "eek-keysym.h"
|
||||
|
||||
struct eek_keysym_label {
|
||||
guint keysym;
|
||||
const gchar *label;
|
||||
};
|
||||
|
||||
#include "eek-special-keysym-labels.h"
|
||||
#include "eek-unicode-keysym-labels.h"
|
||||
#include "eek-keyname-keysym-labels.h"
|
||||
|
||||
static G_CONST_RETURN gchar *
|
||||
unichar_to_utf8 (gunichar uc)
|
||||
{
|
||||
if (g_unichar_isgraph (uc)) {
|
||||
gchar *buf;
|
||||
gint len;
|
||||
|
||||
len = g_unichar_to_utf8 (uc, NULL);
|
||||
buf = g_malloc0 (len + 1);
|
||||
g_unichar_to_utf8 (uc, buf);
|
||||
return buf;
|
||||
}
|
||||
return g_strdup ("");
|
||||
}
|
||||
|
||||
static int
|
||||
keysym_label_compare (const void *key0, const void *key1)
|
||||
{
|
||||
const struct eek_keysym_label *entry0 = key0, *entry1 = key1;
|
||||
return (gint)entry0->keysym - (gint)entry1->keysym;
|
||||
}
|
||||
|
||||
G_CONST_RETURN gchar *
|
||||
eek_keysym_to_string (guint keysym)
|
||||
{
|
||||
struct eek_keysym_label bsearch_key, *bsearch_val;
|
||||
|
||||
/* First, search special keysyms. */
|
||||
bsearch_key.keysym = keysym;
|
||||
bsearch_val = bsearch (&bsearch_key,
|
||||
special_keysym_labels,
|
||||
G_N_ELEMENTS(special_keysym_labels),
|
||||
sizeof (struct eek_keysym_label),
|
||||
keysym_label_compare);
|
||||
if (bsearch_val)
|
||||
return g_strdup (bsearch_val->label);
|
||||
|
||||
/* Check for Latin-1 characters (1:1 mapping) */
|
||||
if ((keysym >= 0x0020 && keysym <= 0x007e) ||
|
||||
(keysym >= 0x00a0 && keysym <= 0x00ff))
|
||||
return unichar_to_utf8 (keysym);
|
||||
|
||||
/* Also check for directly encoded 24-bit UCS characters:
|
||||
*/
|
||||
if ((keysym & 0xff000000) == 0x01000000)
|
||||
return unichar_to_utf8 (keysym & 0x00ffffff);
|
||||
|
||||
/* Search known unicode keysyms. */
|
||||
bsearch_key.keysym = keysym;
|
||||
bsearch_val = bsearch (&bsearch_key,
|
||||
unicode_keysym_labels,
|
||||
G_N_ELEMENTS(unicode_keysym_labels),
|
||||
sizeof (struct eek_keysym_label),
|
||||
keysym_label_compare);
|
||||
if (bsearch_val)
|
||||
return g_strdup (bsearch_val->label);
|
||||
|
||||
/* Finally, search keynames. */
|
||||
bsearch_key.keysym = keysym;
|
||||
bsearch_val = bsearch (&bsearch_key,
|
||||
keyname_keysym_labels,
|
||||
G_N_ELEMENTS(keyname_keysym_labels),
|
||||
sizeof (struct eek_keysym_label),
|
||||
keysym_label_compare);
|
||||
if (bsearch_val)
|
||||
return g_strdup (bsearch_val->label);
|
||||
|
||||
return g_strdup ("");
|
||||
}
|
||||
26
eek/eek-keysym.h
Normal file
26
eek/eek-keysym.h
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_KEYSYMS_H
|
||||
#define EEK_KEYSYMS_H 1
|
||||
|
||||
#define EEK_INVALID_KEYSYM ((guint)(-1))
|
||||
G_CONST_RETURN gchar *eek_keysym_to_string (guint keysym);
|
||||
|
||||
#endif /* EEK_KEYSYMS_H */
|
||||
63
eek/eek-layout.c
Normal file
63
eek/eek-layout.c
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-layout
|
||||
* @short_description: Base class of a layout engine
|
||||
*
|
||||
* The #EekLayout class is a base abstract class of layout engine
|
||||
* which arranges keyboard elements.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-layout.h"
|
||||
#include "eek-keyboard.h"
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (EekLayout, eek_layout, G_TYPE_INITIALLY_UNOWNED);
|
||||
|
||||
static void
|
||||
eek_layout_finalize (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (eek_layout_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_layout_dispose (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (eek_layout_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_layout_class_init (EekLayoutClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
gobject_class->finalize = eek_layout_finalize;
|
||||
gobject_class->dispose = eek_layout_dispose;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_layout_init (EekLayout *self)
|
||||
{
|
||||
}
|
||||
58
eek/eek-layout.h
Normal file
58
eek/eek-layout.h
Normal file
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef EEK_LAYOUT_H
|
||||
#define EEK_LAYOUT_H 1
|
||||
|
||||
#include <glib-object.h>
|
||||
#include "eek-types.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define EEK_TYPE_LAYOUT (eek_layout_get_type())
|
||||
#define EEK_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_LAYOUT, EekLayout))
|
||||
#define EEK_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_LAYOUT, EekLayoutClass))
|
||||
#define EEK_IS_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_LAYOUT))
|
||||
#define EEK_IS_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_LAYOUT))
|
||||
#define EEK_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_LAYOUT, EekLayoutClass))
|
||||
|
||||
typedef struct _EekLayoutClass EekLayoutClass;
|
||||
typedef struct _EekLayout EekLayout;
|
||||
|
||||
struct _EekLayout
|
||||
{
|
||||
/*< private >*/
|
||||
GInitiallyUnowned parent;
|
||||
};
|
||||
|
||||
struct _EekLayoutClass
|
||||
{
|
||||
/*< private >*/
|
||||
GInitiallyUnownedClass parent_class;
|
||||
|
||||
/*< public >*/
|
||||
void (*apply_to_keyboard) (EekLayout *self,
|
||||
EekKeyboard *keyboard);
|
||||
};
|
||||
|
||||
GType eek_layout_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_LAYOUT_H */
|
||||
234
eek/eek-private.c
Normal file
234
eek/eek-private.c
Normal file
@ -0,0 +1,234 @@
|
||||
/*
|
||||
* Copyright (C) 2006 Sergey V. Udaltsov <svu@gnome.org>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-private.h"
|
||||
#include <math.h>
|
||||
|
||||
#define noKBDRAW_DEBUG
|
||||
|
||||
static gdouble
|
||||
length (gdouble x, gdouble y)
|
||||
{
|
||||
return sqrt (x * x + y * y);
|
||||
}
|
||||
|
||||
static gdouble
|
||||
point_line_distance (gdouble ax, gdouble ay, gdouble nx, gdouble ny)
|
||||
{
|
||||
return ax * nx + ay * ny;
|
||||
}
|
||||
|
||||
static void
|
||||
normal_form (gdouble ax, gdouble ay,
|
||||
gdouble bx, gdouble by,
|
||||
gdouble * nx, gdouble * ny, gdouble * d)
|
||||
{
|
||||
gdouble l;
|
||||
|
||||
*nx = by - ay;
|
||||
*ny = ax - bx;
|
||||
|
||||
l = length (*nx, *ny);
|
||||
|
||||
*nx /= l;
|
||||
*ny /= l;
|
||||
|
||||
*d = point_line_distance (ax, ay, *nx, *ny);
|
||||
}
|
||||
|
||||
static void
|
||||
inverse (gdouble a, gdouble b, gdouble c, gdouble d,
|
||||
gdouble * e, gdouble * f, gdouble * g, gdouble * h)
|
||||
{
|
||||
gdouble det;
|
||||
|
||||
det = a * d - b * c;
|
||||
|
||||
*e = d / det;
|
||||
*f = -b / det;
|
||||
*g = -c / det;
|
||||
*h = a / det;
|
||||
}
|
||||
|
||||
static void
|
||||
multiply (gdouble a, gdouble b, gdouble c, gdouble d,
|
||||
gdouble e, gdouble f, gdouble * x, gdouble * y)
|
||||
{
|
||||
*x = a * e + b * f;
|
||||
*y = c * e + d * f;
|
||||
}
|
||||
|
||||
static void
|
||||
intersect (gdouble n1x, gdouble n1y, gdouble d1,
|
||||
gdouble n2x, gdouble n2y, gdouble d2, gdouble * x, gdouble * y)
|
||||
{
|
||||
gdouble e, f, g, h;
|
||||
|
||||
inverse (n1x, n1y, n2x, n2y, &e, &f, &g, &h);
|
||||
multiply (e, f, g, h, d1, d2, x, y);
|
||||
}
|
||||
|
||||
|
||||
/* draw an angle from the current point to b and then to c,
|
||||
* with a rounded corner of the given radius.
|
||||
*/
|
||||
static void
|
||||
rounded_corner (cairo_t * cr,
|
||||
gdouble bx, gdouble by,
|
||||
gdouble cx, gdouble cy, gdouble radius)
|
||||
{
|
||||
gdouble ax, ay;
|
||||
gdouble n1x, n1y, d1;
|
||||
gdouble n2x, n2y, d2;
|
||||
gdouble pd1, pd2;
|
||||
gdouble ix, iy;
|
||||
gdouble dist1, dist2;
|
||||
gdouble nx, ny, d;
|
||||
gdouble a1x, a1y, c1x, c1y;
|
||||
gdouble phi1, phi2;
|
||||
|
||||
cairo_get_current_point (cr, &ax, &ay);
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" current point: (%f, %f), radius %f:\n", ax, ay,
|
||||
radius);
|
||||
#endif
|
||||
|
||||
/* make sure radius is not too large */
|
||||
dist1 = length (bx - ax, by - ay);
|
||||
dist2 = length (cx - bx, cy - by);
|
||||
|
||||
radius = MIN (radius, MIN (dist1, dist2));
|
||||
|
||||
/* construct normal forms of the lines */
|
||||
normal_form (ax, ay, bx, by, &n1x, &n1y, &d1);
|
||||
normal_form (bx, by, cx, cy, &n2x, &n2y, &d2);
|
||||
|
||||
/* find which side of the line a,b the point c is on */
|
||||
if (point_line_distance (cx, cy, n1x, n1y) < d1)
|
||||
pd1 = d1 - radius;
|
||||
else
|
||||
pd1 = d1 + radius;
|
||||
|
||||
/* find which side of the line b,c the point a is on */
|
||||
if (point_line_distance (ax, ay, n2x, n2y) < d2)
|
||||
pd2 = d2 - radius;
|
||||
else
|
||||
pd2 = d2 + radius;
|
||||
|
||||
/* intersect the parallels to find the center of the arc */
|
||||
intersect (n1x, n1y, pd1, n2x, n2y, pd2, &ix, &iy);
|
||||
|
||||
nx = (bx - ax) / dist1;
|
||||
ny = (by - ay) / dist1;
|
||||
d = point_line_distance (ix, iy, nx, ny);
|
||||
|
||||
/* a1 is the point on the line a-b where the arc starts */
|
||||
intersect (n1x, n1y, d1, nx, ny, d, &a1x, &a1y);
|
||||
|
||||
nx = (cx - bx) / dist2;
|
||||
ny = (cy - by) / dist2;
|
||||
d = point_line_distance (ix, iy, nx, ny);
|
||||
|
||||
/* c1 is the point on the line b-c where the arc ends */
|
||||
intersect (n2x, n2y, d2, nx, ny, d, &c1x, &c1y);
|
||||
|
||||
/* determine the first angle */
|
||||
if (a1x - ix == 0)
|
||||
phi1 = (a1y - iy > 0) ? M_PI_2 : 3 * M_PI_2;
|
||||
else if (a1x - ix > 0)
|
||||
phi1 = atan ((a1y - iy) / (a1x - ix));
|
||||
else
|
||||
phi1 = M_PI + atan ((a1y - iy) / (a1x - ix));
|
||||
|
||||
/* determine the second angle */
|
||||
if (c1x - ix == 0)
|
||||
phi2 = (c1y - iy > 0) ? M_PI_2 : 3 * M_PI_2;
|
||||
else if (c1x - ix > 0)
|
||||
phi2 = atan ((c1y - iy) / (c1x - ix));
|
||||
else
|
||||
phi2 = M_PI + atan ((c1y - iy) / (c1x - ix));
|
||||
|
||||
/* compute the difference between phi2 and phi1 mod 2pi */
|
||||
d = phi2 - phi1;
|
||||
while (d < 0)
|
||||
d += 2 * M_PI;
|
||||
while (d > 2 * M_PI)
|
||||
d -= 2 * M_PI;
|
||||
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" line 1 to: (%f, %f):\n", a1x, a1y);
|
||||
#endif
|
||||
if (!(isnan (a1x) || isnan (a1y)))
|
||||
cairo_line_to (cr, a1x, a1y);
|
||||
|
||||
/* pick the short arc from phi1 to phi2 */
|
||||
if (d < M_PI)
|
||||
cairo_arc (cr, ix, iy, radius, phi1, phi2);
|
||||
else
|
||||
cairo_arc_negative (cr, ix, iy, radius, phi1, phi2);
|
||||
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" line 2 to: (%f, %f):\n", cx, cy);
|
||||
#endif
|
||||
cairo_line_to (cr, cx, cy);
|
||||
}
|
||||
|
||||
void
|
||||
eek_cairo_draw_rounded_polygon (cairo_t * cr,
|
||||
gboolean filled,
|
||||
gdouble radius,
|
||||
EekPoint * points,
|
||||
gint num_points)
|
||||
{
|
||||
gint i, j;
|
||||
|
||||
cairo_move_to (cr,
|
||||
(gdouble) (points[num_points - 1].x +
|
||||
points[0].x) / 2,
|
||||
(gdouble) (points[num_points - 1].y +
|
||||
points[0].y) / 2);
|
||||
|
||||
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" rounded polygon of radius %f:\n", radius);
|
||||
#endif
|
||||
for (i = 0; i < num_points; i++) {
|
||||
j = (i + 1) % num_points;
|
||||
rounded_corner (cr, (gdouble) points[i].x,
|
||||
(gdouble) points[i].y,
|
||||
(gdouble) (points[i].x + points[j].x) / 2,
|
||||
(gdouble) (points[i].y + points[j].y) / 2,
|
||||
radius);
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" corner (%d, %d) -> (%d, %d):\n",
|
||||
points[i].x, points[i].y, points[j].x,
|
||||
points[j].y);
|
||||
#endif
|
||||
};
|
||||
cairo_close_path (cr);
|
||||
|
||||
if (filled)
|
||||
cairo_fill (cr);
|
||||
else
|
||||
cairo_stroke (cr);
|
||||
}
|
||||
|
||||
36
eek/eek-private.h
Normal file
36
eek/eek-private.h
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_PRIVATE_H
|
||||
#define EEK_PRIVATE_H 1
|
||||
|
||||
#include <glib/gtypes.h>
|
||||
#include <cairo/cairo.h>
|
||||
#include "eek-types.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void eek_cairo_draw_rounded_polygon (cairo_t * cr,
|
||||
gboolean filled,
|
||||
gdouble radius,
|
||||
EekPoint * points,
|
||||
gint num_points);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_PRIVATE_H */
|
||||
300
eek/eek-section.c
Normal file
300
eek/eek-section.c
Normal file
@ -0,0 +1,300 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-section
|
||||
* @short_description: Base interface of a keyboard section
|
||||
* @see_also: #EekKeyboard, #EekKey
|
||||
*
|
||||
* The #EekSectionIface interface represents a keyboard section, which
|
||||
* is parented to #EekKeyboardIface and can have one or more keys of
|
||||
* the #EekKeyIface interface.
|
||||
*
|
||||
* #EekSectionIface follows the Builder pattern and is responsible for
|
||||
* creation of keys.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-section.h"
|
||||
|
||||
static void
|
||||
eek_section_base_init (gpointer g_iface)
|
||||
{
|
||||
static gboolean is_initialized = FALSE;
|
||||
|
||||
if (!is_initialized) {
|
||||
GParamSpec *pspec;
|
||||
|
||||
/**
|
||||
* EekSection:name:
|
||||
*
|
||||
* The name of #EekSection.
|
||||
*/
|
||||
pspec = g_param_spec_string ("name",
|
||||
"Name",
|
||||
"Name",
|
||||
NULL,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekSection:columns:
|
||||
*
|
||||
* The number of columns in #EekSection.
|
||||
*/
|
||||
pspec = g_param_spec_int ("columns",
|
||||
"Columns",
|
||||
"The number of columns in the section",
|
||||
0, G_MAXINT, 0,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekSection:rows:
|
||||
*
|
||||
* The number of rows in #EekSection.
|
||||
*/
|
||||
pspec = g_param_spec_int ("rows",
|
||||
"Rows",
|
||||
"The number of rows of the section",
|
||||
0, G_MAXINT, 0,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekSection:angle:
|
||||
*
|
||||
* The rotation angle of #EekSection.
|
||||
*/
|
||||
pspec = g_param_spec_int ("angle",
|
||||
"Angle",
|
||||
"Rotation angle of the section",
|
||||
-360, 360, 0,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
/**
|
||||
* EekSection:bounds:
|
||||
*
|
||||
* The bounding box of #EekSection.
|
||||
*/
|
||||
pspec = g_param_spec_boxed ("bounds",
|
||||
"Bounds",
|
||||
"Bounding box of the section",
|
||||
EEK_TYPE_BOUNDS,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_interface_install_property (g_iface, pspec);
|
||||
|
||||
is_initialized = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
GType
|
||||
eek_section_get_type (void)
|
||||
{
|
||||
static GType iface_type = 0;
|
||||
|
||||
if (iface_type == 0) {
|
||||
static const GTypeInfo info = {
|
||||
sizeof (EekSectionIface),
|
||||
eek_section_base_init,
|
||||
NULL
|
||||
};
|
||||
|
||||
iface_type = g_type_register_static (G_TYPE_INTERFACE,
|
||||
"EekSection",
|
||||
&info,
|
||||
0);
|
||||
}
|
||||
return iface_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_section_set_dimensions:
|
||||
* @section: a #EekSection
|
||||
* @columns: the number of columns in @section
|
||||
* @rows: the number of rows in @section
|
||||
*
|
||||
* Set dimensions of @section from @columns and @rows.
|
||||
*/
|
||||
void
|
||||
eek_section_set_dimensions (EekSection *section,
|
||||
gint columns,
|
||||
gint rows)
|
||||
{
|
||||
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
|
||||
|
||||
g_return_if_fail (iface->set_dimensions);
|
||||
(*iface->set_dimensions) (section, columns, rows);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_section_get_dimensions:
|
||||
* @section: a #EekSection
|
||||
* @columns: a pointer where the number of columns in @section is stored
|
||||
* @rows: a pointer where the number of rows in @section is stored
|
||||
*
|
||||
* Get the rotation angle of @section.
|
||||
*/
|
||||
void
|
||||
eek_section_get_dimensions (EekSection *section,
|
||||
gint *columns,
|
||||
gint *rows)
|
||||
{
|
||||
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
|
||||
|
||||
g_return_if_fail (iface->get_dimensions);
|
||||
return (*iface->get_dimensions) (section, columns, rows);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_section_set_angle:
|
||||
* @section: a #EekSection
|
||||
* @angle: rotation angle of @section
|
||||
*
|
||||
* Set the rotation angle of @section to @angle.
|
||||
*/
|
||||
void
|
||||
eek_section_set_angle (EekSection *section,
|
||||
gint angle)
|
||||
{
|
||||
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
|
||||
|
||||
g_return_if_fail (iface->set_angle);
|
||||
(*iface->set_angle) (section, angle);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_section_get_angle:
|
||||
* @section: a #EekSection
|
||||
*
|
||||
* Get the rotation angle of @section.
|
||||
*/
|
||||
gint
|
||||
eek_section_get_angle (EekSection *section)
|
||||
{
|
||||
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
|
||||
|
||||
g_return_val_if_fail (iface->get_angle, 0);
|
||||
return (*iface->get_angle) (section);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_section_set_bounds:
|
||||
* @section: a #EekSection
|
||||
* @bounds: bounding box of @section
|
||||
*
|
||||
* Set the bounding box of @section to @bounds.
|
||||
*/
|
||||
void
|
||||
eek_section_set_bounds (EekSection *section,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
|
||||
|
||||
g_return_if_fail (iface->set_bounds);
|
||||
(*iface->set_bounds) (section, bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_section_get_bounds:
|
||||
* @section: a #EekSection
|
||||
* @bounds: the bounding box of @section
|
||||
*
|
||||
* Get the bounding box of @section.
|
||||
*/
|
||||
void
|
||||
eek_section_get_bounds (EekSection *section,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
|
||||
|
||||
g_return_if_fail (iface->get_bounds);
|
||||
return (*iface->get_bounds) (section, bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_section_create_key:
|
||||
* @section: a #EekSection
|
||||
* @name: name of the key
|
||||
* @keysyms: symbol matrix of the key
|
||||
* @num_groups: number of rows in the @keysyms
|
||||
* @num_levels: number of columns in the @keysyms
|
||||
* @column: column index in the @section
|
||||
* @row: row index in the section
|
||||
* @outline: outline shape of the key
|
||||
* @bounds: bounding box of the key
|
||||
*
|
||||
* Create an #EekKey instance and attach it to @section.
|
||||
*/
|
||||
EekKey *
|
||||
eek_section_create_key (EekSection *section,
|
||||
const gchar *name,
|
||||
guint *keysyms,
|
||||
gint num_groups,
|
||||
gint num_levels,
|
||||
gint column,
|
||||
gint row,
|
||||
EekOutline *outline,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSectionIface *iface;
|
||||
|
||||
g_return_if_fail (EEK_IS_SECTION(section));
|
||||
|
||||
iface = EEK_SECTION_GET_IFACE(section);
|
||||
g_return_if_fail (iface->create_key);
|
||||
|
||||
return (*iface->create_key) (section,
|
||||
name,
|
||||
keysyms,
|
||||
num_groups,
|
||||
num_levels,
|
||||
column,
|
||||
row,
|
||||
outline,
|
||||
bounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_section_foreach_key:
|
||||
* @section: a #EekSection
|
||||
* @func: a callback of #GFunc
|
||||
* @user_data: a pointer to an object passed to @func
|
||||
*
|
||||
* Iterate over @section's children list.
|
||||
*/
|
||||
void
|
||||
eek_section_foreach_key (EekSection *section,
|
||||
GFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekSectionIface *iface;
|
||||
|
||||
g_return_if_fail (EEK_IS_SECTION(section));
|
||||
|
||||
iface = EEK_SECTION_GET_IFACE(section);
|
||||
g_return_if_fail (iface->foreach_key);
|
||||
|
||||
return (*iface->foreach_key) (section, func, user_data);
|
||||
}
|
||||
102
eek/eek-section.h
Normal file
102
eek/eek-section.h
Normal file
@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_SECTION_H
|
||||
#define EEK_SECTION_H 1
|
||||
|
||||
#include "eek-key.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define EEK_TYPE_SECTION (eek_section_get_type())
|
||||
#define EEK_SECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_SECTION, EekSection))
|
||||
#define EEK_IS_SECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_SECTION))
|
||||
#define EEK_SECTION_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), EEK_TYPE_SECTION, EekSectionIface))
|
||||
|
||||
typedef struct _EekSectionIface EekSectionIface;
|
||||
|
||||
struct _EekSectionIface
|
||||
{
|
||||
/*< private >*/
|
||||
GTypeInterface g_iface;
|
||||
|
||||
/*< public >*/
|
||||
void (* set_dimensions) (EekSection *self,
|
||||
gint columns,
|
||||
gint rows);
|
||||
void (* get_dimensions) (EekSection *self,
|
||||
gint *columns,
|
||||
gint *rows);
|
||||
void (* set_angle) (EekSection *self,
|
||||
gint angle);
|
||||
gint (* get_angle) (EekSection *self);
|
||||
|
||||
void (* set_bounds) (EekSection *self,
|
||||
EekBounds *bounds);
|
||||
void (* get_bounds) (EekSection *self,
|
||||
EekBounds *bounds);
|
||||
|
||||
EekKey *(* create_key) (EekSection *self,
|
||||
const gchar *name,
|
||||
guint *keysyms,
|
||||
gint num_groups,
|
||||
gint num_levels,
|
||||
gint column,
|
||||
gint row,
|
||||
EekOutline *outline,
|
||||
EekBounds *bounds);
|
||||
|
||||
void (* foreach_key) (EekSection *self,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
};
|
||||
|
||||
GType eek_section_get_type (void) G_GNUC_CONST;
|
||||
|
||||
void eek_section_set_dimensions (EekSection *section,
|
||||
gint columns,
|
||||
gint rows);
|
||||
void eek_section_get_dimensions (EekSection *section,
|
||||
gint *columns,
|
||||
gint *rows);
|
||||
void eek_section_set_angle (EekSection *section,
|
||||
gint angle);
|
||||
gint eek_section_get_angle (EekSection *section);
|
||||
|
||||
void eek_section_set_bounds (EekSection *section,
|
||||
EekBounds *bounds);
|
||||
void eek_section_get_bounds (EekSection *section,
|
||||
EekBounds *bounds);
|
||||
|
||||
EekKey *eek_section_create_key (EekSection *section,
|
||||
const gchar *name,
|
||||
guint *labels,
|
||||
gint num_groups,
|
||||
gint num_levels,
|
||||
gint column,
|
||||
gint row,
|
||||
EekOutline *outline,
|
||||
EekBounds *bounds);
|
||||
|
||||
void eek_section_foreach_key (EekSection *section,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_SECTION_H */
|
||||
377
eek/eek-simple-key.c
Normal file
377
eek/eek-simple-key.c
Normal file
@ -0,0 +1,377 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
#include "eek-simple-key.h"
|
||||
#include "eek-keysym.h"
|
||||
#include <string.h>
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_NAME,
|
||||
PROP_KEYSYMS,
|
||||
PROP_COLUMN,
|
||||
PROP_ROW,
|
||||
PROP_OUTLINE,
|
||||
PROP_BOUNDS,
|
||||
PROP_GROUP,
|
||||
PROP_LEVEL,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static void eek_key_iface_init (EekKeyIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (EekSimpleKey, eek_simple_key,
|
||||
G_TYPE_INITIALLY_UNOWNED,
|
||||
G_IMPLEMENT_INTERFACE (EEK_TYPE_KEY,
|
||||
eek_key_iface_init));
|
||||
|
||||
#define EEK_SIMPLE_KEY_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_SIMPLE_KEY, EekSimpleKeyPrivate))
|
||||
|
||||
struct _EekSimpleKeyPrivate
|
||||
{
|
||||
gchar *name;
|
||||
guint *keysyms;
|
||||
gint num_levels;
|
||||
gint num_groups;
|
||||
gint column;
|
||||
gint row;
|
||||
EekOutline *outline;
|
||||
EekBounds bounds;
|
||||
gint group;
|
||||
gint level;
|
||||
};
|
||||
|
||||
static void
|
||||
eek_simple_key_real_set_keysyms (EekKey *self,
|
||||
guint *keysyms,
|
||||
gint groups,
|
||||
gint levels)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
if (priv->keysyms)
|
||||
g_slice_free (guint, priv->keysyms);
|
||||
priv->keysyms = g_slice_alloc (groups * levels * sizeof(guint));
|
||||
memcpy (priv->keysyms, keysyms, groups * levels * sizeof(guint));
|
||||
priv->num_groups = groups;
|
||||
priv->num_levels = levels;
|
||||
}
|
||||
|
||||
static gint
|
||||
eek_simple_key_real_get_groups (EekKey *self)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_val_if_fail (priv, -1);
|
||||
return priv->num_groups;
|
||||
}
|
||||
|
||||
static guint
|
||||
eek_simple_key_real_get_keysym (EekKey *self)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_val_if_fail (priv, EEK_INVALID_KEYSYM);
|
||||
if (priv->num_groups * priv->num_levels == 0)
|
||||
return EEK_INVALID_KEYSYM;
|
||||
return priv->keysyms[priv->group * priv->num_levels + priv->level];
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_real_set_index (EekKey *self,
|
||||
gint column,
|
||||
gint row)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
g_return_if_fail (column < 0);
|
||||
g_return_if_fail (row < 0);
|
||||
priv->column = column;
|
||||
priv->row = row;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_real_get_index (EekKey *self,
|
||||
gint *column,
|
||||
gint *row)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
g_return_if_fail (column);
|
||||
g_return_if_fail (row);
|
||||
*column = priv->column;
|
||||
*row = priv->row;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_real_set_outline (EekKey *self, EekOutline *outline)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
priv->outline = outline;
|
||||
}
|
||||
|
||||
static EekOutline *
|
||||
eek_simple_key_real_get_outline (EekKey *self)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_val_if_fail (priv, NULL);
|
||||
return priv->outline;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_real_set_bounds (EekKey *self,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
priv->bounds = *bounds;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_real_get_bounds (EekKey *self,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
g_return_if_fail (bounds);
|
||||
*bounds = priv->bounds;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_real_set_keysym_index (EekKey *self,
|
||||
gint group,
|
||||
gint level)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
g_return_if_fail (group < priv->num_groups);
|
||||
g_return_if_fail (level < priv->num_levels);
|
||||
priv->group = group;
|
||||
priv->level = level;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_real_get_keysym_index (EekKey *self,
|
||||
gint *group,
|
||||
gint *level)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
g_return_if_fail (group);
|
||||
g_return_if_fail (level);
|
||||
*group = priv->group;
|
||||
*level = priv->level;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_key_iface_init (EekKeyIface *iface)
|
||||
{
|
||||
iface->set_keysyms = eek_simple_key_real_set_keysyms;
|
||||
iface->get_groups = eek_simple_key_real_get_groups;
|
||||
iface->get_keysym = eek_simple_key_real_get_keysym;
|
||||
iface->set_index = eek_simple_key_real_set_index;
|
||||
iface->get_index = eek_simple_key_real_get_index;
|
||||
iface->set_outline = eek_simple_key_real_set_outline;
|
||||
iface->get_outline = eek_simple_key_real_get_outline;
|
||||
iface->set_bounds = eek_simple_key_real_set_bounds;
|
||||
iface->get_bounds = eek_simple_key_real_get_bounds;
|
||||
iface->set_keysym_index = eek_simple_key_real_set_keysym_index;
|
||||
iface->get_keysym_index = eek_simple_key_real_get_keysym_index;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_dispose (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (eek_simple_key_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_finalize (GObject *object)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(object);
|
||||
|
||||
g_free (priv->name);
|
||||
g_slice_free (guint, priv->keysyms);
|
||||
G_OBJECT_CLASS (eek_simple_key_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(object);
|
||||
EekKeysymMatrix *matrix;
|
||||
|
||||
g_return_if_fail (priv);
|
||||
switch (prop_id) {
|
||||
case PROP_NAME:
|
||||
g_free (priv->name);
|
||||
priv->name = g_strdup (g_value_get_string (value));
|
||||
break;
|
||||
case PROP_KEYSYMS:
|
||||
matrix = g_value_get_boxed (value);
|
||||
eek_key_set_keysyms (EEK_KEY(object),
|
||||
matrix->data,
|
||||
matrix->num_groups,
|
||||
matrix->num_levels);
|
||||
break;
|
||||
case PROP_COLUMN:
|
||||
priv->column = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_ROW:
|
||||
priv->row = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_OUTLINE:
|
||||
priv->outline = g_value_get_pointer (value);
|
||||
break;
|
||||
case PROP_BOUNDS:
|
||||
priv->bounds = *(EekBounds *)g_value_get_boxed (value);
|
||||
break;
|
||||
case PROP_GROUP:
|
||||
priv->group = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_LEVEL:
|
||||
priv->level = g_value_get_int (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
g_object_set_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv = EEK_SIMPLE_KEY_GET_PRIVATE(object);
|
||||
EekKeysymMatrix matrix;
|
||||
|
||||
g_return_if_fail (priv);
|
||||
switch (prop_id) {
|
||||
case PROP_NAME:
|
||||
g_value_set_string (value, priv->name);
|
||||
break;
|
||||
case PROP_KEYSYMS:
|
||||
matrix.data = priv->keysyms;
|
||||
matrix.num_groups = priv->num_groups;
|
||||
matrix.num_levels = priv->num_levels;
|
||||
g_value_set_boxed (value, &matrix);
|
||||
break;
|
||||
case PROP_COLUMN:
|
||||
g_value_set_int (value, priv->column);
|
||||
break;
|
||||
case PROP_ROW:
|
||||
g_value_set_int (value, priv->row);
|
||||
break;
|
||||
case PROP_OUTLINE:
|
||||
g_value_set_pointer (value, priv->outline);
|
||||
break;
|
||||
case PROP_BOUNDS:
|
||||
g_value_set_boxed (value, &priv->bounds);
|
||||
break;
|
||||
case PROP_GROUP:
|
||||
g_value_set_int (value, priv->group);
|
||||
break;
|
||||
case PROP_LEVEL:
|
||||
g_value_set_int (value, priv->level);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
g_object_get_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_class_init (EekSimpleKeyClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (gobject_class,
|
||||
sizeof (EekSimpleKeyPrivate));
|
||||
|
||||
gobject_class->set_property = eek_simple_key_set_property;
|
||||
gobject_class->get_property = eek_simple_key_get_property;
|
||||
gobject_class->finalize = eek_simple_key_finalize;
|
||||
gobject_class->dispose = eek_simple_key_dispose;
|
||||
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_NAME,
|
||||
"name");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_KEYSYMS,
|
||||
"keysyms");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_COLUMN,
|
||||
"column");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_ROW,
|
||||
"row");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_OUTLINE,
|
||||
"outline");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_BOUNDS,
|
||||
"bounds");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_GROUP,
|
||||
"group");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_LEVEL,
|
||||
"level");
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_key_init (EekSimpleKey *self)
|
||||
{
|
||||
EekSimpleKeyPrivate *priv;
|
||||
|
||||
priv = self->priv = EEK_SIMPLE_KEY_GET_PRIVATE(self);
|
||||
priv->keysyms = NULL;
|
||||
priv->num_groups = 0;
|
||||
priv->num_levels = 0;
|
||||
priv->column = 0;
|
||||
priv->row = 0;
|
||||
priv->outline = NULL;
|
||||
memset (&priv->bounds, 0, sizeof priv->bounds);
|
||||
}
|
||||
55
eek/eek-simple-key.h
Normal file
55
eek/eek-simple-key.h
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_SIMPLE_KEY_H
|
||||
#define EEK_SIMPLE_KEY_H 1
|
||||
|
||||
#include "eek-key.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
#define EEK_TYPE_SIMPLE_KEY (eek_simple_key_get_type())
|
||||
#define EEK_SIMPLE_KEY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_SIMPLE_KEY, EekSimpleKey))
|
||||
#define EEK_SIMPLE_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_SIMPLE_KEY, EekSimpleKeyClass))
|
||||
#define EEK_IS_SIMPLE_KEY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_SIMPLE_KEY))
|
||||
#define EEK_IS_SIMPLE_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_SIMPLE_KEY))
|
||||
#define EEK_SIMPLE_KEY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_SIMPLE_KEY, EekSimpleKeyClass))
|
||||
|
||||
typedef struct _EekSimpleKey EekSimpleKey;
|
||||
typedef struct _EekSimpleKeyClass EekSimpleKeyClass;
|
||||
typedef struct _EekSimpleKeyPrivate EekSimpleKeyPrivate;
|
||||
|
||||
struct _EekSimpleKey
|
||||
{
|
||||
/*< private >*/
|
||||
GInitiallyUnowned parent;
|
||||
|
||||
/*< private >*/
|
||||
EekSimpleKeyPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekSimpleKeyClass
|
||||
{
|
||||
/*< private >*/
|
||||
GInitiallyUnownedClass parent_class;
|
||||
};
|
||||
|
||||
GType eek_simple_key_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_SIMPLE_KEY_H */
|
||||
217
eek/eek-simple-keyboard.c
Normal file
217
eek/eek-simple-keyboard.c
Normal file
@ -0,0 +1,217 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-simple-keyboard.h"
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_BOUNDS,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static void eek_keyboard_iface_init (EekKeyboardIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (EekSimpleKeyboard, eek_simple_keyboard,
|
||||
G_TYPE_INITIALLY_UNOWNED,
|
||||
G_IMPLEMENT_INTERFACE (EEK_TYPE_KEYBOARD,
|
||||
eek_keyboard_iface_init));
|
||||
|
||||
#define EEK_SIMPLE_KEYBOARD_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_SIMPLE_KEYBOARD, EekSimpleKeyboardPrivate))
|
||||
|
||||
|
||||
struct _EekSimpleKeyboardPrivate
|
||||
{
|
||||
EekBounds bounds;
|
||||
GSList *sections;
|
||||
};
|
||||
|
||||
static void
|
||||
eek_simple_keyboard_real_set_bounds (EekKeyboard *self,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSimpleKeyboardPrivate *priv = EEK_SIMPLE_KEYBOARD_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
priv->bounds = *bounds;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_keyboard_real_get_bounds (EekKeyboard *self,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSimpleKeyboardPrivate *priv = EEK_SIMPLE_KEYBOARD_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
g_return_if_fail (bounds);
|
||||
*bounds = priv->bounds;
|
||||
}
|
||||
|
||||
static EekSection *
|
||||
eek_simple_keyboard_real_create_section (EekKeyboard *self,
|
||||
const gchar *name,
|
||||
gint angle,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSimpleKeyboardPrivate *priv = EEK_SIMPLE_KEYBOARD_GET_PRIVATE(self);
|
||||
EekSection *section;
|
||||
|
||||
g_return_val_if_fail (priv, NULL);
|
||||
section = g_object_new (EEK_TYPE_SIMPLE_SECTION,
|
||||
"name", name,
|
||||
"angle", angle,
|
||||
"bounds", bounds,
|
||||
NULL);
|
||||
g_return_val_if_fail (section, NULL);
|
||||
priv->sections = g_slist_prepend (priv->sections, section);
|
||||
return section;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_keyboard_real_foreach_section (EekKeyboard *self,
|
||||
GFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekSimpleKeyboardPrivate *priv = EEK_SIMPLE_KEYBOARD_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
g_slist_foreach (priv->sections, func, user_data);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_keyboard_real_set_layout (EekKeyboard *self,
|
||||
EekLayout *layout)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_KEYBOARD(self));
|
||||
g_return_if_fail (EEK_IS_LAYOUT(layout));
|
||||
|
||||
EEK_LAYOUT_GET_CLASS(layout)->apply_to_keyboard (layout, self);
|
||||
if (g_object_is_floating (layout))
|
||||
g_object_unref (layout);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keyboard_iface_init (EekKeyboardIface *iface)
|
||||
{
|
||||
iface->set_bounds = eek_simple_keyboard_real_set_bounds;
|
||||
iface->get_bounds = eek_simple_keyboard_real_get_bounds;
|
||||
iface->create_section = eek_simple_keyboard_real_create_section;
|
||||
iface->foreach_section = eek_simple_keyboard_real_foreach_section;
|
||||
iface->set_layout = eek_simple_keyboard_real_set_layout;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_keyboard_dispose (GObject *object)
|
||||
{
|
||||
EekSimpleKeyboardPrivate *priv = EEK_SIMPLE_KEYBOARD_GET_PRIVATE(object);
|
||||
GSList *head;
|
||||
|
||||
for (head = priv->sections; head; head = g_slist_next (head))
|
||||
g_object_unref (head->data);
|
||||
G_OBJECT_CLASS (eek_simple_keyboard_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_keyboard_finalize (GObject *object)
|
||||
{
|
||||
EekSimpleKeyboardPrivate *priv = EEK_SIMPLE_KEYBOARD_GET_PRIVATE(object);
|
||||
|
||||
g_slist_free (priv->sections);
|
||||
G_OBJECT_CLASS (eek_simple_keyboard_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_keyboard_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
switch (prop_id) {
|
||||
case PROP_BOUNDS:
|
||||
eek_keyboard_set_bounds (EEK_KEYBOARD(object),
|
||||
g_value_get_boxed (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
g_object_set_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_keyboard_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekSimpleKeyboardPrivate *priv = EEK_SIMPLE_KEYBOARD_GET_PRIVATE(object);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
switch (prop_id) {
|
||||
case PROP_BOUNDS:
|
||||
g_value_set_boxed (value, &priv->bounds);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
g_object_set_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_keyboard_class_init (EekSimpleKeyboardClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (gobject_class,
|
||||
sizeof (EekSimpleKeyboardPrivate));
|
||||
|
||||
gobject_class->set_property = eek_simple_keyboard_set_property;
|
||||
gobject_class->get_property = eek_simple_keyboard_get_property;
|
||||
gobject_class->finalize = eek_simple_keyboard_finalize;
|
||||
gobject_class->dispose = eek_simple_keyboard_dispose;
|
||||
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_BOUNDS,
|
||||
"bounds");
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_keyboard_init (EekSimpleKeyboard *self)
|
||||
{
|
||||
EekSimpleKeyboardPrivate *priv;
|
||||
|
||||
priv = self->priv = EEK_SIMPLE_KEYBOARD_GET_PRIVATE(self);
|
||||
priv->sections = NULL;
|
||||
}
|
||||
|
||||
EekKeyboard*
|
||||
eek_simple_keyboard_new (void)
|
||||
{
|
||||
return g_object_new (EEK_TYPE_SIMPLE_KEYBOARD, NULL);
|
||||
}
|
||||
57
eek/eek-simple-keyboard.h
Normal file
57
eek/eek-simple-keyboard.h
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_SIMPLE_KEYBOARD_H
|
||||
#define EEK_SIMPLE_KEYBOARD_H 1
|
||||
|
||||
#include "eek-simple-section.h"
|
||||
#include "eek-keyboard.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
#define EEK_TYPE_SIMPLE_KEYBOARD (eek_simple_keyboard_get_type())
|
||||
#define EEK_SIMPLE_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_SIMPLE_KEYBOARD, EekKeyboard))
|
||||
#define EEK_SIMPLE_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_SIMPLE_KEYBOARD, EekSimpleKeyboardClass))
|
||||
#define EEK_IS_SIMPLE_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_SIMPLE_KEYBOARD))
|
||||
#define EEK_IS_SIMPLE_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_SIMPLE_KEYBOARD))
|
||||
#define EEK_SIMPLE_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_SIMPLE_KEYBOARD, EekSimpleKeyboardClass))
|
||||
|
||||
typedef struct _EekSimpleKeyboard EekSimpleKeyboard;
|
||||
typedef struct _EekSimpleKeyboardClass EekSimpleKeyboardClass;
|
||||
typedef struct _EekSimpleKeyboardPrivate EekSimpleKeyboardPrivate;
|
||||
|
||||
struct _EekSimpleKeyboard
|
||||
{
|
||||
/*< private >*/
|
||||
GInitiallyUnowned parent;
|
||||
|
||||
EekSimpleKeyboardPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekSimpleKeyboardClass
|
||||
{
|
||||
/*< private >*/
|
||||
GInitiallyUnownedClass parent_class;
|
||||
};
|
||||
|
||||
GType eek_simple_keyboard_get_type (void) G_GNUC_CONST;
|
||||
|
||||
EekKeyboard *eek_simple_keyboard_new (void);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_SIMPLE_KEYBOARD_H */
|
||||
291
eek/eek-simple-section.c
Normal file
291
eek/eek-simple-section.c
Normal file
@ -0,0 +1,291 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
#include "eek-simple-section.h"
|
||||
#include <string.h>
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_NAME,
|
||||
PROP_COLUMNS,
|
||||
PROP_ROWS,
|
||||
PROP_ANGLE,
|
||||
PROP_BOUNDS,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
static void eek_section_iface_init (EekSectionIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (EekSimpleSection, eek_simple_section,
|
||||
G_TYPE_INITIALLY_UNOWNED,
|
||||
G_IMPLEMENT_INTERFACE (EEK_TYPE_SECTION,
|
||||
eek_section_iface_init));
|
||||
|
||||
#define EEK_SIMPLE_SECTION_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_SIMPLE_SECTION, EekSimpleSectionPrivate))
|
||||
|
||||
struct _EekSimpleSectionPrivate
|
||||
{
|
||||
gchar *name;
|
||||
gint num_columns;
|
||||
gint num_rows;
|
||||
gint angle;
|
||||
EekBounds bounds;
|
||||
GSList *keys;
|
||||
};
|
||||
|
||||
static void
|
||||
eek_simple_section_real_set_dimensions (EekSection *self,
|
||||
gint columns,
|
||||
gint rows)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
priv->num_columns = columns;
|
||||
priv->num_rows = rows;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_real_get_dimensions (EekSection *self,
|
||||
gint *columns,
|
||||
gint *rows)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
*columns = priv->num_columns;
|
||||
*rows = priv->num_rows;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_real_set_angle (EekSection *self,
|
||||
gint angle)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
priv->angle = angle;
|
||||
}
|
||||
|
||||
static gint
|
||||
eek_simple_section_real_get_angle (EekSection *self)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_val_if_fail (priv, 0);
|
||||
return priv->angle;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_real_set_bounds (EekSection *self,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
g_return_if_fail (bounds);
|
||||
priv->bounds = *bounds;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_real_get_bounds (EekSection *self, EekBounds *bounds)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
g_return_if_fail (bounds);
|
||||
priv->bounds = *bounds;
|
||||
}
|
||||
|
||||
static EekKey *
|
||||
eek_simple_section_real_create_key (EekSection *self,
|
||||
const gchar *name,
|
||||
guint *keysyms,
|
||||
gint num_groups,
|
||||
gint num_levels,
|
||||
gint column,
|
||||
gint row,
|
||||
EekOutline *outline,
|
||||
EekBounds *bounds)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(self);
|
||||
EekKey *key;
|
||||
EekKeysymMatrix matrix;
|
||||
|
||||
g_return_val_if_fail (priv, NULL);
|
||||
g_return_val_if_fail (column < priv->num_columns, NULL);
|
||||
g_return_val_if_fail (row < priv->num_rows, NULL);
|
||||
|
||||
matrix.data = keysyms;
|
||||
matrix.num_groups = num_groups;
|
||||
matrix.num_levels = num_levels;
|
||||
key = g_object_new (EEK_TYPE_SIMPLE_KEY,
|
||||
"name", name,
|
||||
"keysyms", &matrix,
|
||||
"column", column,
|
||||
"row", row,
|
||||
"outline", outline,
|
||||
"bounds", bounds,
|
||||
NULL);
|
||||
g_return_val_if_fail (key, NULL);
|
||||
priv->keys = g_slist_prepend (priv->keys, key);
|
||||
return key;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_real_foreach_key (EekSection *self,
|
||||
GFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(self);
|
||||
|
||||
g_return_if_fail (priv);
|
||||
g_slist_foreach (priv->keys, func, user_data);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_section_iface_init (EekSectionIface *iface)
|
||||
{
|
||||
iface->set_dimensions = eek_simple_section_real_set_dimensions;
|
||||
iface->get_dimensions = eek_simple_section_real_get_dimensions;
|
||||
iface->set_angle = eek_simple_section_real_set_angle;
|
||||
iface->get_angle = eek_simple_section_real_get_angle;
|
||||
iface->set_bounds = eek_simple_section_real_set_bounds;
|
||||
iface->get_bounds = eek_simple_section_real_get_bounds;
|
||||
iface->create_key = eek_simple_section_real_create_key;
|
||||
iface->foreach_key = eek_simple_section_real_foreach_key;
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_dispose (GObject *object)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(object);
|
||||
GSList *head;
|
||||
|
||||
for (head = priv->keys; head; head = g_slist_next (head))
|
||||
g_object_unref (head->data);
|
||||
|
||||
G_OBJECT_CLASS (eek_simple_section_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_finalize (GObject *object)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(object);
|
||||
|
||||
g_free (priv->name);
|
||||
g_slist_free (priv->keys);
|
||||
G_OBJECT_CLASS (eek_simple_section_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_NAME:
|
||||
g_free (priv->name);
|
||||
priv->name = g_strdup (g_value_get_string (value));
|
||||
break;
|
||||
case PROP_ANGLE:
|
||||
eek_section_set_angle (EEK_SECTION(object),
|
||||
g_value_get_int (value));
|
||||
break;
|
||||
case PROP_BOUNDS:
|
||||
eek_section_set_bounds (EEK_SECTION(object),
|
||||
g_value_get_boxed (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
g_object_set_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv = EEK_SIMPLE_SECTION_GET_PRIVATE(object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_NAME:
|
||||
g_value_set_string (value, priv->name);
|
||||
break;
|
||||
case PROP_ANGLE:
|
||||
g_value_set_int (value, eek_section_get_angle (EEK_SECTION(object)));
|
||||
break;
|
||||
case PROP_BOUNDS:
|
||||
g_value_set_boxed (value, &priv->bounds);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
g_object_get_property (object,
|
||||
g_param_spec_get_name (pspec),
|
||||
value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_class_init (EekSimpleSectionClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (EekSimpleSectionPrivate));
|
||||
|
||||
gobject_class->set_property = eek_simple_section_set_property;
|
||||
gobject_class->get_property = eek_simple_section_get_property;
|
||||
gobject_class->finalize = eek_simple_section_finalize;
|
||||
gobject_class->dispose = eek_simple_section_dispose;
|
||||
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_NAME,
|
||||
"name");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_ANGLE,
|
||||
"angle");
|
||||
g_object_class_override_property (gobject_class,
|
||||
PROP_BOUNDS,
|
||||
"bounds");
|
||||
}
|
||||
|
||||
static void
|
||||
eek_simple_section_init (EekSimpleSection *self)
|
||||
{
|
||||
EekSimpleSectionPrivate *priv;
|
||||
|
||||
priv = self->priv = EEK_SIMPLE_SECTION_GET_PRIVATE (self);
|
||||
priv->angle = 0;
|
||||
memset (&priv->bounds, 0, sizeof priv->bounds);
|
||||
priv->keys = NULL;
|
||||
}
|
||||
56
eek/eek-simple-section.h
Normal file
56
eek/eek-simple-section.h
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_SIMPLE_SECTION_H
|
||||
#define EEK_SIMPLE_SECTION_H 1
|
||||
|
||||
#include "eek-simple-key.h"
|
||||
#include "eek-section.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
#define EEK_TYPE_SIMPLE_SECTION (eek_simple_section_get_type())
|
||||
#define EEK_SIMPLE_SECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_SIMPLE_SECTION, EekSimpleSection))
|
||||
#define EEK_SIMPLE_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_SIMPLE_SECTION, EekSimpleSectionClass))
|
||||
#define EEK_IS_SIMPLE_SECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_SIMPLE_SECTION))
|
||||
#define EEK_IS_SIMPLE_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_SIMPLE_SECTION))
|
||||
#define EEK_SIMPLE_SECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_SIMPLE_SECTION, EekSimpleSectionClass))
|
||||
|
||||
typedef struct _EekSimpleSection EekSimpleSection;
|
||||
typedef struct _EekSimpleSectionClass EekSimpleSectionClass;
|
||||
typedef struct _EekSimpleSectionPrivate EekSimpleSectionPrivate;
|
||||
|
||||
struct _EekSimpleSection
|
||||
{
|
||||
/*< private >*/
|
||||
GInitiallyUnowned parent;
|
||||
|
||||
/*< private >*/
|
||||
EekSimpleSectionPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekSimpleSectionClass
|
||||
{
|
||||
/*< private >*/
|
||||
GInitiallyUnownedClass parent_class;
|
||||
};
|
||||
|
||||
GType eek_simple_section_get_type (void) G_GNUC_CONST;
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_SIMPLE_SECTION_H */
|
||||
128
eek/eek-types.c
Normal file
128
eek/eek-types.c
Normal file
@ -0,0 +1,128 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include "eek-types.h"
|
||||
|
||||
/* EekKeysymMatrix */
|
||||
static EekKeysymMatrix *
|
||||
eek_keysym_matrix_copy (const EekKeysymMatrix *matrix)
|
||||
{
|
||||
return g_slice_dup (EekKeysymMatrix, matrix);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_keysym_matrix_free (EekKeysymMatrix *matrix)
|
||||
{
|
||||
g_slice_free (EekKeysymMatrix, matrix);
|
||||
}
|
||||
|
||||
GType
|
||||
eek_keysym_matrix_get_type (void)
|
||||
{
|
||||
static GType our_type = 0;
|
||||
|
||||
if (our_type == 0)
|
||||
our_type =
|
||||
g_boxed_type_register_static ("EekKeysymMatrix",
|
||||
(GBoxedCopyFunc)eek_keysym_matrix_copy,
|
||||
(GBoxedFreeFunc)eek_keysym_matrix_free);
|
||||
return our_type;
|
||||
}
|
||||
|
||||
/* EekPoint */
|
||||
static EekPoint *
|
||||
eek_point_copy (const EekPoint *point)
|
||||
{
|
||||
return g_slice_dup (EekPoint, point);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_point_free (EekPoint *point)
|
||||
{
|
||||
g_slice_free (EekPoint, point);
|
||||
}
|
||||
|
||||
GType
|
||||
eek_point_get_type (void)
|
||||
{
|
||||
static GType our_type = 0;
|
||||
|
||||
if (our_type == 0)
|
||||
our_type =
|
||||
g_boxed_type_register_static ("EekPoint",
|
||||
(GBoxedCopyFunc)eek_point_copy,
|
||||
(GBoxedFreeFunc)eek_point_free);
|
||||
return our_type;
|
||||
}
|
||||
|
||||
/* EekBounds */
|
||||
static EekBounds *
|
||||
eek_bounds_copy (const EekBounds *bounds)
|
||||
{
|
||||
return g_slice_dup (EekBounds, bounds);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_bounds_free (EekBounds *bounds)
|
||||
{
|
||||
g_slice_free (EekBounds, bounds);
|
||||
}
|
||||
|
||||
GType
|
||||
eek_bounds_get_type (void)
|
||||
{
|
||||
static GType our_type = 0;
|
||||
|
||||
if (our_type == 0)
|
||||
our_type =
|
||||
g_boxed_type_register_static ("EekBounds",
|
||||
(GBoxedCopyFunc)eek_bounds_copy,
|
||||
(GBoxedFreeFunc)eek_bounds_free);
|
||||
return our_type;
|
||||
}
|
||||
|
||||
/* EekOutline */
|
||||
static EekOutline *
|
||||
eek_outline_copy (const EekOutline *outline)
|
||||
{
|
||||
return g_slice_dup (EekOutline, outline);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_outline_free (EekOutline *outline)
|
||||
{
|
||||
g_slice_free (EekOutline, outline);
|
||||
}
|
||||
|
||||
GType
|
||||
eek_outline_get_type (void)
|
||||
{
|
||||
static GType our_type = 0;
|
||||
|
||||
if (our_type == 0)
|
||||
our_type =
|
||||
g_boxed_type_register_static ("EekOutline",
|
||||
(GBoxedCopyFunc)eek_outline_copy,
|
||||
(GBoxedFreeFunc)eek_outline_free);
|
||||
return our_type;
|
||||
}
|
||||
109
eek/eek-types.h
Normal file
109
eek/eek-types.h
Normal file
@ -0,0 +1,109 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_TYPES_H
|
||||
#define EEK_TYPES_H 1
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/**
|
||||
* EekKeysymMatrix:
|
||||
* @data: array of keysyms
|
||||
* @num_groups: the number of groups (rows)
|
||||
* @num_levels: the number of levels (columns)
|
||||
*
|
||||
* Symbol matrix of a key.
|
||||
*/
|
||||
struct _EekKeysymMatrix
|
||||
{
|
||||
guint *data;
|
||||
gint num_groups;
|
||||
gint num_levels;
|
||||
};
|
||||
typedef struct _EekKeysymMatrix EekKeysymMatrix;
|
||||
|
||||
#define EEK_TYPE_KEYSYM_MATRIX (eek_keysym_matrix_get_type ())
|
||||
GType eek_keysym_matrix_get_type (void) G_GNUC_CONST;
|
||||
|
||||
/**
|
||||
* EekPoint:
|
||||
* @x: X coordinate of the point
|
||||
* @y: Y coordinate of the point
|
||||
*
|
||||
* 2D vertex
|
||||
*/
|
||||
struct _EekPoint
|
||||
{
|
||||
gdouble x;
|
||||
gdouble y;
|
||||
};
|
||||
typedef struct _EekPoint EekPoint;
|
||||
|
||||
#define EEK_TYPE_POINT (eek_point_get_type ())
|
||||
GType eek_point_get_type (void) G_GNUC_CONST;
|
||||
|
||||
/**
|
||||
* EekBounds:
|
||||
* @x: X coordinate of the top left point
|
||||
* @y: Y coordinate of the top left point
|
||||
* @width: width of the box
|
||||
* @height: height of the box
|
||||
*
|
||||
* 2D bounding box
|
||||
*/
|
||||
struct _EekBounds
|
||||
{
|
||||
gdouble x;
|
||||
gdouble y;
|
||||
gdouble w;
|
||||
gdouble h;
|
||||
};
|
||||
typedef struct _EekBounds EekBounds;
|
||||
|
||||
#define EEK_TYPE_BOUNDS (eek_bounds_get_type ())
|
||||
GType eek_bounds_get_type (void) G_GNUC_CONST;
|
||||
|
||||
/**
|
||||
* EekOutline:
|
||||
* @corner_radius: radius of corners of rounded polygon
|
||||
* @points: an array of points represents a polygon
|
||||
* @num_points: the length of @points
|
||||
*
|
||||
* 2D rounded polygon used to draw key shape
|
||||
*/
|
||||
struct _EekOutline
|
||||
{
|
||||
gdouble corner_radius;
|
||||
EekPoint *points;
|
||||
gint num_points;
|
||||
};
|
||||
typedef struct _EekOutline EekOutline;
|
||||
|
||||
#define EEK_TYPE_OUTLINE (eek_outline_get_type ())
|
||||
GType eek_outline_get_type (void) G_GNUC_CONST;
|
||||
|
||||
/* dummy */
|
||||
typedef struct _EekKeyboard EekKeyboard;
|
||||
typedef struct _EekSection EekSection;
|
||||
typedef struct _EekKey EekKey;
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_TYPES_H */
|
||||
759
eek/eek-xkb-layout.c
Normal file
759
eek/eek-xkb-layout.c
Normal file
@ -0,0 +1,759 @@
|
||||
/*
|
||||
* Copyright (C) 2006 Sergey V. Udaltsov <svu@gnome.org>
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:eek-xkb-layout
|
||||
* @short_description: Layout engine using XKB configuration
|
||||
*
|
||||
* The #EekXkbLayout inherits #EekLayout class and arranges keyboard
|
||||
* elements using XKB.
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif /* HAVE_CONFIG_H */
|
||||
|
||||
#include <gdk/gdkx.h>
|
||||
#include <X11/XKBlib.h>
|
||||
#include <X11/extensions/XKBgeom.h>
|
||||
#include <string.h>
|
||||
#include "eek-xkb-layout.h"
|
||||
#include "eek-keyboard.h"
|
||||
|
||||
#define noKBDRAW_DEBUG
|
||||
|
||||
G_DEFINE_TYPE (EekXkbLayout, eek_xkb_layout, EEK_TYPE_LAYOUT);
|
||||
|
||||
#define EEK_XKB_LAYOUT_GET_PRIVATE(obj) \
|
||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_XKB_LAYOUT, EekXkbLayoutPrivate))
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_KEYCODES,
|
||||
PROP_GEOMETRY,
|
||||
PROP_SYMBOLS,
|
||||
PROP_LAST
|
||||
};
|
||||
|
||||
struct _EekXkbLayoutPrivate
|
||||
{
|
||||
/* Configuration names that should synch'ed to the symbolic names
|
||||
in priv->xkb->names. Since we use GLib's memory allocator,
|
||||
don't store any address returned from the X server here. */
|
||||
XkbComponentNamesRec names;
|
||||
|
||||
Display *display;
|
||||
|
||||
/* Actual XKB configuration of DISPLAY. */
|
||||
XkbDescRec *xkb;
|
||||
|
||||
/* Hash table to cache outlines by shape address. */
|
||||
GHashTable *outline_hash;
|
||||
|
||||
gint scale_numerator;
|
||||
gint scale_denominator;
|
||||
};
|
||||
|
||||
#define INVALID_KEYCODE ((guint)(-1))
|
||||
|
||||
static guint
|
||||
find_keycode (EekXkbLayout *layout, gchar *key_name);
|
||||
|
||||
static void
|
||||
get_keyboard (EekXkbLayout *layout);
|
||||
|
||||
static void
|
||||
get_names (EekXkbLayout *layout);
|
||||
|
||||
static void
|
||||
setup_scaling (EekXkbLayout *layout,
|
||||
gdouble width,
|
||||
gdouble height);
|
||||
|
||||
G_INLINE_FUNC gint
|
||||
xkb_to_pixmap_coord (EekXkbLayout *layout,
|
||||
gint n)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
return n * priv->scale_numerator / priv->scale_denominator;
|
||||
}
|
||||
|
||||
G_INLINE_FUNC gdouble
|
||||
xkb_to_pixmap_double (EekXkbLayout *layout,
|
||||
gdouble d)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
return d * priv->scale_numerator / priv->scale_denominator;
|
||||
}
|
||||
|
||||
static EekKey *
|
||||
create_key (EekXkbLayout *layout,
|
||||
EekSection *section,
|
||||
gint column,
|
||||
gint row,
|
||||
gdouble x,
|
||||
gdouble y,
|
||||
XkbKeyRec *xkbkey)
|
||||
{
|
||||
XkbGeometryRec *xkbgeometry;
|
||||
XkbBoundsRec *xkbbounds;
|
||||
XkbShapeRec *xkbshape;
|
||||
XkbOutlineRec *xkboutline;
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
EekKey *key;
|
||||
EekBounds bounds;
|
||||
guint *keysyms;
|
||||
gchar name[XkbKeyNameLength + 1];
|
||||
EekOutline *outline;
|
||||
KeyCode keycode;
|
||||
gint num_groups, num_levels;
|
||||
|
||||
xkbgeometry = priv->xkb->geom;
|
||||
xkbshape = &xkbgeometry->shapes[xkbkey->shape_ndx];
|
||||
outline = g_hash_table_lookup (priv->outline_hash, xkbshape);
|
||||
if (outline == NULL) {
|
||||
xkboutline = xkbshape->primary == NULL ? &xkbshape->outlines[0] :
|
||||
xkbshape->primary;
|
||||
|
||||
outline = g_new0 (EekOutline, 1);
|
||||
outline->corner_radius = xkb_to_pixmap_coord(layout, xkboutline->corner_radius);
|
||||
|
||||
if (xkboutline->num_points <= 2) { /* rectangular */
|
||||
gdouble x1, y1, x2, y2;
|
||||
|
||||
outline->num_points = 4;
|
||||
outline->points = g_new0 (EekPoint, outline->num_points);
|
||||
if (xkboutline->num_points == 1) {
|
||||
x1 = xkb_to_pixmap_coord(layout, xkbshape->bounds.x1);
|
||||
y1 = xkb_to_pixmap_coord(layout, xkbshape->bounds.y1);
|
||||
x2 = xkb_to_pixmap_coord(layout, xkboutline->points[0].x);
|
||||
y2 = xkb_to_pixmap_coord(layout, xkboutline->points[0].y);
|
||||
} else {
|
||||
x1 = xkb_to_pixmap_coord(layout, xkboutline->points[0].x);
|
||||
y1 = xkb_to_pixmap_coord(layout, xkboutline->points[0].y);
|
||||
x2 = xkb_to_pixmap_coord(layout, xkboutline->points[1].x);
|
||||
y2 = xkb_to_pixmap_coord(layout, xkboutline->points[1].y);
|
||||
}
|
||||
outline->points[0].x = outline->points[3].x = x1;
|
||||
outline->points[0].y = outline->points[1].y = y1;
|
||||
outline->points[1].x = outline->points[2].x = x2;
|
||||
outline->points[2].y = outline->points[3].y = y2;
|
||||
} else { /* polygon */
|
||||
gint i;
|
||||
|
||||
outline->num_points = xkboutline->num_points;
|
||||
outline->points = g_new0 (EekPoint, outline->num_points);
|
||||
for (i = 0; i < xkboutline->num_points; i++) {
|
||||
outline->points[i].x = xkb_to_pixmap_coord(layout, xkboutline->points[i].x);
|
||||
outline->points[i].y = xkb_to_pixmap_coord(layout, xkboutline->points[i].y);
|
||||
}
|
||||
}
|
||||
g_hash_table_insert (priv->outline_hash, xkbshape, outline);
|
||||
}
|
||||
|
||||
memset (name, 0, sizeof name);
|
||||
memcpy (name, xkbkey->name.name, sizeof name - 1);
|
||||
|
||||
xkbbounds = &xkbgeometry->shapes[xkbkey->shape_ndx].bounds;
|
||||
bounds.x = xkb_to_pixmap_coord(layout, xkbbounds->x1 + x);
|
||||
bounds.y = xkb_to_pixmap_coord(layout, xkbbounds->y1 + y);
|
||||
bounds.w = xkb_to_pixmap_coord(layout, xkbbounds->x2 - xkbbounds->x1);
|
||||
bounds.h = xkb_to_pixmap_coord(layout, xkbbounds->y2 - xkbbounds->y1);
|
||||
|
||||
keycode = find_keycode (layout, name);
|
||||
if (keycode == INVALID_KEYCODE)
|
||||
num_groups = num_levels = 0;
|
||||
else {
|
||||
KeySym keysym;
|
||||
gint num_keysyms, i, j;
|
||||
|
||||
num_groups = XkbKeyNumGroups (priv->xkb, keycode);
|
||||
num_levels = XkbKeyGroupsWidth (priv->xkb, keycode);
|
||||
num_keysyms = num_groups * num_levels;
|
||||
keysyms = g_malloc0 ((num_keysyms) * sizeof(guint));
|
||||
for (i = 0; i < num_groups; i++)
|
||||
for (j = 0; j < num_levels; j++) {
|
||||
keysym = XkbKeySymEntry (priv->xkb, keycode, i, j);
|
||||
keysyms[i * num_levels + j] = keysym;
|
||||
}
|
||||
}
|
||||
|
||||
eek_section_create_key (section,
|
||||
name,
|
||||
keysyms,
|
||||
num_groups,
|
||||
num_levels,
|
||||
column,
|
||||
row,
|
||||
outline,
|
||||
&bounds);
|
||||
}
|
||||
|
||||
static void
|
||||
create_section (EekXkbLayout *layout,
|
||||
EekKeyboard *keyboard,
|
||||
XkbSectionRec *xkbsection)
|
||||
{
|
||||
XkbGeometryRec *xkbgeometry;
|
||||
EekXkbLayoutPrivate *priv;
|
||||
EekSection *section;
|
||||
EekBounds bounds;
|
||||
const gchar *name;
|
||||
gfloat left, top;
|
||||
gint i, j, columns;
|
||||
|
||||
bounds.x = xkb_to_pixmap_coord(layout, xkbsection->left);
|
||||
bounds.y = xkb_to_pixmap_coord(layout, xkbsection->top);
|
||||
bounds.w = xkb_to_pixmap_coord(layout, xkbsection->width);
|
||||
bounds.h = xkb_to_pixmap_coord(layout, xkbsection->height);
|
||||
|
||||
priv = layout->priv;
|
||||
xkbgeometry = priv->xkb->geom;
|
||||
name = XGetAtomName (priv->display, xkbsection->name);
|
||||
section = eek_keyboard_create_section (keyboard,
|
||||
name,
|
||||
/* angle is in tenth of degree */
|
||||
xkbsection->angle / 10,
|
||||
&bounds);
|
||||
|
||||
for (columns = 0, i = 0; i < xkbsection->num_rows; i++) {
|
||||
XkbRowRec *xkbrow;
|
||||
|
||||
xkbrow = &xkbsection->rows[i];
|
||||
if (xkbrow->num_keys > columns)
|
||||
columns = xkbrow->num_keys;
|
||||
}
|
||||
eek_section_set_dimensions (section, columns, xkbsection->num_rows);
|
||||
|
||||
for (i = 0; i < xkbsection->num_rows; i++) {
|
||||
XkbRowRec *xkbrow;
|
||||
|
||||
xkbrow = &xkbsection->rows[i];
|
||||
left = xkbrow->left;
|
||||
top = xkbrow->top;
|
||||
for (j = 0; j < xkbrow->num_keys; j++) {
|
||||
XkbKeyRec *xkbkey;
|
||||
XkbBoundsRec *xkbbounds;
|
||||
|
||||
xkbkey = &xkbrow->keys[j];
|
||||
if (xkbrow->vertical)
|
||||
top += xkbkey->gap;
|
||||
else
|
||||
left += xkbkey->gap;
|
||||
create_key (layout, section, j, i, left, top, xkbkey);
|
||||
xkbbounds = &xkbgeometry->shapes[xkbkey->shape_ndx].bounds;
|
||||
if (xkbrow->vertical)
|
||||
top += xkbbounds->y2 - xkbbounds->y1;
|
||||
else
|
||||
left += xkbbounds->x2 - xkbbounds->x1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
create_keyboard (EekXkbLayout *layout, EekKeyboard *keyboard)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
XkbGeometryRec *xkbgeometry;
|
||||
EekBounds bounds;
|
||||
gint i;
|
||||
|
||||
g_return_if_fail (priv->xkb);
|
||||
g_return_if_fail (priv->xkb->geom);
|
||||
|
||||
xkbgeometry = priv->xkb->geom;
|
||||
|
||||
eek_keyboard_get_bounds (keyboard, &bounds);
|
||||
setup_scaling (EEK_XKB_LAYOUT(layout), bounds.w, bounds.h);
|
||||
|
||||
bounds.x = bounds.y = 0;
|
||||
bounds.w = xkb_to_pixmap_coord(layout, xkbgeometry->width_mm);
|
||||
bounds.h = xkb_to_pixmap_coord(layout, xkbgeometry->height_mm);
|
||||
eek_keyboard_set_bounds (keyboard, &bounds);
|
||||
|
||||
for (i = 0; i < xkbgeometry->num_sections; i++) {
|
||||
XkbSectionRec *xkbsection;
|
||||
EekSection *section;
|
||||
|
||||
xkbsection = &xkbgeometry->sections[i];
|
||||
create_section (layout, keyboard, xkbsection);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_xkb_layout_apply_to_keyboard (EekLayout *layout, EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_if_fail (EEK_IS_XKB_LAYOUT(layout));
|
||||
g_return_if_fail (EEK_IS_KEYBOARD(keyboard));
|
||||
create_keyboard (EEK_XKB_LAYOUT(layout), keyboard);
|
||||
if (g_object_is_floating (keyboard))
|
||||
g_object_unref (keyboard);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_xkb_layout_dispose (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (eek_xkb_layout_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_xkb_layout_finalize (GObject *object)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (object);
|
||||
|
||||
g_free (priv->names.keycodes);
|
||||
g_free (priv->names.geometry);
|
||||
g_free (priv->names.symbols);
|
||||
g_hash_table_unref (priv->outline_hash);
|
||||
XkbFreeKeyboard (priv->xkb, 0, TRUE); /* free_all = TRUE */
|
||||
G_OBJECT_CLASS (eek_xkb_layout_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_xkb_layout_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
const gchar *name;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_KEYCODES:
|
||||
name = g_value_get_string (value);
|
||||
eek_xkb_layout_set_keycodes (EEK_XKB_LAYOUT(object), name);
|
||||
break;
|
||||
case PROP_GEOMETRY:
|
||||
name = g_value_get_string (value);
|
||||
eek_xkb_layout_set_geometry (EEK_XKB_LAYOUT(object), name);
|
||||
break;
|
||||
case PROP_SYMBOLS:
|
||||
name = g_value_get_string (value);
|
||||
eek_xkb_layout_set_symbols (EEK_XKB_LAYOUT(object), name);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_xkb_layout_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
const gchar *name;
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_KEYCODES:
|
||||
name = eek_xkb_layout_get_keycodes (EEK_XKB_LAYOUT(object));
|
||||
g_value_set_string (value, name);
|
||||
break;
|
||||
case PROP_GEOMETRY:
|
||||
name = eek_xkb_layout_get_geometry (EEK_XKB_LAYOUT(object));
|
||||
g_value_set_string (value, name);
|
||||
break;
|
||||
case PROP_SYMBOLS:
|
||||
name = eek_xkb_layout_get_symbols (EEK_XKB_LAYOUT(object));
|
||||
g_value_set_string (value, name);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
eek_xkb_layout_class_init (EekXkbLayoutClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GParamSpec *pspec;
|
||||
EekLayoutClass *layout_class = EEK_LAYOUT_CLASS (klass);
|
||||
|
||||
g_type_class_add_private (gobject_class, sizeof (EekXkbLayoutPrivate));
|
||||
|
||||
gobject_class->finalize = eek_xkb_layout_finalize;
|
||||
gobject_class->dispose = eek_xkb_layout_dispose;
|
||||
gobject_class->set_property = eek_xkb_layout_set_property;
|
||||
gobject_class->get_property = eek_xkb_layout_get_property;
|
||||
|
||||
layout_class->apply_to_keyboard = eek_xkb_layout_apply_to_keyboard;
|
||||
|
||||
pspec = g_param_spec_string ("keycodes",
|
||||
"Keycodes",
|
||||
"XKB keycodes component name",
|
||||
NULL,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class, PROP_KEYCODES, pspec);
|
||||
|
||||
pspec = g_param_spec_string ("geometry",
|
||||
"Geometry",
|
||||
"XKB geometry component name",
|
||||
NULL,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class, PROP_GEOMETRY, pspec);
|
||||
|
||||
pspec = g_param_spec_string ("symbols",
|
||||
"Symbols",
|
||||
"XKB symbols component name",
|
||||
NULL,
|
||||
G_PARAM_READWRITE);
|
||||
g_object_class_install_property (gobject_class, PROP_SYMBOLS, pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
eek_xkb_layout_init (EekXkbLayout *self)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv;
|
||||
|
||||
priv = self->priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
|
||||
|
||||
memset (&priv->names, 0, sizeof priv->names);
|
||||
priv->display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
|
||||
|
||||
/* XXX: XkbClientMapMask | XkbIndicatorMapMask | XkbNamesMask |
|
||||
XkbGeometryMask */
|
||||
priv->xkb = XkbGetKeyboard (priv->display,
|
||||
XkbGBN_GeometryMask |
|
||||
XkbGBN_KeyNamesMask |
|
||||
XkbGBN_OtherNamesMask |
|
||||
XkbGBN_SymbolsMask |
|
||||
XkbGBN_IndicatorMapMask,
|
||||
XkbUseCoreKbd);
|
||||
|
||||
priv->outline_hash = g_hash_table_new_full (g_direct_hash,
|
||||
g_direct_equal,
|
||||
NULL,
|
||||
g_free);
|
||||
if (priv->xkb == NULL) {
|
||||
g_critical ("XkbGetKeyboard failed to get keyboard from the server!");
|
||||
return;
|
||||
}
|
||||
get_names (self);
|
||||
}
|
||||
|
||||
static void
|
||||
get_names (EekXkbLayout *layout)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
gchar *name;
|
||||
|
||||
XkbGetNames (priv->display, XkbAllNamesMask, priv->xkb);
|
||||
|
||||
if (priv->xkb->names->keycodes <= 0)
|
||||
g_warning ("XKB keycodes setting is not loaded properly");
|
||||
else {
|
||||
name = XGetAtomName (priv->display, priv->xkb->names->keycodes);
|
||||
if (!name)
|
||||
g_warning ("Can't get the name of keycodes");
|
||||
else if (!priv->names.keycodes ||
|
||||
g_strcmp0 (name, priv->names.keycodes)) {
|
||||
g_free (priv->names.keycodes);
|
||||
priv->names.keycodes = g_strdup (name);
|
||||
XFree (name);
|
||||
}
|
||||
}
|
||||
|
||||
if (priv->xkb->names->geometry <= 0)
|
||||
g_warning ("XKB geometry setting is not loaded");
|
||||
else {
|
||||
name = XGetAtomName (priv->display, priv->xkb->names->geometry);
|
||||
if (!name)
|
||||
g_warning ("Can't get the name of geometry");
|
||||
else if (!priv->names.geometry ||
|
||||
g_strcmp0 (name, priv->names.geometry)) {
|
||||
g_free (priv->names.geometry);
|
||||
priv->names.geometry = g_strdup (name);
|
||||
XFree (name);
|
||||
}
|
||||
}
|
||||
|
||||
if (priv->xkb->names->symbols <= 0)
|
||||
g_warning ("XKB symbols setting is not loaded");
|
||||
else {
|
||||
name = XGetAtomName (priv->display, priv->xkb->names->symbols);
|
||||
if (!name)
|
||||
g_warning ("Can't get the name of symbols");
|
||||
else if (!priv->names.symbols ||
|
||||
g_strcmp0 (name, priv->names.symbols)) {
|
||||
g_free (priv->names.symbols);
|
||||
priv->names.symbols = g_strdup (name);
|
||||
XFree (name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_xkb_layout_new:
|
||||
* @keycodes: component name for keycodes
|
||||
* @geometry: component name for geometry
|
||||
* @symbols: component name for symbols
|
||||
*
|
||||
* Create a new #EekXkbLayout.
|
||||
*/
|
||||
EekLayout *
|
||||
eek_xkb_layout_new (const gchar *keycodes,
|
||||
const gchar *geometry,
|
||||
const gchar *symbols)
|
||||
{
|
||||
EekXkbLayout *layout = g_object_new (EEK_TYPE_XKB_LAYOUT, NULL);
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
|
||||
g_return_val_if_fail (layout, NULL);
|
||||
if (keycodes)
|
||||
priv->names.keycodes = g_strdup (keycodes);
|
||||
if (geometry)
|
||||
priv->names.geometry = g_strdup (geometry);
|
||||
if (symbols)
|
||||
priv->names.symbols = g_strdup (symbols);
|
||||
|
||||
get_keyboard (layout);
|
||||
return EEK_LAYOUT(layout);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_xkb_layout_set_keycodes:
|
||||
* @layout: an #EekXkbLayout
|
||||
* @keycodes: component name for keycodes
|
||||
*
|
||||
* Set the keycodes component (in the XKB terminology).
|
||||
*/
|
||||
void
|
||||
eek_xkb_layout_set_keycodes (EekXkbLayout *layout, const gchar *keycodes)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
|
||||
g_free (priv->names.keycodes);
|
||||
priv->names.keycodes = g_strdup (keycodes);
|
||||
get_keyboard (layout);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_xkb_layout_set_geometry:
|
||||
* @layout: an #EekXkbLayout
|
||||
* @geometry: component name for geometry
|
||||
*
|
||||
* Set the keycodes component (in the XKB terminology).
|
||||
*/
|
||||
void
|
||||
eek_xkb_layout_set_geometry (EekXkbLayout *layout, const gchar *geometry)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
|
||||
g_free (priv->names.geometry);
|
||||
priv->names.geometry = g_strdup (geometry);
|
||||
get_keyboard (layout);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_xkb_layout_set_symbols:
|
||||
* @layout: an #EekXkbLayout
|
||||
* @symbols: component name for symbols
|
||||
*
|
||||
* Set the symbols component (in the XKB terminology).
|
||||
*/
|
||||
void
|
||||
eek_xkb_layout_set_symbols (EekXkbLayout *layout, const gchar *symbols)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
|
||||
g_free (priv->names.symbols);
|
||||
priv->names.symbols = g_strdup (symbols);
|
||||
get_keyboard (layout);
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_xkb_layout_get_keycodes:
|
||||
* @layout: an #EekXkbLayout
|
||||
*
|
||||
* Get the keycodes component name (in the XKB terminology).
|
||||
*/
|
||||
G_CONST_RETURN gchar *
|
||||
eek_xkb_layout_get_keycodes (EekXkbLayout *layout)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
|
||||
return priv->names.keycodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_xkb_layout_get_geometry:
|
||||
* @layout: an #EekXkbLayout
|
||||
*
|
||||
* Get the geometry component name (in the XKB terminology).
|
||||
*/
|
||||
G_CONST_RETURN gchar *
|
||||
eek_xkb_layout_get_geometry (EekXkbLayout *layout)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
char *name;
|
||||
|
||||
return priv->names.geometry;
|
||||
}
|
||||
|
||||
/**
|
||||
* eek_xkb_layout_get_symbols:
|
||||
* @layout: an #EekXkbLayout
|
||||
*
|
||||
* Get the symbols component name (in the XKB terminology).
|
||||
*/
|
||||
G_CONST_RETURN gchar *
|
||||
eek_xkb_layout_get_symbols (EekXkbLayout *layout)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
|
||||
return priv->names.symbols;
|
||||
}
|
||||
|
||||
static void
|
||||
get_keyboard (EekXkbLayout *layout)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
|
||||
if (priv->xkb)
|
||||
XkbFreeKeyboard (priv->xkb, 0, TRUE); /* free_all = TRUE */
|
||||
priv->xkb = NULL;
|
||||
|
||||
if (priv->names.keycodes &&
|
||||
priv->names.geometry &&
|
||||
priv->names.symbols) {
|
||||
priv->xkb = XkbGetKeyboardByName (priv->display, XkbUseCoreKbd,
|
||||
&priv->names, 0,
|
||||
XkbGBN_GeometryMask |
|
||||
XkbGBN_KeyNamesMask |
|
||||
XkbGBN_OtherNamesMask |
|
||||
XkbGBN_ClientSymbolsMask |
|
||||
XkbGBN_IndicatorMapMask, FALSE);
|
||||
} else {
|
||||
priv->xkb = XkbGetKeyboard (priv->display,
|
||||
XkbGBN_GeometryMask |
|
||||
XkbGBN_KeyNamesMask |
|
||||
XkbGBN_OtherNamesMask |
|
||||
XkbGBN_SymbolsMask |
|
||||
XkbGBN_IndicatorMapMask,
|
||||
XkbUseCoreKbd);
|
||||
get_names (layout);
|
||||
}
|
||||
|
||||
if (priv->xkb == NULL) {
|
||||
g_free (priv->names.keycodes);
|
||||
priv->names.keycodes = NULL;
|
||||
g_free (priv->names.geometry);
|
||||
priv->names.geometry = NULL;
|
||||
g_free (priv->names.symbols);
|
||||
priv->names.symbols = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static guint
|
||||
find_keycode (EekXkbLayout *layout, gchar *key_name)
|
||||
{
|
||||
#define KEYSYM_NAME_MAX_LENGTH 4
|
||||
guint keycode;
|
||||
gint i, j;
|
||||
XkbKeyNamePtr pkey;
|
||||
XkbKeyAliasPtr palias;
|
||||
guint is_name_matched;
|
||||
gchar *src, *dst;
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
|
||||
if (!priv->xkb)
|
||||
return INVALID_KEYCODE;
|
||||
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" looking for keycode for (%c%c%c%c)\n",
|
||||
key_name[0], key_name[1], key_name[2], key_name[3]);
|
||||
#endif
|
||||
|
||||
pkey = priv->xkb->names->keys + priv->xkb->min_key_code;
|
||||
for (keycode = priv->xkb->min_key_code;
|
||||
keycode <= priv->xkb->max_key_code; keycode++) {
|
||||
is_name_matched = 1;
|
||||
src = key_name;
|
||||
dst = pkey->name;
|
||||
for (i = KEYSYM_NAME_MAX_LENGTH; --i >= 0;) {
|
||||
if ('\0' == *src)
|
||||
break;
|
||||
if (*src++ != *dst++) {
|
||||
is_name_matched = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (is_name_matched) {
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf (" found keycode %u\n", keycode);
|
||||
#endif
|
||||
return keycode;
|
||||
}
|
||||
pkey++;
|
||||
}
|
||||
|
||||
palias = priv->xkb->names->key_aliases;
|
||||
for (j = priv->xkb->names->num_key_aliases; --j >= 0;) {
|
||||
is_name_matched = 1;
|
||||
src = key_name;
|
||||
dst = palias->alias;
|
||||
for (i = KEYSYM_NAME_MAX_LENGTH; --i >= 0;) {
|
||||
if ('\0' == *src)
|
||||
break;
|
||||
if (*src++ != *dst++) {
|
||||
is_name_matched = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_name_matched) {
|
||||
keycode = find_keycode (layout, palias->real);
|
||||
#ifdef KBDRAW_DEBUG
|
||||
printf ("found alias keycode %u\n", keycode);
|
||||
#endif
|
||||
return keycode;
|
||||
}
|
||||
palias++;
|
||||
}
|
||||
|
||||
return INVALID_KEYCODE;
|
||||
}
|
||||
|
||||
static void
|
||||
setup_scaling (EekXkbLayout *layout,
|
||||
gdouble width,
|
||||
gdouble height)
|
||||
{
|
||||
EekXkbLayoutPrivate *priv = layout->priv;
|
||||
|
||||
g_return_if_fail (priv->xkb);
|
||||
|
||||
g_return_if_fail (priv->xkb->geom->width_mm > 0);
|
||||
g_return_if_fail (priv->xkb->geom->height_mm > 0);
|
||||
|
||||
if (width * priv->xkb->geom->height_mm <
|
||||
height * priv->xkb->geom->width_mm) {
|
||||
priv->scale_numerator = width;
|
||||
priv->scale_denominator = priv->xkb->geom->width_mm;
|
||||
} else {
|
||||
priv->scale_numerator = height;
|
||||
priv->scale_denominator = priv->xkb->geom->height_mm;
|
||||
}
|
||||
}
|
||||
83
eek/eek-xkb-layout.h
Normal file
83
eek/eek-xkb-layout.h
Normal file
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_XKB_LAYOUT_H
|
||||
#define EEK_XKB_LAYOUT_H 1
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/XKBlib.h>
|
||||
#include "eek-layout.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define EEK_TYPE_XKB_LAYOUT (eek_xkb_layout_get_type())
|
||||
#define EEK_XKB_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_XKB_LAYOUT, EekXkbLayout))
|
||||
#define EEK_XKB_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_XKB_LAYOUT, EekXkbLayoutClass))
|
||||
#define EEK_IS_XKB_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_XKB_LAYOUT))
|
||||
#define EEK_IS_XKB_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_XKB_LAYOUT))
|
||||
#define EEK_XKB_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_XKB_LAYOUT, EekXkbLayoutClass))
|
||||
|
||||
typedef struct _EekXkbLayout EekXkbLayout;
|
||||
typedef struct _EekXkbLayoutClass EekXkbLayoutClass;
|
||||
typedef struct _EekXkbLayoutPrivate EekXkbLayoutPrivate;
|
||||
|
||||
struct _EekXkbLayout
|
||||
{
|
||||
/*< private >*/
|
||||
EekLayout parent;
|
||||
|
||||
EekXkbLayoutPrivate *priv;
|
||||
};
|
||||
|
||||
struct _EekXkbLayoutClass
|
||||
{
|
||||
/*< private >*/
|
||||
EekLayoutClass parent_class;
|
||||
|
||||
void (* set_keycodes) (EekXkbLayout *self,
|
||||
const gchar *keycodes);
|
||||
void (* set_geometry) (EekXkbLayout *self,
|
||||
const gchar *geometry);
|
||||
void (* set_symbols) (EekXkbLayout *self,
|
||||
const gchar *symbols);
|
||||
|
||||
G_CONST_RETURN gchar *(* get_keycodes) (EekXkbLayout *self);
|
||||
G_CONST_RETURN gchar *(* get_geometry) (EekXkbLayout *self);
|
||||
G_CONST_RETURN gchar *(* get_symbols) (EekXkbLayout *self);
|
||||
};
|
||||
|
||||
GType eek_xkb_layout_get_type (void) G_GNUC_CONST;
|
||||
|
||||
EekLayout *eek_xkb_layout_new (const gchar *keycodes,
|
||||
const gchar *geometry,
|
||||
const gchar *symbols);
|
||||
|
||||
void eek_xkb_layout_set_keycodes (EekXkbLayout *layout,
|
||||
const gchar *keycodes);
|
||||
void eek_xkb_layout_set_geometry (EekXkbLayout *layout,
|
||||
const gchar *geometry);
|
||||
void eek_xkb_layout_set_symbols (EekXkbLayout *layout,
|
||||
const gchar *symbols);
|
||||
|
||||
G_CONST_RETURN gchar *eek_xkb_layout_get_keycodes (EekXkbLayout * layout);
|
||||
G_CONST_RETURN gchar *eek_xkb_layout_get_geometry (EekXkbLayout * layout);
|
||||
G_CONST_RETURN gchar *eek_xkb_layout_get_symbols (EekXkbLayout * layout);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* #ifndef EEK_XKB_LAYOUT_H */
|
||||
26
eek/eek-xkb.h
Normal file
26
eek/eek-xkb.h
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_XKB_H
|
||||
#define EEK_XKB_H 1
|
||||
|
||||
#include "eek.h"
|
||||
#include "eek-xkb-layout.h"
|
||||
|
||||
#endif /* EEK_XKB_H */
|
||||
27
eek/eek.h
Normal file
27
eek/eek.h
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
|
||||
* Copyright (C) 2010 Red Hat, Inc.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*/
|
||||
#ifndef EEK_H
|
||||
#define EEK_H 1
|
||||
|
||||
#include "eek-keyboard.h"
|
||||
#include "eek-layout.h"
|
||||
#include "eek-keysym.c"
|
||||
|
||||
#endif /* EEK_H */
|
||||
28
eek/gen-keysym-labels.py
Executable file
28
eek/gen-keysym-labels.py
Executable file
@ -0,0 +1,28 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
from __future__ import with_statement
|
||||
import sys
|
||||
import re
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
print >> sys.stderr, "Usage: %s table.txt table-name" % sys.argv[0]
|
||||
sys.exit(-1)
|
||||
|
||||
table = dict()
|
||||
with open(sys.argv[1], 'r') as fp:
|
||||
for line in fp:
|
||||
line = line.decode('UTF-8')
|
||||
match = re.match(r'\s*(0x[0-9A-F]+)\s+(\S*)', line, re.I)
|
||||
if match:
|
||||
table[int(match.group(1), 16)] = match.group(2)
|
||||
|
||||
sys.stdout.write("static const struct eek_keysym_label %s[] = {\n" %
|
||||
sys.argv[2])
|
||||
|
||||
for index, (keysym, label) in enumerate([(keysym, table[keysym])
|
||||
for keysym in sorted(table.keys())]):
|
||||
sys.stdout.write(" { 0x%X, %s }" % (keysym, label.encode('UTF-8')))
|
||||
if index < len(table) - 1:
|
||||
sys.stdout.write(",")
|
||||
sys.stdout.write("\n")
|
||||
sys.stdout.write("};\n")
|
||||
1306
eek/keyname-keysym-labels.txt
Normal file
1306
eek/keyname-keysym-labels.txt
Normal file
File diff suppressed because it is too large
Load Diff
31
eek/special-keysym-labels.txt
Normal file
31
eek/special-keysym-labels.txt
Normal file
@ -0,0 +1,31 @@
|
||||
0x20 ""
|
||||
0x8A3 "horiz\nconn"
|
||||
0xFE50 "ˋ"
|
||||
0xFE51 "ˊ"
|
||||
0xFE52 "ˆ"
|
||||
0xFE53 "~"
|
||||
0xFE54 "ˉ"
|
||||
0xFE55 "˘"
|
||||
0xFE56 "˙"
|
||||
0xFE57 "¨"
|
||||
0xFE58 "˚"
|
||||
0xFE59 "˝"
|
||||
0xFE5A "ˇ"
|
||||
0xFE5B "¸"
|
||||
0xFE5C "˛"
|
||||
0xFF14 "Scroll\nLock"
|
||||
0xFF20 "Compose"
|
||||
0xFF55 "Page\nUp"
|
||||
0xFF56 "Page\nDown"
|
||||
0xFF7E "AltGr"
|
||||
0xFF7F "Num\nLock"
|
||||
0xFF8D "Enter"
|
||||
0xFF95 "Home"
|
||||
0xFF96 "Left"
|
||||
0xFF97 "Up"
|
||||
0xFF98 "Right"
|
||||
0xFF99 "Down"
|
||||
0xFF9C "End"
|
||||
0xFF9D "Begin"
|
||||
0xFF9E "Ins"
|
||||
0xFF9F "Del"
|
||||
826
eek/unicode-keysym-labels.txt
Normal file
826
eek/unicode-keysym-labels.txt
Normal file
@ -0,0 +1,826 @@
|
||||
# This file is derived from gdkkeyuni.c in GTK+. Thanks for the
|
||||
# team. The original comments are below:
|
||||
|
||||
# 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/.
|
||||
|
||||
# Thanks to Markus G. Kuhn <mkuhn@acm.org> for the ksysym<->Unicode
|
||||
# mapping functions, from the xterm sources.
|
||||
|
||||
# These tables could be compressed by contiguous ranges, but the
|
||||
# benefit of doing so is smallish. It would save about ~1000 bytes
|
||||
# total.
|
||||
|
||||
0x01a1 "Ą" # Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK
|
||||
0x01a2 "˘" # breve ˘ BREVE
|
||||
0x01a3 "Ł" # Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE
|
||||
0x01a5 "Ľ" # Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON
|
||||
0x01a6 "Ś" # Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE
|
||||
0x01a9 "Š" # Scaron Š LATIN CAPITAL LETTER S WITH CARON
|
||||
0x01aa "Ş" # Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA
|
||||
0x01ab "Ť" # Tcaron Ť LATIN CAPITAL LETTER T WITH CARON
|
||||
0x01ac "Ź" # Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE
|
||||
0x01ae "Ž" # Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON
|
||||
0x01af "Ż" # Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE
|
||||
0x01b1 "ą" # aogonek ą LATIN SMALL LETTER A WITH OGONEK
|
||||
0x01b2 "˛" # ogonek ˛ OGONEK
|
||||
0x01b3 "ł" # lstroke ł LATIN SMALL LETTER L WITH STROKE
|
||||
0x01b5 "ľ" # lcaron ľ LATIN SMALL LETTER L WITH CARON
|
||||
0x01b6 "ś" # sacute ś LATIN SMALL LETTER S WITH ACUTE
|
||||
0x01b7 "ˇ" # caron ˇ CARON
|
||||
0x01b9 "š" # scaron š LATIN SMALL LETTER S WITH CARON
|
||||
0x01ba "ş" # scedilla ş LATIN SMALL LETTER S WITH CEDILLA
|
||||
0x01bb "ť" # tcaron ť LATIN SMALL LETTER T WITH CARON
|
||||
0x01bc "ź" # zacute ź LATIN SMALL LETTER Z WITH ACUTE
|
||||
0x01bd "˝" # doubleacute ˝ DOUBLE ACUTE ACCENT
|
||||
0x01be "ž" # zcaron ž LATIN SMALL LETTER Z WITH CARON
|
||||
0x01bf "ż" # zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE
|
||||
0x01c0 "Ŕ" # Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE
|
||||
0x01c3 "Ă" # Abreve Ă LATIN CAPITAL LETTER A WITH BREVE
|
||||
0x01c5 "Ĺ" # Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE
|
||||
0x01c6 "Ć" # Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE
|
||||
0x01c8 "Č" # Ccaron Č LATIN CAPITAL LETTER C WITH CARON
|
||||
0x01ca "Ę" # Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK
|
||||
0x01cc "Ě" # Ecaron Ě LATIN CAPITAL LETTER E WITH CARON
|
||||
0x01cf "Ď" # Dcaron Ď LATIN CAPITAL LETTER D WITH CARON
|
||||
0x01d0 "Đ" # Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE
|
||||
0x01d1 "Ń" # Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE
|
||||
0x01d2 "Ň" # Ncaron Ň LATIN CAPITAL LETTER N WITH CARON
|
||||
0x01d5 "Ő" # Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
|
||||
0x01d8 "Ř" # Rcaron Ř LATIN CAPITAL LETTER R WITH CARON
|
||||
0x01d9 "Ů" # Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE
|
||||
0x01db "Ű" # Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
|
||||
0x01de "Ţ" # Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA
|
||||
0x01e0 "ŕ" # racute ŕ LATIN SMALL LETTER R WITH ACUTE
|
||||
0x01e3 "ă" # abreve ă LATIN SMALL LETTER A WITH BREVE
|
||||
0x01e5 "ĺ" # lacute ĺ LATIN SMALL LETTER L WITH ACUTE
|
||||
0x01e6 "ć" # cacute ć LATIN SMALL LETTER C WITH ACUTE
|
||||
0x01e8 "č" # ccaron č LATIN SMALL LETTER C WITH CARON
|
||||
0x01ea "ę" # eogonek ę LATIN SMALL LETTER E WITH OGONEK
|
||||
0x01ec "ě" # ecaron ě LATIN SMALL LETTER E WITH CARON
|
||||
0x01ef "ď" # dcaron ď LATIN SMALL LETTER D WITH CARON
|
||||
0x01f0 "đ" # dstroke đ LATIN SMALL LETTER D WITH STROKE
|
||||
0x01f1 "ń" # nacute ń LATIN SMALL LETTER N WITH ACUTE
|
||||
0x01f2 "ň" # ncaron ň LATIN SMALL LETTER N WITH CARON
|
||||
0x01f5 "ő" # odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE
|
||||
0x01f8 "ř" # rcaron ř LATIN SMALL LETTER R WITH CARON
|
||||
0x01f9 "ů" # uring ů LATIN SMALL LETTER U WITH RING ABOVE
|
||||
0x01fb "ű" # udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE
|
||||
0x01fe "ţ" # tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA
|
||||
0x01ff "˙" # abovedot ˙ DOT ABOVE
|
||||
0x02a1 "Ħ" # Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE
|
||||
0x02a6 "Ĥ" # Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX
|
||||
0x02a9 "İ" # Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE
|
||||
0x02ab "Ğ" # Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE
|
||||
0x02ac "Ĵ" # Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX
|
||||
0x02b1 "ħ" # hstroke ħ LATIN SMALL LETTER H WITH STROKE
|
||||
0x02b6 "ĥ" # hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX
|
||||
0x02b9 "ı" # idotless ı LATIN SMALL LETTER DOTLESS I
|
||||
0x02bb "ğ" # gbreve ğ LATIN SMALL LETTER G WITH BREVE
|
||||
0x02bc "ĵ" # jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX
|
||||
0x02c5 "Ċ" # Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE
|
||||
0x02c6 "Ĉ" # Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX
|
||||
0x02d5 "Ġ" # Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE
|
||||
0x02d8 "Ĝ" # Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX
|
||||
0x02dd "Ŭ" # Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE
|
||||
0x02de "Ŝ" # Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX
|
||||
0x02e5 "ċ" # cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE
|
||||
0x02e6 "ĉ" # ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX
|
||||
0x02f5 "ġ" # gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE
|
||||
0x02f8 "ĝ" # gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX
|
||||
0x02fd "ŭ" # ubreve ŭ LATIN SMALL LETTER U WITH BREVE
|
||||
0x02fe "ŝ" # scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX
|
||||
0x03a2 "ĸ" # kra ĸ LATIN SMALL LETTER KRA
|
||||
0x03a3 "Ŗ" # Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA
|
||||
0x03a5 "Ĩ" # Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE
|
||||
0x03a6 "Ļ" # Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA
|
||||
0x03aa "Ē" # Emacron Ē LATIN CAPITAL LETTER E WITH MACRON
|
||||
0x03ab "Ģ" # Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA
|
||||
0x03ac "Ŧ" # Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE
|
||||
0x03b3 "ŗ" # rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA
|
||||
0x03b5 "ĩ" # itilde ĩ LATIN SMALL LETTER I WITH TILDE
|
||||
0x03b6 "ļ" # lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA
|
||||
0x03ba "ē" # emacron ē LATIN SMALL LETTER E WITH MACRON
|
||||
0x03bb "ģ" # gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA
|
||||
0x03bc "ŧ" # tslash ŧ LATIN SMALL LETTER T WITH STROKE
|
||||
0x03bd "Ŋ" # ENG Ŋ LATIN CAPITAL LETTER ENG
|
||||
0x03bf "ŋ" # eng ŋ LATIN SMALL LETTER ENG
|
||||
0x03c0 "Ā" # Amacron Ā LATIN CAPITAL LETTER A WITH MACRON
|
||||
0x03c7 "Į" # Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK
|
||||
0x03cc "Ė" # Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE
|
||||
0x03cf "Ī" # Imacron Ī LATIN CAPITAL LETTER I WITH MACRON
|
||||
0x03d1 "Ņ" # Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA
|
||||
0x03d2 "Ō" # Omacron Ō LATIN CAPITAL LETTER O WITH MACRON
|
||||
0x03d3 "Ķ" # Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA
|
||||
0x03d9 "Ų" # Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK
|
||||
0x03dd "Ũ" # Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE
|
||||
0x03de "Ū" # Umacron Ū LATIN CAPITAL LETTER U WITH MACRON
|
||||
0x03e0 "ā" # amacron ā LATIN SMALL LETTER A WITH MACRON
|
||||
0x03e7 "į" # iogonek į LATIN SMALL LETTER I WITH OGONEK
|
||||
0x03ec "ė" # eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE
|
||||
0x03ef "ī" # imacron ī LATIN SMALL LETTER I WITH MACRON
|
||||
0x03f1 "ņ" # ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA
|
||||
0x03f2 "ō" # omacron ō LATIN SMALL LETTER O WITH MACRON
|
||||
0x03f3 "ķ" # kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA
|
||||
0x03f9 "ų" # uogonek ų LATIN SMALL LETTER U WITH OGONEK
|
||||
0x03fd "ũ" # utilde ũ LATIN SMALL LETTER U WITH TILDE
|
||||
0x03fe "ū" # umacron ū LATIN SMALL LETTER U WITH MACRON
|
||||
0x047e "‾" # overline ‾ OVERLINE
|
||||
0x04a1 "。" # kana_fullstop 。 IDEOGRAPHIC FULL STOP
|
||||
0x04a2 "「" # kana_openingbracket 「 LEFT CORNER BRACKET
|
||||
0x04a3 "」" # kana_closingbracket 」 RIGHT CORNER BRACKET
|
||||
0x04a4 "、" # kana_comma 、 IDEOGRAPHIC COMMA
|
||||
0x04a5 "・" # kana_conjunctive ・ KATAKANA MIDDLE DOT
|
||||
0x04a6 "ヲ" # kana_WO ヲ KATAKANA LETTER WO
|
||||
0x04a7 "ァ" # kana_a ァ KATAKANA LETTER SMALL A
|
||||
0x04a8 "ィ" # kana_i ィ KATAKANA LETTER SMALL I
|
||||
0x04a9 "ゥ" # kana_u ゥ KATAKANA LETTER SMALL U
|
||||
0x04aa "ェ" # kana_e ェ KATAKANA LETTER SMALL E
|
||||
0x04ab "ォ" # kana_o ォ KATAKANA LETTER SMALL O
|
||||
0x04ac "ャ" # kana_ya ャ KATAKANA LETTER SMALL YA
|
||||
0x04ad "ュ" # kana_yu ュ KATAKANA LETTER SMALL YU
|
||||
0x04ae "ョ" # kana_yo ョ KATAKANA LETTER SMALL YO
|
||||
0x04af "ッ" # kana_tsu ッ KATAKANA LETTER SMALL TU
|
||||
0x04b0 "ー" # prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK
|
||||
0x04b1 "ア" # kana_A ア KATAKANA LETTER A
|
||||
0x04b2 "イ" # kana_I イ KATAKANA LETTER I
|
||||
0x04b3 "ウ" # kana_U ウ KATAKANA LETTER U
|
||||
0x04b4 "エ" # kana_E エ KATAKANA LETTER E
|
||||
0x04b5 "オ" # kana_O オ KATAKANA LETTER O
|
||||
0x04b6 "カ" # kana_KA カ KATAKANA LETTER KA
|
||||
0x04b7 "キ" # kana_KI キ KATAKANA LETTER KI
|
||||
0x04b8 "ク" # kana_KU ク KATAKANA LETTER KU
|
||||
0x04b9 "ケ" # kana_KE ケ KATAKANA LETTER KE
|
||||
0x04ba "コ" # kana_KO コ KATAKANA LETTER KO
|
||||
0x04bb "サ" # kana_SA サ KATAKANA LETTER SA
|
||||
0x04bc "シ" # kana_SHI シ KATAKANA LETTER SI
|
||||
0x04bd "ス" # kana_SU ス KATAKANA LETTER SU
|
||||
0x04be "セ" # kana_SE セ KATAKANA LETTER SE
|
||||
0x04bf "ソ" # kana_SO ソ KATAKANA LETTER SO
|
||||
0x04c0 "タ" # kana_TA タ KATAKANA LETTER TA
|
||||
0x04c1 "チ" # kana_CHI チ KATAKANA LETTER TI
|
||||
0x04c2 "ツ" # kana_TSU ツ KATAKANA LETTER TU
|
||||
0x04c3 "テ" # kana_TE テ KATAKANA LETTER TE
|
||||
0x04c4 "ト" # kana_TO ト KATAKANA LETTER TO
|
||||
0x04c5 "ナ" # kana_NA ナ KATAKANA LETTER NA
|
||||
0x04c6 "ニ" # kana_NI ニ KATAKANA LETTER NI
|
||||
0x04c7 "ヌ" # kana_NU ヌ KATAKANA LETTER NU
|
||||
0x04c8 "ネ" # kana_NE ネ KATAKANA LETTER NE
|
||||
0x04c9 "ノ" # kana_NO ノ KATAKANA LETTER NO
|
||||
0x04ca "ハ" # kana_HA ハ KATAKANA LETTER HA
|
||||
0x04cb "ヒ" # kana_HI ヒ KATAKANA LETTER HI
|
||||
0x04cc "フ" # kana_FU フ KATAKANA LETTER HU
|
||||
0x04cd "ヘ" # kana_HE ヘ KATAKANA LETTER HE
|
||||
0x04ce "ホ" # kana_HO ホ KATAKANA LETTER HO
|
||||
0x04cf "マ" # kana_MA マ KATAKANA LETTER MA
|
||||
0x04d0 "ミ" # kana_MI ミ KATAKANA LETTER MI
|
||||
0x04d1 "ム" # kana_MU ム KATAKANA LETTER MU
|
||||
0x04d2 "メ" # kana_ME メ KATAKANA LETTER ME
|
||||
0x04d3 "モ" # kana_MO モ KATAKANA LETTER MO
|
||||
0x04d4 "ヤ" # kana_YA ヤ KATAKANA LETTER YA
|
||||
0x04d5 "ユ" # kana_YU ユ KATAKANA LETTER YU
|
||||
0x04d6 "ヨ" # kana_YO ヨ KATAKANA LETTER YO
|
||||
0x04d7 "ラ" # kana_RA ラ KATAKANA LETTER RA
|
||||
0x04d8 "リ" # kana_RI リ KATAKANA LETTER RI
|
||||
0x04d9 "ル" # kana_RU ル KATAKANA LETTER RU
|
||||
0x04da "レ" # kana_RE レ KATAKANA LETTER RE
|
||||
0x04db "ロ" # kana_RO ロ KATAKANA LETTER RO
|
||||
0x04dc "ワ" # kana_WA ワ KATAKANA LETTER WA
|
||||
0x04dd "ン" # kana_N ン KATAKANA LETTER N
|
||||
0x04de "゛" # voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK
|
||||
0x04df "゜" # semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
|
||||
0x05ac "،" # Arabic_comma ، ARABIC COMMA
|
||||
0x05bb "؛" # Arabic_semicolon ؛ ARABIC SEMICOLON
|
||||
0x05bf "؟" # Arabic_question_mark ؟ ARABIC QUESTION MARK
|
||||
0x05c1 "ء" # Arabic_hamza ء ARABIC LETTER HAMZA
|
||||
0x05c2 "آ" # Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE
|
||||
0x05c3 "أ" # Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE
|
||||
0x05c4 "ؤ" # Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE
|
||||
0x05c5 "إ" # Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW
|
||||
0x05c6 "ئ" # Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE
|
||||
0x05c7 "ا" # Arabic_alef ا ARABIC LETTER ALEF
|
||||
0x05c8 "ب" # Arabic_beh ب ARABIC LETTER BEH
|
||||
0x05c9 "ة" # Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA
|
||||
0x05ca "ت" # Arabic_teh ت ARABIC LETTER TEH
|
||||
0x05cb "ث" # Arabic_theh ث ARABIC LETTER THEH
|
||||
0x05cc "ج" # Arabic_jeem ج ARABIC LETTER JEEM
|
||||
0x05cd "ح" # Arabic_hah ح ARABIC LETTER HAH
|
||||
0x05ce "خ" # Arabic_khah خ ARABIC LETTER KHAH
|
||||
0x05cf "د" # Arabic_dal د ARABIC LETTER DAL
|
||||
0x05d0 "ذ" # Arabic_thal ذ ARABIC LETTER THAL
|
||||
0x05d1 "ر" # Arabic_ra ر ARABIC LETTER REH
|
||||
0x05d2 "ز" # Arabic_zain ز ARABIC LETTER ZAIN
|
||||
0x05d3 "س" # Arabic_seen س ARABIC LETTER SEEN
|
||||
0x05d4 "ش" # Arabic_sheen ش ARABIC LETTER SHEEN
|
||||
0x05d5 "ص" # Arabic_sad ص ARABIC LETTER SAD
|
||||
0x05d6 "ض" # Arabic_dad ض ARABIC LETTER DAD
|
||||
0x05d7 "ط" # Arabic_tah ط ARABIC LETTER TAH
|
||||
0x05d8 "ظ" # Arabic_zah ظ ARABIC LETTER ZAH
|
||||
0x05d9 "ع" # Arabic_ain ع ARABIC LETTER AIN
|
||||
0x05da "غ" # Arabic_ghain غ ARABIC LETTER GHAIN
|
||||
0x05e0 "ـ" # Arabic_tatweel ـ ARABIC TATWEEL
|
||||
0x05e1 "ف" # Arabic_feh ف ARABIC LETTER FEH
|
||||
0x05e2 "ق" # Arabic_qaf ق ARABIC LETTER QAF
|
||||
0x05e3 "ك" # Arabic_kaf ك ARABIC LETTER KAF
|
||||
0x05e4 "ل" # Arabic_lam ل ARABIC LETTER LAM
|
||||
0x05e5 "م" # Arabic_meem م ARABIC LETTER MEEM
|
||||
0x05e6 "ن" # Arabic_noon ن ARABIC LETTER NOON
|
||||
0x05e7 "ه" # Arabic_ha ه ARABIC LETTER HEH
|
||||
0x05e8 "و" # Arabic_waw و ARABIC LETTER WAW
|
||||
0x05e9 "ى" # Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA
|
||||
0x05ea "ي" # Arabic_yeh ي ARABIC LETTER YEH
|
||||
0x05eb "ً" # Arabic_fathatan ً ARABIC FATHATAN
|
||||
0x05ec "ٌ" # Arabic_dammatan ٌ ARABIC DAMMATAN
|
||||
0x05ed "ٍ" # Arabic_kasratan ٍ ARABIC KASRATAN
|
||||
0x05ee "َ" # Arabic_fatha َ ARABIC FATHA
|
||||
0x05ef "ُ" # Arabic_damma ُ ARABIC DAMMA
|
||||
0x05f0 "ِ" # Arabic_kasra ِ ARABIC KASRA
|
||||
0x05f1 "ّ" # Arabic_shadda ّ ARABIC SHADDA
|
||||
0x05f2 "ْ" # Arabic_sukun ْ ARABIC SUKUN
|
||||
0x06a1 "ђ" # Serbian_dje ђ CYRILLIC SMALL LETTER DJE
|
||||
0x06a2 "ѓ" # Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE
|
||||
0x06a3 "ё" # Cyrillic_io ё CYRILLIC SMALL LETTER IO
|
||||
0x06a4 "є" # Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE
|
||||
0x06a5 "ѕ" # Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE
|
||||
0x06a6 "і" # Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
|
||||
0x06a7 "ї" # Ukrainian_yi ї CYRILLIC SMALL LETTER YI
|
||||
0x06a8 "ј" # Cyrillic_je ј CYRILLIC SMALL LETTER JE
|
||||
0x06a9 "љ" # Cyrillic_lje љ CYRILLIC SMALL LETTER LJE
|
||||
0x06aa "њ" # Cyrillic_nje њ CYRILLIC SMALL LETTER NJE
|
||||
0x06ab "ћ" # Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE
|
||||
0x06ac "ќ" # Macedonia_kje ќ CYRILLIC SMALL LETTER KJE
|
||||
0x06ad "ґ" # Ukrainian_ghe_with_upturn ґ CYRILLIC SMALL LETTER GHE WITH UPTURN
|
||||
0x06ae "ў" # Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U
|
||||
0x06af "џ" # Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE
|
||||
0x06b0 "№" # numerosign № NUMERO SIGN
|
||||
0x06b1 "Ђ" # Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE
|
||||
0x06b2 "Ѓ" # Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE
|
||||
0x06b3 "Ё" # Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO
|
||||
0x06b4 "Є" # Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE
|
||||
0x06b5 "Ѕ" # Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE
|
||||
0x06b6 "І" # Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
|
||||
0x06b7 "Ї" # Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI
|
||||
0x06b8 "Ј" # Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE
|
||||
0x06b9 "Љ" # Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE
|
||||
0x06ba "Њ" # Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE
|
||||
0x06bb "Ћ" # Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE
|
||||
0x06bc "Ќ" # Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE
|
||||
0x06bd "Ґ" # Ukrainian_GHE_WITH_UPTURN Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN
|
||||
0x06be "Ў" # Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U
|
||||
0x06bf "Џ" # Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE
|
||||
0x06c0 "ю" # Cyrillic_yu ю CYRILLIC SMALL LETTER YU
|
||||
0x06c1 "а" # Cyrillic_a а CYRILLIC SMALL LETTER A
|
||||
0x06c2 "б" # Cyrillic_be б CYRILLIC SMALL LETTER BE
|
||||
0x06c3 "ц" # Cyrillic_tse ц CYRILLIC SMALL LETTER TSE
|
||||
0x06c4 "д" # Cyrillic_de д CYRILLIC SMALL LETTER DE
|
||||
0x06c5 "е" # Cyrillic_ie е CYRILLIC SMALL LETTER IE
|
||||
0x06c6 "ф" # Cyrillic_ef ф CYRILLIC SMALL LETTER EF
|
||||
0x06c7 "г" # Cyrillic_ghe г CYRILLIC SMALL LETTER GHE
|
||||
0x06c8 "х" # Cyrillic_ha х CYRILLIC SMALL LETTER HA
|
||||
0x06c9 "и" # Cyrillic_i и CYRILLIC SMALL LETTER I
|
||||
0x06ca "й" # Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I
|
||||
0x06cb "к" # Cyrillic_ka к CYRILLIC SMALL LETTER KA
|
||||
0x06cc "л" # Cyrillic_el л CYRILLIC SMALL LETTER EL
|
||||
0x06cd "м" # Cyrillic_em м CYRILLIC SMALL LETTER EM
|
||||
0x06ce "н" # Cyrillic_en н CYRILLIC SMALL LETTER EN
|
||||
0x06cf "о" # Cyrillic_o о CYRILLIC SMALL LETTER O
|
||||
0x06d0 "п" # Cyrillic_pe п CYRILLIC SMALL LETTER PE
|
||||
0x06d1 "я" # Cyrillic_ya я CYRILLIC SMALL LETTER YA
|
||||
0x06d2 "р" # Cyrillic_er р CYRILLIC SMALL LETTER ER
|
||||
0x06d3 "с" # Cyrillic_es с CYRILLIC SMALL LETTER ES
|
||||
0x06d4 "т" # Cyrillic_te т CYRILLIC SMALL LETTER TE
|
||||
0x06d5 "у" # Cyrillic_u у CYRILLIC SMALL LETTER U
|
||||
0x06d6 "ж" # Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE
|
||||
0x06d7 "в" # Cyrillic_ve в CYRILLIC SMALL LETTER VE
|
||||
0x06d8 "ь" # Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN
|
||||
0x06d9 "ы" # Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU
|
||||
0x06da "з" # Cyrillic_ze з CYRILLIC SMALL LETTER ZE
|
||||
0x06db "ш" # Cyrillic_sha ш CYRILLIC SMALL LETTER SHA
|
||||
0x06dc "э" # Cyrillic_e э CYRILLIC SMALL LETTER E
|
||||
0x06dd "щ" # Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA
|
||||
0x06de "ч" # Cyrillic_che ч CYRILLIC SMALL LETTER CHE
|
||||
0x06df "ъ" # Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN
|
||||
0x06e0 "Ю" # Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU
|
||||
0x06e1 "А" # Cyrillic_A А CYRILLIC CAPITAL LETTER A
|
||||
0x06e2 "Б" # Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE
|
||||
0x06e3 "Ц" # Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE
|
||||
0x06e4 "Д" # Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE
|
||||
0x06e5 "Е" # Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE
|
||||
0x06e6 "Ф" # Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF
|
||||
0x06e7 "Г" # Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE
|
||||
0x06e8 "Х" # Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA
|
||||
0x06e9 "И" # Cyrillic_I И CYRILLIC CAPITAL LETTER I
|
||||
0x06ea "Й" # Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I
|
||||
0x06eb "К" # Cyrillic_KA К CYRILLIC CAPITAL LETTER KA
|
||||
0x06ec "Л" # Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL
|
||||
0x06ed "М" # Cyrillic_EM М CYRILLIC CAPITAL LETTER EM
|
||||
0x06ee "Н" # Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN
|
||||
0x06ef "О" # Cyrillic_O О CYRILLIC CAPITAL LETTER O
|
||||
0x06f0 "П" # Cyrillic_PE П CYRILLIC CAPITAL LETTER PE
|
||||
0x06f1 "Я" # Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA
|
||||
0x06f2 "Р" # Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER
|
||||
0x06f3 "С" # Cyrillic_ES С CYRILLIC CAPITAL LETTER ES
|
||||
0x06f4 "Т" # Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE
|
||||
0x06f5 "У" # Cyrillic_U У CYRILLIC CAPITAL LETTER U
|
||||
0x06f6 "Ж" # Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE
|
||||
0x06f7 "В" # Cyrillic_VE В CYRILLIC CAPITAL LETTER VE
|
||||
0x06f8 "Ь" # Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN
|
||||
0x06f9 "Ы" # Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU
|
||||
0x06fa "З" # Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE
|
||||
0x06fb "Ш" # Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA
|
||||
0x06fc "Э" # Cyrillic_E Э CYRILLIC CAPITAL LETTER E
|
||||
0x06fd "Щ" # Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA
|
||||
0x06fe "Ч" # Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE
|
||||
0x06ff "Ъ" # Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN
|
||||
0x07a1 "Ά" # Geek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS
|
||||
0x07a2 "Έ" # Geek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS
|
||||
0x07a3 "Ή" # Geek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS
|
||||
0x07a4 "Ί" # Geek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS
|
||||
0x07a5 "Ϊ" # Geek_IOTAdieresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
|
||||
0x07a7 "Ό" # Geek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS
|
||||
0x07a8 "Ύ" # Geek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS
|
||||
0x07a9 "Ϋ" # Geek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
|
||||
0x07ab "Ώ" # Geek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS
|
||||
0x07ae "΅" # Geek_accentdieresis ΅ GREEK DIALYTIKA TONOS
|
||||
0x07af "―" # Geek_horizbar ― HORIZONTAL BAR
|
||||
0x07b1 "ά" # Geek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS
|
||||
0x07b2 "έ" # Geek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS
|
||||
0x07b3 "ή" # Geek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS
|
||||
0x07b4 "ί" # Geek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS
|
||||
0x07b5 "ϊ" # Geek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA
|
||||
0x07b6 "ΐ" # Geek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
|
||||
0x07b7 "ό" # Geek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS
|
||||
0x07b8 "ύ" # Geek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS
|
||||
0x07b9 "ϋ" # Geek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA
|
||||
0x07ba "ΰ" # Geek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
|
||||
0x07bb "ώ" # Geek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS
|
||||
0x07c1 "Α" # Geek_ALPHA Α GREEK CAPITAL LETTER ALPHA
|
||||
0x07c2 "Β" # Geek_BETA Β GREEK CAPITAL LETTER BETA
|
||||
0x07c3 "Γ" # Geek_GAMMA Γ GREEK CAPITAL LETTER GAMMA
|
||||
0x07c4 "Δ" # Geek_DELTA Δ GREEK CAPITAL LETTER DELTA
|
||||
0x07c5 "Ε" # Geek_EPSILON Ε GREEK CAPITAL LETTER EPSILON
|
||||
0x07c6 "Ζ" # Geek_ZETA Ζ GREEK CAPITAL LETTER ZETA
|
||||
0x07c7 "Η" # Geek_ETA Η GREEK CAPITAL LETTER ETA
|
||||
0x07c8 "Θ" # Geek_THETA Θ GREEK CAPITAL LETTER THETA
|
||||
0x07c9 "Ι" # Geek_IOTA Ι GREEK CAPITAL LETTER IOTA
|
||||
0x07ca "Κ" # Geek_KAPPA Κ GREEK CAPITAL LETTER KAPPA
|
||||
0x07cb "Λ" # Geek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA
|
||||
0x07cc "Μ" # Geek_MU Μ GREEK CAPITAL LETTER MU
|
||||
0x07cd "Ν" # Geek_NU Ν GREEK CAPITAL LETTER NU
|
||||
0x07ce "Ξ" # Geek_XI Ξ GREEK CAPITAL LETTER XI
|
||||
0x07cf "Ο" # Geek_OMICRON Ο GREEK CAPITAL LETTER OMICRON
|
||||
0x07d0 "Π" # Geek_PI Π GREEK CAPITAL LETTER PI
|
||||
0x07d1 "Ρ" # Geek_RHO Ρ GREEK CAPITAL LETTER RHO
|
||||
0x07d2 "Σ" # Geek_SIGMA Σ GREEK CAPITAL LETTER SIGMA
|
||||
0x07d4 "Τ" # Geek_TAU Τ GREEK CAPITAL LETTER TAU
|
||||
0x07d5 "Υ" # Geek_UPSILON Υ GREEK CAPITAL LETTER UPSILON
|
||||
0x07d6 "Φ" # Geek_PHI Φ GREEK CAPITAL LETTER PHI
|
||||
0x07d7 "Χ" # Geek_CHI Χ GREEK CAPITAL LETTER CHI
|
||||
0x07d8 "Ψ" # Geek_PSI Ψ GREEK CAPITAL LETTER PSI
|
||||
0x07d9 "Ω" # Geek_OMEGA Ω GREEK CAPITAL LETTER OMEGA
|
||||
0x07e1 "α" # Geek_alpha α GREEK SMALL LETTER ALPHA
|
||||
0x07e2 "β" # Geek_beta β GREEK SMALL LETTER BETA
|
||||
0x07e3 "γ" # Geek_gamma γ GREEK SMALL LETTER GAMMA
|
||||
0x07e4 "δ" # Geek_delta δ GREEK SMALL LETTER DELTA
|
||||
0x07e5 "ε" # Geek_epsilon ε GREEK SMALL LETTER EPSILON
|
||||
0x07e6 "ζ" # Geek_zeta ζ GREEK SMALL LETTER ZETA
|
||||
0x07e7 "η" # Geek_eta η GREEK SMALL LETTER ETA
|
||||
0x07e8 "θ" # Geek_theta θ GREEK SMALL LETTER THETA
|
||||
0x07e9 "ι" # Geek_iota ι GREEK SMALL LETTER IOTA
|
||||
0x07ea "κ" # Geek_kappa κ GREEK SMALL LETTER KAPPA
|
||||
0x07eb "λ" # Geek_lambda λ GREEK SMALL LETTER LAMDA
|
||||
0x07ec "μ" # Geek_mu μ GREEK SMALL LETTER MU
|
||||
0x07ed "ν" # Geek_nu ν GREEK SMALL LETTER NU
|
||||
0x07ee "ξ" # Geek_xi ξ GREEK SMALL LETTER XI
|
||||
0x07ef "ο" # Geek_omicron ο GREEK SMALL LETTER OMICRON
|
||||
0x07f0 "π" # Geek_pi π GREEK SMALL LETTER PI
|
||||
0x07f1 "ρ" # Geek_rho ρ GREEK SMALL LETTER RHO
|
||||
0x07f2 "σ" # Geek_sigma σ GREEK SMALL LETTER SIGMA
|
||||
0x07f3 "ς" # Geek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA
|
||||
0x07f4 "τ" # Geek_tau τ GREEK SMALL LETTER TAU
|
||||
0x07f5 "υ" # Geek_upsilon υ GREEK SMALL LETTER UPSILON
|
||||
0x07f6 "φ" # Geek_phi φ GREEK SMALL LETTER PHI
|
||||
0x07f7 "χ" # Geek_chi χ GREEK SMALL LETTER CHI
|
||||
0x07f8 "ψ" # Geek_psi ψ GREEK SMALL LETTER PSI
|
||||
0x07f9 "ω" # Geek_omega ω GREEK SMALL LETTER OMEGA
|
||||
# 0x08a1 leftradical ? ???
|
||||
# 0x08a2 topleftradical ? ???
|
||||
# 0x08a3 horizconnector ? ???
|
||||
0x08a4 "⌠" # topintegral ⌠ TOP HALF INTEGRAL
|
||||
0x08a5 "⌡" # botintegral ⌡ BOTTOM HALF INTEGRAL
|
||||
0x08a6 "│" # vertconnector │ BOX DRAWINGS LIGHT VERTICAL
|
||||
# 0x08a7 topleftsqbracket ? ???
|
||||
# 0x08a8 botleftsqbracket ? ???
|
||||
# 0x08a9 toprightsqbracket ? ???
|
||||
# 0x08aa botrightsqbracket ? ???
|
||||
# 0x08ab topleftparens ? ???
|
||||
# 0x08ac botleftparens ? ???
|
||||
# 0x08ad toprightparens ? ???
|
||||
# 0x08ae botrightparens ? ???
|
||||
# 0x08af leftmiddlecurlybrace ? ???
|
||||
# 0x08b0 rightmiddlecurlybrace ? ???
|
||||
# 0x08b1 topleftsummation ? ???
|
||||
# 0x08b2 botleftsummation ? ???
|
||||
# 0x08b3 topvertsummationconnector ? ???
|
||||
# 0x08b4 botvertsummationconnector ? ???
|
||||
# 0x08b5 toprightsummation ? ???
|
||||
# 0x08b6 botrightsummation ? ???
|
||||
# 0x08b7 rightmiddlesummation ? ???
|
||||
0x08bc "≤" # lessthanequal ≤ LESS-THAN OR EQUAL TO
|
||||
0x08bd "≠" # notequal ≠ NOT EQUAL TO
|
||||
0x08be "≥" # greaterthanequal ≥ GREATER-THAN OR EQUAL TO
|
||||
0x08bf "∫" # integral ∫ INTEGRAL
|
||||
0x08c0 "∴" # therefore ∴ THEREFORE
|
||||
0x08c1 "∝" # variation ∝ PROPORTIONAL TO
|
||||
0x08c2 "∞" # infinity ∞ INFINITY
|
||||
0x08c5 "∇" # nabla ∇ NABLA
|
||||
0x08c8 "≅" # approximate ≅ APPROXIMATELY EQUAL TO
|
||||
# 0x08c9 similarequal ? ???
|
||||
0x08cd "⇔" # ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW
|
||||
0x08ce "⇒" # implies ⇒ RIGHTWARDS DOUBLE ARROW
|
||||
0x08cf "≡" # identical ≡ IDENTICAL TO
|
||||
0x08d6 "√" # radical √ SQUARE ROOT
|
||||
0x08da "⊂" # includedin ⊂ SUBSET OF
|
||||
0x08db "⊃" # includes ⊃ SUPERSET OF
|
||||
0x08dc "∩" # intersection ∩ INTERSECTION
|
||||
0x08dd "∪" # union ∪ UNION
|
||||
0x08de "∧" # logicaland ∧ LOGICAL AND
|
||||
0x08df "∨" # logicalor ∨ LOGICAL OR
|
||||
0x08ef "∂" # partialderivative ∂ PARTIAL DIFFERENTIAL
|
||||
0x08f6 "ƒ" # function ƒ LATIN SMALL LETTER F WITH HOOK
|
||||
0x08fb "←" # leftarrow ← LEFTWARDS ARROW
|
||||
0x08fc "↑" # uparrow ↑ UPWARDS ARROW
|
||||
0x08fd "→" # rightarrow → RIGHTWARDS ARROW
|
||||
0x08fe "↓" # downarrow ↓ DOWNWARDS ARROW
|
||||
0x09df "␢" # blank ␢ BLANK SYMBOL
|
||||
0x09e0 "◆" # soliddiamond ◆ BLACK DIAMOND
|
||||
0x09e1 "▒" # checkerboard ▒ MEDIUM SHADE
|
||||
0x09e2 "␉" # ht ␉ SYMBOL FOR HORIZONTAL TABULATION
|
||||
0x09e3 "␌" # ff ␌ SYMBOL FOR FORM FEED
|
||||
0x09e4 "␍" # cr ␍ SYMBOL FOR CARRIAGE RETURN
|
||||
0x09e5 "␊" # lf ␊ SYMBOL FOR LINE FEED
|
||||
0x09e8 "" # nl  SYMBOL FOR NEWLINE
|
||||
0x09e9 "␋" # vt ␋ SYMBOL FOR VERTICAL TABULATION
|
||||
0x09ea "┘" # lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT
|
||||
0x09eb "┐" # uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT
|
||||
0x09ec "┌" # upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT
|
||||
0x09ed "└" # lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT
|
||||
0x09ee "┼" # crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
|
||||
# 0x09ef horizlinescan1 ? ???
|
||||
# 0x09f0 horizlinescan3 ? ???
|
||||
0x09f1 "─" # horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL
|
||||
# 0x09f2 horizlinescan7 ? ???
|
||||
# 0x09f3 horizlinescan9 ? ???
|
||||
0x09f4 "├" # leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT
|
||||
0x09f5 "┤" # rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT
|
||||
0x09f6 "┴" # bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL
|
||||
0x09f7 "┬" # topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
|
||||
0x09f8 "│" # vertbar │ BOX DRAWINGS LIGHT VERTICAL
|
||||
0x0aa1 " " # emspace EM SPACE
|
||||
0x0aa2 " " # enspace EN SPACE
|
||||
0x0aa3 " " # em3space THREE-PER-EM SPACE
|
||||
0x0aa4 " " # em4space FOUR-PER-EM SPACE
|
||||
0x0aa5 " " # digitspace FIGURE SPACE
|
||||
0x0aa6 " " # punctspace PUNCTUATION SPACE
|
||||
0x0aa7 " " # thinspace THIN SPACE
|
||||
0x0aa8 " " # hairspace HAIR SPACE
|
||||
0x0aa9 "—" # emdash — EM DASH
|
||||
0x0aaa "–" # endash – EN DASH
|
||||
# 0x0aac signifblank ? ???
|
||||
0x0aae "…" # ellipsis … HORIZONTAL ELLIPSIS
|
||||
# 0x0aaf doubbaselinedot ? ???
|
||||
0x0ab0 "⅓" # onethird ⅓ VULGAR FRACTION ONE THIRD
|
||||
0x0ab1 "⅔" # twothirds ⅔ VULGAR FRACTION TWO THIRDS
|
||||
0x0ab2 "⅕" # onefifth ⅕ VULGAR FRACTION ONE FIFTH
|
||||
0x0ab3 "⅖" # twofifths ⅖ VULGAR FRACTION TWO FIFTHS
|
||||
0x0ab4 "⅗" # threefifths ⅗ VULGAR FRACTION THREE FIFTHS
|
||||
0x0ab5 "⅘" # fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS
|
||||
0x0ab6 "⅙" # onesixth ⅙ VULGAR FRACTION ONE SIXTH
|
||||
0x0ab7 "⅚" # fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS
|
||||
0x0ab8 "℅" # careof ℅ CARE OF
|
||||
0x0abb "‒" # figdash ‒ FIGURE DASH
|
||||
0x0abc "〈" # leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET
|
||||
0x0abd "." # decimalpoint . FULL STOP
|
||||
0x0abe "〉" # rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET
|
||||
# 0x0abf marker ? ???
|
||||
0x0ac3 "⅛" # oneeighth ⅛ VULGAR FRACTION ONE EIGHTH
|
||||
0x0ac4 "⅜" # threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS
|
||||
0x0ac5 "⅝" # fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS
|
||||
0x0ac6 "⅞" # seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS
|
||||
0x0ac9 "™" # trademark ™ TRADE MARK SIGN
|
||||
0x0aca "☓" # signaturemark ☓ SALTIRE
|
||||
# 0x0acb trademarkincircle ? ???
|
||||
0x0acc "◁" # leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE
|
||||
0x0acd "▷" # rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE
|
||||
0x0ace "○" # emopencircle ○ WHITE CIRCLE
|
||||
0x0acf "□" # emopenrectangle □ WHITE SQUARE
|
||||
0x0ad0 "‘" # leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK
|
||||
0x0ad1 "’" # rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK
|
||||
0x0ad2 "“" # leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK
|
||||
0x0ad3 "”" # rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK
|
||||
0x0ad4 "℞" # prescription ℞ PRESCRIPTION TAKE
|
||||
0x0ad6 "′" # minutes ′ PRIME
|
||||
0x0ad7 "″" # seconds ″ DOUBLE PRIME
|
||||
0x0ad9 "✝" # latincross ✝ LATIN CROSS
|
||||
# 0x0ada hexagram ? ???
|
||||
0x0adb "▬" # filledrectbullet ▬ BLACK RECTANGLE
|
||||
0x0adc "◀" # filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE
|
||||
0x0add "▶" # filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE
|
||||
0x0ade "●" # emfilledcircle ● BLACK CIRCLE
|
||||
0x0adf "■" # emfilledrect ■ BLACK SQUARE
|
||||
0x0ae0 "◦" # enopencircbullet ◦ WHITE BULLET
|
||||
0x0ae1 "▫" # enopensquarebullet ▫ WHITE SMALL SQUARE
|
||||
0x0ae2 "▭" # openrectbullet ▭ WHITE RECTANGLE
|
||||
0x0ae3 "△" # opentribulletup △ WHITE UP-POINTING TRIANGLE
|
||||
0x0ae4 "▽" # opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE
|
||||
0x0ae5 "☆" # openstar ☆ WHITE STAR
|
||||
0x0ae6 "•" # enfilledcircbullet • BULLET
|
||||
0x0ae7 "▪" # enfilledsqbullet ▪ BLACK SMALL SQUARE
|
||||
0x0ae8 "▲" # filledtribulletup ▲ BLACK UP-POINTING TRIANGLE
|
||||
0x0ae9 "▼" # filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE
|
||||
0x0aea "☜" # leftpointer ☜ WHITE LEFT POINTING INDEX
|
||||
0x0aeb "☞" # rightpointer ☞ WHITE RIGHT POINTING INDEX
|
||||
0x0aec "♣" # club ♣ BLACK CLUB SUIT
|
||||
0x0aed "♦" # diamond ♦ BLACK DIAMOND SUIT
|
||||
0x0aee "♥" # heart ♥ BLACK HEART SUIT
|
||||
0x0af0 "✠" # maltesecross ✠ MALTESE CROSS
|
||||
0x0af1 "†" # dagger † DAGGER
|
||||
0x0af2 "‡" # doubledagger ‡ DOUBLE DAGGER
|
||||
0x0af3 "✓" # checkmark ✓ CHECK MARK
|
||||
0x0af4 "✗" # ballotcross ✗ BALLOT X
|
||||
0x0af5 "♯" # musicalsharp ♯ MUSIC SHARP SIGN
|
||||
0x0af6 "♭" # musicalflat ♭ MUSIC FLAT SIGN
|
||||
0x0af7 "♂" # malesymbol ♂ MALE SIGN
|
||||
0x0af8 "♀" # femalesymbol ♀ FEMALE SIGN
|
||||
0x0af9 "☎" # telephone ☎ BLACK TELEPHONE
|
||||
0x0afa "⌕" # telephonerecorder ⌕ TELEPHONE RECORDER
|
||||
0x0afb "℗" # phonographcopyright ℗ SOUND RECORDING COPYRIGHT
|
||||
0x0afc "‸" # caret ‸ CARET
|
||||
0x0afd "‚" # singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK
|
||||
0x0afe "„" # doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK
|
||||
# 0x0aff cursor ? ???
|
||||
0x0ba3 "<" # leftcaret < LESS-THAN SIGN
|
||||
0x0ba6 ">" # rightcaret > GREATER-THAN SIGN
|
||||
0x0ba8 "∨" # downcaret ∨ LOGICAL OR
|
||||
0x0ba9 "∧" # upcaret ∧ LOGICAL AND
|
||||
0x0bc0 "¯" # overbar ¯ MACRON
|
||||
0x0bc2 "⊤" # downtack ⊤ DOWN TACK
|
||||
0x0bc3 "∩" # upshoe ∩ INTERSECTION
|
||||
0x0bc4 "⌊" # downstile ⌊ LEFT FLOOR
|
||||
0x0bc6 "_" # underbar _ LOW LINE
|
||||
0x0bca "∘" # jot ∘ RING OPERATOR
|
||||
0x0bcc "⎕" # quad ⎕ APL FUNCTIONAL SYMBOL QUAD (Unicode 3.0)
|
||||
0x0bce "⊥" # uptack ⊥ UP TACK
|
||||
0x0bcf "○" # circle ○ WHITE CIRCLE
|
||||
0x0bd3 "⌈" # upstile ⌈ LEFT CEILING
|
||||
0x0bd6 "∪" # downshoe ∪ UNION
|
||||
0x0bd8 "⊃" # rightshoe ⊃ SUPERSET OF
|
||||
0x0bda "⊂" # leftshoe ⊂ SUBSET OF
|
||||
0x0bdc "⊣" # lefttack ⊣ LEFT TACK
|
||||
0x0bfc "⊢" # righttack ⊢ RIGHT TACK
|
||||
0x0cdf "‗" # hebrew_doublelowline ‗ DOUBLE LOW LINE
|
||||
0x0ce0 "א" # hebrew_aleph א HEBREW LETTER ALEF
|
||||
0x0ce1 "ב" # hebrew_bet ב HEBREW LETTER BET
|
||||
0x0ce2 "ג" # hebrew_gimel ג HEBREW LETTER GIMEL
|
||||
0x0ce3 "ד" # hebrew_dalet ד HEBREW LETTER DALET
|
||||
0x0ce4 "ה" # hebrew_he ה HEBREW LETTER HE
|
||||
0x0ce5 "ו" # hebrew_waw ו HEBREW LETTER VAV
|
||||
0x0ce6 "ז" # hebrew_zain ז HEBREW LETTER ZAYIN
|
||||
0x0ce7 "ח" # hebrew_chet ח HEBREW LETTER HET
|
||||
0x0ce8 "ט" # hebrew_tet ט HEBREW LETTER TET
|
||||
0x0ce9 "י" # hebrew_yod י HEBREW LETTER YOD
|
||||
0x0cea "ך" # hebrew_finalkaph ך HEBREW LETTER FINAL KAF
|
||||
0x0ceb "כ" # hebrew_kaph כ HEBREW LETTER KAF
|
||||
0x0cec "ל" # hebrew_lamed ל HEBREW LETTER LAMED
|
||||
0x0ced "ם" # hebrew_finalmem ם HEBREW LETTER FINAL MEM
|
||||
0x0cee "מ" # hebrew_mem מ HEBREW LETTER MEM
|
||||
0x0cef "ן" # hebrew_finalnun ן HEBREW LETTER FINAL NUN
|
||||
0x0cf0 "נ" # hebrew_nun נ HEBREW LETTER NUN
|
||||
0x0cf1 "ס" # hebrew_samech ס HEBREW LETTER SAMEKH
|
||||
0x0cf2 "ע" # hebrew_ayin ע HEBREW LETTER AYIN
|
||||
0x0cf3 "ף" # hebrew_finalpe ף HEBREW LETTER FINAL PE
|
||||
0x0cf4 "פ" # hebrew_pe פ HEBREW LETTER PE
|
||||
0x0cf5 "ץ" # hebrew_finalzade ץ HEBREW LETTER FINAL TSADI
|
||||
0x0cf6 "צ" # hebrew_zade צ HEBREW LETTER TSADI
|
||||
0x0cf7 "ק" # hebrew_qoph ק HEBREW LETTER QOF
|
||||
0x0cf8 "ר" # hebrew_resh ר HEBREW LETTER RESH
|
||||
0x0cf9 "ש" # hebrew_shin ש HEBREW LETTER SHIN
|
||||
0x0cfa "ת" # hebrew_taw ת HEBREW LETTER TAV
|
||||
0x0da1 "ก" # Thai_kokai ก THAI CHARACTER KO KAI
|
||||
0x0da2 "ข" # Thai_khokhai ข THAI CHARACTER KHO KHAI
|
||||
0x0da3 "ฃ" # Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT
|
||||
0x0da4 "ค" # Thai_khokhwai ค THAI CHARACTER KHO KHWAI
|
||||
0x0da5 "ฅ" # Thai_khokhon ฅ THAI CHARACTER KHO KHON
|
||||
0x0da6 "ฆ" # Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG
|
||||
0x0da7 "ง" # Thai_ngongu ง THAI CHARACTER NGO NGU
|
||||
0x0da8 "จ" # Thai_chochan จ THAI CHARACTER CHO CHAN
|
||||
0x0da9 "ฉ" # Thai_choching ฉ THAI CHARACTER CHO CHING
|
||||
0x0daa "ช" # Thai_chochang ช THAI CHARACTER CHO CHANG
|
||||
0x0dab "ซ" # Thai_soso ซ THAI CHARACTER SO SO
|
||||
0x0dac "ฌ" # Thai_chochoe ฌ THAI CHARACTER CHO CHOE
|
||||
0x0dad "ญ" # Thai_yoying ญ THAI CHARACTER YO YING
|
||||
0x0dae "ฎ" # Thai_dochada ฎ THAI CHARACTER DO CHADA
|
||||
0x0daf "ฏ" # Thai_topatak ฏ THAI CHARACTER TO PATAK
|
||||
0x0db0 "ฐ" # Thai_thothan ฐ THAI CHARACTER THO THAN
|
||||
0x0db1 "ฑ" # Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO
|
||||
0x0db2 "ฒ" # Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO
|
||||
0x0db3 "ณ" # Thai_nonen ณ THAI CHARACTER NO NEN
|
||||
0x0db4 "ด" # Thai_dodek ด THAI CHARACTER DO DEK
|
||||
0x0db5 "ต" # Thai_totao ต THAI CHARACTER TO TAO
|
||||
0x0db6 "ถ" # Thai_thothung ถ THAI CHARACTER THO THUNG
|
||||
0x0db7 "ท" # Thai_thothahan ท THAI CHARACTER THO THAHAN
|
||||
0x0db8 "ธ" # Thai_thothong ธ THAI CHARACTER THO THONG
|
||||
0x0db9 "น" # Thai_nonu น THAI CHARACTER NO NU
|
||||
0x0dba "บ" # Thai_bobaimai บ THAI CHARACTER BO BAIMAI
|
||||
0x0dbb "ป" # Thai_popla ป THAI CHARACTER PO PLA
|
||||
0x0dbc "ผ" # Thai_phophung ผ THAI CHARACTER PHO PHUNG
|
||||
0x0dbd "ฝ" # Thai_fofa ฝ THAI CHARACTER FO FA
|
||||
0x0dbe "พ" # Thai_phophan พ THAI CHARACTER PHO PHAN
|
||||
0x0dbf "ฟ" # Thai_fofan ฟ THAI CHARACTER FO FAN
|
||||
0x0dc0 "ภ" # Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO
|
||||
0x0dc1 "ม" # Thai_moma ม THAI CHARACTER MO MA
|
||||
0x0dc2 "ย" # Thai_yoyak ย THAI CHARACTER YO YAK
|
||||
0x0dc3 "ร" # Thai_rorua ร THAI CHARACTER RO RUA
|
||||
0x0dc4 "ฤ" # Thai_ru ฤ THAI CHARACTER RU
|
||||
0x0dc5 "ล" # Thai_loling ล THAI CHARACTER LO LING
|
||||
0x0dc6 "ฦ" # Thai_lu ฦ THAI CHARACTER LU
|
||||
0x0dc7 "ว" # Thai_wowaen ว THAI CHARACTER WO WAEN
|
||||
0x0dc8 "ศ" # Thai_sosala ศ THAI CHARACTER SO SALA
|
||||
0x0dc9 "ษ" # Thai_sorusi ษ THAI CHARACTER SO RUSI
|
||||
0x0dca "ส" # Thai_sosua ส THAI CHARACTER SO SUA
|
||||
0x0dcb "ห" # Thai_hohip ห THAI CHARACTER HO HIP
|
||||
0x0dcc "ฬ" # Thai_lochula ฬ THAI CHARACTER LO CHULA
|
||||
0x0dcd "อ" # Thai_oang อ THAI CHARACTER O ANG
|
||||
0x0dce "ฮ" # Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK
|
||||
0x0dcf "ฯ" # Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI
|
||||
0x0dd0 "ะ" # Thai_saraa ะ THAI CHARACTER SARA A
|
||||
0x0dd1 "ั" # Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT
|
||||
0x0dd2 "า" # Thai_saraaa า THAI CHARACTER SARA AA
|
||||
0x0dd3 "ำ" # Thai_saraam ำ THAI CHARACTER SARA AM
|
||||
0x0dd4 "ิ" # Thai_sarai ิ THAI CHARACTER SARA I
|
||||
0x0dd5 "ี" # Thai_saraii ี THAI CHARACTER SARA II
|
||||
0x0dd6 "ึ" # Thai_saraue ึ THAI CHARACTER SARA UE
|
||||
0x0dd7 "ื" # Thai_sarauee ื THAI CHARACTER SARA UEE
|
||||
0x0dd8 "ุ" # Thai_sarau ุ THAI CHARACTER SARA U
|
||||
0x0dd9 "ู" # Thai_sarauu ู THAI CHARACTER SARA UU
|
||||
0x0dda "ฺ" # Thai_phinthu ฺ THAI CHARACTER PHINTHU
|
||||
0x0dde "" # Thai_maihanakat_maitho ???
|
||||
0x0ddf "฿" # Thai_baht ฿ THAI CURRENCY SYMBOL BAHT
|
||||
0x0de0 "เ" # Thai_sarae เ THAI CHARACTER SARA E
|
||||
0x0de1 "แ" # Thai_saraae แ THAI CHARACTER SARA AE
|
||||
0x0de2 "โ" # Thai_sarao โ THAI CHARACTER SARA O
|
||||
0x0de3 "ใ" # Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN
|
||||
0x0de4 "ไ" # Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI
|
||||
0x0de5 "ๅ" # Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO
|
||||
0x0de6 "ๆ" # Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK
|
||||
0x0de7 "็" # Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU
|
||||
0x0de8 "่" # Thai_maiek ่ THAI CHARACTER MAI EK
|
||||
0x0de9 "้" # Thai_maitho ้ THAI CHARACTER MAI THO
|
||||
0x0dea "๊" # Thai_maitri ๊ THAI CHARACTER MAI TRI
|
||||
0x0deb "๋" # Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA
|
||||
0x0dec "์" # Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT
|
||||
0x0ded "ํ" # Thai_nikhahit ํ THAI CHARACTER NIKHAHIT
|
||||
0x0df0 "๐" # Thai_leksun ๐ THAI DIGIT ZERO
|
||||
0x0df1 "๑" # Thai_leknung ๑ THAI DIGIT ONE
|
||||
0x0df2 "๒" # Thai_leksong ๒ THAI DIGIT TWO
|
||||
0x0df3 "๓" # Thai_leksam ๓ THAI DIGIT THREE
|
||||
0x0df4 "๔" # Thai_leksi ๔ THAI DIGIT FOUR
|
||||
0x0df5 "๕" # Thai_lekha ๕ THAI DIGIT FIVE
|
||||
0x0df6 "๖" # Thai_lekhok ๖ THAI DIGIT SIX
|
||||
0x0df7 "๗" # Thai_lekchet ๗ THAI DIGIT SEVEN
|
||||
0x0df8 "๘" # Thai_lekpaet ๘ THAI DIGIT EIGHT
|
||||
0x0df9 "๙" # Thai_lekkao ๙ THAI DIGIT NINE
|
||||
0x0ea1 "ㄱ" # Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK
|
||||
0x0ea2 "ㄲ" # Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK
|
||||
0x0ea3 "ㄳ" # Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS
|
||||
0x0ea4 "ㄴ" # Hangul_Nieun ㄴ HANGUL LETTER NIEUN
|
||||
0x0ea5 "ㄵ" # Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC
|
||||
0x0ea6 "ㄶ" # Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH
|
||||
0x0ea7 "ㄷ" # Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT
|
||||
0x0ea8 "ㄸ" # Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT
|
||||
0x0ea9 "ㄹ" # Hangul_Rieul ㄹ HANGUL LETTER RIEUL
|
||||
0x0eaa "ㄺ" # Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK
|
||||
0x0eab "ㄻ" # Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM
|
||||
0x0eac "ㄼ" # Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP
|
||||
0x0ead "ㄽ" # Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS
|
||||
0x0eae "ㄾ" # Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH
|
||||
0x0eaf "ㄿ" # Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH
|
||||
0x0eb0 "ㅀ" # Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH
|
||||
0x0eb1 "ㅁ" # Hangul_Mieum ㅁ HANGUL LETTER MIEUM
|
||||
0x0eb2 "ㅂ" # Hangul_Pieub ㅂ HANGUL LETTER PIEUP
|
||||
0x0eb3 "ㅃ" # Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP
|
||||
0x0eb4 "ㅄ" # Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS
|
||||
0x0eb5 "ㅅ" # Hangul_Sios ㅅ HANGUL LETTER SIOS
|
||||
0x0eb6 "ㅆ" # Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS
|
||||
0x0eb7 "ㅇ" # Hangul_Ieung ㅇ HANGUL LETTER IEUNG
|
||||
0x0eb8 "ㅈ" # Hangul_Jieuj ㅈ HANGUL LETTER CIEUC
|
||||
0x0eb9 "ㅉ" # Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC
|
||||
0x0eba "ㅊ" # Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH
|
||||
0x0ebb "ㅋ" # Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH
|
||||
0x0ebc "ㅌ" # Hangul_Tieut ㅌ HANGUL LETTER THIEUTH
|
||||
0x0ebd "ㅍ" # Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH
|
||||
0x0ebe "ㅎ" # Hangul_Hieuh ㅎ HANGUL LETTER HIEUH
|
||||
0x0ebf "ㅏ" # Hangul_A ㅏ HANGUL LETTER A
|
||||
0x0ec0 "ㅐ" # Hangul_AE ㅐ HANGUL LETTER AE
|
||||
0x0ec1 "ㅑ" # Hangul_YA ㅑ HANGUL LETTER YA
|
||||
0x0ec2 "ㅒ" # Hangul_YAE ㅒ HANGUL LETTER YAE
|
||||
0x0ec3 "ㅓ" # Hangul_EO ㅓ HANGUL LETTER EO
|
||||
0x0ec4 "ㅔ" # Hangul_E ㅔ HANGUL LETTER E
|
||||
0x0ec5 "ㅕ" # Hangul_YEO ㅕ HANGUL LETTER YEO
|
||||
0x0ec6 "ㅖ" # Hangul_YE ㅖ HANGUL LETTER YE
|
||||
0x0ec7 "ㅗ" # Hangul_O ㅗ HANGUL LETTER O
|
||||
0x0ec8 "ㅘ" # Hangul_WA ㅘ HANGUL LETTER WA
|
||||
0x0ec9 "ㅙ" # Hangul_WAE ㅙ HANGUL LETTER WAE
|
||||
0x0eca "ㅚ" # Hangul_OE ㅚ HANGUL LETTER OE
|
||||
0x0ecb "ㅛ" # Hangul_YO ㅛ HANGUL LETTER YO
|
||||
0x0ecc "ㅜ" # Hangul_U ㅜ HANGUL LETTER U
|
||||
0x0ecd "ㅝ" # Hangul_WEO ㅝ HANGUL LETTER WEO
|
||||
0x0ece "ㅞ" # Hangul_WE ㅞ HANGUL LETTER WE
|
||||
0x0ecf "ㅟ" # Hangul_WI ㅟ HANGUL LETTER WI
|
||||
0x0ed0 "ㅠ" # Hangul_YU ㅠ HANGUL LETTER YU
|
||||
0x0ed1 "ㅡ" # Hangul_EU ㅡ HANGUL LETTER EU
|
||||
0x0ed2 "ㅢ" # Hangul_YI ㅢ HANGUL LETTER YI
|
||||
0x0ed3 "ㅣ" # Hangul_I ㅣ HANGUL LETTER I
|
||||
0x0ed4 "ᆨ" # Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK
|
||||
0x0ed5 "ᆩ" # Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK
|
||||
0x0ed6 "ᆪ" # Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS
|
||||
0x0ed7 "ᆫ" # Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN
|
||||
0x0ed8 "ᆬ" # Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC
|
||||
0x0ed9 "ᆭ" # Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH
|
||||
0x0eda "ᆮ" # Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT
|
||||
0x0edb "ᆯ" # Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL
|
||||
0x0edc "ᆰ" # Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK
|
||||
0x0edd "ᆱ" # Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM
|
||||
0x0ede "ᆲ" # Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP
|
||||
0x0edf "ᆳ" # Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS
|
||||
0x0ee0 "ᆴ" # Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH
|
||||
0x0ee1 "ᆵ" # Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH
|
||||
0x0ee2 "ᆶ" # Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH
|
||||
0x0ee3 "ᆷ" # Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM
|
||||
0x0ee4 "ᆸ" # Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP
|
||||
0x0ee5 "ᆹ" # Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS
|
||||
0x0ee6 "ᆺ" # Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS
|
||||
0x0ee7 "ᆻ" # Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS
|
||||
0x0ee8 "ᆼ" # Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG
|
||||
0x0ee9 "ᆽ" # Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC
|
||||
0x0eea "ᆾ" # Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH
|
||||
0x0eeb "ᆿ" # Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH
|
||||
0x0eec "ᇀ" # Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH
|
||||
0x0eed "ᇁ" # Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH
|
||||
0x0eee "ᇂ" # Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH
|
||||
0x0eef "ㅭ" # Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH
|
||||
0x0ef0 "ㅱ" # Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM
|
||||
0x0ef1 "ㅸ" # Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP
|
||||
0x0ef2 "ㅿ" # Hangul_PanSios ㅿ HANGUL LETTER PANSIOS
|
||||
# 0x0ef3 Hangul_KkogjiDalrinIeung ? ???
|
||||
0x0ef4 "ㆄ" # Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH
|
||||
0x0ef5 "ㆆ" # Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH
|
||||
0x0ef6 "ㆍ" # Hangul_AraeA ㆍ HANGUL LETTER ARAEA
|
||||
0x0ef7 "ㆎ" # Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE
|
||||
0x0ef8 "ᇫ" # Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS
|
||||
# 0x0ef9 Hangul_J_KkogjiDalrinIeung ? ???
|
||||
0x0efa "ᇹ" # Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH
|
||||
0x0eff "₩" # Korean_Won ₩ WON SIGN
|
||||
0x13bc "Œ" # OE Œ LATIN CAPITAL LIGATURE OE
|
||||
0x13bd "œ" # oe œ LATIN SMALL LIGATURE OE
|
||||
0x13be "Ÿ" # Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS
|
||||
0x20a0 "₠" # EcuSign ₠ EURO-CURRENCY SIGN
|
||||
0x20a1 "₡" # ColonSign ₡ COLON SIGN
|
||||
0x20a2 "₢" # CruzeiroSign ₢ CRUZEIRO SIGN
|
||||
0x20a3 "₣" # FFrancSign ₣ FRENCH FRANC SIGN
|
||||
0x20a4 "₤" # LiraSign ₤ LIRA SIGN
|
||||
0x20a5 "₥" # MillSign ₥ MILL SIGN
|
||||
0x20a6 "₦" # NairaSign ₦ NAIRA SIGN
|
||||
0x20a7 "₧" # PesetaSign ₧ PESETA SIGN
|
||||
0x20a8 "₨" # RupeeSign ₨ RUPEE SIGN
|
||||
0x20a9 "₩" # WonSign ₩ WON SIGN
|
||||
0x20aa "₪" # NewSheqelSign ₪ NEW SHEQEL SIGN
|
||||
0x20ab "₫" # DongSign ₫ DONG SIGN
|
||||
0x20ac "€" # EuroSign € EURO SIGN
|
||||
|
||||
# Following items added to GTK, not in the xterm table
|
||||
|
||||
# Numeric keypad
|
||||
|
||||
# 0xFF80 # Space *
|
||||
0xFFAA "*" # Multiply *
|
||||
0xFFAB "+" # Add *
|
||||
0xFFAC "," # Separator *
|
||||
0xFFAD "-" # Subtract *
|
||||
0xFFAE "." # Decimal *
|
||||
0xFFAF "/" # Divide *
|
||||
0xFFB0 "0" # 0 *
|
||||
0xFFB1 "1" # 1 *
|
||||
0xFFB2 "2" # 2 *
|
||||
0xFFB3 "3" # 3 *
|
||||
0xFFB4 "4" # 4 *
|
||||
0xFFB5 "5" # 5 *
|
||||
0xFFB6 "6" # 6 *
|
||||
0xFFB7 "7" # 7 *
|
||||
0xFFB8 "8" # 8 *
|
||||
0xFFB9 "9" # 9 *
|
||||
0xFFBD "=" # Equal *
|
||||
|
||||
# End numeric keypad
|
||||
Reference in New Issue
Block a user