23 #include <QApplication> 27 #include <QGridLayout> 28 #include <QPaintEvent> 30 #include <QResizeEvent> 37 #include <QMessageBox> 38 #include <QDragEnterEvent> 47 #define WIN32_LEAN_AND_MEAN 48 #if ! defined (_WIN32_WINNT) && ! defined (NTDDI_VERSION) 49 #define _WIN32_WINNT 0x0500 52 #include <versionhelpers.h> 62 #define LOGFILENAME "QConsole.log" 64 #define HIDDEN_CONSOLE 67 # pragma warning(disable : 4996) 105 QString esc =
"\x1b";
108 if (ev->key () == Qt::Key_Delete)
110 else if (!ev->text ().isEmpty ())
149 case Qt::Key_PageDown:
197 void log (
const char* fmt, ...);
201 const char* devName);
216 void setCursorColor (
bool useForegroundColor,
const QColor& color);
222 void drawSelection (QPainter&
p,
int cx1,
int cy1,
int cx2,
int cy2,
227 void drawText (QPainter&
p,
int cx1,
int cy1,
int cx2,
int cy2,
275 if (end.y () < begin.y ()
276 || (end.y () == begin.y () && end.x () < begin.x ()))
283 : q (parent), m_command (cmd), m_auto_scroll (true), m_cursorBlinking (
false),
284 m_hasBlinkingCursor (true), m_cursorType (
BlockCursor),
285 m_beginSelection (0, 0), m_endSelection (0, 0), m_settingSelection (
false),
286 m_process (NULL), m_inWheelEvent (
false)
291 log (
"Detaching from existing console (if any)...\n");
293 log (
"Closing standard IO...\n");
298 #ifdef HIDDEN_CONSOLE 299 HWINSTA hOrigSta, hNewSta;
302 hOrigSta = GetProcessWindowStation ();
303 hNewSta = CreateWindowStation (NULL, 0, GENERIC_ALL, NULL);
304 log (
"Current Windows station: %p.\nNew Windows station: %p.\n", hOrigSta,
306 if (! SetProcessWindowStation (hNewSta))
307 log (
"Failed to switch to new Windows station.\n");
309 if (! AllocConsole ())
310 log (
"Failed to create new console.\n");
311 #ifdef HIDDEN_CONSOLE 312 if (! SetProcessWindowStation (hOrigSta))
313 log (
"Failed to restore original Windows station.\n");
314 if (! CloseWindowStation (hNewSta))
315 log (
"Failed to close new Windows station.\n");
318 log (
"New (hidden) console created.\n");
324 log (
"Standard input/output/error set up.\n");
326 *stdin = *(fdopen (0,
"rb"));
327 *stdout = *(fdopen (1,
"wb"));
328 *stderr = *(fdopen (2,
"wb"));
330 log (
"POSIX standard streams created.\n");
332 setvbuf (stdin, NULL, _IONBF, 0);
333 setvbuf (stdout, NULL, _IONBF, 0);
334 setvbuf (stderr, NULL, _IONBF, 0);
336 log (
"POSIX standard stream buffers adjusted.\n");
338 HANDLE hStdOut = GetStdHandle (STD_OUTPUT_HANDLE);
340 log (
"Console allocated: hStdOut: %p\n", hStdOut);
346 #ifdef HIDDEN_CONSOLE 350 CONSOLE_SCREEN_BUFFER_INFO sbi;
352 GetConsoleScreenBufferInfo (hStdOut, &sbi);
353 m_bufferSize = QSize (sbi.dwSize.X, qMax (sbi.dwSize.Y, (SHORT)500));
355 sbi.srWindow.Right - sbi.srWindow.Left + 1,
356 sbi.srWindow.Bottom - sbi.srWindow.Top + 1);
357 m_cursorPos = QPoint (sbi.dwCursorPosition.X, sbi.dwCursorPosition.Y);
359 log (
"Initial console parameters:\n");
362 log (
" window: (%d, %d) -> (%d, %d) [%d x %d]\n",
367 wchar_t titleBuf[260];
368 GetConsoleTitleW (titleBuf,
sizeof (titleBuf));
369 q->setWindowTitle (QString::fromWCharArray (titleBuf));
371 m_font.setFamily (
"Lucida Console");
373 m_font.setStyleHint (QFont::TypeWriter);
381 QGridLayout* l =
new QGridLayout (parent);
382 l->setContentsMargins (0, 0, 0, 0);
388 if (IsWindows7OrGreater ())
390 SetConsoleCP (65001);
391 SetConsoleOutputCP (65001);
400 SetConsoleTextAttribute (
m_stdOut, 0xF0);
415 parent->setFocusPolicy (Qt::StrongFocus);
469 const char*
name,
const char* devName)
471 log (
"Opening %s...\n", devName);
473 int fd = open (devName, _O_RDWR | _O_BINARY);
479 log (
"Opened %s is not at target file descriptor %d, " 480 "duplicating...\n",
name, targetFd);
481 if (
dup2 (fd, targetFd) == -1)
482 log (
"Failed to duplicate file descriptor: errno=%d.\n", errno);
483 if (close (fd) == -1)
484 log (
"Failed to close original file descriptor: errno=%d.\n",
488 log (
"%s opened and assigned to file descriptor %d.\n", devName, fd);
489 if (! SetStdHandle (stdHandleId, (HANDLE) _get_osfhandle (targetFd)))
490 log (
"Failed to re-assign %s: error=%08x.\n",
name, GetLastError ());
493 log (
"Failed to open %s: errno=%d.\n", devName, errno);
514 COORD bufSize, bufCoord;
518 nr = end.y () - begin.y () + 1;
527 bufRect.Top = begin.y ();
528 bufRect.Bottom = end.y ();
530 if (ReadConsoleOutput (
m_stdOut, buf, bufSize, bufCoord, &bufRect))
532 int start_pos = begin.x ();
533 int end_pos = (nr - 1) *
m_bufferSize.width () + end.x ();
534 int lastNonSpace = -1;
536 for (
int i = start_pos;
i <= end_pos;
i++)
540 if (lastNonSpace >= 0)
541 selection.truncate (lastNonSpace);
542 selection.append (
'\n');
543 lastNonSpace = selection.length ();
546 QChar
c (buf[
i].Char.UnicodeChar);
550 selection.append (
c);
552 lastNonSpace = selection.length ();
555 if (lastNonSpace >= 0)
556 selection.truncate (lastNonSpace);
607 QPalette palette (color);
629 CONSOLE_SCREEN_BUFFER_INFO sbi;
630 GetConsoleScreenBufferInfo (
m_stdOut, &sbi);
638 int cx2,
int cy2,
int cw,
int ch)
642 int ascent =
p.fontMetrics ().ascent ();
644 int y = ascent + cy1 * ch;;
646 for (
int j = cy1; j <= cy2; j++,
y += ch)
649 bool hasChar =
false;
653 for (
int i = cx1;
i <= cx2;
i++)
657 if ((ci->Attributes & 0x00ff) != attr)
663 if (hasChar || (attr & 0x00f0))
666 p.fillRect (
x,
y-ascent, len * cw, ch,
p.brush ());
674 attr = (ci->Attributes & 0x00ff);
675 p.setBrush (
m_colors[(attr >> 4) & 0x000f]);
680 if (ci->Char.UnicodeChar != L
' ')
684 if (len != 0 && (hasChar || (attr & 0x00f0)))
691 p.fillRect (
x,
y-ascent, len * cw, ch,
p.brush ());
708 QPoint begin = cellpos;
709 QPoint end = cellpos;
717 begin.ry () -= verticalScrollOffset;
718 end.ry () -= verticalScrollOffset;
720 begin.rx () -= horizontalScrollOffset;
721 end.rx () -= horizontalScrollOffset;
724 if (QChar(
m_buffer[begin.y ()*stride + begin.x ()].Char.UnicodeChar).isSpace () ==
false)
727 while(begin.x () > 0 &&
728 QChar(
m_buffer[begin.y ()*stride + begin.x () -1].Char.UnicodeChar).isSpace() ==
false)
734 QChar(
m_buffer[end.y ()*stride + end.x () +1].Char.UnicodeChar).isSpace() ==
false)
741 while(begin.x () > 0 &&
742 QChar(
m_buffer[begin.y ()*stride + begin.x () -1].Char.UnicodeChar).isSpace())
748 QChar(
m_buffer[end.y ()*stride + end.x () +1].Char.UnicodeChar).isSpace ())
755 begin.ry () += verticalScrollOffset;
756 end.ry () += verticalScrollOffset;
758 begin.rx () += horizontalScrollOffset;
759 end.rx () += horizontalScrollOffset;
776 int cx2,
int cy2,
int cw,
int ch)
783 bool haveSelection = (begin != end);
791 begin.ry () -= verticalScrollOffset;
792 end.ry () -= verticalScrollOffset;
794 begin.rx () -= horizontalScrollOffset;
795 end.rx () -= horizontalScrollOffset;
797 int ascent =
p.fontMetrics ().ascent ();
800 int y = ascent + cy1 * ch;;
801 for (
int j = cy1; j <= cy2; j++,
y += ch)
803 int charsThisLine = 0;
805 bool hasChar =
false;
808 for (
int i = cx1;
i <= cx2;
i++)
812 if ((ci->Attributes & 0x00ff) != attr)
817 charsThisLine += len;
823 attr = (ci->Attributes & 0x00ff);
828 if (ci->Char.UnicodeChar != L
' ')
832 if (len != 0 && (hasChar || (attr & 0x00f0)))
833 charsThisLine += len;
835 if (haveSelection && j >= begin.y () && j <= end.y ())
837 int selectionBegin = j == begin.y () ? begin.x (): 0;
839 int len = ((j == end.y () && end.x () < charsThisLine)
840 ? end.x () - selectionBegin + 1
841 : stride - selectionBegin);
843 p.fillRect (selectionBegin * cw,
y-ascent, len * cw, ch,
865 p.fillRect (rect, color);
871 int penWidth = qMax (1,
p.pen().width());
873 p.drawRect (rect.adjusted (penWidth/2, penWidth/2,
874 - penWidth/2 - penWidth%2,
875 - penWidth/2 - penWidth%2));
880 p.drawLine (rect.left (), rect.bottom (),
881 rect.right (), rect.bottom ());
885 p.drawLine (rect.left (), rect.top (),
886 rect.left (), rect.bottom ());
894 int cx2,
int cy2,
int cw,
int ch)
902 s.reserve (cx2 - cx1 + 1);
904 int ascent =
p.fontMetrics ().ascent ();
907 int y = ascent + cy1 * ch;;
908 for (
int j = cy1; j <= cy2; j++,
y += ch)
912 bool hasChar =
false;
916 for (
int i = cx1;
i <= cx2;
i++)
920 if ((ci->Attributes & 0x00ff) != attr)
926 if (hasChar || (attr & 0x00f0))
927 p.drawText (
x,
y,
s);
929 x += (
s.length () * cw);
934 attr = (ci->Attributes & 0x00ff);
939 s.append (ci->Char.UnicodeChar);
940 if (ci->Char.UnicodeChar != L
' ')
944 if (!
s.isEmpty () && (hasChar || (attr & 0x00f0)))
950 p.drawText (
x,
y,
s);
962 if (close (fd) == -1)
963 log (
"Failed to close file descriptor %d: errno=%d.\n", fd, errno);
964 if (! CloseHandle (GetStdHandle (stdHandleId)))
965 log (
"Failed to close Win32 %s: error=%08x.\n",
name, GetLastError ());
972 #ifdef DEBUG_QCONSOLE 979 vfprintf (flog, fmt, l);
1001 m_charSize.rwidth () = fm.averageCharWidth ();
1004 m_consoleRect.setWidth (winSize.width () / fm.averageCharWidth ());
1005 m_consoleRect.setHeight (winSize.height () / fm.lineSpacing ());
1036 log (
"Console resized:\n");
1037 log (
" widget size: %d x %d\n", winSize.width (), winSize.height ());
1040 log (
" window: (%d, %d) -> (%d, %d) [%d x %d]\n",
1056 CONSOLE_SCREEN_BUFFER_INFO sbi;
1059 GetConsoleScreenBufferInfo (hStdOut, &sbi);
1064 bs.X = sbi.dwSize.X;
1066 sr.Left = sbi.srWindow.Left;
1067 sr.Right = sbi.srWindow.Right;
1071 if (bs.Y > sbi.dwSize.Y)
1073 SetConsoleScreenBufferSize (hStdOut, bs);
1074 SetConsoleWindowInfo (hStdOut, TRUE, &sr);
1078 SetConsoleWindowInfo (hStdOut, TRUE, &sr);
1079 SetConsoleScreenBufferSize (hStdOut, bs);
1086 if (bs.X > sbi.dwSize.X)
1088 SetConsoleScreenBufferSize (hStdOut, bs);
1089 SetConsoleWindowInfo (hStdOut, TRUE, &sr);
1093 SetConsoleWindowInfo (hStdOut, TRUE, &sr);
1094 SetConsoleScreenBufferSize (hStdOut, bs);
1097 log (
"Sync'ing console parameters:\n");
1098 log (
" buffer size: %d x %d\n", bs.X, bs.Y);
1099 log (
" window: (%d, %d) -> (%d, %d)\n",
1100 sr.Left, sr.Top, sr.Right, sr.Bottom);
1130 log (
"ReadConsoleOutput (%d,%d) -> (%d,%d)\n", r.Left, r.Top, r.Right, r.Bottom);
1132 qCritical (
"cannot read console output");
1148 log (
"Horizontal scrollbar parameters updated: %d/%d/%d/%d\n",
1166 log (
"Vertical scrollbar parameters updated: %d/%d/%d/%d\n",
1189 log (
"Scrolling window horizontally: (%d, %d) -> (%d, %d) [%d x %d]\n",
1190 r.Left, r.Top, r.Right, r.Bottom,
1191 r.Right - r.Left + 1, r.Bottom - r.Top + 1);
1193 if (SetConsoleWindowInfo (hStdOut, TRUE, &r))
1216 log (
"Scrolling window vertically: (%d, %d) -> (%d, %d) [%d x %d]\n",
1217 r.Left, r.Top, r.Right, r.Bottom,
1218 r.Right - r.Left + 1, r.Bottom - r.Top + 1);
1220 if (SetConsoleWindowInfo (hStdOut, TRUE, &r))
1224 CONSOLE_SCREEN_BUFFER_INFO sbi;
1225 if (GetConsoleScreenBufferInfo (hStdOut, &sbi))
1251 CONSOLE_SCREEN_BUFFER_INFO sbi;
1252 HANDLE hStdOut = GetStdHandle (STD_OUTPUT_HANDLE);
1254 static wchar_t titleBuf[260];
1256 GetConsoleTitleW (titleBuf,
sizeof (titleBuf));
1257 QString title = QString::fromWCharArray (titleBuf);
1261 q->setWindowTitle (title);
1265 if (GetConsoleScreenBufferInfo (hStdOut, &sbi))
1300 log (
"--> Console window changed\n");
1302 sbi.srWindow.Right - sbi.srWindow.Left + 1,
1303 sbi.srWindow.Bottom - sbi.srWindow.Top + 1);
1333 cmd = qgetenv (
"COMSPEC").constData ();
1335 if (! cmd.isEmpty ())
1338 PROCESS_INFORMATION
pi;
1340 ZeroMemory (&si,
sizeof (si));
1341 si.cb =
sizeof (si);
1342 ZeroMemory (&
pi,
sizeof (
pi));
1344 if (CreateProcessW (NULL,
1345 (LPWSTR)cmd.unicode (),
1355 CloseHandle (
pi.hThread);
1371 #define TEXT_CHUNK_SIZE 512 1378 int len =
s.length ();
1380 DWORD nEvents = 0, written;
1381 HANDLE hStdIn = GetStdHandle (STD_INPUT_HANDLE);
1383 ZeroMemory (events,
sizeof (events));
1385 for (
int i = 0;
i < len;
i++)
1389 if (
c == L
'\r' ||
c == L
'\n')
1391 if (
c == L
'\r' &&
i < (len - 1) &&
s.at (
i+1) == L
'\n')
1395 events[nEvents].EventType = KEY_EVENT;
1396 events[nEvents].Event.KeyEvent.bKeyDown = TRUE;
1397 events[nEvents].Event.KeyEvent.wRepeatCount = 1;
1398 events[nEvents].Event.KeyEvent.wVirtualKeyCode =
1400 events[nEvents].Event.KeyEvent.wVirtualScanCode = 0;
1401 events[nEvents].Event.KeyEvent.uChar.UnicodeChar =
c.unicode ();
1402 events[nEvents].Event.KeyEvent.dwControlKeyState = 0;
1405 WriteConsoleInput (hStdIn, events, nEvents, &written);
1407 ZeroMemory (events,
sizeof (events));
1412 events[nEvents].EventType = KEY_EVENT;
1413 events[nEvents].Event.KeyEvent.bKeyDown = TRUE;
1414 events[nEvents].Event.KeyEvent.wRepeatCount = 1;
1415 events[nEvents].Event.KeyEvent.wVirtualKeyCode =
1416 LOBYTE (VkKeyScan (
c.unicode ()));
1417 events[nEvents].Event.KeyEvent.wVirtualScanCode = 0;
1418 events[nEvents].Event.KeyEvent.uChar.UnicodeChar =
c.unicode ();
1419 events[nEvents].Event.KeyEvent.dwControlKeyState = 0;
1424 || (nEvents > 0 &&
i == (len - 1)))
1426 WriteConsoleInput (hStdIn, events, nEvents, &written);
1428 ZeroMemory (events,
sizeof (events));
1450 installEventFilter (
this);
1458 parent, SLOT (set_screen_size (
int,
int)));
1460 setAcceptDrops (
true);
1493 else if (event->button () == Qt::LeftButton)
1515 if (event->button () == Qt::LeftButton)
1524 QTimer::singleShot (QApplication::doubleClickInterval (),
this,
1532 if (event->button () == Qt::LeftButton)
1560 QRect updateRect =
event->rect ();
1562 int cx1 = updateRect.left () / cw;
1563 int cy1 = updateRect.top () / ch;
1564 int cx2 = qMin (
d->
m_consoleRect.width () - 1, updateRect.right () / cw);
1565 int cy2 = qMin (
d->
m_consoleRect.height () - 1, updateRect.bottom () / ch);
1660 QWidget::focusInEvent (event);
1672 QWidget::focusOutEvent (event);
1679 if (event->type () == QEvent::KeyPress)
1681 QKeyEvent*
k =
static_cast<QKeyEvent*
>(event);
1682 if (
k->key () == Qt::Key_Tab)
1705 QWidget::keyPressEvent (event);
1758 const QColor& color)
1782 d->
log (
"emit set_screen_size_signal (%d, %d)\n", columns, lines);
1791 if(!hasFocus())
return;
1793 QClipboard *clipboard = QApplication::clipboard ();
1797 if (selection.isEmpty ())
1804 clipboard->setText (selection);
1813 if(!hasFocus())
return;
1815 QString
text = QApplication::clipboard()->
text (QClipboard::Clipboard);
1817 if (!
text.isEmpty ())
1825 if(!hasFocus())
return;
1844 if (event->mimeData ()->hasUrls ())
1846 event->acceptProposedAction();
1856 if (event->mimeData ()->hasUrls ())
1858 foreach (QUrl
url, event->mimeData ()->urls ())
1860 if(dropText.length () > 0)
1862 dropText +=
url.toLocalFile ();
QScrollBar * m_verticalScrollBar
int dup2(int old_fd, int new_fd)
QConsoleView * m_consoleView
void horizontalScrollValueChanged(int value)
void resizeEvent(QResizeEvent *event)
void setScrollBufferSize(int value)
void setBlinkingCursor(bool blink)
QConsoleThread * m_consoleThread
void updateHorizontalScrollBar(void)
void log(const char *fmt,...)
void focusOutEvent(QFocusEvent *)
friend class QConsoleView
void drawSelection(QPainter &p, int cx1, int cy1, int cx2, int cy2, int cw, int ch)
void setCursorType(CursorType type, bool blinking)
F77_RET_T const F77_REAL const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE &F77_RET_T const F77_DBLE F77_DBLE &F77_RET_T const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE * f
for fields that display a single number
void selectWord(const QPoint &cellPos)
void tripleClickTimeout(void)
void terminal_interrupt(void)
void updateConsoleView(bool grab=true)
QConsolePrivate(QWinTerminalImpl *parent, const QString &cmd=QString())
void set_global_shortcuts_signal(bool)
void titleChanged(const QString &)
void monitorConsole(void)
void syncConsoleParameters(void)
void updateSelection(void)
friend class QConsoleThread
nd example oindent opens the file binary numeric values will be read assuming they are stored in IEEE format with the least significant bit and then converted to the native representation Opening a file that is already open simply opens it again and returns a separate file id It is not an error to open a file several though writing to the same file through several different file ids may produce unexpected results The possible values of text mode reading and writing automatically converts linefeeds to the appropriate line end character for the you may append a you must also open the file in binary mode The parameter conversions are currently only supported for and permissions will be set to and then everything is written in a single operation This is very efficient and improves performance c
void closeStandardIO(int fd, DWORD stdHandleId, const char *name)
F77_RET_T const F77_REAL const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE &F77_RET_T const F77_DBLE F77_DBLE &F77_RET_T const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE * d
void updateConsoleSize(bool sync=false, bool allow_smaller_width=false)
void monitorConsole(void)
QColor foregroundColor(void) const
void init_terminal_size(void)
nd deftypefn *std::string name
void sendConsoleText(const QString &s)
void grabConsoleBuffer(CHAR_INFO *buf=0)
void setCursorColor(bool useForegoundColor, const QColor &color)
void setSelectionColor(const QColor &color)
QTimer * m_consoleWatcher
OCTAVE_EXPORT octave_value_list or both For fclose
void report_status_message(const QString &)
void set_global_shortcuts(bool focus_out)
static const int BLINK_DELAY
text(const graphics_handle &mh, const graphics_handle &p)
void verticalScrollValueChanged(int value)
std::complex< double > w(std::complex< double > z, double relerr=0)
QString getSelection(void)
void clearSelection(void)
QConsoleView(QWinTerminalImpl *parent=0)
void setHorizontalScrollValue(int value)
void setForegroundColor(const QColor &color)
void mouseReleaseEvent(QMouseEvent *event)
void keyPressEvent(QKeyEvent *)
static QString translateKey(QKeyEvent *ev)
void setScrollBufferSize(int value)
void sendText(const QString &s)
returns the type of the matrix and caches it for future use Called with more than one the function will not attempt to guess the type if it is still unknown This is useful for debugging purposes The possible matrix types depend on whether the matrix is full or and can be one of the following able sis tem and mark type as unknown tem as the structure of the matrix explicitly gives this(Sparse matrices only) tem code
void paintEvent(QPaintEvent *event)
void mouseTripleClickEvent(QMouseEvent *event)
void focusInEvent(QFocusEvent *)
void set_screen_size_signal(int, int)
QPoint posToCell(const QPoint &pt)
void setSize(int columns, int lines)
void setBackgroundColor(const QColor &color)
void setBackgroundColor(const QColor &color)
void has_extra_interrupt(bool)
void setBlinkingCursorState(bool blink)
void viewPaintEvent(QConsoleView *, QPaintEvent *)
QColor backgroundColor(void) const
void dropEvent(QDropEvent *event)
void drawTextBackground(QPainter &p, int cx1, int cy1, int cx2, int cy2, int cw, int ch)
void setTerminalFont(const QFont &font)
void viewResizeEvent(QConsoleView *, QResizeEvent *)
bool eventFilter(QObject *obj, QEvent *ev)
void setForegroundColor(const QColor &color)
the element is set to zero In other the statement xample y
QWinTerminalImpl(QWidget *parent=0)
void pasteClipboard(void)
void dragEnterEvent(QDragEnterEvent *event)
void mouseMoveEvent(QMouseEvent *event)
void drawText(QPainter &p, int cx1, int cy1, int cx2, int cy2, int cw, int ch)
QConsoleThread(QWinTerminalImpl *console)
QColor selectionColor(void) const
void setVerticalScrollValue(int value)
void setSelectionColor(const QColor &color)
void mouseDoubleClickEvent(QMouseEvent *event)
void mousePressEvent(QMouseEvent *event)
static void maybeSwapPoints(QPoint &begin, QPoint &end)
void updateSelection(void)
void wheelEvent(QWheelEvent *)
void updateVerticalScrollBar(void)
nd group nd example For each display the value
KeyboardCursorType m_cursorType
void drawCursor(QPainter &p)
void selectLine(const QPoint &cellPos)
void setCursorColor(bool useForegroundColor, const QColor &color)
void setupStandardIO(DWORD stdHandleId, int fd, const char *name, const char *devName)
F77_RET_T const F77_REAL const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE &F77_RET_T const F77_DBLE F77_DBLE &F77_RET_T const F77_REAL F77_REAL &F77_RET_T const F77_DBLE * x
QTimer * m_blinkCursorTimer
QScrollBar * m_horizontalScrollBar
void blinkCursorEvent(void)
QColor cursorColor(void) const