diff --git a/data/keyboards/symbols/us.xml b/data/keyboards/symbols/us.xml index 8649b8a9..a3a72f2f 100644 --- a/data/keyboards/symbols/us.xml +++ b/data/keyboards/symbols/us.xml @@ -248,10 +248,10 @@ Shift_R - cycle-keyboard + cycle-keyboard - preferences + preferences Control_L diff --git a/eek/eek-gtk-keyboard.c b/eek/eek-gtk-keyboard.c index de4d1871..e2ddf4a9 100644 --- a/eek/eek-gtk-keyboard.c +++ b/eek/eek-gtk-keyboard.c @@ -232,6 +232,9 @@ eek_gtk_keyboard_real_motion_notify_event (GtkWidget *self, EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self); EekKey *key; + if (event->state == 0) + return FALSE; + key = eek_renderer_find_key_by_position (priv->renderer, (gdouble)event->x, (gdouble)event->y); @@ -275,6 +278,30 @@ eek_gtk_keyboard_real_unmap (GtkWidget *self) GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->unmap (self); } +static gboolean +eek_gtk_keyboard_real_query_tooltip (GtkWidget *widget, + gint x, + gint y, + gboolean keyboard_tooltip, + GtkTooltip *tooltip) +{ + EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget); + EekKey *key; + + key = eek_renderer_find_key_by_position (priv->renderer, + (gdouble)x, + (gdouble)y); + if (key) { + EekSymbol *symbol = eek_key_get_symbol (key); + const gchar *text = eek_symbol_get_tooltip (symbol); + if (text) { + gtk_tooltip_set_text (tooltip, text); + return TRUE; + } + } + return FALSE; +} + static void eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self, EekKeyboard *keyboard) @@ -397,6 +424,8 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass) eek_gtk_keyboard_real_button_release_event; widget_class->motion_notify_event = eek_gtk_keyboard_real_motion_notify_event; + widget_class->query_tooltip = + eek_gtk_keyboard_real_query_tooltip; gobject_class->set_property = eek_gtk_keyboard_set_property; gobject_class->dispose = eek_gtk_keyboard_dispose; diff --git a/eek/eek-symbol.c b/eek/eek-symbol.c index 22dfb56d..734a9a85 100644 --- a/eek/eek-symbol.c +++ b/eek/eek-symbol.c @@ -40,6 +40,7 @@ enum { PROP_CATEGORY, PROP_MODIFIER_MASK, PROP_ICON_NAME, + PROP_TOOLTIP, PROP_LAST }; @@ -49,6 +50,7 @@ struct _EekSymbolPrivate { EekSymbolCategory category; EekModifierType modifier_mask; gchar *icon_name; + gchar *tooltip; }; static void eek_serializable_iface_init (EekSerializableIface *iface); @@ -71,6 +73,7 @@ eek_symbol_real_serialize (EekSerializable *self, g_variant_builder_add (builder, "u", priv->category); g_variant_builder_add (builder, "u", priv->modifier_mask); g_variant_builder_add (builder, "s", NOTNULL(priv->icon_name)); + g_variant_builder_add (builder, "s", NOTNULL(priv->tooltip)); #undef NOTNULL } @@ -86,6 +89,7 @@ eek_symbol_real_deserialize (EekSerializable *self, g_variant_get_child (variant, index++, "u", &priv->category); g_variant_get_child (variant, index++, "u", &priv->modifier_mask); g_variant_get_child (variant, index++, "s", &priv->icon_name); + g_variant_get_child (variant, index++, "s", &priv->tooltip); return index; } @@ -121,6 +125,10 @@ eek_symbol_set_property (GObject *object, eek_symbol_set_icon_name (EEK_SYMBOL(object), g_value_get_string (value)); break; + case PROP_TOOLTIP: + eek_symbol_set_tooltip (EEK_SYMBOL(object), + g_value_get_string (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -151,6 +159,10 @@ eek_symbol_get_property (GObject *object, g_value_set_string (value, eek_symbol_get_icon_name (EEK_SYMBOL(object))); break; + case PROP_TOOLTIP: + g_value_set_string (value, + eek_symbol_get_tooltip (EEK_SYMBOL(object))); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -165,6 +177,7 @@ eek_symbol_finalize (GObject *object) g_free (priv->name); g_free (priv->label); g_free (priv->icon_name); + g_free (priv->tooltip); G_OBJECT_CLASS (eek_symbol_parent_class)->finalize (object); } @@ -216,6 +229,13 @@ eek_symbol_class_init (EekSymbolClass *klass) NULL, G_PARAM_CONSTRUCT | G_PARAM_READWRITE); g_object_class_install_property (gobject_class, PROP_ICON_NAME, pspec); + + pspec = g_param_spec_string ("tooltip", + "Tooltip", + "Tooltip text", + NULL, + G_PARAM_CONSTRUCT | G_PARAM_READWRITE); + g_object_class_install_property (gobject_class, PROP_TOOLTIP, pspec); } static void @@ -441,6 +461,45 @@ eek_symbol_get_icon_name (EekSymbol *symbol) return priv->icon_name; } +/** + * eek_symbol_set_tooltip: + * @symbol: an #EekSymbol + * @tooltip: icon name of @symbol + * + * Set the tooltip text of @symbol to @tooltip. + */ +void +eek_symbol_set_tooltip (EekSymbol *symbol, + const gchar *tooltip) +{ + EekSymbolPrivate *priv; + + g_return_if_fail (EEK_IS_SYMBOL(symbol)); + + priv = EEK_SYMBOL_GET_PRIVATE(symbol); + g_free (priv->tooltip); + priv->tooltip = g_strdup (tooltip); +} + +/** + * eek_symbol_get_tooltip: + * @symbol: an #EekSymbol + * + * Get the tooltip text of @symbol. + */ +G_CONST_RETURN gchar * +eek_symbol_get_tooltip (EekSymbol *symbol) +{ + EekSymbolPrivate *priv; + + g_return_val_if_fail (EEK_IS_SYMBOL(symbol), NULL); + + priv = EEK_SYMBOL_GET_PRIVATE(symbol); + if (priv->tooltip == NULL || *priv->tooltip == '\0') + return NULL; + return priv->tooltip; +} + static const struct { EekSymbolCategory category; gchar *name; diff --git a/eek/eek-symbol.h b/eek/eek-symbol.h index 6cc1d2cf..4906483a 100644 --- a/eek/eek-symbol.h +++ b/eek/eek-symbol.h @@ -89,32 +89,31 @@ struct _EekSymbolClass { GObjectClass parent_class; }; -GType eek_symbol_get_type (void) G_GNUC_CONST; +GType eek_symbol_get_type (void) G_GNUC_CONST; -EekSymbol *eek_symbol_new (const gchar *name); -void eek_symbol_set_name (EekSymbol *symbol, - const gchar *name); -G_CONST_RETURN gchar *eek_symbol_get_name (EekSymbol *symbol); -void eek_symbol_set_label (EekSymbol *symbol, - const gchar *label); -G_CONST_RETURN gchar *eek_symbol_get_label (EekSymbol *symbol); -void eek_symbol_set_category (EekSymbol *symbol, - EekSymbolCategory category); -EekSymbolCategory eek_symbol_get_category (EekSymbol *symbol); -EekModifierType eek_symbol_get_modifier_mask - (EekSymbol *symbol); -void eek_symbol_set_modifier_mask - (EekSymbol *symbol, - EekModifierType mask); -gboolean eek_symbol_is_modifier (EekSymbol *symbol); -void eek_symbol_set_icon_name (EekSymbol *symbol, - const gchar *icon_name); -G_CONST_RETURN gchar *eek_symbol_get_icon_name (EekSymbol *symbol); +EekSymbol *eek_symbol_new (const gchar *name); +void eek_symbol_set_name (EekSymbol *symbol, + const gchar *name); +const gchar *eek_symbol_get_name (EekSymbol *symbol); +void eek_symbol_set_label (EekSymbol *symbol, + const gchar *label); +const gchar *eek_symbol_get_label (EekSymbol *symbol); +void eek_symbol_set_category (EekSymbol *symbol, + EekSymbolCategory category); +EekSymbolCategory eek_symbol_get_category (EekSymbol *symbol); +EekModifierType eek_symbol_get_modifier_mask (EekSymbol *symbol); +void eek_symbol_set_modifier_mask (EekSymbol *symbol, + EekModifierType mask); +gboolean eek_symbol_is_modifier (EekSymbol *symbol); +void eek_symbol_set_icon_name (EekSymbol *symbol, + const gchar *icon_name); +const gchar *eek_symbol_get_icon_name (EekSymbol *symbol); +void eek_symbol_set_tooltip (EekSymbol *symbol, + const gchar *tooltip); +const gchar * eek_symbol_get_tooltip (EekSymbol *symbol); -G_CONST_RETURN gchar *eek_symbol_category_get_name - (EekSymbolCategory category); -EekSymbolCategory eek_symbol_category_from_name - (const gchar *name); +const gchar *eek_symbol_category_get_name (EekSymbolCategory category); +EekSymbolCategory eek_symbol_category_from_name (const gchar *name); G_END_DECLS diff --git a/eek/eek-xml-layout.c b/eek/eek-xml-layout.c index 025f5e42..aa2efce2 100644 --- a/eek/eek-xml-layout.c +++ b/eek/eek-xml-layout.c @@ -571,6 +571,7 @@ struct _SymbolsParseData { GSList *symbols; gchar *label; gchar *icon; + gchar *tooltip; EekSymbolCategory category; guint keyval; gint groups; @@ -683,6 +684,11 @@ symbols_start_element_callback (GMarkupParseContext *pcontext, if (attribute != NULL) data->icon = g_strdup (attribute); + attribute = get_attribute (attribute_names, attribute_values, + "tooltip"); + if (attribute != NULL) + data->tooltip = g_strdup (attribute); + attribute = get_attribute (attribute_names, attribute_values, "category"); if (attribute != NULL) @@ -766,6 +772,11 @@ symbols_end_element_callback (GMarkupParseContext *pcontext, g_free (data->icon); data->icon = NULL; } + if (data->tooltip) { + eek_symbol_set_tooltip (symbol, data->tooltip); + g_free (data->tooltip); + data->tooltip = NULL; + } data->symbols = g_slist_prepend (data->symbols, symbol); goto out; diff --git a/src/server-context-service.c b/src/server-context-service.c index 6e309276..1812407c 100644 --- a/src/server-context-service.c +++ b/src/server-context-service.c @@ -301,6 +301,8 @@ update_widget (ServerContextService *context) eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget), theme); g_object_unref (theme); + gtk_widget_set_has_tooltip (context->widget, TRUE); + if (!context->window) { context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (context->window, "destroy",