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	Mon May 13 05:58:12 2013 -0400
+++ b/libgui/qterminal/libqterminal/QTerminal.h	Mon May 13 07:26:37 2013 -0400
@@ -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	Mon May 13 05:58:12 2013 -0400
+++ b/libgui/qterminal/libqterminal/unix/TerminalView.cpp	Mon May 13 07:26:37 2013 -0400
@@ -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	Mon May 13 05:58:12 2013 -0400
+++ b/libgui/qterminal/libqterminal/win32/QWinTerminalImpl.cpp	Mon May 13 07:26:37 2013 -0400
@@ -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	Mon May 13 05:58:12 2013 -0400
+++ b/libgui/src/main-window.cc	Mon May 13 07:26:37 2013 -0400
@@ -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	Mon May 13 05:58:12 2013 -0400
+++ b/libgui/src/main-window.h	Mon May 13 07:26:37 2013 -0400
@@ -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	Mon May 13 05:58:12 2013 -0400
+++ b/libgui/src/octave-qt-link.cc	Mon May 13 07:26:37 2013 -0400
@@ -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	Mon May 13 05:58:12 2013 -0400
+++ b/libgui/src/terminal-dock-widget.cc	Mon May 13 07:26:37 2013 -0400
@@ -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	Mon May 13 05:58:12 2013 -0400
+++ b/libgui/src/terminal-dock-widget.h	Mon May 13 07:26:37 2013 -0400
@@ -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;