diff --git a/src/apps/serialconnect/SerialWindow.cpp b/src/apps/serialconnect/SerialWindow.cpp index 9d5eac0393..ac597d5d11 100644 --- a/src/apps/serialconnect/SerialWindow.cpp +++ b/src/apps/serialconnect/SerialWindow.cpp @@ -127,9 +127,12 @@ SerialWindow::SerialWindow() // Items for the edit menu BMenuItem* clearScreen = new BMenuItem(B_TRANSLATE("Clear history"), - new BMessage(kMsgClear)); + new BMessage(kMsgClear), 'L'); editMenu->AddItem(clearScreen); + BMenuItem* paste = new BMenuItem(B_TRANSLATE("Paste"), new BMessage(B_PASTE), 'V'); + editMenu->AddItem(paste); + // TODO copy (when we have selection), paste // Configuring all this by menus may be a bit unhandy. Make a setting @@ -468,6 +471,10 @@ void SerialWindow::MessageReceived(BMessage* message) fTermView->Clear(); return; } + case B_PASTE: + { + fTermView->PasteFromClipboard(); + } case kMsgProgress: { // File transfer progress diff --git a/src/apps/serialconnect/TermView.cpp b/src/apps/serialconnect/TermView.cpp index 01e1b2adae..c6ead5bb7c 100644 --- a/src/apps/serialconnect/TermView.cpp +++ b/src/apps/serialconnect/TermView.cpp @@ -8,6 +8,7 @@ #include +#include #include #include #include @@ -235,6 +236,21 @@ TermView::KeyDown(const char* bytes, int32 numBytes) } +void +TermView::MouseDown(BPoint where) +{ + int32 buttons = B_PRIMARY_MOUSE_BUTTON; + int32 clicks = 1; + if (Looper() != NULL && Looper()->CurrentMessage() != NULL) { + Looper()->CurrentMessage()->FindInt32("buttons", &buttons); + Looper()->CurrentMessage()->FindInt32("clicks", &clicks); + } + + if (buttons == B_TERTIARY_MOUSE_BUTTON && clicks == 1) + PasteFromClipboard(); +} + + void TermView::MessageReceived(BMessage* message) { @@ -284,6 +300,26 @@ TermView::Clear() } +void +TermView::PasteFromClipboard() +{ + if (!be_clipboard->Lock()) + return; + + BMessage* message = be_clipboard->Data(); + + const void *data; + ssize_t size; + if (message->FindData("text/plain", B_MIME_TYPE, &data, &size) == B_OK) { + BMessage* keyEvent = new BMessage(kMsgDataWrite); + keyEvent->AddData("data", B_RAW_TYPE, data, size); + be_app_messenger.SendMessage(keyEvent); + } + + be_clipboard->Unlock(); +} + + // #pragma mark - diff --git a/src/apps/serialconnect/TermView.h b/src/apps/serialconnect/TermView.h index 355e8d4cd7..a3ef3cf5c0 100644 --- a/src/apps/serialconnect/TermView.h +++ b/src/apps/serialconnect/TermView.h @@ -24,11 +24,13 @@ class TermView: public BView void FrameResized(float width, float height); void GetPreferredSize(float* width, float* height); void KeyDown(const char* bytes, int32 numBytes); + void MouseDown(BPoint where); void MessageReceived(BMessage* message); void SetLineTerminator(BString bytes); void PushBytes(const char* bytes, const size_t length); void Clear(); + void PasteFromClipboard(); private: void _Init();