Show tooltips.

This commit is contained in:
Daiki Ueno
2012-04-23 16:43:06 +09:00
parent 4df2ecc8ae
commit 4a346211b8
6 changed files with 126 additions and 26 deletions

View File

@ -248,10 +248,10 @@
<keysym keyval="65506">Shift_R</keysym> <keysym keyval="65506">Shift_R</keysym>
</key> </key>
<key keycode="149" name="I149"> <key keycode="149" name="I149">
<symbol label="⌨" icon="input-keyboard-symbolic">cycle-keyboard</symbol> <symbol label="⌨" icon="input-keyboard-symbolic" tooltip="Change keyboard">cycle-keyboard</symbol>
</key> </key>
<key keycode="150" name="I150"> <key keycode="150" name="I150">
<symbol label="☺" icon="preferences-system-symbolic">preferences</symbol> <symbol label="☺" icon="preferences-system-symbolic" tooltip="Setup">preferences</symbol>
</key> </key>
<key keycode="37" name="LCTL"> <key keycode="37" name="LCTL">
<keysym keyval="65507">Control_L</keysym> <keysym keyval="65507">Control_L</keysym>

View File

@ -232,6 +232,9 @@ eek_gtk_keyboard_real_motion_notify_event (GtkWidget *self,
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self); EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
EekKey *key; EekKey *key;
if (event->state == 0)
return FALSE;
key = eek_renderer_find_key_by_position (priv->renderer, key = eek_renderer_find_key_by_position (priv->renderer,
(gdouble)event->x, (gdouble)event->x,
(gdouble)event->y); (gdouble)event->y);
@ -275,6 +278,30 @@ eek_gtk_keyboard_real_unmap (GtkWidget *self)
GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->unmap (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 static void
eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self, eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
EekKeyboard *keyboard) EekKeyboard *keyboard)
@ -397,6 +424,8 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
eek_gtk_keyboard_real_button_release_event; eek_gtk_keyboard_real_button_release_event;
widget_class->motion_notify_event = widget_class->motion_notify_event =
eek_gtk_keyboard_real_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->set_property = eek_gtk_keyboard_set_property;
gobject_class->dispose = eek_gtk_keyboard_dispose; gobject_class->dispose = eek_gtk_keyboard_dispose;

View File

