aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen VanDine <ken.vandine@canonical.com>2012-04-09 13:35:18 -0400
committerKen VanDine <ken.vandine@canonical.com>2012-04-09 13:35:18 -0400
commit54fa5584edbaa39872fcb73bed0810a57b8753d5 (patch)
tree79244aff6d4220f93abaa309aec9e95393511832
parent0a37e3250ea049cbc6c509cd23f477e952897e8f (diff)
parent1a2b0942da2b73c6338516144f0b77ac5696db74 (diff)
downloadlibdbusmenu-54fa5584edbaa39872fcb73bed0810a57b8753d5.tar.gz
libdbusmenu-54fa5584edbaa39872fcb73bed0810a57b8753d5.tar.bz2
libdbusmenu-54fa5584edbaa39872fcb73bed0810a57b8753d5.zip
* libdbusmenu-gtk/genericmenuitem.c
- Fix underscore on menu items change on switching focus (LP: #903200)
-rw-r--r--debian/changelog4
-rw-r--r--libdbusmenu-gtk/genericmenuitem.c43
2 files changed, 42 insertions, 5 deletions
diff --git a/debian/changelog b/debian/changelog
index a322f0a..0028e19 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,8 +2,10 @@ libdbusmenu (0.5.99-0ubuntu2) UNRELEASED; urgency=low
* libdbusmenu-glib/server.c
- Cherry picked a fix for a regression in about-to-show grouping
+ * libdbusmenu-gtk/genericmenuitem.c
+ - Fix underscore on menu items change on switching focus (LP: #903200)
- -- Ken VanDine <ken.vandine@canonical.com> Mon, 09 Apr 2012 12:29:12 -0400
+ -- Ken VanDine <ken.vandine@canonical.com> Mon, 09 Apr 2012 13:33:45 -0400
libdbusmenu (0.5.99-0ubuntu1) precise; urgency=low
diff --git a/libdbusmenu-gtk/genericmenuitem.c b/libdbusmenu-gtk/genericmenuitem.c
index e9c8367..9effd82 100644
--- a/libdbusmenu-gtk/genericmenuitem.c
+++ b/libdbusmenu-gtk/genericmenuitem.c
@@ -216,6 +216,31 @@ get_text_color (GenericmenuitemDisposition disposition, GtkWidget * widget)
return g_strdup(values[disposition].default_color);
}
+/* Check to see if we've got mnemonic stuff goin' on */
+static gboolean
+has_mnemonic (const gchar * string, gboolean previous_underscore)
+{
+ if (string == NULL || string[0] == '\0') {
+ return FALSE;
+ }
+
+ if (g_utf8_get_char(string) == '_') {
+ if (previous_underscore) {
+ return has_mnemonic(g_utf8_next_char(string), FALSE);
+ } else {
+ return has_mnemonic(g_utf8_next_char(string), TRUE);
+ }
+ } else {
+ if (previous_underscore) {
+ return TRUE;
+ } else {
+ return has_mnemonic(g_utf8_next_char(string), FALSE);
+ }
+ }
+
+ return FALSE;
+}
+
/* Set the label on the item */
static void
set_label (GtkMenuItem * menu_item, const gchar * in_label)
@@ -287,11 +312,15 @@ set_label (GtkMenuItem * menu_item, const gchar * in_label)
if (labelw == NULL) {
/* Build it */
labelw = GTK_LABEL(gtk_accel_label_new(local_label));
- gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE);
gtk_label_set_use_markup(GTK_LABEL(labelw), TRUE);
gtk_misc_set_alignment(GTK_MISC(labelw), 0.0, 0.5);
- gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(labelw), GTK_WIDGET(menu_item));
- gtk_label_set_markup_with_mnemonic(labelw, local_label);
+
+ if (has_mnemonic(in_label, FALSE)) {
+ gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE);
+ gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(labelw), GTK_WIDGET(menu_item));
+ gtk_label_set_markup_with_mnemonic(labelw, local_label);
+ }
+
gtk_widget_show(GTK_WIDGET(labelw));
/* Check to see if it needs to be in the bin for this
@@ -309,7 +338,13 @@ set_label (GtkMenuItem * menu_item, const gchar * in_label)
getting in. */
suppress_update = TRUE;
} else {
- gtk_label_set_markup_with_mnemonic(labelw, local_label);
+ if (has_mnemonic(in_label, FALSE)) {
+ gtk_label_set_use_underline(GTK_LABEL(labelw), TRUE);
+ gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(labelw), GTK_WIDGET(menu_item));
+ gtk_label_set_markup_with_mnemonic(labelw, local_label);
+ } else {
+ gtk_label_set_markup(labelw, local_label);
+ }
}
}