layout: Remove dead code
This commit is contained in:
@ -1,100 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<keyboards version="0.90">
|
|
||||||
<keyboard id="ar" name="ar"
|
|
||||||
geometry="compact" symbols="ar"
|
|
||||||
longname="Arabic" language="ar"/>
|
|
||||||
<keyboard id="be" name="be"
|
|
||||||
geometry="compact" symbols="be"
|
|
||||||
longname="Belarusian" language="be"/>
|
|
||||||
<keyboard id="fa" name="fa"
|
|
||||||
geometry="compact" symbols="fa"
|
|
||||||
longname="Farsi (ISIRI 2901-1994)" language="fa"/>
|
|
||||||
<keyboard id="he" name="he"
|
|
||||||
geometry="compact" symbols="he"
|
|
||||||
longname="Hebrew" language="he"/>
|
|
||||||
<keyboard id="ja" name="ja"
|
|
||||||
geometry="compact" symbols="ja-kana"
|
|
||||||
longname="Japanese (Kana)" language="ja"/>
|
|
||||||
<keyboard id="kk" name="kk"
|
|
||||||
geometry="compact" symbols="kk"
|
|
||||||
longname="Kazakh" language="kk"/>
|
|
||||||
<keyboard id="ks" name="ks"
|
|
||||||
geometry="compact" symbols="ks"
|
|
||||||
longname="Kashmiri" language="ks"/>
|
|
||||||
<keyboard id="my" name="my"
|
|
||||||
geometry="compact" symbols="my"
|
|
||||||
longname="Myanmar" language="my"/>
|
|
||||||
<keyboard id="nb" name="nb"
|
|
||||||
geometry="extended" symbols="nb"
|
|
||||||
longname="Norwegian" language="nb"/>
|
|
||||||
<keyboard id="ru" name="ru"
|
|
||||||
geometry="compact" symbols="us"
|
|
||||||
longname="Russian" language="ru"/>
|
|
||||||
<keyboard id="th" name="th"
|
|
||||||
geometry="compact" symbols="th"
|
|
||||||
longname="Thai" language="th"/>
|
|
||||||
<keyboard id="ua" name="ua"
|
|
||||||
geometry="compact" symbols="ua"
|
|
||||||
longname="Ukrainian" language="ua"/>
|
|
||||||
<keyboard id="ug" name="ug"
|
|
||||||
geometry="compact" symbols="ug"
|
|
||||||
longname="Uyghur" language="ug"/>
|
|
||||||
<keyboard id="us" name="us"
|
|
||||||
geometry="compact" symbols="us"
|
|
||||||
longname="US" language="en"/>
|
|
||||||
<keyboard id="zh-bopomofo" name="zh-bopomofo"
|
|
||||||
geometry="compact" symbols="zh-bopomofo"
|
|
||||||
longname="Chinese (Bopomofo)" language="zh"/>
|
|
||||||
<!-- Indic Inscript keyboards converted from m17n-lib -->
|
|
||||||
<keyboard id="as-inscript" name="as-inscript"
|
|
||||||
geometry="compact" symbols="as-inscript"
|
|
||||||
longname="Assamese (Inscript)" language="as"/>
|
|
||||||
<keyboard id="bn-inscript" name="bn-inscript"
|
|
||||||
geometry="compact" symbols="bn-inscript"
|
|
||||||
longname="Bengali (Inscript)" language="bn"/>
|
|
||||||
<keyboard id="gu-inscript" name="gu-inscript"
|
|
||||||
geometry="compact" symbols="gu-inscript"
|
|
||||||
longname="Gujarati (Inscript)" language="gu"/>
|
|
||||||
<keyboard id="hi-inscript" name="hi-inscript"
|
|
||||||
geometry="compact" symbols="hi-inscript"
|
|
||||||
longname="Hindi (Inscript)" language="hi"/>
|
|
||||||
<keyboard id="kn-inscript" name="kn-inscript"
|
|
||||||
geometry="compact" symbols="kn-inscript"
|
|
||||||
longname="Kannada (Inscript)" language="kn"/>
|
|
||||||
<keyboard id="ks-inscript" name="ks-inscript"
|
|
||||||
geometry="compact" symbols="ks-inscript"
|
|
||||||
longname="Kashmiri Devanagari (Inscript)" language="ks"/>
|
|
||||||
<keyboard id="mai-inscript" name="mai-inscript"
|
|
||||||
geometry="compact" symbols="mai-inscript"
|
|
||||||
longname="Maithili (Inscript)" language="mai"/>
|
|
||||||
<keyboard id="ml-inscript" name="ml-inscript"
|
|
||||||
geometry="compact" symbols="ml-inscript"
|
|
||||||
longname="Malayalam (Inscript)" language="ml-inscript"/>
|
|
||||||
<keyboard id="mr-inscript" name="mr-inscript"
|
|
||||||
geometry="compact" symbols="mr-inscript"
|
|
||||||
longname="Marathi (Inscript)" language="mr"/>
|
|
||||||
<keyboard id="or-inscript" name="or-inscript"
|
|
||||||
geometry="compact" symbols="or-inscript"
|
|
||||||
longname="Oriya (Inscript)" language="or"/>
|
|
||||||
<keyboard id="pa-inscript" name="pa-inscript"
|
|
||||||
geometry="compact" symbols="pa-inscript"
|
|
||||||
longname="Punjabi (Inscript)" language="pa"/>
|
|
||||||
<keyboard id="sd-inscript" name="sd-inscript"
|
|
||||||
geometry="compact" symbols="sd-inscript"
|
|
||||||
longname="Sindhi (Inscript)" language="sd"/>
|
|
||||||
<keyboard id="ta-inscript" name="ta-inscript"
|
|
||||||
geometry="compact" symbols="ta-inscript"
|
|
||||||
longname="Tamil (Inscript)" language="ta"/>
|
|
||||||
<keyboard id="te-inscript" name="te-inscript"
|
|
||||||
geometry="compact" symbols="te-inscript"
|
|
||||||
longname="Telugu (Inscript)" language="te"/>
|
|
||||||
|
|
||||||
<!-- Common keyboards -->
|
|
||||||
<keyboard id="number" name="number"
|
|
||||||
geometry="number-keypad" symbols="special/number"
|
|
||||||
longname="Numeric keypad" language="all"/>
|
|
||||||
<keyboard id="phone" name="phone"
|
|
||||||
geometry="number-keypad" symbols="special/number"
|
|
||||||
longname="Phone keypad" language="all"/>
|
|
||||||
|
|
||||||
</keyboards>
|
|
||||||
@ -2,7 +2,6 @@
|
|||||||
<gresources>
|
<gresources>
|
||||||
<gresource prefix="/sm/puri/squeekboard">
|
<gresource prefix="/sm/puri/squeekboard">
|
||||||
<file compressed="true">style.css</file>
|
<file compressed="true">style.css</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/keyboards.xml</file>
|
|
||||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ar.xml</file>
|
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/ar.xml</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/as-inscript.xml</file>
|
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/as-inscript.xml</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/be.xml</file>
|
<file compressed="true" preprocess="xml-stripblanks">keyboards/symbols/be.xml</file>
|
||||||
|
|||||||
@ -23,243 +23,12 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include <gio/gio.h> /* GResource */
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "eek-keyboard.h"
|
#include "eek-keyboard.h"
|
||||||
#include "src/keyboard.h"
|
#include "src/keyboard.h"
|
||||||
|
#include "src/layout.h"
|
||||||
#include "squeekboard-resources.h"
|
|
||||||
|
|
||||||
#include "eek-xml-layout.h"
|
#include "eek-xml-layout.h"
|
||||||
|
|
||||||
enum {
|
|
||||||
PROP_0,
|
|
||||||
PROP_ID,
|
|
||||||
PROP_LAST
|
|
||||||
};
|
|
||||||
|
|
||||||
static void initable_iface_init (GInitableIface *initable_iface);
|
|
||||||
|
|
||||||
typedef struct _EekXmlLayoutPrivate
|
|
||||||
{
|
|
||||||
gchar *id;
|
|
||||||
gchar *keyboards_dir;
|
|
||||||
EekXmlKeyboardDesc *desc;
|
|
||||||
} EekXmlLayoutPrivate;
|
|
||||||
|
|
||||||
G_DEFINE_TYPE_EXTENDED (EekXmlLayout, eek_xml_layout, EEK_TYPE_LAYOUT,
|
|
||||||
0, /* GTypeFlags */
|
|
||||||
G_ADD_PRIVATE(EekXmlLayout)
|
|
||||||
G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
|
|
||||||
initable_iface_init))
|
|
||||||
|
|
||||||
G_DEFINE_BOXED_TYPE(EekXmlKeyboardDesc, eek_xml_keyboard_desc, eek_xml_keyboard_desc_copy, eek_xml_keyboard_desc_free);
|
|
||||||
|
|
||||||
#define BUFSIZE 8192
|
|
||||||
|
|
||||||
static GList *parse_keyboards (const gchar *path,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
static gboolean validate (const gchar **valid_path_list,
|
|
||||||
gsize valid_path_list_len,
|
|
||||||
const gchar *element_name,
|
|
||||||
GSList *element_stack,
|
|
||||||
GError **error);
|
|
||||||
|
|
||||||
static gboolean parse (GMarkupParseContext *pcontext,
|
|
||||||
GInputStream *input,
|
|
||||||
GError **error);
|
|
||||||
static const gchar * get_attribute (const gchar **names,
|
|
||||||
const gchar **values,
|
|
||||||
const gchar *name);
|
|
||||||
|
|
||||||
static void
|
|
||||||
keyboard_desc_free (EekXmlKeyboardDesc *desc)
|
|
||||||
{
|
|
||||||
g_free (desc->id);
|
|
||||||
g_free (desc->name);
|
|
||||||
g_free (desc->geometry);
|
|
||||||
g_free (desc->symbols);
|
|
||||||
g_free (desc->longname);
|
|
||||||
g_free (desc->language);
|
|
||||||
g_slice_free (EekXmlKeyboardDesc, desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct _KeyboardsParseData {
|
|
||||||
GSList *element_stack;
|
|
||||||
|
|
||||||
GList *keyboards;
|
|
||||||
};
|
|
||||||
typedef struct _KeyboardsParseData KeyboardsParseData;
|
|
||||||
|
|
||||||
static KeyboardsParseData *
|
|
||||||
keyboards_parse_data_new (void)
|
|
||||||
{
|
|
||||||
return g_slice_new0 (KeyboardsParseData);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
keyboards_parse_data_free (KeyboardsParseData *data)
|
|
||||||
{
|
|
||||||
g_list_free_full (data->keyboards, (GDestroyNotify) keyboard_desc_free);
|
|
||||||
g_slice_free (KeyboardsParseData, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const gchar *keyboards_valid_path_list[] = {
|
|
||||||
"keyboards",
|
|
||||||
"keyboard/keyboards",
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
keyboards_start_element_callback (GMarkupParseContext *pcontext,
|
|
||||||
const gchar *element_name,
|
|
||||||
const gchar **attribute_names,
|
|
||||||
const gchar **attribute_values,
|
|
||||||
gpointer user_data,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
KeyboardsParseData *data = user_data;
|
|
||||||
|
|
||||||
if (!validate (keyboards_valid_path_list,
|
|
||||||
G_N_ELEMENTS (keyboards_valid_path_list),
|
|
||||||
element_name,
|
|
||||||
data->element_stack,
|
|
||||||
error))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (g_strcmp0 (element_name, "keyboard") == 0) {
|
|
||||||
EekXmlKeyboardDesc *desc = g_slice_new0 (EekXmlKeyboardDesc);
|
|
||||||
const gchar *attribute;
|
|
||||||
|
|
||||||
data->keyboards = g_list_prepend (data->keyboards, desc);
|
|
||||||
|
|
||||||
attribute = get_attribute (attribute_names, attribute_values,
|
|
||||||
"id");
|
|
||||||
if (attribute == NULL) {
|
|
||||||
g_set_error (error,
|
|
||||||
G_MARKUP_ERROR,
|
|
||||||
G_MARKUP_ERROR_MISSING_ATTRIBUTE,
|
|
||||||
"no \"id\" attribute for \"keyboard\"");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
desc->id = g_strdup (attribute);
|
|
||||||
|
|
||||||
attribute = get_attribute (attribute_names, attribute_values,
|
|
||||||
"name");
|
|
||||||
if (attribute)
|
|
||||||
desc->name = g_strdup (attribute);
|
|
||||||
|
|
||||||
attribute = get_attribute (attribute_names, attribute_values,
|
|
||||||
"geometry");
|
|
||||||
if (attribute == NULL) {
|
|
||||||
g_set_error (error,
|
|
||||||
G_MARKUP_ERROR,
|
|
||||||
G_MARKUP_ERROR_MISSING_ATTRIBUTE,
|
|
||||||
"no \"geometry\" attribute for \"keyboard\"");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
desc->geometry = g_strdup (attribute);
|
|
||||||
|
|
||||||
attribute = get_attribute (attribute_names, attribute_values,
|
|
||||||
"symbols");
|
|
||||||
if (attribute == NULL) {
|
|
||||||
g_set_error (error,
|
|
||||||
G_MARKUP_ERROR,
|
|
||||||
G_MARKUP_ERROR_MISSING_ATTRIBUTE,
|
|
||||||
"no \"symbols\" attribute for \"keyboard\"");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
desc->symbols = g_strdup (attribute);
|
|
||||||
|
|
||||||
attribute = get_attribute (attribute_names, attribute_values,
|
|
||||||
"longname");
|
|
||||||
if (attribute)
|
|
||||||
desc->longname = g_strdup (attribute);
|
|
||||||
|
|
||||||
attribute = get_attribute (attribute_names, attribute_values,
|
|
||||||
"language");
|
|
||||||
if (attribute)
|
|
||||||
desc->language = g_strdup (attribute);
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
data->element_stack = g_slist_prepend (data->element_stack,
|
|
||||||
g_strdup (element_name));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
keyboards_end_element_callback (GMarkupParseContext *pcontext,
|
|
||||||
const gchar *element_name,
|
|
||||||
gpointer user_data,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
KeyboardsParseData *data = user_data;
|
|
||||||
GSList *head = data->element_stack;
|
|
||||||
|
|
||||||
g_free (head->data);
|
|
||||||
data->element_stack = g_slist_next (data->element_stack);
|
|
||||||
g_slist_free1 (head);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const GMarkupParser keyboards_parser = {
|
|
||||||
keyboards_start_element_callback,
|
|
||||||
keyboards_end_element_callback,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _GeometryParseData {
|
|
||||||
GSList *element_stack;
|
|
||||||
|
|
||||||
EekBounds bounds;
|
|
||||||
struct squeek_view **views;
|
|
||||||
guint view_idx;
|
|
||||||
struct squeek_row *row;
|
|
||||||
gint num_rows;
|
|
||||||
EekOrientation orientation;
|
|
||||||
gdouble corner_radius;
|
|
||||||
GSList *points;
|
|
||||||
gchar *name;
|
|
||||||
EekOutline outline;
|
|
||||||
gchar *outline_id;
|
|
||||||
guint keycode;
|
|
||||||
|
|
||||||
GString *text;
|
|
||||||
|
|
||||||
GArray *outline_array;
|
|
||||||
|
|
||||||
GHashTable *name_button_hash; // char* -> struct squeek_button*
|
|
||||||
GHashTable *keyname_oref_hash; // char* -> guint
|
|
||||||
GHashTable *outlineid_oref_hash; // char* -> guint
|
|
||||||
};
|
|
||||||
typedef struct _GeometryParseData GeometryParseData;
|
|
||||||
|
|
||||||
struct _SymbolsParseData {
|
|
||||||
GSList *element_stack;
|
|
||||||
GString *text;
|
|
||||||
|
|
||||||
LevelKeyboard *keyboard;
|
|
||||||
struct squeek_view *view;
|
|
||||||
|
|
||||||
gchar *label;
|
|
||||||
gchar *icon;
|
|
||||||
gchar *tooltip;
|
|
||||||
guint keyval;
|
|
||||||
};
|
|
||||||
typedef struct _SymbolsParseData SymbolsParseData;
|
|
||||||
|
|
||||||
|
|
||||||
struct _PrerequisitesParseData {
|
|
||||||
GSList *element_stack;
|
|
||||||
GString *text;
|
|
||||||
|
|
||||||
GList *prerequisites;
|
|
||||||
};
|
|
||||||
typedef struct _PrerequisitesParseData PrerequisitesParseData;
|
|
||||||
|
|
||||||
LevelKeyboard *
|
LevelKeyboard *
|
||||||
eek_xml_layout_real_create_keyboard (const char *keyboard_type,
|
eek_xml_layout_real_create_keyboard (const char *keyboard_type,
|
||||||
EekboardContextService *manager)
|
EekboardContextService *manager)
|
||||||
@ -268,310 +37,3 @@ eek_xml_layout_real_create_keyboard (const char *keyboard_type,
|
|||||||
squeek_layout_place_contents(layout);
|
squeek_layout_place_contents(layout);
|
||||||
return level_keyboard_new(manager, layout);
|
return level_keyboard_new(manager, layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
eek_xml_layout_set_property (GObject *object,
|
|
||||||
guint prop_id,
|
|
||||||
const GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
EekXmlLayout *layout = EEK_XML_LAYOUT (object);
|
|
||||||
EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (layout);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case PROP_ID:
|
|
||||||
g_free (priv->id);
|
|
||||||
priv->id = g_value_dup_string (value);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eek_xml_layout_get_property (GObject *object,
|
|
||||||
guint prop_id,
|
|
||||||
GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
EekXmlLayout *layout = EEK_XML_LAYOUT (object);
|
|
||||||
EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (layout);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case PROP_ID:
|
|
||||||
g_value_set_string (value, priv->id);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eek_xml_layout_finalize (GObject *object)
|
|
||||||
{
|
|
||||||
EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (
|
|
||||||
EEK_XML_LAYOUT (object));
|
|
||||||
|
|
||||||
g_free (priv->id);
|
|
||||||
|
|
||||||
if (priv->desc)
|
|
||||||
keyboard_desc_free (priv->desc);
|
|
||||||
|
|
||||||
g_free (priv->keyboards_dir);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (eek_xml_layout_parent_class)->finalize (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eek_xml_layout_class_init (EekXmlLayoutClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
||||||
GParamSpec *pspec;
|
|
||||||
|
|
||||||
gobject_class->set_property = eek_xml_layout_set_property;
|
|
||||||
gobject_class->get_property = eek_xml_layout_get_property;
|
|
||||||
gobject_class->finalize = eek_xml_layout_finalize;
|
|
||||||
|
|
||||||
pspec = g_param_spec_string ("id",
|
|
||||||
"ID",
|
|
||||||
"ID",
|
|
||||||
NULL,
|
|
||||||
G_PARAM_CONSTRUCT_ONLY |
|
|
||||||
G_PARAM_READWRITE);
|
|
||||||
g_object_class_install_property (gobject_class, PROP_ID, pspec);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eek_xml_layout_init (EekXmlLayout *self)
|
|
||||||
{
|
|
||||||
/* void */
|
|
||||||
}
|
|
||||||
|
|
||||||
EekLayout *
|
|
||||||
eek_xml_layout_new (const gchar *id, GError **error)
|
|
||||||
{
|
|
||||||
return (EekLayout *) g_initable_new (EEK_TYPE_XML_LAYOUT,
|
|
||||||
NULL,
|
|
||||||
error,
|
|
||||||
"id", id,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
initable_init (GInitable *initable,
|
|
||||||
GCancellable *cancellable,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
EekXmlLayout *layout = EEK_XML_LAYOUT (initable);
|
|
||||||
EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (layout);
|
|
||||||
GList *keyboards, *p;
|
|
||||||
gchar *path;
|
|
||||||
EekXmlKeyboardDesc *desc;
|
|
||||||
|
|
||||||
priv->keyboards_dir = g_strdup ((gchar *) g_getenv ("EEKBOARD_KEYBOARDSDIR"));
|
|
||||||
|
|
||||||
if (priv->keyboards_dir == NULL)
|
|
||||||
priv->keyboards_dir = g_strdup ("resource:///sm/puri/squeekboard/keyboards/");
|
|
||||||
|
|
||||||
path = g_build_filename (priv->keyboards_dir, "keyboards.xml", NULL);
|
|
||||||
keyboards = parse_keyboards (path, error);
|
|
||||||
g_free (path);
|
|
||||||
if (error && *error)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
for (p = keyboards; p; p = p->next) {
|
|
||||||
desc = p->data;
|
|
||||||
if (g_strcmp0 (desc->id, priv->id) == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (p == NULL) {
|
|
||||||
g_set_error (error,
|
|
||||||
EEK_ERROR,
|
|
||||||
EEK_ERROR_LAYOUT_ERROR,
|
|
||||||
"no such keyboard %s",
|
|
||||||
priv->id);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
keyboards = g_list_remove_link (keyboards, p);
|
|
||||||
priv->desc = p->data;
|
|
||||||
g_list_free_1 (p);
|
|
||||||
g_list_free_full (keyboards, (GDestroyNotify) keyboard_desc_free);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
initable_iface_init (GInitableIface *initable_iface)
|
|
||||||
{
|
|
||||||
initable_iface->init = initable_init;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* eek_xml_list_keyboards:
|
|
||||||
*
|
|
||||||
* List available keyboards.
|
|
||||||
* Returns: (transfer container) (element-type utf8): the list of keyboards
|
|
||||||
*/
|
|
||||||
GList *
|
|
||||||
eek_xml_list_keyboards (void)
|
|
||||||
{
|
|
||||||
const gchar *keyboards_dir;
|
|
||||||
gchar *path;
|
|
||||||
GList *keyboards;
|
|
||||||
|
|
||||||
keyboards_dir = g_getenv ("EEKBOARD_KEYBOARDSDIR");
|
|
||||||
if (keyboards_dir == NULL)
|
|
||||||
keyboards_dir = g_strdup ("resource:///sm/puri/squeekboard/keyboards/");
|
|
||||||
path = g_build_filename (keyboards_dir, "keyboards.xml", NULL);
|
|
||||||
keyboards = parse_keyboards (path, NULL);
|
|
||||||
g_free (path);
|
|
||||||
return keyboards;
|
|
||||||
}
|
|
||||||
|
|
||||||
EekXmlKeyboardDesc *
|
|
||||||
eek_xml_keyboard_desc_copy (EekXmlKeyboardDesc *desc)
|
|
||||||
{
|
|
||||||
return g_slice_dup (EekXmlKeyboardDesc, desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
eek_xml_keyboard_desc_free (EekXmlKeyboardDesc *desc)
|
|
||||||
{
|
|
||||||
g_free (desc->id);
|
|
||||||
g_free (desc->name);
|
|
||||||
g_free (desc->geometry);
|
|
||||||
g_free (desc->symbols);
|
|
||||||
g_free (desc->language);
|
|
||||||
g_free (desc->longname);
|
|
||||||
g_slice_free (EekXmlKeyboardDesc, desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GList *
|
|
||||||
parse_keyboards (const gchar *path, GError **error)
|
|
||||||
{
|
|
||||||
KeyboardsParseData *data;
|
|
||||||
GMarkupParseContext *pcontext;
|
|
||||||
GFile *file;
|
|
||||||
GFileInputStream *input;
|
|
||||||
GList *keyboards;
|
|
||||||
gboolean retval;
|
|
||||||
|
|
||||||
file = g_str_has_prefix (path, "resource://")
|
|
||||||
? g_file_new_for_uri (path)
|
|
||||||
: g_file_new_for_path (path);
|
|
||||||
|
|
||||||
input = g_file_read (file, NULL, error);
|
|
||||||
g_object_unref (file);
|
|
||||||
if (input == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
data = keyboards_parse_data_new ();
|
|
||||||
pcontext = g_markup_parse_context_new (&keyboards_parser,
|
|
||||||
0,
|
|
||||||
data,
|
|
||||||
NULL);
|
|
||||||
retval = parse (pcontext, G_INPUT_STREAM (input), error);
|
|
||||||
g_object_unref (input);
|
|
||||||
g_markup_parse_context_free (pcontext);
|
|
||||||
if (!retval) {
|
|
||||||
keyboards_parse_data_free (data);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
keyboards = data->keyboards;
|
|
||||||
data->keyboards = NULL;
|
|
||||||
keyboards_parse_data_free (data);
|
|
||||||
return keyboards;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
validate (const gchar **valid_path_list,
|
|
||||||
gsize valid_path_list_len,
|
|
||||||
const gchar *element_name,
|
|
||||||
GSList *element_stack,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
guint i;
|
|
||||||
gchar *element_path;
|
|
||||||
GSList *head, *p;
|
|
||||||
GString *string;
|
|
||||||
|
|
||||||
head = g_slist_prepend (element_stack, (gchar *)element_name);
|
|
||||||
string = g_string_sized_new (64);
|
|
||||||
for (p = head; p; p = p->next) {
|
|
||||||
g_string_append (string, p->data);
|
|
||||||
if (g_slist_next (p))
|
|
||||||
g_string_append (string, "/");
|
|
||||||
}
|
|
||||||
element_path = g_string_free (string, FALSE);
|
|
||||||
g_slist_free1 (head);
|
|
||||||
|
|
||||||
for (i = 0; i < valid_path_list_len; i++)
|
|
||||||
if (g_strcmp0 (element_path, valid_path_list[i]) == 0)
|
|
||||||
break;
|
|
||||||
g_free (element_path);
|
|
||||||
|
|
||||||
if (i == valid_path_list_len) {
|
|
||||||
gchar *reverse_element_path;
|
|
||||||
|
|
||||||
head = g_slist_reverse (g_slist_copy (element_stack));
|
|
||||||
string = g_string_sized_new (64);
|
|
||||||
for (p = head; p; p = p->next) {
|
|
||||||
g_string_append (string, p->data);
|
|
||||||
if (g_slist_next (p))
|
|
||||||
g_string_append (string, "/");
|
|
||||||
}
|
|
||||||
reverse_element_path = g_string_free (string, FALSE);
|
|
||||||
|
|
||||||
abort ();
|
|
||||||
g_set_error (error,
|
|
||||||
G_MARKUP_ERROR,
|
|
||||||
G_MARKUP_ERROR_UNKNOWN_ELEMENT,
|
|
||||||
"%s cannot appear as %s",
|
|
||||||
element_name,
|
|
||||||
reverse_element_path);
|
|
||||||
g_free (reverse_element_path);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
parse (GMarkupParseContext *pcontext,
|
|
||||||
GInputStream *input,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
gchar buffer[BUFSIZE];
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
gssize nread = g_input_stream_read (input,
|
|
||||||
buffer,
|
|
||||||
sizeof (buffer),
|
|
||||||
NULL,
|
|
||||||
error);
|
|
||||||
if (nread < 0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (nread == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (!g_markup_parse_context_parse (pcontext, buffer, nread, error))
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return g_markup_parse_context_end_parse (pcontext, error);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const gchar *
|
|
||||||
get_attribute (const gchar **names, const gchar **values, const gchar *name)
|
|
||||||
{
|
|
||||||
for (; *names && *values; names++, values++) {
|
|
||||||
if (g_strcmp0 (*names, name) == 0)
|
|
||||||
return *values;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|||||||
@ -23,45 +23,9 @@
|
|||||||
#ifndef EEK_XML_LAYOUT_H
|
#ifndef EEK_XML_LAYOUT_H
|
||||||
#define EEK_XML_LAYOUT_H 1
|
#define EEK_XML_LAYOUT_H 1
|
||||||
|
|
||||||
#include <gio/gio.h>
|
#include "eek-types.h"
|
||||||
#include "eek-layout.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#define EEK_TYPE_XML_LAYOUT (eek_xml_layout_get_type())
|
|
||||||
G_DECLARE_DERIVABLE_TYPE (EekXmlLayout, eek_xml_layout, EEK, XML_LAYOUT, EekLayout)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* EekXmlLayoutClass:
|
|
||||||
*/
|
|
||||||
struct _EekXmlLayoutClass
|
|
||||||
{
|
|
||||||
/*< private >*/
|
|
||||||
EekLayoutClass parent_class;
|
|
||||||
|
|
||||||
/* padding */
|
|
||||||
gpointer pdummy[24];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _EekXmlKeyboardDesc
|
|
||||||
{
|
|
||||||
gchar *id;
|
|
||||||
gchar *name;
|
|
||||||
gchar *geometry;
|
|
||||||
gchar *symbols;
|
|
||||||
gchar *language;
|
|
||||||
gchar *longname;
|
|
||||||
};
|
|
||||||
typedef struct _EekXmlKeyboardDesc EekXmlKeyboardDesc;
|
|
||||||
|
|
||||||
GType eek_xml_layout_get_type (void) G_GNUC_CONST;
|
|
||||||
EekLayout *eek_xml_layout_new (const gchar *id,
|
|
||||||
GError **error);
|
|
||||||
GList *eek_xml_list_keyboards (void);
|
|
||||||
|
|
||||||
EekXmlKeyboardDesc *eek_xml_keyboard_desc_copy (EekXmlKeyboardDesc *desc);
|
|
||||||
void eek_xml_keyboard_desc_free (EekXmlKeyboardDesc *desc);
|
|
||||||
|
|
||||||
LevelKeyboard *
|
LevelKeyboard *
|
||||||
eek_xml_layout_real_create_keyboard (const char *keyboard_type,
|
eek_xml_layout_real_create_keyboard (const char *keyboard_type,
|
||||||
EekboardContextService *manager);
|
EekboardContextService *manager);
|
||||||
|
|||||||
Reference in New Issue
Block a user