@ -40,6 +40,7 @@ enum {
PROP_CATEGORY, PROP_CATEGORY,
PROP_MODIFIER_MASK, PROP_MODIFIER_MASK,
PROP_ICON_NAME, PROP_ICON_NAME,
PROP_TOOLTIP,
PROP_LAST PROP_LAST
}; };
@ -49,6 +50,7 @@ struct _EekSymbolPrivate {
EekSymbolCategory category; EekSymbolCategory category;
EekModifierType modifier_mask; EekModifierType modifier_mask;
gchar *icon_name; gchar *icon_name;
gchar *tooltip;
}; };
static void eek_serializable_iface_init (EekSerializableIface *iface); 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->category);
g_variant_builder_add (builder, "u", priv->modifier_mask); 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->icon_name));
g_variant_builder_add (builder, "s", NOTNULL(priv->tooltip));
#undef NOTNULL #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->category);
g_variant_get_child (variant, index++, "u", &priv->modifier_mask); 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->icon_name);
g_variant_get_child (variant, index++, "s", &priv->tooltip);
return index; return index;
} }
@ -121,6 +125,10 @@ eek_symbol_set_property (GObject *object,
eek_symbol_set_icon_name (EEK_SYMBOL(object), eek_symbol_set_icon_name (EEK_SYMBOL(object),
g_value_get_string (value)); g_value_get_string (value));
break; break;
case PROP_TOOLTIP:
eek_symbol_set_tooltip (EEK_SYMBOL(object),
g_value_get_string (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -151,6 +159,10 @@ eek_symbol_get_property (GObject *object,
g_value_set_string (value, g_value_set_string (value,
eek_symbol_get_icon_name (EEK_SYMBOL(object))); eek_symbol_get_icon_name (EEK_SYMBOL(object)));
break; break;
case PROP_TOOLTIP:
g_value_set_string (value,
eek_symbol_get_tooltip (EEK_SYMBOL(object)));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -165,6 +177,7 @@ eek_symbol_finalize (GObject *object)
g_free (priv->name); g_free (priv->name);
g_free (priv->label); g_free (priv->label);
g_free (priv->icon_name); g_free (priv->icon_name);
g_free (priv->tooltip);
G_OBJECT_CLASS (eek_symbol_parent_class)->finalize (object); G_OBJECT_CLASS (eek_symbol_parent_class)->finalize (object);
} }
@ -216,6 +229,13 @@ eek_symbol_class_init (EekSymbolClass *klass)
NULL, NULL,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE); G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
g_object_class_install_property (gobject_class, PROP_ICON_NAME, pspec); 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 static void
@ -441,6 +461,45 @@ eek_symbol_get_icon_name (EekSymbol *symbol)
return priv->icon_name; 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 { static const struct {
EekSymbolCategory category; EekSymbolCategory category;
gchar *name; gchar *name;

View File

@ -89,32 +89,31 @@ struct _EekSymbolClass {
GObjectClass parent_class; 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); EekSymbol *eek_symbol_new (const gchar *name);
void eek_symbol_set_name (EekSymbol *symbol, void eek_symbol_set_name (EekSymbol *symbol,
const gchar *name); const gchar *name);
G_CONST_RETURN gchar *eek_symbol_get_name (EekSymbol *symbol); const gchar *eek_symbol_get_name (EekSymbol *symbol);
void eek_symbol_set_label (EekSymbol *symbol, void eek_symbol_set_label (EekSymbol *symbol,
const gchar *label); const gchar *label);
G_CONST_RETURN gchar *eek_symbol_get_label (EekSymbol *symbol); const gchar *eek_symbol_get_label (EekSymbol *symbol);
void eek_symbol_set_category (EekSymbol *symbol, void eek_symbol_set_category (EekSymbol *symbol,
EekSymbolCategory category); EekSymbolCategory category);
EekSymbolCategory eek_symbol_get_category (EekSymbol *symbol); EekSymbolCategory eek_symbol_get_category (EekSymbol *symbol);
EekModifierType eek_symbol_get_modifier_mask EekModifierType eek_symbol_get_modifier_mask (EekSymbol *symbol);
(EekSymbol *symbol); void eek_symbol_set_modifier_mask (EekSymbol *symbol,
void eek_symbol_set_modifier_mask EekModifierType mask);
(EekSymbol *symbol, gboolean eek_symbol_is_modifier (EekSymbol *symbol);
EekModifierType mask); void eek_symbol_set_icon_name (EekSymbol *symbol,
gboolean eek_symbol_is_modifier (EekSymbol *symbol); const gchar *icon_name);
void eek_symbol_set_icon_name (EekSymbol *symbol, const gchar *eek_symbol_get_icon_name (EekSymbol *symbol);
const gchar *icon_name); void eek_symbol_set_tooltip (EekSymbol *symbol,
G_CONST_RETURN gchar *eek_symbol_get_icon_name (EekSymbol *symbol); const gchar *tooltip);
const gchar * eek_symbol_get_tooltip (EekSymbol *symbol);
G_CONST_RETURN gchar *eek_symbol_category_get_name const gchar *eek_symbol_category_get_name (EekSymbolCategory category);
(EekSymbolCategory category); EekSymbolCategory eek_symbol_category_from_name (const gchar *name);
EekSymbolCategory eek_symbol_category_from_name
(const gchar *name);
G_END_DECLS G_END_DECLS

View File

@ -571,6 +571,7 @@ struct _SymbolsParseData {
GSList *symbols; GSList *symbols;
gchar *label; gchar *label;
gchar *icon; gchar *icon;
gchar *tooltip;
EekSymbolCategory category; EekSymbolCategory category;
guint keyval; guint keyval;
gint groups; gint groups;
@ -683,6 +684,11 @@ symbols_start_element_callback (GMarkupParseContext *pcontext,
if (attribute != NULL) if (attribute != NULL)
data->icon = g_strdup (attribute); 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, attribute = get_attribute (attribute_names, attribute_values,
"category"); "category");
if (attribute != NULL) if (attribute != NULL)
@ -766,6 +772,11 @@ symbols_end_element_callback (GMarkupParseContext *pcontext,
g_free (data->icon); g_free (data->icon);
data->icon = NULL; 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); data->symbols = g_slist_prepend (data->symbols, symbol);
goto out; goto out;

View File

@ -301,6 +301,8 @@ update_widget (ServerContextService *context)
eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget), theme); eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget), theme);
g_object_unref (theme); g_object_unref (theme);
gtk_widget_set_has_tooltip (context->widget, TRUE);
if (!context->window) { if (!context->window) {
context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (context->window, "destroy", g_signal_connect (context->window, "destroy",