# HG changeset patch # User Jacob Dawid # Date 1313696314 -7200 # Node ID aa54bdaee8c8aee8c720af4e19576b3515bc2337 # Parent b31663fb7e8ac8196e4d7c4c425c989cd6fe8b83 Partially resotred receiving data. diff -r b31663fb7e8a -r aa54bdaee8c8 gui/octave-gui.pro --- a/gui/octave-gui.pro Thu Aug 18 20:45:00 2011 +0200 +++ b/gui/octave-gui.pro Thu Aug 18 21:38:34 2011 +0200 @@ -58,7 +58,6 @@ # Files associated with the project: SOURCES +=\ src/lexer/lexeroctavegui.cpp \ - src/terminal/konsole_wcwidth.cpp \ src/terminal/Pty.cpp \ src/terminal/kpty.cpp \ src/terminal/kptyprocess.cpp \ @@ -86,8 +85,6 @@ HEADERS += \ src/lexer/lexeroctavegui.h \ - src/terminal/konsole_wcwidth.h \ - src/terminal/konsole_export.h \ src/terminal/Pty.h \ src/terminal/kpty.h \ src/terminal/kpty_p.h \ diff -r b31663fb7e8a -r aa54bdaee8c8 gui/src/OctaveTerminal.cpp --- a/gui/src/OctaveTerminal.cpp Thu Aug 18 20:45:00 2011 +0200 +++ b/gui/src/OctaveTerminal.cpp Thu Aug 18 21:38:34 2011 +0200 @@ -21,6 +21,7 @@ #include #include #include +#include #include "pty.h" #include "unistd.h" @@ -50,12 +51,10 @@ m_session->setProgram ("/bin/bash"); m_session->setArguments (QStringList ()); m_session->setAutoClose (true); - m_session->setCodec (QTextCodec::codecForName ("UTF-8")); m_session->setFlowControlEnabled (true); m_session->setDarkBackground (true); - connect (m_session, SIGNAL(receivedData(QString)), this, SLOT(appendPlainText(QString))); - + connect (m_session, SIGNAL(receivedData(QByteArray)), this, SLOT(handleReceivedData(QByteArray))); int fdm, fds; if (openpty (&fdm, &fds, 0, 0, 0) < 0) { @@ -75,7 +74,6 @@ //textToSend += QString::fromUtf8()); m_session->sendText(keyEvent->text ()); - keyEvent->accept (); /* bool emitKeyPressSignal = true; @@ -213,4 +211,17 @@ receiveData (translatorError.toAscii ().constData (), translatorError.count ()); }*/ + keyEvent->accept (); } + +void OctaveTerminal::handleReceivedData (const QByteArray& data) +{ + QTextCursor tc = textCursor (); + tc.movePosition (QTextCursor::End); + tc.insertText (data); + + if (verticalScrollBar ()) + { + verticalScrollBar ()->setValue (verticalScrollBar ()->maximum ()); + } +} diff -r b31663fb7e8a -r aa54bdaee8c8 gui/src/OctaveTerminal.h --- a/gui/src/OctaveTerminal.h Thu Aug 18 20:45:00 2011 +0200 +++ b/gui/src/OctaveTerminal.h Thu Aug 18 21:38:34 2011 +0200 @@ -34,6 +34,9 @@ protected: void keyPressEvent (QKeyEvent *keyEvent); +protected slots: + void handleReceivedData (const QByteArray& data); + private: void construct (); Session *m_session; diff -r b31663fb7e8a -r aa54bdaee8c8 gui/src/terminal/Session.cpp --- a/gui/src/terminal/Session.cpp Thu Aug 18 20:45:00 2011 +0200 +++ b/gui/src/terminal/Session.cpp Thu Aug 18 21:38:34 2011 +0200 @@ -138,12 +138,6 @@ void Session::openTeletype (int fd) { - if (_shellProcess && isRunning ()) - { - //kWarning() << "Attempted to open teletype in a running session."; - return; - } - delete _shellProcess; if (fd < 0) @@ -151,19 +145,10 @@ else _shellProcess = new Pty (fd); - //_shellProcess->setUtf8Mode (_emulation->utf8 ()); - - //connect teletype to emulation backend connect (_shellProcess, SIGNAL (receivedData (const char *, int)), this, - SLOT (onReceiveBlock (const char *, int))); - //connect (_emulation, SIGNAL (sendData (const char *, int)), _shellProcess, -// SLOT (sendData (const char *, int))); - //connect (_emulation, SIGNAL (useUtf8Request (bool)), _shellProcess, - // SLOT (setUtf8Mode (bool))); + SLOT (onReceiveBlock (const char *, int))); connect (_shellProcess, SIGNAL (finished (int, QProcess::ExitStatus)), this, - SLOT (done (int))); - //connect (_emulation, SIGNAL (imageSizeChanged (int, int)), this, - // SLOT (updateWindowSize (int, int))); + SLOT (done (int))); } void @@ -185,30 +170,6 @@ } void -Session::setCodec (QTextCodec * codec) -{ - //emulation ()->setCodec (codec); -} - -bool -Session::setCodec (QByteArray name) -{ - QTextCodec *codec = QTextCodec::codecForName (name); - if (codec) - { - setCodec (codec); - return true; - } - return false; -} - -QByteArray -Session::codec () -{ - return QByteArray(); //_emulation->codec ()->name (); -} - -void Session::setProgram (const QString & program) { _program = ShellCommand::expand (program); @@ -227,88 +188,6 @@ _arguments = ShellCommand::expand (arguments); } -/* -QList < TerminalDisplay * >Session::views () const -{ - return _views; -}*/ - -/* -void -Session::addView (TerminalDisplay * widget) -{ - Q_ASSERT (!_views.contains (widget)); - - _views.append (widget); - - if (_emulation != 0) - { - // connect emulation - view signals and slots - connect (widget, SIGNAL (keyPressedSignal (QKeyEvent *)), _emulation, - SLOT (sendKeyEvent (QKeyEvent *))); - connect (widget, SIGNAL (mouseSignal (int, int, int, int)), _emulation, - SLOT (sendMouseEvent (int, int, int, int))); - connect (widget, SIGNAL (sendStringToEmu (const char *)), _emulation, - SLOT (sendString (const char *))); - - // allow emulation to notify view when the foreground process - // indicates whether or not it is interested in mouse signals - connect (_emulation, SIGNAL (programUsesMouseChanged (bool)), widget, - SLOT (setUsesMouse (bool))); - - widget->setUsesMouse (_emulation->programUsesMouse ()); - - widget->setScreenWindow (_emulation->createWindow ()); - } - - //connect view signals and slots - QObject::connect (widget, SIGNAL (changedContentSizeSignal (int, int)), - this, SLOT (onViewSizeChange (int, int))); - - QObject::connect (widget, SIGNAL (destroyed (QObject *)), this, - SLOT (viewDestroyed (QObject *))); -}*/ - -/* -void -Session::viewDestroyed (QObject * view) -{ - TerminalDisplay *display = (TerminalDisplay *) view; - - Q_ASSERT (_views.contains (display)); - - removeView (display); -}*/ - -/* -void -Session::removeView (TerminalDisplay * widget) -{ - _views.removeAll (widget); - - disconnect (widget, 0, this, 0); - - if (_emulation != 0) - { - // disconnect - // - key presses signals from widget - // - mouse activity signals from widget - // - string sending signals from widget - // - // ... and any other signals connected in addView() - disconnect (widget, 0, _emulation, 0); - - // disconnect state change signals emitted by emulation - disconnect (_emulation, 0, widget, 0); - } - - // close the session automatically when the last view is removed - if (_views.count () == 0) - { - close (); - } -} -*/ QString Session::checkProgram (const QString & program) const { @@ -329,40 +208,8 @@ } void -Session::terminalWarning (const QString & message) -{ - /* - static const QByteArray warningText = - QByteArray ("@info:shell Alert the user with red color text"); - QByteArray messageText = message.toLocal8Bit (); - - static const char redPenOn[] = "\033[1m\033[31m"; - static const char redPenOff[] = "\033[0m"; - - - _emulation->receiveData (redPenOn, strlen (redPenOn)); - _emulation->receiveData ("\n\r\n\r", 4); - _emulation->receiveData (warningText.constData (), - strlen (warningText.constData ())); - _emulation->receiveData (messageText.constData (), - strlen (messageText.constData ())); - _emulation->receiveData ("\n\r\n\r", 4); - _emulation->receiveData (redPenOff, strlen (redPenOff)); -*/ -} - -void Session::run () { - //check that everything is in place to run the session - if (_program.isEmpty ()) - { - //kWarning() << "Session::run() - program to run not set."; - } - if (_arguments.isEmpty ()) - { - //kWarning() << "Session::run() - no command line arguments specified."; - } if (_uniqueIdentifier.isNull ()) { _uniqueIdentifier = createUuid (); @@ -381,24 +228,6 @@ break; } - // if a program was specified via setProgram(), but it couldn't be found, print a warning - if (choice != 0 && choice < CHOICE_COUNT && !_program.isEmpty ()) - { - QString msg; - QTextStream msgStream (&msg); - msgStream << "Could not find '" << _program << "', starting '" << exec - << "' instead. Please check your profile settings."; - terminalWarning (msg); - //terminalWarning(i18n("Could not find '%1', starting '%2' instead. Please check your profile settings.",_program.toLatin1().data(),exec.toLatin1().data())); - } - // if none of the choices are available, print a warning - else if (choice == CHOICE_COUNT) - { - terminalWarning (QString - ("Could not find an interactive shell to start.")); - return; - } - // if no arguments are specified, fall back to program name QStringList arguments = _arguments.join (QChar (' ')).isEmpty ()? QStringList () << exec : _arguments; @@ -419,23 +248,8 @@ _hasDarkBackground ? "COLORFGBG=15;0" : "COLORFGBG=0;15"; _environment << backgroundColorHint; - int result = _shellProcess->start (exec, - arguments); - - if (result < 0) - { - QString msg; - QTextStream msgStream (&msg); - msgStream << QString ("Could not start program '") << exec << - QString ("' with arguments '") << arguments. - join (" ") << QString ("'."); - terminalWarning (msg); - // terminalWarning(i18n("Could not start program '%1' with arguments '%2'.", exec.toLatin1().data(), arguments.join(" ").toLatin1().data())); - return; - } - - _shellProcess->setWriteable (false); // We are reachable via kwrited. - + _shellProcess->start (exec, arguments); + _shellProcess->setWriteable (false); emit started (); } @@ -489,7 +303,7 @@ { QString cwd = caption; cwd = cwd.replace (QRegExp ("^~"), QDir::homePath ()); - emit openUrlRequest (cwd); + //emit openUrlRequest (cwd); } // change icon via \033]32;Icon\007 @@ -604,75 +418,8 @@ } void -Session::onViewSizeChange (int /*height */ , int /*width */ ) -{ - updateTerminalSize (); -} - -void -Session::updateTerminalSize () -{/* - QListIterator < TerminalDisplay * >viewIter (_views); - - int minLines = -1; - int minColumns = -1; - - // minimum number of lines and columns that views require for - // their size to be taken into consideration ( to avoid problems - // with new view widgets which haven't yet been set to their correct size ) - const int VIEW_LINES_THRESHOLD = 2; - const int VIEW_COLUMNS_THRESHOLD = 2; - - //select largest number of lines and columns that will fit in all visible views - - while (viewIter.hasNext ()) - { - TerminalDisplay *view = viewIter.next (); - if (view->isHidden () == false && - view->lines () >= VIEW_LINES_THRESHOLD && - view->columns () >= VIEW_COLUMNS_THRESHOLD) - { - minLines = - (minLines == -1) ? view->lines () : qMin (minLines, - view->lines ()); - minColumns = - (minColumns == -1) ? view->columns () : qMin (minColumns, - view->columns ()); - view->processFilters (); - } - } - - // backend emulation must have a _terminal of at least 1 column x 1 line in size - if (minLines > 0 && minColumns > 0) - { - _emulation->setImageSize (minLines, minColumns); - }*/ -} - -void -Session::updateWindowSize (int lines, int columns) -{ - Q_ASSERT (lines > 0 && columns > 0); - _shellProcess->setWindowSize (lines, columns); -} - -void Session::refresh () { - // attempt to get the shell process to redraw the display - // - // this requires the program running in the shell - // to cooperate by sending an update in response to - // a window size change - // - // the window size is changed twice, first made slightly larger and then - // resized back to its normal size so that there is actually a change - // in the window size (some shells do nothing if the - // new and old sizes are the same) - // - // if there is a more 'correct' way to do this, please - // send an email with method or patches to konsole-devel@kde.org - const QSize existingSize = _shellProcess->windowSize (); _shellProcess->setWindowSize (existingSize.height (), existingSize.width () + 1); @@ -704,19 +451,10 @@ { if (isRunning ()) { - //kWarning() << "Process" << _shellProcess->pid() << "did not respond to SIGHUP"; - - // close the pty and wait to see if the process finishes. If it does, - // the done() slot will have been called so we can return. Otherwise, - // emit the finished() signal regardless _shellProcess->pty ()->close (); if (_shellProcess->waitForFinished (3000)) - return; - - //kWarning() << "Unable to kill process" << _shellProcess->pid(); - } - - // Forced close. + return; + } QTimer::singleShot (1, this, SIGNAL (finished ())); } } @@ -725,7 +463,6 @@ Session::sendText (const QString & text) const { _shellProcess->sendData (text.toStdString().c_str(), text.length ()); - //_emulation->sendText (text); } void @@ -736,13 +473,7 @@ Session::~Session () { - //if (_foregroundProcessInfo) - // delete _foregroundProcessInfo; - //if (_sessionProcessInfo) - // delete _sessionProcessInfo; - //delete _emulation; delete _shellProcess; - //delete _zmodemProc; } void @@ -761,28 +492,15 @@ { if (_shellProcess->exitStatus () == QProcess::NormalExit) { - msgStream << "Program '" << _program << "' exited with statis " << + msgStream << "Program '" << _program << "' exited with status " << exitStatus << "."; - //message = i18n("Program '%1' exited with status %2.", _program.toLatin1().data(), exitStatus); - } else { msgStream << "Program '" << _program << "' crashed."; - //message = i18n("Program '%1' crashed.", _program.toLatin1().data()); - } - - //FIXME: See comments in Session::monitorTimerDone() - //KNotification::event("Finished", message , QPixmap(), - // QApplication::activeWindow(), - // KNotification::CloseWhenWidgetActivated); - } - - if (!_wantedClose && _shellProcess->exitStatus () != QProcess::NormalExit) - terminalWarning (message); - else - emit finished (); + } + emit finished (); } QStringList @@ -884,17 +602,7 @@ void Session::onReceiveBlock (const char *buf, int len) { - //_emulation->receiveData (buf, len); - emit receivedData (QString::fromLatin1 (buf, len)); -} - -void -Session::setSize (const QSize & size) -{ - if ((size.width () <= 1) || (size.height () <= 1)) - return; - - emit resizeRequest (size); + emit receivedData (QByteArray (buf, len)); } void diff -r b31663fb7e8a -r aa54bdaee8c8 gui/src/terminal/Session.h --- a/gui/src/terminal/Session.h Thu Aug 18 20:45:00 2011 +0200 +++ b/gui/src/terminal/Session.h Thu Aug 18 21:38:34 2011 +0200 @@ -239,9 +239,6 @@ ProfileChange = 50 // this clashes with Xterm's font change command }; - // Sets the text codec used by this sessions terminal emulation. - void setCodec (QTextCodec * codec); - public slots: /** * Starts the terminal session. @@ -304,17 +301,6 @@ void sendMouseEvent (int buttons, int column, int line, int eventType); - /** Sets the text codec used by this sessions terminal emulation. - * Overloaded to accept a QByteArray for convenience since DBus - * does not accept QTextCodec directky. - */ - bool setCodec (QByteArray codec); - - /** Returns the codec used to decode incoming characters in this - * terminal emulation - */ - QByteArray codec (); - /** Sets the session's title for the specified @p role to @p title. * This is an overloaded member function for setTitle(TitleRole, QString) * provided for convenience since enum data types may not be @@ -342,7 +328,7 @@ /** * Emitted when output is received from the terminal process. */ - void receivedData (const QString & text); + void receivedData (const QByteArray& data); /** Emitted when the session's title has changed. */ void titleChanged (); @@ -374,18 +360,6 @@ */ void changeForegroundColorRequest (const QColor &); - /** TODO: Document me. */ - void openUrlRequest (const QString & url); - - - /** - * Emitted when the terminal process requests a change - * in the size of the terminal window. - * - * @param size The requested window size in terms of lines and columns. - */ - void resizeRequest (const QSize & size); - /** * Emitted when a profile change command is received from the terminal. * @@ -407,23 +381,16 @@ void onReceiveBlock (const char *buffer, int len); void monitorTimerDone (); - void onViewSizeChange (int height, int width); - void activityStateSet (int); //automatically detach views from sessions when view is destroyed //void viewDestroyed (QObject * view); void updateFlowControlState (bool suspended); - void updateWindowSize (int lines, int columns); private: - void updateTerminalSize (); bool kill (int signal); - // print a warning message in the terminal. This is used - // if the program fails to start, or if the shell exits in - // an unsuccessful manner - void terminalWarning (const QString & message); + // checks that the binary 'program' is available and can be executed // returns the binary name if available or an empty string otherwise QString checkProgram (const QString & program) const; diff -r b31663fb7e8a -r aa54bdaee8c8 gui/src/terminal/konsole_export.h --- a/gui/src/terminal/konsole_export.h Thu Aug 18 20:45:00 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - This file is part of the KDE project - Copyright (C) 2009 Patrick Spendrin - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA. -*/ - -#ifndef KONSOLE_EXPORT_H -#define KONSOLE_EXPORT_H - -/* needed for KDE_EXPORT macros */ -//#include -#include -#define KDE_EXPORT -#define KDE_IMPORT - -#ifndef KONSOLEPRIVATE_EXPORT -#if defined(MAKE_KONSOLEPRIVATE_LIB) - /* We are building this library */ -#define KONSOLEPRIVATE_EXPORT KDE_EXPORT -#else - /* We are using this library */ -#define KONSOLEPRIVATE_EXPORT KDE_IMPORT -#endif -#endif - -#include -//#define kWarning(x) std::cout - -#include - -//#define i18n -inline QString -tr (char *buff, ...) -{ - char msg[2048]; - va_list arglist; - - va_start (arglist, buff); - - snprintf (msg, 2048, buff, arglist); - - va_end (arglist); - - return QString (msg); -} - -#define i18nc - - -//#define KDE_fseek ::fseek -//#define KDE_lseek ::lseek - - -#endif diff -r b31663fb7e8a -r aa54bdaee8c8 gui/src/terminal/konsole_wcwidth.cpp --- a/gui/src/terminal/konsole_wcwidth.cpp Thu Aug 18 20:45:00 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,220 +0,0 @@ -/* $XFree86: xc/programs/xterm/wcwidth.character,v 1.3 2001/07/29 22:08:16 tsi Exp $ */ -/* - * This is an implementation of wcwidth() and wcswidth() as defined in - * "The Single UNIX Specification, Version 2, The Open Group, 1997" - * - * - * Markus Kuhn -- 2001-01-12 -- public domain - */ - -#include "konsole_wcwidth.h" - -struct interval -{ - unsigned short first; - unsigned short last; -}; - -/* auxiliary function for binary search in interval table */ -static int -bisearch (quint16 ucs, const struct interval *table, int max) -{ - int min = 0; - int mid; - - if (ucs < table[0].first || ucs > table[max].last) - return 0; - while (max >= min) - { - mid = (min + max) / 2; - if (ucs > table[mid].last) - min = mid + 1; - else if (ucs < table[mid].first) - max = mid - 1; - else - return 1; - } - - return 0; -} - - -/* The following functions define the column width of an ISO 10646 - * character as follows: - * - * - The null character (U+0000) has a column width of 0. - * - * - Other C0/C1 control characters and DEL will lead to a return - * value of -1. - * - * - Non-spacing and enclosing combining characters (general - * category code Mn or Me in the Unicode database) have a - * column width of 0. - * - * - Other format characters (general category code Cf in the Unicode - * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. - * - * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) - * have a column width of 0. - * - * - Spacing characters in the East Asian Wide (W) or East Asian - * FullWidth (F) category as defined in Unicode Technical - * Report #11 have a column width of 2. - * - * - All remaining characters (including all printable - * ISO 8859-1 and WGL4 characters, Unicode control characters, - * etc.) have a column width of 1. - * - * This implementation assumes that quint16 characters are encoded - * in ISO 10646. - */ - -int -konsole_wcwidth (quint16 ucs) -{ - /* sorted list of non-overlapping intervals of non-spacing characters */ - static const struct interval combining[] = { - {0x0300, 0x034E}, {0x0360, 0x0362}, {0x0483, 0x0486}, - {0x0488, 0x0489}, {0x0591, 0x05A1}, {0x05A3, 0x05B9}, - {0x05BB, 0x05BD}, {0x05BF, 0x05BF}, {0x05C1, 0x05C2}, - {0x05C4, 0x05C4}, {0x064B, 0x0655}, {0x0670, 0x0670}, - {0x06D6, 0x06E4}, {0x06E7, 0x06E8}, {0x06EA, 0x06ED}, - {0x070F, 0x070F}, {0x0711, 0x0711}, {0x0730, 0x074A}, - {0x07A6, 0x07B0}, {0x0901, 0x0902}, {0x093C, 0x093C}, - {0x0941, 0x0948}, {0x094D, 0x094D}, {0x0951, 0x0954}, - {0x0962, 0x0963}, {0x0981, 0x0981}, {0x09BC, 0x09BC}, - {0x09C1, 0x09C4}, {0x09CD, 0x09CD}, {0x09E2, 0x09E3}, - {0x0A02, 0x0A02}, {0x0A3C, 0x0A3C}, {0x0A41, 0x0A42}, - {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A70, 0x0A71}, - {0x0A81, 0x0A82}, {0x0ABC, 0x0ABC}, {0x0AC1, 0x0AC5}, - {0x0AC7, 0x0AC8}, {0x0ACD, 0x0ACD}, {0x0B01, 0x0B01}, - {0x0B3C, 0x0B3C}, {0x0B3F, 0x0B3F}, {0x0B41, 0x0B43}, - {0x0B4D, 0x0B4D}, {0x0B56, 0x0B56}, {0x0B82, 0x0B82}, - {0x0BC0, 0x0BC0}, {0x0BCD, 0x0BCD}, {0x0C3E, 0x0C40}, - {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, {0x0C55, 0x0C56}, - {0x0CBF, 0x0CBF}, {0x0CC6, 0x0CC6}, {0x0CCC, 0x0CCD}, - {0x0D41, 0x0D43}, {0x0D4D, 0x0D4D}, {0x0DCA, 0x0DCA}, - {0x0DD2, 0x0DD4}, {0x0DD6, 0x0DD6}, {0x0E31, 0x0E31}, - {0x0E34, 0x0E3A}, {0x0E47, 0x0E4E}, {0x0EB1, 0x0EB1}, - {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC}, {0x0EC8, 0x0ECD}, - {0x0F18, 0x0F19}, {0x0F35, 0x0F35}, {0x0F37, 0x0F37}, - {0x0F39, 0x0F39}, {0x0F71, 0x0F7E}, {0x0F80, 0x0F84}, - {0x0F86, 0x0F87}, {0x0F90, 0x0F97}, {0x0F99, 0x0FBC}, - {0x0FC6, 0x0FC6}, {0x102D, 0x1030}, {0x1032, 0x1032}, - {0x1036, 0x1037}, {0x1039, 0x1039}, {0x1058, 0x1059}, - {0x1160, 0x11FF}, {0x17B7, 0x17BD}, {0x17C6, 0x17C6}, - {0x17C9, 0x17D3}, {0x180B, 0x180E}, {0x18A9, 0x18A9}, - {0x200B, 0x200F}, {0x202A, 0x202E}, {0x206A, 0x206F}, - {0x20D0, 0x20E3}, {0x302A, 0x302F}, {0x3099, 0x309A}, - {0xFB1E, 0xFB1E}, {0xFE20, 0xFE23}, {0xFEFF, 0xFEFF}, - {0xFFF9, 0xFFFB} - }; - - /* test for 8-bit control characters */ - if (ucs == 0) - return 0; - if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) - return -1; - - /* binary search in table of non-spacing characters */ - if (bisearch (ucs, combining, - sizeof (combining) / sizeof (struct interval) - 1)) - return 0; - - /* if we arrive here, ucs is not a combining or C0/C1 control character */ - - return 1 + (ucs >= 0x1100 && (ucs <= 0x115f || /* Hangul Jamo init. consonants */ - (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a && ucs != 0x303f) || /* CJK ... Yi */ - (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ - (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ - (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ - (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ - (ucs >= 0xffe0 && ucs <= 0xffe6) /* do not compare UINT16 with 0x20000 || - (ucs >= 0x20000 && ucs <= 0x2ffff) */ )); -} - -#if 0 -/* - * The following function is the same as konsole_wcwidth(), except that - * spacing characters in the East Asian Ambiguous (A) category as - * defined in Unicode Technical Report #11 have a column width of 2. - * This experimental variant might be useful for users of CJK legacy - * encodings who want to migrate to UCS. It is not otherwise - * recommended for general use. - */ -int -konsole_wcwidth_cjk (quint16 ucs) -{ - /* sorted list of non-overlapping intervals of East Asian Ambiguous - * characters */ - static const struct interval ambiguous[] = { - {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8}, - {0x00AA, 0x00AA}, {0x00AD, 0x00AD}, {0x00B0, 0x00B4}, - {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6}, - {0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1}, - {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED}, - {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA}, - {0x00FC, 0x00FC}, {0x00FE, 0x00FE}, {0x0101, 0x0101}, - {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B}, - {0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133}, - {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144}, - {0x0148, 0x014A}, {0x014D, 0x014D}, {0x0152, 0x0153}, - {0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE}, - {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4}, - {0x01D6, 0x01D6}, {0x01D8, 0x01D8}, {0x01DA, 0x01DA}, - {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261}, - {0x02C7, 0x02C7}, {0x02C9, 0x02CB}, {0x02CD, 0x02CD}, - {0x02D0, 0x02D0}, {0x02D8, 0x02DB}, {0x02DD, 0x02DD}, - {0x0391, 0x03A1}, {0x03A3, 0x03A9}, {0x03B1, 0x03C1}, - {0x03C3, 0x03C9}, {0x0401, 0x0401}, {0x0410, 0x044F}, - {0x0451, 0x0451}, {0x2010, 0x2010}, {0x2013, 0x2016}, - {0x2018, 0x2019}, {0x201C, 0x201D}, {0x2020, 0x2021}, - {0x2025, 0x2027}, {0x2030, 0x2030}, {0x2032, 0x2033}, - {0x2035, 0x2035}, {0x203B, 0x203B}, {0x2074, 0x2074}, - {0x207F, 0x207F}, {0x2081, 0x2084}, {0x20AC, 0x20AC}, - {0x2103, 0x2103}, {0x2105, 0x2105}, {0x2109, 0x2109}, - {0x2113, 0x2113}, {0x2121, 0x2122}, {0x2126, 0x2126}, - {0x212B, 0x212B}, {0x2154, 0x2155}, {0x215B, 0x215B}, - {0x215E, 0x215E}, {0x2160, 0x216B}, {0x2170, 0x2179}, - {0x2190, 0x2199}, {0x21D2, 0x21D2}, {0x21D4, 0x21D4}, - {0x2200, 0x2200}, {0x2202, 0x2203}, {0x2207, 0x2208}, - {0x220B, 0x220B}, {0x220F, 0x220F}, {0x2211, 0x2211}, - {0x2215, 0x2215}, {0x221A, 0x221A}, {0x221D, 0x2220}, - {0x2223, 0x2223}, {0x2225, 0x2225}, {0x2227, 0x222C}, - {0x222E, 0x222E}, {0x2234, 0x2237}, {0x223C, 0x223D}, - {0x2248, 0x2248}, {0x224C, 0x224C}, {0x2252, 0x2252}, - {0x2260, 0x2261}, {0x2264, 0x2267}, {0x226A, 0x226B}, - {0x226E, 0x226F}, {0x2282, 0x2283}, {0x2286, 0x2287}, - {0x2295, 0x2295}, {0x2299, 0x2299}, {0x22A5, 0x22A5}, - {0x22BF, 0x22BF}, {0x2312, 0x2312}, {0x2460, 0x24BF}, - {0x24D0, 0x24E9}, {0x2500, 0x254B}, {0x2550, 0x2574}, - {0x2580, 0x258F}, {0x2592, 0x2595}, {0x25A0, 0x25A1}, - {0x25A3, 0x25A9}, {0x25B2, 0x25B3}, {0x25B6, 0x25B7}, - {0x25BC, 0x25BD}, {0x25C0, 0x25C1}, {0x25C6, 0x25C8}, - {0x25CB, 0x25CB}, {0x25CE, 0x25D1}, {0x25E2, 0x25E5}, - {0x25EF, 0x25EF}, {0x2605, 0x2606}, {0x2609, 0x2609}, - {0x260E, 0x260F}, {0x261C, 0x261C}, {0x261E, 0x261E}, - {0x2640, 0x2640}, {0x2642, 0x2642}, {0x2660, 0x2661}, - {0x2663, 0x2665}, {0x2667, 0x266A}, {0x266C, 0x266D}, - {0x266F, 0x266F}, {0x300A, 0x300B}, {0x301A, 0x301B}, - {0xE000, 0xF8FF}, {0xFFFD, 0xFFFD} - }; - - /* binary search in table of non-spacing characters */ - if (bisearch (ucs, ambiguous, - sizeof (ambiguous) / sizeof (struct interval) - 1)) - return 2; - - return konsole_wcwidth (ucs); -} -#endif - -// single byte char: +1, multi byte char: +2 -int -string_width (const QString & txt) -{ - int w = 0; - for (int i = 0; i < txt.length (); ++i) - w += konsole_wcwidth (txt[i].unicode ()); - return w; -} diff -r b31663fb7e8a -r aa54bdaee8c8 gui/src/terminal/konsole_wcwidth.h --- a/gui/src/terminal/konsole_wcwidth.h Thu Aug 18 20:45:00 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -/* $XFree86: xc/programs/xterm/wcwidth.h,v 1.2 2001/06/18 19:09:27 dickey Exp $ */ - -/* Markus Kuhn -- 2001-01-12 -- public domain */ -/* Adaptions for KDE by Waldo Bastian */ -/* - Rewritten for QT4 by e_k -*/ - - -#ifndef _KONSOLE_WCWIDTH_H_ -#define _KONSOLE_WCWIDTH_H_ - -// Qt -#include -#include - -int konsole_wcwidth (quint16 ucs); -#if 0 -int konsole_wcwidth_cjk (Q_UINT16 ucs); -#endif - -int string_width (const QString & txt); - -#endif