diff options
| author | Daniel Collins <solemnwarning@solemnwarning.net> | 2025-04-16 19:07:54 +0100 |
|---|---|---|
| committer | Slávek Banko <slavek.banko@axis.cz> | 2025-06-30 19:26:53 +0200 |
| commit | 8dc325fb3fb85d0ab76092db66deaee26145f863 (patch) | |
| tree | ff2d49b27e8a4d4646dc5c2bdc95e0f9930562d6 /krdc/vnc/kvncview.cpp | |
| parent | eea2e3baf09d75d646cb5647775b06decbe7ec5c (diff) | |
| download | tdenetwork-8dc325fb.tar.gz tdenetwork-8dc325fb.zip | |
Add "Paste" command to krdc (#102).
This adds a "Paste" command to the toolbar which sends the current
clipboard content to the remote host as key presses.
Not implemented for RDP as we appear to defer to rdesktop and I'm not
sure if we can reliably do it there (also krdc RDP isn't working for me
right now).
(cherry picked from commit 123ecc2bd9b3e470a34dd3aa3b0f6b66e74d6c76)
Diffstat (limited to 'krdc/vnc/kvncview.cpp')
| -rw-r--r-- | krdc/vnc/kvncview.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/krdc/vnc/kvncview.cpp b/krdc/vnc/kvncview.cpp index 30cb2356..223cd5cc 100644 --- a/krdc/vnc/kvncview.cpp +++ b/krdc/vnc/kvncview.cpp @@ -645,6 +645,57 @@ void KVncView::pressKey(XEvent *xe) { m_mods.clear(); } +bool KVncView::supportsSendString() const +{ + return true; +} + +void KVncView::sendString(const TQString &s) +{ + if (m_status != REMOTE_VIEW_CONNECTED) + return; + if (m_viewOnly) + return; + + for(uint i = 0; i < s.length(); ++i) + { + /* X11 reserves keysyms 0x01000000 to 0x0110FFFF for Unicode code-points + * (see keysymdef.h). + */ + uint sym = s[i].unicode() + 0x01000000; + + /* Convert line breaks to return (enter). */ + if(s[i] == '\n') + { + sym = XK_Return; + } + + /* If the character is upper-case and below code-point 0x3000 (most western + * languages), assume the shift key is required (based on kkeyserver_x11.cpp). + */ + bool shift = false; + if(s[i].unicode() < 0x3000 && s[i].isLetter() && s[i].lower() != s[i].upper() && s[i] == s[i].upper()) + { + m_cthreadObject.queueKeyEvent(XK_Shift_L, true); + shift = true; + } + + m_cthreadObject.queueKeyEvent(sym, true); + m_cthreadObject.queueKeyEvent(sym, false); + + if(shift) + { + m_cthreadObject.queueKeyEvent(XK_Shift_L, false); + } + + #if 0 + fprintf(stderr, "Sent character: '%s' (sym = %u, shift = %s)\n", + (const char*)(TQString(s[i]).local8Bit()), + (unsigned)(sym), (shift ? "yes" : "no")); + #endif + } +} + bool KVncView::x11Event(XEvent *e) { bool pressed; if (e->type == KeyPress) |
