Mercurial > hg > octave-nkf
changeset 16648:b04413e5a811
improve handling of interrupts, copy and paste shortcuts
* QTerminal.h (QTerminal::report_status_message): New signal.
(QTerminal::QTerminal): Set shortcuts for copy and paste actions.
Add copy and paste actions to QTerminal widget.
Connect settings_changed, report_status_message, copyClipboard_signal,
and pasteClipboard_signal.
* QWinTerminalImpl.cpp (QWinTerminalImpl::copyClipboard): If selection
is set, copy it and report status message. Otherwise, interrupt.
* TerminalView.cpp (TerminalView::copyClipboard): Likewise.
* main-window.cc (main_menu::construct_file_menu): Don't set shortcut
for open action.
(main_window::construct_edit_menu): Delete unimplemented cut, select
all, and delete actions.
Connect copy and paste actions to signals.
(main_window::copyClipboard_signal,
main_window::pasteClipboard_signal): New signals.
(main_window::copyClipboard, main_window::pasteClipboard): New slots.
(main_window::_cut_action): Delete member variable.
* octave-qt-link.cc (octave_qt_link::do_pre_input_event):
Disable input processing by the windows console.
(octave_qt_link::do_post_input_event):
Enable input processing by the windows console.
* terminal-dock-widget.h, terminal-dock-widget.cc:
Delete notice_settings, copyClipboard, and pasteClipboard signals,
slots, and connections.
(terminal_dock_widget::terminal_dock_widget):
Don't connect visibilityChanged signal.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 13 May 2013 07:26:37 -0400 |
parents | d446e99f89f7 |
children | de1f8e4b6b9b |
files | libgui/qterminal/libqterminal/QTerminal.h libgui/qterminal/libqterminal/unix/TerminalView.cpp libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp libgui/src/main-window.cc libgui/src/main-window.h libgui/src/octave-qt-link.cc libgui/src/terminal-dock-widget.cc libgui/src/terminal-dock-widget.h |
diffstat | 8 files changed, 100 insertions(+), 79 deletions(-) [+] |
line wrap: on
line diff
--- a/libgui/qterminal/libqterminal/QTerminal.h +++ b/libgui/qterminal/libqterminal/QTerminal.h @@ -24,7 +24,7 @@ #define QTERMINAL_H #include <QSettings> -#include <QtGlobal> +#include <QKeySequence> #include <QWidget> #include <QStringList> #include <QColor> @@ -76,6 +76,10 @@ virtual void setCursorColor (bool useForegroundColor, const QColor& color) = 0; +signals: + + void report_status_message (const QString&); + public slots: virtual void copyClipboard (void) = 0; @@ -94,9 +98,6 @@ QTerminal (QWidget *xparent = 0) : QWidget (xparent) { - connect (this, SIGNAL (customContextMenuRequested (QPoint)), - this, SLOT (handleCustomContextMenuRequested (QPoint))); - setContextMenuPolicy (Qt::CustomContextMenu); _contextMenu = new QMenu (this); @@ -104,8 +105,32 @@ QAction *copyAction = _contextMenu->addAction ("Copy"); QAction *pasteAction = _contextMenu->addAction ("Paste"); - connect (copyAction, SIGNAL (triggered()), this, SLOT (copyClipboard())); - connect (pasteAction, SIGNAL (triggered()), this, SLOT (pasteClipboard())); + copyAction->setShortcut (QKeySequence::Copy); + pasteAction->setShortcut (QKeySequence::Paste); + + addAction (copyAction); + addAction (pasteAction); + + connect (copyAction, SIGNAL (triggered()), + this, SLOT (copyClipboard ())); + + connect (pasteAction, SIGNAL (triggered()), + this, SLOT (pasteClipboard ())); + + connect (this, SIGNAL (customContextMenuRequested (QPoint)), + this, SLOT (handleCustomContextMenuRequested (QPoint))); + + connect (this, SIGNAL (report_status_message (const QString&)), + xparent, SLOT (report_status_message (const QString&))); + + connect (xparent, SIGNAL (settings_changed (const QSettings *)), + this, SLOT (notice_settings (const QSettings *))); + + connect (xparent, SIGNAL (copyClipboard_signal ()), + this, SLOT (copyClipboard ())); + + connect (xparent, SIGNAL (pasteClipboard_signal ()), + this, SLOT (pasteClipboard ())); } private:
--- a/libgui/qterminal/libqterminal/unix/TerminalView.cpp +++ b/libgui/qterminal/libqterminal/unix/TerminalView.cpp @@ -2264,7 +2264,16 @@ return; QString text = _screenWindow->selectedText(_preserveLineBreaks); - QApplication::clipboard()->setText(text); + + if (text.isEmpty ()) + { + // FIXME -- interrupt is only appropriate here if CTRL-C is bound + // to the copy action. How can we determine that? + + ::raise (SIGINT); + } + else + QApplication::clipboard()->setText(text); } void TerminalView::pasteClipboard()
--- a/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp +++ b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp @@ -43,6 +43,7 @@ #define _WIN32_WINNT 0x0500 #include <windows.h> #include <cstring> +#include <csignal> #include <limits> #include "QWinTerminalImpl.h" @@ -1437,7 +1438,18 @@ { QClipboard *clipboard = QApplication::clipboard (); - clipboard->setText (d->getSelection ()); + QString selection = d->getSelection (); + + if (selection.isEmpty ()) + { + ::raise (SIGINT); + } + else + { + clipboard->setText (selection); + + emit report_status_message (tr ("copied selection to clipboard")); + } } //////////////////////////////////////////////////////////////////////////////
--- a/libgui/src/main-window.cc +++ b/libgui/src/main-window.cc @@ -25,6 +25,7 @@ #include <config.h> #endif +#include <QKeySequence> #include <QApplication> #include <QLabel> #include <QMenuBar> @@ -630,6 +631,18 @@ workspace_window->connect_visibility_changed (); } +void +main_window::copyClipboard (void) +{ + emit copyClipboard_signal (); +} + +void +main_window::pasteClipboard (void) +{ + emit pasteClipboard_signal (); +} + // Connect the signals emitted when the Octave thread wants to create // a dialog box of some sort. Perhaps a better place for this would be // as part of the QUIWidgetCreator class. However, mainWindow currently @@ -946,8 +959,6 @@ _open_action = file_menu->addAction (QIcon (":/actions/icons/fileopen.png"), tr ("Open...")); - _open_action->setShortcut (QKeySequence::Open); - _open_action->setShortcutContext (Qt::ApplicationShortcut); #ifdef HAVE_QSCINTILLA file_menu->addMenu (editor_window->get_mru_menu ()); @@ -1026,27 +1037,16 @@ edit_menu->addSeparator (); - _cut_action - = edit_menu->addAction (QIcon (":/actions/icons/editcut.png"), tr ("Cut")); - _cut_action->setShortcut (ctrl_shift + Qt::Key_X); - _copy_action - = edit_menu->addAction (QIcon (":/actions/icons/editcopy.png"), tr ("Copy")); + = edit_menu->addAction (QIcon (":/actions/icons/editcopy.png"), + tr ("Copy")); _copy_action->setShortcut (ctrl_shift + Qt::Key_C); _paste_action - = edit_menu->addAction (QIcon (":/actions/icons/editpaste.png"), tr ("Paste")); + = edit_menu->addAction (QIcon (":/actions/icons/editpaste.png"), + tr ("Paste")); _paste_action->setShortcut (ctrl_shift + Qt::Key_V); - QAction *select_all_action - = edit_menu->addAction (tr ("Select All")); - select_all_action->setEnabled (false); // TODO: Make this work. - - QAction *delete_action - = edit_menu->addAction (tr ("Delete")); - delete_action->setShortcut (Qt::Key_Delete); - delete_action->setEnabled (false); // TODO: Make this work. - edit_menu->addSeparator (); QAction *find_files_action @@ -1065,10 +1065,10 @@ = edit_menu->addAction (tr ("Clear Workspace")); connect (_copy_action, SIGNAL (triggered()), - command_window, SLOT (copyClipboard ())); + this, SLOT (copyClipboard ())); connect (_paste_action, SIGNAL (triggered()), - command_window, SLOT (pasteClipboard ())); + this, SLOT (pasteClipboard ())); connect (find_files_action, SIGNAL (triggered()), this, SLOT (find_files ())); @@ -1334,7 +1334,6 @@ _main_tool_bar->addSeparator (); - _main_tool_bar->addAction (_cut_action); _main_tool_bar->addAction (_copy_action); _main_tool_bar->addAction (_paste_action); _main_tool_bar->addAction (_undo_action);
--- a/libgui/src/main-window.h +++ b/libgui/src/main-window.h @@ -86,6 +86,9 @@ void update_breakpoint_marker_signal (bool insert, const QString& file, int line); + void copyClipboard_signal (void); + void pasteClipboard_signal (void); + public slots: void report_status_message (const QString& statusMessage); void handle_save_workspace_request (void); @@ -138,6 +141,9 @@ void write_settings (void); void connect_visibility_changed (void); + void copyClipboard (void); + void pasteClipboard (void); + void connect_uiwidget_links (); void handle_create_dialog (const QString& message, const QString& title, @@ -256,7 +262,6 @@ QAction *_new_script_action; QAction *_open_action; - QAction *_cut_action; QAction *_copy_action; QAction *_paste_action; QAction *_undo_action;
--- a/libgui/src/octave-qt-link.cc +++ b/libgui/src/octave-qt-link.cc @@ -39,6 +39,12 @@ #include "octave-qt-link.h" +#if defined (Q_OS_WIN32) +#define WIN32_LEAN_AND_MEAN +#define _WIN32_WINNT 0x0500 +#include <windows.h> +#endif + octave_qt_link::octave_qt_link (octave_main_thread *mt) : octave_link (), main_thread (mt) { } @@ -371,11 +377,25 @@ void octave_qt_link::do_pre_input_event (void) { +#if defined (Q_OS_WIN32) + // Disable Ctrl-C processing on stdin. + HANDLE hStdIn = GetStdHandle (STD_INPUT_HANDLE); + DWORD mode; + GetConsoleMode (hStdIn, &mode); + SetConsoleMode (hStdIn, mode & ~ ENABLE_PROCESSED_INPUT); +#endif } void octave_qt_link::do_post_input_event (void) { +#if defined (Q_OS_WIN32) + // Enable Ctrl-C processing on stdin. + HANDLE hStdIn = GetStdHandle (STD_INPUT_HANDLE); + DWORD mode; + GetConsoleMode (hStdIn, &mode); + SetConsoleMode (hStdIn, mode | ENABLE_PROCESSED_INPUT); +#endif } void
--- a/libgui/src/terminal-dock-widget.cc +++ b/libgui/src/terminal-dock-widget.cc @@ -36,21 +36,8 @@ setObjectName ("TerminalDockWidget"); setWindowIcon (QIcon(":/actions/icons/logo.png")); setWindowTitle (tr ("Command Window")); + setWidget (terminal); - - connect (this, SIGNAL (visibilityChanged (bool)), - this, SLOT (handle_visibility (bool))); - - // Forward signals to QTerminal widget. - - connect (this, SIGNAL (notice_settings_signal (const QSettings *)), - terminal, SLOT (notice_settings (const QSettings *))); - - connect (this, SIGNAL (copyClipboard_signal (void)), - terminal, SLOT (copyClipboard (void))); - - connect (this, SIGNAL (pasteClipboard_signal (void)), - terminal, SLOT (pasteClipboard (void))); } bool @@ -62,24 +49,6 @@ } void -terminal_dock_widget::notice_settings (const QSettings *settings) -{ - emit notice_settings_signal (settings); -} - -void -terminal_dock_widget::copyClipboard (void) -{ - emit copyClipboard_signal (); -} - -void -terminal_dock_widget::pasteClipboard (void) -{ - emit pasteClipboard_signal (); -} - -void terminal_dock_widget::focus (void) { octave_dock_widget::focus ();
--- a/libgui/src/terminal-dock-widget.h +++ b/libgui/src/terminal-dock-widget.h @@ -39,26 +39,8 @@ bool has_focus (void) const; -signals: - -public slots: - - void notice_settings (const QSettings *settings); - - void copyClipboard (void); - - void pasteClipboard (void); - void focus (void); -signals: - - void notice_settings_signal (const QSettings *settings); - - void copyClipboard_signal (void); - - void pasteClipboard_signal (void); - private: QTerminal *terminal;