summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--krdc/krdc.cpp25
-rw-r--r--krdc/krdc.h1
-rw-r--r--krdc/kremoteview.cpp6
-rw-r--r--krdc/kremoteview.h12
-rw-r--r--krdc/vnc/kvncview.cpp51
-rw-r--r--krdc/vnc/kvncview.h2
6 files changed, 97 insertions, 0 deletions
diff --git a/krdc/krdc.cpp b/krdc/krdc.cpp
index b50cde3d..7f7ec081 100644
--- a/krdc/krdc.cpp
+++ b/krdc/krdc.cpp
@@ -33,6 +33,7 @@
#include <tdemessagebox.h>
#include <twin.h>
#include <tdestartupinfo.h>
+#include <tqclipboard.h>
#include <tqdockarea.h>
#include <tqlabel.h>
@@ -51,6 +52,7 @@ const int FS_HOSTLABEL_ID = 4;
const int FS_ADVANCED_ID = 5;
const int FS_ICONIFY_ID = 6;
const int FS_CLOSE_ID = 7;
+const int FS_PASTE_ID = 8;
const int KRDC::TOOLBAR_AUTOHIDE_TIMEOUT = 1000;
const int KRDC::TOOLBAR_FPS_1000 = 10000;
@@ -373,6 +375,13 @@ void KRDC::enableFullscreen(bool on)
m_view->switchFullscreen(on);
}
+void KRDC::paste()
+{
+ TQClipboard *cb = TQApplication::clipboard();
+ TQString text = cb->text(TQClipboard::Clipboard);
+ m_view->sendString(text);
+}
+
TQSize KRDC::sizeHint()
{
if ((m_isFullscreen != WINDOW_MODE_FULLSCREEN) && m_toolbar) {
@@ -499,6 +508,14 @@ void KRDC::switchToFullscreen(bool scaling)
t->setButton(FS_FULLSCREEN_ID, true);
t->addConnection(FS_FULLSCREEN_ID, TQ_SIGNAL(toggled(bool)), this, TQ_SLOT(enableFullscreen(bool)));
+ if(m_view->supportsSendString())
+ {
+ t->insertButton("edit-paste", FS_PASTE_ID);
+ TDEToolBarButton *pasteButton = t->getButton(FS_PASTE_ID);
+ TQToolTip::add(pasteButton, i18n("Sends clipboard text to the remote system as key presses"));
+ t->addConnection(FS_PASTE_ID, TQ_SIGNAL(clicked()), this, TQ_SLOT(paste()));
+ }
+
m_popup = createPopupMenu(t);
t->insertButton("configure", FS_ADVANCED_ID, m_popup, true, i18n("Advanced options"));
TDEToolBarButton *advancedButton = t->getButton(FS_ADVANCED_ID);
@@ -621,6 +638,14 @@ void KRDC::switchToNormal(bool scaling)
m_popup = 0;
}
+ if(m_view->supportsSendString())
+ {
+ t->insertButton("edit-paste", 4, true, i18n("Paste"));
+ TDEToolBarButton *pasteButton = t->getButton(4);
+ TQToolTip::add(pasteButton, i18n("Sends clipboard text to the remote system as key presses"));
+ t->addConnection(4, TQ_SIGNAL(clicked()), this, TQ_SLOT(paste()));
+ }
+
m_popup = createPopupMenu(t);
t->insertButton("configure", 3, m_popup, true, i18n("Advanced"));
TDEToolBarButton *advancedButton = t->getButton(3);
diff --git a/krdc/krdc.h b/krdc/krdc.h
index b84741d9..b72a5378 100644
--- a/krdc/krdc.h
+++ b/krdc/krdc.h
@@ -163,6 +163,7 @@ private slots:
public slots:
void quit();
void enableFullscreen(bool full = false);
+ void paste();
void switchToNormal(bool scaling = false);
void switchToFullscreen(bool scaling = false);
void viewOnlyToggled();
diff --git a/krdc/kremoteview.cpp b/krdc/kremoteview.cpp
index 76ae6267..e53fb918 100644
--- a/krdc/kremoteview.cpp
+++ b/krdc/kremoteview.cpp
@@ -86,4 +86,10 @@ void KRemoteView::enableScaling(bool) {
void KRemoteView::switchFullscreen(bool) {
}
+bool KRemoteView::supportsSendString() const {
+ return false;
+}
+
+void KRemoteView::sendString(const TQString &s) {}
+
#include "kremoteview.moc"
diff --git a/krdc/kremoteview.h b/krdc/kremoteview.h
index 9510153f..a735ebe0 100644
--- a/krdc/kremoteview.h
+++ b/krdc/kremoteview.h
@@ -227,6 +227,18 @@ public slots:
*/
virtual void pressKey(XEvent *k) = 0;
+ /**
+ * Checks whether the backend sending a string of characters.
+ * Default implementation returns false.
+ */
+ virtual bool supportsSendString() const;
+
+ /**
+ * Sends a string of characters to the remote server as key presses.
+ * Default implementation does nothing.
+ */
+ virtual void sendString(const TQString &s);
+
signals:
/**
* Emitted when the size of the remote screen changes. Also
diff --git a/krdc/vnc/kvncview.cpp b/krdc/vnc/kvncview.cpp
index b4025c2d..3a69cdd2 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)
diff --git a/krdc/vnc/kvncview.h b/krdc/vnc/kvncview.h
index f62b8819..7737ba7f 100644
--- a/krdc/vnc/kvncview.h
+++ b/krdc/vnc/kvncview.h
@@ -114,6 +114,8 @@ public slots:
virtual void enableScaling(bool s);
virtual void setViewOnly(bool s);
virtual void pressKey(XEvent *k);
+ virtual bool supportsSendString() const;
+ virtual void sendString(const TQString &s);
private slots: