14fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Copyright 2013 The Chromium Authors. All rights reserved. 24fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Use of this source code is governed by a BSD-style license that can be 34fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// found in the LICENSE file. 44fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 54fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor#include "ui/base/accelerators/menu_label_accelerator_util_linux.h" 64fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 74fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor#include "base/strings/string_util.h" 84fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 94fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregornamespace { 104fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 114fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Common implementation of ConvertAcceleratorsFromWindowsStyle() and 124fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// RemoveWindowsStyleAccelerators(). 134fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Replaces all ampersands (as used in our grd files to indicate mnemonics) 144fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// to |target|, except ampersands appearing in pairs which are replaced by 154fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// a single ampersand. Any underscores get replaced with two underscores as 164fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// is needed by GTK. 174fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstd::string ConvertAmpersandsTo(const std::string& label, 184fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor const std::string& target) { 194fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor std::string ret; 209db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor ret.reserve(label.length() * 2); 214fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor for (size_t i = 0; i < label.length(); ++i) { 224fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor if ('_' == label[i]) { 234fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor ret.push_back('_'); 244fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor ret.push_back('_'); 254fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor } else if ('&' == label[i]) { 26770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer if (i + 1 < label.length() && '&' == label[i + 1]) { 274fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor ret.push_back('&'); 284fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor ++i; 294fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor } else { 304fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor ret.append(target); 314fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor } 32512ce60311b93b6f9a144fb2cf9fe4225f5d57b2Daniel Dunbar } else { 33512ce60311b93b6f9a144fb2cf9fe4225f5d57b2Daniel Dunbar ret.push_back(label[i]); 3442f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman } 354fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor } 360d59292581dbaa4203451709077de40e0ad72c18Anders Carlsson 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return ret; 384fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor} 391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 404fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor} // namespace 414fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 424fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregornamespace ui { 434fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 444fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstd::string ConvertAcceleratorsFromWindowsStyle(const std::string& label) { 454fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor return ConvertAmpersandsTo(label, "_"); 464fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor} 474fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 484fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstd::string RemoveWindowsStyleAccelerators(const std::string& label) { 494fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor return ConvertAmpersandsTo(label, std::string()); 504fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor} 514fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor 524fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Replaces all ampersands in |label| with two ampersands. This effectively 534fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// escapes strings for later processing by ConvertAmpersandsTo(), so that 5457ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattner// ConvertAmpersandsTo(EscapeWindowsStyleAccelerators(x), *) is |x| with 554fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// underscores doubled, making the string that appears to the user just |x|. 564fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorstd::string EscapeWindowsStyleAccelerators(const std::string& label) { 5728ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne std::string ret; 5859e63570359b8adb9eb257759fe766d7aac1995aDouglas Gregor base::ReplaceChars(label, "&", "&&", &ret); 598419fa3af97208eb00f0cd6c62354ce4ff986677Douglas Gregor return ret; 606c9c94053132e5ca0655124b70f1c386a332e71dDouglas Gregor} 6159e63570359b8adb9eb257759fe766d7aac1995aDouglas Gregor 624fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor} // namespace ui 634fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor