diff --git a/gtk/gtkapplication-quartz-menu.c b/gtk/gtkapplication-quartz-menu.c index b9d27bd19f..4896fdc6bf 100644 --- a/gtk/gtkapplication-quartz-menu.c +++ b/gtk/gtkapplication-quartz-menu.c @@ -24,6 +24,7 @@ #include "gtkmenutrackerprivate.h" #include "gtkicontheme.h" #include "gtkquartz.h" +#include "gtkprivate.h" #include #include @@ -231,7 +232,7 @@ icon_loaded (GObject *object, - (void)didChangeLabel { - const char *label = gtk_menu_tracker_item_get_label (trackerItem); + char *label = _gtk_elide_underscores (gtk_menu_tracker_item_get_label (trackerItem)); NSString *title = [NSString stringWithUTF8String:label ? : ""]; @@ -256,6 +257,8 @@ icon_loaded (GObject *object, } [self setTitle:title]; + + g_free (label); } - (void)didChangeIcon diff --git a/gtk/gtkprivate.c b/gtk/gtkprivate.c index ce7077e7c2..519d91f4a1 100644 --- a/gtk/gtkprivate.c +++ b/gtk/gtkprivate.c @@ -266,3 +266,46 @@ gtk_get_portal_session_path (GDBusConnection *connection, { return get_portal_path (connection, "session", token); } + +char * +_gtk_elide_underscores (const char *original) +{ + char *q, *result; + const char *p, *end; + gsize len; + gboolean last_underscore; + + if (!original) + return NULL; + + len = strlen (original); + q = result = g_malloc (len + 1); + last_underscore = FALSE; + + end = original + len; + for (p = original; p < end; p++) + { + if (!last_underscore && *p == '_') + last_underscore = TRUE; + else + { + last_underscore = FALSE; + if (original + 2 <= p && p + 1 <= end && + p[-2] == '(' && p[-1] == '_' && p[0] != '_' && p[1] == ')') + { + q--; + *q = '\0'; + p++; + } + else + *q++ = *p; + } + } + + if (last_underscore) + *q++ = '_'; + + *q = '\0'; + + return result; +} diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h index cd41e85b2c..ff3e188eef 100644 --- a/gtk/gtkprivate.h +++ b/gtk/gtkprivate.h @@ -144,6 +144,8 @@ GBytes *get_emoji_data (void); #endif /* G_ENABLE_DEBUG */ +char * _gtk_elide_underscores (const char *original); + G_END_DECLS #endif /* __GTK_PRIVATE_H__ */