Add keyboard selection dialog to preferences.
This commit is contained in:
@ -119,7 +119,7 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
GtkAllocation allocation;
|
||||
EekColor background;
|
||||
GList *head;
|
||||
GList *list, *head;
|
||||
|
||||
gtk_widget_get_allocation (self, &allocation);
|
||||
|
||||
@ -164,16 +164,18 @@ eek_gtk_keyboard_real_draw (GtkWidget *self,
|
||||
eek_renderer_render_keyboard (priv->renderer, cr);
|
||||
|
||||
/* redraw pressed key */
|
||||
head = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (; head; head = g_list_next (head)) {
|
||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head)) {
|
||||
render_pressed_key (self, head->data);
|
||||
}
|
||||
g_list_free (list);
|
||||
|
||||
/* redraw locked key */
|
||||
head = eek_keyboard_get_locked_keys (priv->keyboard);
|
||||
for (; head; head = g_list_next (head)) {
|
||||
list = eek_keyboard_get_locked_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head)) {
|
||||
render_locked_key (self, ((EekModifierKey *)head->data)->key);
|
||||
}
|
||||
g_list_free (list);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@ -213,16 +215,12 @@ eek_gtk_keyboard_real_button_release_event (GtkWidget *self,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
GList *head = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
GList *list, *head;
|
||||
|
||||
/* Make a copy of HEAD before sending "released" signal on
|
||||
elements, so that the default handler of
|
||||
EekKeyboard::key-released signal can remove elements from its
|
||||
internal copy */
|
||||
head = g_list_copy (head);
|
||||
for (; head; head = g_list_next (head))
|
||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head))
|
||||
g_signal_emit_by_name (head->data, "released", priv->keyboard);
|
||||
g_list_free (head);
|
||||
g_list_free (list);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@ -238,21 +236,17 @@ eek_gtk_keyboard_real_motion_notify_event (GtkWidget *self,
|
||||
(gdouble)event->x,
|
||||
(gdouble)event->y);
|
||||
if (key) {
|
||||
GList *head = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
GList *list, *head;
|
||||
gboolean found = FALSE;
|
||||
|
||||
/* Make a copy of HEAD before sending "cancelled" signal on
|
||||
elements, so that the default handler of
|
||||
EekKeyboard::key-cancelled signal can remove elements from its
|
||||
internal copy */
|
||||
head = g_list_copy (head);
|
||||
for (; head; head = g_list_next (head)) {
|
||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head)) {
|
||||
if (head->data == key)
|
||||
found = TRUE;
|
||||
else
|
||||
g_signal_emit_by_name (head->data, "cancelled", priv->keyboard);
|
||||
}
|
||||
g_list_free (head);
|
||||
g_list_free (list);
|
||||
|
||||
if (!found)
|
||||
g_signal_emit_by_name (key, "pressed", priv->keyboard);
|
||||
@ -266,16 +260,16 @@ eek_gtk_keyboard_real_unmap (GtkWidget *self)
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
|
||||
|
||||
if (priv->keyboard) {
|
||||
GList *head = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
GList *list, *head;
|
||||
|
||||
/* Make a copy of HEAD before sending "released" signal on
|
||||
elements, so that the default handler of
|
||||
EekKeyboard::key-released signal can remove elements from its
|
||||
internal copy */
|
||||
head = g_list_copy (head);
|
||||
for (; head; head = g_list_next (head))
|
||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head))
|
||||
g_signal_emit_by_name (head->data, "released", priv->keyboard);
|
||||
g_list_free (head);
|
||||
g_list_free (list);
|
||||
}
|
||||
|
||||
GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->unmap (self);
|
||||
@ -363,12 +357,13 @@ eek_gtk_keyboard_dispose (GObject *object)
|
||||
g_signal_handler_disconnect (priv->keyboard,
|
||||
priv->symbol_index_changed_handler);
|
||||
|
||||
GList *head;
|
||||
GList *list, *head;
|
||||
|
||||
head = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (; head; head = g_list_next (head)) {
|
||||
list = eek_keyboard_get_pressed_keys (priv->keyboard);
|
||||
for (head = list; head; head = g_list_next (head)) {
|
||||
g_signal_emit_by_name (head->data, "released", priv->keyboard);
|
||||
}
|
||||
g_list_free (list);
|
||||
|
||||
g_object_unref (priv->keyboard);
|
||||
priv->keyboard = NULL;
|
||||
|
||||
@ -74,6 +74,22 @@ struct _EekKeyboardPrivate
|
||||
EekModifierType alt_gr_mask;
|
||||
};
|
||||
|
||||
G_DEFINE_BOXED_TYPE(EekModifierKey, eek_modifier_key,
|
||||
eek_modifier_key_copy, eek_modifier_key_free);
|
||||
|
||||
EekModifierKey *
|
||||
eek_modifier_key_copy (EekModifierKey *modkey)
|
||||
{
|
||||
return g_slice_dup (EekModifierKey, modkey);
|
||||
}
|
||||
|
||||
void
|
||||
eek_modifier_key_free (EekModifierKey *modkey)
|
||||
{
|
||||
g_object_unref (modkey->key);
|
||||
g_slice_free (EekModifierKey, modkey);
|
||||
}
|
||||
|
||||
static void
|
||||
on_key_pressed (EekSection *section,
|
||||
EekKey *key,
|
||||
@ -240,7 +256,7 @@ set_modifiers_with_key (EekKeyboard *self,
|
||||
if (priv->modifier_behavior != EEK_MODIFIER_BEHAVIOR_NONE) {
|
||||
EekModifierKey *modifier_key = g_slice_new (EekModifierKey);
|
||||
modifier_key->modifiers = enabled;
|
||||
modifier_key->key = key;
|
||||
modifier_key->key = g_object_ref (key);
|
||||
priv->locked_keys =
|
||||
g_list_prepend (priv->locked_keys, modifier_key);
|
||||
g_signal_emit_by_name (modifier_key->key, "locked");
|
||||
@ -356,7 +372,8 @@ eek_keyboard_finalize (GObject *object)
|
||||
gint i;
|
||||
|
||||
g_list_free (priv->pressed_keys);
|
||||
g_list_free (priv->locked_keys);
|
||||
g_list_free_full (priv->locked_keys,
|
||||
(GDestroyNotify) eek_modifier_key_free);
|
||||
|
||||
for (i = 0; i < priv->outline_array->len; i++) {
|
||||
EekOutline *outline = &g_array_index (priv->outline_array,
|
||||
@ -810,7 +827,7 @@ GList *
|
||||
eek_keyboard_get_pressed_keys (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
|
||||
return keyboard->priv->pressed_keys;
|
||||
return g_list_copy (keyboard->priv->pressed_keys);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -825,5 +842,5 @@ GList *
|
||||
eek_keyboard_get_locked_keys (EekKeyboard *keyboard)
|
||||
{
|
||||
g_return_val_if_fail (EEK_IS_KEYBOARD(keyboard), NULL);
|
||||
return keyboard->priv->locked_keys;
|
||||
return g_list_copy (keyboard->priv->locked_keys);
|
||||
}
|
||||
|
||||
@ -183,5 +183,10 @@ GList *eek_keyboard_get_pressed_keys
|
||||
GList *eek_keyboard_get_locked_keys
|
||||
(EekKeyboard *keyboard);
|
||||
|
||||
EekModifierKey *eek_modifier_key_copy
|
||||
(EekModifierKey *modkey);
|
||||
void eek_modifier_key_free
|
||||
(EekModifierKey *modkey);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_KEYBOARD_H */
|
||||
|
||||
@ -56,11 +56,13 @@ struct _EekXmlLayoutPrivate
|
||||
EekXmlKeyboardDesc *desc;
|
||||
};
|
||||
|
||||
G_DEFINE_BOXED_TYPE(EekXmlKeyboardDesc, eek_xml_keyboard_desc, eek_xml_keyboard_desc_copy, eek_xml_keyboard_desc_free);
|
||||
|
||||
#define BUFSIZE 8192
|
||||
|
||||
static GSList *parse_keyboards (const gchar *path,
|
||||
static GList *parse_keyboards (const gchar *path,
|
||||
GError **error);
|
||||
static GSList *parse_prerequisites
|
||||
static GList *parse_prerequisites
|
||||
(const gchar *path,
|
||||
GError **error);
|
||||
static gboolean parse_geometry (const gchar *path,
|
||||
@ -69,7 +71,7 @@ static gboolean parse_geometry (const gchar *path,
|
||||
static gboolean parse_symbols_with_prerequisites
|
||||
(const gchar *name,
|
||||
EekKeyboard *keyboard,
|
||||
GSList **loaded,
|
||||
GList **loaded,
|
||||
GError **error);
|
||||
static gboolean parse_symbols (const gchar *path,
|
||||
EekKeyboard *keyboard,
|
||||
@ -107,7 +109,7 @@ keyboard_desc_free (EekXmlKeyboardDesc *desc)
|
||||
struct _KeyboardsParseData {
|
||||
GSList *element_stack;
|
||||
|
||||
GSList *keyboards;
|
||||
GList *keyboards;
|
||||
};
|
||||
typedef struct _KeyboardsParseData KeyboardsParseData;
|
||||
|
||||
@ -120,7 +122,7 @@ keyboards_parse_data_new (void)
|
||||
static void
|
||||
keyboards_parse_data_free (KeyboardsParseData *data)
|
||||
{
|
||||
g_slist_free_full (data->keyboards, (GDestroyNotify) keyboard_desc_free);
|
||||
g_list_free_full (data->keyboards, (GDestroyNotify) keyboard_desc_free);
|
||||
g_slice_free (KeyboardsParseData, data);
|
||||
}
|
||||
|
||||
@ -150,7 +152,7 @@ keyboards_start_element_callback (GMarkupParseContext *pcontext,
|
||||
EekXmlKeyboardDesc *desc = g_slice_new0 (EekXmlKeyboardDesc);
|
||||
const gchar *attribute;
|
||||
|
||||
data->keyboards = g_slist_prepend (data->keyboards, desc);
|
||||
data->keyboards = g_list_prepend (data->keyboards, desc);
|
||||
|
||||
attribute = get_attribute (attribute_names, attribute_values,
|
||||
"id");
|
||||
@ -821,7 +823,7 @@ struct _PrerequisitesParseData {
|
||||
GSList *element_stack;
|
||||
GString *text;
|
||||
|
||||
GSList *prerequisites;
|
||||
GList *prerequisites;
|
||||
};
|
||||
typedef struct _PrerequisitesParseData PrerequisitesParseData;
|
||||
|
||||
@ -836,7 +838,7 @@ prerequisites_parse_data_new (void)
|
||||
static void
|
||||
prerequisites_parse_data_free (PrerequisitesParseData *data)
|
||||
{
|
||||
g_slist_free_full (data->prerequisites, g_free);
|
||||
g_list_free_full (data->prerequisites, g_free);
|
||||
g_string_free (data->text, TRUE);
|
||||
g_slice_free (PrerequisitesParseData, data);
|
||||
}
|
||||
@ -877,7 +879,7 @@ prerequisites_end_element_callback (GMarkupParseContext *pcontext,
|
||||
g_slist_free1 (head);
|
||||
|
||||
if (g_strcmp0 (element_name, "include") == 0) {
|
||||
data->prerequisites = g_slist_append (data->prerequisites,
|
||||
data->prerequisites = g_list_append (data->prerequisites,
|
||||
g_strndup (data->text->str,
|
||||
data->text->len));
|
||||
}
|
||||
@ -910,7 +912,7 @@ eek_xml_layout_real_create_keyboard (EekLayout *self,
|
||||
EekXmlLayout *layout = EEK_XML_LAYOUT (self);
|
||||
EekKeyboard *keyboard;
|
||||
gchar *filename, *path;
|
||||
GSList *loaded;
|
||||
GList *loaded;
|
||||
GError *error;
|
||||
gboolean retval;
|
||||
|
||||
@ -935,15 +937,13 @@ eek_xml_layout_real_create_keyboard (EekLayout *self,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
EekKey *key = eek_keyboard_find_key_by_keycode (keyboard,
|
||||
149);
|
||||
/* Read symbols information. */
|
||||
loaded = NULL;
|
||||
retval = parse_symbols_with_prerequisites (layout->priv->desc->symbols,
|
||||
keyboard,
|
||||
&loaded,
|
||||
&error);
|
||||
g_slist_free_full (loaded, g_free);
|
||||
g_list_free_full (loaded, g_free);
|
||||
if (!retval) {
|
||||
g_object_unref (keyboard);
|
||||
g_warning ("can't parse symbols file %s: %s",
|
||||
@ -1057,7 +1057,7 @@ initable_init (GInitable *initable,
|
||||
GError **error)
|
||||
{
|
||||
EekXmlLayout *layout = EEK_XML_LAYOUT (initable);
|
||||
GSList *keyboards, *p;
|
||||
GList *keyboards, *p;
|
||||
gchar *path;
|
||||
EekXmlKeyboardDesc *desc;
|
||||
|
||||
@ -1081,10 +1081,10 @@ initable_init (GInitable *initable,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
keyboards = g_slist_remove_link (keyboards, p);
|
||||
keyboards = g_list_remove_link (keyboards, p);
|
||||
layout->priv->desc = p->data;
|
||||
g_slist_free_1 (p);
|
||||
g_slist_free_full (keyboards, (GDestroyNotify) keyboard_desc_free);
|
||||
g_list_free_1 (p);
|
||||
g_list_free_full (keyboards, (GDestroyNotify) keyboard_desc_free);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@ -1095,14 +1095,34 @@ initable_iface_init (GInitableIface *initable_iface)
|
||||
initable_iface->init = initable_init;
|
||||
}
|
||||
|
||||
GSList *
|
||||
eek_xml_layout_list_keyboards (void)
|
||||
GList *
|
||||
eek_xml_list_keyboards (void)
|
||||
{
|
||||
gchar *path;
|
||||
GSList *keyboards;
|
||||
GList *keyboards;
|
||||
|
||||
path = g_build_filename (KEYBOARDSDIR, "keyboards.xml", NULL);
|
||||
return parse_keyboards (path, 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 gboolean
|
||||
@ -1164,11 +1184,11 @@ parse_geometry (const gchar *path, EekKeyboard *keyboard, GError **error)
|
||||
static gboolean
|
||||
parse_symbols_with_prerequisites (const gchar *name,
|
||||
EekKeyboard *keyboard,
|
||||
GSList **loaded,
|
||||
GList **loaded,
|
||||
GError **error)
|
||||
{
|
||||
gchar *filename, *path;
|
||||
GSList *prerequisites, *p;
|
||||
GList *prerequisites, *p;
|
||||
GError *prerequisites_error;
|
||||
gboolean retval;
|
||||
|
||||
@ -1182,7 +1202,7 @@ parse_symbols_with_prerequisites (const gchar *name,
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
*loaded = g_slist_prepend (*loaded, g_strdup (name));
|
||||
*loaded = g_list_prepend (*loaded, g_strdup (name));
|
||||
|
||||
filename = g_strdup_printf ("%s.xml", name);
|
||||
path = g_build_filename (KEYBOARDSDIR, "symbols", filename, NULL);
|
||||
@ -1203,7 +1223,7 @@ parse_symbols_with_prerequisites (const gchar *name,
|
||||
if (!retval)
|
||||
return FALSE;
|
||||
}
|
||||
g_slist_free_full (prerequisites, (GDestroyNotify)g_free);
|
||||
g_list_free_full (prerequisites, (GDestroyNotify)g_free);
|
||||
|
||||
retval = parse_symbols (path, keyboard, error);
|
||||
g_free (path);
|
||||
@ -1243,14 +1263,14 @@ parse_symbols (const gchar *path, EekKeyboard *keyboard, GError **error)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static GSList *
|
||||
static GList *
|
||||
parse_prerequisites (const gchar *path, GError **error)
|
||||
{
|
||||
PrerequisitesParseData *data;
|
||||
GMarkupParseContext *pcontext;
|
||||
GFile *file;
|
||||
GFileInputStream *input;
|
||||
GSList *prerequisites;
|
||||
GList *prerequisites;
|
||||
gboolean retval;
|
||||
|
||||
file = g_file_new_for_path (path);
|
||||
@ -1278,14 +1298,14 @@ parse_prerequisites (const gchar *path, GError **error)
|
||||
return prerequisites;
|
||||
}
|
||||
|
||||
static GSList *
|
||||
static GList *
|
||||
parse_keyboards (const gchar *path, GError **error)
|
||||
{
|
||||
KeyboardsParseData *data;
|
||||
GMarkupParseContext *pcontext;
|
||||
GFile *file;
|
||||
GFileInputStream *input;
|
||||
GSList *keyboards;
|
||||
GList *keyboards;
|
||||
gboolean retval;
|
||||
|
||||
file = g_file_new_for_path (path);
|
||||
|
||||
@ -76,10 +76,13 @@ struct _EekXmlKeyboardDesc
|
||||
};
|
||||
typedef struct _EekXmlKeyboardDesc EekXmlKeyboardDesc;
|
||||
|
||||
GType eek_xml_layout_get_type (void) G_GNUC_CONST;
|
||||
EekLayout *eek_xml_layout_new (const gchar *id,
|
||||
GError **error);
|
||||
GSList *eek_xml_layout_list_keyboards (void);
|
||||
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);
|
||||
|
||||
G_END_DECLS
|
||||
#endif /* EEK_XML_LAYOUT_H */
|
||||
|
||||
Reference in New Issue
Block a user