&& mod1 == it->mod.first
&& mod2 == it->mod.second) {
if (r + 1 == seq.length())
- return it->func;
+ return (it->prefixes) ? FuncRequest::prefix : it->func;
else if (it->prefixes)
return it->prefixes->getBinding(seq, r + 1);
}
unsigned int r = 0);
- /// returns the function bound to this key sequence, or
- /// FuncRequest::unknown if no binding exists for it.
+ /// returns the function bound to this key sequence, or:
+ /// * FuncRequest::unknown if no binding exists for it;
+ /// * FuncRequest::prefix if this is the start of longer keysequences
/// @param r an internal recursion counter
// FIXME Surely there's a better way to do that?
FuncRequest getBinding(KeySequence const & seq, unsigned int r = 0);
// nothing to change
return false;
+ // Check whether the key sequence is a prefix for other shortcuts.
+ if (oldBinding == FuncRequest::prefix) {
+ docstring const new_action_string = makeCmdString(func);
+ docstring const text = bformat(_("Shortcut `%1$s' is already a prefix for other commands.\n"
+ "Are you sure you want to unbind these commands and bind it to %2$s?"),
+ k.print(KeySequence::ForGui), new_action_string);
+ int ret = Alert::prompt(_("Redefine shortcut?"),
+ text, 0, 1, _("&Redefine"), _("&Cancel"));
+ if (ret != 0)
+ return false;
+ QString const sequence_text = toqstr(k.print(KeySequence::ForGui));
+ QList<QTreeWidgetItem*> items = shortcutsTW->findItems(sequence_text,
+ Qt::MatchFlags(Qt::MatchStartsWith | Qt::MatchRecursive), 1);
+ deactivateShortcuts(items);
+ return true;
+ }
+
// make sure this key isn't already bound---and, if so, prompt user
// (exclude the lfun the user already wants to modify)
docstring const action_string = makeCmdString(oldBinding);