Added paste-primary command
The Shift+Ins key should arguably insert primary selection, not the clipboard selection as every Qt program does. This commit makes it possible via the hidden paste-primary command (enabled by default). Unfortunately QtWebKit does not provide any straightforward way to insert text at cursor position into editable fields, so we work around this by executing a JavaScript snippet - inspired by this SO answer: http://stackoverflow.com/a/11077016
This commit is contained in:
parent
7f70964171
commit
4d7e39470e
@ -1307,6 +1307,39 @@ class CommandDispatcher:
|
|||||||
except webelem.IsNullError:
|
except webelem.IsNullError:
|
||||||
raise cmdexc.CommandError("Element vanished while editing!")
|
raise cmdexc.CommandError("Element vanished while editing!")
|
||||||
|
|
||||||
|
@cmdutils.register(instance='command-dispatcher',
|
||||||
|
modes=[KeyMode.insert], hide=True, scope='window')
|
||||||
|
def paste_primary(self):
|
||||||
|
"""Paste the primary selection at cursor position into the curently
|
||||||
|
selected form field.
|
||||||
|
"""
|
||||||
|
frame = self._current_widget().page().currentFrame()
|
||||||
|
try:
|
||||||
|
elem = webelem.focus_elem(frame)
|
||||||
|
except webelem.IsNullError:
|
||||||
|
raise cmdexc.CommandError("No element focused!")
|
||||||
|
if not elem.is_editable(strict=True):
|
||||||
|
raise cmdexc.CommandError("Focused element is not editable!")
|
||||||
|
|
||||||
|
clipboard = QApplication.clipboard()
|
||||||
|
if clipboard.supportsSelection():
|
||||||
|
sel = clipboard.text(QClipboard.Selection)
|
||||||
|
log.misc.debug("Pasting selection: '{}'".format(sel))
|
||||||
|
elem.evaluateJavaScript("""
|
||||||
|
var sel = '%s';
|
||||||
|
if (this.selectionStart || this.selectionStart == '0') {
|
||||||
|
var startPos = this.selectionStart;
|
||||||
|
var endPos = this.selectionEnd;
|
||||||
|
this.value = this.value.substring(0, startPos)
|
||||||
|
+ sel
|
||||||
|
+ this.value.substring(endPos, this.value.length);
|
||||||
|
this.selectionStart = startPos + sel.length;
|
||||||
|
this.selectionEnd = startPos + sel.length;
|
||||||
|
} else {
|
||||||
|
this.value += sel;
|
||||||
|
}
|
||||||
|
""" % sel)
|
||||||
|
|
||||||
def _clear_search(self, view, text):
|
def _clear_search(self, view, text):
|
||||||
"""Clear search string/highlights for the given view.
|
"""Clear search string/highlights for the given view.
|
||||||
|
|
||||||
|
@ -1324,7 +1324,8 @@ KEY_SECTION_DESC = {
|
|||||||
"Since normal keypresses are passed through, only special keys are "
|
"Since normal keypresses are passed through, only special keys are "
|
||||||
"supported in this mode.\n"
|
"supported in this mode.\n"
|
||||||
"Useful hidden commands to map in this section:\n\n"
|
"Useful hidden commands to map in this section:\n\n"
|
||||||
" * `open-editor`: Open a texteditor with the focused field."),
|
" * `open-editor`: Open a texteditor with the focused field.\n"
|
||||||
|
" * `paste-primary`: Paste primary selection at cursor position."),
|
||||||
'hint': (
|
'hint': (
|
||||||
"Keybindings for hint mode.\n"
|
"Keybindings for hint mode.\n"
|
||||||
"Since normal keypresses are passed through, only special keys are "
|
"Since normal keypresses are passed through, only special keys are "
|
||||||
@ -1495,6 +1496,7 @@ KEY_DATA = collections.OrderedDict([
|
|||||||
|
|
||||||
('insert', collections.OrderedDict([
|
('insert', collections.OrderedDict([
|
||||||
('open-editor', ['<Ctrl-E>']),
|
('open-editor', ['<Ctrl-E>']),
|
||||||
|
('paste-primary', ['<Shift-Ins>']),
|
||||||
])),
|
])),
|
||||||
|
|
||||||
('hint', collections.OrderedDict([
|
('hint', collections.OrderedDict([
|
||||||
|
Loading…
Reference in New Issue
Block a user