Mercurial > hg > octave-lyh
changeset 13500:40bd465b6c79
Removed old gui.
author | Jacob Dawid <jacob.dawid@googlemail.com> |
---|---|
date | Sun, 17 Jul 2011 17:42:43 +0200 |
parents | e05d6d17196e |
children | 86d6c3b90ad7 |
files | gui//AUTHORS gui//COPYING gui//Changelog gui//LineFont.src gui//Quint.pro gui//README gui//TODO gui//bin/bin gui//default.keytab gui//kb-layouts/CVS/Entries gui//kb-layouts/CVS/Repository gui//kb-layouts/CVS/Root gui//kb-layouts/default.keytab gui//kb-layouts/linux.keytab gui//kb-layouts/vt420pc.keytab gui//moc-files/moc-files gui//src/BlockArray.cpp gui//src/BlockArray.h gui//src/BrowserWidget.cpp gui//src/BrowserWidget.h gui//src/Character.h gui//src/CharacterColor.h gui//src/ColorTables.h gui//src/DefaultTranslatorText.h gui//src/Emulation.cpp gui//src/Emulation.h gui//src/FileEditorMdiSubWindow.cpp gui//src/FileEditorMdiSubWindow.h gui//src/FilesDockWidget.cpp gui//src/FilesDockWidget.h gui//src/Filter.cpp gui//src/Filter.h gui//src/History.cpp gui//src/History.h gui//src/HistoryDockWidget.cpp gui//src/HistoryDockWidget.h gui//src/ImageViewerMdiSubWindow.cpp gui//src/ImageViewerMdiSubWindow.h gui//src/KeyboardTranslator.cpp gui//src/KeyboardTranslator.h gui//src/LineFont.h gui//src/MainWindow.cpp gui//src/MainWindow.h gui//src/NumberedCodeEdit.cpp gui//src/NumberedCodeEdit.h gui//src/OctaveLink.cpp gui//src/OctaveLink.h gui//src/OctaveTerminal.cpp gui//src/OctaveTerminal.h gui//src/ProcessInfo.cpp gui//src/ProcessInfo.h gui//src/Pty.cpp gui//src/Pty.h gui//src/QTerminalWidget.cpp gui//src/QTerminalWidget.h gui//src/Quint.cpp gui//src/Screen.cpp gui//src/Screen.h gui//src/ScreenWindow.cpp gui//src/ScreenWindow.h gui//src/Session.cpp gui//src/Session.h gui//src/ShellCommand.cpp gui//src/ShellCommand.h gui//src/SimpleEditor.cpp gui//src/SimpleEditor.h gui//src/SyntaxHighlighter.cpp gui//src/SyntaxHighlighter.h gui//src/TerminalCharacterDecoder.cpp gui//src/TerminalCharacterDecoder.h gui//src/TerminalDisplay.cpp gui//src/TerminalDisplay.h gui//src/VariablesDockWidget.cpp gui//src/VariablesDockWidget.h gui//src/Vt102Emulation.cpp gui//src/Vt102Emulation.h gui//src/konsole_export.h gui//src/konsole_wcwidth.cpp gui//src/konsole_wcwidth.h gui//src/kprocess.cpp gui//src/kprocess.h gui//src/kprocess_p.h gui//src/kpty.cpp gui//src/kpty.h gui//src/kpty_export.h gui//src/kpty_p.h gui//src/kptydevice.cpp gui//src/kptydevice.h gui//src/kptyprocess.cpp gui//src/kptyprocess.h gui//syntax_files/cpp.xml gui//syntax_files/h.xml gui//syntax_files/m.xml gui//syntax_files/sh.xml gui/Doxyfile gui/languages/german gui/languages/german.qm gui/media/quint_icon_huge.png gui/media/quint_icon_small.png gui/media/quint_logo.png gui/media/quint_logo_2x.png gui/media/quint_logo_small.png gui/src/BlockArray.cpp gui/src/BlockArray.h gui/src/BrowserWidget.cpp gui/src/BrowserWidget.h gui/src/Character.h gui/src/CharacterColor.h gui/src/ColorTables.h gui/src/DefaultTranslatorText.h gui/src/Emulation.cpp gui/src/Emulation.h gui/src/FileEditorDockWidget.cpp gui/src/FileEditorDockWidget.h gui/src/FilesDockWidget.cpp gui/src/FilesDockWidget.h gui/src/Filter.cpp gui/src/Filter.h gui/src/History.cpp gui/src/History.h gui/src/HistoryDockWidget.cpp gui/src/HistoryDockWidget.h gui/src/ImageViewerDockWidget.cpp gui/src/ImageViewerDockWidget.h gui/src/KeyboardTranslator.cpp gui/src/KeyboardTranslator.h gui/src/LineFont.h gui/src/MainWindow.cpp gui/src/MainWindow.h gui/src/NumberedCodeEdit.cpp gui/src/NumberedCodeEdit.h gui/src/OctaveLink.cpp gui/src/OctaveLink.h gui/src/OctaveTerminal.cpp gui/src/OctaveTerminal.h gui/src/ProcessInfo.cpp gui/src/ProcessInfo.h gui/src/Pty.cpp gui/src/Pty.h gui/src/QTerminalWidget.cpp gui/src/QTerminalWidget.h gui/src/Quint.cpp gui/src/Screen.cpp gui/src/Screen.h gui/src/ScreenWindow.cpp gui/src/ScreenWindow.h gui/src/Session.cpp gui/src/Session.h gui/src/ShellCommand.cpp gui/src/ShellCommand.h gui/src/SimpleEditor.cpp gui/src/SimpleEditor.h gui/src/SyntaxHighlighter.cpp gui/src/SyntaxHighlighter.h gui/src/TerminalCharacterDecoder.cpp gui/src/TerminalCharacterDecoder.h gui/src/TerminalDisplay.cpp gui/src/TerminalDisplay.h gui/src/VariablesDockWidget.cpp gui/src/VariablesDockWidget.h gui/src/Vt102Emulation.cpp gui/src/Vt102Emulation.h gui/src/konsole_export.h gui/src/konsole_wcwidth.cpp gui/src/konsole_wcwidth.h gui/src/kprocess.cpp gui/src/kprocess.h gui/src/kprocess_p.h gui/src/kpty.cpp gui/src/kpty.h gui/src/kpty_export.h gui/src/kpty_p.h gui/src/kptydevice.cpp gui/src/kptydevice.h gui/src/kptyprocess.cpp gui/src/kptyprocess.h |
diffstat | 176 files changed, 0 insertions(+), 52947 deletions(-) [+] |
line wrap: on
line diff
deleted file mode 100644 --- a/gui//AUTHORS +++ /dev/null @@ -1,1 +0,0 @@ -e_k@users.sourceforge.net \ No newline at end of file
deleted file mode 100644 --- a/gui//COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program 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 program 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License.
deleted file mode 100644 --- a/gui//Changelog +++ /dev/null @@ -1,19 +0,0 @@ -31.07.2008 -Interface class from c-style conversions rewritten with pimpl support. - - -16.07.2008 -Added optional scrollbar - - -06.06.2008 -Some artefacts were removed, some added... -Also added support for color schemes, and 3 color schemes provided (classical - white on black, green on black, black on light yellow). Is it enough or not? - - -26.05.2008 -Added file release as an archive with source code. But preferrable way is still getting code from CVS, cause file release can be outdated. - - -11.05.2008 -Initial CVS import - first version comes with number 0.0.1 \ No newline at end of file
deleted file mode 100644 --- a/gui//LineFont.src +++ /dev/null @@ -1,786 +0,0 @@ -#2500: single horizontal line -2500 - - ------ - - - -#2501: triple horizontal line -2501 - ------ ------ ------ - - -#2502: single vertical line -2502 - | - | - | - | - | - -#2503: triple vertical line -2503 - ||| - ||| - ||| - ||| - ||| - -#2504-250B are dashed - not handled - -#250C: top-left corner (lines on bottom + right) -250C - - - .-- - | - | - -#250D: as above, but top line triple-width -250D - - .-- - .-- - |-- - | - -#250E: now the vert line triple-width -250E - - - ..-- - ||| - ||| - -#250F: and now both lines triple-width -250F - - .___ - |.-- - ||._ - ||| - -#2510: top-right corner -2510 - - ---. - | - | - -2511 - -==. -==. -==| - | - -2512 - - -==.. - ||| - ||| - -2513 - -===. -==.| -=.|| - ||| - -#2514: bottom-left corner -2514 - | - | - .== - - - -2515 - | - |== - |== - === - - - -2516 - ||| - ||| - |.== - - - -2517 - ||| - ||.= - |.== - .=== - - -#2518: bottm-right corner -2518 - | - | -==. - - - -2519 - | -==| -==| -=== - - - -251A - ||| - ||| -==== - - - -251B - ||| -=.|| -==.| -===. - - -#251C: Join of vertical line and one from the right -251C - | - | - |== - | - | - -251D - | - |== - |== - |== - | - -251E - ||| - ||| - ||== - | - | - -251F - | - | - ||== - ||| - ||| - - -2520 - ||| - ||| - ||== - ||| - ||| - -2521 - ||| - |||= - ||== - .|== - | - -2522 - | - .|== - ||== - |||= - ||| - -2523 - ||| - ||.= - ||== - ||.= - ||| - -#2524: Join of vertical line and one from the left -2524 - | - | -==| - | - | - -2525 - | -==| -==| -==| - | - -2526 - ||| - ||| -==+| - | - | - -2527 - | - | -==+| - ||| - ||| - -2528 - ||| - ||| -==+| - ||| - ||| - -2529 - ||| -=+|| -==+| -===+ - | - -252A - | -=+|| -==+| -===+ - ||| - -252B - ||| -=+|| -==+| -=+|| - ||| - -#252C: horizontal line joined to from below -252C - - -===== - | - | - -252D - -=== -==|== -==| - | - -252E - - === -==|== - |== - | - -252F - -==+== -==|== -==|== - | - -2530 - -===== -===== -==|== - | - -2531 - -===| -==||= -=||| - ||| - -2532 - - |=== -=||== - ||== - || - -2533 - -===== -==|== -=+|+= - ||| - -#2534: bottom line, connected to from top -2534 - | - | -===== - - - -2535 - | -==| -===== -=== - - -2536 - | - |== -===== - === - - -2537 - | -==|== -===== -===== - - -2538 - ||| - ||| -===== - - - -2539 - ||| -==|| -===== -===| - - - -253A - ||| - ||== -=|=== - |=== - - -253B - ||| -==|== -===== -===== - - -#253C: vertical + horizontal lines intersecting -253C - | - | -===== - | - | - -253D - | -==| -===== -==| - | - -253E - | - |== -===== - |== - | - -253F - | -==|== -===== -==|== - | - -2540 - ||| - ||| -===== - | - | - -2541 - | - | -===== - ||| - ||| - -2542 - ||| - ||| -===== - ||| - ||| - -2543 - ||| -=||| -===== -==|+ - | - -2544 - ||| - ||== -===== - |== - | - -2545 - | -==|+ -===== -=||| - ||| - -2546 - | - |== -===== - ||== - ||| - -2547 - ||| -=|||= -===== -=|||= - | - -2548 - | -=|||= -===== -=|||= - ||| - -2549 - ||| -=||| -===== -=||| - ||| - -254A - ||| - |||= -===== - |||= - ||| - -254B - ||| -=|||= -===== -=|||= - ||| - -#254C-254F are dashed -2550 - -_____ - -_____ - - -2551 - | | - | | - | | - | | - | | - -2552 - - |-- - | - |-- - | - -2553 - - - ---- - | | - | | - -2554 - - +--- - | - + +- - | | - -2555 - ---+ - | ---+ - | - -2556 - - --+-+ - | | - | | - -2557 - ----+ - | --+ | - | | - -2558 - | - +-- - | - +-- - -2559 - | | - | | - +-+- - - - -255A - | | - | +- - | - +--- - - -255B - | ---+ - | ---+ - - -255C - | | - | | --+-+ - - -255D - | | --+ | - | ----+ - - -255E - | - +-- - | - +-- - | - -255F - | | - | | - | +- - | | - | | - -2560 - | | - | +- - | | - | +- - | | - -2561 - | ---+ - | ---+ - | - -2562 - | | - | | --+ + - | | - | | - -2563 - | | --+ | - | --+ | - | | - -2564 - ------ - ---+-- - | - -2565 - - --+-+- - | | - | | - -2566 - ------ - --+ +- - | | - -2567 - | ---+-- - ------ - - -2568 - | | - | | --+-+- - - - -2569 - | | --+ +- - ------ - - -256A - | ---+-- - | ---+-- - | - -256B - | | - | | --+-+- - | | - | | - -256C - | | --+ +- - --+ +- - | | - -#256F-2570 are curly, -#2571-2573 are slashes and X - -2574 - - -___ - - - -2575 - | - | - | - - - -2576 - - - ___ - - - -2577 - - - | - | - | - -2578 - -___ -___ -___ - - -2579 - ||| - ||| - ||| - - - -257A - - ___ - ___ - ___ - - -257B - - - ||| - ||| - ||| - -257C - - ___ -_____ - ___ - - -257D - | - | - ||| - ||| - ||| - -257E - -___ -_____ -___ - - -257F - ||| - ||| - ||| - | - |
deleted file mode 100644 --- a/gui//Quint.pro +++ /dev/null @@ -1,113 +0,0 @@ -# Quint - A graphical user interface for Octave -# Copyright (C) 2011 Jacob Dawid -# jacob.dawid@googlemail.com -# -# This program 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 3 of the License, or -# (at your option) any later version. -# -# This program 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, see <http://www.gnu.org/licenses/>. - - -# Basic settings: -QT += core gui webkit xml opengl # Qt modules -TEMPLATE = app # Build as application -TARGET = Quint # Name of the target binary - -DESTDIR = bin # Destination of the output -UI_DIR = ui-files # Folder for ui files -MOC_DIR = moc-files # Folder for moc files -OBJECTS_DIR = object-files # Folder for object files - -TRANSLATIONS += languages/german # Available translations - -# Includepaths and libraries to link against: -INCLUDEPATH += src -INCFLAGS += $$system(mkoctfile -p INCFLAGS) -LFLAGS += $$system(mkoctfile -p LFLAGS) \ - $$system(mkoctfile -p OCTAVE_LIBS) \ - $$system(mkoctfile -p LIBS) -QMAKE_LFLAGS += $$LFLAGS -lutil $$system(mkoctfile -p RLD_FLAG) -QMAKE_CXXFLAGS += $$INCFLAGS - -# Files associated with the project: -SOURCES +=\ - src/TerminalCharacterDecoder.cpp \ - src/KeyboardTranslator.cpp \ - src/Screen.cpp \ - src/History.cpp \ - src/BlockArray.cpp \ - src/konsole_wcwidth.cpp \ - src/ScreenWindow.cpp \ - src/Emulation.cpp \ - src/Vt102Emulation.cpp \ - src/TerminalDisplay.cpp \ - src/Filter.cpp \ - src/Pty.cpp \ - src/kpty.cpp \ - src/kptyprocess.cpp \ - src/kprocess.cpp \ - src/kptydevice.cpp \ - src/Session.cpp \ - src/ShellCommand.cpp \ - src/QTerminalWidget.cpp \ - src/MainWindow.cpp \ - src/Quint.cpp \ - src/OctaveLink.cpp \ - src/ProcessInfo.cpp \ - src/OctaveTerminal.cpp \ - src/VariablesDockWidget.cpp \ - src/HistoryDockWidget.cpp \ - src/FilesDockWidget.cpp \ - src/FileEditorDockWidget.cpp \ - src/SyntaxHighlighter.cpp \ - src/BrowserWidget.cpp \ - src/NumberedCodeEdit.cpp \ - src/SimpleEditor.cpp \ - src/ImageViewerDockWidget.cpp - -HEADERS += \ - src/TerminalCharacterDecoder.h \ - src/Character.h \ - src/CharacterColor.h \ - src/KeyboardTranslator.h \ - src/Screen.h \ - src/History.h \ - src/BlockArray.h \ - src/konsole_wcwidth.h \ - src/ScreenWindow.h \ - src/Emulation.h \ - src/Vt102Emulation.h \ - src/TerminalDisplay.h \ - src/Filter.h \ - src/LineFont.h \ - src/Pty.h \ - src/kpty.h \ - src/kpty_p.h \ - src/kptyprocess.h \ - src/kprocess.h \ - src/kprocess_p.h \ - src/kptydevice.h \ - src/Session.h \ - src/ShellCommand.h \ - src/QTerminalWidget.h \ - src/MainWindow.h \ - src/OctaveLink.h \ - src/ProcessInfo.h \ - src/OctaveTerminal.h \ - src/VariablesDockWidget.h \ - src/HistoryDockWidget.h \ - src/FilesDockWidget.h \ - src/FileEditorDockWidget.h \ - src/SyntaxHighlighter.h \ - src/BrowserWidget.h \ - src/NumberedCodeEdit.h \ - src/SimpleEditor.h \ - src/ImageViewerDockWidget.h
deleted file mode 100644 --- a/gui//README +++ /dev/null @@ -1,46 +0,0 @@ -Quint is using the QTermWidget to emulate a terminal, this enabling readline support for Octave. This is the original README file from the author: - -########################################################################################### -QTermWidget -version 0.1.0 - -QTermWidget is an opensource project based on KDE4 Konsole application. -The main goal of this project is to provide unicode-enabled, embeddable -QT widget for using as a built-in console (or terminal emulation widget). - -Of course I`m aware about embedding abilities of original Konsole, -but once I had Qt without KDE, and it was a serious obstacle. -I decided not to rely on a chance. I cannot find any interesting related project, -so I had to write it. - -The original Konsole`s code was rewritten entirely with QT4 only; also I have to -include in the project some parts of code from kde core library. All code dealing -with user interface parts and session managers was removed (maybe later I bring it -back somehow), and the result is quite useful, I suppose. - -This library was compiled and tested on three linux systems, -based on 2.4.32, 2.6.20, 2.6.23 kernels, x86 and amd64. -Please inform about its behaviour on other systems. -########################################################################################### - -If you cannot launch Quint because it fails to find octave's shared libraries and you are sure that you have them installed, you will need -to do an - -export LD_LIBRARY_PATH=/usr/lib/octave-x.x.x/:$LD_LIBRARY_PATH && bin/Quint - -and replace x.x.x by the specific octave version you have installed to run Quint. If you don't want to do that each time you launch Quint, -do the following: - -sudo gedit /etc/ld.so.conf - -and append the line: - -/usr/lib/octave-x.x.x/ - -Save the file and do: - -sudo ldconfig - -Now Quint should not complain about missing shared libraries. If you have any problems, suggestions or ideas, feel free to drop me a mail at -jacob.dawid@googlemail.com - Jacob Dawid -
deleted file mode 100644 --- a/gui//TODO +++ /dev/null @@ -1,10 +0,0 @@ -Global - - provide more compatibility for vttest - -Package - - migrate to autotools if needed - -Source - - provide more options for customization - - clean unused code - - add some QT3 support features if needed
deleted file mode 100644 --- a/gui//default.keytab +++ /dev/null @@ -1,128 +0,0 @@ -# [README.default.Keytab] Buildin Keyboard Table -# -# To customize your keyboard, copy this file to something -# ending with .keytab and change it to meet you needs. -# Please read the README.KeyTab and the README.keyboard -# in this case. -# -# -------------------------------------------------------------- - -keyboard "Default (XFree 4)" - -# -------------------------------------------------------------- -# -# Note that this particular table is a "risc" version made to -# ease customization without bothering with obsolete details. -# See VT100.keytab for the more hairy stuff. -# -# -------------------------------------------------------------- - -# common keys - -key Escape : "\E" - -key Tab -Shift : "\t" -key Tab +Shift+Ansi : "\E[Z" -key Tab +Shift-Ansi : "\t" -key Backtab +Ansi : "\E[Z" -key Backtab -Ansi : "\t" - -key Return-Shift-NewLine : "\r" -key Return-Shift+NewLine : "\r\n" - -key Return+Shift : "\EOM" - -# Backspace and Delete codes are preserving CTRL-H. - -key Backspace : "\x7f" - -# Arrow keys in VT52 mode -# shift up/down are reserved for scrolling. -# shift left/right are reserved for switching between tabs (this is hardcoded). - -key Up -Shift-Ansi : "\EA" -key Down -Shift-Ansi : "\EB" -key Right-Shift-Ansi : "\EC" -key Left -Shift-Ansi : "\ED" - -# Arrow keys in ANSI mode with Application - and Normal Cursor Mode) - -key Up -Shift-AnyMod+Ansi+AppCuKeys : "\EOA" -key Down -Shift-AnyMod+Ansi+AppCuKeys : "\EOB" -key Right -Shift-AnyMod+Ansi+AppCuKeys : "\EOC" -key Left -Shift-AnyMod+Ansi+AppCuKeys : "\EOD" - -key Up -Shift-AnyMod+Ansi-AppCuKeys : "\E[A" -key Down -Shift-AnyMod+Ansi-AppCuKeys : "\E[B" -key Right -Shift-AnyMod+Ansi-AppCuKeys : "\E[C" -key Left -Shift-AnyMod+Ansi-AppCuKeys : "\E[D" - -key Up -Shift+AnyMod+Ansi : "\E[1;*A" -key Down -Shift+AnyMod+Ansi : "\E[1;*B" -key Right -Shift+AnyMod+Ansi : "\E[1;*C" -key Left -Shift+AnyMod+Ansi : "\E[1;*D" - -# other grey PC keys - -key Enter+NewLine : "\r\n" -key Enter-NewLine : "\r" - -key Home -AnyMod -AppCuKeys : "\E[H" -key End -AnyMod -AppCuKeys : "\E[F" -key Home -AnyMod +AppCuKeys : "\EOH" -key End -AnyMod +AppCuKeys : "\EOF" -key Home +AnyMod : "\E[1;*H" -key End +AnyMod : "\E[1;*F" - -key Insert -AnyMod : "\E[2~" -key Delete -AnyMod : "\E[3~" -key Insert +AnyMod : "\E[2;*~" -key Delete +AnyMod : "\E[3;*~" - -key Prior -Shift-AnyMod : "\E[5~" -key Next -Shift-AnyMod : "\E[6~" -key Prior -Shift+AnyMod : "\E[5;*~" -key Next -Shift+AnyMod : "\E[6;*~" - -# Function keys -key F1 -AnyMod : "\EOP" -key F2 -AnyMod : "\EOQ" -key F3 -AnyMod : "\EOR" -key F4 -AnyMod : "\EOS" -key F5 -AnyMod : "\E[15~" -key F6 -AnyMod : "\E[17~" -key F7 -AnyMod : "\E[18~" -key F8 -AnyMod : "\E[19~" -key F9 -AnyMod : "\E[20~" -key F10 -AnyMod : "\E[21~" -key F11 -AnyMod : "\E[23~" -key F12 -AnyMod : "\E[24~" - -key F1 +AnyMod : "\EO*P" -key F2 +AnyMod : "\EO*Q" -key F3 +AnyMod : "\EO*R" -key F4 +AnyMod : "\EO*S" -key F5 +AnyMod : "\E[15;*~" -key F6 +AnyMod : "\E[17;*~" -key F7 +AnyMod : "\E[18;*~" -key F8 +AnyMod : "\E[19;*~" -key F9 +AnyMod : "\E[20;*~" -key F10 +AnyMod : "\E[21;*~" -key F11 +AnyMod : "\E[23;*~" -key F12 +AnyMod : "\E[24;*~" - -# Work around dead keys - -key Space +Control : "\x00" - -# Some keys are used by konsole to cause operations. -# The scroll* operations refer to the history buffer. - -key Up +Shift-AppScreen : scrollLineUp -key Prior +Shift-AppScreen : scrollPageUp -key Down +Shift-AppScreen : scrollLineDown -key Next +Shift-AppScreen : scrollPageDown - -key ScrollLock : scrollLock - -# keypad characters are not offered differently by Qt.
deleted file mode 100644 --- a/gui//kb-layouts/CVS/Entries +++ /dev/null @@ -1,4 +0,0 @@ -/default.keytab/1.1.1.1/Sat May 10 21:27:57 2008// -/linux.keytab/1.1.1.1/Sat May 10 21:27:57 2008// -/vt420pc.keytab/1.1.1.1/Sat May 10 21:27:57 2008// -D
deleted file mode 100644 --- a/gui//kb-layouts/CVS/Repository +++ /dev/null @@ -1,1 +0,0 @@ -qtermwidget/lib/kb-layouts
deleted file mode 100644 --- a/gui//kb-layouts/CVS/Root +++ /dev/null @@ -1,1 +0,0 @@ -:ext:e_k@qtermwidget.cvs.sourceforge.net:/cvsroot/qtermwidget
deleted file mode 100644 --- a/gui//kb-layouts/default.keytab +++ /dev/null @@ -1,133 +0,0 @@ -# [README.default.Keytab] Buildin Keyboard Table -# -# To customize your keyboard, copy this file to something -# ending with .keytab and change it to meet you needs. -# Please read the README.KeyTab and the README.keyboard -# in this case. -# -# -------------------------------------------------------------- - -keyboard "Default (XFree 4)" - -# -------------------------------------------------------------- -# -# Note that this particular table is a "risc" version made to -# ease customization without bothering with obsolete details. -# See VT100.keytab for the more hairy stuff. -# -# -------------------------------------------------------------- - -# common keys - -key Escape : "\E" - -key Tab -Shift : "\t" -key Tab +Shift+Ansi : "\E[Z" -key Tab +Shift-Ansi : "\t" -key Backtab +Ansi : "\E[Z" -key Backtab -Ansi : "\t" - -key Return-Shift-NewLine : "\r" -key Return-Shift+NewLine : "\r\n" - -key Return+Shift : "\EOM" - -# Backspace and Delete codes are preserving CTRL-H. - -key Backspace : "\x7f" - -# Arrow keys in VT52 mode -# shift up/down are reserved for scrolling. -# shift left/right are reserved for switching between tabs (this is hardcoded). - -key Up -Shift-Ansi : "\EA" -key Down -Shift-Ansi : "\EB" -key Right-Shift-Ansi : "\EC" -key Left -Shift-Ansi : "\ED" - -# Arrow keys in ANSI mode with Application - and Normal Cursor Mode) - -key Up -Shift-AnyMod+Ansi+AppCuKeys : "\EOA" -key Down -Shift-AnyMod+Ansi+AppCuKeys : "\EOB" -key Right -Shift-AnyMod+Ansi+AppCuKeys : "\EOC" -key Left -Shift-AnyMod+Ansi+AppCuKeys : "\EOD" - -key Up -Shift-AnyMod+Ansi-AppCuKeys : "\E[A" -key Down -Shift-AnyMod+Ansi-AppCuKeys : "\E[B" -key Right -Shift-AnyMod+Ansi-AppCuKeys : "\E[C" -key Left -Shift-AnyMod+Ansi-AppCuKeys : "\E[D" - -key Up -Shift+AnyMod+Ansi : "\E[1;*A" -key Down -Shift+AnyMod+Ansi : "\E[1;*B" -key Right -Shift+AnyMod+Ansi : "\E[1;*C" -key Left -Shift+AnyMod+Ansi : "\E[1;*D" - -# other grey PC keys - -key Enter+NewLine : "\r\n" -key Enter-NewLine : "\r" - -key Home -AnyMod -AppCuKeys : "\E[H" -key End -AnyMod -AppCuKeys : "\E[F" -key Home -AnyMod +AppCuKeys : "\EOH" -key End -AnyMod +AppCuKeys : "\EOF" -key Home +AnyMod : "\E[1;*H" -key End +AnyMod : "\E[1;*F" - -key Insert -AnyMod : "\E[2~" -key Delete -AnyMod : "\E[3~" -key Insert +AnyMod : "\E[2;*~" -key Delete +AnyMod : "\E[3;*~" - -key Prior -Shift-AnyMod : "\E[5~" -key Next -Shift-AnyMod : "\E[6~" -key Prior -Shift+AnyMod : "\E[5;*~" -key Next -Shift+AnyMod : "\E[6;*~" - -# Function keys -key F1 -AnyMod : "\EOP" -key F2 -AnyMod : "\EOQ" -key F3 -AnyMod : "\EOR" -key F4 -AnyMod : "\EOS" -key F5 -AnyMod : "\E[15~" -key F6 -AnyMod : "\E[17~" -key F7 -AnyMod : "\E[18~" -key F8 -AnyMod : "\E[19~" -key F9 -AnyMod : "\E[20~" -key F10 -AnyMod : "\E[21~" -key F11 -AnyMod : "\E[23~" -key F12 -AnyMod : "\E[24~" - -key F1 +AnyMod : "\EO*P" -key F2 +AnyMod : "\EO*Q" -key F3 +AnyMod : "\EO*R" -key F4 +AnyMod : "\EO*S" -key F5 +AnyMod : "\E[15;*~" -key F6 +AnyMod : "\E[17;*~" -key F7 +AnyMod : "\E[18;*~" -key F8 +AnyMod : "\E[19;*~" -key F9 +AnyMod : "\E[20;*~" -key F10 +AnyMod : "\E[21;*~" -key F11 +AnyMod : "\E[23;*~" -key F12 +AnyMod : "\E[24;*~" - -# Work around dead keys - -key Space +Control : "\x00" - -# Some keys are used by konsole to cause operations. -# The scroll* operations refer to the history buffer. - -key Up +Shift-AppScreen : scrollLineUp -key Prior +Shift-AppScreen : scrollPageUp -key Down +Shift-AppScreen : scrollLineDown -key Next +Shift-AppScreen : scrollPageDown - -#key Up +Shift : scrollLineUp -#key Prior +Shift : scrollPageUp -#key Down +Shift : scrollLineDown -#key Next +Shift : scrollPageDown - -key ScrollLock : scrollLock - -# keypad characters are not offered differently by Qt.
deleted file mode 100644 --- a/gui//kb-layouts/linux.keytab +++ /dev/null @@ -1,133 +0,0 @@ -# [linux.keytab] Konsole Keyboard Table (Linux console keys) -# -# -------------------------------------------------------------- - -# NOT TESTED, MAY NEED SOME CLEANUPS -keyboard "Linux console" - -# -------------------------------------------------------------- -# -# This configuration table allows to customize the -# meaning of the keys. -# -# The syntax is that each entry has the form : -# -# "key" Keyname { ("+"|"-") Modename } ":" (String|Operation) -# -# Keynames are those defined in <qnamespace.h> with the -# "Qt::Key_" removed. (We'd better insert the list here) -# -# Mode names are : -# -# - Shift -# - Alt -# - Control -# -# The VT100 emulation has two modes that can affect the -# sequences emitted by certain keys. These modes are -# under control of the client program. -# -# - Newline : effects Return and Enter key. -# - Application : effects Up and Down key. -# -# - Ansi : effects Up and Down key (This is for VT52, really). -# -# Operations are -# -# - scrollUpLine -# - scrollUpPage -# - scrollDownLine -# - scrollDownPage -# -# - emitSelection -# -# If the key is not found here, the text of the -# key event as provided by QT is emitted, possibly -# preceeded by ESC if the Alt key is pressed. -# -# -------------------------------------------------------------- - -key Escape : "\E" -key Tab : "\t" - -# VT100 can add an extra \n after return. -# The NewLine mode is set by an escape sequence. - -key Return-NewLine : "\r" -key Return+NewLine : "\r\n" - -# Some desperately try to save the ^H. - -key Backspace : "\x7f" -key Delete : "\E[3~" - -# These codes are for the VT52 mode of VT100 -# The Ansi mode (i.e. VT100 mode) is set by -# an escape sequence - -key Up -Shift-Ansi : "\EA" -key Down -Shift-Ansi : "\EB" -key Right-Shift-Ansi : "\EC" -key Left -Shift-Ansi : "\ED" - -# VT100 emits a mode bit together -# with the arrow keys.The AppCuKeys -# mode is set by an escape sequence. - -key Up -Shift+Ansi+AppCuKeys : "\EOA" -key Down -Shift+Ansi+AppCuKeys : "\EOB" -key Right-Shift+Ansi+AppCuKeys : "\EOC" -key Left -Shift+Ansi+AppCuKeys : "\EOD" - -key Up -Shift+Ansi-AppCuKeys : "\E[A" -key Down -Shift+Ansi-AppCuKeys : "\E[B" -key Right-Shift+Ansi-AppCuKeys : "\E[C" -key Left -Shift+Ansi-AppCuKeys : "\E[D" - -# linux functions keys F1-F5 differ from xterm - -key F1 : "\E[[A" -key F2 : "\E[[B" -key F3 : "\E[[C" -key F4 : "\E[[D" -key F5 : "\E[[E" - -key F6 : "\E[17~" -key F7 : "\E[18~" -key F8 : "\E[19~" -key F9 : "\E[20~" -key F10 : "\E[21~" -key F11 : "\E[23~" -key F12 : "\E[24~" - -key Home : "\E[1~" -key End : "\E[4~" - -key Prior -Shift : "\E[5~" -key Next -Shift : "\E[6~" -key Insert-Shift : "\E[2~" - -# Keypad-Enter. See comment on Return above. - -key Enter+NewLine : "\r\n" -key Enter-NewLine : "\r" - -key Space +Control : "\x00" - -# some of keys are used by konsole. - -key Up +Shift : scrollLineUp -key Prior +Shift : scrollPageUp -key Down +Shift : scrollLineDown -key Next +Shift : scrollPageDown - -key ScrollLock : scrollLock - -#---------------------------------------------------------- - -# keypad characters as offered by Qt -# cannot be recognized as such. - -#---------------------------------------------------------- - -# Following other strings as emitted by konsole.
deleted file mode 100644 --- a/gui//kb-layouts/vt420pc.keytab +++ /dev/null @@ -1,163 +0,0 @@ -# [vt420pc.keytab] Konsole Keyboard Table (VT420pc keys) -# adapted by ferdinand gassauer f.gassauer@aon.at -# Nov 2000 -# -################################################################ -# -# The escape sequences emmited by the -# keys Shift+F1 to Shift+F12 might not fit your needs -# -################# IMPORTANT NOTICE ############################# -# the key bindings (Kcontrol -> look and feel -> keybindgs) -# overrule the settings in this file. The key bindings might be -# changed by the user WITHOUT notification of the maintainer of -# the keytab file. Konsole will not work as expected by -# the maintainer of the keytab file. -################################################################ -# -# -------------------------------------------------------------- - -keyboard "DEC VT420 Terminal" - -# -------------------------------------------------------------- -# -# This configuration table allows to customize the -# meaning of the keys. -# -# The syntax is that each entry has the form : -# -# "key" Keyname { ("+"|"-") Modename } ":" (String|Operation) -# -# Keynames are those defined in <qnamespace.h> with the -# "Qt::Key_" removed. (We'd better insert the list here) -# -# Mode names are : -# -# - Shift -# - Alt -# - Control -# -# The VT100 emulation has two modes that can affect the -# sequences emitted by certain keys. These modes are -# under control of the client program. -# -# - Newline : effects Return and Enter key. -# - Application : effects Up and Down key. -# -# - Ansi : effects Up and Down key (This is for VT52, really). -# -# Operations are -# -# - scrollUpLine -# - scrollUpPage -# - scrollDownLine -# - scrollDownPage -# -# - emitSelection -# -# If the key is not found here, the text of the -# key event as provided by QT is emitted, possibly -# preceeded by ESC if the Alt key is pressed. -# -# -------------------------------------------------------------- - -key Escape : "\E" -key Tab : "\t" -key Backtab: "\E[Z" - -# VT100 can add an extra \n after return. -# The NewLine mode is set by an escape sequence. - -key Return-NewLine : "\r" -key Return+NewLine : "\r\n" - -# Some desperately try to save the ^H. -# may be not everyone wants this - -key Backspace : "\x08" # Control H -key Delete : "\x7f" - -# These codes are for the VT420pc -# The Ansi mode (i.e. VT100 mode) is set by -# an escape sequence - -key Up -Shift-Ansi : "\EA" -key Down -Shift-Ansi : "\EB" -key Right-Shift-Ansi : "\EC" -key Left -Shift-Ansi : "\ED" - -# VT100 emits a mode bit together -# with the arrow keys.The AppCuKeys -# mode is set by an escape sequence. - -key Up -Shift+Ansi+AppCuKeys : "\EOA" -key Down -Shift+Ansi+AppCuKeys : "\EOB" -key Right-Shift+Ansi+AppCuKeys : "\EOC" -key Left -Shift+Ansi+AppCuKeys : "\EOD" - -key Up -Shift+Ansi-AppCuKeys : "\E[A" -key Down -Shift+Ansi-AppCuKeys : "\E[B" -key Right-Shift+Ansi-AppCuKeys : "\E[C" -key Left -Shift+Ansi-AppCuKeys : "\E[D" - -# function keys - -key F1 -Shift : "\E[11~" -key F2 -Shift : "\E[12~" -key F3 -Shift : "\E[13~" -key F4 -Shift : "\E[14~" -key F5 -Shift : "\E[15~" -key F6 -Shift : "\E[17~" -key F7 -Shift : "\E[18~" -key F8 -Shift : "\E[19~" -key F9 -Shift : "\E[20~" -key F10-Shift : "\E[21~" -key F11-Shift : "\E[23~" -key F12-Shift : "\E[24~" -# -# Shift F1-F12 -# -key F1 +Shift : "\E[11;2~" -key F2 +Shift : "\E[12;2~" -key F3 +Shift : "\E[13;2~" -key F4 +Shift : "\E[14;2~" -key F5 +Shift : "\E[15;2~" -key F6 +Shift : "\E[17;2~" -key F7 +Shift : "\E[18;2~" -key F8 +Shift : "\E[19;2~" -key F9 +Shift : "\E[20;2~" -key F10+Shift : "\E[21;2~" -key F11+Shift : "\E[23;2~" -key F12+Shift : "\E[24;2~" - -key Home : "\E[H" -key End : "\E[F" - -key Prior -Shift : "\E[5~" -key Next -Shift : "\E[6~" -key Insert-Shift : "\E[2~" - -# Keypad-Enter. See comment on Return above. - -key Enter+NewLine : "\r\n" -key Enter-NewLine : "\r" - -key Space +Control : "\x00" - -# some of keys are used by konsole. - -key Up +Shift : scrollLineUp -key Prior +Shift : scrollPageUp -key Down +Shift : scrollLineDown -key Next +Shift : scrollPageDown - -key ScrollLock : scrollLock - -#---------------------------------------------------------- - -# keypad characters as offered by Qt -# cannot be recognized as such. - -#---------------------------------------------------------- - -# Following other strings as emitted by konsole.
deleted file mode 100644 --- a/gui//src/BlockArray.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - Copyright 2000 by Stephan Kulow <coolo@kde.org> - - This program 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 program 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. -*/ - -// Own -#include "BlockArray.h" - -// System -#include <assert.h> -#include <sys/mman.h> -#include <sys/param.h> -#include <unistd.h> -#include <stdio.h> - -#define KDE_fseek ::fseek -#define KDE_lseek ::lseek - -static int blocksize = 0; - -BlockArray::BlockArray() - : size(0), - current(size_t(-1)), - index(size_t(-1)), - lastmap(0), - lastmap_index(size_t(-1)), - lastblock(0), ion(-1), - length(0) -{ - // lastmap_index = index = current = size_t(-1); - if (blocksize == 0) - blocksize = ((sizeof(Block) / getpagesize()) + 1) * getpagesize(); - -} - -BlockArray::~BlockArray() -{ - setHistorySize(0); - assert(!lastblock); -} - -size_t BlockArray::append(Block *block) -{ - if (!size) - return size_t(-1); - - ++current; - if (current >= size) current = 0; - - int rc; - rc = KDE_lseek(ion, current * blocksize, SEEK_SET); if (rc < 0) { perror("HistoryBuffer::add.seek"); setHistorySize(0); return size_t(-1); } - rc = write(ion, block, blocksize); if (rc < 0) { perror("HistoryBuffer::add.write"); setHistorySize(0); return size_t(-1); } - - length++; - if (length > size) length = size; - - ++index; - - delete block; - return current; -} - -size_t BlockArray::newBlock() -{ - if (!size) - return size_t(-1); - append(lastblock); - - lastblock = new Block(); - return index + 1; -} - -Block *BlockArray::lastBlock() const -{ - return lastblock; -} - -bool BlockArray::has(size_t i) const -{ - if (i == index + 1) - return true; - - if (i > index) - return false; - if (index - i >= length) - return false; - return true; -} - -const Block* BlockArray::at(size_t i) -{ - if (i == index + 1) - return lastblock; - - if (i == lastmap_index) - return lastmap; - - if (i > index) { - //kDebug(1211) << "BlockArray::at() i > index\n"; - return 0; - } - -// if (index - i >= length) { -// kDebug(1211) << "BlockArray::at() index - i >= length\n"; -// return 0; -// } - - size_t j = i; // (current - (index - i) + (index/size+1)*size) % size ; - - assert(j < size); - unmap(); - - Block *block = (Block*)mmap(0, blocksize, PROT_READ, MAP_PRIVATE, ion, j * blocksize); - - if (block == (Block*)-1) { perror("mmap"); return 0; } - - lastmap = block; - lastmap_index = i; - - return block; -} - -void BlockArray::unmap() -{ - if (lastmap) { - int res = munmap((char*)lastmap, blocksize); - if (res < 0) perror("munmap"); - } - lastmap = 0; - lastmap_index = size_t(-1); -} - -bool BlockArray::setSize(size_t newsize) -{ - return setHistorySize(newsize * 1024 / blocksize); -} - -bool BlockArray::setHistorySize(size_t newsize) -{ -// kDebug(1211) << "setHistorySize " << size << " " << newsize; - - if (size == newsize) - return false; - - unmap(); - - if (!newsize) { - delete lastblock; - lastblock = 0; - if (ion >= 0) close(ion); - ion = -1; - current = size_t(-1); - return true; - } - - if (!size) { - FILE* tmp = tmpfile(); - if (!tmp) { - perror("konsole: cannot open temp file.\n"); - } else { - ion = dup(fileno(tmp)); - if (ion<0) { - perror("konsole: cannot dup temp file.\n"); - fclose(tmp); - } - } - if (ion < 0) - return false; - - assert(!lastblock); - - lastblock = new Block(); - size = newsize; - return false; - } - - if (newsize > size) { - increaseBuffer(); - size = newsize; - return false; - } else { - decreaseBuffer(newsize); - if (ftruncate(ion, length*blocksize) == -1) - perror("ftruncate"); - size = newsize; - - return true; - } -} - -void moveBlock(FILE *fion, int cursor, int newpos, char *buffer2) -{ - int res = KDE_fseek(fion, cursor * blocksize, SEEK_SET); - if (res) - perror("fseek"); - res = fread(buffer2, blocksize, 1, fion); - if (res != 1) - perror("fread"); - - res = KDE_fseek(fion, newpos * blocksize, SEEK_SET); - if (res) - perror("fseek"); - res = fwrite(buffer2, blocksize, 1, fion); - if (res != 1) - perror("fwrite"); -} - -void BlockArray::decreaseBuffer(size_t newsize) -{ - if (index < newsize) // still fits in whole - return; - - int offset = (current - (newsize - 1) + size) % size; - - if (!offset) - return; - - // The Block constructor could do somthing in future... - char *buffer1 = new char[blocksize]; - - FILE *fion = fdopen(dup(ion), "w+b"); - if (!fion) { - delete [] buffer1; - perror("fdopen/dup"); - return; - } - - int firstblock; - if (current <= newsize) { - firstblock = current + 1; - } else { - firstblock = 0; - } - - size_t oldpos; - for (size_t i = 0, cursor=firstblock; i < newsize; i++) { - oldpos = (size + cursor + offset) % size; - moveBlock(fion, oldpos, cursor, buffer1); - if (oldpos < newsize) { - cursor = oldpos; - } else - cursor++; - } - - current = newsize - 1; - length = newsize; - - delete [] buffer1; - - fclose(fion); - -} - -void BlockArray::increaseBuffer() -{ - if (index < size) // not even wrapped once - return; - - int offset = (current + size + 1) % size; - if (!offset) // no moving needed - return; - - // The Block constructor could do somthing in future... - char *buffer1 = new char[blocksize]; - char *buffer2 = new char[blocksize]; - - int runs = 1; - int bpr = size; // blocks per run - - if (size % offset == 0) { - bpr = size / offset; - runs = offset; - } - - FILE *fion = fdopen(dup(ion), "w+b"); - if (!fion) { - perror("fdopen/dup"); - delete [] buffer1; - delete [] buffer2; - return; - } - - int res; - for (int i = 0; i < runs; i++) - { - // free one block in chain - int firstblock = (offset + i) % size; - res = KDE_fseek(fion, firstblock * blocksize, SEEK_SET); - if (res) - perror("fseek"); - res = fread(buffer1, blocksize, 1, fion); - if (res != 1) - perror("fread"); - int newpos = 0; - for (int j = 1, cursor=firstblock; j < bpr; j++) - { - cursor = (cursor + offset) % size; - newpos = (cursor - offset + size) % size; - moveBlock(fion, cursor, newpos, buffer2); - } - res = KDE_fseek(fion, i * blocksize, SEEK_SET); - if (res) - perror("fseek"); - res = fwrite(buffer1, blocksize, 1, fion); - if (res != 1) - perror("fwrite"); - } - current = size - 1; - length = size; - - delete [] buffer1; - delete [] buffer2; - - fclose(fion); - -} -
deleted file mode 100644 --- a/gui//src/BlockArray.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - Copyright 2000 by Stephan Kulow <coolo@kde.org> - - This program 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 program 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 BLOCKARRAY_H -#define BLOCKARRAY_H - -#include <unistd.h> - -#define BlockSize (1 << 12) -#define ENTRIES ((BlockSize - sizeof(size_t) ) / sizeof(unsigned char)) - -struct Block { - Block() { size = 0; } - unsigned char data[ENTRIES]; - size_t size; -}; - -// /////////////////////////////////////////////////////// - -class BlockArray { -public: - /** - * Creates a history file for holding - * maximal size blocks. If more blocks - * are requested, then it drops earlier - * added ones. - */ - BlockArray(); - - /// destructor - ~BlockArray(); - - /** - * adds the Block at the end of history. - * This may drop other blocks. - * - * The ownership on the block is transferred. - * An unique index number is returned for accessing - * it later (if not yet dropped then) - * - * Note, that the block may be dropped completely - * if history is turned off. - */ - size_t append(Block *block); - - /** - * gets the block at the index. Function may return - * 0 if the block isn't available any more. - * - * The returned block is strictly readonly as only - * maped in memory - and will be invalid on the next - * operation on this class. - */ - const Block *at(size_t index); - - /** - * reorders blocks as needed. If newsize is null, - * the history is emptied completely. The indices - * returned on append won't change their semantic, - * but they may not be valid after this call. - */ - bool setHistorySize(size_t newsize); - - size_t newBlock(); - - Block *lastBlock() const; - - /** - * Convenient function to set the size in KBytes - * instead of blocks - */ - bool setSize(size_t newsize); - - size_t len() const { return length; } - - bool has(size_t index) const; - - size_t getCurrent() const { return current; } - -private: - void unmap(); - void increaseBuffer(); - void decreaseBuffer(size_t newsize); - - size_t size; - // current always shows to the last inserted block - size_t current; - size_t index; - - Block *lastmap; - size_t lastmap_index; - Block *lastblock; - - int ion; - size_t length; - -}; -#endif
deleted file mode 100644 --- a/gui//src/BrowserWidget.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include "BrowserWidget.h" -#include <QVBoxLayout> -#include <QAction> -#include <QStyle> -#include <QApplication> - -BrowserDockWidget::BrowserDockWidget(QWidget *parent, BrowserWidget *browserWidget) - : QDockWidget(parent) { - m_browserWidget = browserWidget; - setWidget(m_browserWidget); -} - -BrowserDockWidget::~BrowserDockWidget() { -} - -BrowserWidget *BrowserDockWidget::browserWidget() { - return m_browserWidget; -} - -BrowserWidget::BrowserWidget(QWidget *parent) - : QWidget(parent) { - construct(); -} - -void BrowserWidget::construct() { - QStyle *style = QApplication::style(); - m_navigationToolBar = new QToolBar(this); - m_webView = new QWebView(this); - m_urlLineEdit = new QLineEdit(this); - m_statusBar = new QStatusBar(this); - - QAction *backAction = new QAction(style->standardIcon(QStyle::SP_ArrowLeft), - "", m_navigationToolBar); - QAction *forwardAction = new QAction(style->standardIcon(QStyle::SP_ArrowRight), - "", m_navigationToolBar); - - m_navigationToolBar->addAction(backAction); - m_navigationToolBar->addAction(forwardAction); - m_navigationToolBar->addWidget(m_urlLineEdit); - - QVBoxLayout *layout = new QVBoxLayout(); - layout->addWidget(m_navigationToolBar); - layout->addWidget(m_webView); - layout->addWidget(m_statusBar); - layout->setMargin(2); - setLayout(layout); - - connect(backAction, SIGNAL(triggered()), m_webView, SLOT(back())); - connect(forwardAction, SIGNAL(triggered()), m_webView, SLOT(forward())); - connect(m_webView, SIGNAL(urlChanged(QUrl)), this, SLOT(setUrl(QUrl))); - connect(m_urlLineEdit, SIGNAL(returnPressed()), this, SLOT(jumpToWebsite())); - //connect(m_webView, SIGNAL(statusBarMessage(QString)), this, SLOT(showMessage(QString))); -} - -void BrowserWidget::setUrl(QUrl url) { - m_urlLineEdit->setText(url.toString()); -} - -void BrowserWidget::jumpToWebsite() { - QString url = m_urlLineEdit->text(); - if(!url.startsWith("http://")) - url = "http://" + url; - load(url); -} - -void BrowserWidget::showStatusMessage(QString message) { - m_statusBar->showMessage(message, 1000); -} - -void BrowserWidget::load(QUrl url) { - m_webView->load(url); -}
deleted file mode 100644 --- a/gui//src/BrowserWidget.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef BROWSERMDISUBWINDOW_H -#define BROWSERMDISUBWINDOW_H - -#include <QWidget> -#include <QToolBar> -#include <QLineEdit> -#include <QtWebKit/QWebView> -#include <QStatusBar> -#include <QDockWidget> - -class BrowserWidget; -class BrowserDockWidget : public QDockWidget { -public: - BrowserDockWidget(QWidget *parent, BrowserWidget *browserWidget); - ~BrowserDockWidget(); - - BrowserWidget *browserWidget(); - -private: - BrowserWidget *m_browserWidget; -}; - -class BrowserWidget : public QWidget { - Q_OBJECT -public: - BrowserWidget(QWidget *parent = 0); - void load(QUrl url); - -public slots: - void setUrl(QUrl url); - void jumpToWebsite(); - void showStatusMessage(QString message); - -private: - void construct(); - - QLineEdit *m_urlLineEdit; - QToolBar *m_navigationToolBar; - QWebView *m_webView; - QStatusBar *m_statusBar; -}; - -#endif // BROWSERMDISUBWINDOW_H
deleted file mode 100644 --- a/gui//src/Character.h +++ /dev/null @@ -1,220 +0,0 @@ -/* - This file is part of Konsole, KDE's terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 CHARACTER_H -#define CHARACTER_H - -// Qt -#include <QtCore/QHash> - -// Local -#include "CharacterColor.h" - -typedef unsigned char LineProperty; - -static const int LINE_DEFAULT = 0; -static const int LINE_WRAPPED = (1 << 0); -static const int LINE_DOUBLEWIDTH = (1 << 1); -static const int LINE_DOUBLEHEIGHT = (1 << 2); - -#define DEFAULT_RENDITION 0 -#define RE_BOLD (1 << 0) -#define RE_BLINK (1 << 1) -#define RE_UNDERLINE (1 << 2) -#define RE_REVERSE (1 << 3) // Screen only -#define RE_INTENSIVE (1 << 3) // Widget only -#define RE_CURSOR (1 << 4) -#define RE_EXTENDED_CHAR (1 << 5) - -/** - * A single character in the terminal which consists of a unicode character - * value, foreground and background colors and a set of rendition attributes - * which specify how it should be drawn. - */ -class Character -{ -public: - /** - * Constructs a new character. - * - * @param _c The unicode character value of this character. - * @param _f The foreground color used to draw the character. - * @param _b The color used to draw the character's background. - * @param _r A set of rendition flags which specify how this character is to be drawn. - */ - inline Character(quint16 _c = ' ', - CharacterColor _f = CharacterColor(COLOR_SPACE_DEFAULT,DEFAULT_FORE_COLOR), - CharacterColor _b = CharacterColor(COLOR_SPACE_DEFAULT,DEFAULT_BACK_COLOR), - quint8 _r = DEFAULT_RENDITION) - : character(_c), rendition(_r), foregroundColor(_f), backgroundColor(_b) {} - - union - { - /** The unicode character value for this character. */ - quint16 character; - /** - * Experimental addition which allows a single Character instance to contain more than - * one unicode character. - * - * charSequence is a hash code which can be used to look up the unicode - * character sequence in the ExtendedCharTable used to create the sequence. - */ - quint16 charSequence; - }; - - /** A combination of RENDITION flags which specify options for drawing the character. */ - quint8 rendition; - - /** The foreground color used to draw this character. */ - CharacterColor foregroundColor; - /** The color used to draw this character's background. */ - CharacterColor backgroundColor; - - /** - * Returns true if this character has a transparent background when - * it is drawn with the specified @p palette. - */ - bool isTransparent(const ColorEntry* palette) const; - /** - * Returns true if this character should always be drawn in bold when - * it is drawn with the specified @p palette, independent of whether - * or not the character has the RE_BOLD rendition flag. - */ - ColorEntry::FontWeight fontWeight(const ColorEntry* base) const; - - /** - * returns true if the format (color, rendition flag) of the compared characters is equal - */ - bool equalsFormat(const Character &other) const; - - /** - * Compares two characters and returns true if they have the same unicode character value, - * rendition and colors. - */ - friend bool operator == (const Character& a, const Character& b); - /** - * Compares two characters and returns true if they have different unicode character values, - * renditions or colors. - */ - friend bool operator != (const Character& a, const Character& b); -}; - -inline bool operator == (const Character& a, const Character& b) -{ - return a.character == b.character && - a.rendition == b.rendition && - a.foregroundColor == b.foregroundColor && - a.backgroundColor == b.backgroundColor; -} - -inline bool operator != (const Character& a, const Character& b) -{ - return a.character != b.character || - a.rendition != b.rendition || - a.foregroundColor != b.foregroundColor || - a.backgroundColor != b.backgroundColor; -} - -inline bool Character::isTransparent(const ColorEntry* base) const -{ - return ((backgroundColor._colorSpace == COLOR_SPACE_DEFAULT) && - base[backgroundColor._u+0+(backgroundColor._v?BASE_COLORS:0)].transparent) - || ((backgroundColor._colorSpace == COLOR_SPACE_SYSTEM) && - base[backgroundColor._u+2+(backgroundColor._v?BASE_COLORS:0)].transparent); -} - -inline bool Character::equalsFormat(const Character& other) const -{ - return - backgroundColor==other.backgroundColor && - foregroundColor==other.foregroundColor && - rendition==other.rendition; -} - -inline ColorEntry::FontWeight Character::fontWeight(const ColorEntry* base) const -{ - if (backgroundColor._colorSpace == COLOR_SPACE_DEFAULT) - return base[backgroundColor._u+0+(backgroundColor._v?BASE_COLORS:0)].fontWeight; - else if (backgroundColor._colorSpace == COLOR_SPACE_SYSTEM) - return base[backgroundColor._u+2+(backgroundColor._v?BASE_COLORS:0)].fontWeight; - else - return ColorEntry::UseCurrentFormat; -} - -extern unsigned short vt100_graphics[32]; - - -/** - * A table which stores sequences of unicode characters, referenced - * by hash keys. The hash key itself is the same size as a unicode - * character ( ushort ) so that it can occupy the same space in - * a structure. - */ -class ExtendedCharTable -{ -public: - /** Constructs a new character table. */ - ExtendedCharTable(); - ~ExtendedCharTable(); - - /** - * Adds a sequences of unicode characters to the table and returns - * a hash code which can be used later to look up the sequence - * using lookupExtendedChar() - * - * If the same sequence already exists in the table, the hash - * of the existing sequence will be returned. - * - * @param unicodePoints An array of unicode character points - * @param length Length of @p unicodePoints - */ - ushort createExtendedChar(ushort* unicodePoints , ushort length); - /** - * Looks up and returns a pointer to a sequence of unicode characters - * which was added to the table using createExtendedChar(). - * - * @param hash The hash key returned by createExtendedChar() - * @param length This variable is set to the length of the - * character sequence. - * - * @return A unicode character sequence of size @p length. - */ - ushort* lookupExtendedChar(ushort hash , ushort& length) const; - - /** The global ExtendedCharTable instance. */ - static ExtendedCharTable instance; -private: - // calculates the hash key of a sequence of unicode points of size 'length' - ushort extendedCharHash(ushort* unicodePoints , ushort length) const; - // tests whether the entry in the table specified by 'hash' matches the - // character sequence 'unicodePoints' of size 'length' - bool extendedCharMatch(ushort hash , ushort* unicodePoints , ushort length) const; - // internal, maps hash keys to character sequence buffers. The first ushort - // in each value is the length of the buffer, followed by the ushorts in the buffer - // themselves. - QHash<ushort,ushort*> extendedCharTable; -}; - -Q_DECLARE_TYPEINFO(Character, Q_MOVABLE_TYPE); - -#endif // CHARACTER_H -
deleted file mode 100644 --- a/gui//src/CharacterColor.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - This file is part of Konsole, KDE's terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 CHARACTERCOLOR_H -#define CHARACTERCOLOR_H - -// Qt -#include <QtGui/QColor> - -/** - * An entry in a terminal display's color palette. - * - * A color palette is an array of 16 ColorEntry instances which map - * system color indexes (from 0 to 15) into actual colors. - * - * Each entry can be set as bold, in which case any text - * drawn using the color should be drawn in bold. - * - * Each entry can also be transparent, in which case the terminal - * display should avoid drawing the background for any characters - * using the entry as a background. - */ -class ColorEntry -{ -public: - /** Specifies the weight to use when drawing text with this color. */ - enum FontWeight - { - /** Always draw text in this color with a bold weight. */ - Bold, - /** Always draw text in this color with a normal weight. */ - Normal, - /** - * Use the current font weight set by the terminal application. - * This is the default behavior. - */ - UseCurrentFormat - }; - - /** - * Constructs a new color palette entry. - * - * @param c The color value for this entry. - * @param tr Specifies that the color should be transparent when used as a background color. - * @param weight Specifies the font weight to use when drawing text with this color. - */ - ColorEntry(QColor c, bool tr, FontWeight weight = UseCurrentFormat) - : color(c), transparent(tr), fontWeight(weight) {} - - /** - * Constructs a new color palette entry with an undefined color, and - * with the transparent and bold flags set to false. - */ - ColorEntry() : transparent(false), fontWeight(UseCurrentFormat) {} - - /** - * Sets the color, transparency and boldness of this color to those of @p rhs. - */ - void operator=(const ColorEntry& rhs) - { - color = rhs.color; - transparent = rhs.transparent; - fontWeight = rhs.fontWeight; - } - - /** The color value of this entry for display. */ - QColor color; - - /** - * If true character backgrounds using this color should be transparent. - * This is not applicable when the color is used to render text. - */ - bool transparent; - /** - * Specifies the font weight to use when drawing text with this color. - * This is not applicable when the color is used to draw a character's background. - */ - FontWeight fontWeight; -}; - - -// Attributed Character Representations /////////////////////////////// - -// Colors - -#define BASE_COLORS (2+8) -#define INTENSITIES 2 -#define TABLE_COLORS (INTENSITIES*BASE_COLORS) - -#define DEFAULT_FORE_COLOR 0 -#define DEFAULT_BACK_COLOR 1 - -//a standard set of colors using black text on a white background. -//defined in TerminalDisplay.cpp - -extern const ColorEntry base_color_table[TABLE_COLORS]; - -/* CharacterColor is a union of the various color spaces. - - Assignment is as follows: - - Type - Space - Values - - 0 - Undefined - u: 0, v:0 w:0 - 1 - Default - u: 0..1 v:intense w:0 - 2 - System - u: 0..7 v:intense w:0 - 3 - Index(256) - u: 16..255 v:0 w:0 - 4 - RGB - u: 0..255 v:0..256 w:0..256 - - Default colour space has two separate colours, namely - default foreground and default background colour. -*/ - -#define COLOR_SPACE_UNDEFINED 0 -#define COLOR_SPACE_DEFAULT 1 -#define COLOR_SPACE_SYSTEM 2 -#define COLOR_SPACE_256 3 -#define COLOR_SPACE_RGB 4 - -/** - * Describes the color of a single character in the terminal. - */ -class CharacterColor -{ - friend class Character; - -public: - /** Constructs a new CharacterColor whoose color and color space are undefined. */ - CharacterColor() - : _colorSpace(COLOR_SPACE_UNDEFINED), - _u(0), - _v(0), - _w(0) - {} - - /** - * Constructs a new CharacterColor using the specified @p colorSpace and with - * color value @p co - * - * The meaning of @p co depends on the @p colorSpace used. - * - * TODO : Document how @p co relates to @p colorSpace - * - * TODO : Add documentation about available color spaces. - */ - CharacterColor(quint8 colorSpace, int co) - : _colorSpace(colorSpace), - _u(0), - _v(0), - _w(0) - { - switch (colorSpace) - { - case COLOR_SPACE_DEFAULT: - _u = co & 1; - break; - case COLOR_SPACE_SYSTEM: - _u = co & 7; - _v = (co >> 3) & 1; - break; - case COLOR_SPACE_256: - _u = co & 255; - break; - case COLOR_SPACE_RGB: - _u = co >> 16; - _v = co >> 8; - _w = co; - break; - default: - _colorSpace = COLOR_SPACE_UNDEFINED; - } - } - - /** - * Returns true if this character color entry is valid. - */ - bool isValid() - { - return _colorSpace != COLOR_SPACE_UNDEFINED; - } - - /** - * Toggles the value of this color between a normal system color and the corresponding intensive - * system color. - * - * This is only applicable if the color is using the COLOR_SPACE_DEFAULT or COLOR_SPACE_SYSTEM - * color spaces. - */ - void toggleIntensive(); - - /** - * Returns the color within the specified color @p palette - * - * The @p palette is only used if this color is one of the 16 system colors, otherwise - * it is ignored. - */ - QColor color(const ColorEntry* palette) const; - - /** - * Compares two colors and returns true if they represent the same color value and - * use the same color space. - */ - friend bool operator == (const CharacterColor& a, const CharacterColor& b); - /** - * Compares two colors and returns true if they represent different color values - * or use different color spaces. - */ - friend bool operator != (const CharacterColor& a, const CharacterColor& b); - -private: - quint8 _colorSpace; - - // bytes storing the character color - quint8 _u; - quint8 _v; - quint8 _w; -}; - -inline bool operator == (const CharacterColor& a, const CharacterColor& b) -{ - return a._colorSpace == b._colorSpace && - a._u == b._u && - a._v == b._v && - a._w == b._w; -} -inline bool operator != (const CharacterColor& a, const CharacterColor& b) -{ - return !operator==(a,b); -} - -inline const QColor color256(quint8 u, const ColorEntry* base) -{ - // 0.. 16: system colors - if (u < 8) return base[u+2 ].color; u -= 8; - if (u < 8) return base[u+2+BASE_COLORS].color; u -= 8; - - // 16..231: 6x6x6 rgb color cube - if (u < 216) return QColor(((u/36)%6) ? (40*((u/36)%6)+55) : 0, - ((u/ 6)%6) ? (40*((u/ 6)%6)+55) : 0, - ((u/ 1)%6) ? (40*((u/ 1)%6)+55) : 0); u -= 216; - - // 232..255: gray, leaving out black and white - int gray = u*10+8; return QColor(gray,gray,gray); -} - -inline QColor CharacterColor::color(const ColorEntry* base) const -{ - switch (_colorSpace) - { - case COLOR_SPACE_DEFAULT: return base[_u+0+(_v?BASE_COLORS:0)].color; - case COLOR_SPACE_SYSTEM: return base[_u+2+(_v?BASE_COLORS:0)].color; - case COLOR_SPACE_256: return color256(_u,base); - case COLOR_SPACE_RGB: return QColor(_u,_v,_w); - case COLOR_SPACE_UNDEFINED: return QColor(); - } - - Q_ASSERT(false); // invalid color space - - return QColor(); -} - -inline void CharacterColor::toggleIntensive() -{ - if (_colorSpace == COLOR_SPACE_SYSTEM || _colorSpace == COLOR_SPACE_DEFAULT) - { - _v = !_v; - } -} - -#endif // CHARACTERCOLOR_H -
deleted file mode 100644 --- a/gui//src/ColorTables.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef _COLOR_TABLE_H -#define _COLOR_TABLE_H - -#include "CharacterColor.h" - -static const ColorEntry whiteonblack_color_table[TABLE_COLORS] = -{ - // normal - ColorEntry(QColor(0xFF,0xFF,0xFF), 0, 0 ), ColorEntry( QColor(0x00,0x00,0x00), 1, 0 ), // Dfore, Dback - ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0x18), 0, 0 ), // Black, Red - ColorEntry(QColor(0x18,0xB2,0x18), 0, 0 ), ColorEntry( QColor(0xB2,0x68,0x18), 0, 0 ), // Green, Yellow - ColorEntry(QColor(0x18,0x18,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), // Blue, Magenta - ColorEntry(QColor(0x18,0xB2,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 0, 0 ), // Cyan, White - // intensiv - ColorEntry(QColor(0x00,0x00,0x00), 0, 1 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 1, 0 ), - ColorEntry(QColor(0x68,0x68,0x68), 0, 0 ), ColorEntry( QColor(0xFF,0x54,0x54), 0, 0 ), - ColorEntry(QColor(0x54,0xFF,0x54), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0x54), 0, 0 ), - ColorEntry(QColor(0x54,0x54,0xFF), 0, 0 ), ColorEntry( QColor(0xFF,0x54,0xFF), 0, 0 ), - ColorEntry(QColor(0x54,0xFF,0xFF), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 0, 0 ) -}; - -static const ColorEntry greenonblack_color_table[TABLE_COLORS] = -{ - ColorEntry(QColor( 24, 240, 24), 0, 0), ColorEntry(QColor( 0, 0, 0), 1, 0), - ColorEntry(QColor( 0, 0, 0), 0, 0), ColorEntry(QColor( 178, 24, 24), 0, 0), - ColorEntry(QColor( 24, 178, 24), 0, 0), ColorEntry(QColor( 178, 104, 24), 0, 0), - ColorEntry(QColor( 24, 24, 178), 0, 0), ColorEntry(QColor( 178, 24, 178), 0, 0), - ColorEntry(QColor( 24, 178, 178), 0, 0), ColorEntry(QColor( 178, 178, 178), 0, 0), - // intensive colors - ColorEntry(QColor( 24, 240, 24), 0, 1 ), ColorEntry(QColor( 0, 0, 0), 1, 0 ), - ColorEntry(QColor( 104, 104, 104), 0, 0 ), ColorEntry(QColor( 255, 84, 84), 0, 0 ), - ColorEntry(QColor( 84, 255, 84), 0, 0 ), ColorEntry(QColor( 255, 255, 84), 0, 0 ), - ColorEntry(QColor( 84, 84, 255), 0, 0 ), ColorEntry(QColor( 255, 84, 255), 0, 0 ), - ColorEntry(QColor( 84, 255, 255), 0, 0 ), ColorEntry(QColor( 255, 255, 255), 0, 0 ) -}; - -static const ColorEntry blackonlightyellow_color_table[TABLE_COLORS] = -{ - ColorEntry(QColor( 0, 0, 0), 0, 0), ColorEntry(QColor( 255, 255, 221), 1, 0), - ColorEntry(QColor( 0, 0, 0), 0, 0), ColorEntry(QColor( 178, 24, 24), 0, 0), - ColorEntry(QColor( 24, 178, 24), 0, 0), ColorEntry(QColor( 178, 104, 24), 0, 0), - ColorEntry(QColor( 24, 24, 178), 0, 0), ColorEntry(QColor( 178, 24, 178), 0, 0), - ColorEntry(QColor( 24, 178, 178), 0, 0), ColorEntry(QColor( 178, 178, 178), 0, 0), - ColorEntry(QColor( 0, 0, 0), 0, 1), ColorEntry(QColor( 255, 255, 221), 1, 0), - ColorEntry(QColor(104, 104, 104), 0, 0), ColorEntry(QColor( 255, 84, 84), 0, 0), - ColorEntry(QColor( 84, 255, 84), 0, 0), ColorEntry(QColor( 255, 255, 84), 0, 0), - ColorEntry(QColor( 84, 84, 255), 0, 0), ColorEntry(QColor( 255, 84, 255), 0, 0), - ColorEntry(QColor( 84, 255, 255), 0, 0), ColorEntry(QColor( 255, 255, 255), 0, 0) -}; - - - - - -#endif -
deleted file mode 100644 --- a/gui//src/DefaultTranslatorText.h +++ /dev/null @@ -1,2 +0,0 @@ -"keyboard \"Fallback Key Translator\"\n" -"key Tab : \"\\t\" \0"
deleted file mode 100644 --- a/gui//src/Emulation.cpp +++ /dev/null @@ -1,404 +0,0 @@ -/* - Copyright 2007-2008 Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - Copyright 1996 by Matthias Ettrich <ettrich@kde.org> - - This program 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 program 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. -*/ - -// Own -#include "Emulation.h" - -// System -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -// Qt -#include <QtGui/QApplication> -#include <QtGui/QClipboard> -#include <QtCore/QHash> -#include <QtGui/QKeyEvent> -#include <QtCore/QRegExp> -#include <QtCore/QTextStream> -#include <QtCore/QThread> - -#include <QtCore/QTime> - -// Konsole -#include "KeyboardTranslator.h" -#include "Screen.h" -#include "TerminalCharacterDecoder.h" -#include "ScreenWindow.h" - -Emulation::Emulation() : - _currentScreen(0), - _codec(0), - _decoder(0), - _keyTranslator(0), - _usesMouse(false) -{ - // create screens with a default size - _screen[0] = new Screen(40,80); - _screen[1] = new Screen(40,80); - _currentScreen = _screen[0]; - - QObject::connect(&_bulkTimer1, SIGNAL(timeout()), this, SLOT(showBulk()) ); - QObject::connect(&_bulkTimer2, SIGNAL(timeout()), this, SLOT(showBulk()) ); - - // listen for mouse status changes - connect( this , SIGNAL(programUsesMouseChanged(bool)) , - SLOT(usesMouseChanged(bool)) ); -} - -bool Emulation::programUsesMouse() const -{ - return _usesMouse; -} - -void Emulation::usesMouseChanged(bool usesMouse) -{ - _usesMouse = usesMouse; -} - -ScreenWindow* Emulation::createWindow() -{ - ScreenWindow* window = new ScreenWindow(); - window->setScreen(_currentScreen); - _windows << window; - - connect(window , SIGNAL(selectionChanged()), - this , SLOT(bufferedUpdate())); - - connect(this , SIGNAL(outputChanged()), - window , SLOT(notifyOutputChanged()) ); - return window; -} - -Emulation::~Emulation() -{ - QListIterator<ScreenWindow*> windowIter(_windows); - - while (windowIter.hasNext()) - { - delete windowIter.next(); - } - - delete _screen[0]; - delete _screen[1]; - delete _decoder; -} - -void Emulation::setScreen(int n) -{ - Screen *old = _currentScreen; - _currentScreen = _screen[n & 1]; - if (_currentScreen != old) - { - // tell all windows onto this emulation to switch to the newly active screen - foreach(ScreenWindow* window,_windows) - window->setScreen(_currentScreen); - } -} - -void Emulation::clearHistory() -{ - _screen[0]->setScroll( _screen[0]->getScroll() , false ); -} -void Emulation::setHistory(const HistoryType& t) -{ - _screen[0]->setScroll(t); - - showBulk(); -} - -const HistoryType& Emulation::history() const -{ - return _screen[0]->getScroll(); -} - -void Emulation::setCodec(const QTextCodec * qtc) -{ - if (qtc) - _codec = qtc; - else - setCodec(LocaleCodec); - - delete _decoder; - _decoder = _codec->makeDecoder(); - - emit useUtf8Request(utf8()); -} - -void Emulation::setCodec(EmulationCodec codec) -{ - if ( codec == Utf8Codec ) - setCodec( QTextCodec::codecForName("utf8") ); - else if ( codec == LocaleCodec ) - setCodec( QTextCodec::codecForLocale() ); -} - -void Emulation::setKeyBindings(const QString& name) -{ - _keyTranslator = KeyboardTranslatorManager::instance()->findTranslator(name); - if (!_keyTranslator) - { - _keyTranslator = KeyboardTranslatorManager::instance()->defaultTranslator(); - } -} - -QString Emulation::keyBindings() const -{ - return _keyTranslator->name(); -} - -void Emulation::receiveChar(int c) -// process application unicode input to terminal -// this is a trivial scanner -{ - c &= 0xff; - switch (c) - { - case '\b' : _currentScreen->backspace(); break; - case '\t' : _currentScreen->tab(); break; - case '\n' : _currentScreen->newLine(); break; - case '\r' : _currentScreen->toStartOfLine(); break; - case 0x07 : emit stateSet(NOTIFYBELL); - break; - default : _currentScreen->displayCharacter(c); break; - }; -} - -void Emulation::sendKeyEvent( QKeyEvent* ev ) -{ - emit stateSet(NOTIFYNORMAL); - - if (!ev->text().isEmpty()) - { // A block of text - // Note that the text is proper unicode. - // We should do a conversion here - emit sendData(ev->text().toUtf8(), ev->text().length()); - } -} - -void Emulation::sendString(const char*,int) -{ - // default implementation does nothing -} - -void Emulation::sendMouseEvent(int /*buttons*/, int /*column*/, int /*row*/, int /*eventType*/) -{ - // default implementation does nothing -} - -/* - We are doing code conversion from locale to unicode first. -TODO: Character composition from the old code. See #96536 -*/ - -void Emulation::receiveData(const char* text, int length) -{ - emit stateSet(NOTIFYACTIVITY); - - bufferedUpdate(); - - QString unicodeText = _decoder->toUnicode(text,length); - - //send characters to terminal emulator - for (int i=0;i<unicodeText.length();i++) - receiveChar(unicodeText[i].unicode()); - - //look for z-modem indicator - //-- someone who understands more about z-modems that I do may be able to move - //this check into the above for loop? - for (int i=0;i<length;i++) - { - if (text[i] == '\030') - { - if ((length-i-1 > 3) && (strncmp(text+i+1, "B00", 3) == 0)) - emit zmodemDetected(); - } - } -} - -void Emulation::writeToStream( TerminalCharacterDecoder* _decoder , - int startLine , - int endLine) -{ - _currentScreen->writeLinesToStream(_decoder,startLine,endLine); -} - -int Emulation::lineCount() const -{ - // sum number of lines currently on _screen plus number of lines in history - return _currentScreen->getLines() + _currentScreen->getHistLines(); -} - -#define BULK_TIMEOUT1 10 -#define BULK_TIMEOUT2 40 - -void Emulation::showBulk() -{ - _bulkTimer1.stop(); - _bulkTimer2.stop(); - - emit outputChanged(); - - _currentScreen->resetScrolledLines(); - _currentScreen->resetDroppedLines(); -} - -void Emulation::bufferedUpdate() -{ - _bulkTimer1.setSingleShot(true); - _bulkTimer1.start(BULK_TIMEOUT1); - if (!_bulkTimer2.isActive()) - { - _bulkTimer2.setSingleShot(true); - _bulkTimer2.start(BULK_TIMEOUT2); - } -} - -char Emulation::eraseChar() const -{ - return '\b'; -} - -void Emulation::setImageSize(int lines, int columns) -{ - if ((lines < 1) || (columns < 1)) - return; - - QSize screenSize[2] = { QSize(_screen[0]->getColumns(), - _screen[0]->getLines()), - QSize(_screen[1]->getColumns(), - _screen[1]->getLines()) }; - QSize newSize(columns,lines); - - if (newSize == screenSize[0] && newSize == screenSize[1]) - return; - - _screen[0]->resizeImage(lines,columns); - _screen[1]->resizeImage(lines,columns); - - emit imageSizeChanged(lines,columns); - - bufferedUpdate(); -} - -QSize Emulation::imageSize() const -{ - return QSize(_currentScreen->getColumns(), _currentScreen->getLines()); -} - -ushort ExtendedCharTable::extendedCharHash(ushort* unicodePoints , ushort length) const -{ - ushort hash = 0; - for ( ushort i = 0 ; i < length ; i++ ) - { - hash = 31*hash + unicodePoints[i]; - } - return hash; -} -bool ExtendedCharTable::extendedCharMatch(ushort hash , ushort* unicodePoints , ushort length) const -{ - ushort* entry = extendedCharTable[hash]; - - // compare given length with stored sequence length ( given as the first ushort in the - // stored buffer ) - if ( entry == 0 || entry[0] != length ) - return false; - // if the lengths match, each character must be checked. the stored buffer starts at - // entry[1] - for ( int i = 0 ; i < length ; i++ ) - { - if ( entry[i+1] != unicodePoints[i] ) - return false; - } - return true; -} -ushort ExtendedCharTable::createExtendedChar(ushort* unicodePoints , ushort length) -{ - // look for this sequence of points in the table - ushort hash = extendedCharHash(unicodePoints,length); - - // check existing entry for match - while ( extendedCharTable.contains(hash) ) - { - if ( extendedCharMatch(hash,unicodePoints,length) ) - { - // this sequence already has an entry in the table, - // return its hash - return hash; - } - else - { - // if hash is already used by another, different sequence of unicode character - // points then try next hash - hash++; - } - } - - - // add the new sequence to the table and - // return that index - ushort* buffer = new ushort[length+1]; - buffer[0] = length; - for ( int i = 0 ; i < length ; i++ ) - buffer[i+1] = unicodePoints[i]; - - extendedCharTable.insert(hash,buffer); - - return hash; -} - -ushort* ExtendedCharTable::lookupExtendedChar(ushort hash , ushort& length) const -{ - // lookup index in table and if found, set the length - // argument and return a pointer to the character sequence - - ushort* buffer = extendedCharTable[hash]; - if ( buffer ) - { - length = buffer[0]; - return buffer+1; - } - else - { - length = 0; - return 0; - } -} - -ExtendedCharTable::ExtendedCharTable() -{ -} -ExtendedCharTable::~ExtendedCharTable() -{ - // free all allocated character buffers - QHashIterator<ushort,ushort*> iter(extendedCharTable); - while ( iter.hasNext() ) - { - iter.next(); - delete[] iter.value(); - } -} - -// global instance -ExtendedCharTable ExtendedCharTable::instance; - -
deleted file mode 100644 --- a/gui//src/Emulation.h +++ /dev/null @@ -1,462 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 EMULATION_H -#define EMULATION_H - -// System -#include <stdio.h> - -// Qt -#include <QtGui/QKeyEvent> -#include <QtCore/QTextCodec> -#include <QtCore/QTextStream> -#include <QtCore/QTimer> - - -class KeyboardTranslator; -class HistoryType; -class Screen; -class ScreenWindow; -class TerminalCharacterDecoder; - -/** - * This enum describes the available states which - * the terminal emulation may be set to. - * - * These are the values used by Emulation::stateChanged() - */ -enum -{ - /** The emulation is currently receiving user input. */ - NOTIFYNORMAL=0, - /** - * The terminal program has triggered a bell event - * to get the user's attention. - */ - NOTIFYBELL=1, - /** - * The emulation is currently receiving data from its - * terminal input. - */ - NOTIFYACTIVITY=2, - - // unused here? - NOTIFYSILENCE=3 -}; - -/** - * Base class for terminal emulation back-ends. - * - * The back-end is responsible for decoding an incoming character stream and - * producing an output image of characters. - * - * When input from the terminal is received, the receiveData() slot should be called with - * the data which has arrived. The emulation will process the data and update the - * screen image accordingly. The codec used to decode the incoming character stream - * into the unicode characters used internally can be specified using setCodec() - * - * The size of the screen image can be specified by calling setImageSize() with the - * desired number of lines and columns. When new lines are added, old content - * is moved into a history store, which can be set by calling setHistory(). - * - * The screen image can be accessed by creating a ScreenWindow onto this emulation - * by calling createWindow(). Screen windows provide access to a section of the - * output. Each screen window covers the same number of lines and columns as the - * image size returned by imageSize(). The screen window can be moved up and down - * and provides transparent access to both the current on-screen image and the - * previous output. The screen windows emit an outputChanged signal - * when the section of the image they are looking at changes. - * Graphical views can then render the contents of a screen window, listening for notifications - * of output changes from the screen window which they are associated with and updating - * accordingly. - * - * The emulation also is also responsible for converting input from the connected views such - * as keypresses and mouse activity into a character string which can be sent - * to the terminal program. Key presses can be processed by calling the sendKeyEvent() slot, - * while mouse events can be processed using the sendMouseEvent() slot. When the character - * stream has been produced, the emulation will emit a sendData() signal with a pointer - * to the character buffer. This data should be fed to the standard input of the terminal - * process. The translation of key presses into an output character stream is performed - * using a lookup in a set of key bindings which map key sequences to output - * character sequences. The name of the key bindings set used can be specified using - * setKeyBindings() - * - * The emulation maintains certain state information which changes depending on the - * input received. The emulation can be reset back to its starting state by calling - * reset(). - * - * The emulation also maintains an activity state, which specifies whether - * terminal is currently active ( when data is received ), normal - * ( when the terminal is idle or receiving user input ) or trying - * to alert the user ( also known as a "Bell" event ). The stateSet() signal - * is emitted whenever the activity state is set. This can be used to determine - * how long the emulation has been active/idle for and also respond to - * a 'bell' event in different ways. - */ -class Emulation : public QObject -{ -Q_OBJECT - -public: - - /** Constructs a new terminal emulation */ - Emulation(); - ~Emulation(); - - /** - * Creates a new window onto the output from this emulation. The contents - * of the window are then rendered by views which are set to use this window using the - * TerminalDisplay::setScreenWindow() method. - */ - ScreenWindow* createWindow(); - - /** Returns the size of the screen image which the emulation produces */ - QSize imageSize() const; - - /** - * Returns the total number of lines, including those stored in the history. - */ - int lineCount() const; - - /** - * Sets the history store used by this emulation. When new lines - * are added to the output, older lines at the top of the screen are transferred to a history - * store. - * - * The number of lines which are kept and the storage location depend on the - * type of store. - */ - void setHistory(const HistoryType&); - /** Returns the history store used by this emulation. See setHistory() */ - const HistoryType& history() const; - /** Clears the history scroll. */ - void clearHistory(); - - /** - * Copies the output history from @p startLine to @p endLine - * into @p stream, using @p decoder to convert the terminal - * characters into text. - * - * @param decoder A decoder which converts lines of terminal characters with - * appearance attributes into output text. PlainTextDecoder is the most commonly - * used decoder. - * @param startLine Index of first line to copy - * @param endLine Index of last line to copy - */ - virtual void writeToStream(TerminalCharacterDecoder* decoder,int startLine,int endLine); - - /** Returns the codec used to decode incoming characters. See setCodec() */ - const QTextCodec* codec() const { return _codec; } - /** Sets the codec used to decode incoming characters. */ - void setCodec(const QTextCodec*); - - /** - * Convenience method. - * Returns true if the current codec used to decode incoming - * characters is UTF-8 - */ - bool utf8() const - { Q_ASSERT(_codec); return _codec->mibEnum() == 106; } - - - /** TODO Document me */ - virtual char eraseChar() const; - - /** - * Sets the key bindings used to key events - * ( received through sendKeyEvent() ) into character - * streams to send to the terminal. - */ - void setKeyBindings(const QString& name); - /** - * Returns the name of the emulation's current key bindings. - * See setKeyBindings() - */ - QString keyBindings() const; - - /** - * Copies the current image into the history and clears the screen. - */ - virtual void clearEntireScreen() =0; - - /** Resets the state of the terminal. */ - virtual void reset() =0; - - /** - * Returns true if the active terminal program wants - * mouse input events. - * - * The programUsesMouseChanged() signal is emitted when this - * changes. - */ - bool programUsesMouse() const; - -public slots: - - /** Change the size of the emulation's image */ - virtual void setImageSize(int lines, int columns); - - /** - * Interprets a sequence of characters and sends the result to the terminal. - * This is equivalent to calling sendKeyEvent() for each character in @p text in succession. - */ - virtual void sendText(const QString& text) = 0; - - /** - * Interprets a key press event and emits the sendData() signal with - * the resulting character stream. - */ - virtual void sendKeyEvent(QKeyEvent*); - - /** - * Converts information about a mouse event into an xterm-compatible escape - * sequence and emits the character sequence via sendData() - */ - virtual void sendMouseEvent(int buttons, int column, int line, int eventType); - - /** - * Sends a string of characters to the foreground terminal process. - * - * @param string The characters to send. - * @param length Length of @p string or if set to a negative value, @p string will - * be treated as a null-terminated string and its length will be determined automatically. - */ - virtual void sendString(const char* string, int length = -1) = 0; - - /** - * Processes an incoming stream of characters. receiveData() decodes the incoming - * character buffer using the current codec(), and then calls receiveChar() for - * each unicode character in the resulting buffer. - * - * receiveData() also starts a timer which causes the outputChanged() signal - * to be emitted when it expires. The timer allows multiple updates in quick - * succession to be buffered into a single outputChanged() signal emission. - * - * @param buffer A string of characters received from the terminal program. - * @param len The length of @p buffer - */ - void receiveData(const char* buffer,int len); - -signals: - - /** - * Emitted when a buffer of data is ready to send to the - * standard input of the terminal. - * - * @param data The buffer of data ready to be sent - * @param len The length of @p data in bytes - */ - void sendData(const char* data,int len); - - /** - * Requests that sending of input to the emulation - * from the terminal process be suspended or resumed. - * - * @param suspend If true, requests that sending of - * input from the terminal process' stdout be - * suspended. Otherwise requests that sending of - * input be resumed. - */ - void lockPtyRequest(bool suspend); - - /** - * Requests that the pty used by the terminal process - * be set to UTF 8 mode. - * - * TODO: More documentation - */ - void useUtf8Request(bool); - - /** - * Emitted when the activity state of the emulation is set. - * - * @param state The new activity state, one of NOTIFYNORMAL, NOTIFYACTIVITY - * or NOTIFYBELL - */ - void stateSet(int state); - - /** TODO Document me */ - void zmodemDetected(); - - - /** - * Requests that the color of the text used - * to represent the tabs associated with this - * emulation be changed. This is a Konsole-specific - * extension from pre-KDE 4 times. - * - * TODO: Document how the parameter works. - */ - void changeTabTextColorRequest(int color); - - /** - * This is emitted when the program running in the shell indicates whether or - * not it is interested in mouse events. - * - * @param usesMouse This will be true if the program wants to be informed about - * mouse events or false otherwise. - */ - void programUsesMouseChanged(bool usesMouse); - - /** - * Emitted when the contents of the screen image change. - * The emulation buffers the updates from successive image changes, - * and only emits outputChanged() at sensible intervals when - * there is a lot of terminal activity. - * - * Normally there is no need for objects other than the screen windows - * created with createWindow() to listen for this signal. - * - * ScreenWindow objects created using createWindow() will emit their - * own outputChanged() signal in response to this signal. - */ - void outputChanged(); - - /** - * Emitted when the program running in the terminal wishes to update the - * session's title. This also allows terminal programs to customize other - * aspects of the terminal emulation display. - * - * This signal is emitted when the escape sequence "\033]ARG;VALUE\007" - * is received in the input string, where ARG is a number specifying what - * should change and VALUE is a string specifying the new value. - * - * TODO: The name of this method is not very accurate since this method - * is used to perform a whole range of tasks besides just setting - * the user-title of the session. - * - * @param title Specifies what to change. - * <ul> - * <li>0 - Set window icon text and session title to @p newTitle</li> - * <li>1 - Set window icon text to @p newTitle</li> - * <li>2 - Set session title to @p newTitle</li> - * <li>11 - Set the session's default background color to @p newTitle, - * where @p newTitle can be an HTML-style string ("#RRGGBB") or a named - * color (eg 'red', 'blue'). - * See http://doc.trolltech.com/4.2/qcolor.html#setNamedColor for more - * details. - * </li> - * <li>31 - Supposedly treats @p newTitle as a URL and opens it (NOT IMPLEMENTED)</li> - * <li>32 - Sets the icon associated with the session. @p newTitle is the name - * of the icon to use, which can be the name of any icon in the current KDE icon - * theme (eg: 'konsole', 'kate', 'folder_home')</li> - * </ul> - * @param newTitle Specifies the new title - */ - - void titleChanged(int title,const QString& newTitle); - - /** - * Emitted when the program running in the terminal changes the - * screen size. - */ - void imageSizeChanged(int lineCount , int columnCount); - - /** - * Emitted when the terminal program requests to change various properties - * of the terminal display. - * - * A profile change command occurs when a special escape sequence, followed - * by a string containing a series of name and value pairs is received. - * This string can be parsed using a ProfileCommandParser instance. - * - * @param text A string expected to contain a series of key and value pairs in - * the form: name=value;name2=value2 ... - */ - void profileChangeCommandReceived(const QString& text); - - /** - * Emitted when a flow control key combination ( Ctrl+S or Ctrl+Q ) is pressed. - * @param suspendKeyPressed True if Ctrl+S was pressed to suspend output or Ctrl+Q to - * resume output. - */ - void flowControlKeyPressed(bool suspendKeyPressed); - -protected: - virtual void setMode(int mode) = 0; - virtual void resetMode(int mode) = 0; - - /** - * Processes an incoming character. See receiveData() - * @p ch A unicode character code. - */ - virtual void receiveChar(int ch); - - /** - * Sets the active screen. The terminal has two screens, primary and alternate. - * The primary screen is used by default. When certain interactive programs such - * as Vim are run, they trigger a switch to the alternate screen. - * - * @param index 0 to switch to the primary screen, or 1 to switch to the alternate screen - */ - void setScreen(int index); - - enum EmulationCodec - { - LocaleCodec = 0, - Utf8Codec = 1 - }; - void setCodec(EmulationCodec codec); // codec number, 0 = locale, 1=utf8 - - - QList<ScreenWindow*> _windows; - - Screen* _currentScreen; // pointer to the screen which is currently active, - // this is one of the elements in the screen[] array - - Screen* _screen[2]; // 0 = primary screen ( used by most programs, including the shell - // scrollbars are enabled in this mode ) - // 1 = alternate ( used by vi , emacs etc. - // scrollbars are not enabled in this mode ) - - - //decodes an incoming C-style character stream into a unicode QString using - //the current text codec. (this allows for rendering of non-ASCII characters in text files etc.) - const QTextCodec* _codec; - QTextDecoder* _decoder; - const KeyboardTranslator* _keyTranslator; // the keyboard layout - -protected slots: - /** - * Schedules an update of attached views. - * Repeated calls to bufferedUpdate() in close succession will result in only a single update, - * much like the Qt buffered update of widgets. - */ - void bufferedUpdate(); - -private slots: - - // triggered by timer, causes the emulation to send an updated screen image to each - // view - void showBulk(); - - void usesMouseChanged(bool usesMouse); - -private: - bool _usesMouse; - QTimer _bulkTimer1; - QTimer _bulkTimer2; - -}; - -#endif // ifndef EMULATION_H
deleted file mode 100644 --- a/gui//src/FileEditorMdiSubWindow.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include "FileEditorMdiSubWindow.h" -#include <QVBoxLayout> -#include <QApplication> -#include <QFile> -#include <QFileDialog> -#include <QMessageBox> -#include <QAction> - -FileEditorMdiSubWindow::FileEditorMdiSubWindow(QWidget *parent) - : QMdiSubWindow(parent) { - construct(); -} - -void FileEditorMdiSubWindow::loadFile(QString fileName) { - m_fileName = fileName; - setWindowTitle(fileName); - m_simpleEditor->load(fileName); -} - -void FileEditorMdiSubWindow::installEventFilter(QObject *object) { - QMdiSubWindow::installEventFilter(object); - m_numberedTextView->installEventFilter(object); - m_simpleEditor->installEventFilter(object); -} - -void FileEditorMdiSubWindow::newFile() { - if(m_modified) { - int decision - = QMessageBox::question(this, - "Open New File", - "Do you want to save the current file?", - QMessageBox::Yes, QMessageBox::No); - - if(decision == QMessageBox::Yes) { - saveFile(); - if(m_modified) { - // If the user attempted to save the file, but it's still - // modified, then probably something went wrong, so we quit here. - return; - } - } - } - - m_fileName = "<unnamed>"; - setWindowTitle(m_fileName); - m_simpleEditor->setPlainText(""); -} - -void FileEditorMdiSubWindow::saveFile() { - QString saveFileName = QFileDialog::getSaveFileName(this, "Save File", m_fileName); - if(saveFileName.isEmpty()) - return; - - QFile file(saveFileName); - file.open(QFile::WriteOnly); - - if(file.write(m_simpleEditor->toPlainText().toLocal8Bit()) == -1) { - QMessageBox::warning(this, - "Error Saving File", - QString("The file could not be saved: %1.").arg(file.errorString())); - } else { - m_simpleEditor->document()->setModified(false); - } - - file.close(); -} - -void FileEditorMdiSubWindow::showToolTipNew() { - m_statusBar->showMessage("Create a new file.", 2000); -} - -void FileEditorMdiSubWindow::showToolTipSave() { - m_statusBar->showMessage("Save the file.", 2000); -} - -void FileEditorMdiSubWindow::showToolTipUndo() { - m_statusBar->showMessage("Revert previous changes.", 2000); -} - -void FileEditorMdiSubWindow::showToolTipRedo() { - m_statusBar->showMessage("Append previous changes.", 2000); -} - -void FileEditorMdiSubWindow::registerModified(bool modified) { - m_modified = modified; -} - -void FileEditorMdiSubWindow::construct() { - QStyle *style = QApplication::style(); - setWidget(new QWidget()); - m_toolBar = new QToolBar(this); - m_simpleEditor = new SimpleEditor(this); - m_statusBar = new QStatusBar(this); - m_numberedTextView = new NumberedCodeEdit(this, m_simpleEditor); - - m_simpleEditor->setFont(QFont("Courier")); - m_simpleEditor->setLineWrapMode(QPlainTextEdit::NoWrap); - - QAction *newAction = new QAction(style->standardIcon(QStyle::SP_FileIcon), - "", m_toolBar); - QAction *saveAction = new QAction(style->standardIcon(QStyle::SP_DriveHDIcon), - "", m_toolBar); - QAction *undoAction = new QAction(style->standardIcon(QStyle::SP_ArrowLeft), - "", m_toolBar); - QAction *redoAction = new QAction(style->standardIcon(QStyle::SP_ArrowRight), - "", m_toolBar); - - m_toolBar->addAction(newAction); - m_toolBar->addAction(saveAction); - m_toolBar->addAction(undoAction); - m_toolBar->addAction(redoAction); - - QVBoxLayout *layout = new QVBoxLayout(); - layout->addWidget(m_toolBar); - layout->addWidget(m_numberedTextView); - layout->addWidget(m_statusBar); - layout->setMargin(2); - widget()->setLayout(layout); - - connect(newAction, SIGNAL(triggered()), this, SLOT(newFile())); - connect(undoAction, SIGNAL(triggered()), m_simpleEditor, SLOT(undo())); - connect(redoAction, SIGNAL(triggered()), m_simpleEditor, SLOT(redo())); - connect(saveAction, SIGNAL(triggered()), this, SLOT(saveFile())); - - connect(newAction, SIGNAL(hovered()), this, SLOT(showToolTipNew())); - connect(undoAction, SIGNAL(hovered()), this, SLOT(showToolTipUndo())); - connect(redoAction, SIGNAL(hovered()), this, SLOT(showToolTipRedo())); - connect(saveAction, SIGNAL(hovered()), this, SLOT(showToolTipSave())); - - connect(m_simpleEditor, SIGNAL(modificationChanged(bool)), this, SLOT(registerModified(bool))); - - m_fileName = ""; - setWindowTitle(m_fileName); -}
deleted file mode 100644 --- a/gui//src/FileEditorMdiSubWindow.h +++ /dev/null @@ -1,56 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef FILEEDITORMDISUBWINDOW_H -#define FILEEDITORMDISUBWINDOW_H - -#include <QMdiSubWindow> -#include <QToolBar> -#include <QStatusBar> -#include "SimpleEditor.h" -#include "NumberedCodeEdit.h" - -class FileEditorMdiSubWindow : public QMdiSubWindow { - Q_OBJECT -public: - FileEditorMdiSubWindow(QWidget *parent = 0); - void loadFile(QString fileName); - - void installEventFilter(QObject *object); - -public slots: - void newFile(); - void saveFile(); - - void showToolTipNew(); - void showToolTipSave(); - void showToolTipUndo(); - void showToolTipRedo(); - - void registerModified(bool modified); -private: - void construct(); - QToolBar *m_toolBar; - SimpleEditor *m_simpleEditor; - NumberedCodeEdit *m_numberedTextView; - QStatusBar *m_statusBar; - QString m_fileName; - bool m_modified; -}; - -#endif // FILEEDITORMDISUBWINDOW_H
deleted file mode 100644 --- a/gui//src/FilesDockWidget.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "FilesDockWidget.h" - -#include <QApplication> -#include <QFileInfo> - -FilesDockWidget::FilesDockWidget(QWidget *parent) - : QDockWidget(parent) { - setObjectName("FilesDockWidget"); - setWindowTitle(tr("Current Folder")); - setWidget(new QWidget(this)); - - // Create a toolbar - m_navigationToolBar = new QToolBar("", widget()); - m_navigationToolBar->setAllowedAreas(Qt::TopToolBarArea); - m_navigationToolBar->setMovable(false); - m_navigationToolBar->setIconSize(QSize (20,20)); - - // Add a button to the toolbar with the QT standard icon for up-directory - // TODO: Maybe change this to be an up-directory icon that is OS specific??? - QStyle *style = QApplication::style(); - m_directoryIcon = style->standardIcon(QStyle::SP_FileDialogToParent); - m_directoryUpAction = new QAction(m_directoryIcon, "", m_navigationToolBar); - m_currentDirectory = new QLineEdit(m_navigationToolBar); - - m_navigationToolBar->addAction(m_directoryUpAction); - m_navigationToolBar->addWidget(m_currentDirectory); - connect(m_directoryUpAction, SIGNAL(triggered()), this, SLOT(onUpDirectory())); - - // TODO: Add other buttons for creating directories - - // Create the QFileSystemModel starting in the home directory - QString homePath = QDir::homePath(); - // TODO: This should occur after Octave has been initialized and the startup directory of Octave is established - - m_fileSystemModel = new QFileSystemModel(this); - m_fileSystemModel->setFilter(QDir::NoDotAndDotDot | QDir::AllEntries); - QModelIndex rootPathIndex = m_fileSystemModel->setRootPath(homePath); - - // Attach the model to the QTreeView and set the root index - m_fileTreeView = new QTreeView(widget()); - m_fileTreeView->setModel(m_fileSystemModel); - m_fileTreeView->setRootIndex(rootPathIndex); - m_fileTreeView->setSortingEnabled(true); - m_fileTreeView->setAlternatingRowColors(true); - m_fileTreeView->setAnimated(true); - setCurrentDirectory(m_fileSystemModel->fileInfo(rootPathIndex).absoluteFilePath()); - - connect(m_fileTreeView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(itemDoubleClicked(const QModelIndex &))); - - // Layout the widgets vertically with the toolbar on top - QVBoxLayout *layout = new QVBoxLayout(); - layout->setSpacing(0); - layout->addWidget(m_navigationToolBar); - layout->addWidget(m_fileTreeView); - widget()->setLayout(layout); - // TODO: Add right-click contextual menus for copying, pasting, deleting files (and others) - - connect(m_currentDirectory, SIGNAL(returnPressed()), this, SLOT(currentDirectoryEntered())); - //m_currentDirectory->setEnabled(false); -} - -void FilesDockWidget::itemDoubleClicked(const QModelIndex &index) -{ - QFileInfo fileInfo = m_fileSystemModel->fileInfo(index); - if (fileInfo.isDir()) { - m_fileSystemModel->setRootPath(fileInfo.absolutePath()); - m_fileTreeView->setRootIndex(index); - setCurrentDirectory(m_fileSystemModel->fileInfo(index).absoluteFilePath()); - } else { - QFileInfo fileInfo = m_fileSystemModel->fileInfo(index); - emit openFile(fileInfo.filePath()); - } -} - -void FilesDockWidget::setCurrentDirectory(QString currentDirectory) { - m_currentDirectory->setText(currentDirectory); -} - -void FilesDockWidget::onUpDirectory(void) { - // Move up an inm_fileTreeView->setRootIndex(m_fileSystemModel->index(dir.absolutePath()));dex node - QDir dir = QDir(m_fileSystemModel->filePath(m_fileTreeView->rootIndex())); - dir.cdUp(); - m_fileSystemModel->setRootPath(dir.absolutePath()); - m_fileTreeView->setRootIndex(m_fileSystemModel->index(dir.absolutePath())); - setCurrentDirectory(dir.absolutePath()); -} - -void FilesDockWidget::currentDirectoryEntered() { - QFileInfo fileInfo(m_currentDirectory->text()); - if (fileInfo.isDir()) { - m_fileTreeView->setRootIndex(m_fileSystemModel->index(fileInfo.absolutePath())); - m_fileSystemModel->setRootPath(fileInfo.absolutePath()); - setCurrentDirectory(fileInfo.absoluteFilePath()); - } else { - if(QFile::exists(fileInfo.absoluteFilePath())) - emit openFile(fileInfo.absoluteFilePath()); - } -}
deleted file mode 100644 --- a/gui//src/FilesDockWidget.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 John P. Swensen, Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef FILESDOCKWIDGET_H -#define FILESDOCKWIDGET_H - -#include <QListView> -#include <QDate> -#include <QObject> -#include <QWidget> -#include <QListWidget> -#include <QFileSystemModel> -#include <QToolBar> -#include <QToolButton> -#include <QVBoxLayout> -#include <QAction> -#include <QTreeView> - -#include <vector> -#include <string> - -#undef PACKAGE_BUGREPORT -#undef PACKAGE_NAME -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION -#include "octave/config.h" -#include "octave/octave.h" -#include "octave/str-vec.h" -#include "octave/cmd-hist.h" -#include <QDockWidget> -#include <QLineEdit> - -class FilesDockWidget : public QDockWidget { - Q_OBJECT -public : - FilesDockWidget(QWidget *parent = 0); -public slots: - /** Slot for handling a change in directory via double click. */ - void itemDoubleClicked(const QModelIndex &index); - - /** Slot for handling the up-directory button in the toolbar. */ - void onUpDirectory(); - - void setCurrentDirectory(QString currentDirectory); - - void currentDirectoryEntered(); - -signals: - void openFile(QString fileName); - -private: - // TODO: Add toolbar with buttons for navigating the path, creating dirs, etc - - /** Toolbar for file and directory manipulation. */ - QToolBar *m_navigationToolBar; - - /** Variables for the up-directory action. */ - QIcon m_directoryIcon; - QAction *m_directoryUpAction; - QToolButton *upDirectoryButton; - - /** The file system model. */ - QFileSystemModel *m_fileSystemModel; - - /** The file system view. */ - QTreeView *m_fileTreeView; - QLineEdit *m_currentDirectory; -}; - -#endif // FILESDOCKWIDGET_H
deleted file mode 100644 --- a/gui//src/Filter.cpp +++ /dev/null @@ -1,534 +0,0 @@ -/* - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - - This program 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 program 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. -*/ - -// Own -#include "Filter.h" - -// System -#include <iostream> - -// Qt -#include <QtGui/QAction> -#include <QtGui/QApplication> -#include <QtGui/QClipboard> -#include <QtCore/QString> -#include <QtCore/QTextStream> -#include <QtCore/QSharedData> -#include <QtCore/QFile> - -// Konsole -#include "TerminalCharacterDecoder.h" -#include "konsole_wcwidth.h" -#include "konsole_export.h" - -FilterChain::~FilterChain() -{ - QMutableListIterator<Filter*> iter(*this); - - while ( iter.hasNext() ) - { - Filter* filter = iter.next(); - iter.remove(); - delete filter; - } -} - -void FilterChain::addFilter(Filter* filter) -{ - append(filter); -} -void FilterChain::removeFilter(Filter* filter) -{ - removeAll(filter); -} -bool FilterChain::containsFilter(Filter* filter) -{ - return contains(filter); -} -void FilterChain::reset() -{ - QListIterator<Filter*> iter(*this); - while (iter.hasNext()) - iter.next()->reset(); -} -void FilterChain::setBuffer(const QString* buffer , const QList<int>* linePositions) -{ - QListIterator<Filter*> iter(*this); - while (iter.hasNext()) - iter.next()->setBuffer(buffer,linePositions); -} -void FilterChain::process() -{ - QListIterator<Filter*> iter(*this); - while (iter.hasNext()) - iter.next()->process(); -} -void FilterChain::clear() -{ - QList<Filter*>::clear(); -} -Filter::HotSpot* FilterChain::hotSpotAt(int line , int column) const -{ - QListIterator<Filter*> iter(*this); - while (iter.hasNext()) - { - Filter* filter = iter.next(); - Filter::HotSpot* spot = filter->hotSpotAt(line,column); - if ( spot != 0 ) - { - return spot; - } - } - - return 0; -} - -QList<Filter::HotSpot*> FilterChain::hotSpots() const -{ - QList<Filter::HotSpot*> list; - QListIterator<Filter*> iter(*this); - while (iter.hasNext()) - { - Filter* filter = iter.next(); - list << filter->hotSpots(); - } - return list; -} -//QList<Filter::HotSpot*> FilterChain::hotSpotsAtLine(int line) const; - -TerminalImageFilterChain::TerminalImageFilterChain() -: _buffer(0) -, _linePositions(0) -{ -} - -TerminalImageFilterChain::~TerminalImageFilterChain() -{ - delete _buffer; - delete _linePositions; -} - -void TerminalImageFilterChain::setImage(const Character* const image , int lines , int columns, const QVector<LineProperty>& lineProperties) -{ - if (empty()) - return; - - // reset all filters and hotspots - reset(); - - PlainTextDecoder decoder; - decoder.setTrailingWhitespace(false); - - // setup new shared buffers for the filters to process on - QString* newBuffer = new QString(); - QList<int>* newLinePositions = new QList<int>(); - setBuffer( newBuffer , newLinePositions ); - - // free the old buffers - delete _buffer; - delete _linePositions; - - _buffer = newBuffer; - _linePositions = newLinePositions; - - QTextStream lineStream(_buffer); - decoder.begin(&lineStream); - - for (int i=0 ; i < lines ; i++) - { - _linePositions->append(_buffer->length()); - decoder.decodeLine(image + i*columns,columns,LINE_DEFAULT); - - // pretend that each line ends with a newline character. - // this prevents a link that occurs at the end of one line - // being treated as part of a link that occurs at the start of the next line - // - // the downside is that links which are spread over more than one line are not - // highlighted. - // - // TODO - Use the "line wrapped" attribute associated with lines in a - // terminal image to avoid adding this imaginary character for wrapped - // lines - if ( !(lineProperties.value(i,LINE_DEFAULT) & LINE_WRAPPED) ) - lineStream << QChar('\n'); - } - decoder.end(); -} - -Filter::Filter() : -_linePositions(0), -_buffer(0) -{ -} - -Filter::~Filter() -{ - QListIterator<HotSpot*> iter(_hotspotList); - while (iter.hasNext()) - { - delete iter.next(); - } -} -void Filter::reset() -{ - _hotspots.clear(); - _hotspotList.clear(); -} - -void Filter::setBuffer(const QString* buffer , const QList<int>* linePositions) -{ - _buffer = buffer; - _linePositions = linePositions; -} - -void Filter::getLineColumn(int position , int& startLine , int& startColumn) -{ - Q_ASSERT( _linePositions ); - Q_ASSERT( _buffer ); - - - for (int i = 0 ; i < _linePositions->count() ; i++) - { - int nextLine = 0; - - if ( i == _linePositions->count()-1 ) - nextLine = _buffer->length() + 1; - else - nextLine = _linePositions->value(i+1); - - if ( _linePositions->value(i) <= position && position < nextLine ) - { - startLine = i; - startColumn = string_width(buffer()->mid(_linePositions->value(i),position - _linePositions->value(i))); - return; - } - } -} - - -/*void Filter::addLine(const QString& text) -{ - _linePositions << _buffer.length(); - _buffer.append(text); -}*/ - -const QString* Filter::buffer() -{ - return _buffer; -} -Filter::HotSpot::~HotSpot() -{ -} -void Filter::addHotSpot(HotSpot* spot) -{ - _hotspotList << spot; - - for (int line = spot->startLine() ; line <= spot->endLine() ; line++) - { - _hotspots.insert(line,spot); - } -} -QList<Filter::HotSpot*> Filter::hotSpots() const -{ - return _hotspotList; -} -QList<Filter::HotSpot*> Filter::hotSpotsAtLine(int line) const -{ - return _hotspots.values(line); -} - -Filter::HotSpot* Filter::hotSpotAt(int line , int column) const -{ - QListIterator<HotSpot*> spotIter(_hotspots.values(line)); - - while (spotIter.hasNext()) - { - HotSpot* spot = spotIter.next(); - - if ( spot->startLine() == line && spot->startColumn() > column ) - continue; - if ( spot->endLine() == line && spot->endColumn() < column ) - continue; - - return spot; - } - - return 0; -} - -Filter::HotSpot::HotSpot(int startLine , int startColumn , int endLine , int endColumn) - : _startLine(startLine) - , _startColumn(startColumn) - , _endLine(endLine) - , _endColumn(endColumn) - , _type(NotSpecified) -{ -} -QString Filter::HotSpot::tooltip() const -{ - return QString(); -} -QList<QAction*> Filter::HotSpot::actions() -{ - return QList<QAction*>(); -} -int Filter::HotSpot::startLine() const -{ - return _startLine; -} -int Filter::HotSpot::endLine() const -{ - return _endLine; -} -int Filter::HotSpot::startColumn() const -{ - return _startColumn; -} -int Filter::HotSpot::endColumn() const -{ - return _endColumn; -} -Filter::HotSpot::Type Filter::HotSpot::type() const -{ - return _type; -} -void Filter::HotSpot::setType(Type type) -{ - _type = type; -} - -RegExpFilter::RegExpFilter() -{ -} - -RegExpFilter::HotSpot::HotSpot(int startLine,int startColumn,int endLine,int endColumn) - : Filter::HotSpot(startLine,startColumn,endLine,endColumn) -{ - setType(Marker); -} - -void RegExpFilter::HotSpot::activate(QObject*) -{ -} - -void RegExpFilter::HotSpot::setCapturedTexts(const QStringList& texts) -{ - _capturedTexts = texts; -} -QStringList RegExpFilter::HotSpot::capturedTexts() const -{ - return _capturedTexts; -} - -void RegExpFilter::setRegExp(const QRegExp& regExp) -{ - _searchText = regExp; -} -QRegExp RegExpFilter::regExp() const -{ - return _searchText; -} -/*void RegExpFilter::reset(int) -{ - _buffer = QString(); -}*/ -void RegExpFilter::process() -{ - int pos = 0; - const QString* text = buffer(); - - Q_ASSERT( text ); - - // ignore any regular expressions which match an empty string. - // otherwise the while loop below will run indefinitely - static const QString emptyString(""); - if ( _searchText.exactMatch(emptyString) ) - return; - - while(pos >= 0) - { - pos = _searchText.indexIn(*text,pos); - - if ( pos >= 0 ) - { - int startLine = 0; - int endLine = 0; - int startColumn = 0; - int endColumn = 0; - - getLineColumn(pos,startLine,startColumn); - getLineColumn(pos + _searchText.matchedLength(),endLine,endColumn); - - RegExpFilter::HotSpot* spot = newHotSpot(startLine,startColumn, - endLine,endColumn); - spot->setCapturedTexts(_searchText.capturedTexts()); - - addHotSpot( spot ); - pos += _searchText.matchedLength(); - - // if matchedLength == 0, the program will get stuck in an infinite loop - if ( _searchText.matchedLength() == 0 ) - pos = -1; - } - } -} - -RegExpFilter::HotSpot* RegExpFilter::newHotSpot(int startLine,int startColumn, - int endLine,int endColumn) -{ - return new RegExpFilter::HotSpot(startLine,startColumn, - endLine,endColumn); -} -RegExpFilter::HotSpot* UrlFilter::newHotSpot(int startLine,int startColumn,int endLine, - int endColumn) -{ - return new UrlFilter::HotSpot(startLine,startColumn, - endLine,endColumn); -} -UrlFilter::HotSpot::HotSpot(int startLine,int startColumn,int endLine,int endColumn) -: RegExpFilter::HotSpot(startLine,startColumn,endLine,endColumn) -, _urlObject(new FilterObject(this)) -{ - setType(Link); -} -QString UrlFilter::HotSpot::tooltip() const -{ - QString url = capturedTexts().first(); - - const UrlType kind = urlType(); - - if ( kind == StandardUrl ) - return QString(); - else if ( kind == Email ) - return QString(); - else - return QString(); -} -UrlFilter::HotSpot::UrlType UrlFilter::HotSpot::urlType() const -{ - QString url = capturedTexts().first(); - - if ( FullUrlRegExp.exactMatch(url) ) - return StandardUrl; - else if ( EmailAddressRegExp.exactMatch(url) ) - return Email; - else - return Unknown; -} - -void UrlFilter::HotSpot::activate(QObject* object) -{ - QString url = capturedTexts().first(); - - const UrlType kind = urlType(); - - const QString& actionName = object ? object->objectName() : QString(); - - if ( actionName == "copy-action" ) - { - QApplication::clipboard()->setText(url); - return; - } - - if ( !object || actionName == "open-action" ) - { - if ( kind == StandardUrl ) - { - // if the URL path does not include the protocol ( eg. "www.kde.org" ) then - // prepend http:// ( eg. "www.kde.org" --> "http://www.kde.org" ) - if (!url.contains("://")) - { - url.prepend("http://"); - } - } - else if ( kind == Email ) - { - url.prepend("mailto:"); - } - - //new KRun(url,QApplication::activeWindow()); - } -} - -// Note: Altering these regular expressions can have a major effect on the performance of the filters -// used for finding URLs in the text, especially if they are very general and could match very long -// pieces of text. -// Please be careful when altering them. - -//regexp matches: -// full url: -// protocolname:// or www. followed by anything other than whitespaces, <, >, ' or ", and ends before whitespaces, <, >, ', ", ], !, comma and dot -const QRegExp UrlFilter::FullUrlRegExp("(www\\.(?!\\.)|[a-z][a-z0-9+.-]*://)[^\\s<>'\"]+[^!,\\.\\s<>'\"\\]]"); -// email address: -// [word chars, dots or dashes]@[word chars, dots or dashes].[word chars] -const QRegExp UrlFilter::EmailAddressRegExp("\\b(\\w|\\.|-)+@(\\w|\\.|-)+\\.\\w+\\b"); - -// matches full url or email address -const QRegExp UrlFilter::CompleteUrlRegExp('('+FullUrlRegExp.pattern()+'|'+ - EmailAddressRegExp.pattern()+')'); - -UrlFilter::UrlFilter() -{ - setRegExp( CompleteUrlRegExp ); -} -UrlFilter::HotSpot::~HotSpot() -{ - delete _urlObject; -} -void FilterObject::activated() -{ - _filter->activate(sender()); -} -QList<QAction*> UrlFilter::HotSpot::actions() -{ - QList<QAction*> list; - - const UrlType kind = urlType(); - - QAction* openAction = new QAction(_urlObject); - QAction* copyAction = new QAction(_urlObject);; - - Q_ASSERT( kind == StandardUrl || kind == Email ); - - if ( kind == StandardUrl ) - { - openAction->setText(i18n("Open Link")); - copyAction->setText(i18n("Copy Link Address")); - } - else if ( kind == Email ) - { - openAction->setText(i18n("Send Email To...")); - copyAction->setText(i18n("Copy Email Address")); - } - - // object names are set here so that the hotspot performs the - // correct action when activated() is called with the triggered - // action passed as a parameter. - openAction->setObjectName( QLatin1String("open-action" )); - copyAction->setObjectName( QLatin1String("copy-action" )); - - QObject::connect( openAction , SIGNAL(triggered()) , _urlObject , SLOT(activated()) ); - QObject::connect( copyAction , SIGNAL(triggered()) , _urlObject , SLOT(activated()) ); - - list << openAction; - list << copyAction; - - return list; -} -
deleted file mode 100644 --- a/gui//src/Filter.h +++ /dev/null @@ -1,379 +0,0 @@ -/* - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - - This program 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 program 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 FILTER_H -#define FILTER_H - -// Qt -#include <QtGui/QAction> -#include <QtCore/QList> -#include <QtCore/QObject> -#include <QtCore/QStringList> -#include <QtCore/QHash> -#include <QtCore/QRegExp> - -// Local -#include "Character.h" - - -/** - * A filter processes blocks of text looking for certain patterns (such as URLs or keywords from a list) - * and marks the areas which match the filter's patterns as 'hotspots'. - * - * Each hotspot has a type identifier associated with it ( such as a link or a highlighted section ), - * and an action. When the user performs some activity such as a mouse-click in a hotspot area ( the exact - * action will depend on what is displaying the block of text which the filter is processing ), the hotspot's - * activate() method should be called. Depending on the type of hotspot this will trigger a suitable response. - * - * For example, if a hotspot represents a URL then a suitable action would be opening that URL in a web browser. - * Hotspots may have more than one action, in which case the list of actions can be obtained using the - * actions() method. - * - * Different subclasses of filter will return different types of hotspot. - * Subclasses must reimplement the process() method to examine a block of text and identify sections of interest. - * When processing the text they should create instances of Filter::HotSpot subclasses for sections of interest - * and add them to the filter's list of hotspots using addHotSpot() - */ -class Filter -{ -public: - /** - * Represents an area of text which matched the pattern a particular filter has been looking for. - * - * Each hotspot has a type identifier associated with it ( such as a link or a highlighted section ), - * and an action. When the user performs some activity such as a mouse-click in a hotspot area ( the exact - * action will depend on what is displaying the block of text which the filter is processing ), the hotspot's - * activate() method should be called. Depending on the type of hotspot this will trigger a suitable response. - * - * For example, if a hotspot represents a URL then a suitable action would be opening that URL in a web browser. - * Hotspots may have more than one action, in which case the list of actions can be obtained using the - * actions() method. These actions may then be displayed in a popup menu or toolbar for example. - */ - class HotSpot - { - public: - /** - * Constructs a new hotspot which covers the area from (@p startLine,@p startColumn) to (@p endLine,@p endColumn) - * in a block of text. - */ - HotSpot(int startLine , int startColumn , int endLine , int endColumn); - virtual ~HotSpot(); - - enum Type - { - // the type of the hotspot is not specified - NotSpecified, - // this hotspot represents a clickable link - Link, - // this hotspot represents a marker - Marker - }; - - /** Returns the line when the hotspot area starts */ - int startLine() const; - /** Returns the line where the hotspot area ends */ - int endLine() const; - /** Returns the column on startLine() where the hotspot area starts */ - int startColumn() const; - /** Returns the column on endLine() where the hotspot area ends */ - int endColumn() const; - /** - * Returns the type of the hotspot. This is usually used as a hint for views on how to represent - * the hotspot graphically. eg. Link hotspots are typically underlined when the user mouses over them - */ - Type type() const; - /** - * Causes the an action associated with a hotspot to be triggered. - * - * @param object The object which caused the hotspot to be triggered. This is - * typically null ( in which case the default action should be performed ) or - * one of the objects from the actions() list. In which case the associated - * action should be performed. - */ - virtual void activate(QObject* object = 0) = 0; - /** - * Returns a list of actions associated with the hotspot which can be used in a - * menu or toolbar - */ - virtual QList<QAction*> actions(); - - /** - * Returns the text of a tooltip to be shown when the mouse moves over the hotspot, or - * an empty string if there is no tooltip associated with this hotspot. - * - * The default implementation returns an empty string. - */ - virtual QString tooltip() const; - - protected: - /** Sets the type of a hotspot. This should only be set once */ - void setType(Type type); - - private: - int _startLine; - int _startColumn; - int _endLine; - int _endColumn; - Type _type; - - }; - - /** Constructs a new filter. */ - Filter(); - virtual ~Filter(); - - /** Causes the filter to process the block of text currently in its internal buffer */ - virtual void process() = 0; - - /** - * Empties the filters internal buffer and resets the line count back to 0. - * All hotspots are deleted. - */ - void reset(); - - /** Adds a new line of text to the filter and increments the line count */ - //void addLine(const QString& string); - - /** Returns the hotspot which covers the given @p line and @p column, or 0 if no hotspot covers that area */ - HotSpot* hotSpotAt(int line , int column) const; - - /** Returns the list of hotspots identified by the filter */ - QList<HotSpot*> hotSpots() const; - - /** Returns the list of hotspots identified by the filter which occur on a given line */ - QList<HotSpot*> hotSpotsAtLine(int line) const; - - /** - * TODO: Document me - */ - void setBuffer(const QString* buffer , const QList<int>* linePositions); - -protected: - /** Adds a new hotspot to the list */ - void addHotSpot(HotSpot*); - /** Returns the internal buffer */ - const QString* buffer(); - /** Converts a character position within buffer() to a line and column */ - void getLineColumn(int position , int& startLine , int& startColumn); - -private: - QMultiHash<int,HotSpot*> _hotspots; - QList<HotSpot*> _hotspotList; - - const QList<int>* _linePositions; - const QString* _buffer; -}; - -/** - * A filter which searches for sections of text matching a regular expression and creates a new RegExpFilter::HotSpot - * instance for them. - * - * Subclasses can reimplement newHotSpot() to return custom hotspot types when matches for the regular expression - * are found. - */ -class RegExpFilter : public Filter -{ -public: - /** - * Type of hotspot created by RegExpFilter. The capturedTexts() method can be used to find the text - * matched by the filter's regular expression. - */ - class HotSpot : public Filter::HotSpot - { - public: - HotSpot(int startLine, int startColumn, int endLine , int endColumn); - virtual void activate(QObject* object = 0); - - /** Sets the captured texts associated with this hotspot */ - void setCapturedTexts(const QStringList& texts); - /** Returns the texts found by the filter when matching the filter's regular expression */ - QStringList capturedTexts() const; - private: - QStringList _capturedTexts; - }; - - /** Constructs a new regular expression filter */ - RegExpFilter(); - - /** - * Sets the regular expression which the filter searches for in blocks of text. - * - * Regular expressions which match the empty string are treated as not matching - * anything. - */ - void setRegExp(const QRegExp& text); - /** Returns the regular expression which the filter searches for in blocks of text */ - QRegExp regExp() const; - - /** - * Reimplemented to search the filter's text buffer for text matching regExp() - * - * If regexp matches the empty string, then process() will return immediately - * without finding results. - */ - virtual void process(); - -protected: - /** - * Called when a match for the regular expression is encountered. Subclasses should reimplement this - * to return custom hotspot types - */ - virtual RegExpFilter::HotSpot* newHotSpot(int startLine,int startColumn, - int endLine,int endColumn); - -private: - QRegExp _searchText; -}; - -class FilterObject; - -/** A filter which matches URLs in blocks of text */ -class UrlFilter : public RegExpFilter -{ -public: - /** - * Hotspot type created by UrlFilter instances. The activate() method opens a web browser - * at the given URL when called. - */ - class HotSpot : public RegExpFilter::HotSpot - { - public: - HotSpot(int startLine,int startColumn,int endLine,int endColumn); - virtual ~HotSpot(); - - virtual QList<QAction*> actions(); - - /** - * Open a web browser at the current URL. The url itself can be determined using - * the capturedTexts() method. - */ - virtual void activate(QObject* object = 0); - - virtual QString tooltip() const; - private: - enum UrlType - { - StandardUrl, - Email, - Unknown - }; - UrlType urlType() const; - - FilterObject* _urlObject; - }; - - UrlFilter(); - -protected: - virtual RegExpFilter::HotSpot* newHotSpot(int,int,int,int); - -private: - - static const QRegExp FullUrlRegExp; - static const QRegExp EmailAddressRegExp; - - // combined OR of FullUrlRegExp and EmailAddressRegExp - static const QRegExp CompleteUrlRegExp; -}; - -class FilterObject : public QObject -{ -Q_OBJECT -public: - FilterObject(Filter::HotSpot* filter) : _filter(filter) {} -private slots: - void activated(); -private: - Filter::HotSpot* _filter; -}; - -/** - * A chain which allows a group of filters to be processed as one. - * The chain owns the filters added to it and deletes them when the chain itself is destroyed. - * - * Use addFilter() to add a new filter to the chain. - * When new text to be filtered arrives, use addLine() to add each additional - * line of text which needs to be processed and then after adding the last line, use - * process() to cause each filter in the chain to process the text. - * - * After processing a block of text, the reset() method can be used to set the filter chain's - * internal cursor back to the first line. - * - * The hotSpotAt() method will return the first hotspot which covers a given position. - * - * The hotSpots() and hotSpotsAtLine() method return all of the hotspots in the text and on - * a given line respectively. - */ -class FilterChain : protected QList<Filter*> -{ -public: - virtual ~FilterChain(); - - /** Adds a new filter to the chain. The chain will delete this filter when it is destroyed */ - void addFilter(Filter* filter); - /** Removes a filter from the chain. The chain will no longer delete the filter when destroyed */ - void removeFilter(Filter* filter); - /** Returns true if the chain contains @p filter */ - bool containsFilter(Filter* filter); - /** Removes all filters from the chain */ - void clear(); - - /** Resets each filter in the chain */ - void reset(); - /** - * Processes each filter in the chain - */ - void process(); - - /** Sets the buffer for each filter in the chain to process. */ - void setBuffer(const QString* buffer , const QList<int>* linePositions); - - /** Returns the first hotspot which occurs at @p line, @p column or 0 if no hotspot was found */ - Filter::HotSpot* hotSpotAt(int line , int column) const; - /** Returns a list of all the hotspots in all the chain's filters */ - QList<Filter::HotSpot*> hotSpots() const; - /** Returns a list of all hotspots at the given line in all the chain's filters */ - QList<Filter::HotSpot> hotSpotsAtLine(int line) const; - -}; - -/** A filter chain which processes character images from terminal displays */ -class TerminalImageFilterChain : public FilterChain -{ -public: - TerminalImageFilterChain(); - virtual ~TerminalImageFilterChain(); - - /** - * Set the current terminal image to @p image. - * - * @param image The terminal image - * @param lines The number of lines in the terminal image - * @param columns The number of columns in the terminal image - * @param lineProperties The line properties to set for image - */ - void setImage(const Character* const image , int lines , int columns, - const QVector<LineProperty>& lineProperties); - -private: - QString* _buffer; - QList<int>* _linePositions; -}; - -#endif //FILTER_H
deleted file mode 100644 --- a/gui//src/History.cpp +++ /dev/null @@ -1,696 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - Copyright (C) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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. -*/ - -// Own -#include "History.h" - -// System -#include <iostream> -#include <stdlib.h> -#include <assert.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/mman.h> -#include <unistd.h> -#include <errno.h> - - -// Reasonable line size -#define LINE_SIZE 1024 - -/* - An arbitrary long scroll. - - One can modify the scroll only by adding either cells - or newlines, but access it randomly. - - The model is that of an arbitrary wide typewriter scroll - in that the scroll is a serie of lines and each line is - a serie of cells with no overwriting permitted. - - The implementation provides arbitrary length and numbers - of cells and line/column indexed read access to the scroll - at constant costs. - -KDE4: Can we use QTemporaryFile here, instead of KTempFile? - -FIXME: some complain about the history buffer comsuming the - memory of their machines. This problem is critical - since the history does not behave gracefully in cases - where the memory is used up completely. - - I put in a workaround that should handle it problem - now gracefully. I'm not satisfied with the solution. - -FIXME: Terminating the history is not properly indicated - in the menu. We should throw a signal. - -FIXME: There is noticeable decrease in speed, also. Perhaps, - there whole feature needs to be revisited therefore. - Disadvantage of a more elaborated, say block-oriented - scheme with wrap around would be it's complexity. -*/ - -//FIXME: tempory replacement for tmpfile -// this is here one for debugging purpose. - -//#define tmpfile xTmpFile - -// History File /////////////////////////////////////////// - -/* - A Row(X) data type which allows adding elements to the end. -*/ - -HistoryFile::HistoryFile() - : ion(-1), - length(0), - fileMap(0) -{ - if (tmpFile.open()) - { - tmpFile.setAutoRemove(true); - ion = tmpFile.handle(); - } -} - -HistoryFile::~HistoryFile() -{ - if (fileMap) - unmap(); -} - -//TODO: Mapping the entire file in will cause problems if the history file becomes exceedingly large, -//(ie. larger than available memory). HistoryFile::map() should only map in sections of the file at a time, -//to avoid this. -void HistoryFile::map() -{ - assert( fileMap == 0 ); - - fileMap = (char*)mmap( 0 , length , PROT_READ , MAP_PRIVATE , ion , 0 ); - - //if mmap'ing fails, fall back to the read-lseek combination - if ( fileMap == MAP_FAILED ) - { - readWriteBalance = 0; - fileMap = 0; - qDebug() << ": mmap'ing history failed. errno = " << errno; - } -} - -void HistoryFile::unmap() -{ - int result = munmap( fileMap , length ); - assert( result == 0 ); - - fileMap = 0; -} - -bool HistoryFile::isMapped() -{ - return (fileMap != 0); -} - -void HistoryFile::add(const unsigned char* bytes, int len) -{ - if ( fileMap ) - unmap(); - - readWriteBalance++; - - int rc = 0; - - rc = lseek(ion,length,SEEK_SET); if (rc < 0) { perror("HistoryFile::add.seek"); return; } - rc = write(ion,bytes,len); if (rc < 0) { perror("HistoryFile::add.write"); return; } - length += rc; -} - -void HistoryFile::get(unsigned char* bytes, int len, int loc) -{ - //count number of get() calls vs. number of add() calls. - //If there are many more get() calls compared with add() - //calls (decided by using MAP_THRESHOLD) then mmap the log - //file to improve performance. - readWriteBalance--; - if ( !fileMap && readWriteBalance < MAP_THRESHOLD ) - map(); - - if ( fileMap ) - { - for (int i=0;i<len;i++) - bytes[i]=fileMap[loc+i]; - } - else - { - int rc = 0; - - if (loc < 0 || len < 0 || loc + len > length) - fprintf(stderr,"getHist(...,%d,%d): invalid args.\n",len,loc); - rc = lseek(ion,loc,SEEK_SET); if (rc < 0) { perror("HistoryFile::get.seek"); return; } - rc = read(ion,bytes,len); if (rc < 0) { perror("HistoryFile::get.read"); return; } - } -} - -int HistoryFile::len() -{ - return length; -} - - -// History Scroll abstract base class ////////////////////////////////////// - - -HistoryScroll::HistoryScroll(HistoryType* t) - : m_histType(t) -{ -} - -HistoryScroll::~HistoryScroll() -{ - delete m_histType; -} - -bool HistoryScroll::hasScroll() -{ - return true; -} - -// History Scroll File ////////////////////////////////////// - -/* - The history scroll makes a Row(Row(Cell)) from - two history buffers. The index buffer contains - start of line positions which refere to the cells - buffer. - - Note that index[0] addresses the second line - (line #1), while the first line (line #0) starts - at 0 in cells. -*/ - -HistoryScrollFile::HistoryScrollFile(const QString &logFileName) - : HistoryScroll(new HistoryTypeFile(logFileName)), - m_logFileName(logFileName) -{ -} - -HistoryScrollFile::~HistoryScrollFile() -{ -} - -int HistoryScrollFile::getLines() -{ - return index.len() / sizeof(int); -} - -int HistoryScrollFile::getLineLen(int lineno) -{ - return (startOfLine(lineno+1) - startOfLine(lineno)) / sizeof(Character); -} - -bool HistoryScrollFile::isWrappedLine(int lineno) -{ - if (lineno>=0 && lineno <= getLines()) { - unsigned char flag; - lineflags.get((unsigned char*)&flag,sizeof(unsigned char),(lineno)*sizeof(unsigned char)); - return flag; - } - return false; -} - -int HistoryScrollFile::startOfLine(int lineno) -{ - if (lineno <= 0) return 0; - if (lineno <= getLines()) - { - - if (!index.isMapped()) - index.map(); - - int res; - index.get((unsigned char*)&res,sizeof(int),(lineno-1)*sizeof(int)); - return res; - } - return cells.len(); -} - -void HistoryScrollFile::getCells(int lineno, int colno, int count, Character res[]) -{ - cells.get((unsigned char*)res,count*sizeof(Character),startOfLine(lineno)+colno*sizeof(Character)); -} - -void HistoryScrollFile::addCells(const Character text[], int count) -{ - cells.add((unsigned char*)text,count*sizeof(Character)); -} - -void HistoryScrollFile::addLine(bool previousWrapped) -{ - if (index.isMapped()) - index.unmap(); - - int locn = cells.len(); - index.add((unsigned char*)&locn,sizeof(int)); - unsigned char flags = previousWrapped ? 0x01 : 0x00; - lineflags.add((unsigned char*)&flags,sizeof(unsigned char)); -} - - -// History Scroll Buffer ////////////////////////////////////// -HistoryScrollBuffer::HistoryScrollBuffer(unsigned int maxLineCount) - : HistoryScroll(new HistoryTypeBuffer(maxLineCount)) - ,_historyBuffer() - ,_maxLineCount(0) - ,_usedLines(0) - ,_head(0) -{ - setMaxNbLines(maxLineCount); -} - -HistoryScrollBuffer::~HistoryScrollBuffer() -{ - delete[] _historyBuffer; -} - -void HistoryScrollBuffer::addCellsVector(const QVector<Character>& cells) -{ - _head++; - if ( _usedLines < _maxLineCount ) - _usedLines++; - - if ( _head >= _maxLineCount ) - { - _head = 0; - } - - _historyBuffer[bufferIndex(_usedLines-1)] = cells; - _wrappedLine[bufferIndex(_usedLines-1)] = false; -} -void HistoryScrollBuffer::addCells(const Character a[], int count) -{ - HistoryLine newLine(count); - qCopy(a,a+count,newLine.begin()); - - addCellsVector(newLine); -} - -void HistoryScrollBuffer::addLine(bool previousWrapped) -{ - _wrappedLine[bufferIndex(_usedLines-1)] = previousWrapped; -} - -int HistoryScrollBuffer::getLines() -{ - return _usedLines; -} - -int HistoryScrollBuffer::getLineLen(int lineNumber) -{ - Q_ASSERT( lineNumber >= 0 && lineNumber < _maxLineCount ); - - if ( lineNumber < _usedLines ) - { - return _historyBuffer[bufferIndex(lineNumber)].size(); - } - else - { - return 0; - } -} - -bool HistoryScrollBuffer::isWrappedLine(int lineNumber) -{ - Q_ASSERT( lineNumber >= 0 && lineNumber < _maxLineCount ); - - if (lineNumber < _usedLines) - { - //kDebug() << "Line" << lineNumber << "wrapped is" << _wrappedLine[bufferIndex(lineNumber)]; - return _wrappedLine[bufferIndex(lineNumber)]; - } - else - return false; -} - -void HistoryScrollBuffer::getCells(int lineNumber, int startColumn, int count, Character* buffer) -{ - if ( count == 0 ) return; - - Q_ASSERT( lineNumber < _maxLineCount ); - - if (lineNumber >= _usedLines) - { - memset(buffer, 0, count * sizeof(Character)); - return; - } - - const HistoryLine& line = _historyBuffer[bufferIndex(lineNumber)]; - - //kDebug() << "startCol " << startColumn; - //kDebug() << "line.size() " << line.size(); - //kDebug() << "count " << count; - - Q_ASSERT( startColumn <= line.size() - count ); - - memcpy(buffer, line.constData() + startColumn , count * sizeof(Character)); -} - -void HistoryScrollBuffer::setMaxNbLines(unsigned int lineCount) -{ - HistoryLine* oldBuffer = _historyBuffer; - HistoryLine* newBuffer = new HistoryLine[lineCount]; - - for ( int i = 0 ; i < qMin(_usedLines,(int)lineCount) ; i++ ) - { - newBuffer[i] = oldBuffer[bufferIndex(i)]; - } - - _usedLines = qMin(_usedLines,(int)lineCount); - _maxLineCount = lineCount; - _head = ( _usedLines == _maxLineCount ) ? 0 : _usedLines-1; - - _historyBuffer = newBuffer; - delete[] oldBuffer; - - _wrappedLine.resize(lineCount); -} - -int HistoryScrollBuffer::bufferIndex(int lineNumber) -{ - Q_ASSERT( lineNumber >= 0 ); - Q_ASSERT( lineNumber < _maxLineCount ); - Q_ASSERT( (_usedLines == _maxLineCount) || lineNumber <= _head ); - - if ( _usedLines == _maxLineCount ) - { - return (_head+lineNumber+1) % _maxLineCount; - } - else - { - return lineNumber; - } -} - - -// History Scroll None ////////////////////////////////////// - -HistoryScrollNone::HistoryScrollNone() - : HistoryScroll(new HistoryTypeNone()) -{ -} - -HistoryScrollNone::~HistoryScrollNone() -{ -} - -bool HistoryScrollNone::hasScroll() -{ - return false; -} - -int HistoryScrollNone::getLines() -{ - return 0; -} - -int HistoryScrollNone::getLineLen(int) -{ - return 0; -} - -bool HistoryScrollNone::isWrappedLine(int /*lineno*/) -{ - return false; -} - -void HistoryScrollNone::getCells(int, int, int, Character []) -{ -} - -void HistoryScrollNone::addCells(const Character [], int) -{ -} - -void HistoryScrollNone::addLine(bool) -{ -} - -// History Scroll BlockArray ////////////////////////////////////// - -HistoryScrollBlockArray::HistoryScrollBlockArray(size_t size) - : HistoryScroll(new HistoryTypeBlockArray(size)) -{ - m_blockArray.setHistorySize(size); // nb. of lines. -} - -HistoryScrollBlockArray::~HistoryScrollBlockArray() -{ -} - -int HistoryScrollBlockArray::getLines() -{ - return m_lineLengths.count(); -} - -int HistoryScrollBlockArray::getLineLen(int lineno) -{ - if ( m_lineLengths.contains(lineno) ) - return m_lineLengths[lineno]; - else - return 0; -} - -bool HistoryScrollBlockArray::isWrappedLine(int /*lineno*/) -{ - return false; -} - -void HistoryScrollBlockArray::getCells(int lineno, int colno, - int count, Character res[]) -{ - if (!count) return; - - const Block *b = m_blockArray.at(lineno); - - if (!b) { - memset(res, 0, count * sizeof(Character)); // still better than random data - return; - } - - assert(((colno + count) * sizeof(Character)) < ENTRIES); - memcpy(res, b->data + (colno * sizeof(Character)), count * sizeof(Character)); -} - -void HistoryScrollBlockArray::addCells(const Character a[], int count) -{ - Block *b = m_blockArray.lastBlock(); - - if (!b) return; - - // put cells in block's data - assert((count * sizeof(Character)) < ENTRIES); - - memset(b->data, 0, ENTRIES); - - memcpy(b->data, a, count * sizeof(Character)); - b->size = count * sizeof(Character); - - size_t res = m_blockArray.newBlock(); - assert (res > 0); - Q_UNUSED( res ); - - m_lineLengths.insert(m_blockArray.getCurrent(), count); -} - -void HistoryScrollBlockArray::addLine(bool) -{ -} - -////////////////////////////////////////////////////////////////////// -// History Types -////////////////////////////////////////////////////////////////////// - -HistoryType::HistoryType() -{ -} - -HistoryType::~HistoryType() -{ -} - -////////////////////////////// - -HistoryTypeNone::HistoryTypeNone() -{ -} - -bool HistoryTypeNone::isEnabled() const -{ - return false; -} - -HistoryScroll* HistoryTypeNone::scroll(HistoryScroll *old) const -{ - delete old; - return new HistoryScrollNone(); -} - -int HistoryTypeNone::maximumLineCount() const -{ - return 0; -} - -////////////////////////////// - -HistoryTypeBlockArray::HistoryTypeBlockArray(size_t size) - : m_size(size) -{ -} - -bool HistoryTypeBlockArray::isEnabled() const -{ - return true; -} - -int HistoryTypeBlockArray::maximumLineCount() const -{ - return m_size; -} - -HistoryScroll* HistoryTypeBlockArray::scroll(HistoryScroll *old) const -{ - delete old; - return new HistoryScrollBlockArray(m_size); -} - - -////////////////////////////// - -HistoryTypeBuffer::HistoryTypeBuffer(unsigned int nbLines) - : m_nbLines(nbLines) -{ -} - -bool HistoryTypeBuffer::isEnabled() const -{ - return true; -} - -int HistoryTypeBuffer::maximumLineCount() const -{ - return m_nbLines; -} - -HistoryScroll* HistoryTypeBuffer::scroll(HistoryScroll *old) const -{ - if (old) - { - HistoryScrollBuffer *oldBuffer = dynamic_cast<HistoryScrollBuffer*>(old); - if (oldBuffer) - { - oldBuffer->setMaxNbLines(m_nbLines); - return oldBuffer; - } - - HistoryScroll *newScroll = new HistoryScrollBuffer(m_nbLines); - int lines = old->getLines(); - int startLine = 0; - if (lines > (int) m_nbLines) - startLine = lines - m_nbLines; - - Character line[LINE_SIZE]; - for(int i = startLine; i < lines; i++) - { - int size = old->getLineLen(i); - if (size > LINE_SIZE) - { - Character *tmp_line = new Character[size]; - old->getCells(i, 0, size, tmp_line); - newScroll->addCells(tmp_line, size); - newScroll->addLine(old->isWrappedLine(i)); - delete [] tmp_line; - } - else - { - old->getCells(i, 0, size, line); - newScroll->addCells(line, size); - newScroll->addLine(old->isWrappedLine(i)); - } - } - delete old; - return newScroll; - } - return new HistoryScrollBuffer(m_nbLines); -} - -////////////////////////////// - -HistoryTypeFile::HistoryTypeFile(const QString& fileName) - : m_fileName(fileName) -{ -} - -bool HistoryTypeFile::isEnabled() const -{ - return true; -} - -const QString& HistoryTypeFile::getFileName() const -{ - return m_fileName; -} - -HistoryScroll* HistoryTypeFile::scroll(HistoryScroll *old) const -{ - if (dynamic_cast<HistoryFile *>(old)) - return old; // Unchanged. - - HistoryScroll *newScroll = new HistoryScrollFile(m_fileName); - - Character line[LINE_SIZE]; - int lines = (old != 0) ? old->getLines() : 0; - for(int i = 0; i < lines; i++) - { - int size = old->getLineLen(i); - if (size > LINE_SIZE) - { - Character *tmp_line = new Character[size]; - old->getCells(i, 0, size, tmp_line); - newScroll->addCells(tmp_line, size); - newScroll->addLine(old->isWrappedLine(i)); - delete [] tmp_line; - } - else - { - old->getCells(i, 0, size, line); - newScroll->addCells(line, size); - newScroll->addLine(old->isWrappedLine(i)); - } - } - - delete old; - return newScroll; -} - -int HistoryTypeFile::maximumLineCount() const -{ - return 0; -}
deleted file mode 100644 --- a/gui//src/History.h +++ /dev/null @@ -1,307 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - Copyright (C) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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 HISTORY_H -#define HISTORY_H - -// Qt -#include <QtCore/QBitRef> -#include <QtCore/QHash> -#include <QtCore> - -// Konsole -#include "BlockArray.h" -#include "Character.h" - -class HistoryFile -{ -public: - HistoryFile(); - virtual ~HistoryFile(); - - virtual void add(const unsigned char* bytes, int len); - virtual void get(unsigned char* bytes, int len, int loc); - virtual int len(); - - //mmaps the file in read-only mode - void map(); - //un-mmaps the file - void unmap(); - //returns true if the file is mmap'ed - bool isMapped(); - - -private: - int ion; - int length; - QTemporaryFile tmpFile; - - //pointer to start of mmap'ed file data, or 0 if the file is not mmap'ed - char* fileMap; - - //incremented whenver 'add' is called and decremented whenever - //'get' is called. - //this is used to detect when a large number of lines are being read and processed from the history - //and automatically mmap the file for better performance (saves the overhead of many lseek-read calls). - int readWriteBalance; - - //when readWriteBalance goes below this threshold, the file will be mmap'ed automatically - static const int MAP_THRESHOLD = -1000; -}; - -////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////// -// Abstract base class for file and buffer versions -////////////////////////////////////////////////////////////////////// -class HistoryType; - -class HistoryScroll -{ -public: - HistoryScroll(HistoryType*); - virtual ~HistoryScroll(); - - virtual bool hasScroll(); - - // access to history - virtual int getLines() = 0; - virtual int getLineLen(int lineno) = 0; - virtual void getCells(int lineno, int colno, int count, Character res[]) = 0; - virtual bool isWrappedLine(int lineno) = 0; - - // backward compatibility (obsolete) - Character getCell(int lineno, int colno) { Character res; getCells(lineno,colno,1,&res); return res; } - - // adding lines. - virtual void addCells(const Character a[], int count) = 0; - // convenience method - this is virtual so that subclasses can take advantage - // of QVector's implicit copying - virtual void addCellsVector(const QVector<Character>& cells) - { - addCells(cells.data(),cells.size()); - } - - virtual void addLine(bool previousWrapped=false) = 0; - - // - // FIXME: Passing around constant references to HistoryType instances - // is very unsafe, because those references will no longer - // be valid if the history scroll is deleted. - // - const HistoryType& getType() { return *m_histType; } - -protected: - HistoryType* m_histType; - -}; - - - -////////////////////////////////////////////////////////////////////// -// File-based history (e.g. file log, no limitation in length) -////////////////////////////////////////////////////////////////////// - -class HistoryScrollFile : public HistoryScroll -{ -public: - HistoryScrollFile(const QString &logFileName); - virtual ~HistoryScrollFile(); - - virtual int getLines(); - virtual int getLineLen(int lineno); - virtual void getCells(int lineno, int colno, int count, Character res[]); - virtual bool isWrappedLine(int lineno); - - virtual void addCells(const Character a[], int count); - virtual void addLine(bool previousWrapped=false); - -private: - int startOfLine(int lineno); - - QString m_logFileName; - HistoryFile index; // lines Row(int) - HistoryFile cells; // text Row(Character) - HistoryFile lineflags; // flags Row(unsigned char) -}; - - -////////////////////////////////////////////////////////////////////// -// Buffer-based history (limited to a fixed nb of lines) -////////////////////////////////////////////////////////////////////// -class HistoryScrollBuffer : public HistoryScroll -{ -public: - typedef QVector<Character> HistoryLine; - - HistoryScrollBuffer(unsigned int maxNbLines = 1000); - virtual ~HistoryScrollBuffer(); - - virtual int getLines(); - virtual int getLineLen(int lineno); - virtual void getCells(int lineno, int colno, int count, Character res[]); - virtual bool isWrappedLine(int lineno); - - virtual void addCells(const Character a[], int count); - virtual void addCellsVector(const QVector<Character>& cells); - virtual void addLine(bool previousWrapped=false); - - void setMaxNbLines(unsigned int nbLines); - unsigned int maxNbLines() { return _maxLineCount; } - - -private: - int bufferIndex(int lineNumber); - - HistoryLine* _historyBuffer; - QBitArray _wrappedLine; - int _maxLineCount; - int _usedLines; - int _head; -}; - -////////////////////////////////////////////////////////////////////// -// Nothing-based history (no history :-) -////////////////////////////////////////////////////////////////////// -class HistoryScrollNone : public HistoryScroll -{ -public: - HistoryScrollNone(); - virtual ~HistoryScrollNone(); - - virtual bool hasScroll(); - - virtual int getLines(); - virtual int getLineLen(int lineno); - virtual void getCells(int lineno, int colno, int count, Character res[]); - virtual bool isWrappedLine(int lineno); - - virtual void addCells(const Character a[], int count); - virtual void addLine(bool previousWrapped=false); -}; - -////////////////////////////////////////////////////////////////////// -// BlockArray-based history -////////////////////////////////////////////////////////////////////// -class HistoryScrollBlockArray : public HistoryScroll -{ -public: - HistoryScrollBlockArray(size_t size); - virtual ~HistoryScrollBlockArray(); - - virtual int getLines(); - virtual int getLineLen(int lineno); - virtual void getCells(int lineno, int colno, int count, Character res[]); - virtual bool isWrappedLine(int lineno); - - virtual void addCells(const Character a[], int count); - virtual void addLine(bool previousWrapped=false); - -protected: - BlockArray m_blockArray; - QHash<int,size_t> m_lineLengths; -}; - -////////////////////////////////////////////////////////////////////// -// History type -////////////////////////////////////////////////////////////////////// - -class HistoryType -{ -public: - HistoryType(); - virtual ~HistoryType(); - - /** - * Returns true if the history is enabled ( can store lines of output ) - * or false otherwise. - */ - virtual bool isEnabled() const = 0; - /** - * Returns true if the history size is unlimited. - */ - bool isUnlimited() const { return maximumLineCount() == 0; } - /** - * Returns the maximum number of lines which this history type - * can store or 0 if the history can store an unlimited number of lines. - */ - virtual int maximumLineCount() const = 0; - - virtual HistoryScroll* scroll(HistoryScroll *) const = 0; -}; - -class HistoryTypeNone : public HistoryType -{ -public: - HistoryTypeNone(); - - virtual bool isEnabled() const; - virtual int maximumLineCount() const; - - virtual HistoryScroll* scroll(HistoryScroll *) const; -}; - -class HistoryTypeBlockArray : public HistoryType -{ -public: - HistoryTypeBlockArray(size_t size); - - virtual bool isEnabled() const; - virtual int maximumLineCount() const; - - virtual HistoryScroll* scroll(HistoryScroll *) const; - -protected: - size_t m_size; -}; - -class HistoryTypeFile : public HistoryType -{ -public: - HistoryTypeFile(const QString& fileName=QString()); - - virtual bool isEnabled() const; - virtual const QString& getFileName() const; - virtual int maximumLineCount() const; - - virtual HistoryScroll* scroll(HistoryScroll *) const; - -protected: - QString m_fileName; -}; - - -class HistoryTypeBuffer : public HistoryType -{ -public: - HistoryTypeBuffer(unsigned int nbLines); - - virtual bool isEnabled() const; - virtual int maximumLineCount() const; - - virtual HistoryScroll* scroll(HistoryScroll *) const; - -protected: - unsigned int m_nbLines; -}; - -#endif // HISTORY_H
deleted file mode 100644 --- a/gui//src/HistoryDockWidget.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include "HistoryDockWidget.h" -#include <QHBoxLayout> - -HistoryDockWidget::HistoryDockWidget(QWidget *parent) - : QDockWidget(parent) { - setObjectName("HistoryDockWidget"); - construct(); -} - -void HistoryDockWidget::handleListViewItemDoubleClicked(QModelIndex modelIndex) { - QString command = m_historyListModel->data(modelIndex, 0).toString(); - emit commandDoubleClicked(command); -} - -void HistoryDockWidget::construct() { - m_historyListModel = new QStringListModel(); - m_historyListView = new QListView(this); - m_historyListView->setModel(m_historyListModel); - m_historyListView->setAlternatingRowColors(true); - m_historyListView->setEditTriggers(QAbstractItemView::NoEditTriggers); - QHBoxLayout *layout = new QHBoxLayout(); - - setWindowTitle(tr("Command History")); - setWidget(new QWidget()); - - layout->addWidget(m_historyListView); - layout->setMargin(2); - - widget()->setLayout(layout); - connect(m_historyListView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(handleListViewItemDoubleClicked(QModelIndex))); -} - -void HistoryDockWidget::updateHistory(string_vector historyEntries) { - QStringList stringList = m_historyListModel->stringList(); - for(int i = 0; i < historyEntries.length(); i++) { - QString command(historyEntries[i].c_str()); - if(!command.startsWith("#")) { - stringList.push_front(command); - } - } - m_historyListModel->setStringList(stringList); - emit information(tr("History updated.")); -}
deleted file mode 100644 --- a/gui//src/HistoryDockWidget.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef HISTORYDOCKWIDGET_H -#define HISTORYDOCKWIDGET_H - -#include <QDockWidget> -#include <QListView> -#include <QStringListModel> - -// Octave includes -#undef PACKAGE_BUGREPORT -#undef PACKAGE_NAME -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION -#undef PACKAGE_URL -#include "octave/config.h" - -#include "octave/debug.h" -#include "octave/octave.h" -#include "octave/symtab.h" -#include "octave/parse.h" -#include "octave/unwind-prot.h" -#include "octave/toplev.h" -#include "octave/load-path.h" -#include "octave/error.h" -#include "octave/quit.h" -#include "octave/variables.h" -#include "octave/sighandlers.h" -#include "octave/sysdep.h" -#include "octave/str-vec.h" -#include "octave/cmd-hist.h" -#include "octave/cmd-edit.h" -#include "octave/oct-env.h" -#include "octave/symtab.h" -#include "cmd-edit.h" - -class HistoryDockWidget : public QDockWidget { - Q_OBJECT -public: - HistoryDockWidget(QWidget *parent = 0); - void updateHistory(string_vector historyEntries); - -signals: - void information(QString message); - void commandDoubleClicked(QString command); - -private slots: - void handleListViewItemDoubleClicked(QModelIndex modelIndex); - -private: - void construct(); - QListView *m_historyListView; - QStringListModel *m_historyListModel; -}; - -#endif // HISTORYDOCKWIDGET_H
deleted file mode 100644 --- a/gui//src/ImageViewerMdiSubWindow.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "ImageViewerMdiSubWindow.h" -#include <QLabel> -#include <QPixmap> -#include <QScrollArea> - -ImageViewerMdiSubWindow::ImageViewerMdiSubWindow(QPixmap pixmap, QWidget *parent) - : QMdiSubWindow(parent), - m_pixmap(pixmap) { - construct(); -} - -void ImageViewerMdiSubWindow::construct() { - QLabel *label = new QLabel(); - label->setBackgroundRole(QPalette::Base); - label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); - label->setScaledContents(true); - label->setPixmap(m_pixmap); - - QScrollArea *scrollArea = new QScrollArea(this); - scrollArea->setBackgroundRole(QPalette::Dark); - scrollArea->setWidget(label); - setWidget(scrollArea); -}
deleted file mode 100644 --- a/gui//src/ImageViewerMdiSubWindow.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef IMAGEVIEWERMDISUBWINDOW_H -#define IMAGEVIEWERMDISUBWINDOW_H - -#include <QMdiSubWindow> - -class ImageViewerMdiSubWindow : public QMdiSubWindow -{ -public: - ImageViewerMdiSubWindow(QPixmap pixmap, QWidget *parent = 0); - -private: - void construct(); - QPixmap m_pixmap; -}; - -#endif // IMAGEVIEWERMDISUBWINDOW_H
deleted file mode 100644 --- a/gui//src/KeyboardTranslator.cpp +++ /dev/null @@ -1,970 +0,0 @@ -/* - This source file is part of Konsole, a terminal emulator. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - - This program 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 program 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. -*/ - -// Own -#include "KeyboardTranslator.h" - -// System -#include <ctype.h> -#include <stdio.h> - -// Qt -#include <QtCore/QBuffer> -#include <QtCore/QFile> -#include <QtCore/QFileInfo> -#include <QtCore/QTextStream> -#include <QtGui/QKeySequence> -#include <QtCore/QDir> -#include <QtCore/QStringList> -#include <QtCore/QDebug> -#include <QtCore/QDataStream> - -const QByteArray KeyboardTranslatorManager::defaultTranslatorText( -"keyboard \"Fallback Key Translator\"\n" -"key Tab : \"\\t\"" -); - -KeyboardTranslatorManager::KeyboardTranslatorManager() - : _haveLoadedAll(false) -{ -} -KeyboardTranslatorManager::~KeyboardTranslatorManager() -{ - qDeleteAll(_translators); -} -QString KeyboardTranslatorManager::findTranslatorPath(const QString& name) -{ - return QString("../kb-layouts/" + name + ".keytab"); - // return KGlobal::dirs()->findResource("data","konsole/"+name+".keytab"); -} -void KeyboardTranslatorManager::findTranslators() -{ - //QStringList list = KGlobal::dirs()->findAllResources("data", - // "konsole/*.keytab", - // KStandardDirs::NoDuplicates); - - QDir dir("../kb-layouts/"); - QStringList filters; - filters << "*.keytab"; - dir.setNameFilters(filters); - QStringList list = dir.entryList(filters); - - // add the name of each translator to the list and associated - // the name with a null pointer to indicate that the translator - // has not yet been loaded from disk - QStringListIterator listIter(list); - while (listIter.hasNext()) - { - QString translatorPath = listIter.next(); - - QString name = QFileInfo(translatorPath).baseName(); - - if ( !_translators.contains(name) ) - _translators.insert(name,0); - } - - _haveLoadedAll = true; -} - -const KeyboardTranslator* KeyboardTranslatorManager::findTranslator(const QString& name) -{ - if ( name.isEmpty() ) - return defaultTranslator(); - - if ( _translators.contains(name) && _translators[name] != 0 ) - return _translators[name]; - - KeyboardTranslator* translator = loadTranslator(name); - - if ( translator != 0 ) - _translators[name] = translator; - //else if ( !name.isEmpty() ) - // kWarning() << "Unable to load translator" << name; - - return translator; -} - -bool KeyboardTranslatorManager::saveTranslator(const KeyboardTranslator* translator) -{ - //const QString path = KGlobal::dirs()->saveLocation("data","konsole/")+translator->name() - // +".keytab"; - const QString path = ".keytab"; - - //kDebug() << "Saving translator to" << path; - - QFile destination(path); - if (!destination.open(QIODevice::WriteOnly | QIODevice::Text)) - { - //kWarning() << "Unable to save keyboard translation:" - // << destination.errorString(); - return false; - } - - { - KeyboardTranslatorWriter writer(&destination); - writer.writeHeader(translator->description()); - - QListIterator<KeyboardTranslator::Entry> iter(translator->entries()); - while ( iter.hasNext() ) - writer.writeEntry(iter.next()); - } - - destination.close(); - - return true; -} - -KeyboardTranslator* KeyboardTranslatorManager::loadTranslator(const QString& name) -{ - const QString& path = findTranslatorPath(name); - - QFile source(path); - if (name.isEmpty() || !source.open(QIODevice::ReadOnly | QIODevice::Text)) - return 0; - - return loadTranslator(&source,name); -} - -const KeyboardTranslator* KeyboardTranslatorManager::defaultTranslator() -{ - // Try to find the default.keytab file if it exists, otherwise - // fall back to the hard-coded one - const KeyboardTranslator* translator = findTranslator("default"); - if (!translator) - { - QBuffer textBuffer; - textBuffer.setData(defaultTranslatorText); - textBuffer.open(QIODevice::ReadOnly); - translator = loadTranslator(&textBuffer,"fallback"); - } - return translator; -} - -KeyboardTranslator* KeyboardTranslatorManager::loadTranslator(QIODevice* source,const QString& name) -{ - KeyboardTranslator* translator = new KeyboardTranslator(name); - KeyboardTranslatorReader reader(source); - translator->setDescription( reader.description() ); - while ( reader.hasNextEntry() ) - translator->addEntry(reader.nextEntry()); - - source->close(); - - if ( !reader.parseError() ) - { - return translator; - } - else - { - delete translator; - return 0; - } -} - -KeyboardTranslatorWriter::KeyboardTranslatorWriter(QIODevice* destination) -: _destination(destination) -{ - Q_ASSERT( destination && destination->isWritable() ); - - _writer = new QTextStream(_destination); -} -KeyboardTranslatorWriter::~KeyboardTranslatorWriter() -{ - delete _writer; -} -void KeyboardTranslatorWriter::writeHeader( const QString& description ) -{ - *_writer << "keyboard \"" << description << '\"' << '\n'; -} -void KeyboardTranslatorWriter::writeEntry( const KeyboardTranslator::Entry& entry ) -{ - QString result; - if ( entry.command() != KeyboardTranslator::NoCommand ) - result = entry.resultToString(); - else - result = '\"' + entry.resultToString() + '\"'; - - *_writer << "key " << entry.conditionToString() << " : " << result << '\n'; -} - - -// each line of the keyboard translation file is one of: -// -// - keyboard "name" -// - key KeySequence : "characters" -// - key KeySequence : CommandName -// -// KeySequence begins with the name of the key ( taken from the Qt::Key enum ) -// and is followed by the keyboard modifiers and state flags ( with + or - in front -// of each modifier or flag to indicate whether it is required ). All keyboard modifiers -// and flags are optional, if a particular modifier or state is not specified it is -// assumed not to be a part of the sequence. The key sequence may contain whitespace -// -// eg: "key Up+Shift : scrollLineUp" -// "key Next-Shift : "\E[6~" -// -// (lines containing only whitespace are ignored, parseLine assumes that comments have -// already been removed) -// - -KeyboardTranslatorReader::KeyboardTranslatorReader( QIODevice* source ) - : _source(source) - , _hasNext(false) -{ - // read input until we find the description - while ( _description.isEmpty() && !source->atEnd() ) - { - QList<Token> tokens = tokenize( QString(source->readLine()) ); - if ( !tokens.isEmpty() && tokens.first().type == Token::TitleKeyword ) - _description = QString(tokens[1].text.toLatin1().data()); - } - // read first entry (if any) - readNext(); -} -void KeyboardTranslatorReader::readNext() -{ - // find next entry - while ( !_source->atEnd() ) - { - const QList<Token>& tokens = tokenize( QString(_source->readLine()) ); - if ( !tokens.isEmpty() && tokens.first().type == Token::KeyKeyword ) - { - KeyboardTranslator::States flags = KeyboardTranslator::NoState; - KeyboardTranslator::States flagMask = KeyboardTranslator::NoState; - Qt::KeyboardModifiers modifiers = Qt::NoModifier; - Qt::KeyboardModifiers modifierMask = Qt::NoModifier; - - int keyCode = Qt::Key_unknown; - - decodeSequence(tokens[1].text.toLower(), - keyCode, - modifiers, - modifierMask, - flags, - flagMask); - - KeyboardTranslator::Command command = KeyboardTranslator::NoCommand; - QByteArray text; - - // get text or command - if ( tokens[2].type == Token::OutputText ) - { - text = tokens[2].text.toLocal8Bit(); - } - else if ( tokens[2].type == Token::Command ) - { - // identify command - // if (!parseAsCommand(tokens[2].text,command)) - // kWarning() << "Command" << tokens[2].text << "not understood."; - } - - KeyboardTranslator::Entry newEntry; - newEntry.setKeyCode( keyCode ); - newEntry.setState( flags ); - newEntry.setStateMask( flagMask ); - newEntry.setModifiers( modifiers ); - newEntry.setModifierMask( modifierMask ); - newEntry.setText( text ); - newEntry.setCommand( command ); - - _nextEntry = newEntry; - - _hasNext = true; - - return; - } - } - - _hasNext = false; -} - -bool KeyboardTranslatorReader::parseAsCommand(const QString& text,KeyboardTranslator::Command& command) -{ - if ( text.compare("erase",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::EraseCommand; - else if ( text.compare("scrollpageup",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::ScrollPageUpCommand; - else if ( text.compare("scrollpagedown",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::ScrollPageDownCommand; - else if ( text.compare("scrolllineup",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::ScrollLineUpCommand; - else if ( text.compare("scrolllinedown",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::ScrollLineDownCommand; - else if ( text.compare("scrolllock",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::ScrollLockCommand; - else - return false; - - return true; -} - -bool KeyboardTranslatorReader::decodeSequence(const QString& text, - int& keyCode, - Qt::KeyboardModifiers& modifiers, - Qt::KeyboardModifiers& modifierMask, - KeyboardTranslator::States& flags, - KeyboardTranslator::States& flagMask) -{ - bool isWanted = true; - bool endOfItem = false; - QString buffer; - - Qt::KeyboardModifiers tempModifiers = modifiers; - Qt::KeyboardModifiers tempModifierMask = modifierMask; - KeyboardTranslator::States tempFlags = flags; - KeyboardTranslator::States tempFlagMask = flagMask; - - for ( int i = 0 ; i < text.count() ; i++ ) - { - const QChar& ch = text[i]; - bool isFirstLetter = i == 0; - bool isLastLetter = ( i == text.count()-1 ); - endOfItem = true; - if ( ch.isLetterOrNumber() ) - { - endOfItem = false; - buffer.append(ch); - } else if ( isFirstLetter ) - { - buffer.append(ch); - } - - if ( (endOfItem || isLastLetter) && !buffer.isEmpty() ) - { - Qt::KeyboardModifier itemModifier = Qt::NoModifier; - int itemKeyCode = 0; - KeyboardTranslator::State itemFlag = KeyboardTranslator::NoState; - - if ( parseAsModifier(buffer,itemModifier) ) - { - tempModifierMask |= itemModifier; - - if ( isWanted ) - tempModifiers |= itemModifier; - } - else if ( parseAsStateFlag(buffer,itemFlag) ) - { - tempFlagMask |= itemFlag; - - if ( isWanted ) - tempFlags |= itemFlag; - } - else if ( parseAsKeyCode(buffer,itemKeyCode) ) - keyCode = itemKeyCode; - //else - // kWarning() << "Unable to parse key binding item:" << buffer; - - buffer.clear(); - } - - // check if this is a wanted / not-wanted flag and update the - // state ready for the next item - if ( ch == '+' ) - isWanted = true; - else if ( ch == '-' ) - isWanted = false; - } - - modifiers = tempModifiers; - modifierMask = tempModifierMask; - flags = tempFlags; - flagMask = tempFlagMask; - - return true; -} - -bool KeyboardTranslatorReader::parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier) -{ - if ( item == "shift" ) - modifier = Qt::ShiftModifier; - else if ( item == "ctrl" || item == "control" ) - modifier = Qt::ControlModifier; - else if ( item == "alt" ) - modifier = Qt::AltModifier; - else if ( item == "meta" ) - modifier = Qt::MetaModifier; - else if ( item == "keypad" ) - modifier = Qt::KeypadModifier; - else - return false; - - return true; -} -bool KeyboardTranslatorReader::parseAsStateFlag(const QString& item , KeyboardTranslator::State& flag) -{ - if ( item == "appcukeys" || item == "appcursorkeys" ) - flag = KeyboardTranslator::CursorKeysState; - else if ( item == "ansi" ) - flag = KeyboardTranslator::AnsiState; - else if ( item == "newline" ) - flag = KeyboardTranslator::NewLineState; - else if ( item == "appscreen" ) - flag = KeyboardTranslator::AlternateScreenState; - else if ( item == "anymod" || item == "anymodifier" ) - flag = KeyboardTranslator::AnyModifierState; - else if ( item == "appkeypad" ) - flag = KeyboardTranslator::ApplicationKeypadState; - else - return false; - - return true; -} -bool KeyboardTranslatorReader::parseAsKeyCode(const QString& item , int& keyCode) -{ - QKeySequence sequence = QKeySequence::fromString(item); - if ( !sequence.isEmpty() ) - { - keyCode = sequence[0]; - - if ( sequence.count() > 1 ) - { - //kWarning() << "Unhandled key codes in sequence: " << item; - } - } - // additional cases implemented for backwards compatibility with KDE 3 - else if ( item == "prior" ) - keyCode = Qt::Key_PageUp; - else if ( item == "next" ) - keyCode = Qt::Key_PageDown; - else - return false; - - return true; -} - -QString KeyboardTranslatorReader::description() const -{ - return _description; -} -bool KeyboardTranslatorReader::hasNextEntry() -{ - return _hasNext; -} -KeyboardTranslator::Entry KeyboardTranslatorReader::createEntry( const QString& condition , - const QString& result ) -{ - QString entryString("keyboard \"temporary\"\nkey "); - entryString.append(condition); - entryString.append(" : "); - - // if 'result' is the name of a command then the entry result will be that command, - // otherwise the result will be treated as a string to echo when the key sequence - // specified by 'condition' is pressed - KeyboardTranslator::Command command; - if (parseAsCommand(result,command)) - entryString.append(result); - else - entryString.append('\"' + result + '\"'); - - QByteArray array = entryString.toUtf8(); - QBuffer buffer(&array); - buffer.open(QIODevice::ReadOnly); - KeyboardTranslatorReader reader(&buffer); - - KeyboardTranslator::Entry entry; - if ( reader.hasNextEntry() ) - entry = reader.nextEntry(); - - return entry; -} - -KeyboardTranslator::Entry KeyboardTranslatorReader::nextEntry() -{ - Q_ASSERT( _hasNext ); - KeyboardTranslator::Entry entry = _nextEntry; - readNext(); - return entry; -} -bool KeyboardTranslatorReader::parseError() -{ - return false; -} -QList<KeyboardTranslatorReader::Token> KeyboardTranslatorReader::tokenize(const QString& line) -{ - QString text = line; - - // remove comments - bool inQuotes = false; - int commentPos = -1; - for (int i=text.length()-1;i>=0;i--) - { - QChar ch = text[i]; - if (ch == '\"') - inQuotes = !inQuotes; - else if (ch == '#' && !inQuotes) - commentPos = i; - } - if (commentPos != -1) - text.remove(commentPos,text.length()); - - text = text.simplified(); - - // title line: keyboard "title" - static QRegExp title("keyboard\\s+\"(.*)\""); - // key line: key KeySequence : "output" - // key line: key KeySequence : command - static QRegExp key("key\\s+([\\w\\+\\s\\-\\*\\.]+)\\s*:\\s*(\"(.*)\"|\\w+)"); - - QList<Token> list; - if ( text.isEmpty() ) - { - return list; - } - - if ( title.exactMatch(text) ) - { - Token titleToken = { Token::TitleKeyword , QString() }; - Token textToken = { Token::TitleText , title.capturedTexts()[1] }; - - list << titleToken << textToken; - } - else if ( key.exactMatch(text) ) - { - Token keyToken = { Token::KeyKeyword , QString() }; - Token sequenceToken = { Token::KeySequence , key.capturedTexts()[1].remove(' ') }; - - list << keyToken << sequenceToken; - - if ( key.capturedTexts()[3].isEmpty() ) - { - // capturedTexts()[2] is a command - Token commandToken = { Token::Command , key.capturedTexts()[2] }; - list << commandToken; - } - else - { - // capturedTexts()[3] is the output string - Token outputToken = { Token::OutputText , key.capturedTexts()[3] }; - list << outputToken; - } - } - else - { - //kWarning() << "Line in keyboard translator file could not be understood:" << text; - } - - return list; -} - -QList<QString> KeyboardTranslatorManager::allTranslators() -{ - if ( !_haveLoadedAll ) - { - findTranslators(); - } - - return _translators.keys(); -} - -KeyboardTranslator::Entry::Entry() -: _keyCode(0) -, _modifiers(Qt::NoModifier) -, _modifierMask(Qt::NoModifier) -, _state(NoState) -, _stateMask(NoState) -, _command(NoCommand) -{ -} - -bool KeyboardTranslator::Entry::operator==(const Entry& rhs) const -{ - return _keyCode == rhs._keyCode && - _modifiers == rhs._modifiers && - _modifierMask == rhs._modifierMask && - _state == rhs._state && - _stateMask == rhs._stateMask && - _command == rhs._command && - _text == rhs._text; -} - -bool KeyboardTranslator::Entry::matches(int keyCode , - Qt::KeyboardModifiers modifiers, - States testState) const -{ - if ( _keyCode != keyCode ) - return false; - - if ( (modifiers & _modifierMask) != (_modifiers & _modifierMask) ) - return false; - - // if modifiers is non-zero, the 'any modifier' state is implicit - if ( modifiers != 0 ) - testState |= AnyModifierState; - - if ( (testState & _stateMask) != (_state & _stateMask) ) - return false; - - // special handling for the 'Any Modifier' state, which checks for the presence of - // any or no modifiers. In this context, the 'keypad' modifier does not count. - bool anyModifiersSet = modifiers != 0 && modifiers != Qt::KeypadModifier; - bool wantAnyModifier = _state & KeyboardTranslator::AnyModifierState; - if ( _stateMask & KeyboardTranslator::AnyModifierState ) - { - if ( wantAnyModifier != anyModifiersSet ) - return false; - } - - return true; -} -QByteArray KeyboardTranslator::Entry::escapedText(bool expandWildCards,Qt::KeyboardModifiers modifiers) const -{ - QByteArray result(text(expandWildCards,modifiers)); - - for ( int i = 0 ; i < result.count() ; i++ ) - { - char ch = result[i]; - char replacement = 0; - - switch ( ch ) - { - case 27 : replacement = 'E'; break; - case 8 : replacement = 'b'; break; - case 12 : replacement = 'f'; break; - case 9 : replacement = 't'; break; - case 13 : replacement = 'r'; break; - case 10 : replacement = 'n'; break; - default: - // any character which is not printable is replaced by an equivalent - // \xhh escape sequence (where 'hh' are the corresponding hex digits) - if ( !QChar(ch).isPrint() ) - replacement = 'x'; - } - - if ( replacement == 'x' ) - { - result.replace(i,1,"\\x"+QByteArray(1,ch).toHex()); - } else if ( replacement != 0 ) - { - result.remove(i,1); - result.insert(i,'\\'); - result.insert(i+1,replacement); - } - } - - return result; -} -QByteArray KeyboardTranslator::Entry::unescape(const QByteArray& input) const -{ - QByteArray result(input); - - for ( int i = 0 ; i < result.count()-1 ; i++ ) - { - - QByteRef ch = result[i]; - if ( ch == '\\' ) - { - char replacement[2] = {0,0}; - int charsToRemove = 2; - bool escapedChar = true; - - switch ( result[i+1] ) - { - case 'E' : replacement[0] = 27; break; - case 'b' : replacement[0] = 8 ; break; - case 'f' : replacement[0] = 12; break; - case 't' : replacement[0] = 9 ; break; - case 'r' : replacement[0] = 13; break; - case 'n' : replacement[0] = 10; break; - case 'x' : - { - // format is \xh or \xhh where 'h' is a hexadecimal - // digit from 0-9 or A-F which should be replaced - // with the corresponding character value - char hexDigits[3] = {0}; - - if ( (i < result.count()-2) && isxdigit(result[i+2]) ) - hexDigits[0] = result[i+2]; - if ( (i < result.count()-3) && isxdigit(result[i+3]) ) - hexDigits[1] = result[i+3]; - - unsigned charValue = 0; - sscanf(hexDigits,"%x",&charValue); - - replacement[0] = (char)charValue; - charsToRemove = 2 + strlen(hexDigits); - } - break; - default: - escapedChar = false; - } - - if ( escapedChar ) - result.replace(i,charsToRemove,replacement); - } - } - - return result; -} - -void KeyboardTranslator::Entry::insertModifier( QString& item , int modifier ) const -{ - if ( !(modifier & _modifierMask) ) - return; - - if ( modifier & _modifiers ) - item += '+'; - else - item += '-'; - - if ( modifier == Qt::ShiftModifier ) - item += "Shift"; - else if ( modifier == Qt::ControlModifier ) - item += "Ctrl"; - else if ( modifier == Qt::AltModifier ) - item += "Alt"; - else if ( modifier == Qt::MetaModifier ) - item += "Meta"; - else if ( modifier == Qt::KeypadModifier ) - item += "KeyPad"; -} -void KeyboardTranslator::Entry::insertState( QString& item , int state ) const -{ - if ( !(state & _stateMask) ) - return; - - if ( state & _state ) - item += '+' ; - else - item += '-' ; - - if ( state == KeyboardTranslator::AlternateScreenState ) - item += "AppScreen"; - else if ( state == KeyboardTranslator::NewLineState ) - item += "NewLine"; - else if ( state == KeyboardTranslator::AnsiState ) - item += "Ansi"; - else if ( state == KeyboardTranslator::CursorKeysState ) - item += "AppCursorKeys"; - else if ( state == KeyboardTranslator::AnyModifierState ) - item += "AnyModifier"; - else if ( state == KeyboardTranslator::ApplicationKeypadState ) - item += "AppKeypad"; -} -QString KeyboardTranslator::Entry::resultToString(bool expandWildCards,Qt::KeyboardModifiers modifiers) const -{ - if ( !_text.isEmpty() ) - return escapedText(expandWildCards,modifiers); - else if ( _command == EraseCommand ) - return "Erase"; - else if ( _command == ScrollPageUpCommand ) - return "ScrollPageUp"; - else if ( _command == ScrollPageDownCommand ) - return "ScrollPageDown"; - else if ( _command == ScrollLineUpCommand ) - return "ScrollLineUp"; - else if ( _command == ScrollLineDownCommand ) - return "ScrollLineDown"; - else if ( _command == ScrollLockCommand ) - return "ScrollLock"; - - return QString(); -} -QString KeyboardTranslator::Entry::conditionToString() const -{ - QString result = QKeySequence(_keyCode).toString(); - - insertModifier( result , Qt::ShiftModifier ); - insertModifier( result , Qt::ControlModifier ); - insertModifier( result , Qt::AltModifier ); - insertModifier( result , Qt::MetaModifier ); - insertModifier( result , Qt::KeypadModifier ); - - insertState( result , KeyboardTranslator::AlternateScreenState ); - insertState( result , KeyboardTranslator::NewLineState ); - insertState( result , KeyboardTranslator::AnsiState ); - insertState( result , KeyboardTranslator::CursorKeysState ); - insertState( result , KeyboardTranslator::AnyModifierState ); - insertState( result , KeyboardTranslator::ApplicationKeypadState ); - - return result; -} - -KeyboardTranslator::KeyboardTranslator(const QString& name) -: _name(name) -{ -} - -void KeyboardTranslator::setDescription(const QString& description) -{ - _description = description; -} -QString KeyboardTranslator::description() const -{ - return _description; -} -void KeyboardTranslator::setName(const QString& name) -{ - _name = name; -} -QString KeyboardTranslator::name() const -{ - return _name; -} - -QList<KeyboardTranslator::Entry> KeyboardTranslator::entries() const -{ - return _entries.values(); -} - -void KeyboardTranslator::addEntry(const Entry& entry) -{ - const int keyCode = entry.keyCode(); - _entries.insert(keyCode,entry); -} -void KeyboardTranslator::replaceEntry(const Entry& existing , const Entry& replacement) -{ - if ( !existing.isNull() ) - _entries.remove(existing.keyCode(),existing); - _entries.insert(replacement.keyCode(),replacement); -} -void KeyboardTranslator::removeEntry(const Entry& entry) -{ - _entries.remove(entry.keyCode(),entry); -} -KeyboardTranslator::Entry KeyboardTranslator::findEntry(int keyCode, Qt::KeyboardModifiers modifiers, States state) const -{ - foreach(const Entry& entry, _entries.values(keyCode)) - { - if ( entry.matches(keyCode,modifiers,state) ) - return entry; - } - return Entry(); // entry not found -} -void KeyboardTranslatorManager::addTranslator(KeyboardTranslator* translator) -{ - _translators.insert(translator->name(),translator); - - // if ( !saveTranslator(translator) ) - // kWarning() << "Unable to save translator" << translator->name() - // << "to disk."; -} -bool KeyboardTranslatorManager::deleteTranslator(const QString& name) -{ - Q_ASSERT( _translators.contains(name) ); - - // locate and delete - QString path = findTranslatorPath(name); - if ( QFile::remove(path) ) - { - _translators.remove(name); - return true; - } - else - { - //kWarning() << "Failed to remove translator - " << path; - return false; - } -} - -/** - * @internal - */ -typedef void (*KdeCleanUpFunction)(); - -/** - * @internal - * - * Helper class for K_GLOBAL_STATIC to clean up the object on library unload or application - * shutdown. - */ -class KCleanUpGlobalStatic -{ - public: - KdeCleanUpFunction func; - - inline ~KCleanUpGlobalStatic() { func(); } -}; - - - -#ifdef Q_CC_MSVC -/** - * @internal - * - * MSVC seems to give anonymous structs the same name which fails at link time. So instead we name - * the struct and hope that by adding the line number to the name it's unique enough to never clash. - */ -# define K_GLOBAL_STATIC_STRUCT_NAME(NAME) _k_##NAME##__LINE__ -#else -/** - * @internal - * - * Make the struct of the K_GLOBAL_STATIC anonymous. - */ -# define K_GLOBAL_STATIC_STRUCT_NAME(NAME) -#endif - - - -#define K_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \ -static QBasicAtomicPointer<TYPE > _k_static_##NAME = Q_BASIC_ATOMIC_INITIALIZER(0); \ -static bool _k_static_##NAME##_destroyed; \ -static struct K_GLOBAL_STATIC_STRUCT_NAME(NAME) \ -{ \ - inline bool isDestroyed() const \ - { \ - return _k_static_##NAME##_destroyed; \ - } \ - inline bool exists() const \ - { \ - return _k_static_##NAME != 0; \ - } \ - inline operator TYPE*() \ - { \ - return operator->(); \ - } \ - inline TYPE *operator->() \ - { \ - if (!_k_static_##NAME) { \ - if (isDestroyed()) { \ - qFatal("Fatal Error: Accessed global static '%s *%s()' after destruction. " \ - "Defined at %s:%d", #TYPE, #NAME, __FILE__, __LINE__); \ - } \ - TYPE *x = new TYPE ARGS; \ - if (!_k_static_##NAME.testAndSetOrdered(0, x) \ - && _k_static_##NAME != x ) { \ - delete x; \ - } else { \ - static KCleanUpGlobalStatic cleanUpObject = { destroy }; \ - } \ - } \ - return _k_static_##NAME; \ - } \ - inline TYPE &operator*() \ - { \ - return *operator->(); \ - } \ - static void destroy() \ - { \ - _k_static_##NAME##_destroyed = true; \ - TYPE *x = _k_static_##NAME; \ - _k_static_##NAME = 0; \ - delete x; \ - } \ -} NAME; - -#define K_GLOBAL_STATIC(TYPE, NAME) K_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ()) - -K_GLOBAL_STATIC( KeyboardTranslatorManager , theKeyboardTranslatorManager ) -KeyboardTranslatorManager* KeyboardTranslatorManager::instance() -{ - return theKeyboardTranslatorManager; -}
deleted file mode 100644 --- a/gui//src/KeyboardTranslator.h +++ /dev/null @@ -1,577 +0,0 @@ -/* - This source file is part of Konsole, a terminal emulator. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - - This program 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 program 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 KEYBOARDTRANSLATOR_H -#define KEYBOARDTRANSLATOR_H - -// Qt -#include <QtCore/QHash> -#include <QtCore/QList> -#include <QtGui/QKeySequence> -#include <QtCore/QMetaType> -#include <QtCore/QVarLengthArray> - -class QIODevice; -class QTextStream; - -/** - * A convertor which maps between key sequences pressed by the user and the - * character strings which should be sent to the terminal and commands - * which should be invoked when those character sequences are pressed. - * - * Konsole supports multiple keyboard translators, allowing the user to - * specify the character sequences which are sent to the terminal - * when particular key sequences are pressed. - * - * A key sequence is defined as a key code, associated keyboard modifiers - * (Shift,Ctrl,Alt,Meta etc.) and state flags which indicate the state - * which the terminal must be in for the key sequence to apply. - */ -class KeyboardTranslator -{ -public: - /** - * The meaning of a particular key sequence may depend upon the state which - * the terminal emulation is in. Therefore findEntry() may return a different - * Entry depending upon the state flags supplied. - * - * This enum describes the states which may be associated with with a particular - * entry in the keyboard translation entry. - */ - enum State - { - /** Indicates that no special state is active */ - NoState = 0, - /** - * TODO More documentation - */ - NewLineState = 1, - /** - * Indicates that the terminal is in 'Ansi' mode. - * TODO: More documentation - */ - AnsiState = 2, - /** - * TODO More documentation - */ - CursorKeysState = 4, - /** - * Indicates that the alternate screen ( typically used by interactive programs - * such as screen or vim ) is active - */ - AlternateScreenState = 8, - /** Indicates that any of the modifier keys is active. */ - AnyModifierState = 16, - /** Indicates that the numpad is in application mode. */ - ApplicationKeypadState = 32 - }; - Q_DECLARE_FLAGS(States,State) - - /** - * This enum describes commands which are associated with particular key sequences. - */ - enum Command - { - /** Indicates that no command is associated with this command sequence */ - NoCommand = 0, - /** TODO Document me */ - SendCommand = 1, - /** Scroll the terminal display up one page */ - ScrollPageUpCommand = 2, - /** Scroll the terminal display down one page */ - ScrollPageDownCommand = 4, - /** Scroll the terminal display up one line */ - ScrollLineUpCommand = 8, - /** Scroll the terminal display down one line */ - ScrollLineDownCommand = 16, - /** Toggles scroll lock mode */ - ScrollLockCommand = 32, - /** Echos the operating system specific erase character. */ - EraseCommand = 64 - }; - Q_DECLARE_FLAGS(Commands,Command) - - /** - * Represents an association between a key sequence pressed by the user - * and the character sequence and commands associated with it for a particular - * KeyboardTranslator. - */ - class Entry - { - public: - /** - * Constructs a new entry for a keyboard translator. - */ - Entry(); - - /** - * Returns true if this entry is null. - * This is true for newly constructed entries which have no properties set. - */ - bool isNull() const; - - /** Returns the commands associated with this entry */ - Command command() const; - /** Sets the command associated with this entry. */ - void setCommand(Command command); - - /** - * Returns the character sequence associated with this entry, optionally replacing - * wildcard '*' characters with numbers to indicate the keyboard modifiers being pressed. - * - * TODO: The numbers used to replace '*' characters are taken from the Konsole/KDE 3 code. - * Document them. - * - * @param expandWildCards Specifies whether wild cards (occurrences of the '*' character) in - * the entry should be replaced with a number to indicate the modifier keys being pressed. - * - * @param modifiers The keyboard modifiers being pressed. - */ - QByteArray text(bool expandWildCards = false, - Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; - - /** Sets the character sequence associated with this entry */ - void setText(const QByteArray& text); - - /** - * Returns the character sequence associated with this entry, - * with any non-printable characters replaced with escape sequences. - * - * eg. \\E for Escape, \\t for tab, \\n for new line. - * - * @param expandWildCards See text() - * @param modifiers See text() - */ - QByteArray escapedText(bool expandWildCards = false, - Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; - - /** Returns the character code ( from the Qt::Key enum ) associated with this entry */ - int keyCode() const; - /** Sets the character code associated with this entry */ - void setKeyCode(int keyCode); - - /** - * Returns a bitwise-OR of the enabled keyboard modifiers associated with this entry. - * If a modifier is set in modifierMask() but not in modifiers(), this means that the entry - * only matches when that modifier is NOT pressed. - * - * If a modifier is not set in modifierMask() then the entry matches whether the modifier - * is pressed or not. - */ - Qt::KeyboardModifiers modifiers() const; - - /** Returns the keyboard modifiers which are valid in this entry. See modifiers() */ - Qt::KeyboardModifiers modifierMask() const; - - /** See modifiers() */ - void setModifiers( Qt::KeyboardModifiers modifiers ); - /** See modifierMask() and modifiers() */ - void setModifierMask( Qt::KeyboardModifiers modifiers ); - - /** - * Returns a bitwise-OR of the enabled state flags associated with this entry. - * If flag is set in stateMask() but not in state(), this means that the entry only - * matches when the terminal is NOT in that state. - * - * If a state is not set in stateMask() then the entry matches whether the terminal - * is in that state or not. - */ - States state() const; - - /** Returns the state flags which are valid in this entry. See state() */ - States stateMask() const; - - /** See state() */ - void setState( States state ); - /** See stateMask() */ - void setStateMask( States mask ); - - /** - * Returns the key code and modifiers associated with this entry - * as a QKeySequence - */ - //QKeySequence keySequence() const; - - /** - * Returns this entry's conditions ( ie. its key code, modifier and state criteria ) - * as a string. - */ - QString conditionToString() const; - - /** - * Returns this entry's result ( ie. its command or character sequence ) - * as a string. - * - * @param expandWildCards See text() - * @param modifiers See text() - */ - QString resultToString(bool expandWildCards = false, - Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; - - /** - * Returns true if this entry matches the given key sequence, specified - * as a combination of @p keyCode , @p modifiers and @p state. - */ - bool matches( int keyCode , - Qt::KeyboardModifiers modifiers , - States flags ) const; - - bool operator==(const Entry& rhs) const; - - private: - void insertModifier( QString& item , int modifier ) const; - void insertState( QString& item , int state ) const; - QByteArray unescape(const QByteArray& text) const; - - int _keyCode; - Qt::KeyboardModifiers _modifiers; - Qt::KeyboardModifiers _modifierMask; - States _state; - States _stateMask; - - Command _command; - QByteArray _text; - }; - - /** Constructs a new keyboard translator with the given @p name */ - KeyboardTranslator(const QString& name); - - //KeyboardTranslator(const KeyboardTranslator& other); - - /** Returns the name of this keyboard translator */ - QString name() const; - - /** Sets the name of this keyboard translator */ - void setName(const QString& name); - - /** Returns the descriptive name of this keyboard translator */ - QString description() const; - - /** Sets the descriptive name of this keyboard translator */ - void setDescription(const QString& description); - - /** - * Looks for an entry in this keyboard translator which matches the given - * key code, keyboard modifiers and state flags. - * - * Returns the matching entry if found or a null Entry otherwise ( ie. - * entry.isNull() will return true ) - * - * @param keyCode A key code from the Qt::Key enum - * @param modifiers A combination of modifiers - * @param state Optional flags which specify the current state of the terminal - */ - Entry findEntry(int keyCode , - Qt::KeyboardModifiers modifiers , - States state = NoState) const; - - /** - * Adds an entry to this keyboard translator's table. Entries can be looked up according - * to their key sequence using findEntry() - */ - void addEntry(const Entry& entry); - - /** - * Replaces an entry in the translator. If the @p existing entry is null, - * then this is equivalent to calling addEntry(@p replacement) - */ - void replaceEntry(const Entry& existing , const Entry& replacement); - - /** - * Removes an entry from the table. - */ - void removeEntry(const Entry& entry); - - /** Returns a list of all entries in the translator. */ - QList<Entry> entries() const; - -private: - - QMultiHash<int,Entry> _entries; // entries in this keyboard translation, - // entries are indexed according to - // their keycode - QString _name; - QString _description; -}; -Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::States) -Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::Commands) - -/** - * Parses the contents of a Keyboard Translator (.keytab) file and - * returns the entries found in it. - * - * Usage example: - * - * @code - * QFile source( "/path/to/keytab" ); - * source.open( QIODevice::ReadOnly ); - * - * KeyboardTranslator* translator = new KeyboardTranslator( "name-of-translator" ); - * - * KeyboardTranslatorReader reader(source); - * while ( reader.hasNextEntry() ) - * translator->addEntry(reader.nextEntry()); - * - * source.close(); - * - * if ( !reader.parseError() ) - * { - * // parsing succeeded, do something with the translator - * } - * else - * { - * // parsing failed - * } - * @endcode - */ -class KeyboardTranslatorReader -{ -public: - /** Constructs a new reader which parses the given @p source */ - KeyboardTranslatorReader( QIODevice* source ); - - /** - * Returns the description text. - * TODO: More documentation - */ - QString description() const; - - /** Returns true if there is another entry in the source stream */ - bool hasNextEntry(); - /** Returns the next entry found in the source stream */ - KeyboardTranslator::Entry nextEntry(); - - /** - * Returns true if an error occurred whilst parsing the input or - * false if no error occurred. - */ - bool parseError(); - - /** - * Parses a condition and result string for a translator entry - * and produces a keyboard translator entry. - * - * The condition and result strings are in the same format as in - */ - static KeyboardTranslator::Entry createEntry( const QString& condition , - const QString& result ); -private: - struct Token - { - enum Type - { - TitleKeyword, - TitleText, - KeyKeyword, - KeySequence, - Command, - OutputText - }; - Type type; - QString text; - }; - QList<Token> tokenize(const QString&); - void readNext(); - bool decodeSequence(const QString& , - int& keyCode, - Qt::KeyboardModifiers& modifiers, - Qt::KeyboardModifiers& modifierMask, - KeyboardTranslator::States& state, - KeyboardTranslator::States& stateFlags); - - static bool parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier); - static bool parseAsStateFlag(const QString& item , KeyboardTranslator::State& state); - static bool parseAsKeyCode(const QString& item , int& keyCode); - static bool parseAsCommand(const QString& text , KeyboardTranslator::Command& command); - - QIODevice* _source; - QString _description; - KeyboardTranslator::Entry _nextEntry; - bool _hasNext; -}; - -/** Writes a keyboard translation to disk. */ -class KeyboardTranslatorWriter -{ -public: - /** - * Constructs a new writer which saves data into @p destination. - * The caller is responsible for closing the device when writing is complete. - */ - KeyboardTranslatorWriter(QIODevice* destination); - ~KeyboardTranslatorWriter(); - - /** - * Writes the header for the keyboard translator. - * @param description Description of the keyboard translator. - */ - void writeHeader( const QString& description ); - /** Writes a translator entry. */ - void writeEntry( const KeyboardTranslator::Entry& entry ); - -private: - QIODevice* _destination; - QTextStream* _writer; -}; - -/** - * Manages the keyboard translations available for use by terminal sessions, - * see KeyboardTranslator. - */ -class KeyboardTranslatorManager -{ -public: - /** - * Constructs a new KeyboardTranslatorManager and loads the list of - * available keyboard translations. - * - * The keyboard translations themselves are not loaded until they are - * first requested via a call to findTranslator() - */ - KeyboardTranslatorManager(); - ~KeyboardTranslatorManager(); - - /** - * Adds a new translator. If a translator with the same name - * already exists, it will be replaced by the new translator. - * - * TODO: More documentation. - */ - void addTranslator(KeyboardTranslator* translator); - - /** - * Deletes a translator. Returns true on successful deletion or false otherwise. - * - * TODO: More documentation - */ - bool deleteTranslator(const QString& name); - - /** Returns the default translator for Konsole. */ - const KeyboardTranslator* defaultTranslator(); - - /** - * Returns the keyboard translator with the given name or 0 if no translator - * with that name exists. - * - * The first time that a translator with a particular name is requested, - * the on-disk .keyboard file is loaded and parsed. - */ - const KeyboardTranslator* findTranslator(const QString& name); - /** - * Returns a list of the names of available keyboard translators. - * - * The first time this is called, a search for available - * translators is started. - */ - QList<QString> allTranslators(); - - /** Returns the global KeyboardTranslatorManager instance. */ - static KeyboardTranslatorManager* instance(); - -private: - static const QByteArray defaultTranslatorText; - - void findTranslators(); // locate the available translators - KeyboardTranslator* loadTranslator(const QString& name); // loads the translator - // with the given name - KeyboardTranslator* loadTranslator(QIODevice* device,const QString& name); - - bool saveTranslator(const KeyboardTranslator* translator); - QString findTranslatorPath(const QString& name); - - QHash<QString,KeyboardTranslator*> _translators; // maps translator-name -> KeyboardTranslator - // instance - bool _haveLoadedAll; -}; - -inline int KeyboardTranslator::Entry::keyCode() const { return _keyCode; } -inline void KeyboardTranslator::Entry::setKeyCode(int keyCode) { _keyCode = keyCode; } - -inline void KeyboardTranslator::Entry::setModifiers( Qt::KeyboardModifiers modifier ) -{ - _modifiers = modifier; -} -inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifiers() const { return _modifiers; } - -inline void KeyboardTranslator::Entry::setModifierMask( Qt::KeyboardModifiers mask ) -{ - _modifierMask = mask; -} -inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifierMask() const { return _modifierMask; } - -inline bool KeyboardTranslator::Entry::isNull() const -{ - return ( *this == Entry() ); -} - -inline void KeyboardTranslator::Entry::setCommand( Command command ) -{ - _command = command; -} -inline KeyboardTranslator::Command KeyboardTranslator::Entry::command() const { return _command; } - -inline void KeyboardTranslator::Entry::setText( const QByteArray& text ) -{ - _text = unescape(text); -} -inline int oneOrZero(int value) -{ - return value ? 1 : 0; -} -inline QByteArray KeyboardTranslator::Entry::text(bool expandWildCards,Qt::KeyboardModifiers modifiers) const -{ - QByteArray expandedText = _text; - - if (expandWildCards) - { - int modifierValue = 1; - modifierValue += oneOrZero(modifiers & Qt::ShiftModifier); - modifierValue += oneOrZero(modifiers & Qt::AltModifier) << 1; - modifierValue += oneOrZero(modifiers & Qt::ControlModifier) << 2; - - for (int i=0;i<_text.length();i++) - { - if (expandedText[i] == '*') - expandedText[i] = '0' + modifierValue; - } - } - - return expandedText; -} - -inline void KeyboardTranslator::Entry::setState( States state ) -{ - _state = state; -} -inline KeyboardTranslator::States KeyboardTranslator::Entry::state() const { return _state; } - -inline void KeyboardTranslator::Entry::setStateMask( States stateMask ) -{ - _stateMask = stateMask; -} -inline KeyboardTranslator::States KeyboardTranslator::Entry::stateMask() const { return _stateMask; } - - -Q_DECLARE_METATYPE(KeyboardTranslator::Entry) -Q_DECLARE_METATYPE(const KeyboardTranslator*) - -#endif // KEYBOARDTRANSLATOR_H -
deleted file mode 100644 --- a/gui//src/LineFont.h +++ /dev/null @@ -1,21 +0,0 @@ -// WARNING: Autogenerated by "fontembedder ./linefont.src". -// You probably do not want to hand-edit this! - -static const quint32 LineChars[] = { - 0x00007c00, 0x000fffe0, 0x00421084, 0x00e739ce, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00427000, 0x004e7380, 0x00e77800, 0x00ef7bc0, - 0x00421c00, 0x00439ce0, 0x00e73c00, 0x00e7bde0, 0x00007084, 0x000e7384, 0x000079ce, 0x000f7bce, - 0x00001c84, 0x00039ce4, 0x00003dce, 0x0007bdee, 0x00427084, 0x004e7384, 0x004279ce, 0x00e77884, - 0x00e779ce, 0x004f7bce, 0x00ef7bc4, 0x00ef7bce, 0x00421c84, 0x00439ce4, 0x00423dce, 0x00e73c84, - 0x00e73dce, 0x0047bdee, 0x00e7bde4, 0x00e7bdee, 0x00427c00, 0x0043fce0, 0x004e7f80, 0x004fffe0, - 0x004fffe0, 0x00e7fde0, 0x006f7fc0, 0x00efffe0, 0x00007c84, 0x0003fce4, 0x000e7f84, 0x000fffe4, - 0x00007dce, 0x0007fdee, 0x000f7fce, 0x000fffee, 0x00427c84, 0x0043fce4, 0x004e7f84, 0x004fffe4, - 0x00427dce, 0x00e77c84, 0x00e77dce, 0x0047fdee, 0x004e7fce, 0x00e7fde4, 0x00ef7f84, 0x004fffee, - 0x00efffe4, 0x00e7fdee, 0x00ef7fce, 0x00efffee, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x000f83e0, 0x00a5294a, 0x004e1380, 0x00a57800, 0x00ad0bc0, 0x004390e0, 0x00a53c00, 0x00a5a1e0, - 0x000e1384, 0x0000794a, 0x000f0b4a, 0x000390e4, 0x00003d4a, 0x0007a16a, 0x004e1384, 0x00a5694a, - 0x00ad2b4a, 0x004390e4, 0x00a52d4a, 0x00a5a16a, 0x004f83e0, 0x00a57c00, 0x00ad83e0, 0x000f83e4, - 0x00007d4a, 0x000f836a, 0x004f93e4, 0x00a57d4a, 0x00ad836a, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001c00, 0x00001084, 0x00007000, 0x00421000, - 0x00039ce0, 0x000039ce, 0x000e7380, 0x00e73800, 0x000e7f80, 0x00e73884, 0x0003fce0, 0x004239ce -};
deleted file mode 100644 --- a/gui//src/MainWindow.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include <QMenuBar> -#include <QMenu> -#include <QAction> -#include <QSettings> -#include <QDesktopServices> -#include <QFileDialog> -#include "MainWindow.h" -#include "FileEditorDockWidget.h" -#include "ImageViewerDockWidget.h" - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), - m_isRunning(true) { - setObjectName("MainWindow"); - - QDesktopServices desktopServices; - m_settingsFile = desktopServices.storageLocation(QDesktopServices::HomeLocation) + "/.quint/settings.ini"; - construct(); - establishOctaveLink(); -} - -MainWindow::~MainWindow() { -} - -void MainWindow::handleOpenFileRequest(QString fileName) { - reportStatusMessage(tr("Opening file.")); - QPixmap pixmap; - if(pixmap.load(fileName)) { - ImageViewerDockWidget *imageViewerDockWidget = new ImageViewerDockWidget(pixmap, this); - imageViewerDockWidget->setWindowTitle(fileName); - addDockWidget(Qt::RightDockWidgetArea, imageViewerDockWidget); - } else { - FileEditorDockWidget *fileEditorDockWidget = new FileEditorDockWidget(this); - fileEditorDockWidget->loadFile(fileName); - addDockWidget(Qt::RightDockWidgetArea, fileEditorDockWidget); - } -} - -void MainWindow::reportStatusMessage(QString statusMessage) { - m_statusBar->showMessage(statusMessage, 1000); -} - -void MainWindow::handleSaveWorkspaceRequest() { - QDesktopServices desktopServices; - QString selectedFile = QFileDialog::getSaveFileName(this, tr("Save Workspace"), - desktopServices.storageLocation(QDesktopServices::HomeLocation) + "/.quint/workspace"); - m_octaveTerminalDockWidget->octaveTerminal()->sendText(QString("save \'%1\'\n").arg(selectedFile)); - m_octaveTerminalDockWidget->octaveTerminal()->setFocus(); -} - -void MainWindow::handleLoadWorkspaceRequest() { - QDesktopServices desktopServices; - QString selectedFile = QFileDialog::getOpenFileName(this, tr("Load Workspace"), - desktopServices.storageLocation(QDesktopServices::HomeLocation) + "/.quint/workspace"); - m_octaveTerminalDockWidget->octaveTerminal()->sendText(QString("load \'%1\'\n").arg(selectedFile)); - m_octaveTerminalDockWidget->octaveTerminal()->setFocus(); -} - -void MainWindow::handleClearWorkspaceRequest() { - m_octaveTerminalDockWidget->octaveTerminal()->sendText("clear\n"); - m_octaveTerminalDockWidget->octaveTerminal()->setFocus(); -} - -void MainWindow::handleCommandDoubleClicked(QString command) { - m_octaveTerminalDockWidget->octaveTerminal()->sendText(command); - m_octaveTerminalDockWidget->octaveTerminal()->setFocus(); -} - -void MainWindow::closeEvent(QCloseEvent *closeEvent) { - m_isRunning = false; - reportStatusMessage(tr("Saving data and shutting down.")); - writeSettings(); - - m_octaveCallbackThread->terminate(); - m_octaveCallbackThread->wait(); - - m_octaveMainThread->terminate(); - QMainWindow::closeEvent(closeEvent); -} - -void MainWindow::readSettings() { - QSettings settings(m_settingsFile, QSettings::IniFormat); - restoreGeometry(settings.value("MainWindow/geometry").toByteArray()); - restoreState(settings.value("MainWindow/windowState").toByteArray()); -} - -void MainWindow::writeSettings() { - QSettings settings(m_settingsFile, QSettings::IniFormat); - settings.setValue("MainWindow/geometry", saveGeometry()); - settings.setValue("MainWindow/windowState", saveState()); -} - -void MainWindow::construct() { - setWindowTitle("Octave"); - setWindowIcon(QIcon("../media/quint_icon_small.png")); - QStyle *style = QApplication::style(); - resize(800, 600); - - m_octaveTerminalDockWidget = new OctaveTerminalDockWidget(this, new OctaveTerminal(this)); - m_variablesDockWidget = new VariablesDockWidget(this); - m_historyDockWidget = new HistoryDockWidget(this); - m_filesDockWidget = new FilesDockWidget(this); - m_browserDockWidget = new BrowserDockWidget(this, new BrowserWidget(this)); - m_serviceDockWidget = new BrowserDockWidget(this, new BrowserWidget(this)); - - m_browserDockWidget->setObjectName("BrowserWidget"); - m_browserDockWidget->setWindowTitle(tr("Documentation")); - m_serviceDockWidget->setObjectName("ServiceWidget"); - m_serviceDockWidget->setWindowTitle(tr("Service")); - - // This is needed, since a QMainWindow without a central widget is not supported. - setCentralWidget(new QWidget(this)); - centralWidget()->setObjectName("CentralWidget"); - centralWidget()->hide(); - - setDockOptions(QMainWindow::AllowTabbedDocks | QMainWindow::AllowNestedDocks | QMainWindow::AnimatedDocks); - - addDockWidget(Qt::RightDockWidgetArea, m_octaveTerminalDockWidget); - addDockWidget(Qt::LeftDockWidgetArea, m_variablesDockWidget); - addDockWidget(Qt::LeftDockWidgetArea, m_historyDockWidget); - addDockWidget(Qt::LeftDockWidgetArea, m_filesDockWidget); - addDockWidget(Qt::LeftDockWidgetArea, m_browserDockWidget); - addDockWidget(Qt::LeftDockWidgetArea, m_serviceDockWidget); - - // TODO: Add meaningfull toolbar items. - m_generalPurposeToolbar = new QToolBar(tr("Octave Toolbar"), this); - QAction *commandAction = new QAction(style->standardIcon(QStyle::SP_CommandLink), - "", m_generalPurposeToolbar); - QAction *computerAction = new QAction(style->standardIcon(QStyle::SP_ComputerIcon), - "", m_generalPurposeToolbar); - m_generalPurposeToolbar->addAction(commandAction); - m_generalPurposeToolbar->addAction(computerAction); - addToolBar(m_generalPurposeToolbar); - - // Create status bar. - - m_statusBar = new QStatusBar(this); - setStatusBar(m_statusBar); - - readSettings(); - - connect(m_filesDockWidget, SIGNAL(openFile(QString)), this, SLOT(handleOpenFileRequest(QString))); - connect(m_historyDockWidget, SIGNAL(information(QString)), this, SLOT(reportStatusMessage(QString))); - connect(m_historyDockWidget, SIGNAL(commandDoubleClicked(QString)), this, SLOT(handleCommandDoubleClicked(QString))); - connect(m_variablesDockWidget, SIGNAL(saveWorkspace()), this, SLOT(handleSaveWorkspaceRequest())); - connect(m_variablesDockWidget, SIGNAL(loadWorkspace()), this, SLOT(handleLoadWorkspaceRequest())); - connect(m_variablesDockWidget, SIGNAL(clearWorkspace()), this, SLOT(handleClearWorkspaceRequest())); - - m_browserDockWidget->browserWidget()->load(QUrl("http://www.gnu.org/software/octave/doc/interpreter/")); - m_serviceDockWidget->browserWidget()->load(QUrl("http://powerup.ath.cx/bugtracker")); - -} - -void MainWindow::establishOctaveLink() { - m_octaveMainThread = new OctaveMainThread(this); - m_octaveMainThread->start(); - - m_octaveCallbackThread = new OctaveCallbackThread(this, this); - m_octaveCallbackThread->start(); - - command_editor::add_event_hook(OctaveLink::readlineEventHook); - - int fdm, fds; - if(openpty(&fdm, &fds, 0, 0, 0) < 0) { - assert(0); - } - dup2 (fds, 0); - dup2 (fds, 1); - dup2 (fds, 2); - m_octaveTerminalDockWidget->octaveTerminal()->openTeletype(fdm); - reportStatusMessage(tr("Established link to Octave.")); -}
deleted file mode 100644 --- a/gui//src/MainWindow.h +++ /dev/null @@ -1,180 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include <QtGui/QMainWindow> -#include <QThread> -#include <QTabWidget> -#include <QMdiArea> -#include <QStatusBar> -#include <QToolBar> -#include <QQueue> -#include "OctaveTerminal.h" -#include "OctaveLink.h" -#include "VariablesDockWidget.h" -#include "HistoryDockWidget.h" -#include "FilesDockWidget.h" -#include "SimpleEditor.h" -#include "BrowserWidget.h" - -// Octave includes -#undef PACKAGE_BUGREPORT -#undef PACKAGE_NAME -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION -#undef PACKAGE_URL -#include "octave/config.h" - -#include "octave/debug.h" -#include "octave/octave.h" -#include "octave/symtab.h" -#include "octave/parse.h" -#include "octave/unwind-prot.h" -#include "octave/toplev.h" -#include "octave/load-path.h" -#include "octave/error.h" -#include "octave/quit.h" -#include "octave/variables.h" -#include "octave/sighandlers.h" -#include "octave/sysdep.h" -#include "octave/str-vec.h" -#include "octave/cmd-hist.h" -#include "octave/cmd-edit.h" -#include "octave/oct-env.h" -#include "octave/symtab.h" -#include "cmd-edit.h" - -typedef struct yy_buffer_state *YY_BUFFER_STATE; -extern OCTINTERP_API YY_BUFFER_STATE create_buffer (FILE *f); -extern OCTINTERP_API void switch_to_buffer (YY_BUFFER_STATE buf); -extern OCTINTERP_API FILE *get_input_from_stdin (void); - -// System -#include <termios.h> -#include <sys/types.h> -#include <signal.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <iostream> -#include <vector> -#include "pty.h" - -class OctaveMainThread; -class OctaveCallbackThread; - -/** - * \class MainWindow - * - * Represents the main window. - */ -class MainWindow : public QMainWindow { - Q_OBJECT -public: - MainWindow(QWidget *parent = 0); - ~MainWindow(); - - bool isRunning() { return m_isRunning; } - OctaveTerminal *octaveTerminal() { return m_octaveTerminalDockWidget->octaveTerminal(); } - VariablesDockWidget *variablesDockWidget() { return m_variablesDockWidget; } - HistoryDockWidget *historyDockWidget() { return m_historyDockWidget; } - FilesDockWidget *filesDockWidget() { return m_filesDockWidget; } - -public slots: - void handleOpenFileRequest(QString fileName); - void reportStatusMessage(QString statusMessage); - void handleSaveWorkspaceRequest(); - void handleLoadWorkspaceRequest(); - void handleClearWorkspaceRequest(); - void handleCommandDoubleClicked(QString command); - -protected: - void closeEvent(QCloseEvent *closeEvent); - void readSettings(); - void writeSettings(); - -private: - void construct(); - void establishOctaveLink(); - OctaveTerminalDockWidget *m_octaveTerminalDockWidget; - VariablesDockWidget *m_variablesDockWidget; - HistoryDockWidget *m_historyDockWidget; - FilesDockWidget *m_filesDockWidget; - BrowserDockWidget *m_browserDockWidget; - BrowserDockWidget *m_serviceDockWidget; - - QStatusBar *m_statusBar; - QToolBar *m_generalPurposeToolbar; - QString m_settingsFile; - - // Threads for running octave and managing the data interaction. - OctaveMainThread *m_octaveMainThread; - OctaveCallbackThread *m_octaveCallbackThread; - bool m_isRunning; -}; - -class OctaveMainThread : public QThread { - Q_OBJECT -public: - OctaveMainThread(QObject *parent) - : QThread(parent) { - } -protected: - void run() { - int argc = 3; - const char* argv[] = {"octave", "--interactive", "--line-editing"}; - octave_main(argc, (char**)argv, 1); - main_loop(); - clean_up_and_exit(0); - } -}; - -class OctaveCallbackThread : public QThread { - Q_OBJECT -public: - OctaveCallbackThread(QObject *parent, MainWindow *mainWindow) - : QThread(parent), - m_mainWindow(mainWindow) { - } - -protected: - void run() { - while(m_mainWindow->isRunning()) { - - // Get a full variable list. - QList<SymbolRecord> symbolTable = OctaveLink::instance()->currentSymbolTable(); - if(symbolTable.size()) { - m_mainWindow->variablesDockWidget()->setVariablesList(symbolTable); - } - - // Collect history list. - string_vector historyList = OctaveLink::instance()->currentHistory(); - if(historyList.length()) { - m_mainWindow->historyDockWidget()->updateHistory(historyList); - } - - usleep(100000); - } - } -private: - MainWindow *m_mainWindow; -}; - -#endif // MAINWINDOW_H
deleted file mode 100644 --- a/gui//src/NumberedCodeEdit.cpp +++ /dev/null @@ -1,591 +0,0 @@ -/* This file is part of the KDE libraries - Copyright (C) 2005, 2006 KJSEmbed Authors - See included AUTHORS file. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ -#include <QTextDocument> -#include <QTextBlock> -#include <QHBoxLayout> -#include <QScrollBar> -#include <QPainter> -#include <QAbstractTextDocumentLayout> -#include <QToolTip> -#include <QTextStream> -#include <QProcess> -#include <QRegExp> -#include <QMessageBox> -#include <QFileInfo> - -#include "NumberedCodeEdit.h" -#include "config.h" - -NumberBar::NumberBar( QWidget *parent ) - : QWidget( parent ), edit(0), currentLine(-1), bugLine(-1) -{ - // Make room for 4 digits and the breakpoint icon - setFixedWidth( fontMetrics().width( QString("0000") + 10 + 32 ) ); - stopMarker = QPixmap();// QString(ICON_PATH) + "/stop.png" ); - currentMarker = QPixmap();// QString(ICON_PATH) + "/bookmark.png" ); - bugMarker = QPixmap();// QString(ICON_PATH) + "/bug.png" ); -} - -NumberBar::~NumberBar() -{ -} - -void NumberBar::setCurrentLine( int lineno ) -{ - currentLine = lineno; - update(); -} - -void NumberBar::setBugLine( int lineno ) -{ - bugLine = lineno; -} - -void NumberBar::toggleBreakpoint( int lineno ) -{ - if(lineno > 0) - { - int i = breakpoints.indexOf(lineno); - - if(i > -1) - breakpoints.removeAt(i); - else - breakpoints.push_back(lineno); - } - update(); -} - -void NumberBar::setTextEdit( SimpleEditor *edit ) -{ - this->edit = edit; - setFixedWidth( edit->fontMetrics().width( QString("0000") + 10 + 32 ) ); - connect( edit->document()->documentLayout(), SIGNAL( update(const QRectF &) ), - this, SLOT( update() ) ); - connect( edit->verticalScrollBar(), SIGNAL(valueChanged(int) ), - this, SLOT( update() ) ); -} - -void NumberBar::paintEvent( QPaintEvent * ) -{ - QVector<qreal> lines_list; - int first_line_no; - edit->publicBlockBoundingRectList(lines_list, first_line_no); - - const QFontMetrics fm = edit->fontMetrics(); - const int ascent = fontMetrics().ascent(); // height = ascent + descent - - QPainter p(this); - p.setPen(palette().windowText().color()); - - bugRect = QRect(); - stopRect = QRect(); - currentRect = QRect(); - - int position_y; - int lineCount; - - const int lines_list_size=lines_list.size(); - - for(int i=0;i<lines_list_size;i++) - { - position_y=qRound( lines_list[i] ); - lineCount=first_line_no+i; - - const QString txt = QString::number( lineCount ); - p.drawText( width() - fm.width(txt)- 2, position_y+ascent, txt ); - - // Bug marker - if ( bugLine == lineCount ) { - p.drawPixmap( 1, position_y, bugMarker ); - bugRect = QRect( 19, position_y, bugMarker.width(), bugMarker.height() ); - } - - // Stop marker - if ( breakpoints.contains(lineCount) ) { - p.drawPixmap( 1, position_y, stopMarker ); - stopRect = QRect( 1, position_y,stopMarker.width(), stopMarker.height() ); - } - - // Current line marker - if ( currentLine == lineCount ) { - p.drawPixmap( 1, position_y, currentMarker ); - currentRect = QRect( 1, position_y, currentMarker.width(), currentMarker.height() ); - } - } - - /* - - int contentsY = edit->verticalScrollBar()->value(); - qreal pageBottom = contentsY + edit->viewport()->height(); - const QFontMetrics fm = fontMetrics(); - const int ascent = fontMetrics().ascent() + 1; // height = ascent + descent + 1 - int lineCount = 1; - - QPainter p(this); - p.setPen(palette().windowText().color()); - - bugRect = QRect(); - stopRect = QRect(); - currentRect = QRect(); - - for ( QTextBlock block = edit->document()->begin(); - block.isValid(); block = block.next(), ++lineCount ) { - - const QRectF boundingRect = edit->publicBlockBoundingRect( block ); - - QPointF position = boundingRect.topLeft(); - if ( position.y() + boundingRect.height() < contentsY ) - continue; - if ( position.y() > pageBottom ) - break; - - const QString txt = QString::number( lineCount ); - p.drawText( width() - fm.width(txt), qRound( position.y() ) - contentsY + ascent, txt ); - - // Bug marker - if ( bugLine == lineCount ) { - p.drawPixmap( 1, qRound( position.y() ) - contentsY, bugMarker ); - bugRect = QRect( 1, qRound( position.y() ) - contentsY, bugMarker.width(), bugMarker.height() ); - } - - // Stop marker - if ( breakpoints.contains(lineCount) ) { - p.drawPixmap( 19, qRound( position.y() ) - contentsY, stopMarker ); - stopRect = QRect( 19, qRound( position.y() ) - contentsY, stopMarker.width(), stopMarker.height() ); - } - - // Current line marker - if ( currentLine == lineCount ) { - p.drawPixmap( 19, qRound( position.y() ) - contentsY, currentMarker ); - currentRect = QRect( 19, qRound( position.y() ) - contentsY, currentMarker.width(), currentMarker.height() ); - } - } - */ -} - -bool NumberBar::event( QEvent *event ) -{ - if ( event->type() == QEvent::ToolTip ) { - QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); - - if ( stopRect.contains( helpEvent->pos() ) ) { - QToolTip::showText( helpEvent->globalPos(), tr("Stop Here")); - } - else if ( currentRect.contains( helpEvent->pos() ) ) { - QToolTip::showText( helpEvent->globalPos(), tr("Current Line")); - } - else if ( bugRect.contains( helpEvent->pos() ) ) { - QToolTip::showText( helpEvent->globalPos(), tr("Error Line" )); - } - } - - return QWidget::event(event); -} - -QList<int> *NumberBar::getBreakpoints() -{ - return &breakpoints; -} - - - -NumberedCodeEdit::NumberedCodeEdit( QWidget *parent, SimpleEditor *textEdit ) - : QFrame( parent ) -{ - setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); - setLineWidth( 2 ); - - view=textEdit; - view->installEventFilter( this ); - - connect( view->document(), SIGNAL(contentsChange(int,int,int)), this, SLOT(textChanged(int,int,int)) ); - - connect( view, SIGNAL(cursorPositionChanged()), this, SLOT(cursor_moved_cb()) ); - - // Setup the line number pane - - numbers = new NumberBar( this ); - numbers->setTextEdit( view ); - //numbers=NULL; - - - vbox = new QVBoxLayout(this); - vbox->setSpacing( 0 ); - vbox->setMargin( 0 ); - - hbox = new QHBoxLayout; - vbox->addLayout(hbox); - - hbox->setSpacing( 0 ); - hbox->setMargin( 0 ); - hbox->addWidget( numbers ); - hbox->addWidget( view ); - - textModifiedOk=false; - - QHBoxLayout *messages_layout= new QHBoxLayout; - vbox->addLayout(messages_layout); - messages_layout->setSpacing( 0 ); - messages_layout->setMargin( 0 ); - } - - -NumberedCodeEdit::~NumberedCodeEdit() -{ - hide(); - //printf("Borrado ntv\n"); -} - -void NumberedCodeEdit::setCurrentLine( int lineno ) -{ - currentLine = lineno; - if(numbers!=NULL) numbers->setCurrentLine( lineno ); - - //Move cursor to lineno - if(lineno>-1) - { - QTextCursor cursor=textEdit()->textCursor(); - - cursor.movePosition(QTextCursor::Start); - - for(int i=1;i<lineno;i++) - cursor.movePosition(QTextCursor::NextBlock); - - textEdit()->setTextCursor(cursor); - } - - textChanged( 0, 0, 1 ); -} - -void NumberedCodeEdit::toggleBreakpoint( int lineno ) -{ - if(numbers!=NULL) numbers->toggleBreakpoint( lineno ); -} - -void NumberedCodeEdit::setBugLine( int lineno ) -{ - if(numbers!=NULL) numbers->setBugLine( lineno ); -} - -void NumberedCodeEdit::textChanged( int /*pos*/, int removed, int added ) -{ - //Q_UNUSED( pos ); - - if ( removed == 0 && added == 0 ) - return; - - //QTextBlock block = highlight.block(); - //QTextBlock block = view->document()->begin(); - //QTextBlockFormat fmt = block.blockFormat(); - //QColor bg = view->palette().base().color(); - //fmt.setBackground( bg ); - //highlight.setBlockFormat( fmt ); - /* - QTextBlockFormat fmt; - - int lineCount = 1; - for ( QTextBlock block = view->document()->begin(); - block.isValid() && block!=view->document()->end(); block = block.next(), ++lineCount ) { - - if ( lineCount == currentLine ) - { - fmt = block.blockFormat(); - QColor bg = view->palette().highlight().color(); - fmt.setBackground( bg ); - - highlight = QTextCursor( block ); - highlight.movePosition( QTextCursor::EndOfBlock, QTextCursor::KeepAnchor ); - highlight.setBlockFormat( fmt ); - - break; - } - } - */ - - if( !textModifiedOk && view->document()->isModified() ) - { - textModifiedOk=true; - emit textModified(); - } -} - -bool NumberedCodeEdit::eventFilter( QObject *obj, QEvent *event ) -{ - if ( obj != view ) - return QFrame::eventFilter(obj, event); - - if ( event->type() == QEvent::ToolTip ) { - QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); - - QTextCursor cursor = view->cursorForPosition( helpEvent->pos() ); - cursor.movePosition( QTextCursor::StartOfWord, QTextCursor::MoveAnchor ); - cursor.movePosition( QTextCursor::EndOfWord, QTextCursor::KeepAnchor ); - - QString word = cursor.selectedText(); - emit mouseHover( word ); - emit mouseHover( helpEvent->pos(), word ); - - // QToolTip::showText( helpEvent->globalPos(), word ); // For testing - } - - return false; -} - -QList<int> *NumberedCodeEdit::getBreakpoints() -{ - QList<int> *br=NULL; - if(numbers!=NULL) br=numbers->getBreakpoints(); - return br; -} - -void NumberedCodeEdit::open(QString path) -{ - FILE *fl; - - fl = fopen(path.toLocal8Bit().constData(), "rt"); - if(fl) - { - fclose(fl); - filePath = path; - - textEdit()->load(path); - - textModifiedOk=false; - textEdit()->document()->setModified(false); - }else{ - throw path; - } -} - -bool NumberedCodeEdit::save(QString path) -{ - FILE *fl; - - if(path.isEmpty()) path = filePath; - QRegExp re("[A-Za-z_][A-Za-z0-9_]*\\.m"); - - if( ! re.exactMatch( QFileInfo(path).fileName() ) ) - { - QMessageBox msgBox; - msgBox.setText( tr("This file name is not valid.") ); - msgBox.setInformativeText(tr("Octave doesn't understand this file name:\n")+path+tr("\nPlease, change it.\n Do you want to save your changes?")); - msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel); - msgBox.setDefaultButton(QMessageBox::Save); - int ret = msgBox.exec(); - switch (ret) - { - case QMessageBox::Save: - // Save was clicked - break; - case QMessageBox::Cancel: - // Cancel was clicked - return false; - break; - default: - // should never be reached - break; - } - } - - - fl = fopen(path.toLocal8Bit().constData(), "wt"); - if(fl) - { - filePath = path; - QTextStream *stream = new QTextStream(fl); - (*stream) << textEdit()->document()->toPlainText(); - delete stream; - fclose(fl); - textModifiedOk=false; - view->document()->setModified(false); - }else{ - return false; - } - - return true; -} - -QString NumberedCodeEdit::path() -{ - return filePath; -} - -void NumberedCodeEdit::setPath(QString path) -{ - filePath=path; - textEdit()->setFile(path); -} - -void NumberedCodeEdit::setModified(bool modify) -{ - textModifiedOk=modify; -} - -bool NumberedCodeEdit::modified() -{ - return textModifiedOk; -} - -void NumberedCodeEdit::cursor_moved_cb() -{ - QTextCursor cursor=view->textCursor(); - QTextBlock actual_block=cursor.block(); - int lineCount=1; - QTextBlock block = view->document()->begin(); - - for ( ;block.isValid() && actual_block!=block; block = block.next()) lineCount++ ; -} - -static QString startLineInsertText(QString str, QString textToInsert) -{ - str.replace(QChar(0x2029), "\n"); - //printf("str=%s\n", str.toLocal8Bit().data() ); - - QStringList list = str.split("\n"); - - for(int i=0;i<list.size();i++) - { - QString s=list[i]; - - int x; - - for(x=0;x<s.size();x++) - { - if( s.at(x)!=' ' && s.at(x)!='\t' ) break; - } - - QString s1=s.left(x); - QString s2=s.right(s.size()-x); - list[i]=s1+textToInsert+s2; - } - - return list.join("\n"); -} - -static QString startLineRemoveText(QString str, QStringList textToRemove) -{ - str.replace(QChar(0x2029), "\n"); - - QStringList list = str.split("\n"); - - for(int i=0;i<list.size();i++) - { - QString s=list[i]; - - int x; - - for(x=0;x<s.size();x++) - { - if( s.at(x)!=' ' && s.at(x)!='\t' ) break; - } - - QString s1=s.left(x); - QString s2=s.right(s.size()-x); - - for(int k=0;k<textToRemove.size();k++) - { - if(s1.endsWith(textToRemove[k])) - { - s1=s1.left(s1.size()-textToRemove[k].size()); - break; - } - else if(s2.startsWith(textToRemove[k])) - { - s2=s2.right(s2.size()-textToRemove[k].size()); - break; - } - } - - //printf("s1=%s s2=%s \n", s1.toLocal8Bit().data(), s2.toLocal8Bit().data()); - list[i]=s1+s2; - } - - return list.join("\n"); -} - -void NumberedCodeEdit::indent() -{ - QTextCursor cursor(textEdit()->textCursor()); - - if( !cursor.hasSelection() ) return; - - QString str=cursor.selectedText(); - - str=startLineInsertText(str, "\t"); - - cursor.insertText(str); - cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); - textEdit()->setTextCursor(cursor); -} - -void NumberedCodeEdit::unindent() -{ - //QTextDocument *doc=textEdit()->document(); - - QTextCursor cursor(textEdit()->textCursor()); - - if( !cursor.hasSelection() ) return; - - QString str=cursor.selectedText(); - - QStringList textToRemove; - textToRemove << "\t" << " "; - str=startLineRemoveText(str, textToRemove); - - cursor.insertText(str); - cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); - textEdit()->setTextCursor(cursor); -} - -void NumberedCodeEdit::comment() -{ - //QTextDocument *doc=textEdit()->document(); - - QTextCursor cursor(textEdit()->textCursor()); - - if( !cursor.hasSelection() ) return; - - QString str=cursor.selectedText(); - - str=startLineInsertText(str, "%"); - - cursor.insertText(str); - cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); - textEdit()->setTextCursor(cursor); -} - -void NumberedCodeEdit::uncomment() -{ - //QTextDocument *doc=textEdit()->document(); - - QTextCursor cursor(textEdit()->textCursor()); - - if( !cursor.hasSelection() ) return; - - QString str=cursor.selectedText(); - - QStringList textToRemove; - textToRemove << "%" << "#"; - str=startLineRemoveText(str, textToRemove); - - cursor.insertText(str); - cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); - textEdit()->setTextCursor(cursor); -}
deleted file mode 100644 --- a/gui//src/NumberedCodeEdit.h +++ /dev/null @@ -1,169 +0,0 @@ -/* This file is part of the KDE libraries - Copyright (C) 2005, 2006 KJSEmbed Authors - See included AUTHORS file. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ -// -*- c++ -*- -#ifndef NUMBERED_TEXT_VIEW_H -#define NUMBERED_TEXT_VIEW_H - -#include <QFrame> -#include <QPixmap> -#include <QTextCursor> -#include <QLabel> -#include <QVBoxLayout> -#include <QHBoxLayout> -#include "SimpleEditor.h" - -class SimpleEditor; -class QHBoxLayout; - -/** - * @internal Used to display the numbers. - */ -class NumberBar : public QWidget -{ - Q_OBJECT - -public: - NumberBar( QWidget *parent ); - ~NumberBar(); - - void setCurrentLine( int lineno ); - void setBugLine( int lineno ); - void toggleBreakpoint( int lineno ); - QList<int> *getBreakpoints(); - - void setTextEdit( SimpleEditor *edit ); - void paintEvent( QPaintEvent *ev ); - -protected: - bool event( QEvent *ev ); - -private: - SimpleEditor *edit; - QPixmap stopMarker; - QPixmap currentMarker; - QPixmap bugMarker; - QList<int> breakpoints; - int currentLine; - int bugLine; - QRect stopRect; - QRect currentRect; - QRect bugRect; -}; - -/** - * Displays a CodeEdit with line numbers. - */ -class NumberedCodeEdit : public QFrame -{ - Q_OBJECT - -public: - NumberedCodeEdit( QWidget *parent = 0 , SimpleEditor *textEdit=new SimpleEditor() ); - ~NumberedCodeEdit(); - - QList<int> *getBreakpoints(); - - void open(QString path); - - /**Saves file to path. @return true if all is OK.*/ - bool save(QString path = QString()); - - QString path(); - void setPath(QString path); - - bool modified(); - void setModified(bool modify); - - /** Returns the CodeEdit of the main view. */ - SimpleEditor *textEdit() const { return view; } - - /** - * Sets the line that should have the current line indicator. - * A value of -1 indicates no line should show the indicator. - */ - void setCurrentLine( int lineno ); - - /** - * Toggle breakpoint - */ - void toggleBreakpoint( int lineno ); - - /** - * Sets the line that should have the bug line indicator. - * A value of -1 indicates no line should show the indicator. - */ - void setBugLine( int lineno ); - - /** @internal Used to get tooltip events from the view for the hover signal. */ - bool eventFilter( QObject *obj, QEvent *event ); - - /**Indent selected text.*/ - void indent(); - - /**UnIndent selected text.*/ - void unindent(); - - /**Comment selected text.*/ - void comment(); - - /**UnComment selected text.*/ - void uncomment(); - -signals: - /** - * Emitted when the mouse is hovered over the text edit component. - * @param word The word under the mouse pointer - */ - void mouseHover( const QString &word ); - - /** - * Emitted when the mouse is hovered over the text edit component. - * @param pos The position of the mouse pointer. - * @param word The word under the mouse pointer - */ - void mouseHover( const QPoint &pos, const QString &word ); - - /** - * Emitted when file is changed. - */ - void textModified(); - -protected slots: - /** @internal Used to update the highlight on the current line. */ - void textChanged( int pos, int added, int removed ); -public slots: - void cursor_moved_cb(); - -private: - QString filePath; - QLabel *line_column_label; - SimpleEditor *view; - NumberBar *numbers; - QHBoxLayout *hbox; - QVBoxLayout *vbox; - int currentLine; - QTextCursor highlight; - bool textModifiedOk; -}; - - -#endif // NUMBERED_TEXT_VIEW_H - -
deleted file mode 100644 --- a/gui//src/OctaveLink.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - -Copyright (C) 2007,2008,2009 John P. Swensen - -Octave 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, or (at your option) any -later version. - -Octave 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 Octave; see the file COPYING. If not, write to the Free -Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. - -*/ - -// Born July 13, 2007. - -#include "OctaveLink.h" - -OctaveLink OctaveLink::m_singleton; - - -OctaveLink::OctaveLink() - : QObject(), - m_previousHistoryLength(0) { - m_symbolTableSemaphore = new QSemaphore(1); - m_historySemaphore = new QSemaphore(1); -} - -OctaveLink::~OctaveLink() { -} - -int OctaveLink::readlineEventHook() { - OctaveLink::instance()->processOctaveServerData(); - return 0; -} - -QString OctaveLink::octaveValueAsQString(OctaveValue octaveValue) { - // Convert single qouted string. - if(octaveValue.is_sq_string()) { - return QString("\'%1\'").arg(octaveValue.string_value().c_str()); - - // Convert double qouted string. - } else if(octaveValue.is_dq_string()) { - return QString("\"%1\"").arg(octaveValue.string_value().c_str()); - - // Convert real scalar. - } else if(octaveValue.is_real_scalar()) { - return QString("%1").arg(octaveValue.scalar_value()); - - // Convert complex scalar. - } else if(octaveValue.is_complex_scalar()) { - return QString("%1 + %2i").arg(octaveValue.scalar_value()).arg(octaveValue.complex_value().imag()); - - // Convert range. - } else if(octaveValue.is_range()) { - return QString("%1 : %2 : %3").arg(octaveValue.range_value().base()) - .arg(octaveValue.range_value().inc()) - .arg(octaveValue.range_value().limit()); - - // Convert real matrix. - } else if(octaveValue.is_real_matrix()) { - // TODO: Convert real matrix into a string. - return QString("{matrix}"); - - // Convert complex matrix. - } else if(octaveValue.is_complex_matrix()) { - // TODO: Convert complex matrix into a string. - return QString("{complex matrix}"); - - // If everything else does not fit, we could not recognize the type. - } else { - return QString("<Type not recognized>"); - } -} - -void OctaveLink::fetchSymbolTable() { - m_symbolTableSemaphore->acquire(); - m_symbolTableBuffer.clear(); - std::list<SymbolRecord> allVariables = symbol_table::all_variables(); - std::list<SymbolRecord>::iterator iterator; - for(iterator = allVariables.begin(); iterator != allVariables.end(); iterator++) - m_symbolTableBuffer.append(*iterator); - m_symbolTableSemaphore->release(); - emit symbolTableChanged(); -} - - -void OctaveLink::fetchHistory() { - int currentLen = command_history::length(); - if(currentLen != m_previousHistoryLength) { - m_historySemaphore->acquire(); - for(int i = m_previousHistoryLength; i < currentLen; i++) { - m_historyBuffer.append(command_history::get_entry(i)); - } - m_historySemaphore->release(); - m_previousHistoryLength = currentLen; - emit historyChanged(); - } -} - -QList<SymbolRecord> OctaveLink::currentSymbolTable() { - QList<SymbolRecord> m_symbolTableCopy; - - // Generate a deep copy of the current symbol table. - m_symbolTableSemaphore->acquire(); - foreach(SymbolRecord symbolRecord, m_symbolTableBuffer) - m_symbolTableCopy.append(symbolRecord); - m_symbolTableSemaphore->release(); - - return m_symbolTableCopy; -} - -string_vector OctaveLink::currentHistory() { - m_historySemaphore->acquire(); - string_vector retval(m_historyBuffer); - m_historyBuffer = string_vector(); - m_historySemaphore->release(); - return retval; -} - -void OctaveLink::processOctaveServerData() { - fetchSymbolTable(); - fetchHistory(); -} -
deleted file mode 100644 --- a/gui//src/OctaveLink.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * - * Copyright (C) 2007, 2008, 2009 John P. Swensen - * - * This file is as a part of OctaveDE. - * - * Octave 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, or (at your option) any - * later version. - * - * Octave 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 Octave; see the file COPYING. If not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * */ -#ifndef OCTAVELINK_H -#define OCTAVELINK_H - -// Octave includes -#undef PACKAGE_BUGREPORT -#undef PACKAGE_NAME -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION -#undef PACKAGE_URL -#include <octave/config.h> -#include "octave/cmd-edit.h" -#include "octave/error.h" -#include "octave/file-io.h" -#include "octave/input.h" -#include "octave/lex.h" -#include "octave/load-path.h" -#include "octave/octave.h" -#include "octave/oct-hist.h" -#include "octave/oct-map.h" -#include "octave/oct-obj.h" -#include "octave/ops.h" -#include "octave/ov.h" -#include "octave/ov-usr-fcn.h" -#include "octave/symtab.h" -#include "octave/pt.h" -#include "octave/pt-eval.h" -#include "octave/config.h" -#include "octave/Range.h" -#include "octave/toplev.h" -#include "octave/procstream.h" -#include "octave/sighandlers.h" -#include "octave/debug.h" -#include "octave/sysdep.h" -#include "octave/ov.h" -#include "octave/unwind-prot.h" -#include "octave/utils.h" -#include "octave/variables.h" - -// Standard includes -#include <iostream> -#include <string> -#include <vector> -#include <readline/readline.h> - -// Qt includes -#include <QMutexLocker> -#include <QMutex> -#include <QFileInfo> -#include <QList> -#include <QString> -#include <QVector> -#include <QSemaphore> -#include <QObject> - -typedef symbol_table::symbol_record SymbolRecord; -typedef octave_value OctaveValue; - -/** - * \class OctaveLink - * Manages a link to an octave instance. - */ -class OctaveLink : QObject -{ - Q_OBJECT -public: - static OctaveLink *instance() { return &m_singleton; } - static int readlineEventHook(void); - static QString octaveValueAsQString(OctaveValue octaveValue); - - /** - * Returns a copy of the current symbol table buffer. - * \return Copy of the current symbol table buffer. - */ - QList<SymbolRecord> currentSymbolTable(); - - /** - * Returns a copy of the current history buffer. - * \return Copy of the current history buffer. - */ - string_vector currentHistory(); - - void processOctaveServerData(); - - /** - * Updates the current symbol table with new data - * from octave. - */ - void fetchSymbolTable(); - - /** - * Updates the current history buffer with new data - * from octave. - */ - void fetchHistory(); - -signals: - void symbolTableChanged(); - void historyChanged(); - -private: - OctaveLink(); - ~OctaveLink(); - - /** Variable related member variables. */ - QSemaphore *m_symbolTableSemaphore; - QList<SymbolRecord> m_symbolTableBuffer; - - /** History related member variables. */ - QSemaphore *m_historySemaphore; - string_vector m_historyBuffer; - int m_previousHistoryLength; - - static OctaveLink m_singleton; -}; -#endif // OCTAVELINK_H -
deleted file mode 100644 --- a/gui//src/OctaveTerminal.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include "OctaveTerminal.h" -#include <QHBoxLayout> -#include <QVBoxLayout> -#include <QStringListModel> -#include <QStringList> - -OctaveTerminalDockWidget::OctaveTerminalDockWidget(QWidget *parent, OctaveTerminal *octaveTerminal) - : QDockWidget(parent) { - setObjectName("OctaveTerminalDockWidget"); - setWindowTitle(tr("Octave terminal")); - m_octaveTerminal = octaveTerminal; - setWidget(m_octaveTerminal); -} - -OctaveTerminalDockWidget::~OctaveTerminalDockWidget() { -} - -OctaveTerminal *OctaveTerminalDockWidget::octaveTerminal() { - return m_octaveTerminal; -} - -OctaveTerminal::OctaveTerminal(QWidget *parent) - : QTerminalWidget(0, parent) { - construct(); -} - -OctaveTerminal::~OctaveTerminal() { -} - -void OctaveTerminal::construct() { - setScrollBarPosition(QTerminalWidget::ScrollBarRight); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); -} -
deleted file mode 100644 --- a/gui//src/OctaveTerminal.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef OCTAVETERMINAL_H -#define OCTAVETERMINAL_H - -#include "QTerminalWidget.h" -#include <QDockWidget> - -class OctaveTerminal; -class OctaveTerminalDockWidget : public QDockWidget { -public: - OctaveTerminalDockWidget(QWidget *parent, OctaveTerminal *octaveTerminal); - ~OctaveTerminalDockWidget(); - - OctaveTerminal *octaveTerminal(); - -private: - OctaveTerminal *m_octaveTerminal; -}; - -class OctaveTerminal : public QTerminalWidget { - Q_OBJECT -public: - OctaveTerminal(QWidget *parent = 0); - ~OctaveTerminal(); - -private: - void construct(); -}; -#endif // OCTAVETERMINAL_H
deleted file mode 100644 --- a/gui//src/ProcessInfo.cpp +++ /dev/null @@ -1,1054 +0,0 @@ -/* - Copyright 2007-2008 by Robert Knight <robertknight@gmail.countm> - - This program 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 program 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. -*/ - -// Own -#include "ProcessInfo.h" - -// Unix -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <unistd.h> -#include <pwd.h> - -// Qt -#include <QtCore/QDir> -#include <QtCore/QFileInfo> -#include <QtCore/QRegExp> -#include <QtCore/QTextStream> -#include <QtCore/QStringList> -#include <QtCore/QSet> - -// KDE -#include "konsole_export.h" - -#if defined(Q_OS_MAC) -#include <sys/sysctl.h> -#include <libproc.h> -#ifdef HAVE_SYS_PROC_INFO_H -#include <sys/proc_info.h> -#endif -#ifdef HAVE_SYS_PROC_H -#include <sys/proc.h> -#endif -//#include <kde_file.h> -#define KDE_struct_stat struct stat -#define KDE_stat ::stat -#endif - -#if defined(Q_OS_FREEBSD) -#include <sys/sysctl.h> //krazy:exclude=includes -#include <sys/types.h> -#include <sys/user.h> -#include <sys/syslimits.h> -#include <libutil.h> -#endif - -ProcessInfo::ProcessInfo(int pid , bool enableEnvironmentRead) - : _fields( ARGUMENTS | ENVIRONMENT ) // arguments and environments - // are currently always valid, - // they just return an empty - // vector / map respectively - // if no arguments - // or environment bindings - // have been explicitly set - , _enableEnvironmentRead(enableEnvironmentRead) - , _pid(pid) - , _parentPid(0) - , _foregroundPid(0) - , _userId(0) - , _lastError(NoError) - , _userName(QString()) - , _userHomeDir(QString()) -{ -} - -ProcessInfo::Error ProcessInfo::error() const { return _lastError; } -void ProcessInfo::setError(Error error) { _lastError = error; } - -void ProcessInfo::update() -{ - readProcessInfo(_pid,_enableEnvironmentRead); -} - -QString ProcessInfo::validCurrentDir() const -{ - bool ok = false; - - // read current dir, if an error occurs try the parent as the next - // best option - int currentPid = parentPid(&ok); - QString dir = currentDir(&ok); - while ( !ok && currentPid != 0 ) - { - ProcessInfo* current = ProcessInfo::newInstance(currentPid); - current->update(); - currentPid = current->parentPid(&ok); - dir = current->currentDir(&ok); - delete current; - } - - return dir; -} - -QString ProcessInfo::format(const QString& input) const -{ - bool ok = false; - - QString output(input); - - // search for and replace known marker - output.replace("%u",userName()); - output.replace("%n",name(&ok)); - output.replace("%c",formatCommand(name(&ok),arguments(&ok),ShortCommandFormat)); - output.replace("%C",formatCommand(name(&ok),arguments(&ok),LongCommandFormat)); - - QString dir = validCurrentDir(); - if (output.contains("%D")) - { - QString homeDir = userHomeDir(); - QString tempDir = dir; - // Change User's Home Dir w/ ~ only at the beginning - if (tempDir.startsWith(homeDir)) - { - tempDir.remove(0, homeDir.length()); - tempDir.prepend('~'); - } - output.replace("%D", tempDir); - } - output.replace("%d", dir); - - // remove any remaining %[LETTER] sequences - // output.replace(QRegExp("%\\w"), QString()); - - return output; -} - -QString ProcessInfo::formatCommand(const QString& name, - const QVector<QString>& arguments, - CommandFormat format) const -{ - Q_UNUSED(name); - Q_UNUSED(format); - - // TODO Implement me - return QStringList(QList<QString>::fromVector(arguments)).join(" "); -} - -QVector<QString> ProcessInfo::arguments(bool* ok) const -{ - *ok = _fields & ARGUMENTS; - - return _arguments; -} - -QMap<QString,QString> ProcessInfo::environment(bool* ok) const -{ - *ok = _fields & ENVIRONMENT; - - return _environment; -} - -bool ProcessInfo::isValid() const -{ - return _fields & PROCESS_ID; -} - -int ProcessInfo::pid(bool* ok) const -{ - *ok = _fields & PROCESS_ID; - - return _pid; -} - -int ProcessInfo::parentPid(bool* ok) const -{ - *ok = _fields & PARENT_PID; - - return _parentPid; -} - -int ProcessInfo::foregroundPid(bool* ok) const -{ - *ok = _fields & FOREGROUND_PID; - - return _foregroundPid; -} - -QString ProcessInfo::name(bool* ok) const -{ - *ok = _fields & NAME; - - return _name; -} - -int ProcessInfo::userId(bool* ok) const -{ - *ok = _fields & UID; - - return _userId; -} - -QString ProcessInfo::userName() const -{ - return _userName; -} - -QString ProcessInfo::userHomeDir() const -{ - return _userHomeDir; -} - -void ProcessInfo::setPid(int pid) -{ - _pid = pid; - _fields |= PROCESS_ID; -} - -void ProcessInfo::setUserId(int uid) -{ - _userId = uid; - _fields |= UID; -} - -void ProcessInfo::setUserName(const QString& name) -{ - _userName = name; - setUserHomeDir(); -} - -void ProcessInfo::setUserHomeDir() -{ - QString usersName = userName(); - // JPS: I don't know a good QT replacement - //if (!usersName.isEmpty()) - // _userHomeDir = KUser(usersName).homeDir(); - //else - _userHomeDir = QDir::homePath(); -} - -void ProcessInfo::setParentPid(int pid) -{ - _parentPid = pid; - _fields |= PARENT_PID; -} -void ProcessInfo::setForegroundPid(int pid) -{ - _foregroundPid = pid; - _fields |= FOREGROUND_PID; -} - -QString ProcessInfo::currentDir(bool* ok) const -{ - if (ok) - *ok = _fields & CURRENT_DIR; - - return _currentDir; -} -void ProcessInfo::setCurrentDir(const QString& dir) -{ - _fields |= CURRENT_DIR; - _currentDir = dir; -} - -void ProcessInfo::setName(const QString& name) -{ - _name = name; - _fields |= NAME; -} -void ProcessInfo::addArgument(const QString& argument) -{ - _arguments << argument; -} - -void ProcessInfo::addEnvironmentBinding(const QString& name , const QString& value) -{ - _environment.insert(name,value); -} - -void ProcessInfo::setFileError( QFile::FileError error ) -{ - switch ( error ) - { - case PermissionsError: - setError( PermissionsError ); - break; - case NoError: - setError( NoError ); - break; - default: - setError( UnknownError ); - } -} - -// -// ProcessInfo::newInstance() is way at the bottom so it can see all of the -// implementations of the UnixProcessInfo abstract class. -// - -NullProcessInfo::NullProcessInfo(int pid,bool enableEnvironmentRead) - : ProcessInfo(pid,enableEnvironmentRead) -{ -} - -bool NullProcessInfo::readProcessInfo(int /*pid*/ , bool /*enableEnvironmentRead*/) -{ - return false; -} - -void NullProcessInfo::readUserName() -{ -} - -UnixProcessInfo::UnixProcessInfo(int pid,bool enableEnvironmentRead) - : ProcessInfo(pid,enableEnvironmentRead) -{ -} - -bool UnixProcessInfo::readProcessInfo(int pid , bool enableEnvironmentRead) -{ - bool ok = readProcInfo(pid); - if (ok) - { - ok |= readArguments(pid); - ok |= readCurrentDir(pid); - if ( enableEnvironmentRead ) - { - ok |= readEnvironment(pid); - } - } - return ok; -} - -void UnixProcessInfo::readUserName() -{ - bool ok = false; - int uid = userId(&ok); - if (!ok) return; - - struct passwd passwdStruct; - struct passwd *getpwResult; - char *getpwBuffer; - long getpwBufferSize; - int getpwStatus; - - getpwBufferSize = sysconf(_SC_GETPW_R_SIZE_MAX); - if (getpwBufferSize == -1) - getpwBufferSize = 16384; - - getpwBuffer = new char[getpwBufferSize]; - if (getpwBuffer == NULL) - return; - getpwStatus = getpwuid_r(uid, &passwdStruct, getpwBuffer, getpwBufferSize, &getpwResult); - if (getpwResult != NULL) - setUserName(QString(passwdStruct.pw_name)); - else - setUserName(QString()); - delete [] getpwBuffer; -} - - -class LinuxProcessInfo : public UnixProcessInfo -{ -public: - LinuxProcessInfo(int pid, bool env) : - UnixProcessInfo(pid,env) - { - } - -private: - virtual bool readProcInfo(int pid) - { - // indicies of various fields within the process status file which - // contain various information about the process - const int PARENT_PID_FIELD = 3; - const int PROCESS_NAME_FIELD = 1; - const int GROUP_PROCESS_FIELD = 7; - - QString parentPidString; - QString processNameString; - QString foregroundPidString; - QString uidLine; - QString uidString; - QStringList uidStrings; - - // For user id read process status file ( /proc/<pid>/status ) - // Can not use getuid() due to it does not work for 'su' - QFile statusInfo( QString("/proc/%1/status").arg(pid) ); - if ( statusInfo.open(QIODevice::ReadOnly) ) - { - QTextStream stream(&statusInfo); - QString statusLine; - do { - statusLine = stream.readLine(0); - if (statusLine.startsWith(QLatin1String("Uid:"))) - uidLine = statusLine; - } while (!statusLine.isNull() && uidLine.isNull()); - - uidStrings << uidLine.split('\t', QString::SkipEmptyParts); - // Must be 5 entries: 'Uid: %d %d %d %d' and - // uid string must be less than 5 chars (uint) - if (uidStrings.size() == 5) - uidString = uidStrings[1]; - if (uidString.size() > 5) - uidString.clear(); - - bool ok = false; - int uid = uidString.toInt(&ok); - if (ok) - setUserId(uid); - readUserName(); - } - else - { - setFileError( statusInfo.error() ); - return false; - } - - - // read process status file ( /proc/<pid/stat ) - // - // the expected file format is a list of fields separated by spaces, using - // parenthesies to escape fields such as the process name which may itself contain - // spaces: - // - // FIELD FIELD (FIELD WITH SPACES) FIELD FIELD - // - QFile processInfo( QString("/proc/%1/stat").arg(pid) ); - if ( processInfo.open(QIODevice::ReadOnly) ) - { - QTextStream stream(&processInfo); - QString data = stream.readAll(); - - int stack = 0; - int field = 0; - int pos = 0; - - while (pos < data.count()) - { - QChar c = data[pos]; - - if ( c == '(' ) - stack++; - else if ( c == ')' ) - stack--; - else if ( stack == 0 && c == ' ' ) - field++; - else - { - switch ( field ) - { - case PARENT_PID_FIELD: - parentPidString.append(c); - break; - case PROCESS_NAME_FIELD: - processNameString.append(c); - break; - case GROUP_PROCESS_FIELD: - foregroundPidString.append(c); - break; - } - } - - pos++; - } - } - else - { - setFileError( processInfo.error() ); - return false; - } - - // check that data was read successfully - bool ok = false; - int foregroundPid = foregroundPidString.toInt(&ok); - if (ok) - setForegroundPid(foregroundPid); - - int parentPid = parentPidString.toInt(&ok); - if (ok) - setParentPid(parentPid); - - if (!processNameString.isEmpty()) - setName(processNameString); - - // update object state - setPid(pid); - - return ok; - } - - virtual bool readArguments(int pid) - { - // read command-line arguments file found at /proc/<pid>/cmdline - // the expected format is a list of strings delimited by null characters, - // and ending in a double null character pair. - - QFile argumentsFile( QString("/proc/%1/cmdline").arg(pid) ); - if ( argumentsFile.open(QIODevice::ReadOnly) ) - { - QTextStream stream(&argumentsFile); - QString data = stream.readAll(); - - QStringList argList = data.split( QChar('\0') ); - - foreach ( const QString &entry , argList ) - { - if (!entry.isEmpty()) - addArgument(entry); - } - } - else - { - setFileError( argumentsFile.error() ); - } - - return true; - } - - virtual bool readCurrentDir(int pid) - { - QFileInfo info( QString("/proc/%1/cwd").arg(pid) ); - - const bool readable = info.isReadable(); - - if ( readable && info.isSymLink() ) - { - setCurrentDir( info.symLinkTarget() ); - return true; - } - else - { - if ( !readable ) - setError( PermissionsError ); - else - setError( UnknownError ); - - return false; - } - } - - virtual bool readEnvironment(int pid) - { - // read environment bindings file found at /proc/<pid>/environ - // the expected format is a list of KEY=VALUE strings delimited by null - // characters and ending in a double null character pair. - - QFile environmentFile( QString("/proc/%1/environ").arg(pid) ); - if ( environmentFile.open(QIODevice::ReadOnly) ) - { - QTextStream stream(&environmentFile); - QString data = stream.readAll(); - - QStringList bindingList = data.split( QChar('\0') ); - - foreach( const QString &entry , bindingList ) - { - QString name; - QString value; - - int splitPos = entry.indexOf('='); - - if ( splitPos != -1 ) - { - name = entry.mid(0,splitPos); - value = entry.mid(splitPos+1,-1); - - addEnvironmentBinding(name,value); - } - } - } - else - { - setFileError( environmentFile.error() ); - } - - return true; - } -} ; - -#if defined(Q_OS_FREEBSD) -class FreeBSDProcessInfo : public UnixProcessInfo -{ -public: - FreeBSDProcessInfo(int pid, bool readEnvironment) : - UnixProcessInfo(pid, readEnvironment) - { - } - -private: - virtual bool readProcInfo(int pid) - { - int managementInfoBase[4]; - size_t mibLength; - struct kinfo_proc* kInfoProc; - - managementInfoBase[0] = CTL_KERN; - managementInfoBase[1] = KERN_PROC; - managementInfoBase[2] = KERN_PROC_PID; - managementInfoBase[3] = pid; - - if (sysctl(managementInfoBase, 4, NULL, &mibLength, NULL, 0) == -1) - return false; - - kInfoProc = new struct kinfo_proc [mibLength]; - - if (sysctl(managementInfoBase, 4, kInfoProc, &mibLength, NULL, 0) == -1) - { - delete [] kInfoProc; - return false; - } - -#if defined(__DragonFly__) - setName(kInfoProc->kp_comm); - setPid(kInfoProc->kp_pid); - setParentPid(kInfoProc->kp_ppid); - setForegroundPid(kInfoProc->kp_pgid); - setUserId(kInfoProc->kp_uid); -#else - setName(kInfoProc->ki_comm); - setPid(kInfoProc->ki_pid); - setParentPid(kInfoProc->ki_ppid); - setForegroundPid(kInfoProc->ki_pgid); - setUserId(kInfoProc->ki_uid); -#endif - - readUserName(); - - delete [] kInfoProc; - return true; - } - - virtual bool readArguments(int pid) - { - char args[ARG_MAX]; - int managementInfoBase[4]; - size_t len; - - managementInfoBase[0] = CTL_KERN; - managementInfoBase[1] = KERN_PROC; - managementInfoBase[2] = KERN_PROC_PID; - managementInfoBase[3] = pid; - - len = sizeof(args); - if (sysctl(managementInfoBase, 4, args, &len, NULL, 0) == -1) - return false; - - const QStringList argumentList = QString(args).split(QChar('\0')); - - for (QStringList::const_iterator it = argumentList.begin(); it != argumentList.end(); ++it) - { - addArgument(*it); - } - - return true; - } - - virtual bool readEnvironment(int pid) - { - // Not supported in FreeBSD? - return false; - } - - virtual bool readCurrentDir(int pid) - { -#if defined(__DragonFly__) - char buf[PATH_MAX]; - int managementInfoBase[4]; - size_t len; - - managementInfoBase[0] = CTL_KERN; - managementInfoBase[1] = KERN_PROC; - managementInfoBase[2] = KERN_PROC_CWD; - managementInfoBase[3] = pid; - - len = sizeof(buf); - if (sysctl(managementInfoBase, 4, buf, &len, NULL, 0) == -1) - return false; - - setCurrentDir(buf); - - return true; -#else - int numrecords; - struct kinfo_file* info = 0; - - info = kinfo_getfile(pid, &numrecords); - - if (!info) - return false; - - for (int i = 0; i < numrecords; ++i) - { - if (info[i].kf_fd == KF_FD_TYPE_CWD) - { - setCurrentDir(info[i].kf_path); - - free(info); - return true; - } - } - - free(info); - return false; -#endif - } -} ; -#endif - -#if defined(Q_OS_MAC) -class MacProcessInfo : public UnixProcessInfo -{ -public: - MacProcessInfo(int pid, bool env) : - UnixProcessInfo(pid, env) - { - } - -private: - virtual bool readProcInfo(int pid) - { - int managementInfoBase[4]; - size_t mibLength; - struct kinfo_proc* kInfoProc; - KDE_struct_stat statInfo; - - // Find the tty device of 'pid' (Example: /dev/ttys001) - managementInfoBase[0] = CTL_KERN; - managementInfoBase[1] = KERN_PROC; - managementInfoBase[2] = KERN_PROC_PID; - managementInfoBase[3] = pid; - - if (sysctl(managementInfoBase, 4, NULL, &mibLength, NULL, 0) == -1) - { - return false; - } - else - { - kInfoProc = new struct kinfo_proc [mibLength]; - if (sysctl(managementInfoBase, 4, kInfoProc, &mibLength, NULL, 0) == -1) - { - delete [] kInfoProc; - return false; - } - else - { - QString deviceNumber = QString(devname(((&kInfoProc->kp_eproc)->e_tdev), S_IFCHR)); - QString fullDeviceName = QString("/dev/") + deviceNumber.rightJustified(3, '0'); - delete [] kInfoProc; - - QByteArray deviceName = fullDeviceName.toLatin1(); - const char* ttyName = deviceName.data(); - - if (KDE_stat(ttyName, &statInfo) != 0) - return false; - - // Find all processes attached to ttyName - managementInfoBase[0] = CTL_KERN; - managementInfoBase[1] = KERN_PROC; - managementInfoBase[2] = KERN_PROC_TTY; - managementInfoBase[3] = statInfo.st_rdev; - - mibLength = 0; - if (sysctl(managementInfoBase, sizeof(managementInfoBase)/sizeof(int), NULL, &mibLength, NULL, 0) == -1) - return false; - - kInfoProc = new struct kinfo_proc [mibLength]; - if (sysctl(managementInfoBase, sizeof(managementInfoBase)/sizeof(int), kInfoProc, &mibLength, NULL, 0) == -1) - return false; - - // The foreground program is the first one - setName(QString(kInfoProc->kp_proc.p_comm)); - - delete [] kInfoProc; - } - } - return true; - } - - virtual bool readArguments(int pid) - { - Q_UNUSED(pid); - return false; - } - virtual bool readCurrentDir(int pid) - { - struct proc_vnodepathinfo vpi; - int nb = proc_pidinfo(pid, PROC_PIDVNODEPATHINFO, 0, &vpi, sizeof(vpi)); - if (nb == sizeof(vpi)) - { - setCurrentDir(QString(vpi.pvi_cdir.vip_path)); - return true; - } - return false; - } - virtual bool readEnvironment(int pid) - { - Q_UNUSED(pid); - return false; - } -} ; -#endif - -#ifdef Q_OS_SOLARIS - // The procfs structure definition requires off_t to be - // 32 bits, which only applies if FILE_OFFSET_BITS=32. - // Futz around here to get it to compile regardless, - // although some of the structure sizes might be wrong. - // Fortunately, the structures we actually use don't use - // off_t, and we're safe. - #if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS==64) - #undef _FILE_OFFSET_BITS - #endif - #include <procfs.h> -#else - // On non-Solaris platforms, define a fake psinfo structure - // so that the SolarisProcessInfo class can be compiled - // - // That avoids the trap where you change the API and - // don't notice it in #ifdeffed platform-specific parts - // of the code. - struct psinfo { - int pr_ppid; - int pr_pgid; - char* pr_fname; - char* pr_psargs; - } ; - static const int PRARGSZ=1; -#endif - -class SolarisProcessInfo : public UnixProcessInfo -{ -public: - SolarisProcessInfo(int pid, bool readEnvironment) - : UnixProcessInfo(pid,readEnvironment) - { - } -private: - virtual bool readProcInfo(int pid) - { - QFile psinfo( QString("/proc/%1/psinfo").arg(pid) ); - if ( psinfo.open( QIODevice::ReadOnly ) ) - { - struct psinfo info; - if (psinfo.read((char *)&info,sizeof(info)) != sizeof(info)) - { - return false; - } - - setParentPid(info.pr_ppid); - setForegroundPid(info.pr_pgid); - setName(info.pr_fname); - setPid(pid); - - // Bogus, because we're treating the arguments as one single string - info.pr_psargs[PRARGSZ-1]=0; - addArgument(info.pr_psargs); - } - return true; - } - - virtual bool readArguments(int /*pid*/) - { - // Handled in readProcInfo() - return false; - } - - virtual bool readEnvironment(int /*pid*/) - { - // Not supported in Solaris - return false; - } - - virtual bool readCurrentDir(int pid) - { - QFileInfo info( QString("/proc/%1/path/cwd").arg(pid) ); - const bool readable = info.isReadable(); - - if ( readable && info.isSymLink() ) - { - setCurrentDir( info.symLinkTarget() ); - return true; - } - else - { - if ( !readable ) - setError( PermissionsError ); - else - setError( UnknownError ); - - return false; - } - } -} ; - -SSHProcessInfo::SSHProcessInfo(const ProcessInfo& process) - : _process(process) -{ - bool ok = false; - - // check that this is a SSH process - const QString& name = _process.name(&ok); - - if ( !ok || name != "ssh" ) - { - //if ( !ok ) - // kWarning() << "Could not read process info"; - //else - // kWarning() << "Process is not a SSH process"; - - return; - } - - // read arguments - const QVector<QString>& args = _process.arguments(&ok); - - // SSH options - // these are taken from the SSH manual ( accessed via 'man ssh' ) - - // options which take no arguments - static const QString noOptionsArguments("1246AaCfgkMNnqsTtVvXxY"); - // options which take one argument - static const QString singleOptionArguments("bcDeFiLlmOopRSw"); - - if ( ok ) - { - // find the username, host and command arguments - // - // the username/host is assumed to be the first argument - // which is not an option - // ( ie. does not start with a dash '-' character ) - // or an argument to a previous option. - // - // the command, if specified, is assumed to be the argument following - // the username and host - // - // note that we skip the argument at index 0 because that is the - // program name ( expected to be 'ssh' in this case ) - for ( int i = 1 ; i < args.count() ; i++ ) - { - // if this argument is an option then skip it, plus any - // following arguments which refer to this option - if ( args[i].startsWith('-') ) - { - QChar argChar = ( args[i].length() > 1 ) ? args[i][1] : '\0'; - - if ( noOptionsArguments.contains(argChar) ) - continue; - else if ( singleOptionArguments.contains(argChar) ) - { - i++; - continue; - } - } - - // check whether the host has been found yet - // if not, this must be the username/host argument - if ( _host.isEmpty() ) - { - // check to see if only a hostname is specified, or whether - // both a username and host are specified ( in which case they - // are separated by an '@' character: username@host ) - - int separatorPosition = args[i].indexOf('@'); - if ( separatorPosition != -1 ) - { - // username and host specified - _user = args[i].left(separatorPosition); - _host = args[i].mid(separatorPosition+1); - } - else - { - // just the host specified - _host = args[i]; - } - } - else - { - // host has already been found, this must be the command argument - _command = args[i]; - } - - } - } - else - { - //kWarning() << "Could not read arguments"; - - return; - } -} - -QString SSHProcessInfo::userName() const -{ - return _user; -} -QString SSHProcessInfo::host() const -{ - return _host; -} -QString SSHProcessInfo::command() const -{ - return _command; -} -QString SSHProcessInfo::format(const QString& input) const -{ - QString output(input); - - // test whether host is an ip address - // in which case 'short host' and 'full host' - // markers in the input string are replaced with - // the full address - bool isIpAddress = false; - - struct in_addr address; - if ( inet_aton(_host.toLocal8Bit().constData(),&address) != 0 ) - isIpAddress = true; - else - isIpAddress = false; - - // search for and replace known markers - output.replace("%u",_user); - - if ( isIpAddress ) - output.replace("%h",_host); - else - output.replace("%h",_host.left(_host.indexOf('.'))); - - output.replace("%H",_host); - output.replace("%c",_command); - - return output; -} - -ProcessInfo* ProcessInfo::newInstance(int pid,bool enableEnvironmentRead) -{ -#ifdef Q_OS_LINUX - return new LinuxProcessInfo(pid,enableEnvironmentRead); -#elif defined(Q_OS_SOLARIS) - return new SolarisProcessInfo(pid,enableEnvironmentRead); -#elif defined(Q_OS_MAC) - return new MacProcessInfo(pid,enableEnvironmentRead); -#elif defined(Q_OS_FREEBSD) - return new FreeBSDProcessInfo(pid,enableEnvironmentRead); -#else - return new NullProcessInfo(pid,enableEnvironmentRead); -#endif -} -
deleted file mode 100644 --- a/gui//src/ProcessInfo.h +++ /dev/null @@ -1,454 +0,0 @@ -/* - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - - This program 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 program 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 PROCESSINFO_H -#define PROCESSINFO_H - -// Qt -#include <QtCore/QFile> -#include <QtCore/QMap> -#include <QtCore/QString> -#include <QtCore/QVector> - -/** - * Takes a snapshot of the state of a process and provides access to - * information such as the process name, parent process, - * the foreground process in the controlling terminal, - * the arguments with which the process was started and the - * environment. - * - * To create a new snapshot, construct a new ProcessInfo instance, - * using ProcessInfo::newInstance(), - * passing the process identifier of the process you are interested in. - * - * After creating a new instance, call the update() method to take a - * snapshot of the current state of the process. - * - * Before calling any additional methods, check that the process state - * was read successfully using the isValid() method. - * - * Each accessor method which provides information about the process state ( such as pid(), - * currentDir(), name() ) takes a pointer to a boolean as an argument. If the information - * requested was read successfully then the boolean is set to true, otherwise it is set - * to false, in which case the return value from the function should be ignored. - * If this boolean is set to false, it may indicate an error reading the process information, - * or it may indicate that the information is not available on the current platform. - * - * eg. - * - * @code - * ProcessInfo* info = ProcessInfo::newInstance(pid); - * info->update(); - * - * if ( info->isValid() ) - * { - * bool ok; - * QString value = info->name(&ok); - * - * if ( ok ) kDebug() << "process name - " << name; - * int parentPid = info->parentPid(&ok); - * if ( ok ) kDebug() << "parent process - " << parentPid; - * int foregroundPid = info->foregroundColororegroundPid(&ok); - * if ( ok ) kDebug() << "foreground process - " << foregroundPid; - * } - * @endcode - */ -class ProcessInfo -{ -public: - /** - * Constructs a new instance of a suitable ProcessInfo sub-class for - * the current platform which provides information about a given process. - * - * @param pid The pid of the process to examine - * @param readEnvironment Specifies whether environment bindings should - * be read. If this is false, then environment() calls will - * always fail. This is an optimization to avoid the overhead - * of reading the (potentially large) environment data when it - * is not required. - */ - static ProcessInfo* newInstance(int pid,bool readEnvironment = false); - - virtual ~ProcessInfo() {} - - /** - * Updates the information about the process. This must - * be called before attempting to use any of the accessor methods. - */ - void update(); - - /** Returns true if the process state was read successfully. */ - bool isValid() const; - /** - * Returns the process id. - * - * @param ok Set to true if the process id was read successfully or false otherwise - */ - int pid(bool* ok) const; - /** - * Returns the id of the parent process id was read successfully or false otherwise - * - * @param ok Set to true if the parent process id - */ - int parentPid(bool* ok) const; - - /** - * Returns the id of the current foreground process - * - * NOTE: Using the foregroundProcessGroup() method of the Pty - * instance associated with the terminal of interest is preferred - * over using this method. - * - * @param ok Set to true if the foreground process id was read successfully or false otherwise - */ - int foregroundPid(bool* ok) const; - - /* Returns the user id of the process */ - int userId(bool* ok) const; - - /** Returns the user's name of the process */ - QString userName() const; - - /** Returns the user's home directory of the process */ - QString userHomeDir() const; - - /** Returns the name of the current process */ - QString name(bool* ok) const; - - /** - * Returns the command-line arguments which the process - * was started with. - * - * The first argument is the name used to launch the process. - * - * @param ok Set to true if the arguments were read successfully or false otherwise. - */ - QVector<QString> arguments(bool* ok) const; - /** - * Returns the environment bindings which the process - * was started with. - * In the returned map, the key is the name of the environment variable, - * and the value is the corresponding value. - * - * @param ok Set to true if the environment bindings were read successfully or false otherwise - */ - QMap<QString,QString> environment(bool* ok) const; - - /** - * Returns the current working directory of the process - * - * @param ok Set to true if the current working directory was read successfully or false otherwise - */ - QString currentDir(bool* ok) const; - - /** - * Returns the current working directory of the process (or its parent) - */ - QString validCurrentDir() const; - - /** Forces the user home directory to be calculated */ - void setUserHomeDir(); - - /** - * Parses an input string, looking for markers beginning with a '%' - * character and returns a string with the markers replaced - * with information from this process description. - * <br> - * The markers recognised are: - * <ul> - * <li> %u - Name of the user which owns the process. </li> - * <li> %n - Replaced with the name of the process. </li> - * <li> %d - Replaced with the last part of the path name of the - * process' current working directory. - * - * (eg. if the current directory is '/home/bob' then - * 'bob' would be returned) - * </li> - * <li> %D - Replaced with the current working directory of the process. </li> - * </ul> - */ - QString format(const QString& text) const; - - /** - * This enum describes the errors which can occur when trying to read - * a process's information. - */ - enum Error - { - /** No error occurred. */ - NoError, - /** The nature of the error is unknown. */ - UnknownError, - /** Konsole does not have permission to obtain the process information. */ - PermissionsError - }; - - /** - * Returns the last error which occurred. - */ - Error error() const; - -protected: - /** - * Constructs a new process instance. You should not call the constructor - * of ProcessInfo or its subclasses directly. Instead use the - * static ProcessInfo::newInstance() method which will return - * a suitable ProcessInfo instance for the current platform. - */ - explicit ProcessInfo(int pid , bool readEnvironment = false); - - /** - * This is called on construction to read the process state - * Subclasses should reimplement this function to provide - * platform-specific process state reading functionality. - * - * When called, readProcessInfo() should attempt to read all - * of the necessary state information. If the attempt is successful, - * it should set the process id using setPid(), and update - * the other relevant information using setParentPid(), setName(), - * setArguments() etc. - * - * Calls to isValid() will return true only if the process id - * has been set using setPid() - * - * @param pid The process id of the process to read - * @param readEnvironment Specifies whether the environment bindings - * for the process should be read - */ - virtual bool readProcessInfo(int pid , bool readEnvironment) = 0; - - /* Read the user name */ - virtual void readUserName(void) = 0; - - /** Sets the process id associated with this ProcessInfo instance */ - void setPid(int pid); - /** Sets the parent process id as returned by parentPid() */ - void setParentPid(int pid); - /** Sets the foreground process id as returend by foregroundPid() */ - void setForegroundPid(int pid); - /** Sets the user id associated with this ProcessInfo instance */ - void setUserId(int uid); - /** Sets the user name of the process as set by readUserName() */ - void setUserName(const QString& name); - /** Sets the name of the process as returned by name() */ - void setName(const QString& name); - /** Sets the current working directory for the process */ - void setCurrentDir(const QString& dir); - - /** Sets the error */ - void setError( Error error ); - - /** Convenience method. Sets the error based on a QFile error code. */ - void setFileError( QFile::FileError error ); - - /** - * Adds a commandline argument for the process, as returned - * by arguments() - */ - void addArgument(const QString& argument); - /** - * Adds an environment binding for the process, as returned by - * environment() - * - * @param name The name of the environment variable, eg. "PATH" - * @param value The value of the environment variable, eg. "/bin" - */ - void addEnvironmentBinding(const QString& name , const QString& value); - -private: - enum CommandFormat - { - ShortCommandFormat, - LongCommandFormat - }; - // takes a process name and its arguments and produces formatted output - QString formatCommand(const QString& name , const QVector<QString>& arguments , - CommandFormat format) const; - - // valid bits for _fields variable, ensure that - // _fields is changed to an int if more than 8 fields are added - enum FIELD_BITS - { - PROCESS_ID = 1, - PARENT_PID = 2, - FOREGROUND_PID = 4, - ARGUMENTS = 8, - ENVIRONMENT = 16, - NAME = 32, - CURRENT_DIR = 64, - UID =128 - }; - - char _fields; // a bitmap indicating which fields are valid - // used to set the "ok" parameters for the public - // accessor functions - - bool _enableEnvironmentRead; // specifies whether to read the environment - // bindings when update() is called - int _pid; - int _parentPid; - int _foregroundPid; - int _userId; - - Error _lastError; - - QString _name; - QString _userName; - QString _userHomeDir; - QString _currentDir; - - QVector<QString> _arguments; - QMap<QString,QString> _environment; -}; - -/** - * Implementation of ProcessInfo which does nothing. - * Used on platforms where a suitable ProcessInfo subclass is not - * available. - * - * isValid() will always return false for instances of NullProcessInfo - */ -class NullProcessInfo : public ProcessInfo -{ -public: - /** - * Constructs a new NullProcessInfo instance. - * See ProcessInfo::newInstance() - */ - explicit NullProcessInfo(int pid,bool readEnvironment = false); -protected: - virtual bool readProcessInfo(int pid,bool readEnvironment); - virtual void readUserName(void); -}; - -/** - * Implementation of ProcessInfo for Unix platforms which uses - * the /proc filesystem - */ -class UnixProcessInfo : public ProcessInfo -{ -public: - /** - * Constructs a new instance of UnixProcessInfo. - * See ProcessInfo::newInstance() - */ - explicit UnixProcessInfo(int pid,bool readEnvironment = false); - -protected: - /** - * Implementation of ProcessInfo::readProcessInfo(); calls the - * four private methods below in turn. - */ - virtual bool readProcessInfo(int pid , bool readEnvironment); - - virtual void readUserName(void); - -private: - /** - * Read the standard process information -- PID, parent PID, foreground PID. - * @param pid process ID to use - * @return true on success - */ - virtual bool readProcInfo(int pid)=0; - - /** - * Read the environment of the process. Sets _environment. - * @param pid process ID to use - * @return true on success - */ - virtual bool readEnvironment(int pid)=0; - - /** - * Determine what arguments were passed to the process. Sets _arguments. - * @param pid process ID to use - * @return true on success - */ - virtual bool readArguments(int pid)=0; - - /** - * Determine the current directory of the process. - * @param pid process ID to use - * @return true on success - */ - virtual bool readCurrentDir(int pid)=0; -}; - -/** - * Lightweight class which provides additional information about SSH processes. - */ -class SSHProcessInfo -{ -public: - /** - * Constructs a new SSHProcessInfo instance which provides additional - * information about the specified SSH process. - * - * @param process A ProcessInfo instance for a SSH process. - */ - SSHProcessInfo(const ProcessInfo& process); - - /** - * Returns the user name which the user initially logged into on - * the remote computer. - */ - QString userName() const; - - /** - * Returns the host which the user has connected to. - */ - QString host() const; - - /** - * Returns the command which the user specified to execute on the - * remote computer when starting the SSH process. - */ - QString command() const; - - /** - * Operates in the same way as ProcessInfo::format(), except - * that the set of markers understood is different: - * - * %u - Replaced with user name which the user initially logged - * into on the remote computer. - * %h - Replaced with the first part of the host name which - * is connected to. - * %H - Replaced with the full host name of the computer which - * is connected to. - * %c - Replaced with the command which the user specified - * to execute when starting the SSH process. - */ - QString format(const QString& input) const; - -private: - const ProcessInfo& _process; - QString _user; - QString _host; - QString _command; -}; - -#endif //PROCESSINFO_H - -/* - Local Variables: - mode: c++ - c-file-style: "stroustrup" - indent-tabs-mode: nil - tab-width: 4 - End: -*/
deleted file mode 100644 --- a/gui//src/Pty.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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. -*/ - -// Own -#include "kprocess_p.h" -#include "kptyprocess.h" -#include "Pty.h" - -// System -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> -#include <termios.h> -#include <signal.h> - -// Qt -#include <QtCore/QStringList> - -#include "kpty.h" -#include "kptydevice.h" - - -void Pty::setWindowSize(int lines, int cols) -{ - _windowColumns = cols; - _windowLines = lines; - - if (pty()->masterFd() >= 0) - pty()->setWinSize(lines, cols); -} -QSize Pty::windowSize() const -{ - return QSize(_windowColumns,_windowLines); -} - -void Pty::setFlowControlEnabled(bool enable) -{ - _xonXoff = enable; - - if (pty()->masterFd() >= 0) - { - struct ::termios ttmode; - pty()->tcGetAttr(&ttmode); - if (!enable) - ttmode.c_iflag &= ~(IXOFF | IXON); - else - ttmode.c_iflag |= (IXOFF | IXON); - //if (!pty()->tcSetAttr(&ttmode)) - // kWarning() << "Unable to set terminal attributes."; - } -} -bool Pty::flowControlEnabled() const -{ - if (pty()->masterFd() >= 0) - { - struct ::termios ttmode; - pty()->tcGetAttr(&ttmode); - return ttmode.c_iflag & IXOFF && - ttmode.c_iflag & IXON; - } - //kWarning() << "Unable to get flow control status, terminal not connected."; - return false; -} - -void Pty::setUtf8Mode(bool enable) -{ -#ifdef IUTF8 // XXX not a reasonable place to check it. - _utf8 = enable; - - if (pty()->masterFd() >= 0) - { - struct ::termios ttmode; - pty()->tcGetAttr(&ttmode); - if (!enable) - ttmode.c_iflag &= ~IUTF8; - else - ttmode.c_iflag |= IUTF8; - // if (!pty()->tcSetAttr(&ttmode)) - // kWarning() << "Unable to set terminal attributes."; - } -#endif -} - -void Pty::setErase(char erase) -{ - _eraseChar = erase; - - if (pty()->masterFd() >= 0) - { - struct ::termios ttmode; - pty()->tcGetAttr(&ttmode); - ttmode.c_cc[VERASE] = erase; - //if (!pty()->tcSetAttr(&ttmode)) - // kWarning() << "Unable to set terminal attributes."; - } -} - -char Pty::erase() const -{ - if (pty()->masterFd() >= 0) - { - struct ::termios ttyAttributes; - pty()->tcGetAttr(&ttyAttributes); - return ttyAttributes.c_cc[VERASE]; - } - - return _eraseChar; -} - -void Pty::addEnvironmentVariables(const QStringList& environment) -{ - QListIterator<QString> iter(environment); - while (iter.hasNext()) - { - QString pair = iter.next(); - - // split on the first '=' character - int pos = pair.indexOf('='); - - if ( pos >= 0 ) - { - QString variable = pair.left(pos); - QString value = pair.mid(pos+1); - - setEnv(variable,value); - } - } -} - -int Pty::start(const QString& program, - const QStringList& programArguments, - const QStringList& environment, - ulong winid, - bool addToUtmp, - const QString& dbusService, - const QString& dbusSession) -{ - clearProgram(); - - // For historical reasons, the first argument in programArguments is the - // name of the program to execute, so create a list consisting of all - // but the first argument to pass to setProgram() - Q_ASSERT(programArguments.count() >= 1); - setProgram(program.toLatin1(),programArguments.mid(1)); - - addEnvironmentVariables(environment); - - if ( !dbusService.isEmpty() ) - setEnv("KONSOLE_DBUS_SERVICE",dbusService); - if ( !dbusSession.isEmpty() ) - setEnv("KONSOLE_DBUS_SESSION", dbusSession); - - setEnv("WINDOWID", QString::number(winid)); - - // unless the LANGUAGE environment variable has been set explicitly - // set it to a null string - // this fixes the problem where KCatalog sets the LANGUAGE environment - // variable during the application's startup to something which - // differs from LANG,LC_* etc. and causes programs run from - // the terminal to display messages in the wrong language - // - // this can happen if LANG contains a language which KDE - // does not have a translation for - // - // BR:149300 - setEnv("LANGUAGE",QString(),false /* do not overwrite existing value if any */); - - setUseUtmp(addToUtmp); - - struct ::termios ttmode; - pty()->tcGetAttr(&ttmode); - if (!_xonXoff) - ttmode.c_iflag &= ~(IXOFF | IXON); - else - ttmode.c_iflag |= (IXOFF | IXON); -#ifdef IUTF8 // XXX not a reasonable place to check it. - if (!_utf8) - ttmode.c_iflag &= ~IUTF8; - else - ttmode.c_iflag |= IUTF8; -#endif - - if (_eraseChar != 0) - ttmode.c_cc[VERASE] = _eraseChar; - - //if (!pty()->tcSetAttr(&ttmode)) - // kWarning() << "Unable to set terminal attributes."; - - pty()->setWinSize(_windowLines, _windowColumns); - - KProcess::start(); - - if (!waitForStarted()) - return -1; - - return 0; -} - -void Pty::setWriteable(bool writeable) -{ - //KDE_struct_stat sbuf; - struct stat sbuf; - //KDE_stat(pty()->ttyName(), &sbuf); - ::stat(pty()->ttyName(), &sbuf); - if (writeable) - chmod(pty()->ttyName(), sbuf.st_mode | S_IWGRP); - else - chmod(pty()->ttyName(), sbuf.st_mode & ~(S_IWGRP|S_IWOTH)); -} - -Pty::Pty(int masterFd, QObject* parent) - : KPtyProcess(masterFd,parent) -{ - init(); -} -Pty::Pty(QObject* parent) - : KPtyProcess(parent) -{ - init(); -} -void Pty::init() -{ - _windowColumns = 0; - _windowLines = 0; - _eraseChar = 0; - _xonXoff = true; - _utf8 =true; - - connect(pty(), SIGNAL(readyRead()) , this , SLOT(dataReceived())); - setPtyChannels(KPtyProcess::AllChannels); -} - -Pty::~Pty() -{ -} - -void Pty::sendData(const char* data, int length) -{ - if (!length) - return; - - if (!pty()->write(data,length)) - { - //kWarning() << "Pty::doSendJobs - Could not send input data to terminal process."; - return; - } -} - -void Pty::dataReceived() -{ - QByteArray data = pty()->readAll(); - emit receivedData(data.constData(),data.count()); -} - -void Pty::lockPty(bool lock) -{ - Q_UNUSED(lock); - -// TODO: Support for locking the Pty - //if (lock) - //suspend(); - //else - //resume(); -} - -int Pty::foregroundProcessGroup() const -{ - int pid = tcgetpgrp(pty()->masterFd()); - - if ( pid != -1 ) - { - return pid; - } - - return 0; -} - -void Pty::setupChildProcess() -{ - KPtyProcess::setupChildProcess(); - - // reset all signal handlers - // this ensures that terminal applications respond to - // signals generated via key sequences such as Ctrl+C - // (which sends SIGINT) - struct sigaction action; - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_DFL; - action.sa_flags = 0; - for (int signal=1;signal < NSIG; signal++) - sigaction(signal,&action,0L); -}
deleted file mode 100644 --- a/gui//src/Pty.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - This file is part of Konsole, KDE's terminal emulator. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 PTY_H -#define PTY_H - -// Qt -#include <QtCore/QStringList> -#include <QtCore/QVector> -#include <QtCore/QList> -#include <QtCore/QSize> - -// KDE -#include "kprocess.h" -#include "kptyprocess.h" - -/** - * The Pty class is used to start the terminal process, - * send data to it, receive data from it and manipulate - * various properties of the pseudo-teletype interface - * used to communicate with the process. - * - * To use this class, construct an instance and connect - * to the sendData slot and receivedData signal to - * send data to or receive data from the process. - * - * To start the terminal process, call the start() method - * with the program name and appropriate arguments. - */ -//class KONSOLEPRIVATE_EXPORT Pty: public KPtyProcess -class Pty: public KPtyProcess -{ -Q_OBJECT - - public: - - /** - * Constructs a new Pty. - * - * Connect to the sendData() slot and receivedData() signal to prepare - * for sending and receiving data from the terminal process. - * - * To start the terminal process, call the run() method with the - * name of the program to start and appropriate arguments. - */ - explicit Pty(QObject* parent = 0); - - /** - * Construct a process using an open pty master. - * See KPtyProcess::KPtyProcess() - */ - explicit Pty(int ptyMasterFd, QObject* parent = 0); - - ~Pty(); - - /** - * Starts the terminal process. - * - * Returns 0 if the process was started successfully or non-zero - * otherwise. - * - * @param program Path to the program to start - * @param arguments Arguments to pass to the program being started - * @param environment A list of key=value pairs which will be added - * to the environment for the new process. At the very least this - * should include an assignment for the TERM environment variable. - * @param winid Specifies the value of the WINDOWID environment variable - * in the process's environment. - * @param addToUtmp Specifies whether a utmp entry should be created for - * the pty used. See K3Process::setUsePty() - * @param dbusService Specifies the value of the KONSOLE_DBUS_SERVICE - * environment variable in the process's environment. - * @param dbusSession Specifies the value of the KONSOLE_DBUS_SESSION - * environment variable in the process's environment. - */ - int start( const QString& program, - const QStringList& arguments, - const QStringList& environment, - ulong winid, - bool addToUtmp, - const QString& dbusService, - const QString& dbusSession - ); - - /** TODO: Document me */ - void setWriteable(bool writeable); - - /** - * Enables or disables Xon/Xoff flow control. The flow control setting - * may be changed later by a terminal application, so flowControlEnabled() - * may not equal the value of @p on in the previous call to setFlowControlEnabled() - */ - void setFlowControlEnabled(bool on); - - /** Queries the terminal state and returns true if Xon/Xoff flow control is enabled. */ - bool flowControlEnabled() const; - - /** - * Sets the size of the window (in lines and columns of characters) - * used by this teletype. - */ - void setWindowSize(int lines, int cols); - - /** Returns the size of the window used by this teletype. See setWindowSize() */ - QSize windowSize() const; - - /** TODO Document me */ - void setErase(char erase); - - /** */ - char erase() const; - - /** - * Returns the process id of the teletype's current foreground - * process. This is the process which is currently reading - * input sent to the terminal via. sendData() - * - * If there is a problem reading the foreground process group, - * 0 will be returned. - */ - int foregroundProcessGroup() const; - - public slots: - - /** - * Put the pty into UTF-8 mode on systems which support it. - */ - void setUtf8Mode(bool on); - - /** - * Suspend or resume processing of data from the standard - * output of the terminal process. - * - * See K3Process::suspend() and K3Process::resume() - * - * @param lock If true, processing of output is suspended, - * otherwise processing is resumed. - */ - void lockPty(bool lock); - - /** - * Sends data to the process currently controlling the - * teletype ( whose id is returned by foregroundProcessGroup() ) - * - * @param buffer Pointer to the data to send. - * @param length Length of @p buffer. - */ - void sendData(const char* buffer, int length); - - signals: - - /** - * Emitted when a new block of data is received from - * the teletype. - * - * @param buffer Pointer to the data received. - * @param length Length of @p buffer - */ - void receivedData(const char* buffer, int length); - - protected: - void setupChildProcess(); - - private slots: - // called when data is received from the terminal process - void dataReceived(); - - private: - void init(); - - // takes a list of key=value pairs and adds them - // to the environment for the process - void addEnvironmentVariables(const QStringList& environment); - - int _windowColumns; - int _windowLines; - char _eraseChar; - bool _xonXoff; - bool _utf8; -}; - -#endif // PTY_H
deleted file mode 100644 --- a/gui//src/QTerminalWidget.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* Copyright (C) 2008 e_k (e_k@users.sourceforge.net) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include "QTerminalWidget.h" -#include "Session.h" -#include "TerminalDisplay.h" - -struct TermWidgetImpl -{ - TermWidgetImpl(QWidget* parent = 0); - - TerminalDisplay *m_terminalDisplay; - Session *m_session; - Session* createSession(); - TerminalDisplay* createTerminalDisplay(Session *session, QWidget* parent); -}; - -TermWidgetImpl::TermWidgetImpl(QWidget* parent) -{ - QPalette palette = QApplication::palette(); - m_session = createSession(); - m_terminalDisplay = createTerminalDisplay(this->m_session, parent); - m_terminalDisplay->setBackgroundColor(palette.color(QPalette::Base)); - m_terminalDisplay->setForegroundColor(palette.color(QPalette::Text)); -} - -Session *TermWidgetImpl::createSession() -{ - Session *session = new Session(); - session->setTitle(Session::NameRole, "QTerminalWidget"); - session->setProgram("/bin/bash"); - session->setArguments(QStringList()); - session->setAutoClose(true); - session->setCodec(QTextCodec::codecForName("UTF-8")); - session->setFlowControlEnabled(true); - session->setHistoryType(HistoryTypeBuffer(1000)); - session->setDarkBackground(true); - session->setKeyBindings(""); - return session; -} - -TerminalDisplay *TermWidgetImpl::createTerminalDisplay(Session *session, QWidget* parent) -{ - TerminalDisplay* display = new TerminalDisplay(parent); - display->setBellMode(TerminalDisplay::NotifyBell); - display->setTerminalSizeHint(true); - display->setTripleClickMode(TerminalDisplay::SelectWholeLine); - display->setTerminalSizeStartup(true); - display->setRandomSeed(session->sessionId() * 31); - return display; -} - -QTerminalWidget::QTerminalWidget(int startnow, QWidget *parent) - :QWidget(parent) -{ - m_impl = new TermWidgetImpl(this); - - initialize(); - - if(startnow && m_impl->m_session) { - m_impl->m_session->run(); - } - - setFocus(Qt::OtherFocusReason); - m_impl->m_terminalDisplay->resize(this->size()); - setFocusProxy(m_impl->m_terminalDisplay); -} - -void QTerminalWidget::startShellProgram() -{ - if(m_impl->m_session->isRunning()) - return; - - m_impl->m_session->run(); -} - -void QTerminalWidget::initialize() -{ - m_impl->m_terminalDisplay->setSize(80, 40); - - QFont font = QApplication::font(); - font.setFamily("Monospace"); - font.setPointSize(10); - font.setStyleHint(QFont::TypeWriter); - setTerminalFont(font); - setScrollBarPosition(NoScrollBar); - - m_impl->m_session->addView(m_impl->m_terminalDisplay); - - connect(m_impl->m_session, SIGNAL(finished()), this, SLOT(sessionFinished())); -} - -QTerminalWidget::~QTerminalWidget() -{ - emit destroyed(); -} - -void QTerminalWidget::setTerminalFont(QFont &font) -{ - if (!m_impl->m_terminalDisplay) - return; - m_impl->m_terminalDisplay->setVTFont(font); -} - -void QTerminalWidget::setShellProgram(QString progname) -{ - if (!m_impl->m_session) - return; - m_impl->m_session->setProgram(progname); -} - -void QTerminalWidget::openTeletype(int fd) -{ - if ( m_impl->m_session->isRunning() ) - return; - - m_impl->m_session->openTeletype(fd); -} - -void QTerminalWidget::setArgs(QStringList &args) -{ - if (!m_impl->m_session) - return; - m_impl->m_session->setArguments(args); -} - -void QTerminalWidget::setTextCodec(QTextCodec *codec) -{ - if (!m_impl->m_session) - return; - m_impl->m_session->setCodec(codec); -} - -void QTerminalWidget::setSize(int h, int v) -{ - if (!m_impl->m_terminalDisplay) - return; - m_impl->m_terminalDisplay->setSize(h, v); -} - -void QTerminalWidget::setHistorySize(int lines) -{ - if (lines < 0) - m_impl->m_session->setHistoryType(HistoryTypeFile()); - else - m_impl->m_session->setHistoryType(HistoryTypeBuffer(lines)); -} - -void QTerminalWidget::setScrollBarPosition(ScrollBarPosition pos) -{ - if (!m_impl->m_terminalDisplay) - return; - m_impl->m_terminalDisplay->setScrollBarPosition((TerminalDisplay::ScrollBarPosition)pos); -} - -void QTerminalWidget::sendText(const QString &text) -{ - m_impl->m_session->sendText(text); -} - -void QTerminalWidget::installEventFilterOnDisplay(QObject *object) { - m_impl->m_terminalDisplay->installEventFilter(object); -} - -void QTerminalWidget::resizeEvent(QResizeEvent*) -{ - m_impl->m_terminalDisplay->resize(this->size()); - m_impl->m_terminalDisplay->update(); -} - -void QTerminalWidget::sessionFinished() -{ - emit finished(); -} - -
deleted file mode 100644 --- a/gui//src/QTerminalWidget.h +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2008 e_k (e_k@users.sourceforge.net) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef QTERMINALWIDGET_H -#define QTERMINALWIDGET_H - -#include <QtGui> - -struct TermWidgetImpl; -/** - * \class QTerminalWidget - * This class forms a widget class that can be inserted into other widgets. - */ -class QTerminalWidget : public QWidget -{ - Q_OBJECT -public: - /** - * \enum ScrollBarPosition - * Defines the scrollbar position of the terminal. - */ - enum ScrollBarPosition - { - NoScrollBar, - ScrollBarLeft, - ScrollBarRight - }; - - QTerminalWidget(int startnow = 1, QWidget *parent = 0); - ~QTerminalWidget(); - - void startShellProgram(); - void openTeletype(int fd); - - /** Default is application font with family Monospace, size 10. */ - void setTerminalFont(QFont &font); - - /** Shell program, default is /bin/bash. */ - void setShellProgram(QString progname); - - /** Shell program args, default is none. */ - void setArgs(QStringList &args); - - /** Text codec, default is UTF-8. */ - void setTextCodec(QTextCodec *codec); - - /** Resize terminal widget. */ - void setSize(int h, int v); - - /** History size for scrolling, values below zero mean infinite. */ - void setHistorySize(int lines); - - /** Presence of scrollbar. By default, there is no scrollbar present. */ - void setScrollBarPosition(ScrollBarPosition); - - /** Send some text to the terminal. */ - void sendText(const QString &text); - - /** Installs an event filter onto the display. */ - void installEventFilterOnDisplay(QObject *object); - -signals: - /** Emitted, when the current program has finished. */ - void finished(); - -protected: - virtual void resizeEvent(QResizeEvent *); - -protected slots: - void sessionFinished(); - -private: - /** Performs initial operations on this widget. */ - void initialize(); - TermWidgetImpl *m_impl; -}; - -#endif // QTERMINALWIDGET_H
deleted file mode 100644 --- a/gui//src/Quint.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include <QtGui/QApplication> -#include <QTranslator> -#include <QSettings> -#include "MainWindow.h" - -int main(int argc, char *argv[]) -{ - QApplication application(argc, argv); - - QDesktopServices desktopServices; - QSettings settings( - desktopServices.storageLocation(QDesktopServices::HomeLocation) - + "/.quint/settings.ini", QSettings::IniFormat); - - QTranslator translator; - translator.load(QString("../languages/%1.qm").arg(settings.value("application/language").toString())); - application.installTranslator(&translator); - - MainWindow w; - w.show(); - - return application.exec(); -}
deleted file mode 100644 --- a/gui//src/Screen.cpp +++ /dev/null @@ -1,1356 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2007-2008 by Robert Knight <robert.knight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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. - */ - -// Own -#include "Screen.h" - -// Standard -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <assert.h> -#include <string.h> -#include <ctype.h> - -// Qt -#include <QtCore/QTextStream> -#include <QtCore/QDate> - - -// Konsole -#include "konsole_wcwidth.h" -#include "TerminalCharacterDecoder.h" - -//FIXME: this is emulation specific. Use false for xterm, true for ANSI. -//FIXME: see if we can get this from terminfo. -#define BS_CLEARS false - -//Macro to convert x,y position on screen to position within an image. -// -//Originally the image was stored as one large contiguous block of -//memory, so a position within the image could be represented as an -//offset from the beginning of the block. For efficiency reasons this -//is no longer the case. -//Many internal parts of this class still use this representation for parameters and so on, -//notably moveImage() and clearImage(). -//This macro converts from an X,Y position into an image offset. -#ifndef loc -#define loc(X,Y) ((Y)*columns+(X)) -#endif - - -Character Screen::defaultChar = Character(' ', - CharacterColor(COLOR_SPACE_DEFAULT,DEFAULT_FORE_COLOR), - CharacterColor(COLOR_SPACE_DEFAULT,DEFAULT_BACK_COLOR), - DEFAULT_RENDITION); - -//#define REVERSE_WRAPPED_LINES // for wrapped line debug - - Screen::Screen(int l, int c) -: lines(l), - columns(c), - screenLines(new ImageLine[lines+1] ), - _scrolledLines(0), - _droppedLines(0), - history(new HistoryScrollNone()), - cuX(0), cuY(0), - currentRendition(0), - _topMargin(0), _bottomMargin(0), - selBegin(0), selTopLeft(0), selBottomRight(0), - blockSelectionMode(false), - effectiveForeground(CharacterColor()), effectiveBackground(CharacterColor()), effectiveRendition(0), - lastPos(-1) -{ - lineProperties.resize(lines+1); - for (int i=0;i<lines+1;i++) - lineProperties[i]=LINE_DEFAULT; - - initTabStops(); - clearSelection(); - reset(); -} - -/*! Destructor -*/ - -Screen::~Screen() -{ - delete[] screenLines; - delete history; -} - -void Screen::cursorUp(int n) - //=CUU -{ - if (n == 0) n = 1; // Default - int stop = cuY < _topMargin ? 0 : _topMargin; - cuX = qMin(columns-1,cuX); // nowrap! - cuY = qMax(stop,cuY-n); -} - -void Screen::cursorDown(int n) - //=CUD -{ - if (n == 0) n = 1; // Default - int stop = cuY > _bottomMargin ? lines-1 : _bottomMargin; - cuX = qMin(columns-1,cuX); // nowrap! - cuY = qMin(stop,cuY+n); -} - -void Screen::cursorLeft(int n) - //=CUB -{ - if (n == 0) n = 1; // Default - cuX = qMin(columns-1,cuX); // nowrap! - cuX = qMax(0,cuX-n); -} - -void Screen::cursorRight(int n) - //=CUF -{ - if (n == 0) n = 1; // Default - cuX = qMin(columns-1,cuX+n); -} - -void Screen::setMargins(int top, int bot) - //=STBM -{ - if (top == 0) top = 1; // Default - if (bot == 0) bot = lines; // Default - top = top - 1; // Adjust to internal lineno - bot = bot - 1; // Adjust to internal lineno - if ( !( 0 <= top && top < bot && bot < lines ) ) - { //Debug()<<" setRegion("<<top<<","<<bot<<") : bad range."; - return; // Default error action: ignore - } - _topMargin = top; - _bottomMargin = bot; - cuX = 0; - cuY = getMode(MODE_Origin) ? top : 0; - -} - -int Screen::topMargin() const -{ - return _topMargin; -} -int Screen::bottomMargin() const -{ - return _bottomMargin; -} - -void Screen::index() - //=IND -{ - if (cuY == _bottomMargin) - scrollUp(1); - else if (cuY < lines-1) - cuY += 1; -} - -void Screen::reverseIndex() - //=RI -{ - if (cuY == _topMargin) - scrollDown(_topMargin,1); - else if (cuY > 0) - cuY -= 1; -} - -void Screen::nextLine() - //=NEL -{ - toStartOfLine(); index(); -} - -void Screen::eraseChars(int n) -{ - if (n == 0) n = 1; // Default - int p = qMax(0,qMin(cuX+n-1,columns-1)); - clearImage(loc(cuX,cuY),loc(p,cuY),' '); -} - -void Screen::deleteChars(int n) -{ - Q_ASSERT( n >= 0 ); - - // always delete at least one char - if (n == 0) - n = 1; - - // if cursor is beyond the end of the line there is nothing to do - if ( cuX >= screenLines[cuY].count() ) - return; - - if ( cuX+n > screenLines[cuY].count() ) - n = screenLines[cuY].count() - cuX; - - Q_ASSERT( n >= 0 ); - Q_ASSERT( cuX+n <= screenLines[cuY].count() ); - - screenLines[cuY].remove(cuX,n); -} - -void Screen::insertChars(int n) -{ - if (n == 0) n = 1; // Default - - if ( screenLines[cuY].size() < cuX ) - screenLines[cuY].resize(cuX); - - screenLines[cuY].insert(cuX,n,' '); - - if ( screenLines[cuY].count() > columns ) - screenLines[cuY].resize(columns); -} - -void Screen::deleteLines(int n) -{ - if (n == 0) n = 1; // Default - scrollUp(cuY,n); -} - -void Screen::insertLines(int n) -{ - if (n == 0) n = 1; // Default - scrollDown(cuY,n); -} - -void Screen::setMode(int m) -{ - currentModes[m] = true; - switch(m) - { - case MODE_Origin : cuX = 0; cuY = _topMargin; break; //FIXME: home - } -} - -void Screen::resetMode(int m) -{ - currentModes[m] = false; - switch(m) - { - case MODE_Origin : cuX = 0; cuY = 0; break; //FIXME: home - } -} - -void Screen::saveMode(int m) -{ - savedModes[m] = currentModes[m]; -} - -void Screen::restoreMode(int m) -{ - currentModes[m] = savedModes[m]; -} - -bool Screen::getMode(int m) const -{ - return currentModes[m]; -} - -void Screen::saveCursor() -{ - savedState.cursorColumn = cuX; - savedState.cursorLine = cuY; - savedState.rendition = currentRendition; - savedState.foreground = currentForeground; - savedState.background = currentBackground; -} - -void Screen::restoreCursor() -{ - cuX = qMin(savedState.cursorColumn,columns-1); - cuY = qMin(savedState.cursorLine,lines-1); - currentRendition = savedState.rendition; - currentForeground = savedState.foreground; - currentBackground = savedState.background; - updateEffectiveRendition(); -} - -void Screen::resizeImage(int new_lines, int new_columns) -{ - if ((new_lines==lines) && (new_columns==columns)) return; - - if (cuY > new_lines-1) - { // attempt to preserve focus and lines - _bottomMargin = lines-1; //FIXME: margin lost - for (int i = 0; i < cuY-(new_lines-1); i++) - { - addHistLine(); scrollUp(0,1); - } - } - - // create new screen lines and copy from old to new - - ImageLine* newScreenLines = new ImageLine[new_lines+1]; - for (int i=0; i < qMin(lines-1,new_lines+1) ;i++) - newScreenLines[i]=screenLines[i]; - for (int i=lines;(i > 0) && (i<new_lines+1);i++) - newScreenLines[i].resize( new_columns ); - - lineProperties.resize(new_lines+1); - for (int i=lines;(i > 0) && (i<new_lines+1);i++) - lineProperties[i] = LINE_DEFAULT; - - clearSelection(); - - delete[] screenLines; - screenLines = newScreenLines; - - lines = new_lines; - columns = new_columns; - cuX = qMin(cuX,columns-1); - cuY = qMin(cuY,lines-1); - - // FIXME: try to keep values, evtl. - _topMargin=0; - _bottomMargin=lines-1; - initTabStops(); - clearSelection(); -} - -void Screen::setDefaultMargins() -{ - _topMargin = 0; - _bottomMargin = lines-1; -} - - -/* - Clarifying rendition here and in the display. - - currently, the display's color table is - 0 1 2 .. 9 10 .. 17 - dft_fg, dft_bg, dim 0..7, intensive 0..7 - - currentForeground, currentBackground contain values 0..8; - - 0 = default color - - 1..8 = ansi specified color - - re_fg, re_bg contain values 0..17 - due to the TerminalDisplay's color table - - rendition attributes are - - attr widget screen - -------------- ------ ------ - RE_UNDERLINE XX XX affects foreground only - RE_BLINK XX XX affects foreground only - RE_BOLD XX XX affects foreground only - RE_REVERSE -- XX - RE_TRANSPARENT XX -- affects background only - RE_INTENSIVE XX -- affects foreground only - - Note that RE_BOLD is used in both widget - and screen rendition. Since xterm/vt102 - is to poor to distinguish between bold - (which is a font attribute) and intensive - (which is a color attribute), we translate - this and RE_BOLD in falls eventually appart - into RE_BOLD and RE_INTENSIVE. - */ - -void Screen::reverseRendition(Character& p) const -{ - CharacterColor f = p.foregroundColor; - CharacterColor b = p.backgroundColor; - - p.foregroundColor = b; - p.backgroundColor = f; //p->r &= ~RE_TRANSPARENT; -} - -void Screen::updateEffectiveRendition() -{ - effectiveRendition = currentRendition; - if (currentRendition & RE_REVERSE) - { - effectiveForeground = currentBackground; - effectiveBackground = currentForeground; - } - else - { - effectiveForeground = currentForeground; - effectiveBackground = currentBackground; - } - - if (currentRendition & RE_BOLD) - effectiveForeground.toggleIntensive(); -} - -void Screen::copyFromHistory(Character* dest, int startLine, int count) const -{ - Q_ASSERT( startLine >= 0 && count > 0 && startLine + count <= history->getLines() ); - - for (int line = startLine; line < startLine + count; line++) - { - const int length = qMin(columns,history->getLineLen(line)); - const int destLineOffset = (line-startLine)*columns; - - history->getCells(line,0,length,dest + destLineOffset); - - for (int column = length; column < columns; column++) - dest[destLineOffset+column] = defaultChar; - - // invert selected text - if (selBegin !=-1) - { - for (int column = 0; column < columns; column++) - { - if (isSelected(column,line)) - { - reverseRendition(dest[destLineOffset + column]); - } - } - } - } -} - -void Screen::copyFromScreen(Character* dest , int startLine , int count) const -{ - Q_ASSERT( startLine >= 0 && count > 0 && startLine + count <= lines ); - - for (int line = startLine; line < (startLine+count) ; line++) - { - int srcLineStartIndex = line*columns; - int destLineStartIndex = (line-startLine)*columns; - - for (int column = 0; column < columns; column++) - { - int srcIndex = srcLineStartIndex + column; - int destIndex = destLineStartIndex + column; - - dest[destIndex] = screenLines[srcIndex/columns].value(srcIndex%columns,defaultChar); - - // invert selected text - if (selBegin != -1 && isSelected(column,line + history->getLines())) - reverseRendition(dest[destIndex]); - } - - } -} - -void Screen::getImage( Character* dest, int size, int startLine, int endLine ) const -{ - Q_ASSERT( startLine >= 0 ); - Q_ASSERT( endLine >= startLine && endLine < history->getLines() + lines ); - - const int mergedLines = endLine - startLine + 1; - - Q_ASSERT( size >= mergedLines * columns ); - Q_UNUSED( size ); - - const int linesInHistoryBuffer = qBound(0,history->getLines()-startLine,mergedLines); - const int linesInScreenBuffer = mergedLines - linesInHistoryBuffer; - - // copy lines from history buffer - if (linesInHistoryBuffer > 0) - copyFromHistory(dest,startLine,linesInHistoryBuffer); - - // copy lines from screen buffer - if (linesInScreenBuffer > 0) - copyFromScreen(dest + linesInHistoryBuffer*columns, - startLine + linesInHistoryBuffer - history->getLines(), - linesInScreenBuffer); - - // invert display when in screen mode - if (getMode(MODE_Screen)) - { - for (int i = 0; i < mergedLines*columns; i++) - reverseRendition(dest[i]); // for reverse display - } - - // mark the character at the current cursor position - int cursorIndex = loc(cuX, cuY + linesInHistoryBuffer); - if(getMode(MODE_Cursor) && cursorIndex < columns*mergedLines) - dest[cursorIndex].rendition |= RE_CURSOR; -} - -QVector<LineProperty> Screen::getLineProperties( int startLine , int endLine ) const -{ - Q_ASSERT( startLine >= 0 ); - Q_ASSERT( endLine >= startLine && endLine < history->getLines() + lines ); - - const int mergedLines = endLine-startLine+1; - const int linesInHistory = qBound(0,history->getLines()-startLine,mergedLines); - const int linesInScreen = mergedLines - linesInHistory; - - QVector<LineProperty> result(mergedLines); - int index = 0; - - // copy properties for lines in history - for (int line = startLine; line < startLine + linesInHistory; line++) - { - //TODO Support for line properties other than wrapped lines - if (history->isWrappedLine(line)) - { - result[index] = (LineProperty)(result[index] | LINE_WRAPPED); - } - index++; - } - - // copy properties for lines in screen buffer - const int firstScreenLine = startLine + linesInHistory - history->getLines(); - for (int line = firstScreenLine; line < firstScreenLine+linesInScreen; line++) - { - result[index]=lineProperties[line]; - index++; - } - - return result; -} - -void Screen::reset(bool clearScreen) -{ - setMode(MODE_Wrap ); saveMode(MODE_Wrap ); // wrap at end of margin - resetMode(MODE_Origin); saveMode(MODE_Origin); // position refere to [1,1] - resetMode(MODE_Insert); saveMode(MODE_Insert); // overstroke - setMode(MODE_Cursor); // cursor visible - resetMode(MODE_Screen); // screen not inverse - resetMode(MODE_NewLine); - - _topMargin=0; - _bottomMargin=lines-1; - - setDefaultRendition(); - saveCursor(); - - if ( clearScreen ) - clear(); -} - -void Screen::clear() -{ - clearEntireScreen(); - home(); -} - -void Screen::backspace() -{ - cuX = qMin(columns-1,cuX); // nowrap! - cuX = qMax(0,cuX-1); - - if (screenLines[cuY].size() < cuX+1) - screenLines[cuY].resize(cuX+1); - - if (BS_CLEARS) - screenLines[cuY][cuX].character = ' '; -} - -void Screen::tab(int n) -{ - // note that TAB is a format effector (does not write ' '); - if (n == 0) n = 1; - while((n > 0) && (cuX < columns-1)) - { - cursorRight(1); - while((cuX < columns-1) && !tabStops[cuX]) - cursorRight(1); - n--; - } -} - -void Screen::backtab(int n) -{ - // note that TAB is a format effector (does not write ' '); - if (n == 0) n = 1; - while((n > 0) && (cuX > 0)) - { - cursorLeft(1); while((cuX > 0) && !tabStops[cuX]) cursorLeft(1); - n--; - } -} - -void Screen::clearTabStops() -{ - for (int i = 0; i < columns; i++) tabStops[i] = false; -} - -void Screen::changeTabStop(bool set) -{ - if (cuX >= columns) return; - tabStops[cuX] = set; -} - -void Screen::initTabStops() -{ - tabStops.resize(columns); - - // Arrg! The 1st tabstop has to be one longer than the other. - // i.e. the kids start counting from 0 instead of 1. - // Other programs might behave correctly. Be aware. - for (int i = 0; i < columns; i++) - tabStops[i] = (i%8 == 0 && i != 0); -} - -void Screen::newLine() -{ - if (getMode(MODE_NewLine)) - toStartOfLine(); - index(); -} - -void Screen::checkSelection(int from, int to) -{ - if (selBegin == -1) - return; - int scr_TL = loc(0, history->getLines()); - //Clear entire selection if it overlaps region [from, to] - if ( (selBottomRight >= (from+scr_TL)) && (selTopLeft <= (to+scr_TL)) ) - clearSelection(); -} - -void Screen::displayCharacter(unsigned short c) -{ - // Note that VT100 does wrapping BEFORE putting the character. - // This has impact on the assumption of valid cursor positions. - // We indicate the fact that a newline has to be triggered by - // putting the cursor one right to the last column of the screen. - - int w = konsole_wcwidth(c); - if (w <= 0) - return; - - if (cuX+w > columns) { - if (getMode(MODE_Wrap)) { - lineProperties[cuY] = (LineProperty)(lineProperties[cuY] | LINE_WRAPPED); - nextLine(); - } - else - cuX = columns-w; - } - - // ensure current line vector has enough elements - int size = screenLines[cuY].size(); - if (size < cuX+w) - { - screenLines[cuY].resize(cuX+w); - } - - if (getMode(MODE_Insert)) insertChars(w); - - lastPos = loc(cuX,cuY); - - // check if selection is still valid. - checkSelection(lastPos, lastPos); - - Character& currentChar = screenLines[cuY][cuX]; - - currentChar.character = c; - currentChar.foregroundColor = effectiveForeground; - currentChar.backgroundColor = effectiveBackground; - currentChar.rendition = effectiveRendition; - - int i = 0; - int newCursorX = cuX + w--; - while(w) - { - i++; - - if ( screenLines[cuY].size() < cuX + i + 1 ) - screenLines[cuY].resize(cuX+i+1); - - Character& ch = screenLines[cuY][cuX + i]; - ch.character = 0; - ch.foregroundColor = effectiveForeground; - ch.backgroundColor = effectiveBackground; - ch.rendition = effectiveRendition; - - w--; - } - cuX = newCursorX; -} - -void Screen::compose(const QString& /*compose*/) -{ - Q_ASSERT( 0 /*Not implemented yet*/ ); - - /* if (lastPos == -1) - return; - - QChar c(image[lastPos].character); - compose.prepend(c); - //compose.compose(); ### FIXME! - image[lastPos].character = compose[0].unicode();*/ -} - -int Screen::scrolledLines() const -{ - return _scrolledLines; -} -int Screen::droppedLines() const -{ - return _droppedLines; -} -void Screen::resetDroppedLines() -{ - _droppedLines = 0; -} -void Screen::resetScrolledLines() -{ - _scrolledLines = 0; -} - -void Screen::scrollUp(int n) -{ - if (n == 0) n = 1; // Default - if (_topMargin == 0) addHistLine(); // history.history - scrollUp(_topMargin, n); -} - -QRect Screen::lastScrolledRegion() const -{ - return _lastScrolledRegion; -} - -void Screen::scrollUp(int from, int n) -{ - if (n <= 0 || from + n > _bottomMargin) return; - - _scrolledLines -= n; - _lastScrolledRegion = QRect(0,_topMargin,columns-1,(_bottomMargin-_topMargin)); - - //FIXME: make sure `topMargin', `bottomMargin', `from', `n' is in bounds. - moveImage(loc(0,from),loc(0,from+n),loc(columns-1,_bottomMargin)); - clearImage(loc(0,_bottomMargin-n+1),loc(columns-1,_bottomMargin),' '); -} - -void Screen::scrollDown(int n) -{ - if (n == 0) n = 1; // Default - scrollDown(_topMargin, n); -} - -void Screen::scrollDown(int from, int n) -{ - _scrolledLines += n; - - //FIXME: make sure `topMargin', `bottomMargin', `from', `n' is in bounds. - if (n <= 0) - return; - if (from > _bottomMargin) - return; - if (from + n > _bottomMargin) - n = _bottomMargin - from; - moveImage(loc(0,from+n),loc(0,from),loc(columns-1,_bottomMargin-n)); - clearImage(loc(0,from),loc(columns-1,from+n-1),' '); -} - -void Screen::setCursorYX(int y, int x) -{ - setCursorY(y); setCursorX(x); -} - -void Screen::setCursorX(int x) -{ - if (x == 0) x = 1; // Default - x -= 1; // Adjust - cuX = qMax(0,qMin(columns-1, x)); -} - -void Screen::setCursorY(int y) -{ - if (y == 0) y = 1; // Default - y -= 1; // Adjust - cuY = qMax(0,qMin(lines -1, y + (getMode(MODE_Origin) ? _topMargin : 0) )); -} - -void Screen::home() -{ - cuX = 0; - cuY = 0; -} - -void Screen::toStartOfLine() -{ - cuX = 0; -} - -int Screen::getCursorX() const -{ - return cuX; -} - -int Screen::getCursorY() const -{ - return cuY; -} - -void Screen::clearImage(int loca, int loce, char c) -{ - int scr_TL=loc(0,history->getLines()); - //FIXME: check positions - - //Clear entire selection if it overlaps region to be moved... - if ( (selBottomRight > (loca+scr_TL) )&&(selTopLeft < (loce+scr_TL)) ) - { - clearSelection(); - } - - int topLine = loca/columns; - int bottomLine = loce/columns; - - Character clearCh(c,currentForeground,currentBackground,DEFAULT_RENDITION); - - //if the character being used to clear the area is the same as the - //default character, the affected lines can simply be shrunk. - bool isDefaultCh = (clearCh == Character()); - - for (int y=topLine;y<=bottomLine;y++) - { - lineProperties[y] = 0; - - int endCol = ( y == bottomLine) ? loce%columns : columns-1; - int startCol = ( y == topLine ) ? loca%columns : 0; - - QVector<Character>& line = screenLines[y]; - - if ( isDefaultCh && endCol == columns-1 ) - { - line.resize(startCol); - } - else - { - if (line.size() < endCol + 1) - line.resize(endCol+1); - - Character* data = line.data(); - for (int i=startCol;i<=endCol;i++) - data[i]=clearCh; - } - } -} - -void Screen::moveImage(int dest, int sourceBegin, int sourceEnd) -{ - Q_ASSERT( sourceBegin <= sourceEnd ); - - int lines=(sourceEnd-sourceBegin)/columns; - - //move screen image and line properties: - //the source and destination areas of the image may overlap, - //so it matters that we do the copy in the right order - - //forwards if dest < sourceBegin or backwards otherwise. - //(search the web for 'memmove implementation' for details) - if (dest < sourceBegin) - { - for (int i=0;i<=lines;i++) - { - screenLines[ (dest/columns)+i ] = screenLines[ (sourceBegin/columns)+i ]; - lineProperties[(dest/columns)+i]=lineProperties[(sourceBegin/columns)+i]; - } - } - else - { - for (int i=lines;i>=0;i--) - { - screenLines[ (dest/columns)+i ] = screenLines[ (sourceBegin/columns)+i ]; - lineProperties[(dest/columns)+i]=lineProperties[(sourceBegin/columns)+i]; - } - } - - if (lastPos != -1) - { - int diff = dest - sourceBegin; // Scroll by this amount - lastPos += diff; - if ((lastPos < 0) || (lastPos >= (lines*columns))) - lastPos = -1; - } - - // Adjust selection to follow scroll. - if (selBegin != -1) - { - bool beginIsTL = (selBegin == selTopLeft); - int diff = dest - sourceBegin; // Scroll by this amount - int scr_TL=loc(0,history->getLines()); - int srca = sourceBegin+scr_TL; // Translate index from screen to global - int srce = sourceEnd+scr_TL; // Translate index from screen to global - int desta = srca+diff; - int deste = srce+diff; - - if ((selTopLeft >= srca) && (selTopLeft <= srce)) - selTopLeft += diff; - else if ((selTopLeft >= desta) && (selTopLeft <= deste)) - selBottomRight = -1; // Clear selection (see below) - - if ((selBottomRight >= srca) && (selBottomRight <= srce)) - selBottomRight += diff; - else if ((selBottomRight >= desta) && (selBottomRight <= deste)) - selBottomRight = -1; // Clear selection (see below) - - if (selBottomRight < 0) - { - clearSelection(); - } - else - { - if (selTopLeft < 0) - selTopLeft = 0; - } - - if (beginIsTL) - selBegin = selTopLeft; - else - selBegin = selBottomRight; - } -} - -void Screen::clearToEndOfScreen() -{ - clearImage(loc(cuX,cuY),loc(columns-1,lines-1),' '); -} - -void Screen::clearToBeginOfScreen() -{ - clearImage(loc(0,0),loc(cuX,cuY),' '); -} - -void Screen::clearEntireScreen() -{ - // Add entire screen to history - for (int i = 0; i < (lines-1); i++) - { - addHistLine(); scrollUp(0,1); - } - - clearImage(loc(0,0),loc(columns-1,lines-1),' '); -} - -/*! fill screen with 'E' - This is to aid screen alignment - */ - -void Screen::helpAlign() -{ - clearImage(loc(0,0),loc(columns-1,lines-1),'E'); -} - -void Screen::clearToEndOfLine() -{ - clearImage(loc(cuX,cuY),loc(columns-1,cuY),' '); -} - -void Screen::clearToBeginOfLine() -{ - clearImage(loc(0,cuY),loc(cuX,cuY),' '); -} - -void Screen::clearEntireLine() -{ - clearImage(loc(0,cuY),loc(columns-1,cuY),' '); -} - -void Screen::setRendition(int re) -{ - currentRendition |= re; - updateEffectiveRendition(); -} - -void Screen::resetRendition(int re) -{ - currentRendition &= ~re; - updateEffectiveRendition(); -} - -void Screen::setDefaultRendition() -{ - setForeColor(COLOR_SPACE_DEFAULT,DEFAULT_FORE_COLOR); - setBackColor(COLOR_SPACE_DEFAULT,DEFAULT_BACK_COLOR); - currentRendition = DEFAULT_RENDITION; - updateEffectiveRendition(); -} - -void Screen::setForeColor(int space, int color) -{ - currentForeground = CharacterColor(space, color); - - if ( currentForeground.isValid() ) - updateEffectiveRendition(); - else - setForeColor(COLOR_SPACE_DEFAULT,DEFAULT_FORE_COLOR); -} - -void Screen::setBackColor(int space, int color) -{ - currentBackground = CharacterColor(space, color); - - if ( currentBackground.isValid() ) - updateEffectiveRendition(); - else - setBackColor(COLOR_SPACE_DEFAULT,DEFAULT_BACK_COLOR); -} - -void Screen::clearSelection() -{ - selBottomRight = -1; - selTopLeft = -1; - selBegin = -1; -} - -void Screen::getSelectionStart(int& column , int& line) const -{ - if ( selTopLeft != -1 ) - { - column = selTopLeft % columns; - line = selTopLeft / columns; - } - else - { - column = cuX + getHistLines(); - line = cuY + getHistLines(); - } -} -void Screen::getSelectionEnd(int& column , int& line) const -{ - if ( selBottomRight != -1 ) - { - column = selBottomRight % columns; - line = selBottomRight / columns; - } - else - { - column = cuX + getHistLines(); - line = cuY + getHistLines(); - } -} -void Screen::setSelectionStart(const int x, const int y, const bool mode) -{ - selBegin = loc(x,y); - /* FIXME, HACK to correct for x too far to the right... */ - if (x == columns) selBegin--; - - selBottomRight = selBegin; - selTopLeft = selBegin; - blockSelectionMode = mode; -} - -void Screen::setSelectionEnd( const int x, const int y) -{ - if (selBegin == -1) - return; - - int endPos = loc(x,y); - - if (endPos < selBegin) - { - selTopLeft = endPos; - selBottomRight = selBegin; - } - else - { - /* FIXME, HACK to correct for x too far to the right... */ - if (x == columns) - endPos--; - - selTopLeft = selBegin; - selBottomRight = endPos; - } - - // Normalize the selection in column mode - if (blockSelectionMode) - { - int topRow = selTopLeft / columns; - int topColumn = selTopLeft % columns; - int bottomRow = selBottomRight / columns; - int bottomColumn = selBottomRight % columns; - - selTopLeft = loc(qMin(topColumn,bottomColumn),topRow); - selBottomRight = loc(qMax(topColumn,bottomColumn),bottomRow); - } -} - -bool Screen::isSelected( const int x,const int y) const -{ - bool columnInSelection = true; - if (blockSelectionMode) - { - columnInSelection = x >= (selTopLeft % columns) && - x <= (selBottomRight % columns); - } - - int pos = loc(x,y); - return pos >= selTopLeft && pos <= selBottomRight && columnInSelection; -} - -QString Screen::selectedText(bool preserveLineBreaks) const -{ - QString result; - QTextStream stream(&result, QIODevice::ReadWrite); - - PlainTextDecoder decoder; - decoder.begin(&stream); - writeSelectionToStream(&decoder , preserveLineBreaks); - decoder.end(); - - return result; -} - -bool Screen::isSelectionValid() const -{ - return selTopLeft >= 0 && selBottomRight >= 0; -} - -void Screen::writeSelectionToStream(TerminalCharacterDecoder* decoder , - bool preserveLineBreaks) const -{ - if (!isSelectionValid()) - return; - writeToStream(decoder,selTopLeft,selBottomRight,preserveLineBreaks); -} - -void Screen::writeToStream(TerminalCharacterDecoder* decoder, - int startIndex, int endIndex, - bool preserveLineBreaks) const -{ - int top = startIndex / columns; - int left = startIndex % columns; - - int bottom = endIndex / columns; - int right = endIndex % columns; - - Q_ASSERT( top >= 0 && left >= 0 && bottom >= 0 && right >= 0 ); - - for (int y=top;y<=bottom;y++) - { - int start = 0; - if ( y == top || blockSelectionMode ) start = left; - - int count = -1; - if ( y == bottom || blockSelectionMode ) count = right - start + 1; - - const bool appendNewLine = ( y != bottom ); - int copied = copyLineToStream( y, - start, - count, - decoder, - appendNewLine, - preserveLineBreaks ); - - // if the selection goes beyond the end of the last line then - // append a new line character. - // - // this makes it possible to 'select' a trailing new line character after - // the text on a line. - if ( y == bottom && - copied < count ) - { - Character newLineChar('\n'); - decoder->decodeLine(&newLineChar,1,0); - } - } -} - -int Screen::copyLineToStream(int line , - int start, - int count, - TerminalCharacterDecoder* decoder, - bool appendNewLine, - bool preserveLineBreaks) const -{ - //buffer to hold characters for decoding - //the buffer is static to avoid initialising every - //element on each call to copyLineToStream - //(which is unnecessary since all elements will be overwritten anyway) - static const int MAX_CHARS = 1024; - static Character characterBuffer[MAX_CHARS]; - - assert( count < MAX_CHARS ); - - LineProperty currentLineProperties = 0; - - //determine if the line is in the history buffer or the screen image - if (line < history->getLines()) - { - const int lineLength = history->getLineLen(line); - - // ensure that start position is before end of line - start = qMin(start,qMax(0,lineLength-1)); - - // retrieve line from history buffer. It is assumed - // that the history buffer does not store trailing white space - // at the end of the line, so it does not need to be trimmed here - if (count == -1) - { - count = lineLength-start; - } - else - { - count = qMin(start+count,lineLength)-start; - } - - // safety checks - assert( start >= 0 ); - assert( count >= 0 ); - assert( (start+count) <= history->getLineLen(line) ); - - history->getCells(line,start,count,characterBuffer); - - if ( history->isWrappedLine(line) ) - currentLineProperties |= LINE_WRAPPED; - } - else - { - if ( count == -1 ) - count = columns - start; - - assert( count >= 0 ); - - const int screenLine = line-history->getLines(); - - Character* data = screenLines[screenLine].data(); - int length = screenLines[screenLine].count(); - - //retrieve line from screen image - for (int i=start;i < qMin(start+count,length);i++) - { - characterBuffer[i-start] = data[i]; - } - - // count cannot be any greater than length - count = qBound(0,count,length-start); - - Q_ASSERT( screenLine < lineProperties.count() ); - currentLineProperties |= lineProperties[screenLine]; - } - - // add new line character at end - const bool omitLineBreak = (currentLineProperties & LINE_WRAPPED) || - !preserveLineBreaks; - - if ( !omitLineBreak && appendNewLine && (count+1 < MAX_CHARS) ) - { - characterBuffer[count] = '\n'; - count++; - } - - //decode line and write to text stream - decoder->decodeLine( (Character*) characterBuffer , - count, currentLineProperties ); - - return count; -} - -void Screen::writeLinesToStream(TerminalCharacterDecoder* decoder, int fromLine, int toLine) const -{ - writeToStream(decoder,loc(0,fromLine),loc(columns-1,toLine)); -} - -void Screen::addHistLine() -{ - // add line to history buffer - // we have to take care about scrolling, too... - - if (hasScroll()) - { - int oldHistLines = history->getLines(); - - history->addCellsVector(screenLines[0]); - history->addLine( lineProperties[0] & LINE_WRAPPED ); - - int newHistLines = history->getLines(); - - bool beginIsTL = (selBegin == selTopLeft); - - // If the history is full, increment the count - // of dropped lines - if ( newHistLines == oldHistLines ) - _droppedLines++; - - // Adjust selection for the new point of reference - if (newHistLines > oldHistLines) - { - if (selBegin != -1) - { - selTopLeft += columns; - selBottomRight += columns; - } - } - - if (selBegin != -1) - { - // Scroll selection in history up - int top_BR = loc(0, 1+newHistLines); - - if (selTopLeft < top_BR) - selTopLeft -= columns; - - if (selBottomRight < top_BR) - selBottomRight -= columns; - - if (selBottomRight < 0) - clearSelection(); - else - { - if (selTopLeft < 0) - selTopLeft = 0; - } - - if (beginIsTL) - selBegin = selTopLeft; - else - selBegin = selBottomRight; - } - } - -} - -int Screen::getHistLines() const -{ - return history->getLines(); -} - -void Screen::setScroll(const HistoryType& t , bool copyPreviousScroll) -{ - clearSelection(); - - if ( copyPreviousScroll ) - history = t.scroll(history); - else - { - HistoryScroll* oldScroll = history; - history = t.scroll(0); - delete oldScroll; - } -} - -bool Screen::hasScroll() const -{ - return history->hasScroll(); -} - -const HistoryType& Screen::getScroll() const -{ - return history->getType(); -} - -void Screen::setLineProperty(LineProperty property , bool enable) -{ - if ( enable ) - lineProperties[cuY] = (LineProperty)(lineProperties[cuY] | property); - else - lineProperties[cuY] = (LineProperty)(lineProperties[cuY] & ~property); -} -void Screen::fillWithDefaultChar(Character* dest, int count) -{ - for (int i=0;i<count;i++) - dest[i] = defaultChar; -}
deleted file mode 100644 --- a/gui//src/Screen.h +++ /dev/null @@ -1,670 +0,0 @@ -/* - This file is part of Konsole, KDE's terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 SCREEN_H -#define SCREEN_H - -// Qt -#include <QtCore/QRect> -#include <QtCore/QTextStream> -#include <QtCore/QVarLengthArray> - -// Konsole -#include "Character.h" -#include "History.h" - -#define MODE_Origin 0 -#define MODE_Wrap 1 -#define MODE_Insert 2 -#define MODE_Screen 3 -#define MODE_Cursor 4 -#define MODE_NewLine 5 -#define MODES_SCREEN 6 - -class TerminalCharacterDecoder; - -/** - \brief An image of characters with associated attributes. - - The terminal emulation ( Emulation ) receives a serial stream of - characters from the program currently running in the terminal. - From this stream it creates an image of characters which is ultimately - rendered by the display widget ( TerminalDisplay ). Some types of emulation - may have more than one screen image. - - getImage() is used to retrieve the currently visible image - which is then used by the display widget to draw the output from the - terminal. - - The number of lines of output history which are kept in addition to the current - screen image depends on the history scroll being used to store the output. - The scroll is specified using setScroll() - The output history can be retrieved using writeToStream() - - The screen image has a selection associated with it, specified using - setSelectionStart() and setSelectionEnd(). The selected text can be retrieved - using selectedText(). When getImage() is used to retrieve the visible image, - characters which are part of the selection have their colours inverted. -*/ -class Screen -{ -public: - /** Construct a new screen image of size @p lines by @p columns. */ - Screen(int lines, int columns); - ~Screen(); - - // VT100/2 Operations - // Cursor Movement - - /** - * Move the cursor up by @p n lines. The cursor will stop at the - * top margin. - */ - void cursorUp(int n); - /** - * Move the cursor down by @p n lines. The cursor will stop at the - * bottom margin. - */ - void cursorDown(int n); - /** - * Move the cursor to the left by @p n columns. - * The cursor will stop at the first column. - */ - void cursorLeft(int n); - /** - * Move the cursor to the right by @p n columns. - * The cursor will stop at the right-most column. - */ - void cursorRight(int n); - /** Position the cursor on line @p y. */ - void setCursorY(int y); - /** Position the cursor at column @p x. */ - void setCursorX(int x); - /** Position the cursor at line @p y, column @p x. */ - void setCursorYX(int y, int x); - /** - * Sets the margins for scrolling the screen. - * - * @param topLine The top line of the new scrolling margin. - * @param bottomLine The bottom line of the new scrolling margin. - */ - void setMargins(int topLine , int bottomLine); - /** Returns the top line of the scrolling region. */ - int topMargin() const; - /** Returns the bottom line of the scrolling region. */ - int bottomMargin() const; - - /** - * Resets the scrolling margins back to the top and bottom lines - * of the screen. - */ - void setDefaultMargins(); - - /** - * Moves the cursor down one line, if the MODE_NewLine mode - * flag is enabled then the cursor is returned to the leftmost - * column first. - * - * Equivalent to NextLine() if the MODE_NewLine flag is set - * or index() otherwise. - */ - void newLine(); - /** - * Moves the cursor down one line and positions it at the beginning - * of the line. Equivalent to calling Return() followed by index() - */ - void nextLine(); - - /** - * Move the cursor down one line. If the cursor is on the bottom - * line of the scrolling region (as returned by bottomMargin()) the - * scrolling region is scrolled up by one line instead. - */ - void index(); - /** - * Move the cursor up one line. If the cursor is on the top line - * of the scrolling region (as returned by topMargin()) the scrolling - * region is scrolled down by one line instead. - */ - void reverseIndex(); - - /** - * Scroll the scrolling region of the screen up by @p n lines. - * The scrolling region is initially the whole screen, but can be changed - * using setMargins() - */ - void scrollUp(int n); - /** - * Scroll the scrolling region of the screen down by @p n lines. - * The scrolling region is initially the whole screen, but can be changed - * using setMargins() - */ - void scrollDown(int n); - /** - * Moves the cursor to the beginning of the current line. - * Equivalent to setCursorX(0) - */ - void toStartOfLine(); - /** - * Moves the cursor one column to the left and erases the character - * at the new cursor position. - */ - void backspace(); - /** Moves the cursor @p n tab-stops to the right. */ - void tab(int n = 1); - /** Moves the cursor @p n tab-stops to the left. */ - void backtab(int n); - - // Editing - - /** - * Erase @p n characters beginning from the current cursor position. - * This is equivalent to over-writing @p n characters starting with the current - * cursor position with spaces. - * If @p n is 0 then one character is erased. - */ - void eraseChars(int n); - /** - * Delete @p n characters beginning from the current cursor position. - * If @p n is 0 then one character is deleted. - */ - void deleteChars(int n); - /** - * Insert @p n blank characters beginning from the current cursor position. - * The position of the cursor is not altered. - * If @p n is 0 then one character is inserted. - */ - void insertChars(int n); - /** - * Removes @p n lines beginning from the current cursor position. - * The position of the cursor is not altered. - * If @p n is 0 then one line is removed. - */ - void deleteLines(int n); - /** - * Inserts @p lines beginning from the current cursor position. - * The position of the cursor is not altered. - * If @p n is 0 then one line is inserted. - */ - void insertLines(int n); - /** Clears all the tab stops. */ - void clearTabStops(); - /** Sets or removes a tab stop at the cursor's current column. */ - void changeTabStop(bool set); - - /** Resets (clears) the specified screen @p mode. */ - void resetMode(int mode); - /** Sets (enables) the specified screen @p mode. */ - void setMode(int mode); - /** - * Saves the state of the specified screen @p mode. It can be restored - * using restoreMode() - */ - void saveMode(int mode); - /** Restores the state of a screen @p mode saved by calling saveMode() */ - void restoreMode(int mode); - /** Returns whether the specified screen @p mode is enabled or not .*/ - bool getMode(int mode) const; - - /** - * Saves the current position and appearance (text color and style) of the cursor. - * It can be restored by calling restoreCursor() - */ - void saveCursor(); - /** Restores the position and appearance of the cursor. See saveCursor() */ - void restoreCursor(); - - /** Clear the whole screen, moving the current screen contents into the history first. */ - void clearEntireScreen(); - /** - * Clear the area of the screen from the current cursor position to the end of - * the screen. - */ - void clearToEndOfScreen(); - /** - * Clear the area of the screen from the current cursor position to the start - * of the screen. - */ - void clearToBeginOfScreen(); - /** Clears the whole of the line on which the cursor is currently positioned. */ - void clearEntireLine(); - /** Clears from the current cursor position to the end of the line. */ - void clearToEndOfLine(); - /** Clears from the current cursor position to the beginning of the line. */ - void clearToBeginOfLine(); - - /** Fills the entire screen with the letter 'E' */ - void helpAlign(); - - /** - * Enables the given @p rendition flag. Rendition flags control the appearance - * of characters on the screen. - * - * @see Character::rendition - */ - void setRendition(int rendition); - /** - * Disables the given @p rendition flag. Rendition flags control the appearance - * of characters on the screen. - * - * @see Character::rendition - */ - void resetRendition(int rendition); - - /** - * Sets the cursor's foreground color. - * @param space The color space used by the @p color argument - * @param color The new foreground color. The meaning of this depends on - * the color @p space used. - * - * @see CharacterColor - */ - void setForeColor(int space, int color); - /** - * Sets the cursor's background color. - * @param space The color space used by the @p color argumnet. - * @param color The new background color. The meaning of this depends on - * the color @p space used. - * - * @see CharacterColor - */ - void setBackColor(int space, int color); - /** - * Resets the cursor's color back to the default and sets the - * character's rendition flags back to the default settings. - */ - void setDefaultRendition(); - - /** Returns the column which the cursor is positioned at. */ - int getCursorX() const; - /** Returns the line which the cursor is positioned on. */ - int getCursorY() const; - - /** Clear the entire screen and move the cursor to the home position. - * Equivalent to calling clearEntireScreen() followed by home(). - */ - void clear(); - /** - * Sets the position of the cursor to the 'home' position at the top-left - * corner of the screen (0,0) - */ - void home(); - /** - * Resets the state of the screen. This resets the various screen modes - * back to their default states. The cursor style and colors are reset - * (as if setDefaultRendition() had been called) - * - * <ul> - * <li>Line wrapping is enabled.</li> - * <li>Origin mode is disabled.</li> - * <li>Insert mode is disabled.</li> - * <li>Cursor mode is enabled. TODO Document me</li> - * <li>Screen mode is disabled. TODO Document me</li> - * <li>New line mode is disabled. TODO Document me</li> - * </ul> - * - * If @p clearScreen is true then the screen contents are erased entirely, - * otherwise they are unaltered. - */ - void reset(bool clearScreen = true); - - /** - * Displays a new character at the current cursor position. - * - * If the cursor is currently positioned at the right-edge of the screen and - * line wrapping is enabled then the character is added at the start of a new - * line below the current one. - * - * If the MODE_Insert screen mode is currently enabled then the character - * is inserted at the current cursor position, otherwise it will replace the - * character already at the current cursor position. - */ - void displayCharacter(unsigned short c); - - // Do composition with last shown character FIXME: Not implemented yet for KDE 4 - void compose(const QString& compose); - - /** - * Resizes the image to a new fixed size of @p new_lines by @p new_columns. - * In the case that @p new_columns is smaller than the current number of columns, - * existing lines are not truncated. This prevents characters from being lost - * if the terminal display is resized smaller and then larger again. - * - * The top and bottom margins are reset to the top and bottom of the new - * screen size. Tab stops are also reset and the current selection is - * cleared. - */ - void resizeImage(int new_lines, int new_columns); - - /** - * Returns the current screen image. - * The result is an array of Characters of size [getLines()][getColumns()] which - * must be freed by the caller after use. - * - * @param dest Buffer to copy the characters into - * @param size Size of @p dest in Characters - * @param startLine Index of first line to copy - * @param endLine Index of last line to copy - */ - void getImage( Character* dest , int size , int startLine , int endLine ) const; - - /** - * Returns the additional attributes associated with lines in the image. - * The most important attribute is LINE_WRAPPED which specifies that the - * line is wrapped, - * other attributes control the size of characters in the line. - */ - QVector<LineProperty> getLineProperties( int startLine , int endLine ) const; - - - /** Return the number of lines. */ - int getLines() const - { return lines; } - /** Return the number of columns. */ - int getColumns() const - { return columns; } - /** Return the number of lines in the history buffer. */ - int getHistLines() const; - /** - * Sets the type of storage used to keep lines in the history. - * If @p copyPreviousScroll is true then the contents of the previous - * history buffer are copied into the new scroll. - */ - void setScroll(const HistoryType& , bool copyPreviousScroll = true); - /** Returns the type of storage used to keep lines in the history. */ - const HistoryType& getScroll() const; - /** - * Returns true if this screen keeps lines that are scrolled off the screen - * in a history buffer. - */ - bool hasScroll() const; - - /** - * Sets the start of the selection. - * - * @param column The column index of the first character in the selection. - * @param line The line index of the first character in the selection. - * @param blockSelectionMode True if the selection is in column mode. - */ - void setSelectionStart(const int column, const int line, const bool blockSelectionMode); - - /** - * Sets the end of the current selection. - * - * @param column The column index of the last character in the selection. - * @param line The line index of the last character in the selection. - */ - void setSelectionEnd(const int column, const int line); - - /** - * Retrieves the start of the selection or the cursor position if there - * is no selection. - */ - void getSelectionStart(int& column , int& line) const; - - /** - * Retrieves the end of the selection or the cursor position if there - * is no selection. - */ - void getSelectionEnd(int& column , int& line) const; - - /** Clears the current selection */ - void clearSelection(); - - /** - * Returns true if the character at (@p column, @p line) is part of the - * current selection. - */ - bool isSelected(const int column,const int line) const; - - /** - * Convenience method. Returns the currently selected text. - * @param preserveLineBreaks Specifies whether new line characters should - * be inserted into the returned text at the end of each terminal line. - */ - QString selectedText(bool preserveLineBreaks) const; - - /** - * Copies part of the output to a stream. - * - * @param decoder A decoder which converts terminal characters into text - * @param fromLine The first line in the history to retrieve - * @param toLine The last line in the history to retrieve - */ - void writeLinesToStream(TerminalCharacterDecoder* decoder, int fromLine, int toLine) const; - - /** - * Copies the selected characters, set using @see setSelBeginXY and @see setSelExtentXY - * into a stream. - * - * @param decoder A decoder which converts terminal characters into text. - * PlainTextDecoder is the most commonly used decoder which converts characters - * into plain text with no formatting. - * @param preserveLineBreaks Specifies whether new line characters should - * be inserted into the returned text at the end of each terminal line. - */ - void writeSelectionToStream(TerminalCharacterDecoder* decoder , bool - preserveLineBreaks = true) const; - - /** - * Checks if the text between from and to is inside the current - * selection. If this is the case, the selection is cleared. The - * from and to are coordinates in the current viewable window. - * The loc(x,y) macro can be used to generate these values from a - * column,line pair. - * - * @param from The start of the area to check. - * @param to The end of the area to check - */ - void checkSelection(int from, int to); - - /** - * Sets or clears an attribute of the current line. - * - * @param property The attribute to set or clear - * Possible properties are: - * LINE_WRAPPED: Specifies that the line is wrapped. - * LINE_DOUBLEWIDTH: Specifies that the characters in the current line - * should be double the normal width. - * LINE_DOUBLEHEIGHT:Specifies that the characters in the current line - * should be double the normal height. - * Double-height lines are formed of two lines containing the same characters, - * with both having the LINE_DOUBLEHEIGHT attribute. - * This allows other parts of the code to work on the - * assumption that all lines are the same height. - * - * @param enable true to apply the attribute to the current line or false to remove it - */ - void setLineProperty(LineProperty property , bool enable); - - /** - * Returns the number of lines that the image has been scrolled up or down by, - * since the last call to resetScrolledLines(). - * - * a positive return value indicates that the image has been scrolled up, - * a negative return value indicates that the image has been scrolled down. - */ - int scrolledLines() const; - - /** - * Returns the region of the image which was last scrolled. - * - * This is the area of the image from the top margin to the - * bottom margin when the last scroll occurred. - */ - QRect lastScrolledRegion() const; - - /** - * Resets the count of the number of lines that the image has been scrolled up or down by, - * see scrolledLines() - */ - void resetScrolledLines(); - - /** - * Returns the number of lines of output which have been - * dropped from the history since the last call - * to resetDroppedLines() - * - * If the history is not unlimited then it will drop - * the oldest lines of output if new lines are added when - * it is full. - */ - int droppedLines() const; - - /** - * Resets the count of the number of lines dropped from - * the history. - */ - void resetDroppedLines(); - - /** - * Fills the buffer @p dest with @p count instances of the default (ie. blank) - * Character style. - */ - static void fillWithDefaultChar(Character* dest, int count); - -private: - - //copies a line of text from the screen or history into a stream using a - //specified character decoder. Returns the number of lines actually copied, - //which may be less than 'count' if (start+count) is more than the number of characters on - //the line - // - //line - the line number to copy, from 0 (the earliest line in the history) up to - // history->getLines() + lines - 1 - //start - the first column on the line to copy - //count - the number of characters on the line to copy - //decoder - a decoder which converts terminal characters (an Character array) into text - //appendNewLine - if true a new line character (\n) is appended to the end of the line - int copyLineToStream(int line, - int start, - int count, - TerminalCharacterDecoder* decoder, - bool appendNewLine, - bool preserveLineBreaks) const; - - //fills a section of the screen image with the character 'c' - //the parameters are specified as offsets from the start of the screen image. - //the loc(x,y) macro can be used to generate these values from a column,line pair. - void clearImage(int loca, int loce, char c); - - //move screen image between 'sourceBegin' and 'sourceEnd' to 'dest'. - //the parameters are specified as offsets from the start of the screen image. - //the loc(x,y) macro can be used to generate these values from a column,line pair. - // - //NOTE: moveImage() can only move whole lines - void moveImage(int dest, int sourceBegin, int sourceEnd); - // scroll up 'i' lines in current region, clearing the bottom 'i' lines - void scrollUp(int from, int i); - // scroll down 'i' lines in current region, clearing the top 'i' lines - void scrollDown(int from, int i); - - void addHistLine(); - - void initTabStops(); - - void updateEffectiveRendition(); - void reverseRendition(Character& p) const; - - bool isSelectionValid() const; - // copies text from 'startIndex' to 'endIndex' to a stream - // startIndex and endIndex are positions generated using the loc(x,y) macro - void writeToStream(TerminalCharacterDecoder* decoder, int startIndex, - int endIndex, bool preserveLineBreaks = true) const; - // copies 'count' lines from the screen buffer into 'dest', - // starting from 'startLine', where 0 is the first line in the screen buffer - void copyFromScreen(Character* dest, int startLine, int count) const; - // copies 'count' lines from the history buffer into 'dest', - // starting from 'startLine', where 0 is the first line in the history - void copyFromHistory(Character* dest, int startLine, int count) const; - - - // screen image ---------------- - int lines; - int columns; - - typedef QVector<Character> ImageLine; // [0..columns] - ImageLine* screenLines; // [lines] - - int _scrolledLines; - QRect _lastScrolledRegion; - - int _droppedLines; - - QVarLengthArray<LineProperty,64> lineProperties; - - // history buffer --------------- - HistoryScroll* history; - - // cursor location - int cuX; - int cuY; - - // cursor color and rendition info - CharacterColor currentForeground; - CharacterColor currentBackground; - quint8 currentRendition; - - // margins ---------------- - int _topMargin; - int _bottomMargin; - - // states ---------------- - int currentModes[MODES_SCREEN]; - int savedModes[MODES_SCREEN]; - - // ---------------------------- - - QBitArray tabStops; - - // selection ------------------- - int selBegin; // The first location selected. - int selTopLeft; // TopLeft Location. - int selBottomRight; // Bottom Right Location. - bool blockSelectionMode; // Column selection mode - - // effective colors and rendition ------------ - CharacterColor effectiveForeground; // These are derived from - CharacterColor effectiveBackground; // the cu_* variables above - quint8 effectiveRendition; // to speed up operation - - class SavedState - { - public: - SavedState() - : cursorColumn(0),cursorLine(0),rendition(0) {} - - int cursorColumn; - int cursorLine; - quint8 rendition; - CharacterColor foreground; - CharacterColor background; - }; - SavedState savedState; - - // last position where we added a character - int lastPos; - - static Character defaultChar; -}; - -#endif // SCREEN_H
deleted file mode 100644 --- a/gui//src/ScreenWindow.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* - Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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. -*/ - -// Own -#include "ScreenWindow.h" - -// Qt -#include <QtCore> - -// Konsole -#include "Screen.h" - -ScreenWindow::ScreenWindow(QObject* parent) - : QObject(parent) - , _windowBuffer(0) - , _windowBufferSize(0) - , _bufferNeedsUpdate(true) - , _windowLines(1) - , _currentLine(0) - , _trackOutput(true) - , _scrollCount(0) -{ -} -ScreenWindow::~ScreenWindow() -{ - delete[] _windowBuffer; -} -void ScreenWindow::setScreen(Screen* screen) -{ - Q_ASSERT( screen ); - - _screen = screen; -} - -Screen* ScreenWindow::screen() const -{ - return _screen; -} - -Character* ScreenWindow::getImage() -{ - // reallocate internal buffer if the window size has changed - int size = windowLines() * windowColumns(); - if (_windowBuffer == 0 || _windowBufferSize != size) - { - delete[] _windowBuffer; - _windowBufferSize = size; - _windowBuffer = new Character[size]; - _bufferNeedsUpdate = true; - } - - if (!_bufferNeedsUpdate) - return _windowBuffer; - - _screen->getImage(_windowBuffer,size, - currentLine(),endWindowLine()); - - // this window may look beyond the end of the screen, in which - // case there will be an unused area which needs to be filled - // with blank characters - fillUnusedArea(); - - _bufferNeedsUpdate = false; - return _windowBuffer; -} - -void ScreenWindow::fillUnusedArea() -{ - int screenEndLine = _screen->getHistLines() + _screen->getLines() - 1; - int windowEndLine = currentLine() + windowLines() - 1; - - int unusedLines = windowEndLine - screenEndLine; - int charsToFill = unusedLines * windowColumns(); - - Screen::fillWithDefaultChar(_windowBuffer + _windowBufferSize - charsToFill,charsToFill); -} - -// return the index of the line at the end of this window, or if this window -// goes beyond the end of the screen, the index of the line at the end -// of the screen. -// -// when passing a line number to a Screen method, the line number should -// never be more than endWindowLine() -// -int ScreenWindow::endWindowLine() const -{ - return qMin(currentLine() + windowLines() - 1, - lineCount() - 1); -} -QVector<LineProperty> ScreenWindow::getLineProperties() -{ - QVector<LineProperty> result = _screen->getLineProperties(currentLine(),endWindowLine()); - - if (result.count() != windowLines()) - result.resize(windowLines()); - - return result; -} - -QString ScreenWindow::selectedText( bool preserveLineBreaks ) const -{ - return _screen->selectedText( preserveLineBreaks ); -} - -void ScreenWindow::getSelectionStart( int& column , int& line ) -{ - _screen->getSelectionStart(column,line); - line -= currentLine(); -} -void ScreenWindow::getSelectionEnd( int& column , int& line ) -{ - _screen->getSelectionEnd(column,line); - line -= currentLine(); -} -void ScreenWindow::setSelectionStart( int column , int line , bool columnMode ) -{ - _screen->setSelectionStart( column , qMin(line + currentLine(),endWindowLine()) , columnMode); - - _bufferNeedsUpdate = true; - emit selectionChanged(); -} - -void ScreenWindow::setSelectionEnd( int column , int line ) -{ - _screen->setSelectionEnd( column , qMin(line + currentLine(),endWindowLine()) ); - - _bufferNeedsUpdate = true; - emit selectionChanged(); -} - -bool ScreenWindow::isSelected( int column , int line ) -{ - return _screen->isSelected( column , qMin(line + currentLine(),endWindowLine()) ); -} - -void ScreenWindow::clearSelection() -{ - _screen->clearSelection(); - - emit selectionChanged(); -} - -void ScreenWindow::setWindowLines(int lines) -{ - Q_ASSERT(lines > 0); - _windowLines = lines; -} -int ScreenWindow::windowLines() const -{ - return _windowLines; -} - -int ScreenWindow::windowColumns() const -{ - return _screen->getColumns(); -} - -int ScreenWindow::lineCount() const -{ - return _screen->getHistLines() + _screen->getLines(); -} - -int ScreenWindow::columnCount() const -{ - return _screen->getColumns(); -} - -QPoint ScreenWindow::cursorPosition() const -{ - QPoint position; - - position.setX( _screen->getCursorX() ); - position.setY( _screen->getCursorY() ); - - return position; -} - -int ScreenWindow::currentLine() const -{ - return qBound(0,_currentLine,lineCount()-windowLines()); -} - -void ScreenWindow::scrollBy( RelativeScrollMode mode , int amount ) -{ - if ( mode == ScrollLines ) - { - scrollTo( currentLine() + amount ); - } - else if ( mode == ScrollPages ) - { - scrollTo( currentLine() + amount * ( windowLines() / 2 ) ); - } -} - -bool ScreenWindow::atEndOfOutput() const -{ - return currentLine() == (lineCount()-windowLines()); -} - -void ScreenWindow::scrollTo( int line ) -{ - int maxCurrentLineNumber = lineCount() - windowLines(); - line = qBound(0,line,maxCurrentLineNumber); - - const int delta = line - _currentLine; - _currentLine = line; - - // keep track of number of lines scrolled by, - // this can be reset by calling resetScrollCount() - _scrollCount += delta; - - _bufferNeedsUpdate = true; - - emit scrolled(_currentLine); -} - -void ScreenWindow::setTrackOutput(bool trackOutput) -{ - _trackOutput = trackOutput; -} - -bool ScreenWindow::trackOutput() const -{ - return _trackOutput; -} - -int ScreenWindow::scrollCount() const -{ - return _scrollCount; -} - -void ScreenWindow::resetScrollCount() -{ - _scrollCount = 0; -} - -QRect ScreenWindow::scrollRegion() const -{ - bool equalToScreenSize = windowLines() == _screen->getLines(); - - if ( atEndOfOutput() && equalToScreenSize ) - return _screen->lastScrolledRegion(); - else - return QRect(0,0,windowColumns(),windowLines()); -} - -void ScreenWindow::notifyOutputChanged() -{ - // move window to the bottom of the screen and update scroll count - // if this window is currently tracking the bottom of the screen - if ( _trackOutput ) - { - _scrollCount -= _screen->scrolledLines(); - _currentLine = qMax(0,_screen->getHistLines() - (windowLines()-_screen->getLines())); - } - else - { - // if the history is not unlimited then it may - // have run out of space and dropped the oldest - // lines of output - in this case the screen - // window's current line number will need to - // be adjusted - otherwise the output will scroll - _currentLine = qMax(0,_currentLine - - _screen->droppedLines()); - - // ensure that the screen window's current position does - // not go beyond the bottom of the screen - _currentLine = qMin( _currentLine , _screen->getHistLines() ); - } - - _bufferNeedsUpdate = true; - - emit outputChanged(); -}
deleted file mode 100644 --- a/gui//src/ScreenWindow.h +++ /dev/null @@ -1,251 +0,0 @@ -/* - Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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 SCREENWINDOW_H -#define SCREENWINDOW_H - -// Qt -#include <QtCore/QObject> -#include <QtCore/QPoint> -#include <QtCore/QRect> - -// Konsole -#include "Character.h" - -class Screen; - -/** - * Provides a window onto a section of a terminal screen. - * This window can then be rendered by a terminal display widget ( TerminalDisplay ). - * - * To use the screen window, create a new ScreenWindow() instance and associated it with - * a terminal screen using setScreen(). - * Use the scrollTo() method to scroll the window up and down on the screen. - * Call the getImage() method to retrieve the character image which is currently visible in the window. - * - * setTrackOutput() controls whether the window moves to the bottom of the associated screen when new - * lines are added to it. - * - * Whenever the output from the underlying screen is changed, the notifyOutputChanged() slot should - * be called. This in turn will update the window's position and emit the outputChanged() signal - * if necessary. - */ -class ScreenWindow : public QObject -{ -Q_OBJECT - -public: - /** - * Constructs a new screen window with the given parent. - * A screen must be specified by calling setScreen() before calling getImage() or getLineProperties(). - * - * You should not call this constructor directly, instead use the Emulation::createWindow() method - * to create a window on the emulation which you wish to view. This allows the emulation - * to notify the window when the associated screen has changed and synchronize selection updates - * between all views on a session. - */ - ScreenWindow(QObject* parent = 0); - virtual ~ScreenWindow(); - - /** Sets the screen which this window looks onto */ - void setScreen(Screen* screen); - /** Returns the screen which this window looks onto */ - Screen* screen() const; - - /** - * Returns the image of characters which are currently visible through this window - * onto the screen. - * - * The buffer is managed by the ScreenWindow instance and does not need to be - * deleted by the caller. - */ - Character* getImage(); - - /** - * Returns the line attributes associated with the lines of characters which - * are currently visible through this window - */ - QVector<LineProperty> getLineProperties(); - - /** - * Returns the number of lines which the region of the window - * specified by scrollRegion() has been scrolled by since the last call - * to resetScrollCount(). scrollRegion() is in most cases the - * whole window, but will be a smaller area in, for example, applications - * which provide split-screen facilities. - * - * This is not guaranteed to be accurate, but allows views to optimise - * rendering by reducing the amount of costly text rendering that - * needs to be done when the output is scrolled. - */ - int scrollCount() const; - - /** - * Resets the count of scrolled lines returned by scrollCount() - */ - void resetScrollCount(); - - /** - * Returns the area of the window which was last scrolled, this is - * usually the whole window area. - * - * Like scrollCount(), this is not guaranteed to be accurate, - * but allows views to optimise rendering. - */ - QRect scrollRegion() const; - - /** - * Sets the start of the selection to the given @p line and @p column within - * the window. - */ - void setSelectionStart( int column , int line , bool columnMode ); - /** - * Sets the end of the selection to the given @p line and @p column within - * the window. - */ - void setSelectionEnd( int column , int line ); - /** - * Retrieves the start of the selection within the window. - */ - void getSelectionStart( int& column , int& line ); - /** - * Retrieves the end of the selection within the window. - */ - void getSelectionEnd( int& column , int& line ); - /** - * Returns true if the character at @p line , @p column is part of the selection. - */ - bool isSelected( int column , int line ); - /** - * Clears the current selection - */ - void clearSelection(); - - /** Sets the number of lines in the window */ - void setWindowLines(int lines); - /** Returns the number of lines in the window */ - int windowLines() const; - /** Returns the number of columns in the window */ - int windowColumns() const; - - /** Returns the total number of lines in the screen */ - int lineCount() const; - /** Returns the total number of columns in the screen */ - int columnCount() const; - - /** Returns the index of the line which is currently at the top of this window */ - int currentLine() const; - - /** - * Returns the position of the cursor - * within the window. - */ - QPoint cursorPosition() const; - - /** - * Convenience method. Returns true if the window is currently at the bottom - * of the screen. - */ - bool atEndOfOutput() const; - - /** Scrolls the window so that @p line is at the top of the window */ - void scrollTo( int line ); - - enum RelativeScrollMode - { - ScrollLines, - ScrollPages - }; - - /** - * Scrolls the window relative to its current position on the screen. - * - * @param mode Specifies whether @p amount refers to the number of lines or the number - * of pages to scroll. - * @param amount The number of lines or pages ( depending on @p mode ) to scroll by. If - * this number is positive, the view is scrolled down. If this number is negative, the view - * is scrolled up. - */ - void scrollBy( RelativeScrollMode mode , int amount ); - - /** - * Specifies whether the window should automatically move to the bottom - * of the screen when new output is added. - * - * If this is set to true, the window will be moved to the bottom of the associated screen ( see - * screen() ) when the notifyOutputChanged() method is called. - */ - void setTrackOutput(bool trackOutput); - /** - * Returns whether the window automatically moves to the bottom of the screen as - * new output is added. See setTrackOutput() - */ - bool trackOutput() const; - - /** - * Returns the text which is currently selected. - * - * @param preserveLineBreaks See Screen::selectedText() - */ - QString selectedText( bool preserveLineBreaks ) const; - -public slots: - /** - * Notifies the window that the contents of the associated terminal screen have changed. - * This moves the window to the bottom of the screen if trackOutput() is true and causes - * the outputChanged() signal to be emitted. - */ - void notifyOutputChanged(); - -signals: - /** - * Emitted when the contents of the associated terminal screen ( see screen() ) changes. - */ - void outputChanged(); - - /** - * Emitted when the screen window is scrolled to a different position. - * - * @param line The line which is now at the top of the window. - */ - void scrolled(int line); - - /** - * Emitted when the selection is changed. - */ - void selectionChanged(); - -private: - int endWindowLine() const; - void fillUnusedArea(); - - Screen* _screen; // see setScreen() , screen() - Character* _windowBuffer; - int _windowBufferSize; - bool _bufferNeedsUpdate; - - int _windowLines; - int _currentLine; // see scrollTo() , currentLine() - bool _trackOutput; // see setTrackOutput() , trackOutput() - int _scrollCount; // count of lines which the window has been scrolled by since - // the last call to resetScrollCount() -}; -#endif // SCREENWINDOW_H
deleted file mode 100644 --- a/gui//src/Session.cpp +++ /dev/null @@ -1,1209 +0,0 @@ -/* - This file is part of Konsole - - Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - Copyright 2009 by Thomas Dreibholz <dreibh@iem.uni-due.de> - - This program 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 program 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. -*/ - -// Own -#include "Session.h" - -// Standard -#include <assert.h> -#include <stdlib.h> -#include <signal.h> - -// Qt -#include <QtGui/QApplication> -#include <QtCore/QByteRef> -#include <QtCore/QDir> -#include <QtCore/QFile> -#include <QtCore/QRegExp> -#include <QtCore/QStringList> -#include <QtCore/QDate> - -#include "kprocess.h" -#include "kptydevice.h" - -#include "ProcessInfo.h" -#include "Pty.h" -#include "TerminalDisplay.h" -#include "ShellCommand.h" -#include "Vt102Emulation.h" - -int Session::lastSessionId = 0; - -// HACK This is copied out of QUuid::createUuid with reseeding forced. -// Required because color schemes repeatedly seed the RNG... -// ...with a constant. -QUuid createUuid() -{ - static const int intbits = sizeof(int)*8; - static int randbits = 0; - if (!randbits) - { - int max = RAND_MAX; - do { ++randbits; } while ((max=max>>1)); - } - - qsrand(uint(QDateTime::currentDateTime().toTime_t())); - qrand(); // Skip first - - QUuid result; - uint *data = &(result.data1); - int chunks = 16 / sizeof(uint); - while (chunks--) { - uint randNumber = 0; - for (int filled = 0; filled < intbits; filled += randbits) - randNumber |= qrand()<<filled; - *(data+chunks) = randNumber; - } - - result.data4[0] = (result.data4[0] & 0x3F) | 0x80; // UV_DCE - result.data3 = (result.data3 & 0x0FFF) | 0x4000; // UV_Random - - return result; -} - -Session::Session(QObject* parent) : - QObject(parent) - , _shellProcess(0) - , _emulation(0) - , _monitorActivity(false) - , _monitorSilence(false) - , _notifiedActivity(false) - , _autoClose(true) - , _wantedClose(false) - , _silenceSeconds(10) - , _addToUtmp(true) - , _flowControl(true) - , _fullScripting(false) - , _sessionId(0) - , _sessionProcessInfo(0) - , _foregroundProcessInfo(0) - , _foregroundPid(0) - //, _zmodemBusy(false) - //, _zmodemProc(0) - //, _zmodemProgress(0) - , _hasDarkBackground(false) -{ - _uniqueIdentifier = createUuid(); - - //prepare DBus communication - //new SessionAdaptor(this); - _sessionId = ++lastSessionId; - - // JPS: commented out for lack of DBUS support by default on OSX - //QDBusConnection::sessionBus().registerObject(QLatin1String("/Sessions/")+QString::number(_sessionId), this); - - //create emulation backend - _emulation = new Vt102Emulation(); - - connect( _emulation, SIGNAL( titleChanged( int, const QString & ) ), - this, SLOT( setUserTitle( int, const QString & ) ) ); - connect( _emulation, SIGNAL( stateSet(int) ), - this, SLOT( activityStateSet(int) ) ); - //connect( _emulation, SIGNAL( zmodemDetected() ), this , - // SLOT( fireZModemDetected() ) ); - connect( _emulation, SIGNAL( changeTabTextColorRequest( int ) ), - this, SIGNAL( changeTabTextColorRequest( int ) ) ); - connect( _emulation, SIGNAL(profileChangeCommandReceived(const QString&)), - this, SIGNAL( profileChangeCommandReceived(const QString&)) ); - connect( _emulation, SIGNAL(flowControlKeyPressed(bool)) , this, - SLOT(updateFlowControlState(bool)) ); - - //create new teletype for I/O with shell process - openTeletype(-1); - - //setup timer for monitoring session activity - _monitorTimer = new QTimer(this); - _monitorTimer->setSingleShot(true); - connect(_monitorTimer, SIGNAL(timeout()), this, SLOT(monitorTimerDone())); -} - -void Session::openTeletype(int fd) -{ - if (_shellProcess && isRunning()) - { - //kWarning() << "Attempted to open teletype in a running session."; - return; - } - - delete _shellProcess; - - if (fd < 0) - _shellProcess = new Pty(); - 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(lockPtyRequest(bool)),_shellProcess,SLOT(lockPty(bool)) ); - connect( _emulation,SIGNAL(useUtf8Request(bool)),_shellProcess,SLOT(setUtf8Mode(bool)) ); - connect( _shellProcess,SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(done(int)) ); - connect( _emulation,SIGNAL(imageSizeChanged(int,int)),this,SLOT(updateWindowSize(int,int)) ); -} - -WId Session::windowId() const -{ - // Returns a window ID for this session which is used - // to set the WINDOWID environment variable in the shell - // process. - // - // Sessions can have multiple views or no views, which means - // that a single ID is not always going to be accurate. - // - // If there are no views, the window ID is just 0. If - // there are multiple views, then the window ID for the - // top-level window which contains the first view is - // returned - - if ( _views.count() == 0 ) - return 0; - else - { - QWidget* window = _views.first(); - - Q_ASSERT( window ); - - while ( window->parentWidget() != 0 ) - window = window->parentWidget(); - - return window->winId(); - } -} - -void Session::setDarkBackground(bool darkBackground) -{ - _hasDarkBackground = darkBackground; -} -bool Session::hasDarkBackground() const -{ - return _hasDarkBackground; -} -bool Session::isRunning() const -{ - return _shellProcess->state() == QProcess::Running; -} - -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 _emulation->codec()->name(); -} - -void Session::setProgram(const QString& program) -{ - _program = ShellCommand::expand(program); -} -void Session::setInitialWorkingDirectory(const QString& dir) -{ - //_initialWorkingDir = KShell::tildeExpand(ShellCommand::expand(dir)); - _initialWorkingDir = ShellCommand::expand(dir); -} -void Session::setArguments(const QStringList& arguments) -{ - _arguments = ShellCommand::expand(arguments); -} - -QString Session::currentWorkingDirectory() -{ - // only returned cached value - if (_currentWorkingDir.isEmpty()) updateWorkingDirectory(); - return _currentWorkingDir; -} -ProcessInfo* Session::updateWorkingDirectory() -{ - ProcessInfo *process = getProcessInfo(); - _currentWorkingDir = process->validCurrentDir(); - return process; -} - -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 -{ - // Upon a KPty error, there is no description on what that error was... - // Check to see if the given program is executable. - QString exec = QFile::encodeName(program); - - if (exec.isEmpty()) - return QString(); - - // if 'exec' is not specified, fall back to default shell. if that - // is not set then fall back to /bin/sh - if ( exec.isEmpty() ) - exec = qgetenv("SHELL"); - if ( exec.isEmpty() ) - exec = "/bin/sh"; - return program; -} - -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)); -} - -QString Session::shellSessionId() const -{ - QString friendlyUuid(_uniqueIdentifier.toString()); - friendlyUuid.remove('-').remove('{').remove('}'); - - return friendlyUuid; -} - -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(); - } - - const int CHOICE_COUNT = 3; - QString programs[CHOICE_COUNT] = {_program,qgetenv("SHELL"),"/bin/sh"}; - QString exec; - int choice = 0; - while (choice < CHOICE_COUNT) - { - exec = checkProgram(programs[choice]); - if (exec.isEmpty()) - choice++; - else - 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; - - // JPS: commented out for lack of DBUS support by default on OSX - QString dbusService = ""; //QDBusConnection::sessionBus().baseService(); - if (!_initialWorkingDir.isEmpty()) - _shellProcess->setWorkingDirectory(_initialWorkingDir); - else - _shellProcess->setWorkingDirectory(QDir::homePath()); - - _shellProcess->setFlowControlEnabled(_flowControl); - _shellProcess->setErase(_emulation->eraseChar()); - - // this is not strictly accurate use of the COLORFGBG variable. This does not - // tell the terminal exactly which colors are being used, but instead approximates - // the color scheme as "black on white" or "white on black" depending on whether - // the background color is deemed dark or not - QString backgroundColorHint = _hasDarkBackground ? "COLORFGBG=15;0" : "COLORFGBG=0;15"; - _environment << backgroundColorHint; - _environment << QString("SHELL_SESSION_ID=%1").arg(shellSessionId()); - - int result = _shellProcess->start(exec, - arguments, - _environment, - windowId(), - _addToUtmp, - dbusService, - (QLatin1String("/Sessions/") + - QString::number(_sessionId))); - - 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. - - emit started(); -} - -void Session::setUserTitle( int what, const QString &caption ) -{ - //set to true if anything is actually changed (eg. old _nameTitle != new _nameTitle ) - bool modified = false; - - if ((what == IconNameAndWindowTitle) || (what == WindowTitle)) - { - if ( _userTitle != caption ) { - _userTitle = caption; - modified = true; - } - } - - if ((what == IconNameAndWindowTitle) || (what == IconName)) - { - if ( _iconText != caption ) { - _iconText = caption; - modified = true; - } - } - - if (what == TextColor || what == BackgroundColor) - { - QString colorString = caption.section(';',0,0); - QColor color = QColor(colorString); - if (color.isValid()) - { - if (what == TextColor) - emit changeForegroundColorRequest(color); - else - emit changeBackgroundColorRequest(color); - } - } - - if (what == SessionName) - { - if ( _nameTitle != caption ) { - setTitle(Session::NameRole,caption); - return; - } - } - - if (what == 31) - { - QString cwd=caption; - cwd=cwd.replace( QRegExp("^~"), QDir::homePath() ); - emit openUrlRequest(cwd); - } - - // change icon via \033]32;Icon\007 - if (what == 32) - { - if ( _iconName != caption ) { - _iconName = caption; - - modified = true; - } - } - - if (what == ProfileChange) - { - emit profileChangeCommandReceived(caption); - return; - } - - if ( modified ) - emit titleChanged(); -} - -QString Session::userTitle() const -{ - return _userTitle; -} -void Session::setTabTitleFormat(TabTitleContext context , const QString& format) -{ - if ( context == LocalTabTitle ) - _localTabTitleFormat = format; - else if ( context == RemoteTabTitle ) - _remoteTabTitleFormat = format; -} -QString Session::tabTitleFormat(TabTitleContext context) const -{ - if ( context == LocalTabTitle ) - return _localTabTitleFormat; - else if ( context == RemoteTabTitle ) - return _remoteTabTitleFormat; - - return QString(); -} - -void Session::monitorTimerDone() -{ - //FIXME: The idea here is that the notification popup will appear to tell the user than output from - //the terminal has stopped and the popup will disappear when the user activates the session. - // - //This breaks with the addition of multiple views of a session. The popup should disappear - //when any of the views of the session becomes active - - - //FIXME: Make message text for this notification and the activity notification more descriptive. - if (_monitorSilence) { - //KNotification::event("Silence", i18n("Silence in session '%1'", _nameTitle)propagateSize, QPixmap(), - // QApplication::activeWindow(), - // KNotification::CloseWhenWidgetActivated); - emit stateChanged(NOTIFYSILENCE); - } - else - { - emit stateChanged(NOTIFYNORMAL); - } - - _notifiedActivity=false; -} -void Session::updateFlowControlState(bool suspended) -{ - if (suspended) - { - if (flowControlEnabled()) - { - foreach(TerminalDisplay* display,_views) - { - if (display->flowControlWarningEnabled()) - display->outputSuspended(true); - } - } - } - else - { - foreach(TerminalDisplay* display,_views) - display->outputSuspended(false); - } -} -void Session::activityStateSet(int state) -{ - if (state==NOTIFYBELL) - { - emit bellRequest(QString("Bell in session '%1'").arg(_nameTitle.toLatin1().data())); - } - else if (state==NOTIFYACTIVITY) - { - if (_monitorSilence) { - _monitorTimer->start(_silenceSeconds*1000); - } - - if ( _monitorActivity ) { - //FIXME: See comments in Session::monitorTimerDone() - if (!_notifiedActivity) { - //KNotification::event("Activity", i18n("Activity in session '%1'", _nameTitle), QPixmap(), - // QApplication::activeWindow(), - //KNotification::CloseWhenWidgetActivated); - _notifiedActivity=true; - } - } - } - - if ( state==NOTIFYACTIVITY && !_monitorActivity ) - state = NOTIFYNORMAL; - if ( state==NOTIFYSILENCE && !_monitorSilence ) - state = NOTIFYNORMAL; - - emit stateChanged(state); -} - -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); - _shellProcess->setWindowSize(existingSize.height(),existingSize.width()); -} - -bool Session::kill(int signal) -{ - int result = ::kill(_shellProcess->pid(),signal); - - if ( result == 0 ) - { - _shellProcess->waitForFinished(); - return true; - } - else - return false; -} - -void Session::close() -{ - _autoClose = true; - _wantedClose = true; - - if (!isRunning() || !kill(SIGHUP)) - { - 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. - QTimer::singleShot(1, this, SIGNAL(finished())); - } -} - -void Session::sendText(const QString &text) const -{ - _emulation->sendText(text); -} - -void Session::sendMouseEvent(int buttons, int column, int line, int eventType) -{ - _emulation->sendMouseEvent(buttons, column, line, eventType); -} - -Session::~Session() -{ - if (_foregroundProcessInfo) - delete _foregroundProcessInfo; - if (_sessionProcessInfo) - delete _sessionProcessInfo; - delete _emulation; - delete _shellProcess; - //delete _zmodemProc; -} - -void Session::done(int exitStatus) -{ - if (!_autoClose) - { - _userTitle = QString("@info:shell This session is done"); - emit titleChanged(); - return; - } - - QString message; - QTextStream msgStream(&message); - if (!_wantedClose || exitStatus != 0) - { - if (_shellProcess->exitStatus() == QProcess::NormalExit) - { - msgStream << "Program '" << _program << "' exited with statis " << 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(); -} - -Emulation* Session::emulation() const -{ - return _emulation; -} - -QString Session::keyBindings() const -{ - return _emulation->keyBindings(); -} - -QStringList Session::environment() const -{ - return _environment; -} - -void Session::setEnvironment(const QStringList& environment) -{ - _environment = environment; -} - -int Session::sessionId() const -{ - return _sessionId; -} - -void Session::setKeyBindings(const QString &id) -{ - _emulation->setKeyBindings(id); -} - -void Session::setTitle(TitleRole role , const QString& newTitle) -{ - if ( title(role) != newTitle ) - { - if ( role == NameRole ) - _nameTitle = newTitle; - else if ( role == DisplayedTitleRole ) - _displayTitle = newTitle; - - emit titleChanged(); - } -} - -QString Session::title(TitleRole role) const -{ - if ( role == NameRole ) - return _nameTitle; - else if ( role == DisplayedTitleRole ) - return _displayTitle; - else - return QString(); -} - -ProcessInfo* Session::getProcessInfo() -{ - ProcessInfo* process; - - if (isForegroundProcessActive()) - process = _foregroundProcessInfo; - else - { - updateSessionProcessInfo(); - process = _sessionProcessInfo; - } - - return process; -} - -void Session::updateSessionProcessInfo() -{ - Q_ASSERT(_shellProcess); - if (!_sessionProcessInfo) - { - _sessionProcessInfo = ProcessInfo::newInstance(processId()); - _sessionProcessInfo->setUserHomeDir(); - } - _sessionProcessInfo->update(); -} - -bool Session::updateForegroundProcessInfo() -{ - bool valid = (_foregroundProcessInfo != 0); - - // has foreground process changed? - Q_ASSERT(_shellProcess); - int pid = _shellProcess->foregroundProcessGroup(); - if (pid != _foregroundPid) - { - if (valid) - delete _foregroundProcessInfo; - _foregroundProcessInfo = ProcessInfo::newInstance(pid); - _foregroundPid = pid; - valid = true; - } - - if (valid) - { - _foregroundProcessInfo->update(); - valid = _foregroundProcessInfo->isValid(); - } - - return valid; -} - -bool Session::isRemote() -{ - ProcessInfo* process = getProcessInfo(); - - bool ok = false; - return ( process->name(&ok) == "ssh" && ok ); -} - -QString Session::getDynamicTitle() -{ - // update current directory from process - ProcessInfo* process = updateWorkingDirectory(); - - // format tab titles using process info - bool ok = false; - QString title; - if ( process->name(&ok) == "ssh" && ok ) - { - SSHProcessInfo sshInfo(*process); - title = sshInfo.format(tabTitleFormat(Session::RemoteTabTitle)); - } - else - title = process->format(tabTitleFormat(Session::LocalTabTitle)); - - return title; -} - -void Session::setIconName(const QString& iconName) -{ - if ( iconName != _iconName ) - { - _iconName = iconName; - emit titleChanged(); - } -} - -void Session::setIconText(const QString& iconText) -{ - _iconText = iconText; -} - -QString Session::iconName() const -{ - return _iconName; -} - -QString Session::iconText() const -{ - return _iconText; -} - -void Session::setHistoryType(const HistoryType &hType) -{ - _emulation->setHistory(hType); -} - -const HistoryType& Session::historyType() const -{ - return _emulation->history(); -} - -void Session::clearHistory() -{ - _emulation->clearHistory(); -} - -QStringList Session::arguments() const -{ - return _arguments; -} - -QString Session::program() const -{ - return _program; -} - -// unused currently -bool Session::isMonitorActivity() const { return _monitorActivity; } -// unused currently -bool Session::isMonitorSilence() const { return _monitorSilence; } - -void Session::setMonitorActivity(bool _monitor) -{ - _monitorActivity=_monitor; - _notifiedActivity=false; - - activityStateSet(NOTIFYNORMAL); -} - -void Session::setMonitorSilence(bool _monitor) -{ - if (_monitorSilence==_monitor) - return; - - _monitorSilence=_monitor; - if (_monitorSilence) - { - _monitorTimer->start(_silenceSeconds*1000); - } - else - _monitorTimer->stop(); - - activityStateSet(NOTIFYNORMAL); -} - -void Session::setMonitorSilenceSeconds(int seconds) -{ - _silenceSeconds=seconds; - if (_monitorSilence) { - _monitorTimer->start(_silenceSeconds*1000); - } -} - -void Session::setAddToUtmp(bool set) -{ - _addToUtmp = set; -} - -void Session::setFlowControlEnabled(bool enabled) -{ - _flowControl = enabled; - - if (_shellProcess) - _shellProcess->setFlowControlEnabled(_flowControl); - emit flowControlEnabledChanged(enabled); -} -bool Session::flowControlEnabled() const -{ - if (_shellProcess) - return _shellProcess->flowControlEnabled(); - else - return _flowControl; -} - -void Session::onReceiveBlock( const char* buf, int len ) -{ - _emulation->receiveData( buf, len ); - emit receivedData( QString::fromLatin1( buf, len ) ); -} - -QSize Session::size() -{ - return _emulation->imageSize(); -} - -void Session::setSize(const QSize& size) -{ - if ((size.width() <= 1) || (size.height() <= 1)) - return; - - emit resizeRequest(size); -} -int Session::processId() const -{ - return _shellProcess->pid(); -} - -void Session::setTitle(int role , const QString& title) -{ - switch (role) { - case (0): - this->setTitle(Session::NameRole, title); - break; - case (1): - this->setTitle(Session::DisplayedTitleRole, title); - break; - } -} - -QString Session::title(int role) const -{ - switch (role) { - case (0): - return this->title(Session::NameRole); - case (1): - return this->title(Session::DisplayedTitleRole); - default: - return QString(); - } -} - -void Session::setTabTitleFormat(int context , const QString& format) -{ - switch (context) { - case (0): - this->setTabTitleFormat(Session::LocalTabTitle, format); - break; - case (1): - this->setTabTitleFormat(Session::RemoteTabTitle, format); - break; - } -} - -QString Session::tabTitleFormat(int context) const -{ - switch (context) { - case (0): - return this->tabTitleFormat(Session::LocalTabTitle); - case (1): - return this->tabTitleFormat(Session::RemoteTabTitle); - default: - return QString(); - } -} - -int Session::foregroundProcessId() -{ - int pid; - - bool ok = false; - pid = getProcessInfo()->pid(&ok); - if (!ok) - pid = -1; - - return pid; -} - -bool Session::isForegroundProcessActive() -{ - // foreground process info is always updated after this - return updateForegroundProcessInfo() && (processId() != _foregroundPid); -} - -QString Session::foregroundProcessName() -{ - QString name; - - if (updateForegroundProcessInfo()) - { - bool ok = false; - name = _foregroundProcessInfo->name(&ok); - if (!ok) - name.clear(); - } - - return name; -} - -SessionGroup::SessionGroup(QObject* parent) - : QObject(parent), _masterMode(0) -{ -} -SessionGroup::~SessionGroup() -{ -} -int SessionGroup::masterMode() const { return _masterMode; } -QList<Session*> SessionGroup::sessions() const { return _sessions.keys(); } -bool SessionGroup::masterStatus(Session* session) const { return _sessions[session]; } - -void SessionGroup::addSession(Session* session) -{ - connect(session,SIGNAL(finished()),this,SLOT(sessionFinished())); - _sessions.insert(session,false); -} -void SessionGroup::removeSession(Session* session) -{ - disconnect(session,SIGNAL(finished()),this,SLOT(sessionFinished())); - setMasterStatus(session,false); - _sessions.remove(session); -} -void SessionGroup::sessionFinished() -{ - Session* session = qobject_cast<Session*>(sender()); - Q_ASSERT(session); - removeSession(session); -} -void SessionGroup::setMasterMode(int mode) -{ - _masterMode = mode; -} -QList<Session*> SessionGroup::masters() const -{ - return _sessions.keys(true); -} -void SessionGroup::setMasterStatus(Session* session , bool master) -{ - const bool wasMaster = _sessions[session]; - - if (wasMaster == master) { - // No status change -> nothing to do. - return; - } - _sessions[session] = master; - - if(master) { - connect( session->emulation() , SIGNAL(sendData(const char*,int)) , this, - SLOT(forwardData(const char*,int)) ); - } - else { - disconnect( session->emulation() , SIGNAL(sendData(const char*,int)) , this, - SLOT(forwardData(const char*,int)) ); - } -} -void SessionGroup::forwardData(const char* data, int size) -{ - static bool _inForwardData = false; - if(_inForwardData) { // Avoid recursive calls among session groups! - // A recursive call happens when a master in group A calls forwardData() - // in group B. If one of the destination sessions in group B is also a - // master of a group including the master session of group A, this would - // again call forwardData() in group A, and so on. - return; - } - - _inForwardData = true; - QListIterator<Session*> iter(_sessions.keys()); - while(iter.hasNext()) { - Session* other = iter.next(); - if(!_sessions[other]) { - other->emulation()->sendString(data, size); - } - } - _inForwardData = false; -} - -
deleted file mode 100644 --- a/gui//src/Session.h +++ /dev/null @@ -1,752 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - Copyright 2009 by Thomas Dreibholz <dreibh@iem.uni-due.de> - - This program 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 program 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 SESSION_H -#define SESSION_H - -// Qt -#include <QtCore/QStringList> -#include <QtCore/QByteRef> -#include <QtCore/QSize> -#include <QUuid> -#include <QWidget> - -// Konsole -#include "History.h" - -class KProcess; -class KUrl; -class Emulation; -class Pty; -class ProcessInfo; -class TerminalDisplay; - //class ZModemDialog; -/** - * Represents a terminal session consisting of a pseudo-teletype and a terminal emulation. - * The pseudo-teletype (or PTY) handles I/O between the terminal process and Konsole. - * The terminal emulation ( Emulation and subclasses ) processes the output stream from the - * PTY and produces a character image which is then shown on views connected to the session. - * - * Each Session can be connected to one or more views by using the addView() method. - * The attached views can then display output from the program running in the terminal - * or send input to the program in the terminal in the form of keypresses and mouse - * activity. - */ -class Session : public QObject -{ -Q_OBJECT -Q_CLASSINFO("D-Bus Interface", "org.kde.konsole.Session") - -public: - Q_PROPERTY(QString name READ nameTitle) - Q_PROPERTY(int processId READ processId) - Q_PROPERTY(QString keyBindings READ keyBindings WRITE setKeyBindings) - Q_PROPERTY(QSize size READ size WRITE setSize) - - /** - * Constructs a new session. - * - * To start the terminal process, call the run() method, - * after specifying the program and arguments - * using setProgram() and setArguments() - * - * If no program or arguments are specified explicitly, the Session - * falls back to using the program specified in the SHELL environment - * variable. - */ - explicit Session(QObject* parent = 0); - ~Session(); - - /** - * Connect to an existing terminal. When a new Session() is constructed it - * automatically searches for and opens a new teletype. If you want to - * use an existing teletype (given its file descriptor) call this after - * constructing the session. - * - * Calling openTeletype() while a session is running has no effect. - * - * @param masterFd The file descriptor of the pseudo-teletype master (See KPtyProcess::KPtyProcess()) - */ - void openTeletype(int masterFd); - - /** - * Returns true if the session is currently running. This will be true - * after run() has been called successfully. - */ - bool isRunning() const; - - /** - * Adds a new view for this session. - * - * The viewing widget will display the output from the terminal and - * input from the viewing widget (key presses, mouse activity etc.) - * will be sent to the terminal. - * - * Views can be removed using removeView(). The session is automatically - * closed when the last view is removed. - */ - void addView(TerminalDisplay* widget); - /** - * Removes a view from this session. When the last view is removed, - * the session will be closed automatically. - * - * @p widget will no longer display output from or send input - * to the terminal - */ - void removeView(TerminalDisplay* widget); - - /** - * Returns the views connected to this session - */ - QList<TerminalDisplay*> views() const; - - /** - * Returns the terminal emulation instance being used to encode / decode - * characters to / from the process. - */ - Emulation* emulation() const; - - /** Returns the unique ID for this session. */ - int sessionId() const; - - /** - * This enum describes the contexts for which separate - * tab title formats may be specified. - */ - enum TabTitleContext - { - /** Default tab title format */ - LocalTabTitle, - /** - * Tab title format used session currently contains - * a connection to a remote computer (via SSH) - */ - RemoteTabTitle - }; - - /** - * Returns true if the session currently contains a connection to a - * remote computer. It currently supports ssh. - */ - bool isRemote(); - - /** - * Sets the format used by this session for tab titles. - * - * @param context The context whoose format should be set. - * @param format The tab title format. This may be a mixture - * of plain text and dynamic elements denoted by a '%' character - * followed by a letter. (eg. %d for directory). The dynamic - * elements available depend on the @p context - */ - void setTabTitleFormat(TabTitleContext context , const QString& format); - /** Returns the format used by this session for tab titles. */ - QString tabTitleFormat(TabTitleContext context) const; - - - /** Returns the arguments passed to the shell process when run() is called. */ - QStringList arguments() const; - /** Returns the program name of the shell process started when run() is called. */ - QString program() const; - - /** - * Sets the command line arguments which the session's program will be passed when - * run() is called. - */ - void setArguments(const QStringList& arguments); - /** Sets the program to be executed when run() is called. */ - void setProgram(const QString& program); - - /** Returns the session's current working directory. */ - QString initialWorkingDirectory() { return _initialWorkingDir; } - - /** - * Sets the initial working directory for the session when it is run - * This has no effect once the session has been started. - */ - void setInitialWorkingDirectory( const QString& dir ); - - /** - * Returns the current directory of the foreground process in the session - */ - QString currentWorkingDirectory(); - - /** - * Sets the type of history store used by this session. - * Lines of output produced by the terminal are added - * to the history store. The type of history store - * used affects the number of lines which can be - * remembered before they are lost and the storage - * (in memory, on-disk etc.) used. - */ - void setHistoryType(const HistoryType& type); - /** - * Returns the type of history store used by this session. - */ - const HistoryType& historyType() const; - /** - * Clears the history store used by this session. - */ - void clearHistory(); - - /** - * Sets the key bindings used by this session. The bindings - * specify how input key sequences are translated into - * the character stream which is sent to the terminal. - * - * @param id The name of the key bindings to use. The - * names of available key bindings can be determined using the - * KeyboardTranslatorManager class. - */ - void setKeyBindings(const QString& id); - /** Returns the name of the key bindings used by this session. */ - QString keyBindings() const; - - /** - * This enum describes the available title roles. - */ - enum TitleRole - { - /** The name of the session. */ - NameRole, - /** The title of the session which is displayed in tabs etc. */ - DisplayedTitleRole - }; - - /** - * Return the session title set by the user (ie. the program running - * in the terminal), or an empty string if the user has not set a custom title - */ - QString userTitle() const; - - /** Convenience method used to read the name property. Returns title(Session::NameRole). */ - QString nameTitle() const { return title(Session::NameRole); } - /** Returns a title generated from tab format and process information. */ - QString getDynamicTitle(); - - /** Sets the name of the icon associated with this session. */ - void setIconName(const QString& iconName); - /** Returns the name of the icon associated with this session. */ - QString iconName() const; - - /** Return URL for the session. */ - //KUrl getUrl(); - - /** Sets the text of the icon associated with this session. */ - void setIconText(const QString& iconText); - /** Returns the text of the icon associated with this session. */ - QString iconText() const; - - /** Sets the session's title for the specified @p role to @p title. */ - void setTitle(TitleRole role , const QString& title); - - /** Returns the session's title for the specified @p role. */ - QString title(TitleRole role) const; - - /** - * Specifies whether a utmp entry should be created for the pty used by this session. - * If true, KPty::login() is called when the session is started. - */ - void setAddToUtmp(bool); - - /** - * Specifies whether to close the session automatically when the terminal - * process terminates. - */ - void setAutoClose(bool b) { _autoClose = b; } - - /** Returns true if the user has started a program in the session. */ - bool isForegroundProcessActive(); - - /** Returns the name of the current foreground process. */ - QString foregroundProcessName(); - - /** Returns the terminal session's window size in lines and columns. */ - QSize size(); - /** - * Emits a request to resize the session to accommodate - * the specified window size. - * - * @param size The size in lines and columns to request. - */ - void setSize(const QSize& size); - - /** - * Sets whether the session has a dark background or not. The session - * uses this information to set the COLORFGBG variable in the process's - * environment, which allows the programs running in the terminal to determine - * whether the background is light or dark and use appropriate colors by default. - * - * This has no effect once the session is running. - */ - void setDarkBackground(bool darkBackground); - /** - * Returns true if the session has a dark background. - * See setDarkBackground() - */ - bool hasDarkBackground() const; - - /** - * Attempts to get the shell program to redraw the current display area. - * This can be used after clearing the screen, for example, to get the - * shell to redraw the prompt line. - */ - void refresh(); - - // void startZModem(const QString &rz, const QString &dir, const QStringList &list); - // void cancelZModem(); - // bool isZModemBusy() { return _zmodemBusy; } - - /** - * Possible values of the @p what parameter for setUserTitle() - * See "Operating System Controls" section on http://rtfm.etla.org/xterm/ctlseq.html - */ - enum UserTitleChange - { - IconNameAndWindowTitle = 0, - IconName = 1, - WindowTitle = 2, - TextColor = 10, - BackgroundColor = 11, - SessionName = 30, - ProfileChange = 50 // this clashes with Xterm's font change command - }; - - // Sets the text codec used by this sessions terminal emulation. - void setCodec(QTextCodec* codec); - - // session management - //void saveSession(KConfigGroup& group); - //void restoreSession(KConfigGroup& group); - -public slots: - - /** - * Starts the terminal session. - * - * This creates the terminal process and connects the teletype to it. - */ - void run(); - - /** - * Returns the environment of this session as a list of strings like - * VARIABLE=VALUE - */ - Q_SCRIPTABLE QStringList environment() const; - - /** - * Sets the environment for this session. - * @p environment should be a list of strings like - * VARIABLE=VALUE - */ - Q_SCRIPTABLE void setEnvironment(const QStringList& environment); - - /** - * Closes the terminal session. This sends a hangup signal - * (SIGHUP) to the terminal process and causes the finished() - * signal to be emitted. If the process does not respond to the SIGHUP signal - * then the terminal connection (the pty) is closed and Konsole waits for the - * process to exit. - */ - Q_SCRIPTABLE void close(); - - /** - * Changes the session title or other customizable aspects of the terminal - * emulation display. For a list of what may be changed see the - * Emulation::titleChanged() signal. - * - * @param what The feature being changed. Value is one of UserTitleChange - * @param caption The text part of the terminal command - */ - void setUserTitle( int what , const QString &caption ); - - /** - * Enables monitoring for activity in the session. - * This will cause notifySessionState() to be emitted - * with the NOTIFYACTIVITY state flag when output is - * received from the terminal. - */ - Q_SCRIPTABLE void setMonitorActivity(bool); - - /** Returns true if monitoring for activity is enabled. */ - Q_SCRIPTABLE bool isMonitorActivity() const; - - /** - * Enables monitoring for silence in the session. - * This will cause notifySessionState() to be emitted - * with the NOTIFYSILENCE state flag when output is not - * received from the terminal for a certain period of - * time, specified with setMonitorSilenceSeconds() - */ - Q_SCRIPTABLE void setMonitorSilence(bool); - - /** - * Returns true if monitoring for inactivity (silence) - * in the session is enabled. - */ - Q_SCRIPTABLE bool isMonitorSilence() const; - - /** See setMonitorSilence() */ - Q_SCRIPTABLE void setMonitorSilenceSeconds(int seconds); - - /** - * Sets whether flow control is enabled for this terminal - * session. - */ - Q_SCRIPTABLE void setFlowControlEnabled(bool enabled); - - /** Returns whether flow control is enabled for this terminal session. */ - Q_SCRIPTABLE bool flowControlEnabled() const; - - /** - * Sends @p text to the current foreground terminal program. - */ - Q_SCRIPTABLE void sendText(const QString& text) const; - - /** - * Sends a mouse event of type @p eventType emitted by button - * @p buttons on @p column/@p line to the current foreground - * terminal program - */ - Q_SCRIPTABLE void sendMouseEvent(int buttons, int column, int line, int eventType); - - /** - * Returns the process id of the terminal process. - * This is the id used by the system API to refer to the process. - */ - Q_SCRIPTABLE int processId() const; - - /** - * Returns the process id of the terminal's foreground process. - * This is initially the same as processId() but can change - * as the user starts other programs inside the terminal. - */ - Q_SCRIPTABLE int foregroundProcessId(); - - /** Sets the text codec used by this sessions terminal emulation. - * Overloaded to accept a QByteArray for convenience since DBus - * does not accept QTextCodec directky. - */ - Q_SCRIPTABLE bool setCodec(QByteArray codec); - - /** Returns the codec used to decode incoming characters in this - * terminal emulation - */ - Q_SCRIPTABLE 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 - * exported directly through DBus - */ - Q_SCRIPTABLE void setTitle(int role, const QString& title); - - /** Returns the session's title for the specified @p role. - * This is an overloaded member function for setTitle(TitleRole) - * provided for convenience since enum data types may not be - * exported directly through DBus - */ - Q_SCRIPTABLE QString title(int role) const; - - /** Returns the "friendly" version of the QUuid of this session. - * This is a QUuid with the braces and dashes removed, so it cannot be - * used to construct a new QUuid. The same text appears in the - * SHELL_SESSION_ID environment variable. - */ - Q_SCRIPTABLE QString shellSessionId() const; - - /** Sets the session's tab title format for the specified @p context to @p format. - * This is an overloaded member function for setTabTitleFormat(TabTitleContext, QString) - * provided for convenience since enum data types may not be - * exported directly through DBus - */ - Q_SCRIPTABLE void setTabTitleFormat(int context, const QString& format); - - /** Returns the session's tab title format for the specified @p context. - * This is an overloaded member function for tabTitleFormat(TitleRole) - * provided for convenience since enum data types may not be - * exported directly through DBus - */ - Q_SCRIPTABLE QString tabTitleFormat(int context) const; - -signals: - - /** Emitted when the terminal process starts. */ - void started(); - - /** - * Emitted when the terminal process exits. - */ - void finished(); - - /** - * Emitted when output is received from the terminal process. - */ - void receivedData( const QString& text ); - - /** Emitted when the session's title has changed. */ - void titleChanged(); - - /** - * Emitted when the activity state of this session changes. - * - * @param state The new state of the session. This may be one - * of NOTIFYNORMAL, NOTIFYSILENCE or NOTIFYACTIVITY - */ - void stateChanged(int state); - - /** Emitted when a bell event occurs in the session. */ - void bellRequest( const QString& message ); - - /** - * Requests that the color the text for any tabs associated with - * this session should be changed; - * - * TODO: Document what the parameter does - */ - void changeTabTextColorRequest(int); - - /** - * Requests that the background color of views on this session - * should be changed. - */ - void changeBackgroundColorRequest(const QColor&); - /** - * Requests that the text color of views on this session should - * be changed to @p color. - */ - void changeForegroundColorRequest(const QColor&); - - /** TODO: Document me. */ - void openUrlRequest(const QString& url); - - /** TODO: Document me. */ - //void zmodemDetected(); - - /** - * 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. - * - * @param text The text of the command. This is a string of the form - * "PropertyName=Value;PropertyName=Value ..." - */ - void profileChangeCommandReceived(const QString& text); - - /** - * Emitted when the flow control state changes. - * - * @param enabled True if flow control is enabled or false otherwise. - */ - void flowControlEnabledChanged(bool enabled); - -private slots: - void done(int); - - // void fireZModemDetected(); - - 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 zmodemReadStatus(); - //void zmodemReadAndSendBlock(); - //void zmodemRcvBlock(const char *data, int len); - //void zmodemFinished(); - - void updateFlowControlState(bool suspended); - void updateWindowSize(int lines, int columns); -private: - - void updateTerminalSize(); - WId windowId() const; - 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; - ProcessInfo* getProcessInfo(); - void updateSessionProcessInfo(); - bool updateForegroundProcessInfo(); - ProcessInfo* updateWorkingDirectory(); - - QUuid _uniqueIdentifier; // SHELL_SESSION_ID - - Pty* _shellProcess; - Emulation* _emulation; - - QList<TerminalDisplay*> _views; - - bool _monitorActivity; - bool _monitorSilence; - bool _notifiedActivity; - bool _masterMode; - bool _autoClose; - bool _wantedClose; - QTimer* _monitorTimer; - - int _silenceSeconds; - - QString _nameTitle; - QString _displayTitle; - QString _userTitle; - - QString _localTabTitleFormat; - QString _remoteTabTitleFormat; - - QString _iconName; - QString _iconText; // as set by: echo -en '\033]1;IconText\007 - bool _addToUtmp; - bool _flowControl; - bool _fullScripting; - - QString _program; - QStringList _arguments; - - QStringList _environment; - int _sessionId; - - QString _initialWorkingDir; - QString _currentWorkingDir; - - ProcessInfo* _sessionProcessInfo; - ProcessInfo* _foregroundProcessInfo; - int _foregroundPid; - - // ZModem - // bool _zmodemBusy; - // KProcess* _zmodemProc; - // ZModemDialog* _zmodemProgress; - - // Color/Font Changes by ESC Sequences - - QColor _modifiedBackground; // as set by: echo -en '\033]11;Color\007 - - QString _profileKey; - - bool _hasDarkBackground; - - static int lastSessionId; - -}; - -/** - * Provides a group of sessions which is divided into master and slave sessions. - * Activity in master sessions can be propagated to all sessions within the group. - * The type of activity which is propagated and method of propagation is controlled - * by the masterMode() flags. - */ -class SessionGroup : public QObject -{ -Q_OBJECT - -public: - /** Constructs an empty session group. */ - SessionGroup(QObject* parent); - /** Destroys the session group and removes all connections between master and slave sessions. */ - ~SessionGroup(); - - /** Adds a session to the group. */ - void addSession( Session* session ); - /** Removes a session from the group. */ - void removeSession( Session* session ); - - /** Returns the list of sessions currently in the group. */ - QList<Session*> sessions() const; - - /** - * Sets whether a particular session is a master within the group. - * Changes or activity in the group's master sessions may be propagated - * to all the sessions in the group, depending on the current masterMode() - * - * @param session The session whoose master status should be changed. - * @param master True to make this session a master or false otherwise - */ - void setMasterStatus( Session* session , bool master ); - /** Returns the master status of a session. See setMasterStatus() */ - bool masterStatus( Session* session ) const; - - /** - * This enum describes the options for propagating certain activity or - * changes in the group's master sessions to all sessions in the group. - */ - enum MasterMode - { - /** - * Any input key presses in the master sessions are sent to all - * sessions in the group. - */ - CopyInputToAll = 1 - }; - - /** - * Specifies which activity in the group's master sessions is propagated - * to all sessions in the group. - * - * @param mode A bitwise OR of MasterMode flags. - */ - void setMasterMode( int mode ); - /** - * Returns a bitwise OR of the active MasterMode flags for this group. - * See setMasterMode() - */ - int masterMode() const; - -private slots: - void sessionFinished(); - void forwardData(const char* data, int size); - -private: - QList<Session*> masters() const; - - // maps sessions to their master status - QHash<Session*,bool> _sessions; - - int _masterMode; -}; - -#endif - -/* - Local Variables: - mode: c++ - c-file-style: "stroustrup" - indent-tabs-mode: nil - tab-width: 4 - End: -*/
deleted file mode 100644 --- a/gui//src/ShellCommand.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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. -*/ - -// Own -#include "ShellCommand.h" - -//some versions of gcc(4.3) require explicit include -#include <cstdlib> - -// expands environment variables in 'text' -// function copied from kdelibs/kio/kio/kurlcompletion.cpp -static bool expandEnv(QString& text); - -ShellCommand::ShellCommand(const QString& fullCommand) -{ - bool inQuotes = false; - - QString builder; - - for ( int i = 0 ; i < fullCommand.count() ; i++ ) - { - QChar ch = fullCommand[i]; - - const bool isLastChar = ( i == fullCommand.count() - 1 ); - const bool isQuote = ( ch == '\'' || ch == '\"' ); - - if ( !isLastChar && isQuote ) - inQuotes = !inQuotes; - else - { - if ( (!ch.isSpace() || inQuotes) && !isQuote ) - builder.append(ch); - - if ( (ch.isSpace() && !inQuotes) || ( i == fullCommand.count()-1 ) ) - { - _arguments << builder; - builder.clear(); - } - } - } -} -ShellCommand::ShellCommand(const QString& command , const QStringList& arguments) -{ - _arguments = arguments; - - if ( !_arguments.isEmpty() ) - _arguments[0] == command; -} -QString ShellCommand::fullCommand() const -{ - return _arguments.join(QChar(' ')); -} -QString ShellCommand::command() const -{ - if ( !_arguments.isEmpty() ) - return _arguments[0]; - else - return QString(); -} -QStringList ShellCommand::arguments() const -{ - return _arguments; -} -bool ShellCommand::isRootCommand() const -{ - Q_ASSERT(0); // not implemented yet - return false; -} -bool ShellCommand::isAvailable() const -{ - Q_ASSERT(0); // not implemented yet - return false; -} -QStringList ShellCommand::expand(const QStringList& items) -{ - QStringList result; - - foreach( QString item , items ) - result << expand(item); - - return result; -} -QString ShellCommand::expand(const QString& text) -{ - QString result = text; - expandEnv(result); - return result; -} - -/* - * expandEnv - * - * Expand environment variables in text. Escaped '$' characters are ignored. - * Return true if any variables were expanded - */ -static bool expandEnv( QString &text ) -{ - // Find all environment variables beginning with '$' - // - int pos = 0; - - bool expanded = false; - - while ( (pos = text.indexOf(QLatin1Char('$'), pos)) != -1 ) { - - // Skip escaped '$' - // - if ( pos > 0 && text.at(pos-1) == QLatin1Char('\\') ) { - pos++; - } - // Variable found => expand - // - else { - // Find the end of the variable = next '/' or ' ' - // - int pos2 = text.indexOf( QLatin1Char(' '), pos+1 ); - int pos_tmp = text.indexOf( QLatin1Char('/'), pos+1 ); - - if ( pos2 == -1 || (pos_tmp != -1 && pos_tmp < pos2) ) - pos2 = pos_tmp; - - if ( pos2 == -1 ) - pos2 = text.length(); - - // Replace if the variable is terminated by '/' or ' ' - // and defined - // - if ( pos2 >= 0 ) { - int len = pos2 - pos; - QString key = text.mid( pos+1, len-1); - QString value = - QString::fromLocal8Bit( ::getenv(key.toLocal8Bit()) ); - - if ( !value.isEmpty() ) { - expanded = true; - text.replace( pos, len, value ); - pos = pos + value.length(); - } - else { - pos = pos2; - } - } - } - } - - return expanded; -}
deleted file mode 100644 --- a/gui//src/ShellCommand.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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 SHELLCOMMAND_H -#define SHELLCOMMAND_H - -// Qt -#include <QtCore/QStringList> - -/** - * A class to parse and extract information about shell commands. - * - * ShellCommand can be used to: - * - * <ul> - * <li>Take a command-line (eg "/bin/sh -c /path/to/my/script") and split it - * into its component parts (eg. the command "/bin/sh" and the arguments - * "-c","/path/to/my/script") - * </li> - * <li>Take a command and a list of arguments and combine them to - * form a complete command line. - * </li> - * <li>Determine whether the binary specified by a command exists in the - * user's PATH. - * </li> - * <li>Determine whether a command-line specifies the execution of - * another command as the root user using su/sudo etc. - * </li> - * </ul> - */ -class ShellCommand -{ -public: - /** - * Constructs a ShellCommand from a command line. - * - * @param fullCommand The command line to parse. - */ - ShellCommand(const QString& fullCommand); - /** - * Constructs a ShellCommand with the specified @p command and @p arguments. - */ - ShellCommand(const QString& command , const QStringList& arguments); - - /** Returns the command. */ - QString command() const; - /** Returns the arguments. */ - QStringList arguments() const; - - /** - * Returns the full command line. - */ - QString fullCommand() const; - - /** Returns true if this is a root command. */ - bool isRootCommand() const; - /** Returns true if the program specified by @p command() exists. */ - bool isAvailable() const; - - /** Expands environment variables in @p text .*/ - static QString expand(const QString& text); - - /** Expands environment variables in each string in @p list. */ - static QStringList expand(const QStringList& items); - -private: - QStringList _arguments; -}; -#endif // SHELLCOMMAND_H -
deleted file mode 100644 --- a/gui//src/SimpleEditor.cpp +++ /dev/null @@ -1,288 +0,0 @@ -/* Copyright (C) 2010 P.L. Lucas - * - * This program 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 program 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., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "SimpleEditor.h" -#include <QFile> -#include <QTextStream> -#include <QTextBlock> -#include <QFileInfo> -#include <QDir> - -SimpleEditor::SimpleEditor(QWidget *parent) - : QPlainTextEdit(parent), - m_syntaxHighlighter(0), - m_firstTimeUse(true) { - - m_completerModel = new QStringListModel (); - m_completer = new QCompleter(m_completerModel, this); - m_completer->setCompletionMode(QCompleter::PopupCompletion); - m_completer->setWidget(this); - m_autoIndentation = true; - m_automaticIndentationStatement = true; - - QFont font; - font.setFamily("Courier"); - font.setPointSize(10); - setFont(font); - - connect(m_completer, SIGNAL(activated(const QString &)), this, SLOT(activated(const QString &))); - connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChangedCallBack())); - connect(document(), SIGNAL(contentsChange(int, int, int)), this, SLOT(autoComplete(int, int, int))); -} - -void SimpleEditor::loadSyntaxXMLDescription() { - QString installPath = QString("../syntax_files") - + QDir::separator(); - - QFileInfo file(m_currentFileName); - QString suffix = file.suffix(); - - if(m_commandsCompletionList.isEmpty()) { - QString home = QDir::home().path() - + QDir::separator() - + ".qtoctave" - + QDir::separator() - + "commands.txt"; - - QFile file(home); - - if(file.open(QFile::ReadOnly)) { - char buf[1024]; - while(file.readLine(buf, sizeof(buf)) >= 0) { - m_commandsCompletionList.append(QString(buf).trimmed()); - } - file.close(); - } - } - - QFileInfo xml(installPath + suffix + ".xml"); - if(xml.exists()) { - m_syntaxHighlighter = new SyntaxHighlighter(document()); - m_syntaxHighlighter->load(xml.absoluteFilePath()); - m_syntaxHighlighter->setDocument(document()); - } -} - -bool SimpleEditor::load(QString file) { - if(file.isEmpty()) { - setPlainText(""); - m_currentFileName = file; - return true; - } - - FILE *input = fopen(file.toLocal8Bit().data(),"r"); - if(!input) - return false; - fclose(input); - QFile in(file); - if(!in.open(QIODevice::ReadOnly | QIODevice::Text)) { - return false; - } - QByteArray data = in.readAll(); - setPlainText(QString::fromLocal8Bit(data)); - m_currentFileName = file; - m_firstTimeUse = false; - - loadSyntaxXMLDescription(); - - return true; -} - -bool SimpleEditor::save() { - QFile::remove(m_currentFileName + "~"); - QFile::copy(m_currentFileName, m_currentFileName + "~"); - FILE *out=fopen(m_currentFileName.toLocal8Bit().data(),"w"); - if(!out) - return false; - fprintf(out, "%s", toPlainText().toLocal8Bit().data()); - fclose(out); - document()->setModified(false); - return true; -} - -void SimpleEditor::keyPressEvent(QKeyEvent * keyEvent) { - //In all cases completer popup must been hided. - if(keyEvent->key() != Qt::Key_Return && keyEvent->key() != Qt::Key_Enter) { - QAbstractItemView *view = m_completer->popup(); - if(view->isVisible()) view->hide(); - } - - if(keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) { - QAbstractItemView *view = m_completer->popup(); - if(view->isVisible()) { - QString word = view->currentIndex().data().toString(); - if(word.isEmpty()) { - word = m_completer->currentCompletion(); - } - activated(word); - return; - } else if(m_autoIndentation) { - QTextCursor cursor = textCursor(); - QString line = cursor.block().text(); - QString line2 = line; - for(int i=0;i<line.length();i++) { - if(line[i] != ' ' && line[i] != '\t') { - line.resize(i); - break; - } - } - - cursor.insertText("\n" + line); - if(m_automaticIndentationStatement) { - QRegExp re("^while .*|^if .*|^for .*|^switch .*|^do$|^try|^function .*|^else$|^elseif .*"); - if(re.exactMatch(line2.trimmed())) { - cursor.insertText("\t"); - } - } - setTextCursor(cursor); - } else { - QPlainTextEdit::keyPressEvent(keyEvent); - } - } else if(keyEvent->key() == Qt::Key_Tab) { - QTextCursor cursor=textCursor(); - int start=cursor.selectionStart(); - int end=cursor.selectionEnd(); - if(start == end) { - QPlainTextEdit::keyPressEvent(keyEvent); - return; - } - cursor.beginEditBlock(); - cursor.setPosition(end); - end=cursor.blockNumber(); - cursor.setPosition(start); - cursor.movePosition(QTextCursor::StartOfBlock); - while(true) { - cursor.insertText("\t"); - if(cursor.blockNumber()>=end) { - break; - } - cursor.movePosition(QTextCursor::NextBlock); - } - cursor.endEditBlock(); - } else if(keyEvent->key()==Qt::Key_Backtab) { - QTextCursor cursor=textCursor(); - int start=cursor.selectionStart(); - int end=cursor.selectionEnd(); - if(start==end) { - QPlainTextEdit::keyPressEvent(keyEvent); - return; - } - cursor.beginEditBlock(); - cursor.setPosition(end); - end=cursor.blockNumber(); - cursor.setPosition(start); - cursor.movePosition(QTextCursor::StartOfBlock); - while(true) { - QString line=cursor.block().text(); - if(line.length()>0 && (line[0]==' ' || line[0] =='\t')) { - cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor); - cursor.removeSelectedText(); - } - if(cursor.blockNumber()>=end) break; - cursor.movePosition(QTextCursor::NextBlock); - cursor.movePosition(QTextCursor::StartOfBlock); - } - cursor.endEditBlock(); - } else { - if(keyEvent->key()==(Qt::Key_B) && Qt::ControlModifier==keyEvent->modifiers()) { - autoComplete(0); - return; - } - QPlainTextEdit::keyPressEvent(keyEvent); - } -} - -void SimpleEditor::setCharFormat(QTextCharFormat charFormat) { - this->m_charFormat=charFormat; - QTextCursor cursor=textCursor(); - cursor.movePosition(QTextCursor::Start); - cursor.setCharFormat(charFormat); - cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); - setFont(charFormat.font()); - - QFontMetrics fm(charFormat.font()); - int textWidthInPixels = fm.width(" "); - setTabStopWidth(textWidthInPixels); -} - -void SimpleEditor::activated(const QString& text) { - QAbstractItemView *view=m_completer->popup(); - QTextCursor cursor=textCursor(); - cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor); - cursor.insertText(text); - view->hide(); -} - -void SimpleEditor::autoComplete(int position, int charsRemoved, int charsAdded) { - if(charsAdded==1) - autoComplete(); -} - -void SimpleEditor::autoComplete(int size) { - QTextCursor cursor = textCursor(); - cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor); - if(cursor.selectedText().endsWith(" ") - || cursor.selectedText().trimmed().length() < size) { - return; - } - - QStringList list=toPlainText().split(QRegExp("\\W+")); - list.removeDuplicates(); - list.removeOne(cursor.selectedText()); - list.sort(); - list.append(m_commandsCompletionList); - - m_completerModel->setStringList(list); - m_completer->setCompletionPrefix(cursor.selectedText()); - - if(m_completer->completionCount() > 0) { - QRect r=cursorRect(cursor); - r.setWidth(200); - m_completer->complete(r); - } -} - -QString SimpleEditor::getFileName() { - return m_currentFileName; -} - -void SimpleEditor::setFile(QString file) { - m_currentFileName = file; - loadSyntaxXMLDescription(); -} - -void SimpleEditor::cursorPositionChangedCallBack() { - if(m_syntaxHighlighter) - m_syntaxHighlighter->setFormatPairBrackets(this); -} - -void SimpleEditor::publicBlockBoundingRectList(QVector<qreal> &list, int &firstLine) { - qreal pageBottom = height(); - QPointF offset = contentOffset(); - QTextBlock block = firstVisibleBlock(); - firstLine = block.blockNumber() + 1; - qreal first_position = blockBoundingGeometry(block).topLeft().y(); - for(; block.isValid(); block = block.next()) { - QRectF position = blockBoundingGeometry(block); - qreal y = position.topLeft().y() + offset.y() - first_position; - if(y > pageBottom) - break; - list.append(y); - } -} -
deleted file mode 100644 --- a/gui//src/SimpleEditor.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (C) 2010 P.L. Lucas - * - * This program 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 program 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., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef SIMPLEEDITOR_H -#define SIMPLEEDITOR_H - -#include <QPlainTextEdit> -#include <QCompleter> -#include <QStringListModel> -#include "SyntaxHighlighter.h" - -class SimpleEditor : public QPlainTextEdit { - Q_OBJECT -public: - SimpleEditor(QWidget * parent = 0); - bool load(QString file); - bool save(); - QString getFileName(); - void setFile(QString file); - void setCharFormat(QTextCharFormat m_charFormat); - void publicBlockBoundingRectList(QVector<qreal> &list, int &firstLine); - void loadSyntaxXMLDescription(); - -public slots: - void activated(const QString& text); - void cursorPositionChangedCallBack(); - void autoComplete(int size = 3); - void autoComplete(int position, int charsRemoved, int charsAdded); - -protected: - virtual void keyPressEvent(QKeyEvent * e); - -private: - bool m_firstTimeUse; - QString m_currentFileName; - QTextCharFormat m_charFormat; - QCompleter *m_completer; - QStringListModel *m_completerModel; - SyntaxHighlighter *m_syntaxHighlighter; - QStringList m_commandsCompletionList; - bool m_autoIndentation; - bool m_automaticIndentationStatement; -}; - -#endif // SIMPLEEDITOR_H -
deleted file mode 100644 --- a/gui//src/SyntaxHighlighter.cpp +++ /dev/null @@ -1,486 +0,0 @@ -/* Copyright (C) 2010 P.L. Lucas - * - * This program 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 program 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., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - */ - - -#include "SyntaxHighlighter.h" -#include <QXmlStreamReader> -#include <QStack> -#include <QFile> -#include <stdio.h> - -SyntaxHighlighter::SyntaxHighlighter(QObject * parent):QSyntaxHighlighter(parent) -{ -} - - -bool SyntaxHighlighter::load(QString file) -{ - QXmlStreamReader xml; - QStack <QString> stack; - QFile fileDevice(file); - if (!fileDevice.open(QFile::ReadOnly | QFile::Text)) { - return false; - } - - xml.setDevice(&fileDevice); - - QMap <QString,QString> values; - - QVector<QString> xmlMainItems; - xmlMainItems << "item" << "block" << "bracket"; - - int ruleOrder=0; - - while (!xml.atEnd()) - { - QXmlStreamReader::TokenType tokenType=xml.readNext(); - switch(tokenType) - { - case QXmlStreamReader::StartElement: - if(xml.name()!="syntax") - { - if( xmlMainItems.contains(xml.name().toString()) ) - stack.push(xml.name().toString()); - else - values[xml.name().toString()]=xml.readElementText().trimmed(); - } - break; - case QXmlStreamReader::EndElement: - if(stack.isEmpty()) break; - QString name=stack.top(); - if(name==xml.name()) stack.pop(); - if(stack.isEmpty()) - { - QTextCharFormat format; - if(values.contains("bold") && values["bold"]=="true") format.setFontWeight(QFont::Bold); - if(values.contains("underline") && values["underline"]=="true") format.setFontUnderline(true); - if(values.contains("italic") && values["italic"]=="true") format.setFontItalic(true); - if(values.contains("foreground")) format.setForeground(QBrush(QColor(values["foreground"]))); - if(values.contains("background")) format.setBackground(QBrush(QColor(values["background"]))); - if(name=="item") - { - HighlightingRule rule; - rule.format=format; - rule.pattern=QRegExp(values["pattern"]); - rule.ruleOrder=ruleOrder++; - highlightingRules.append(rule); - values.clear(); - } - else if(name=="block" || name=="bracket") - { - HighlightingBlockRule rule; - rule.format=format; - rule.startPattern=QRegExp(values["startPattern"]); - rule.endPattern=QRegExp(values["endPattern"]); - rule.ruleOrder=ruleOrder++; - if(name=="block") highlightingBlockRules.append(rule); - else highlightingBracketsRules.append(rule); //Bracket rule - values.clear(); - } - } - break; - } - } - if (xml.hasError()) - { - // do error handling - printf("Error %s: %ld:%ld %s\n", file.toLocal8Bit().data(), xml.lineNumber(), xml.columnNumber(), xml.errorString().toLocal8Bit().data() ); - return false; - } - - return true; -} - -SyntaxHighlighter::Rule1st SyntaxHighlighter::highlight1stRule(const QString & text, int startIndex) -{ - Rule1st rule1st; - rule1st.startIndex=text.length(); - rule1st.rule=-1; - - for(int i=0; i<highlightingRules.size(); i++) - { - HighlightingRule *rule=&(highlightingRules[i]); - - QRegExp *expression = &(rule->pattern); - int index = rule->lastFound; - if(index>-1 && index<startIndex) - { - rule->lastFound = index = expression->indexIn(text, startIndex); - } - if ( index>-1 && index<rule1st.startIndex ) - { - rule1st.startIndex=index; - rule1st.length=expression->matchedLength(); - rule1st.rule=i; - rule1st.ruleOrder=rule->ruleOrder; - } - - if(index==startIndex) break; - } - - if(rule1st.rule==-1) rule1st.startIndex=-1; - - return rule1st; -} - -SyntaxHighlighter::Rule1st SyntaxHighlighter::highlight1stBlockRule(const QString & text, int startIndex) -{ - Rule1st rule1st; - rule1st.startIndex=text.length(); - rule1st.rule=-1; - - for(int i=0; i<highlightingBlockRules.size(); i++) - { - HighlightingBlockRule rule=highlightingBlockRules[i]; - - int index = rule.startPattern.indexIn(text, startIndex); - - if ( index>-1 && index<rule1st.startIndex ) - { - rule1st.startIndex=index; - rule1st.rule=i; - rule1st.ruleOrder=rule.ruleOrder; - } - - if(index==startIndex) break; - } - - if(rule1st.rule==-1) rule1st.startIndex=-1; - - return rule1st; -} - -/**Inserts brackets in position order in blockData->brackets - */ -static void insertInOrder(BlockData *blockData, BlockData::Bracket &bracket) -{ - if(blockData->brackets.isEmpty()) blockData->brackets.append(bracket); - else - { - int j=0; - - for(;j<blockData->brackets.size();j++) - { - if(blockData->brackets[j].pos>bracket.pos) - { - blockData->brackets.insert(j,bracket); - break; - } - } - if(j>=blockData->brackets.size()) - { - blockData->brackets.append(bracket); - } - } -} - - -void SyntaxHighlighter::findBrackets(const QString & text, int start, int end, BlockData *blockData) -{ - //blockData->brackets.clear(); - - if( end<0 || end>text.length() ) end=text.length(); - - if(start>end) return; - - for(int i=0; i<highlightingBracketsRules.size(); i++) - { - HighlightingBlockRule rule=highlightingBracketsRules[i]; - - int startIndex=start; - - int index = rule.startPattern.indexIn(text, startIndex); - - while( index>-1 && index<end ) - { - BlockData::Bracket bracket; - bracket.pos=index; - bracket.type=i; - bracket.length=rule.startPattern.matchedLength(); - bracket.startBracketOk=true; - - startIndex=index+bracket.length; - - insertInOrder(blockData, bracket); - index = rule.startPattern.indexIn(text, startIndex); - } - - startIndex=start; - - index = rule.endPattern.indexIn(text, startIndex); - - - - while( index>-1 && index<end ) - { - BlockData::Bracket bracket; - bracket.pos=index; - bracket.type=i; - bracket.length=rule.endPattern.matchedLength(); - bracket.startBracketOk=false; - insertInOrder(blockData, bracket); - startIndex=index+bracket.length; - index = rule.endPattern.indexIn(text, startIndex); - } - } -} - - -int SyntaxHighlighter::ruleSetFormat(Rule1st rule1st) -{ - HighlightingRule rule=highlightingRules[rule1st.rule]; - - setFormat(rule1st.startIndex, rule1st.length, rule.format); - - return rule1st.startIndex + rule1st.length; -} - - -int SyntaxHighlighter::blockRuleSetFormat(const QString & text, Rule1st rule1st) -{ - HighlightingBlockRule rule=highlightingBlockRules[rule1st.rule]; - - int endIndex = rule.endPattern.indexIn(text, rule1st.startIndex); - int commentLength; - if (endIndex == -1) - { - setCurrentBlockState(rule1st.rule); - commentLength = text.length() - rule1st.startIndex; - setFormat(rule1st.startIndex, commentLength, rule.format); - return text.length(); - } - else - { - commentLength = endIndex - rule1st.startIndex - + rule.endPattern.matchedLength(); - setFormat(rule1st.startIndex, commentLength, rule.format); - - return endIndex+1; - } -} - - -void SyntaxHighlighter::highlightBlock ( const QString & text ) -{ - - setCurrentBlockState(-1); - - int startIndex = 0; - - //Checks previous block state - if (previousBlockState() >= 0) - { - Rule1st rule1st; - rule1st.rule=previousBlockState(); - rule1st.startIndex=0; - - startIndex=blockRuleSetFormat(text,rule1st); - - //TODO: Posible fallo al establecer el estado del bloque - - if(startIndex==text.length()) return; - } - - //Gets BlockData - BlockData *blockData=new BlockData(); - - //Finds first rule to apply. - - Rule1st rule1st, blockRule1st; - - //Find initial matches - for(int i=0; i<highlightingRules.size(); i++) - { - HighlightingRule *rule= &(highlightingRules[i]); - QRegExp *expression = &(rule->pattern); - int index = expression->indexIn(text, startIndex); - rule->lastFound = index; - } - - rule1st=highlight1stRule( text, startIndex); - blockRule1st=highlight1stBlockRule( text, startIndex); - - while(rule1st.rule>=0 || blockRule1st.rule>=0) - { - if(rule1st.rule>=0 && blockRule1st.rule>=0) - { - if - ( - rule1st.startIndex<blockRule1st.startIndex - || - ( - rule1st.startIndex==blockRule1st.startIndex - && - rule1st.ruleOrder<blockRule1st.ruleOrder - ) - ) - { - findBrackets(text, startIndex, rule1st.startIndex, blockData); - startIndex=ruleSetFormat(rule1st); - rule1st=highlight1stRule( text, startIndex); - } - else - { - findBrackets(text, startIndex, blockRule1st.startIndex, blockData); - startIndex=blockRuleSetFormat(text,blockRule1st); - blockRule1st=highlight1stBlockRule( text, startIndex); - } - } - else if(rule1st.rule>=0) - { - findBrackets(text, startIndex, rule1st.startIndex, blockData); - startIndex=ruleSetFormat(rule1st); - rule1st=highlight1stRule( text, startIndex); - } - else - { - findBrackets(text, startIndex, blockRule1st.startIndex, blockData); - startIndex=blockRuleSetFormat(text,blockRule1st); - blockRule1st=highlight1stBlockRule( text, startIndex); - } - } - - findBrackets(text,startIndex, -1, blockData); - - setCurrentBlockUserData(blockData); -} - -/**Search brackets in one QTextBlock.*/ -static BlockData::Bracket *searchBracket(int i, int increment, int &bracketsCount, BlockData *blockData, BlockData::Bracket *bracket1) -{ - if(blockData==NULL) return NULL; - - if(i==-1) i=blockData->brackets.size()-1; - - for(; i>=0 && i<blockData->brackets.size(); i+=increment) - { - BlockData::Bracket *bracket=&(blockData->brackets[i]); - if(bracket->type==bracket1->type) - { - if(bracket->startBracketOk!=bracket1->startBracketOk) - bracketsCount--; - else - bracketsCount++; - - if(bracketsCount==0) - return bracket; - } - } - - //printf("[searchBracket] bracketsCount=%d\n", bracketsCount); - - return NULL; -} - -void SyntaxHighlighter::setFormatPairBrackets(QPlainTextEdit *textEdit) -{ - QList<QTextEdit::ExtraSelection> selections; - - textEdit->setExtraSelections(selections); - - QTextCursor cursor=textEdit->textCursor(); - QTextBlock block=cursor.block(); - BlockData *blockData=(BlockData *)block.userData(); - if(blockData==NULL) return; - - int pos=cursor.position()-block.position(); - - BlockData::Bracket *bracket1; - QTextBlock block_bracket1=block; - - int i=blockData->brackets.size()-1; - for(; i>=0; i--) - { - BlockData::Bracket *bracket=&(blockData->brackets[i]); - if(bracket->pos==pos) - { - bracket1=bracket; - break; - } - } - - if(i<0) return; - - int increment=(bracket1->startBracketOk) ? +1:-1; - int bracketsCount=0; - //Looks in this block the other bracket - BlockData::Bracket *bracket2=NULL; - QTextBlock block_bracket2=block; - - bracket2=searchBracket( i, increment, bracketsCount, blockData, bracket1); - - { //Search brackets in other blocks - while( bracket2==NULL ) - { - if(increment>0) - { - block_bracket2=block_bracket2.next(); - i=0; - } - else - { - block_bracket2=block_bracket2.previous(); - i=-1; - } - - if(!block_bracket2.isValid()) break; - - blockData=(BlockData *)block_bracket2.userData(); - /* - printf("[Syntax::setFormatPairBrackets] Interno brackets.size=%d\n", blockData->brackets.size()); - for(int x=0;x<blockData->brackets.size();x++) - { - BlockData::Bracket *bracket=&(blockData->brackets[x]); - printf("[Syntax::setFormatPairBrackets] bracket.pos=%d bracket.type=%d bracket.len=%d bracket.start=%d\n", bracket->pos, bracket->type, bracket->length, (bracket->startBracketOk) ); - } - */ - - bracket2=searchBracket( i, increment, bracketsCount, blockData, bracket1); - } - - if(bracket2==NULL) return; - } - - pos=cursor.position(); - - QTextEdit::ExtraSelection selection1; - - cursor.setPosition(pos+bracket1->length, QTextCursor::KeepAnchor); - selection1.cursor=cursor; - selection1.format=highlightingBracketsRules[bracket1->type].format; - - pos=bracket2->pos+block_bracket2.position(); - QTextEdit::ExtraSelection selection2; - cursor.setPosition(pos); - cursor.setPosition(pos+bracket2->length, QTextCursor::KeepAnchor); - selection2.cursor=cursor; - selection2.format=highlightingBracketsRules[bracket2->type].format; - - selections.append(selection1); selections.append(selection2); - - textEdit->setExtraSelections(selections); - -} - - - -BlockData::BlockData():QTextBlockUserData() -{ -} - -
deleted file mode 100644 --- a/gui//src/SyntaxHighlighter.h +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (C) 2010 P.L. Lucas - * - * This program 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 program 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., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __SYNTAX_H__ -#define __SYNTAX_H__ - -#include <QSyntaxHighlighter> -#include <QTextBlockUserData> -#include <QVector> -#include <QPlainTextEdit> - -class BlockData:public QTextBlockUserData -{ - public: - BlockData(); - - struct Bracket - { - int type; //Type of bracket - int pos; //Position of bracket - int length; //Number of chars of bracket - bool startBracketOk; //Is it a start or end bracket? - }; - - QVector <Bracket> brackets; -}; - -class SyntaxHighlighter:public QSyntaxHighlighter -{ - Q_OBJECT - - struct HighlightingRule - { - QRegExp pattern; - QTextCharFormat format; - int ruleOrder; - int lastFound; - }; - - QVector<HighlightingRule> highlightingRules; - - struct HighlightingBlockRule - { - QRegExp startPattern, endPattern; - QTextCharFormat format; - int ruleOrder; - }; - - QVector<HighlightingBlockRule> highlightingBlockRules; - QVector<HighlightingBlockRule> highlightingBracketsRules; - - struct Rule1st - { - int rule; - int startIndex; - int length; - int ruleOrder; - }; - - /**1st rule to apply from startIndex. - */ - Rule1st highlight1stRule(const QString & text, int startIndex); - - /**1st block rule to apply from startIndex. - */ - Rule1st highlight1stBlockRule(const QString & text, int startIndex); - - /** Set format using rule. - */ - int ruleSetFormat(Rule1st rule); - - /** Set format using block rule. - */ - int blockRuleSetFormat(const QString & text, Rule1st rule1st); - - /** Finds brackets and put them in BlockData. - */ - void findBrackets(const QString & text, int start, int end, BlockData *blockData); - - public: - - SyntaxHighlighter(QObject * parent = 0); - bool load(QString file); - - /**Formats pair of brackets - */ - void setFormatPairBrackets(QPlainTextEdit *textEdit); - - protected: - void highlightBlock ( const QString & text ); -}; -#endif
deleted file mode 100644 --- a/gui//src/TerminalCharacterDecoder.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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 Lesser 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. -*/ - -// Own -#include "TerminalCharacterDecoder.h" - -// Qt -#include <QtCore/QTextStream> - -// Konsole -#include "konsole_wcwidth.h" - -PlainTextDecoder::PlainTextDecoder() - : _output(0) - , _includeTrailingWhitespace(true) - , _recordLinePositions(false) -{ - -} -void PlainTextDecoder::setTrailingWhitespace(bool enable) -{ - _includeTrailingWhitespace = enable; -} -bool PlainTextDecoder::trailingWhitespace() const -{ - return _includeTrailingWhitespace; -} -void PlainTextDecoder::begin(QTextStream* output) -{ - _output = output; - if (!_linePositions.isEmpty()) - _linePositions.clear(); -} -void PlainTextDecoder::end() -{ - _output = 0; -} - -void PlainTextDecoder::setRecordLinePositions(bool record) -{ - _recordLinePositions = record; -} -QList<int> PlainTextDecoder::linePositions() const -{ - return _linePositions; -} -void PlainTextDecoder::decodeLine(const Character* const characters, int count, LineProperty /*properties*/ - ) -{ - Q_ASSERT( _output ); - - if (_recordLinePositions && _output->string()) - { - int pos = _output->string()->count(); - _linePositions << pos; - } - - //TODO should we ignore or respect the LINE_WRAPPED line property? - - //note: we build up a QString and send it to the text stream rather writing into the text - //stream a character at a time because it is more efficient. - //(since QTextStream always deals with QStrings internally anyway) - QString plainText; - plainText.reserve(count); - - int outputCount = count; - - // if inclusion of trailing whitespace is disabled then find the end of the - // line - if ( !_includeTrailingWhitespace ) - { - for (int i = count-1 ; i >= 0 ; i--) - { - if ( characters[i].character != ' ' ) - break; - else - outputCount--; - } - } - - for (int i=0;i<outputCount;) - { - plainText.append( QChar(characters[i].character) ); - i += qMax(1,konsole_wcwidth(characters[i].character)); - } - *_output << plainText; -} - -HTMLDecoder::HTMLDecoder() : - _output(0) - ,_colorTable(base_color_table) - ,_innerSpanOpen(false) - ,_lastRendition(DEFAULT_RENDITION) -{ - -} - -void HTMLDecoder::begin(QTextStream* output) -{ - _output = output; - - QString text; - - //open monospace span - openSpan(text,"font-family:monospace"); - - *output << text; -} - -void HTMLDecoder::end() -{ - Q_ASSERT( _output ); - - QString text; - - closeSpan(text); - - *_output << text; - - _output = 0; - -} - -//TODO: Support for LineProperty (mainly double width , double height) -void HTMLDecoder::decodeLine(const Character* const characters, int count, LineProperty /*properties*/ - ) -{ - Q_ASSERT( _output ); - - QString text; - - int spaceCount = 0; - - for (int i=0;i<count;i++) - { - QChar ch(characters[i].character); - - //check if appearance of character is different from previous char - if ( characters[i].rendition != _lastRendition || - characters[i].foregroundColor != _lastForeColor || - characters[i].backgroundColor != _lastBackColor ) - { - if ( _innerSpanOpen ) - closeSpan(text); - - _lastRendition = characters[i].rendition; - _lastForeColor = characters[i].foregroundColor; - _lastBackColor = characters[i].backgroundColor; - - //build up style string - QString style; - - bool useBold; - ColorEntry::FontWeight weight = characters[i].fontWeight(_colorTable); - if (weight == ColorEntry::UseCurrentFormat) - useBold = _lastRendition & RE_BOLD; - else - useBold = weight == ColorEntry::Bold; - - if (useBold) - style.append("font-weight:bold;"); - - if ( _lastRendition & RE_UNDERLINE ) - style.append("font-decoration:underline;"); - - //colours - a colour table must have been defined first - if ( _colorTable ) - { - style.append( QString("color:%1;").arg(_lastForeColor.color(_colorTable).name() ) ); - - if (!characters[i].isTransparent(_colorTable)) - { - style.append( QString("background-color:%1;").arg(_lastBackColor.color(_colorTable).name() ) ); - } - } - - //open the span with the current style - openSpan(text,style); - _innerSpanOpen = true; - } - - //handle whitespace - if (ch.isSpace()) - spaceCount++; - else - spaceCount = 0; - - - //output current character - if (spaceCount < 2) - { - //escape HTML tag characters and just display others as they are - if ( ch == '<' ) - text.append("<"); - else if (ch == '>') - text.append(">"); - else - text.append(ch); - } - else - { - text.append(" "); //HTML truncates multiple spaces, so use a space marker instead - } - - } - - //close any remaining open inner spans - if ( _innerSpanOpen ) - closeSpan(text); - - //start new line - text.append("<br>"); - - *_output << text; -} -void HTMLDecoder::openSpan(QString& text , const QString& style) -{ - text.append( QString("<span style=\"%1\">").arg(style) ); -} - -void HTMLDecoder::closeSpan(QString& text) -{ - text.append("</span>"); -} - -void HTMLDecoder::setColorTable(const ColorEntry* table) -{ - _colorTable = table; -}
deleted file mode 100644 --- a/gui//src/TerminalCharacterDecoder.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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 Lesser 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 TERMINAL_CHARACTER_DECODER_H -#define TERMINAL_CHARACTER_DECODER_H - -#include "Character.h" - -#include <QList> - -class QTextStream; - -/** - * Base class for terminal character decoders - * - * The decoder converts lines of terminal characters which consist of a unicode character, foreground - * and background colours and other appearance-related properties into text strings. - * - * Derived classes may produce either plain text with no other colour or appearance information, or - * they may produce text which incorporates these additional properties. - */ -class TerminalCharacterDecoder -{ -public: - virtual ~TerminalCharacterDecoder() {} - - /** Begin decoding characters. The resulting text is appended to @p output. */ - virtual void begin(QTextStream* output) = 0; - /** End decoding. */ - virtual void end() = 0; - - /** - * Converts a line of terminal characters with associated properties into a text string - * and writes the string into an output QTextStream. - * - * @param characters An array of characters of length @p count. - * @param count The number of characters - * @param properties Additional properties which affect all characters in the line - */ - virtual void decodeLine(const Character* const characters, - int count, - LineProperty properties) = 0; -}; - -/** - * A terminal character decoder which produces plain text, ignoring colours and other appearance-related - * properties of the original characters. - */ -class PlainTextDecoder : public TerminalCharacterDecoder -{ -public: - PlainTextDecoder(); - - /** - * Set whether trailing whitespace at the end of lines should be included - * in the output. - * Defaults to true. - */ - void setTrailingWhitespace(bool enable); - /** - * Returns whether trailing whitespace at the end of lines is included - * in the output. - */ - bool trailingWhitespace() const; - /** - * Returns of character positions in the output stream - * at which new lines where added. Returns an empty if setTrackLinePositions() is false or if - * the output device is not a string. - */ - QList<int> linePositions() const; - /** Enables recording of character positions at which new lines are added. See linePositions() */ - void setRecordLinePositions(bool record); - - virtual void begin(QTextStream* output); - virtual void end(); - - virtual void decodeLine(const Character* const characters, - int count, - LineProperty properties); - - -private: - QTextStream* _output; - bool _includeTrailingWhitespace; - - bool _recordLinePositions; - QList<int> _linePositions; -}; - -/** - * A terminal character decoder which produces pretty HTML markup - */ -class HTMLDecoder : public TerminalCharacterDecoder -{ -public: - /** - * Constructs an HTML decoder using a default black-on-white color scheme. - */ - HTMLDecoder(); - - /** - * Sets the colour table which the decoder uses to produce the HTML colour codes in its - * output - */ - void setColorTable( const ColorEntry* table ); - - virtual void decodeLine(const Character* const characters, - int count, - LineProperty properties); - - virtual void begin(QTextStream* output); - virtual void end(); - -private: - void openSpan(QString& text , const QString& style); - void closeSpan(QString& text); - - QTextStream* _output; - const ColorEntry* _colorTable; - bool _innerSpanOpen; - quint8 _lastRendition; - CharacterColor _lastForeColor; - CharacterColor _lastBackColor; - -}; - -#endif
deleted file mode 100644 --- a/gui//src/TerminalDisplay.cpp +++ /dev/null @@ -1,2975 +0,0 @@ -/* - This file is part of Konsole, a terminal emulator for KDE. - - Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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. -*/ - -// Own -#include "TerminalDisplay.h" - -// Qt -#include <QtGui/QApplication> -#include <QtGui/QBoxLayout> -#include <QtGui/QClipboard> -#include <QtGui/QKeyEvent> -#include <QtCore/QEvent> -#include <QtCore/QTime> -#include <QtCore/QFile> -#include <QtGui/QGridLayout> -#include <QtGui/QLabel> -#include <QtGui/QLayout> -#include <QtGui/QPainter> -#include <QtGui/QPixmap> -#include <QtGui/QScrollBar> -#include <QtGui/QStyle> -#include <QtCore/QTimer> -#include <QtGui/QToolTip> -#include <QtCore/QTextStream> - -#include "Filter.h" -#include "konsole_wcwidth.h" -#include "ScreenWindow.h" -#include "TerminalCharacterDecoder.h" - -#ifndef loc -#define loc(X,Y) ((Y)*_columns+(X)) -#endif - -#define yMouseScroll 1 - -#define REPCHAR "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ - "abcdefgjijklmnopqrstuvwxyz" \ - "0123456789./+@" - -const ColorEntry base_color_table[TABLE_COLORS] = -// The following are almost IBM standard color codes, with some slight -// gamma correction for the dim colors to compensate for bright X screens. -// It contains the 8 ansiterm/xterm colors in 2 intensities. -{ - // Fixme: could add faint colors here, also. - // normal - ColorEntry(QColor(0x00,0x00,0x00), 0), ColorEntry( QColor(0xB2,0xB2,0xB2), 1), // Dfore, Dback - ColorEntry(QColor(0x00,0x00,0x00), 0), ColorEntry( QColor(0xB2,0x18,0x18), 0), // Black, Red - ColorEntry(QColor(0x18,0xB2,0x18), 0), ColorEntry( QColor(0xB2,0x68,0x18), 0), // Green, Yellow - ColorEntry(QColor(0x18,0x18,0xB2), 0), ColorEntry( QColor(0xB2,0x18,0xB2), 0), // Blue, Magenta - ColorEntry(QColor(0x18,0xB2,0xB2), 0), ColorEntry( QColor(0xB2,0xB2,0xB2), 0), // Cyan, White - // intensiv - ColorEntry(QColor(0x00,0x00,0x00), 0), ColorEntry( QColor(0xFF,0xFF,0xFF), 1), - ColorEntry(QColor(0x68,0x68,0x68), 0), ColorEntry( QColor(0xFF,0x54,0x54), 0), - ColorEntry(QColor(0x54,0xFF,0x54), 0), ColorEntry( QColor(0xFF,0xFF,0x54), 0), - ColorEntry(QColor(0x54,0x54,0xFF), 0), ColorEntry( QColor(0xFF,0x54,0xFF), 0), - ColorEntry(QColor(0x54,0xFF,0xFF), 0), ColorEntry( QColor(0xFF,0xFF,0xFF), 0) -}; - -// scroll increment used when dragging selection at top/bottom of window. - -// static -bool TerminalDisplay::_antialiasText = true; -bool TerminalDisplay::HAVE_TRANSPARENCY = false; - -// we use this to force QPainter to display text in LTR mode -// more information can be found in: http://unicode.org/reports/tr9/ -const QChar LTR_OVERRIDE_CHAR( 0x202D ); - -/* ------------------------------------------------------------------------- */ -/* */ -/* Colors */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* Note that we use ANSI color order (bgr), while IBMPC color order is (rgb) - - Code 0 1 2 3 4 5 6 7 - ----------- ------- ------- ------- ------- ------- ------- ------- ------- - ANSI (bgr) Black Red Green Yellow Blue Magenta Cyan White - IBMPC (rgb) Black Blue Green Cyan Red Magenta Yellow White -*/ - -ScreenWindow* TerminalDisplay::screenWindow() const -{ - return _screenWindow; -} -void TerminalDisplay::setScreenWindow(ScreenWindow* window) -{ - // disconnect existing screen window if any - if ( _screenWindow ) - { - disconnect( _screenWindow , 0 , this , 0 ); - } - - _screenWindow = window; - - if ( window ) - { - -// TODO: Determine if this is an issue. -//#warning "The order here is not specified - does it matter whether updateImage or updateLineProperties comes first?" - connect( _screenWindow , SIGNAL(outputChanged()) , this , SLOT(updateLineProperties()) ); - connect( _screenWindow , SIGNAL(outputChanged()) , this , SLOT(updateImage()) ); - window->setWindowLines(_lines); - } -} - -const ColorEntry* TerminalDisplay::colorTable() const -{ - return _colorTable; -} -void TerminalDisplay::setBackgroundColor(const QColor& color) -{ - _colorTable[DEFAULT_BACK_COLOR].color = color; - QPalette p = palette(); - p.setColor( backgroundRole(), color ); - setPalette( p ); - - // Avoid propagating the palette change to the scroll bar - _scrollBar->setPalette( QApplication::palette() ); - - update(); -} -void TerminalDisplay::setForegroundColor(const QColor& color) -{ - _colorTable[DEFAULT_FORE_COLOR].color = color; - - update(); -} -void TerminalDisplay::setColorTable(const ColorEntry table[]) -{ - for (int i = 0; i < TABLE_COLORS; i++) - _colorTable[i] = table[i]; - - setBackgroundColor(_colorTable[DEFAULT_BACK_COLOR].color); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Font */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* - The VT100 has 32 special graphical characters. The usual vt100 extended - xterm fonts have these at 0x00..0x1f. - - QT's iso mapping leaves 0x00..0x7f without any changes. But the graphicals - come in here as proper unicode characters. - - We treat non-iso10646 fonts as VT100 extended and do the requiered mapping - from unicode to 0x00..0x1f. The remaining translation is then left to the - QCodec. -*/ - -static inline bool isLineChar(quint16 c) { return ((c & 0xFF80) == 0x2500);} -static inline bool isLineCharString(const QString& string) -{ - return (string.length() > 0) && (isLineChar(string.at(0).unicode())); -} - - -// assert for i in [0..31] : vt100extended(vt100_graphics[i]) == i. - -unsigned short vt100_graphics[32] = -{ // 0/8 1/9 2/10 3/11 4/12 5/13 6/14 7/15 - 0x0020, 0x25C6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, - 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, - 0xF800, 0xF801, 0x2500, 0xF803, 0xF804, 0x251c, 0x2524, 0x2534, - 0x252c, 0x2502, 0x2264, 0x2265, 0x03C0, 0x2260, 0x00A3, 0x00b7 -}; - -void TerminalDisplay::fontChange(const QFont&) -{ - QFontMetrics fm(font()); - _fontHeight = fm.height() + _lineSpacing; - - // waba TerminalDisplay 1.123: - // "Base character width on widest ASCII character. This prevents too wide - // characters in the presence of double wide (e.g. Japanese) characters." - // Get the width from representative normal width characters - _fontWidth = qRound((double)fm.width(REPCHAR)/(double)strlen(REPCHAR)); - - _fixedFont = true; - - int fw = fm.width(REPCHAR[0]); - for(unsigned int i=1; i< strlen(REPCHAR); i++) - { - if (fw != fm.width(REPCHAR[i])) - { - _fixedFont = false; - break; - } - } - - if (_fontWidth < 1) - _fontWidth=1; - - _fontAscent = fm.ascent(); - - emit changedFontMetricSignal( _fontHeight, _fontWidth ); - propagateSize(); - update(); -} - -void TerminalDisplay::setVTFont(const QFont& f) -{ - QFont font = f; - - QFontMetrics metrics(font); - - if ( !QFontInfo(font).fixedPitch() ) - { - //kWarning() << "Using an unsupported variable-width font in the terminal. This may produce display errors."; - } - - if ( metrics.height() < height() && metrics.maxWidth() < width() ) - { - // hint that text should be drawn without anti-aliasing. - // depending on the user's font configuration, this may not be respected - if (!_antialiasText) - font.setStyleStrategy( QFont::NoAntialias ); - - // experimental optimization. Konsole assumes that the terminal is using a - // mono-spaced font, in which case kerning information should have an effect. - // Disabling kerning saves some computation when rendering text. - font.setKerning(false); - - QWidget::setFont(font); - fontChange(font); - } -} - -void TerminalDisplay::setFont(const QFont &) -{ - // ignore font change request if not coming from konsole itself -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Constructor / Destructor */ -/* */ -/* ------------------------------------------------------------------------- */ - -TerminalDisplay::TerminalDisplay(QWidget *parent) -:QWidget(parent) -,_screenWindow(0) -,_allowBell(true) -,_gridLayout(0) -,_fontHeight(1) -,_fontWidth(1) -,_fontAscent(1) -,_boldIntense(true) -,_lines(1) -,_columns(1) -,_usedLines(1) -,_usedColumns(1) -,_contentHeight(1) -,_contentWidth(1) -,_image(0) -,_randomSeed(0) -,_resizing(false) -,_terminalSizeHint(false) -,_terminalSizeStartup(true) -,_bidiEnabled(false) -,_actSel(0) -,_wordSelectionMode(false) -,_lineSelectionMode(false) -,_preserveLineBreaks(false) -,_columnSelectionMode(false) -,_scrollbarLocation(NoScrollBar) -,_wordCharacters(":@-./_~") -,_bellMode(SystemBeepBell) -,_blinking(false) -,_hasBlinker(false) -,_cursorBlinking(false) -,_hasBlinkingCursor(false) -,_allowBlinkingText(true) -,_ctrlDrag(true) -,_tripleClickMode(SelectWholeLine) -,_isFixedSize(false) -,_possibleTripleClick(false) -,_resizeWidget(0) -,_resizeTimer(0) -,_flowControlWarningEnabled(false) -,_outputSuspendedLabel(0) -,_lineSpacing(0) -,_colorsInverted(false) -,_blendColor(qRgba(0,0,0,0xff)) -,_filterChain(new TerminalImageFilterChain()) -,_cursorShape(BlockCursor) -{ - // terminal applications are not designed with Right-To-Left in mind, - // so the layout is forced to Left-To-Right - setLayoutDirection(Qt::LeftToRight); - - // The offsets are not yet calculated. - // Do not calculate these too often to be more smoothly when resizing - // konsole in opaque mode. - _topMargin = DEFAULT_TOP_MARGIN; - _leftMargin = DEFAULT_LEFT_MARGIN; - - // create scroll bar for scrolling output up and down - // set the scroll bar's slider to occupy the whole area of the scroll bar initially - _scrollBar = new QScrollBar(this); - setScroll(0,0); - _scrollBar->setCursor( Qt::ArrowCursor ); - connect(_scrollBar, SIGNAL(valueChanged(int)), this, - SLOT(scrollBarPositionChanged(int))); - - // setup timers for blinking cursor and text - _blinkTimer = new QTimer(this); - connect(_blinkTimer, SIGNAL(timeout()), this, SLOT(blinkEvent())); - _blinkCursorTimer = new QTimer(this); - connect(_blinkCursorTimer, SIGNAL(timeout()), this, SLOT(blinkCursorEvent())); - - //KCursor::setAutoHideCursor( this, true ); - - setUsesMouse(true); - setColorTable(base_color_table); - setMouseTracking(true); - - // Enable drag and drop - setAcceptDrops(true); // attempt - dragInfo.state = diNone; - - setFocusPolicy( Qt::WheelFocus ); - - // enable input method support - setAttribute(Qt::WA_InputMethodEnabled, true); - - // this is an important optimization, it tells Qt - // that TerminalDisplay will handle repainting its entire area. - setAttribute(Qt::WA_OpaquePaintEvent); - - _gridLayout = new QGridLayout(this); - _gridLayout->setContentsMargins(0, 0, 0, 0); - - setLayout( _gridLayout ); - - new AutoScrollHandler(this); -} - -TerminalDisplay::~TerminalDisplay() -{ - disconnect(_blinkTimer); - disconnect(_blinkCursorTimer); - qApp->removeEventFilter( this ); - - delete[] _image; - - delete _gridLayout; - delete _outputSuspendedLabel; - delete _filterChain; -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Display Operations */ -/* */ -/* ------------------------------------------------------------------------- */ - -/** - A table for emulating the simple (single width) unicode drawing chars. - It represents the 250x - 257x glyphs. If it's zero, we can't use it. - if it's not, it's encoded as follows: imagine a 5x5 grid where the points are numbered - 0 to 24 left to top, top to bottom. Each point is represented by the corresponding bit. - - Then, the pixels basically have the following interpretation: - _|||_ - -...- - -...- - -...- - _|||_ - -where _ = none - | = vertical line. - - = horizontal line. - */ - - -enum LineEncode -{ - TopL = (1<<1), - TopC = (1<<2), - TopR = (1<<3), - - LeftT = (1<<5), - Int11 = (1<<6), - Int12 = (1<<7), - Int13 = (1<<8), - RightT = (1<<9), - - LeftC = (1<<10), - Int21 = (1<<11), - Int22 = (1<<12), - Int23 = (1<<13), - RightC = (1<<14), - - LeftB = (1<<15), - Int31 = (1<<16), - Int32 = (1<<17), - Int33 = (1<<18), - RightB = (1<<19), - - BotL = (1<<21), - BotC = (1<<22), - BotR = (1<<23) -}; - -#include "LineFont.h" - -static void drawLineChar(QPainter& paint, int x, int y, int w, int h, uchar code) -{ - //Calculate cell midpoints, end points. - int cx = x + w/2; - int cy = y + h/2; - int ex = x + w - 1; - int ey = y + h - 1; - - quint32 toDraw = LineChars[code]; - - //Top _lines: - if (toDraw & TopL) - paint.drawLine(cx-1, y, cx-1, cy-2); - if (toDraw & TopC) - paint.drawLine(cx, y, cx, cy-2); - if (toDraw & TopR) - paint.drawLine(cx+1, y, cx+1, cy-2); - - //Bot _lines: - if (toDraw & BotL) - paint.drawLine(cx-1, cy+2, cx-1, ey); - if (toDraw & BotC) - paint.drawLine(cx, cy+2, cx, ey); - if (toDraw & BotR) - paint.drawLine(cx+1, cy+2, cx+1, ey); - - //Left _lines: - if (toDraw & LeftT) - paint.drawLine(x, cy-1, cx-2, cy-1); - if (toDraw & LeftC) - paint.drawLine(x, cy, cx-2, cy); - if (toDraw & LeftB) - paint.drawLine(x, cy+1, cx-2, cy+1); - - //Right _lines: - if (toDraw & RightT) - paint.drawLine(cx+2, cy-1, ex, cy-1); - if (toDraw & RightC) - paint.drawLine(cx+2, cy, ex, cy); - if (toDraw & RightB) - paint.drawLine(cx+2, cy+1, ex, cy+1); - - //Intersection points. - if (toDraw & Int11) - paint.drawPoint(cx-1, cy-1); - if (toDraw & Int12) - paint.drawPoint(cx, cy-1); - if (toDraw & Int13) - paint.drawPoint(cx+1, cy-1); - - if (toDraw & Int21) - paint.drawPoint(cx-1, cy); - if (toDraw & Int22) - paint.drawPoint(cx, cy); - if (toDraw & Int23) - paint.drawPoint(cx+1, cy); - - if (toDraw & Int31) - paint.drawPoint(cx-1, cy+1); - if (toDraw & Int32) - paint.drawPoint(cx, cy+1); - if (toDraw & Int33) - paint.drawPoint(cx+1, cy+1); - -} - -void TerminalDisplay::drawLineCharString( QPainter& painter, int x, int y, const QString& str, - const Character* attributes) -{ - const QPen& currentPen = painter.pen(); - - if ( (attributes->rendition & RE_BOLD) && _boldIntense ) - { - QPen boldPen(currentPen); - boldPen.setWidth(3); - painter.setPen( boldPen ); - } - - for (int i=0 ; i < str.length(); i++) - { - uchar code = str[i].cell(); - if (LineChars[code]) - drawLineChar(painter, x + (_fontWidth*i), y, _fontWidth, _fontHeight, code); - } - - painter.setPen( currentPen ); -} - -void TerminalDisplay::setKeyboardCursorShape(KeyboardCursorShape shape) -{ - _cursorShape = shape; -} -TerminalDisplay::KeyboardCursorShape TerminalDisplay::keyboardCursorShape() const -{ - return _cursorShape; -} -void TerminalDisplay::setKeyboardCursorColor(bool useForegroundColor, const QColor& color) -{ - if (useForegroundColor) - _cursorColor = QColor(); // an invalid color means that - // the foreground color of the - // current character should - // be used - - else - _cursorColor = color; -} -QColor TerminalDisplay::keyboardCursorColor() const -{ - return _cursorColor; -} - -void TerminalDisplay::setOpacity(qreal opacity) -{ - QColor color(_blendColor); - color.setAlphaF(opacity); - - // enable automatic background filling to prevent the display - // flickering if there is no transparency - /*if ( color.alpha() == 255 ) - { - setAutoFillBackground(true); - } - else - { - setAutoFillBackground(false); - }*/ - - _blendColor = color.rgba(); -} - -void TerminalDisplay::drawBackground(QPainter& painter, const QRect& rect, const QColor& backgroundColor, bool useOpacitySetting ) -{ - // the area of the widget showing the contents of the terminal display is drawn - // using the background color from the color scheme set with setColorTable() - // - // the area of the widget behind the scroll-bar is drawn using the background - // brush from the scroll-bar's palette, to give the effect of the scroll-bar - // being outside of the terminal display and visual consistency with other KDE - // applications. - // - QRect scrollBarArea = _scrollBar->isVisible() ? - rect.intersected(_scrollBar->geometry()) : - QRect(); - QRegion contentsRegion = QRegion(rect).subtracted(scrollBarArea); - QRect contentsRect = contentsRegion.boundingRect(); - - if ( HAVE_TRANSPARENCY && qAlpha(_blendColor) < 0xff && useOpacitySetting ) - { - QColor color(backgroundColor); - color.setAlpha(qAlpha(_blendColor)); - - painter.save(); - painter.setCompositionMode(QPainter::CompositionMode_Source); - painter.fillRect(contentsRect, color); - painter.restore(); - } - else - painter.fillRect(contentsRect, backgroundColor); - - painter.fillRect(scrollBarArea,_scrollBar->palette().background()); -} - -void TerminalDisplay::drawCursor(QPainter& painter, - const QRect& rect, - const QColor& foregroundColor, - const QColor& /*backgroundColor*/, - bool& invertCharacterColor) -{ - QRect cursorRect = rect; - cursorRect.setHeight(_fontHeight - _lineSpacing - 1); - - if (!_cursorBlinking) - { - if ( _cursorColor.isValid() ) - painter.setPen(_cursorColor); - else - painter.setPen(foregroundColor); - - if ( _cursorShape == BlockCursor ) - { - // draw the cursor outline, adjusting the area so that - // it is draw entirely inside 'rect' - int penWidth = qMax(1,painter.pen().width()); - - painter.drawRect(cursorRect.adjusted(penWidth/2, - penWidth/2, - - penWidth/2 - penWidth%2, - - penWidth/2 - penWidth%2)); - if ( hasFocus() ) - { - painter.fillRect(cursorRect, _cursorColor.isValid() ? _cursorColor : foregroundColor); - - if ( !_cursorColor.isValid() ) - { - // invert the colour used to draw the text to ensure that the character at - // the cursor position is readable - invertCharacterColor = true; - } - } - } - else if ( _cursorShape == UnderlineCursor ) - painter.drawLine(cursorRect.left(), - cursorRect.bottom(), - cursorRect.right(), - cursorRect.bottom()); - else if ( _cursorShape == IBeamCursor ) - painter.drawLine(cursorRect.left(), - cursorRect.top(), - cursorRect.left(), - cursorRect.bottom()); - - } -} - -void TerminalDisplay::drawCharacters(QPainter& painter, - const QRect& rect, - const QString& text, - const Character* style, - bool invertCharacterColor) -{ - // don't draw text which is currently blinking - if ( _blinking && (style->rendition & RE_BLINK) ) - return; - - // setup bold and underline - bool useBold; - ColorEntry::FontWeight weight = style->fontWeight(_colorTable); - if (weight == ColorEntry::UseCurrentFormat) - useBold = ((style->rendition & RE_BOLD) && _boldIntense) || font().bold(); - else - useBold = (weight == ColorEntry::Bold) ? true : false; - bool useUnderline = style->rendition & RE_UNDERLINE || font().underline(); - - QFont font = painter.font(); - if ( font.bold() != useBold - || font.underline() != useUnderline ) - { - font.setBold(useBold); - font.setUnderline(useUnderline); - painter.setFont(font); - } - - // setup pen - const CharacterColor& textColor = ( invertCharacterColor ? style->backgroundColor : style->foregroundColor ); - const QColor color = textColor.color(_colorTable); - QPen pen = painter.pen(); - if ( pen.color() != color ) - { - pen.setColor(color); - painter.setPen(color); - } - - // draw text - if ( isLineCharString(text) ) - drawLineCharString(painter,rect.x(),rect.y(),text,style); - else - { - // the drawText(rect,flags,string) overload is used here with null flags - // instead of drawText(rect,string) because the (rect,string) overload causes - // the application's default layout direction to be used instead of - // the widget-specific layout direction, which should always be - // Qt::LeftToRight for this widget - // This was discussed in: http://lists.kde.org/?t=120552223600002&r=1&w=2 - if (_bidiEnabled) - painter.drawText(rect,0,text); - else - painter.drawText(rect,0,LTR_OVERRIDE_CHAR+text); - } -} - -void TerminalDisplay::drawTextFragment(QPainter& painter , - const QRect& rect, - const QString& text, - const Character* style) -{ - painter.save(); - - // setup painter - const QColor foregroundColor = style->foregroundColor.color(_colorTable); - const QColor backgroundColor = style->backgroundColor.color(_colorTable); - - // draw background if different from the display's background color - if ( backgroundColor != palette().background().color() ) - drawBackground(painter,rect,backgroundColor, - false /* do not use transparency */); - - // draw cursor shape if the current character is the cursor - // this may alter the foreground and background colors - bool invertCharacterColor = false; - if ( style->rendition & RE_CURSOR ) - drawCursor(painter,rect,foregroundColor,backgroundColor,invertCharacterColor); - - // draw text - drawCharacters(painter,rect,text,style,invertCharacterColor); - - painter.restore(); -} - -void TerminalDisplay::setRandomSeed(uint randomSeed) { _randomSeed = randomSeed; } -uint TerminalDisplay::randomSeed() const { return _randomSeed; } - -#if 0 -/*! - Set XIM Position -*/ -void TerminalDisplay::setCursorPos(const int curx, const int cury) -{ - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - - int xpos, ypos; - ypos = _topMargin + tLy + _fontHeight*(cury-1) + _fontAscent; - xpos = _leftMargin + tLx + _fontWidth*curx; - _cursorLine = cury; - _cursorCol = curx; -} -#endif - -// scrolls the image by 'lines', down if lines > 0 or up otherwise. -// -// the terminal emulation keeps track of the scrolling of the character -// image as it receives input, and when the view is updated, it calls scrollImage() -// with the final scroll amount. this improves performance because scrolling the -// display is much cheaper than re-rendering all the text for the -// part of the image which has moved up or down. -// Instead only new lines have to be drawn -void TerminalDisplay::scrollImage(int lines , const QRect& screenWindowRegion) -{ - // if the flow control warning is enabled this will interfere with the - // scrolling optimizations and cause artifacts. the simple solution here - // is to just disable the optimization whilst it is visible - if ( _outputSuspendedLabel && _outputSuspendedLabel->isVisible() ) - return; - - // constrain the region to the display - // the bottom of the region is capped to the number of lines in the display's - // internal image - 2, so that the height of 'region' is strictly less - // than the height of the internal image. - QRect region = screenWindowRegion; - region.setBottom( qMin(region.bottom(),this->_lines-2) ); - - // return if there is nothing to do - if ( lines == 0 - || _image == 0 - || !region.isValid() - || (region.top() + abs(lines)) >= region.bottom() - || this->_lines <= region.height() ) return; - - // hide terminal size label to prevent it being scrolled - if (_resizeWidget && _resizeWidget->isVisible()) - _resizeWidget->hide(); - - // Note: With Qt 4.4 the left edge of the scrolled area must be at 0 - // to get the correct (newly exposed) part of the widget repainted. - // - // The right edge must be before the left edge of the scroll bar to - // avoid triggering a repaint of the entire widget, the distance is - // given by SCROLLBAR_CONTENT_GAP - // - // Set the QT_FLUSH_PAINT environment variable to '1' before starting the - // application to monitor repainting. - // - int scrollBarWidth = _scrollBar->isHidden() ? 0 : _scrollBar->width(); - const int SCROLLBAR_CONTENT_GAP = 1; - QRect scrollRect; - if ( _scrollbarLocation == ScrollBarLeft ) - { - scrollRect.setLeft(scrollBarWidth+SCROLLBAR_CONTENT_GAP); - scrollRect.setRight(width()); - } - else - { - scrollRect.setLeft(0); - scrollRect.setRight(width() - scrollBarWidth - SCROLLBAR_CONTENT_GAP); - } - void* firstCharPos = &_image[ region.top() * this->_columns ]; - void* lastCharPos = &_image[ (region.top() + abs(lines)) * this->_columns ]; - - int top = _topMargin + (region.top() * _fontHeight); - int linesToMove = region.height() - abs(lines); - int bytesToMove = linesToMove * - this->_columns * - sizeof(Character); - - Q_ASSERT( linesToMove > 0 ); - Q_ASSERT( bytesToMove > 0 ); - - //scroll internal image - if ( lines > 0 ) - { - // check that the memory areas that we are going to move are valid - Q_ASSERT( (char*)lastCharPos + bytesToMove < - (char*)(_image + (this->_lines * this->_columns)) ); - - Q_ASSERT( (lines*this->_columns) < _imageSize ); - - //scroll internal image down - memmove( firstCharPos , lastCharPos , bytesToMove ); - - //set region of display to scroll - scrollRect.setTop(top); - } - else - { - // check that the memory areas that we are going to move are valid - Q_ASSERT( (char*)firstCharPos + bytesToMove < - (char*)(_image + (this->_lines * this->_columns)) ); - - //scroll internal image up - memmove( lastCharPos , firstCharPos , bytesToMove ); - - //set region of the display to scroll - scrollRect.setTop(top + abs(lines) * _fontHeight); - } - scrollRect.setHeight(linesToMove * _fontHeight ); - - Q_ASSERT(scrollRect.isValid() && !scrollRect.isEmpty()); - - //scroll the display vertically to match internal _image - scroll( 0 , _fontHeight * (-lines) , scrollRect ); -} - -QRegion TerminalDisplay::hotSpotRegion() const -{ - QRegion region; - foreach( Filter::HotSpot* hotSpot , _filterChain->hotSpots() ) - { - QRect r; - if (hotSpot->startLine()==hotSpot->endLine()) { - r.setLeft(hotSpot->startColumn()); - r.setTop(hotSpot->startLine()); - r.setRight(hotSpot->endColumn()); - r.setBottom(hotSpot->endLine()); - region |= imageToWidget(r);; - } else { - r.setLeft(hotSpot->startColumn()); - r.setTop(hotSpot->startLine()); - r.setRight(_columns); - r.setBottom(hotSpot->startLine()); - region |= imageToWidget(r);; - for ( int line = hotSpot->startLine()+1 ; line < hotSpot->endLine() ; line++ ) { - r.setLeft(0); - r.setTop(line); - r.setRight(_columns); - r.setBottom(line); - region |= imageToWidget(r);; - } - r.setLeft(0); - r.setTop(hotSpot->endLine()); - r.setRight(hotSpot->endColumn()); - r.setBottom(hotSpot->endLine()); - region |= imageToWidget(r);; - } - } - return region; -} - -void TerminalDisplay::processFilters() -{ - if (!_screenWindow) - return; - - QRegion preUpdateHotSpots = hotSpotRegion(); - - // use _screenWindow->getImage() here rather than _image because - // other classes may call processFilters() when this display's - // ScreenWindow emits a scrolled() signal - which will happen before - // updateImage() is called on the display and therefore _image is - // out of date at this point - _filterChain->setImage( _screenWindow->getImage(), - _screenWindow->windowLines(), - _screenWindow->windowColumns(), - _screenWindow->getLineProperties() ); - _filterChain->process(); - - QRegion postUpdateHotSpots = hotSpotRegion(); - - update( preUpdateHotSpots | postUpdateHotSpots ); -} - -void TerminalDisplay::updateImage() -{ - if ( !_screenWindow ) - return; - - // optimization - scroll the existing image where possible and - // avoid expensive text drawing for parts of the image that - // can simply be moved up or down - scrollImage( _screenWindow->scrollCount() , - _screenWindow->scrollRegion() ); - _screenWindow->resetScrollCount(); - - if (!_image) { - // Create _image. - // The emitted changedContentSizeSignal also leads to getImage being recreated, so do this first. - updateImageSize(); - } - - Character* const newimg = _screenWindow->getImage(); - int lines = _screenWindow->windowLines(); - int columns = _screenWindow->windowColumns(); - - setScroll( _screenWindow->currentLine() , _screenWindow->lineCount() ); - - Q_ASSERT( this->_usedLines <= this->_lines ); - Q_ASSERT( this->_usedColumns <= this->_columns ); - - int y,x,len; - - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - _hasBlinker = false; - - CharacterColor cf; // undefined - CharacterColor _clipboard; // undefined - int cr = -1; // undefined - - const int linesToUpdate = qMin(this->_lines, qMax(0,lines )); - const int columnsToUpdate = qMin(this->_columns,qMax(0,columns)); - - QChar *disstrU = new QChar[columnsToUpdate]; - char *dirtyMask = new char[columnsToUpdate+2]; - QRegion dirtyRegion; - - // debugging variable, this records the number of lines that are found to - // be 'dirty' ( ie. have changed from the old _image to the new _image ) and - // which therefore need to be repainted - int dirtyLineCount = 0; - - for (y = 0; y < linesToUpdate; ++y) - { - const Character* currentLine = &_image[y*this->_columns]; - const Character* const newLine = &newimg[y*columns]; - - bool updateLine = false; - - // The dirty mask indicates which characters need repainting. We also - // mark surrounding neighbours dirty, in case the character exceeds - // its cell boundaries - memset(dirtyMask, 0, columnsToUpdate+2); - - for( x = 0 ; x < columnsToUpdate ; ++x) - { - if ( newLine[x] != currentLine[x] ) - { - dirtyMask[x] = true; - } - } - - if (!_resizing) // not while _resizing, we're expecting a paintEvent - for (x = 0; x < columnsToUpdate; ++x) - { - _hasBlinker |= (newLine[x].rendition & RE_BLINK); - - // Start drawing if this character or the next one differs. - // We also take the next one into account to handle the situation - // where characters exceed their cell width. - if (dirtyMask[x]) - { - quint16 c = newLine[x+0].character; - if ( !c ) - continue; - int p = 0; - disstrU[p++] = c; //fontMap(c); - bool lineDraw = isLineChar(c); - bool doubleWidth = (x+1 == columnsToUpdate) ? false : (newLine[x+1].character == 0); - cr = newLine[x].rendition; - _clipboard = newLine[x].backgroundColor; - if (newLine[x].foregroundColor != cf) cf = newLine[x].foregroundColor; - int lln = columnsToUpdate - x; - for (len = 1; len < lln; ++len) - { - const Character& ch = newLine[x+len]; - - if (!ch.character) - continue; // Skip trailing part of multi-col chars. - - bool nextIsDoubleWidth = (x+len+1 == columnsToUpdate) ? false : (newLine[x+len+1].character == 0); - - if ( ch.foregroundColor != cf || - ch.backgroundColor != _clipboard || - ch.rendition != cr || - !dirtyMask[x+len] || - isLineChar(c) != lineDraw || - nextIsDoubleWidth != doubleWidth ) - break; - - disstrU[p++] = c; //fontMap(c); - } - - QString unistr(disstrU, p); - - bool saveFixedFont = _fixedFont; - if (lineDraw) - _fixedFont = false; - if (doubleWidth) - _fixedFont = false; - - updateLine = true; - - _fixedFont = saveFixedFont; - x += len - 1; - } - - } - - //both the top and bottom halves of double height _lines must always be redrawn - //although both top and bottom halves contain the same characters, only - //the top one is actually - //drawn. - if (_lineProperties.count() > y) - updateLine |= (_lineProperties[y] & LINE_DOUBLEHEIGHT); - - // if the characters on the line are different in the old and the new _image - // then this line must be repainted. - if (updateLine) - { - dirtyLineCount++; - - // add the area occupied by this line to the region which needs to be - // repainted - QRect dirtyRect = QRect( _leftMargin+tLx , - _topMargin+tLy+_fontHeight*y , - _fontWidth * columnsToUpdate , - _fontHeight ); - - dirtyRegion |= dirtyRect; - } - - // replace the line of characters in the old _image with the - // current line of the new _image - memcpy((void*)currentLine,(const void*)newLine,columnsToUpdate*sizeof(Character)); - } - - // if the new _image is smaller than the previous _image, then ensure that the area - // outside the new _image is cleared - if ( linesToUpdate < _usedLines ) - { - dirtyRegion |= QRect( _leftMargin+tLx , - _topMargin+tLy+_fontHeight*linesToUpdate , - _fontWidth * this->_columns , - _fontHeight * (_usedLines-linesToUpdate) ); - } - _usedLines = linesToUpdate; - - if ( columnsToUpdate < _usedColumns ) - { - dirtyRegion |= QRect( _leftMargin+tLx+columnsToUpdate*_fontWidth , - _topMargin+tLy , - _fontWidth * (_usedColumns-columnsToUpdate) , - _fontHeight * this->_lines ); - } - _usedColumns = columnsToUpdate; - - dirtyRegion |= _inputMethodData.previousPreeditRect; - - // update the parts of the display which have changed - update(dirtyRegion); - - if ( _hasBlinker && !_blinkTimer->isActive()) _blinkTimer->start( TEXT_BLINK_DELAY ); - if (!_hasBlinker && _blinkTimer->isActive()) { _blinkTimer->stop(); _blinking = false; } - delete[] dirtyMask; - delete[] disstrU; - -} - -void TerminalDisplay::showResizeNotification() -{ - if (_terminalSizeHint && isVisible()) - { - if (_terminalSizeStartup) { - _terminalSizeStartup=false; - return; - } - if (!_resizeWidget) - { - _resizeWidget = new QLabel(QString("Size: XXX x XXX"), this); - _resizeWidget->setMinimumWidth(_resizeWidget->fontMetrics().width(QString("Size: XXX x XXX"))); - _resizeWidget->setMinimumHeight(_resizeWidget->sizeHint().height()); - _resizeWidget->setAlignment(Qt::AlignCenter); - - _resizeWidget->setStyleSheet("background-color:palette(window);border-style:solid;border-width:1px;border-color:palette(dark)"); - - _resizeTimer = new QTimer(this); - _resizeTimer->setSingleShot(true); - connect(_resizeTimer, SIGNAL(timeout()), _resizeWidget, SLOT(hide())); - } - QString sizeStr = QString("Size: %1 x %2").arg(_columns).arg(_lines); - _resizeWidget->setText(sizeStr); - _resizeWidget->move((width()-_resizeWidget->width())/2, - (height()-_resizeWidget->height())/2+20); - _resizeWidget->show(); - _resizeTimer->start(1000); - } -} - -void TerminalDisplay::setBlinkingCursor(bool blink) -{ - _hasBlinkingCursor=blink; - - if (blink && !_blinkCursorTimer->isActive()) - _blinkCursorTimer->start(QApplication::cursorFlashTime() / 2); - - if (!blink && _blinkCursorTimer->isActive()) - { - _blinkCursorTimer->stop(); - if (_cursorBlinking) - blinkCursorEvent(); - else - _cursorBlinking = false; - } -} - -void TerminalDisplay::setBlinkingTextEnabled(bool blink) -{ - _allowBlinkingText = blink; - - if (blink && !_blinkTimer->isActive()) - _blinkTimer->start(TEXT_BLINK_DELAY); - - if (!blink && _blinkTimer->isActive()) - { - _blinkTimer->stop(); - _blinking = false; - } -} - -void TerminalDisplay::focusOutEvent(QFocusEvent*) -{ - // trigger a repaint of the cursor so that it is both visible (in case - // it was hidden during blinking) - // and drawn in a focused out state - _cursorBlinking = false; - updateCursor(); - - _blinkCursorTimer->stop(); - if (_blinking) - blinkEvent(); - - _blinkTimer->stop(); -} -void TerminalDisplay::focusInEvent(QFocusEvent*) -{ - if (_hasBlinkingCursor) - { - _blinkCursorTimer->start(); - } - updateCursor(); - - if (_hasBlinker) - _blinkTimer->start(); -} - -void TerminalDisplay::paintEvent( QPaintEvent* pe ) -{ - QPainter paint(this); - - foreach (const QRect &rect, (pe->region() & contentsRect()).rects()) - { - drawBackground(paint,rect,palette().background().color(), - true /* use opacity setting */); - drawContents(paint, rect); - } - drawInputMethodPreeditString(paint,preeditRect()); - paintFilters(paint); -} - -QPoint TerminalDisplay::cursorPosition() const -{ - if (_screenWindow) - return _screenWindow->cursorPosition(); - else - return QPoint(0,0); -} - -QRect TerminalDisplay::preeditRect() const -{ - const int preeditLength = string_width(_inputMethodData.preeditString); - - if ( preeditLength == 0 ) - return QRect(); - - return QRect(_leftMargin + _fontWidth*cursorPosition().x(), - _topMargin + _fontHeight*cursorPosition().y(), - _fontWidth*preeditLength, - _fontHeight); -} - -void TerminalDisplay::drawInputMethodPreeditString(QPainter& painter , const QRect& rect) -{ - if ( _inputMethodData.preeditString.isEmpty() ) - return; - - const QPoint cursorPos = cursorPosition(); - - bool invertColors = false; - const QColor background = _colorTable[DEFAULT_BACK_COLOR].color; - const QColor foreground = _colorTable[DEFAULT_FORE_COLOR].color; - const Character* style = &_image[loc(cursorPos.x(),cursorPos.y())]; - - drawBackground(painter,rect,background,true); - drawCursor(painter,rect,foreground,background,invertColors); - drawCharacters(painter,rect,_inputMethodData.preeditString,style,invertColors); - - _inputMethodData.previousPreeditRect = rect; -} - -FilterChain* TerminalDisplay::filterChain() const -{ - return _filterChain; -} - -void TerminalDisplay::paintFilters(QPainter& painter) -{ - // get color of character under mouse and use it to draw - // lines for filters - QPoint cursorPos = mapFromGlobal(QCursor::pos()); - int cursorLine; - int cursorColumn; - int scrollBarWidth = (_scrollbarLocation == ScrollBarLeft) ? _scrollBar->width() : 0; - - getCharacterPosition( cursorPos , cursorLine , cursorColumn ); - Character cursorCharacter = _image[loc(cursorColumn,cursorLine)]; - - painter.setPen( QPen(cursorCharacter.foregroundColor.color(colorTable())) ); - - // iterate over hotspots identified by the display's currently active filters - // and draw appropriate visuals to indicate the presence of the hotspot - - QList<Filter::HotSpot*> spots = _filterChain->hotSpots(); - QListIterator<Filter::HotSpot*> iter(spots); - while (iter.hasNext()) - { - Filter::HotSpot* spot = iter.next(); - - QRegion region; - if ( spot->type() == Filter::HotSpot::Link ) { - QRect r; - if (spot->startLine()==spot->endLine()) { - r.setCoords( spot->startColumn()*_fontWidth + 1 + scrollBarWidth, - spot->startLine()*_fontHeight + 1, - (spot->endColumn()-1)*_fontWidth - 1 + scrollBarWidth, - (spot->endLine()+1)*_fontHeight - 1 ); - region |= r; - } else { - r.setCoords( spot->startColumn()*_fontWidth + 1 + scrollBarWidth, - spot->startLine()*_fontHeight + 1, - (_columns-1)*_fontWidth - 1 + scrollBarWidth, - (spot->startLine()+1)*_fontHeight - 1 ); - region |= r; - for ( int line = spot->startLine()+1 ; line < spot->endLine() ; line++ ) { - r.setCoords( 0*_fontWidth + 1 + scrollBarWidth, - line*_fontHeight + 1, - (_columns-1)*_fontWidth - 1 + scrollBarWidth, - (line+1)*_fontHeight - 1 ); - region |= r; - } - r.setCoords( 0*_fontWidth + 1 + scrollBarWidth, - spot->endLine()*_fontHeight + 1, - (spot->endColumn()-1)*_fontWidth - 1 + scrollBarWidth, - (spot->endLine()+1)*_fontHeight - 1 ); - region |= r; - } - } - - for ( int line = spot->startLine() ; line <= spot->endLine() ; line++ ) - { - int startColumn = 0; - int endColumn = _columns-1; // TODO use number of _columns which are actually - // occupied on this line rather than the width of the - // display in _columns - - // ignore whitespace at the end of the lines - while ( QChar(_image[loc(endColumn,line)].character).isSpace() && endColumn > 0 ) - endColumn--; - - // increment here because the column which we want to set 'endColumn' to - // is the first whitespace character at the end of the line - endColumn++; - - if ( line == spot->startLine() ) - startColumn = spot->startColumn(); - if ( line == spot->endLine() ) - endColumn = spot->endColumn(); - - // subtract one pixel from - // the right and bottom so that - // we do not overdraw adjacent - // hotspots - // - // subtracting one pixel from all sides also prevents an edge case where - // moving the mouse outside a link could still leave it underlined - // because the check below for the position of the cursor - // finds it on the border of the target area - QRect r; - r.setCoords( startColumn*_fontWidth + 1 + scrollBarWidth, - line*_fontHeight + 1, - endColumn*_fontWidth - 1 + scrollBarWidth, - (line+1)*_fontHeight - 1 ); - // Underline link hotspots - if ( spot->type() == Filter::HotSpot::Link ) - { - QFontMetrics metrics(font()); - - // find the baseline (which is the invisible line that the characters in the font sit on, - // with some having tails dangling below) - int baseline = r.bottom() - metrics.descent(); - // find the position of the underline below that - int underlinePos = baseline + metrics.underlinePos(); - if ( region.contains( mapFromGlobal(QCursor::pos()) ) ){ - painter.drawLine( r.left() , underlinePos , - r.right() , underlinePos ); - } - } - // Marker hotspots simply have a transparent rectanglular shape - // drawn on top of them - else if ( spot->type() == Filter::HotSpot::Marker ) - { - //TODO - Do not use a hardcoded colour for this - painter.fillRect(r,QBrush(QColor(255,0,0,120))); - } - } - } -} -void TerminalDisplay::drawContents(QPainter &paint, const QRect &rect) -{ - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - - int lux = qMin(_usedColumns-1, qMax(0,(rect.left() - tLx - _leftMargin ) / _fontWidth)); - int luy = qMin(_usedLines-1, qMax(0,(rect.top() - tLy - _topMargin ) / _fontHeight)); - int rlx = qMin(_usedColumns-1, qMax(0,(rect.right() - tLx - _leftMargin ) / _fontWidth)); - int rly = qMin(_usedLines-1, qMax(0,(rect.bottom() - tLy - _topMargin ) / _fontHeight)); - - const int bufferSize = _usedColumns; - QString unistr; - unistr.reserve(bufferSize); - for (int y = luy; y <= rly; y++) - { - quint16 c = _image[loc(lux,y)].character; - int x = lux; - if(!c && x) - x--; // Search for start of multi-column character - for (; x <= rlx; x++) - { - int len = 1; - int p = 0; - - // reset our buffer to the maximal size - unistr.resize(bufferSize); - QChar *disstrU = unistr.data(); - - // is this a single character or a sequence of characters ? - if ( _image[loc(x,y)].rendition & RE_EXTENDED_CHAR ) - { - // sequence of characters - ushort extendedCharLength = 0; - ushort* chars = ExtendedCharTable::instance - .lookupExtendedChar(_image[loc(x,y)].charSequence,extendedCharLength); - for ( int index = 0 ; index < extendedCharLength ; index++ ) - { - Q_ASSERT( p < bufferSize ); - disstrU[p++] = chars[index]; - } - } - else - { - // single character - c = _image[loc(x,y)].character; - if (c) - { - Q_ASSERT( p < bufferSize ); - disstrU[p++] = c; //fontMap(c); - } - } - - bool lineDraw = isLineChar(c); - bool doubleWidth = (_image[ qMin(loc(x,y)+1,_imageSize) ].character == 0); - CharacterColor currentForeground = _image[loc(x,y)].foregroundColor; - CharacterColor currentBackground = _image[loc(x,y)].backgroundColor; - quint8 currentRendition = _image[loc(x,y)].rendition; - - while (x+len <= rlx && - _image[loc(x+len,y)].foregroundColor == currentForeground && - _image[loc(x+len,y)].backgroundColor == currentBackground && - _image[loc(x+len,y)].rendition == currentRendition && - (_image[ qMin(loc(x+len,y)+1,_imageSize) ].character == 0) == doubleWidth && - isLineChar( c = _image[loc(x+len,y)].character) == lineDraw) // Assignment! - { - if (c) - disstrU[p++] = c; //fontMap(c); - if (doubleWidth) // assert((_image[loc(x+len,y)+1].character == 0)), see above if condition - len++; // Skip trailing part of multi-column character - len++; - } - if ((x+len < _usedColumns) && (!_image[loc(x+len,y)].character)) - len++; // Adjust for trailing part of multi-column character - - bool save__fixedFont = _fixedFont; - if (lineDraw) - _fixedFont = false; - if (doubleWidth) - _fixedFont = false; - unistr.resize(p); - - // Create a text scaling matrix for double width and double height lines. - QMatrix textScale; - - if (y < _lineProperties.size()) - { - if (_lineProperties[y] & LINE_DOUBLEWIDTH) - textScale.scale(2,1); - - if (_lineProperties[y] & LINE_DOUBLEHEIGHT) - textScale.scale(1,2); - } - - //Apply text scaling matrix. - paint.setWorldMatrix(textScale, true); - - //calculate the area in which the text will be drawn - QRect textArea = QRect( _leftMargin+tLx+_fontWidth*x , _topMargin+tLy+_fontHeight*y , _fontWidth*len , _fontHeight); - - //move the calculated area to take account of scaling applied to the painter. - //the position of the area from the origin (0,0) is scaled - //by the opposite of whatever - //transformation has been applied to the painter. this ensures that - //painting does actually start from textArea.topLeft() - //(instead of textArea.topLeft() * painter-scale) - textArea.moveTopLeft( textScale.inverted().map(textArea.topLeft()) ); - - //paint text fragment - drawTextFragment( paint, - textArea, - unistr, - &_image[loc(x,y)] ); //, - //0, - //!_isPrinting ); - - _fixedFont = save__fixedFont; - - //reset back to single-width, single-height _lines - paint.setWorldMatrix(textScale.inverted(), true); - - if (y < _lineProperties.size()-1) - { - //double-height _lines are represented by two adjacent _lines - //containing the same characters - //both _lines will have the LINE_DOUBLEHEIGHT attribute. - //If the current line has the LINE_DOUBLEHEIGHT attribute, - //we can therefore skip the next line - if (_lineProperties[y] & LINE_DOUBLEHEIGHT) - y++; - } - - x += len - 1; - } - } -} - -void TerminalDisplay::blinkEvent() -{ - if (!_allowBlinkingText) return; - - _blinking = !_blinking; - - //TODO: Optimize to only repaint the areas of the widget - // where there is blinking text - // rather than repainting the whole widget. - update(); -} - -QRect TerminalDisplay::imageToWidget(const QRect& imageArea) const -{ - QRect result; - result.setLeft( _leftMargin + _fontWidth * imageArea.left() ); - result.setTop( _topMargin + _fontHeight * imageArea.top() ); - result.setWidth( _fontWidth * imageArea.width() ); - result.setHeight( _fontHeight * imageArea.height() ); - - return result; -} - -void TerminalDisplay::updateCursor() -{ - QRect cursorRect = imageToWidget( QRect(cursorPosition(),QSize(1,1)) ); - update(cursorRect); -} - -void TerminalDisplay::blinkCursorEvent() -{ - _cursorBlinking = !_cursorBlinking; - updateCursor(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Resizing */ -/* */ -/* ------------------------------------------------------------------------- */ - -void TerminalDisplay::resizeEvent(QResizeEvent*) -{ - updateImageSize(); -} - -void TerminalDisplay::propagateSize() -{ - if (_isFixedSize) - { - setSize(_columns, _lines); - QWidget::setFixedSize(sizeHint()); - parentWidget()->adjustSize(); - parentWidget()->setFixedSize(parentWidget()->sizeHint()); - return; - } - if (_image) - updateImageSize(); -} - -void TerminalDisplay::updateImageSize() -{ - Character* oldimg = _image; - int oldlin = _lines; - int oldcol = _columns; - - makeImage(); - - // copy the old image to reduce flicker - int lines = qMin(oldlin,_lines); - int columns = qMin(oldcol,_columns); - - if (oldimg) - { - for (int line = 0; line < lines; line++) - { - memcpy((void*)&_image[_columns*line], - (void*)&oldimg[oldcol*line],columns*sizeof(Character)); - } - delete[] oldimg; - } - - if (_screenWindow) - _screenWindow->setWindowLines(_lines); - - _resizing = (oldlin!=_lines) || (oldcol!=_columns); - - if ( _resizing ) - { - showResizeNotification(); - emit changedContentSizeSignal(_contentHeight, _contentWidth); // expose resizeEvent - } - - _resizing = false; -} - -//showEvent and hideEvent are reimplemented here so that it appears to other classes that the -//display has been resized when the display is hidden or shown. -// -//TODO: Perhaps it would be better to have separate signals for show and hide instead of using -//the same signal as the one for a content size change -void TerminalDisplay::showEvent(QShowEvent*) -{ - emit changedContentSizeSignal(_contentHeight,_contentWidth); -} -void TerminalDisplay::hideEvent(QHideEvent*) -{ - emit changedContentSizeSignal(_contentHeight,_contentWidth); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Scrollbar */ -/* */ -/* ------------------------------------------------------------------------- */ - -void TerminalDisplay::scrollBarPositionChanged(int) -{ - if ( !_screenWindow ) - return; - - _screenWindow->scrollTo( _scrollBar->value() ); - - // if the thumb has been moved to the bottom of the _scrollBar then set - // the display to automatically track new output, - // that is, scroll down automatically - // to how new _lines as they are added - const bool atEndOfOutput = (_scrollBar->value() == _scrollBar->maximum()); - _screenWindow->setTrackOutput( atEndOfOutput ); - - updateImage(); -} - -void TerminalDisplay::setScroll(int cursor, int slines) -{ - // update _scrollBar if the range or value has changed, - // otherwise return - // - // setting the range or value of a _scrollBar will always trigger - // a repaint, so it should be avoided if it is not necessary - if ( _scrollBar->minimum() == 0 && - _scrollBar->maximum() == (slines - _lines) && - _scrollBar->value() == cursor ) - { - return; - } - - disconnect(_scrollBar, SIGNAL(valueChanged(int)), this, SLOT(scrollBarPositionChanged(int))); - _scrollBar->setRange(0,slines - _lines); - _scrollBar->setSingleStep(1); - _scrollBar->setPageStep(_lines); - _scrollBar->setValue(cursor); - connect(_scrollBar, SIGNAL(valueChanged(int)), this, SLOT(scrollBarPositionChanged(int))); -} - -void TerminalDisplay::setScrollBarPosition(ScrollBarPosition position) -{ - if (_scrollbarLocation == position) - return; - - if ( position == NoScrollBar ) - _scrollBar->hide(); - else - _scrollBar->show(); - - _topMargin = _leftMargin = 1; - _scrollbarLocation = position; - - propagateSize(); - update(); -} - -void TerminalDisplay::mousePressEvent(QMouseEvent* ev) -{ - if ( _possibleTripleClick && (ev->button()==Qt::LeftButton) ) { - mouseTripleClickEvent(ev); - return; - } - - if ( !contentsRect().contains(ev->pos()) ) return; - - if ( !_screenWindow ) return; - - int charLine; - int charColumn; - getCharacterPosition(ev->pos(),charLine,charColumn); - QPoint pos = QPoint(charColumn,charLine); - - if ( ev->button() == Qt::LeftButton) - { - _lineSelectionMode = false; - _wordSelectionMode = false; - - emit isBusySelecting(true); // Keep it steady... - // Drag only when the Control key is hold - bool selected = false; - - // The receiver of the testIsSelected() signal will adjust - // 'selected' accordingly. - //emit testIsSelected(pos.x(), pos.y(), selected); - - selected = _screenWindow->isSelected(pos.x(),pos.y()); - - if ((!_ctrlDrag || ev->modifiers() & Qt::ControlModifier) && selected ) { - // The user clicked inside selected text - dragInfo.state = diPending; - dragInfo.start = ev->pos(); - } - else { - // No reason to ever start a drag event - dragInfo.state = diNone; - - _preserveLineBreaks = !( ( ev->modifiers() & Qt::ControlModifier ) && !(ev->modifiers() & Qt::AltModifier) ); - _columnSelectionMode = (ev->modifiers() & Qt::AltModifier) && (ev->modifiers() & Qt::ControlModifier); - - if (_mouseMarks || (ev->modifiers() & Qt::ShiftModifier)) - { - _screenWindow->clearSelection(); - - //emit clearSelectionSignal(); - pos.ry() += _scrollBar->value(); - _iPntSel = _pntSel = pos; - _actSel = 1; // left mouse button pressed but nothing selected yet. - - } - else - { - emit mouseSignal( 0, charColumn + 1, charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , 0); - } - } - } - else if ( ev->button() == Qt::MidButton ) - { - if ( _mouseMarks || (!_mouseMarks && (ev->modifiers() & Qt::ShiftModifier)) ) - emitSelection(true,ev->modifiers() & Qt::ControlModifier); - else - emit mouseSignal( 1, charColumn +1, charLine +1 +_scrollBar->value() -_scrollBar->maximum() , 0); - } - else if ( ev->button() == Qt::RightButton ) - { - if (_mouseMarks || (ev->modifiers() & Qt::ShiftModifier)) - emit configureRequest(ev->pos()); - else - emit mouseSignal( 2, charColumn +1, charLine +1 +_scrollBar->value() -_scrollBar->maximum() , 0); - } -} - -QList<QAction*> TerminalDisplay::filterActions(const QPoint& position) -{ - int charLine, charColumn; - getCharacterPosition(position,charLine,charColumn); - - Filter::HotSpot* spot = _filterChain->hotSpotAt(charLine,charColumn); - - return spot ? spot->actions() : QList<QAction*>(); -} - -void TerminalDisplay::mouseMoveEvent(QMouseEvent* ev) -{ - int charLine = 0; - int charColumn = 0; - int scrollBarWidth = (_scrollbarLocation == ScrollBarLeft) ? _scrollBar->width() : 0; - - getCharacterPosition(ev->pos(),charLine,charColumn); - - // handle filters - // change link hot-spot appearance on mouse-over - Filter::HotSpot* spot = _filterChain->hotSpotAt(charLine,charColumn); - if ( spot && spot->type() == Filter::HotSpot::Link) - { - QRegion previousHotspotArea = _mouseOverHotspotArea; - _mouseOverHotspotArea = QRegion(); - QRect r; - if (spot->startLine()==spot->endLine()) { - r.setCoords( spot->startColumn()*_fontWidth + scrollBarWidth, - spot->startLine()*_fontHeight, - spot->endColumn()*_fontWidth + scrollBarWidth, - (spot->endLine()+1)*_fontHeight - 1 ); - _mouseOverHotspotArea |= r; - } else { - r.setCoords( spot->startColumn()*_fontWidth + scrollBarWidth, - spot->startLine()*_fontHeight, - _columns*_fontWidth - 1 + scrollBarWidth, - (spot->startLine()+1)*_fontHeight ); - _mouseOverHotspotArea |= r; - for ( int line = spot->startLine()+1 ; line < spot->endLine() ; line++ ) { - r.setCoords( 0*_fontWidth + scrollBarWidth, - line*_fontHeight, - _columns*_fontWidth + scrollBarWidth, - (line+1)*_fontHeight ); - _mouseOverHotspotArea |= r; - } - r.setCoords( 0*_fontWidth + scrollBarWidth, - spot->endLine()*_fontHeight, - spot->endColumn()*_fontWidth + scrollBarWidth, - (spot->endLine()+1)*_fontHeight ); - _mouseOverHotspotArea |= r; - } - // display tooltips when mousing over links - // TODO: Extend this to work with filter types other than links - const QString& tooltip = spot->tooltip(); - if ( !tooltip.isEmpty() ) - { - QToolTip::showText( mapToGlobal(ev->pos()) , tooltip , this , _mouseOverHotspotArea.boundingRect() ); - } - - update( _mouseOverHotspotArea | previousHotspotArea ); - } - else if ( !_mouseOverHotspotArea.isEmpty() ) - { - update( _mouseOverHotspotArea ); - // set hotspot area to an invalid rectangle - _mouseOverHotspotArea = QRegion(); - } - - // for auto-hiding the cursor, we need mouseTracking - if (ev->buttons() == Qt::NoButton ) return; - - // if the terminal is interested in mouse movements - // then emit a mouse movement signal, unless the shift - // key is being held down, which overrides this. - if (!_mouseMarks && !(ev->modifiers() & Qt::ShiftModifier)) - { - int button = 3; - if (ev->buttons() & Qt::LeftButton) - button = 0; - if (ev->buttons() & Qt::MidButton) - button = 1; - if (ev->buttons() & Qt::RightButton) - button = 2; - - - emit mouseSignal( button, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum(), - 1 ); - - return; - } - - if (dragInfo.state == diPending) - { - // we had a mouse down, but haven't confirmed a drag yet - // if the mouse has moved sufficiently, we will confirm - - int distance = 10; //KGlobalSettings::dndEventDelay(); - if ( ev->x() > dragInfo.start.x() + distance || ev->x() < dragInfo.start.x() - distance || - ev->y() > dragInfo.start.y() + distance || ev->y() < dragInfo.start.y() - distance) - { - // we've left the drag square, we can start a real drag operation now - emit isBusySelecting(false); // Ok.. we can breath again. - - _screenWindow->clearSelection(); - doDrag(); - } - return; - } - else if (dragInfo.state == diDragging) - { - // this isn't technically needed because mouseMoveEvent is suppressed during - // Qt drag operations, replaced by dragMoveEvent - return; - } - - if (_actSel == 0) return; - - // don't extend selection while pasting - if (ev->buttons() & Qt::MidButton) return; - - extendSelection( ev->pos() ); -} - -void TerminalDisplay::extendSelection( const QPoint& position ) -{ - QPoint pos = position; - - if ( !_screenWindow ) - return; - - //if ( !contentsRect().contains(ev->pos()) ) return; - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - int scroll = _scrollBar->value(); - - // we're in the process of moving the mouse with the left button pressed - // the mouse cursor will kept caught within the bounds of the text in - // this widget. - - int linesBeyondWidget = 0; - - QRect textBounds(tLx + _leftMargin, - tLy + _topMargin, - _usedColumns*_fontWidth-1, - _usedLines*_fontHeight-1); - - // Adjust position within text area bounds. - QPoint oldpos = pos; - - pos.setX( qBound(textBounds.left(),pos.x(),textBounds.right()) ); - pos.setY( qBound(textBounds.top(),pos.y(),textBounds.bottom()) ); - - if ( oldpos.y() > textBounds.bottom() ) - { - linesBeyondWidget = (oldpos.y()-textBounds.bottom()) / _fontHeight; - _scrollBar->setValue(_scrollBar->value()+linesBeyondWidget+1); // scrollforward - } - if ( oldpos.y() < textBounds.top() ) - { - linesBeyondWidget = (textBounds.top()-oldpos.y()) / _fontHeight; - _scrollBar->setValue(_scrollBar->value()-linesBeyondWidget-1); // history - } - - int charColumn = 0; - int charLine = 0; - getCharacterPosition(pos,charLine,charColumn); - - QPoint here = QPoint(charColumn,charLine); //QPoint((pos.x()-tLx-_leftMargin+(_fontWidth/2))/_fontWidth,(pos.y()-tLy-_topMargin)/_fontHeight); - QPoint ohere; - QPoint _iPntSelCorr = _iPntSel; - _iPntSelCorr.ry() -= _scrollBar->value(); - QPoint _pntSelCorr = _pntSel; - _pntSelCorr.ry() -= _scrollBar->value(); - bool swapping = false; - - if ( _wordSelectionMode ) - { - // Extend to word boundaries - int i; - QChar selClass; - - bool left_not_right = ( here.y() < _iPntSelCorr.y() || - ( here.y() == _iPntSelCorr.y() && here.x() < _iPntSelCorr.x() ) ); - bool old_left_not_right = ( _pntSelCorr.y() < _iPntSelCorr.y() || - ( _pntSelCorr.y() == _iPntSelCorr.y() && _pntSelCorr.x() < _iPntSelCorr.x() ) ); - swapping = left_not_right != old_left_not_right; - - // Find left (left_not_right ? from here : from start) - QPoint left = left_not_right ? here : _iPntSelCorr; - i = loc(left.x(),left.y()); - if (i>=0 && i<=_imageSize) { - selClass = charClass(_image[i].character); - while ( ((left.x()>0) || (left.y()>0 && (_lineProperties[left.y()-1] & LINE_WRAPPED) )) - && charClass(_image[i-1].character) == selClass ) - { i--; if (left.x()>0) left.rx()--; else {left.rx()=_usedColumns-1; left.ry()--;} } - } - - // Find left (left_not_right ? from start : from here) - QPoint right = left_not_right ? _iPntSelCorr : here; - i = loc(right.x(),right.y()); - if (i>=0 && i<=_imageSize) { - selClass = charClass(_image[i].character); - while( ((right.x()<_usedColumns-1) || (right.y()<_usedLines-1 && (_lineProperties[right.y()] & LINE_WRAPPED) )) - && charClass(_image[i+1].character) == selClass ) - { i++; if (right.x()<_usedColumns-1) right.rx()++; else {right.rx()=0; right.ry()++; } } - } - - // Pick which is start (ohere) and which is extension (here) - if ( left_not_right ) - { - here = left; ohere = right; - } - else - { - here = right; ohere = left; - } - ohere.rx()++; - } - - if ( _lineSelectionMode ) - { - // Extend to complete line - bool above_not_below = ( here.y() < _iPntSelCorr.y() ); - - QPoint above = above_not_below ? here : _iPntSelCorr; - QPoint below = above_not_below ? _iPntSelCorr : here; - - while (above.y()>0 && (_lineProperties[above.y()-1] & LINE_WRAPPED) ) - above.ry()--; - while (below.y()<_usedLines-1 && (_lineProperties[below.y()] & LINE_WRAPPED) ) - below.ry()++; - - above.setX(0); - below.setX(_usedColumns-1); - - // Pick which is start (ohere) and which is extension (here) - if ( above_not_below ) - { - here = above; ohere = below; - } - else - { - here = below; ohere = above; - } - - QPoint newSelBegin = QPoint( ohere.x(), ohere.y() ); - swapping = !(_tripleSelBegin==newSelBegin); - _tripleSelBegin = newSelBegin; - - ohere.rx()++; - } - - int offset = 0; - if ( !_wordSelectionMode && !_lineSelectionMode ) - { - int i; - QChar selClass; - - bool left_not_right = ( here.y() < _iPntSelCorr.y() || - ( here.y() == _iPntSelCorr.y() && here.x() < _iPntSelCorr.x() ) ); - bool old_left_not_right = ( _pntSelCorr.y() < _iPntSelCorr.y() || - ( _pntSelCorr.y() == _iPntSelCorr.y() && _pntSelCorr.x() < _iPntSelCorr.x() ) ); - swapping = left_not_right != old_left_not_right; - - // Find left (left_not_right ? from here : from start) - QPoint left = left_not_right ? here : _iPntSelCorr; - - // Find left (left_not_right ? from start : from here) - QPoint right = left_not_right ? _iPntSelCorr : here; - if ( right.x() > 0 && !_columnSelectionMode ) - { - i = loc(right.x(),right.y()); - if (i>=0 && i<=_imageSize) { - selClass = charClass(_image[i-1].character); - /* if (selClass == ' ') - { - while ( right.x() < _usedColumns-1 && charClass(_image[i+1].character) == selClass && (right.y()<_usedLines-1) && - !(_lineProperties[right.y()] & LINE_WRAPPED)) - { i++; right.rx()++; } - if (right.x() < _usedColumns-1) - right = left_not_right ? _iPntSelCorr : here; - else - right.rx()++; // will be balanced later because of offset=-1; - }*/ - } - } - - // Pick which is start (ohere) and which is extension (here) - if ( left_not_right ) - { - here = left; ohere = right; offset = 0; - } - else - { - here = right; ohere = left; offset = -1; - } - } - - if ((here == _pntSelCorr) && (scroll == _scrollBar->value())) return; // not moved - - if (here == ohere) return; // It's not left, it's not right. - - if ( _actSel < 2 || swapping ) - { - if ( _columnSelectionMode && !_lineSelectionMode && !_wordSelectionMode ) - { - _screenWindow->setSelectionStart( ohere.x() , ohere.y() , true ); - } - else - { - _screenWindow->setSelectionStart( ohere.x()-1-offset , ohere.y() , false ); - } - - } - - _actSel = 2; // within selection - _pntSel = here; - _pntSel.ry() += _scrollBar->value(); - - if ( _columnSelectionMode && !_lineSelectionMode && !_wordSelectionMode ) - { - _screenWindow->setSelectionEnd( here.x() , here.y() ); - } - else - { - _screenWindow->setSelectionEnd( here.x()+offset , here.y() ); - } - -} - -void TerminalDisplay::mouseReleaseEvent(QMouseEvent* ev) -{ - if ( !_screenWindow ) - return; - - int charLine; - int charColumn; - getCharacterPosition(ev->pos(),charLine,charColumn); - - if ( ev->button() == Qt::LeftButton) - { - emit isBusySelecting(false); - if(dragInfo.state == diPending) - { - // We had a drag event pending but never confirmed. Kill selection - _screenWindow->clearSelection(); - //emit clearSelectionSignal(); - } - else - { - if ( _actSel > 1 ) - { - setSelection( _screenWindow->selectedText(_preserveLineBreaks) ); - } - - _actSel = 0; - - //FIXME: emits a release event even if the mouse is - // outside the range. The procedure used in `mouseMoveEvent' - // applies here, too. - - if (!_mouseMarks && !(ev->modifiers() & Qt::ShiftModifier)) - emit mouseSignal( 3, // release - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , 0); - } - dragInfo.state = diNone; - } - - - if ( !_mouseMarks && - ((ev->button() == Qt::RightButton && !(ev->modifiers() & Qt::ShiftModifier)) - || ev->button() == Qt::MidButton) ) - { - emit mouseSignal( 3, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , - 0); - } -} - -void TerminalDisplay::getCharacterPosition(const QPoint& widgetPoint,int& line,int& column) const -{ - column = (widgetPoint.x() + _fontWidth/2 -contentsRect().left()-_leftMargin) / _fontWidth; - line = (widgetPoint.y()-contentsRect().top()-_topMargin) / _fontHeight; - - if ( line < 0 ) - line = 0; - if ( column < 0 ) - column = 0; - - if ( line >= _usedLines ) - line = _usedLines-1; - - // the column value returned can be equal to _usedColumns, which - // is the position just after the last character displayed in a line. - // - // this is required so that the user can select characters in the right-most - // column (or left-most for right-to-left input) - if ( column > _usedColumns ) - column = _usedColumns; -} - -void TerminalDisplay::updateLineProperties() -{ - if ( !_screenWindow ) - return; - - _lineProperties = _screenWindow->getLineProperties(); -} - -void TerminalDisplay::mouseDoubleClickEvent(QMouseEvent* ev) -{ - if ( ev->button() != Qt::LeftButton) return; - if ( !_screenWindow ) return; - - int charLine = 0; - int charColumn = 0; - - getCharacterPosition(ev->pos(),charLine,charColumn); - - QPoint pos(charColumn,charLine); - - // pass on double click as two clicks. - if (!_mouseMarks && !(ev->modifiers() & Qt::ShiftModifier)) - { - // Send just _ONE_ click event, since the first click of the double click - // was already sent by the click handler - emit mouseSignal( 0, - pos.x()+1, - pos.y()+1 +_scrollBar->value() -_scrollBar->maximum(), - 0 ); // left button - return; - } - - _screenWindow->clearSelection(); - QPoint bgnSel = pos; - QPoint endSel = pos; - int i = loc(bgnSel.x(),bgnSel.y()); - _iPntSel = bgnSel; - _iPntSel.ry() += _scrollBar->value(); - - _wordSelectionMode = true; - - // find word boundaries... - QChar selClass = charClass(_image[i].character); - { - // find the start of the word - int x = bgnSel.x(); - while ( ((x>0) || (bgnSel.y()>0 && (_lineProperties[bgnSel.y()-1] & LINE_WRAPPED) )) - && charClass(_image[i-1].character) == selClass ) - { - i--; - if (x>0) - x--; - else - { - x=_usedColumns-1; - bgnSel.ry()--; - } - } - - bgnSel.setX(x); - _screenWindow->setSelectionStart( bgnSel.x() , bgnSel.y() , false ); - - // find the end of the word - i = loc( endSel.x(), endSel.y() ); - x = endSel.x(); - while( ((x<_usedColumns-1) || (endSel.y()<_usedLines-1 && (_lineProperties[endSel.y()] & LINE_WRAPPED) )) - && charClass(_image[i+1].character) == selClass ) - { - i++; - if (x<_usedColumns-1) - x++; - else - { - x=0; - endSel.ry()++; - } - } - - endSel.setX(x); - - // In word selection mode don't select @ (64) if at end of word. - if ( ( QChar( _image[i].character ) == '@' ) && ( ( endSel.x() - bgnSel.x() ) > 0 ) ) - endSel.setX( x - 1 ); - - - _actSel = 2; // within selection - - _screenWindow->setSelectionEnd( endSel.x() , endSel.y() ); - - setSelection( _screenWindow->selectedText(_preserveLineBreaks) ); - } - - _possibleTripleClick=true; - - QTimer::singleShot(QApplication::doubleClickInterval(),this, - SLOT(tripleClickTimeout())); -} - -void TerminalDisplay::wheelEvent( QWheelEvent* ev ) -{ - if (ev->orientation() != Qt::Vertical) - return; - - // if the terminal program is not interested mouse events - // then send the event to the scrollbar if the slider has room to move - // or otherwise send simulated up / down key presses to the terminal program - // for the benefit of programs such as 'less' - if ( _mouseMarks ) - { - bool canScroll = _scrollBar->maximum() > 0; - if (canScroll) - _scrollBar->event(ev); - else - { - // assume that each Up / Down key event will cause the terminal application - // to scroll by one line. - // - // to get a reasonable scrolling speed, scroll by one line for every 5 degrees - // of mouse wheel rotation. Mouse wheels typically move in steps of 15 degrees, - // giving a scroll of 3 lines - int key = ev->delta() > 0 ? Qt::Key_Up : Qt::Key_Down; - - // QWheelEvent::delta() gives rotation in eighths of a degree - int wheelDegrees = ev->delta() / 8; - int linesToScroll = abs(wheelDegrees) / 5; - - QKeyEvent keyScrollEvent(QEvent::KeyPress,key,Qt::NoModifier); - - for (int i=0;i<linesToScroll;i++) - emit keyPressedSignal(&keyScrollEvent); - } - } - else - { - // terminal program wants notification of mouse activity - - int charLine; - int charColumn; - getCharacterPosition( ev->pos() , charLine , charColumn ); - - emit mouseSignal( ev->delta() > 0 ? 4 : 5, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , - 0); - } -} - -void TerminalDisplay::tripleClickTimeout() -{ - _possibleTripleClick=false; -} - -void TerminalDisplay::mouseTripleClickEvent(QMouseEvent* ev) -{ - if ( !_screenWindow ) return; - - int charLine; - int charColumn; - getCharacterPosition(ev->pos(),charLine,charColumn); - _iPntSel = QPoint(charColumn,charLine); - - _screenWindow->clearSelection(); - - _lineSelectionMode = true; - _wordSelectionMode = false; - - _actSel = 2; // within selection - emit isBusySelecting(true); // Keep it steady... - - while (_iPntSel.y()>0 && (_lineProperties[_iPntSel.y()-1] & LINE_WRAPPED) ) - _iPntSel.ry()--; - - if (_tripleClickMode == SelectForwardsFromCursor) { - // find word boundary start - int i = loc(_iPntSel.x(),_iPntSel.y()); - QChar selClass = charClass(_image[i].character); - int x = _iPntSel.x(); - - while ( ((x>0) || - (_iPntSel.y()>0 && (_lineProperties[_iPntSel.y()-1] & LINE_WRAPPED) ) - ) - && charClass(_image[i-1].character) == selClass ) - { - i--; - if (x>0) - x--; - else - { - x=_columns-1; - _iPntSel.ry()--; - } - } - - _screenWindow->setSelectionStart( x , _iPntSel.y() , false ); - _tripleSelBegin = QPoint( x, _iPntSel.y() ); - } - else if (_tripleClickMode == SelectWholeLine) { - _screenWindow->setSelectionStart( 0 , _iPntSel.y() , false ); - _tripleSelBegin = QPoint( 0, _iPntSel.y() ); - } - - while (_iPntSel.y()<_lines-1 && (_lineProperties[_iPntSel.y()] & LINE_WRAPPED) ) - _iPntSel.ry()++; - - _screenWindow->setSelectionEnd( _columns - 1 , _iPntSel.y() ); - - setSelection(_screenWindow->selectedText(_preserveLineBreaks)); - - _iPntSel.ry() += _scrollBar->value(); -} - - -bool TerminalDisplay::focusNextPrevChild( bool next ) -{ - if (next) - return false; // This disables changing the active part in konqueror - // when pressing Tab - return QWidget::focusNextPrevChild( next ); -} - - -QChar TerminalDisplay::charClass(QChar qch) const -{ - if ( qch.isSpace() ) return ' '; - - if ( qch.isLetterOrNumber() || _wordCharacters.contains(qch, Qt::CaseInsensitive ) ) - return 'a'; - - return qch; -} - -void TerminalDisplay::setWordCharacters(const QString& wc) -{ - _wordCharacters = wc; -} - -void TerminalDisplay::setUsesMouse(bool on) -{ - _mouseMarks = on; - setCursor( _mouseMarks ? Qt::IBeamCursor : Qt::ArrowCursor ); -} -bool TerminalDisplay::usesMouse() const -{ - return _mouseMarks; -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Clipboard */ -/* */ -/* ------------------------------------------------------------------------- */ - -#undef KeyPress - -void TerminalDisplay::emitSelection(bool useXselection,bool appendReturn) -{ - if ( !_screenWindow ) - return; - - // Paste Clipboard by simulating keypress events - QString text = QApplication::clipboard()->text(useXselection ? QClipboard::Selection : - QClipboard::Clipboard); - if(appendReturn) - text.append("\r"); - if ( ! text.isEmpty() ) - { - text.replace('\n', '\r'); - QKeyEvent e(QEvent::KeyPress, 0, Qt::NoModifier, text); - emit keyPressedSignal(&e); // expose as a big fat keypress event - - _screenWindow->clearSelection(); - } -} - -void TerminalDisplay::setSelection(const QString& t) -{ - QApplication::clipboard()->setText(t, QClipboard::Selection); -} - -void TerminalDisplay::copyClipboard() -{ - if ( !_screenWindow ) - return; - - QString text = _screenWindow->selectedText(_preserveLineBreaks); - if (!text.isEmpty()) - QApplication::clipboard()->setText(text); -} - -void TerminalDisplay::pasteClipboard() -{ - emitSelection(false,false); -} - -void TerminalDisplay::pasteSelection() -{ - emitSelection(true,false); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Keyboard */ -/* */ -/* ------------------------------------------------------------------------- */ - -void TerminalDisplay::setFlowControlWarningEnabled( bool enable ) -{ - _flowControlWarningEnabled = enable; - - // if the dialog is currently visible and the flow control warning has - // been disabled then hide the dialog - if (!enable) - outputSuspended(false); -} - -void TerminalDisplay::keyPressEvent( QKeyEvent* event ) -{ - bool emitKeyPressSignal = true; - - if(event->modifiers() == Qt::ControlModifier) - { - switch(event->key()) { - case Qt::Key_C: - copyClipboard(); - break; - case Qt::Key_V: - pasteClipboard(); - break; - }; - } else if ( event->modifiers() == Qt::ShiftModifier ) { - bool update = true; - - if ( event->key() == Qt::Key_PageUp ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollPages , -1 ); - } - else if ( event->key() == Qt::Key_PageDown ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollPages , 1 ); - } - else if ( event->key() == Qt::Key_Up ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollLines , -1 ); - } - else if ( event->key() == Qt::Key_Down ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollLines , 1 ); - } - else - update = false; - - if ( update ) - { - _screenWindow->setTrackOutput( _screenWindow->atEndOfOutput() ); - - updateLineProperties(); - updateImage(); - - // do not send key press to terminal - emitKeyPressSignal = false; - } - } - - _actSel=0; // Key stroke implies a screen update, so TerminalDisplay won't - // know where the current selection is. - - if (_hasBlinkingCursor) - { - _blinkCursorTimer->start(QApplication::cursorFlashTime() / 2); - if (_cursorBlinking) - blinkCursorEvent(); - else - _cursorBlinking = false; - } - - if ( emitKeyPressSignal ) - emit keyPressedSignal(event); - - event->accept(); -} - -void TerminalDisplay::inputMethodEvent( QInputMethodEvent* event ) -{ - QKeyEvent keyEvent(QEvent::KeyPress,0,Qt::NoModifier,event->commitString()); - emit keyPressedSignal(&keyEvent); - - _inputMethodData.preeditString = event->preeditString(); - update(preeditRect() | _inputMethodData.previousPreeditRect); - - event->accept(); -} -QVariant TerminalDisplay::inputMethodQuery( Qt::InputMethodQuery query ) const -{ - const QPoint cursorPos = _screenWindow ? _screenWindow->cursorPosition() : QPoint(0,0); - switch ( query ) - { - case Qt::ImMicroFocus: - return imageToWidget(QRect(cursorPos.x(),cursorPos.y(),1,1)); - break; - case Qt::ImFont: - return font(); - break; - case Qt::ImCursorPosition: - // return the cursor position within the current line - return cursorPos.x(); - break; - case Qt::ImSurroundingText: - { - // return the text from the current line - QString lineText; - QTextStream stream(&lineText); - PlainTextDecoder decoder; - decoder.begin(&stream); - decoder.decodeLine(&_image[loc(0,cursorPos.y())],_usedColumns,_lineProperties[cursorPos.y()]); - decoder.end(); - return lineText; - } - break; - case Qt::ImCurrentSelection: - return QString(); - break; - default: - break; - } - - return QVariant(); -} - -bool TerminalDisplay::handleShortcutOverrideEvent(QKeyEvent* keyEvent) -{ - int modifiers = keyEvent->modifiers(); - - // When a possible shortcut combination is pressed, - // emit the overrideShortcutCheck() signal to allow the host - // to decide whether the terminal should override it or not. - if (modifiers != Qt::NoModifier) - { - int modifierCount = 0; - unsigned int currentModifier = Qt::ShiftModifier; - - while (currentModifier <= Qt::KeypadModifier) - { - if (modifiers & currentModifier) - modifierCount++; - currentModifier <<= 1; - } - if (modifierCount < 2) - { - bool override = false; - emit overrideShortcutCheck(keyEvent,override); - if (override) - { - keyEvent->accept(); - return true; - } - } - } - - // Override any of the following shortcuts because - // they are needed by the terminal - int keyCode = keyEvent->key() | modifiers; - switch ( keyCode ) - { - // list is taken from the QLineEdit::event() code - case Qt::Key_Tab: - case Qt::Key_Delete: - case Qt::Key_Home: - case Qt::Key_End: - case Qt::Key_Backspace: - case Qt::Key_Left: - case Qt::Key_Right: - keyEvent->accept(); - return true; - } - return false; -} - -bool TerminalDisplay::event(QEvent* event) -{ - bool eventHandled = false; - switch (event->type()) - { - case QEvent::ShortcutOverride: - eventHandled = handleShortcutOverrideEvent((QKeyEvent*)event); - break; - case QEvent::PaletteChange: - case QEvent::ApplicationPaletteChange: - _scrollBar->setPalette( QApplication::palette() ); - break; - default: - break; - } - return eventHandled ? true : QWidget::event(event); -} - -void TerminalDisplay::setBellMode(int mode) -{ - _bellMode=mode; -} - -void TerminalDisplay::enableBell() -{ - _allowBell = true; -} - -void TerminalDisplay::bell(const QString& message) -{ - if (_bellMode==NoBell) return; - - //limit the rate at which bells can occur - //...mainly for sound effects where rapid bells in sequence - //produce a horrible noise - if ( _allowBell ) - { - _allowBell = false; - QTimer::singleShot(500,this,SLOT(enableBell())); - - if (_bellMode==SystemBeepBell) - { - // TODO: This will need added back in at some point - //KNotification::beep(); - } - else if (_bellMode==NotifyBell) - { - // TODO: This will need added back in at some point - //KNotification::event("BellVisible", message,QPixmap(),this); - } - else if (_bellMode==VisualBell) - { - swapColorTable(); - QTimer::singleShot(200,this,SLOT(swapColorTable())); - } - } -} - -void TerminalDisplay::swapColorTable() -{ - ColorEntry color = _colorTable[1]; - _colorTable[1]=_colorTable[0]; - _colorTable[0]= color; - _colorsInverted = !_colorsInverted; - update(); -} - -void TerminalDisplay::clearImage() -{ - // We initialize _image[_imageSize] too. See makeImage() - for (int i = 0; i <= _imageSize; i++) - { - _image[i].character = ' '; - _image[i].foregroundColor = CharacterColor(COLOR_SPACE_DEFAULT, - DEFAULT_FORE_COLOR); - _image[i].backgroundColor = CharacterColor(COLOR_SPACE_DEFAULT, - DEFAULT_BACK_COLOR); - _image[i].rendition = DEFAULT_RENDITION; - } -} - -void TerminalDisplay::calcGeometry() -{ - _scrollBar->resize(_scrollBar->sizeHint().width(), contentsRect().height()); - switch(_scrollbarLocation) - { - case NoScrollBar : - _leftMargin = DEFAULT_LEFT_MARGIN; - _contentWidth = contentsRect().width() - 2 * DEFAULT_LEFT_MARGIN; - break; - case ScrollBarLeft : - _leftMargin = DEFAULT_LEFT_MARGIN + _scrollBar->width(); - _contentWidth = contentsRect().width() - 2 * DEFAULT_LEFT_MARGIN - _scrollBar->width(); - _scrollBar->move(contentsRect().topLeft()); - break; - case ScrollBarRight: - _leftMargin = DEFAULT_LEFT_MARGIN; - _contentWidth = contentsRect().width() - 2 * DEFAULT_LEFT_MARGIN - _scrollBar->width(); - _scrollBar->move(contentsRect().topRight() - QPoint(_scrollBar->width()-1,0)); - break; - } - - _topMargin = DEFAULT_TOP_MARGIN; - _contentHeight = contentsRect().height() - 2 * DEFAULT_TOP_MARGIN + /* mysterious */ 1; - - if (!_isFixedSize) - { - // ensure that display is always at least one column wide - _columns = qMax(1,_contentWidth / _fontWidth); - _usedColumns = qMin(_usedColumns,_columns); - - // ensure that display is always at least one line high - _lines = qMax(1,_contentHeight / _fontHeight); - _usedLines = qMin(_usedLines,_lines); - } -} - -void TerminalDisplay::makeImage() -{ - calcGeometry(); - - // confirm that array will be of non-zero size, since the painting code - // assumes a non-zero array length - Q_ASSERT( _lines > 0 && _columns > 0 ); - Q_ASSERT( _usedLines <= _lines && _usedColumns <= _columns ); - - _imageSize=_lines*_columns; - - // We over-commit one character so that we can be more relaxed in dealing with - // certain boundary conditions: _image[_imageSize] is a valid but unused position - _image = new Character[_imageSize+1]; - - clearImage(); -} - -// calculate the needed size, this must be synced with calcGeometry() -void TerminalDisplay::setSize(int columns, int lines) -{ - int scrollBarWidth = _scrollBar->isHidden() ? 0 : _scrollBar->sizeHint().width(); - int horizontalMargin = 2 * DEFAULT_LEFT_MARGIN; - int verticalMargin = 2 * DEFAULT_TOP_MARGIN; - - QSize newSize = QSize( horizontalMargin + scrollBarWidth + (columns * _fontWidth) , - verticalMargin + (lines * _fontHeight) ); - - if ( newSize != size() ) - { - _size = newSize; - updateGeometry(); - } -} - -void TerminalDisplay::setFixedSize(int cols, int lins) -{ - _isFixedSize = true; - - //ensure that display is at least one line by one column in size - _columns = qMax(1,cols); - _lines = qMax(1,lins); - _usedColumns = qMin(_usedColumns,_columns); - _usedLines = qMin(_usedLines,_lines); - - if (_image) - { - delete[] _image; - makeImage(); - } - setSize(cols, lins); - QWidget::setFixedSize(_size); -} - -QSize TerminalDisplay::sizeHint() const -{ - return _size; -} - - -/* --------------------------------------------------------------------- */ -/* */ -/* Drag & Drop */ -/* */ -/* --------------------------------------------------------------------- */ - -void TerminalDisplay::dragEnterEvent(QDragEnterEvent* event) -{ - if (event->mimeData()->hasFormat("text/plain")) - event->acceptProposedAction(); -} - -void TerminalDisplay::dropEvent(QDropEvent* event) -{ - //KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); - - QString dropText; - /* - if (!urls.isEmpty()) - { - for ( int i = 0 ; i < urls.count() ; i++ ) - { - KUrl url = KIO::NetAccess::mostLocalUrl( urls[i] , 0 ); - QString urlText; - - if (url.isLocalFile()) - urlText = url.path(); - else - urlText = url.url(); - - // in future it may be useful to be able to insert file names with drag-and-drop - // without quoting them (this only affects paths with spaces in) - urlText = KShell::quoteArg(urlText); - - dropText += urlText; - - if ( i != urls.count()-1 ) - dropText += ' '; - } - } - else - { - dropText = event->mimeData()->text(); - } - */ - - if(event->mimeData()->hasFormat("text/plain")) - { - emit sendStringToEmu(dropText.toLocal8Bit()); - } -} - -void TerminalDisplay::doDrag() -{ - dragInfo.state = diDragging; - dragInfo.dragObject = new QDrag(this); - QMimeData *mimeData = new QMimeData; - mimeData->setText(QApplication::clipboard()->text(QClipboard::Selection)); - dragInfo.dragObject->setMimeData(mimeData); - dragInfo.dragObject->start(Qt::CopyAction); - // Don't delete the QTextDrag object. Qt will delete it when it's done with it. -} - -void TerminalDisplay::outputSuspended(bool suspended) -{ - //create the label when this function is first called - if (!_outputSuspendedLabel) - { - //This label includes a link to an English language website - //describing the 'flow control' (Xon/Xoff) feature found in almost - //all terminal emulators. - //If there isn't a suitable article available in the target language the link - //can simply be removed. - _outputSuspendedLabel = new QLabel( QString("<qt>Output has been " - "<a href=\"http://en.wikipedia.org/wiki/Flow_control\">suspended</a>" - " by pressing Ctrl+S." - " Press <b>Ctrl+Q</b> to resume.</qt>"), - this ); - - QPalette palette(_outputSuspendedLabel->palette()); - //KColorScheme::adjustBackground(palette,KColorScheme::NeutralBackground); - _outputSuspendedLabel->setPalette(palette); - _outputSuspendedLabel->setAutoFillBackground(true); - _outputSuspendedLabel->setBackgroundRole(QPalette::Base); - _outputSuspendedLabel->setFont(QApplication::font()); - _outputSuspendedLabel->setContentsMargins(5, 5, 5, 5); - - //enable activation of "Xon/Xoff" link in label - _outputSuspendedLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse | - Qt::LinksAccessibleByKeyboard); - _outputSuspendedLabel->setOpenExternalLinks(true); - _outputSuspendedLabel->setVisible(false); - - _gridLayout->addWidget(_outputSuspendedLabel); - _gridLayout->addItem( new QSpacerItem(0,0,QSizePolicy::Expanding, - QSizePolicy::Expanding), - 1,0); - - } - - _outputSuspendedLabel->setVisible(suspended); -} - -uint TerminalDisplay::lineSpacing() const -{ - return _lineSpacing; -} - -void TerminalDisplay::setLineSpacing(uint i) -{ - _lineSpacing = i; - setVTFont(font()); // Trigger an update. -} - -AutoScrollHandler::AutoScrollHandler(QWidget* parent) -: QObject(parent) -, _timerId(0) -{ - //parent->installEventFilter(this); -} -void AutoScrollHandler::timerEvent(QTimerEvent* event) -{ - if (event->timerId() != _timerId) - return; - - QMouseEvent mouseEvent( QEvent::MouseMove, - widget()->mapFromGlobal(QCursor::pos()), - Qt::NoButton, - Qt::LeftButton, - Qt::NoModifier); - - QApplication::sendEvent(widget(),&mouseEvent); -} -bool AutoScrollHandler::eventFilter(QObject* watched,QEvent* event) -{ - Q_ASSERT( watched == parent() ); - Q_UNUSED( watched ); - - QMouseEvent* mouseEvent = (QMouseEvent*)event; - switch (event->type()) - { - case QEvent::MouseMove: - { - bool mouseInWidget = widget()->rect().contains(mouseEvent->pos()); - - if (mouseInWidget) - { - if (_timerId) - killTimer(_timerId); - _timerId = 0; - } - else - { - if (!_timerId && (mouseEvent->buttons() & Qt::LeftButton)) - _timerId = startTimer(100); - } - break; - } - case QEvent::MouseButtonRelease: - if (_timerId && (mouseEvent->buttons() & ~Qt::LeftButton)) - { - killTimer(_timerId); - _timerId = 0; - } - break; - default: - break; - }; - - return false; -}
deleted file mode 100644 --- a/gui//src/TerminalDisplay.h +++ /dev/null @@ -1,816 +0,0 @@ -/* - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 TERMINALDISPLAY_H -#define TERMINALDISPLAY_H - -// Qt -#include <QtGui/QColor> -#include <QtCore/QPointer> -#include <QtGui/QWidget> - -// Konsole -#include "Filter.h" -#include "Character.h" - -class QDrag; -class QDragEnterEvent; -class QDropEvent; -class QLabel; -class QTimer; -class QEvent; -class QGridLayout; -class QKeyEvent; -class QScrollBar; -class QShowEvent; -class QHideEvent; -class QTimerEvent; -class QWidget; - -class KMenu; - -extern unsigned short vt100_graphics[32]; - -class ScreenWindow; - -/** - * A widget which displays output from a terminal emulation and sends input keypresses and mouse activity - * to the terminal. - * - * When the terminal emulation receives new output from the program running in the terminal, - * it will update the display by calling updateImage(). - * - * TODO More documentation - */ -class TerminalDisplay : public QWidget -{ - Q_OBJECT - -public: - /** Constructs a new terminal display widget with the specified parent. */ - TerminalDisplay(QWidget *parent=0); - virtual ~TerminalDisplay(); - - /** Returns the terminal color palette used by the display. */ - const ColorEntry* colorTable() const; - /** Sets the terminal color palette used by the display. */ - void setColorTable(const ColorEntry table[]); - /** - * Sets the seed used to generate random colors for the display - * (in color schemes that support them). - */ - void setRandomSeed(uint seed); - /** - * Returns the seed used to generate random colors for the display - * (in color schemes that support them). - */ - uint randomSeed() const; - - /** Sets the opacity of the terminal display. */ - void setOpacity(qreal opacity); - - /** - * This enum describes the location where the scroll bar is positioned in the display widget. - */ - enum ScrollBarPosition - { - /** Do not show the scroll bar. */ - NoScrollBar=0, - /** Show the scroll bar on the left side of the display. */ - ScrollBarLeft=1, - /** Show the scroll bar on the right side of the display. */ - ScrollBarRight=2 - }; - /** - * Specifies whether the terminal display has a vertical scroll bar, and if so whether it - * is shown on the left or right side of the display. - */ - void setScrollBarPosition(ScrollBarPosition position); - - /** - * Sets the current position and range of the display's scroll bar. - * - * @param cursor The position of the scroll bar's thumb. - * @param lines The maximum value of the scroll bar. - */ - void setScroll(int cursor, int lines); - - /** - * Returns the display's filter chain. When the image for the display is updated, - * the text is passed through each filter in the chain. Each filter can define - * hotspots which correspond to certain strings (such as URLs or particular words). - * Depending on the type of the hotspots created by the filter ( returned by Filter::Hotspot::type() ) - * the view will draw visual cues such as underlines on mouse-over for links or translucent - * rectangles for markers. - * - * To add a new filter to the view, call: - * viewWidget->filterChain()->addFilter( filterObject ); - */ - FilterChain* filterChain() const; - - /** - * Updates the filters in the display's filter chain. This will cause - * the hotspots to be updated to match the current image. - * - * WARNING: This function can be expensive depending on the - * image size and number of filters in the filterChain() - * - * TODO - This API does not really allow efficient usage. Revise it so - * that the processing can be done in a better way. - * - * eg: - * - Area of interest may be known ( eg. mouse cursor hovering - * over an area ) - */ - void processFilters(); - - /** - * Returns a list of menu actions created by the filters for the content - * at the given @p position. - */ - QList<QAction*> filterActions(const QPoint& position); - - /** Returns true if the cursor is set to blink or false otherwise. */ - bool blinkingCursor() { return _hasBlinkingCursor; } - /** Specifies whether or not the cursor blinks. */ - void setBlinkingCursor(bool blink); - - /** Specifies whether or not text can blink. */ - void setBlinkingTextEnabled(bool blink); - - void setCtrlDrag(bool enable) { _ctrlDrag=enable; } - bool ctrlDrag() { return _ctrlDrag; } - - /** - * This enum describes the methods for selecting text when - * the user triple-clicks within the display. - */ - enum TripleClickMode - { - /** Select the whole line underneath the cursor. */ - SelectWholeLine, - /** Select from the current cursor position to the end of the line. */ - SelectForwardsFromCursor - }; - /** Sets how the text is selected when the user triple clicks within the display. */ - void setTripleClickMode(TripleClickMode mode) { _tripleClickMode = mode; } - /** See setTripleClickSelectionMode() */ - TripleClickMode tripleClickMode() { return _tripleClickMode; } - - void setLineSpacing(uint); - uint lineSpacing() const; - - void emitSelection(bool useXselection,bool appendReturn); - - /** - * This enum describes the available shapes for the keyboard cursor. - * See setKeyboardCursorShape() - */ - enum KeyboardCursorShape - { - /** A rectangular block which covers the entire area of the cursor character. */ - BlockCursor, - /** - * A single flat line which occupies the space at the bottom of the cursor - * character's area. - */ - UnderlineCursor, - /** - * An cursor shaped like the capital letter 'I', similar to the IBeam - * cursor used in Qt/KDE text editors. - */ - IBeamCursor - }; - /** - * Sets the shape of the keyboard cursor. This is the cursor drawn - * at the position in the terminal where keyboard input will appear. - * - * In addition the terminal display widget also has a cursor for - * the mouse pointer, which can be set using the QWidget::setCursor() - * method. - * - * Defaults to BlockCursor - */ - void setKeyboardCursorShape(KeyboardCursorShape shape); - /** - * Returns the shape of the keyboard cursor. See setKeyboardCursorShape() - */ - KeyboardCursorShape keyboardCursorShape() const; - - /** - * Sets the color used to draw the keyboard cursor. - * - * The keyboard cursor defaults to using the foreground color of the character - * underneath it. - * - * @param useForegroundColor If true, the cursor color will change to match - * the foreground color of the character underneath it as it is moved, in this - * case, the @p color parameter is ignored and the color of the character - * under the cursor is inverted to ensure that it is still readable. - * @param color The color to use to draw the cursor. This is only taken into - * account if @p useForegroundColor is false. - */ - void setKeyboardCursorColor(bool useForegroundColor , const QColor& color); - - /** - * Returns the color of the keyboard cursor, or an invalid color if the keyboard - * cursor color is set to change according to the foreground color of the character - * underneath it. - */ - QColor keyboardCursorColor() const; - - /** - * Returns the number of lines of text which can be displayed in the widget. - * - * This will depend upon the height of the widget and the current font. - * See fontHeight() - */ - int lines() { return _lines; } - /** - * Returns the number of characters of text which can be displayed on - * each line in the widget. - * - * This will depend upon the width of the widget and the current font. - * See fontWidth() - */ - int columns() { return _columns; } - - /** - * Returns the height of the characters in the font used to draw the text in the display. - */ - int fontHeight() { return _fontHeight; } - /** - * Returns the width of the characters in the display. - * This assumes the use of a fixed-width font. - */ - int fontWidth() { return _fontWidth; } - - void setSize(int cols, int lins); - void setFixedSize(int cols, int lins); - - // reimplemented - QSize sizeHint() const; - - /** - * Sets which characters, in addition to letters and numbers, - * are regarded as being part of a word for the purposes - * of selecting words in the display by double clicking on them. - * - * The word boundaries occur at the first and last characters which - * are either a letter, number, or a character in @p wc - * - * @param wc An array of characters which are to be considered parts - * of a word ( in addition to letters and numbers ). - */ - void setWordCharacters(const QString& wc); - /** - * Returns the characters which are considered part of a word for the - * purpose of selecting words in the display with the mouse. - * - * @see setWordCharacters() - */ - QString wordCharacters() { return _wordCharacters; } - - /** - * Sets the type of effect used to alert the user when a 'bell' occurs in the - * terminal session. - * - * The terminal session can trigger the bell effect by calling bell() with - * the alert message. - */ - void setBellMode(int mode); - /** - * Returns the type of effect used to alert the user when a 'bell' occurs in - * the terminal session. - * - * See setBellMode() - */ - int bellMode() { return _bellMode; } - - /** - * This enum describes the different types of sounds and visual effects which - * can be used to alert the user when a 'bell' occurs in the terminal - * session. - */ - enum BellMode - { - /** A system beep. */ - SystemBeepBell=0, - /** - * KDE notification. This may play a sound, show a passive popup - * or perform some other action depending on the user's settings. - */ - NotifyBell=1, - /** A silent, visual bell (eg. inverting the display's colors briefly) */ - VisualBell=2, - /** No bell effects */ - NoBell=3 - }; - - void setSelection(const QString &t); - - /** - * Reimplemented. Has no effect. Use setVTFont() to change the font - * used to draw characters in the display. - */ - virtual void setFont(const QFont &); - - /** Returns the font used to draw characters in the display */ - QFont getVTFont() { return font(); } - - /** - * Sets the font used to draw the display. Has no effect if @p font - * is larger than the size of the display itself. - */ - void setVTFont(const QFont& font); - - /** - * Specified whether anti-aliasing of text in the terminal display - * is enabled or not. Defaults to enabled. - */ - static void setAntialias( bool antialias ) { _antialiasText = antialias; } - /** - * Returns true if anti-aliasing of text in the terminal is enabled. - */ - static bool antialias() { return _antialiasText; } - - /** - * Specifies whether characters with intense colors should be rendered - * as bold. Defaults to true. - */ - void setBoldIntense(bool value) { _boldIntense = value; } - /** - * Returns true if characters with intense colors are rendered in bold. - */ - bool getBoldIntense() { return _boldIntense; } - - /** - * Sets whether or not the current height and width of the - * terminal in lines and columns is displayed whilst the widget - * is being resized. - */ - void setTerminalSizeHint(bool on) { _terminalSizeHint=on; } - /** - * Returns whether or not the current height and width of - * the terminal in lines and columns is displayed whilst the widget - * is being resized. - */ - bool terminalSizeHint() { return _terminalSizeHint; } - /** - * Sets whether the terminal size display is shown briefly - * after the widget is first shown. - * - * See setTerminalSizeHint() , isTerminalSizeHint() - */ - void setTerminalSizeStartup(bool on) { _terminalSizeStartup=on; } - - /** - * Sets the status of the BiDi rendering inside the terminal display. - * Defaults to disabled. - */ - void setBidiEnabled(bool set) { _bidiEnabled=set; } - /** - * Returns the status of the BiDi rendering in this widget. - */ - bool isBidiEnabled() { return _bidiEnabled; } - - /** - * Sets the terminal screen section which is displayed in this widget. - * When updateImage() is called, the display fetches the latest character image from the - * the associated terminal screen window. - * - * In terms of the model-view paradigm, the ScreenWindow is the model which is rendered - * by the TerminalDisplay. - */ - void setScreenWindow( ScreenWindow* window ); - /** Returns the terminal screen section which is displayed in this widget. See setScreenWindow() */ - ScreenWindow* screenWindow() const; - - static bool HAVE_TRANSPARENCY; - -public slots: - - /** - * Causes the terminal display to fetch the latest character image from the associated - * terminal screen ( see setScreenWindow() ) and redraw the display. - */ - void updateImage(); - /** - * Causes the terminal display to fetch the latest line status flags from the - * associated terminal screen ( see setScreenWindow() ). - */ - void updateLineProperties(); - - /** Copies the selected text to the clipboard. */ - void copyClipboard(); - /** - * Pastes the content of the clipboard into the - * display. - */ - void pasteClipboard(); - /** - * Pastes the content of the selection into the - * display. - */ - void pasteSelection(); - - /** - * Changes whether the flow control warning box should be shown when the flow control - * stop key (Ctrl+S) are pressed. - */ - void setFlowControlWarningEnabled(bool enabled); - /** - * Returns true if the flow control warning box is enabled. - * See outputSuspended() and setFlowControlWarningEnabled() - */ - bool flowControlWarningEnabled() const - { return _flowControlWarningEnabled; } - - /** - * Causes the widget to display or hide a message informing the user that terminal - * output has been suspended (by using the flow control key combination Ctrl+S) - * - * @param suspended True if terminal output has been suspended and the warning message should - * be shown or false to indicate that terminal output has been resumed and that - * the warning message should disappear. - */ - void outputSuspended(bool suspended); - - /** - * Sets whether the program whoose output is being displayed in the view - * is interested in mouse events. - * - * If this is set to true, mouse signals will be emitted by the view when the user clicks, drags - * or otherwise moves the mouse inside the view. - * The user interaction needed to create selections will also change, and the user will be required - * to hold down the shift key to create a selection or perform other mouse activities inside the - * view area - since the program running in the terminal is being allowed to handle normal mouse - * events itself. - * - * @param usesMouse Set to true if the program running in the terminal is interested in mouse events - * or false otherwise. - */ - void setUsesMouse(bool usesMouse); - - /** See setUsesMouse() */ - bool usesMouse() const; - - /** - * Shows a notification that a bell event has occurred in the terminal. - * TODO: More documentation here - */ - void bell(const QString& message); - - /** - * Sets the background of the display to the specified color. - * @see setColorTable(), setForegroundColor() - */ - void setBackgroundColor(const QColor& color); - - /** - * Sets the text of the display to the specified color. - * @see setColorTable(), setBackgroundColor() - */ - void setForegroundColor(const QColor& color); - -signals: - - /** - * Emitted when the user presses a key whilst the terminal widget has focus. - */ - void keyPressedSignal(QKeyEvent *e); - - /** - * A mouse event occurred. - * @param button The mouse button (0 for left button, 1 for middle button, 2 for right button, 3 for release) - * @param column The character column where the event occurred - * @param line The character row where the event occurred - * @param eventType The type of event. 0 for a mouse press / release or 1 for mouse motion - */ - void mouseSignal(int button, int column, int line, int eventType); - void changedFontMetricSignal(int height, int width); - void changedContentSizeSignal(int height, int width); - - /** - * Emitted when the user right clicks on the display, or right-clicks with the Shift - * key held down if usesMouse() is true. - * - * This can be used to display a context menu. - */ - void configureRequest(const QPoint& position); - - /** - * When a shortcut which is also a valid terminal key sequence is pressed while - * the terminal widget has focus, this signal is emitted to allow the host to decide - * whether the shortcut should be overridden. - * When the shortcut is overridden, the key sequence will be sent to the terminal emulation instead - * and the action associated with the shortcut will not be triggered. - * - * @p override is set to false by default and the shortcut will be triggered as normal. - */ - void overrideShortcutCheck(QKeyEvent* keyEvent,bool& override); - - void isBusySelecting(bool); - void sendStringToEmu(const char*); - -protected: - virtual bool event( QEvent * ); - - virtual void paintEvent( QPaintEvent * ); - - virtual void showEvent(QShowEvent*); - virtual void hideEvent(QHideEvent*); - virtual void resizeEvent(QResizeEvent*); - - virtual void fontChange(const QFont &font); - virtual void focusInEvent(QFocusEvent* event); - virtual void focusOutEvent(QFocusEvent* event); - virtual void keyPressEvent(QKeyEvent* event); - virtual void mouseDoubleClickEvent(QMouseEvent* ev); - virtual void mousePressEvent( QMouseEvent* ); - virtual void mouseReleaseEvent( QMouseEvent* ); - virtual void mouseMoveEvent( QMouseEvent* ); - virtual void extendSelection( const QPoint& pos ); - virtual void wheelEvent( QWheelEvent* ); - - virtual bool focusNextPrevChild( bool next ); - - // drag and drop - virtual void dragEnterEvent(QDragEnterEvent* event); - virtual void dropEvent(QDropEvent* event); - void doDrag(); - enum DragState { diNone, diPending, diDragging }; - - struct _dragInfo { - DragState state; - QPoint start; - QDrag *dragObject; - } dragInfo; - - // classifies the 'ch' into one of three categories - // and returns a character to indicate which category it is in - // - // - A space (returns ' ') - // - Part of a word (returns 'a') - // - Other characters (returns the input character) - QChar charClass(QChar ch) const; - - void clearImage(); - - void mouseTripleClickEvent(QMouseEvent* ev); - - // reimplemented - virtual void inputMethodEvent ( QInputMethodEvent* event ); - virtual QVariant inputMethodQuery( Qt::InputMethodQuery query ) const; - -protected slots: - - void scrollBarPositionChanged(int value); - void blinkEvent(); - void blinkCursorEvent(); - - //Renables bell noises and visuals. Used to disable further bells for a short period of time - //after emitting the first in a sequence of bell events. - void enableBell(); - -private slots: - - void swapColorTable(); - void tripleClickTimeout(); // resets possibleTripleClick - -private: - - // -- Drawing helpers -- - - // divides the part of the display specified by 'rect' into - // fragments according to their colors and styles and calls - // drawTextFragment() to draw the fragments - void drawContents(QPainter &paint, const QRect &rect); - // draws a section of text, all the text in this section - // has a common color and style - void drawTextFragment(QPainter& painter, const QRect& rect, - const QString& text, const Character* style); - // draws the background for a text fragment - // if useOpacitySetting is true then the color's alpha value will be set to - // the display's transparency (set with setOpacity()), otherwise the background - // will be drawn fully opaque - void drawBackground(QPainter& painter, const QRect& rect, const QColor& color, - bool useOpacitySetting); - // draws the cursor character - void drawCursor(QPainter& painter, const QRect& rect , const QColor& foregroundColor, - const QColor& backgroundColor , bool& invertColors); - // draws the characters or line graphics in a text fragment - void drawCharacters(QPainter& painter, const QRect& rect, const QString& text, - const Character* style, bool invertCharacterColor); - // draws a string of line graphics - void drawLineCharString(QPainter& painter, int x, int y, - const QString& str, const Character* attributes); - - // draws the preedit string for input methods - void drawInputMethodPreeditString(QPainter& painter , const QRect& rect); - - // -- - - // maps an area in the character image to an area on the widget - QRect imageToWidget(const QRect& imageArea) const; - - // maps a point on the widget to the position ( ie. line and column ) - // of the character at that point. - void getCharacterPosition(const QPoint& widgetPoint,int& line,int& column) const; - - // the area where the preedit string for input methods will be draw - QRect preeditRect() const; - - // shows a notification window in the middle of the widget indicating the terminal's - // current size in columns and lines - void showResizeNotification(); - - // scrolls the image by a number of lines. - // 'lines' may be positive ( to scroll the image down ) - // or negative ( to scroll the image up ) - // 'region' is the part of the image to scroll - currently only - // the top, bottom and height of 'region' are taken into account, - // the left and right are ignored. - void scrollImage(int lines , const QRect& region); - - void calcGeometry(); - void propagateSize(); - void updateImageSize(); - void makeImage(); - - void paintFilters(QPainter& painter); - - // returns a region covering all of the areas of the widget which contain - // a hotspot - QRegion hotSpotRegion() const; - - // returns the position of the cursor in columns and lines - QPoint cursorPosition() const; - - // redraws the cursor - void updateCursor(); - - bool handleShortcutOverrideEvent(QKeyEvent* event); - - // the window onto the terminal screen which this display - // is currently showing. - QPointer<ScreenWindow> _screenWindow; - - bool _allowBell; - - QGridLayout* _gridLayout; - - bool _fixedFont; // has fixed pitch - int _fontHeight; // height - int _fontWidth; // width - int _fontAscent; // ascend - bool _boldIntense; // Whether intense colors should be rendered with bold font - - int _leftMargin; // offset - int _topMargin; // offset - - int _lines; // the number of lines that can be displayed in the widget - int _columns; // the number of columns that can be displayed in the widget - - int _usedLines; // the number of lines that are actually being used, this will be less - // than 'lines' if the character image provided with setImage() is smaller - // than the maximum image size which can be displayed - - int _usedColumns; // the number of columns that are actually being used, this will be less - // than 'columns' if the character image provided with setImage() is smaller - // than the maximum image size which can be displayed - - int _contentHeight; - int _contentWidth; - Character* _image; // [lines][columns] - // only the area [usedLines][usedColumns] in the image contains valid data - - int _imageSize; - QVector<LineProperty> _lineProperties; - - ColorEntry _colorTable[TABLE_COLORS]; - uint _randomSeed; - - bool _resizing; - bool _terminalSizeHint; - bool _terminalSizeStartup; - bool _bidiEnabled; - bool _mouseMarks; - - QPoint _iPntSel; // initial selection point - QPoint _pntSel; // current selection point - QPoint _tripleSelBegin; // help avoid flicker - int _actSel; // selection state - bool _wordSelectionMode; - bool _lineSelectionMode; - bool _preserveLineBreaks; - bool _columnSelectionMode; - - QClipboard* _clipboard; - QScrollBar* _scrollBar; - ScrollBarPosition _scrollbarLocation; - QString _wordCharacters; - int _bellMode; - - bool _blinking; // hide text in paintEvent - bool _hasBlinker; // has characters to blink - bool _cursorBlinking; // hide cursor in paintEvent - bool _hasBlinkingCursor; // has blinking cursor enabled - bool _allowBlinkingText; // allow text to blink - bool _ctrlDrag; // require Ctrl key for drag - TripleClickMode _tripleClickMode; - bool _isFixedSize; //Columns / lines are locked. - QTimer* _blinkTimer; // active when hasBlinker - QTimer* _blinkCursorTimer; // active when hasBlinkingCursor - - KMenu* _drop; - QString _dropText; - int _dndFileCount; - - bool _possibleTripleClick; // is set in mouseDoubleClickEvent and deleted - // after QApplication::doubleClickInterval() delay - - - QLabel* _resizeWidget; - QTimer* _resizeTimer; - - bool _flowControlWarningEnabled; - - //widgets related to the warning message that appears when the user presses Ctrl+S to suspend - //terminal output - informing them what has happened and how to resume output - QLabel* _outputSuspendedLabel; - - uint _lineSpacing; - - bool _colorsInverted; // true during visual bell - - QSize _size; - - QRgb _blendColor; - - // list of filters currently applied to the display. used for links and - // search highlight - TerminalImageFilterChain* _filterChain; - QRegion _mouseOverHotspotArea; - - KeyboardCursorShape _cursorShape; - - // custom cursor color. if this is invalid then the foreground - // color of the character under the cursor is used - QColor _cursorColor; - - - struct InputMethodData - { - QString preeditString; - QRect previousPreeditRect; - }; - InputMethodData _inputMethodData; - - static bool _antialiasText; // do we antialias or not - - //the delay in milliseconds between redrawing blinking text - static const int TEXT_BLINK_DELAY = 500; - static const int DEFAULT_LEFT_MARGIN = 1; - static const int DEFAULT_TOP_MARGIN = 1; - -public: - static void setTransparencyEnabled(bool enable) - { - HAVE_TRANSPARENCY = enable; - } -}; - -class AutoScrollHandler : public QObject -{ -Q_OBJECT - -public: - AutoScrollHandler(QWidget* parent); -protected: - virtual void timerEvent(QTimerEvent* event); - virtual bool eventFilter(QObject* watched,QEvent* event); -private: - QWidget* widget() const { return static_cast<QWidget*>(parent()); } - int _timerId; -}; - - -#endif // TERMINALDISPLAY_H
deleted file mode 100644 --- a/gui//src/VariablesDockWidget.cpp +++ /dev/null @@ -1,168 +0,0 @@ -#include "VariablesDockWidget.h" -#include <QHBoxLayout> -#include <QVBoxLayout> -#include <QPushButton> - -VariablesDockWidget::VariablesDockWidget(QWidget *parent) - : QDockWidget(parent) { - setObjectName("VariablesDockWidget"); - construct(); -} - -void VariablesDockWidget::construct() { - m_updateSemaphore = new QSemaphore(1); - QStringList headerLabels; - headerLabels << tr("Name") << tr("Type") << tr("Value"); - m_variablesTreeWidget = new QTreeWidget(this); - m_variablesTreeWidget->setHeaderHidden(false); - m_variablesTreeWidget->setHeaderLabels(headerLabels); - QVBoxLayout *layout = new QVBoxLayout(); - - setWindowTitle(tr("Workspace")); - setWidget(new QWidget()); - - layout->addWidget(m_variablesTreeWidget); - QWidget *buttonBar = new QWidget(this); - layout->addWidget(buttonBar); - - QHBoxLayout *buttonBarLayout = new QHBoxLayout(); - QPushButton *saveWorkspaceButton = new QPushButton(tr("Save"), buttonBar); - QPushButton *loadWorkspaceButton = new QPushButton(tr("Load"), buttonBar); - QPushButton *clearWorkspaceButton = new QPushButton(tr("Clear"), buttonBar); - buttonBarLayout->addWidget(saveWorkspaceButton); - buttonBarLayout->addWidget(loadWorkspaceButton); - buttonBarLayout->addWidget(clearWorkspaceButton); - buttonBarLayout->setMargin(2); - buttonBar->setLayout(buttonBarLayout); - - layout->setMargin(2); - widget()->setLayout(layout); - - connect(saveWorkspaceButton, SIGNAL(clicked()), this, SLOT(emitSaveWorkspace())); - connect(loadWorkspaceButton, SIGNAL(clicked()), this, SLOT(emitLoadWorkspace())); - connect(clearWorkspaceButton, SIGNAL(clicked()), this, SLOT(emitClearWorkspace())); - - QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(); - treeWidgetItem->setData(0, 0, QString(tr("Local"))); - m_variablesTreeWidget->insertTopLevelItem(0, treeWidgetItem); - - treeWidgetItem = new QTreeWidgetItem(); - treeWidgetItem->setData(0, 0, QString(tr("Global"))); - m_variablesTreeWidget->insertTopLevelItem(1, treeWidgetItem); - - treeWidgetItem = new QTreeWidgetItem(); - treeWidgetItem->setData(0, 0, QString(tr("Persistent"))); - m_variablesTreeWidget->insertTopLevelItem(2, treeWidgetItem); - - treeWidgetItem = new QTreeWidgetItem(); - treeWidgetItem->setData(0, 0, QString(tr("Hidden"))); - m_variablesTreeWidget->insertTopLevelItem(3, treeWidgetItem); - - m_variablesTreeWidget->expandAll(); - m_variablesTreeWidget->setAlternatingRowColors(true); - m_variablesTreeWidget->setAnimated(true); -} - -void VariablesDockWidget::updateTreeEntry(QTreeWidgetItem *treeItem, SymbolRecord symbolRecord) { - treeItem->setData(0, 0, QString(symbolRecord.name().c_str())); - treeItem->setData(1, 0, QString(symbolRecord.varval().type_name().c_str())); - treeItem->setData(2, 0, OctaveLink::octaveValueAsQString(symbolRecord.varval())); -} - -void VariablesDockWidget::setVariablesList(QList<SymbolRecord> symbolTable) { - m_updateSemaphore->acquire(); - // Split the symbol table into its different scopes. - QList<SymbolRecord> localSymbolTable; - QList<SymbolRecord> globalSymbolTable; - QList<SymbolRecord> persistentSymbolTable; - QList<SymbolRecord> hiddenSymbolTable; - - foreach(SymbolRecord symbolRecord, symbolTable) { - // It's true that being global or hidden includes it's can mean it's also locally visible, - // but we want to distinguish that here. - if(symbolRecord.is_local() && !symbolRecord.is_global() && !symbolRecord.is_hidden()) { - localSymbolTable.append(symbolRecord); - } - - if(symbolRecord.is_global()) { - globalSymbolTable.append(symbolRecord); - } - - if(symbolRecord.is_persistent()) { - persistentSymbolTable.append(symbolRecord); - } - - if(symbolRecord.is_hidden()) { - hiddenSymbolTable.append(symbolRecord); - } - } - - updateScope(0, localSymbolTable); - updateScope(1, globalSymbolTable); - updateScope(2, persistentSymbolTable); - updateScope(3, hiddenSymbolTable); - m_updateSemaphore->release(); -} - -void VariablesDockWidget::updateScope(int topLevelItemIndex, QList<SymbolRecord> symbolTable) { - // This method may be a little bit confusing; variablesList is a complete list of all - // variables that are in the workspace currently. - QTreeWidgetItem *topLevelItem = m_variablesTreeWidget->topLevelItem(topLevelItemIndex); - - // First we check, if any variables that exist in the model tree have to be updated - // or created. So we walk the variablesList check against the tree. - foreach(SymbolRecord symbolRecord, symbolTable) { - int childCount = topLevelItem->childCount(); - bool alreadyExists = false; - QTreeWidgetItem *child; - - // Search for the corresponding item in the tree. If it has been found, child - // will contain the appropriate QTreeWidgetItem* pointing at it. - for(int i = 0; i < childCount; i++) { - child = topLevelItem->child(i); - if(child->data(0, 0).toString() == QString(symbolRecord.name().c_str())) { - alreadyExists = true; - break; - } - } - - // If it already exists, just update it. - if(alreadyExists) { - updateTreeEntry(child, symbolRecord); - } else { - // It does not exist, so create a new one and set the right values. - child = new QTreeWidgetItem(); - updateTreeEntry(child, symbolRecord); - topLevelItem->addChild(child); - } - } - - // Check the tree against the list for deleted variables. - for(int i = 0; i < topLevelItem->childCount(); i++) { - bool existsInVariableList = false; - QTreeWidgetItem *child = topLevelItem->child(i); - foreach(SymbolRecord symbolRecord, symbolTable) { - if(QString(symbolRecord.name().c_str()) == child->data(0, 0).toString()) { - existsInVariableList = true; - } - } - - if(!existsInVariableList) { - topLevelItem->removeChild(child); - delete child; - i--; - } - } -} - -void VariablesDockWidget::emitSaveWorkspace() { - emit saveWorkspace(); -} - -void VariablesDockWidget::emitLoadWorkspace() { - emit loadWorkspace(); -} - -void VariablesDockWidget::emitClearWorkspace() { - emit clearWorkspace(); -}
deleted file mode 100644 --- a/gui//src/VariablesDockWidget.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef VARIABLESDOCKWIDGET_H -#define VARIABLESDOCKWIDGET_H - -#include <QDockWidget> -#include <QTreeWidget> -#include <QSemaphore> -#include "OctaveLink.h" - -class VariablesDockWidget : public QDockWidget -{ - Q_OBJECT -public: - VariablesDockWidget(QWidget *parent = 0); - void setVariablesList(QList<SymbolRecord> symbolTable); - -signals: - void saveWorkspace(); - void loadWorkspace(); - void clearWorkspace(); - -private slots: - void emitSaveWorkspace(); - void emitLoadWorkspace(); - void emitClearWorkspace(); - -private: - void construct(); - void updateTreeEntry(QTreeWidgetItem *treeItem, SymbolRecord symbolRecord); - void updateScope(int topLevelItemIndex, QList<SymbolRecord> symbolTable); - QTreeWidget *m_variablesTreeWidget; - QSemaphore *m_updateSemaphore; -}; - -#endif // VARIABLESDOCKWIDGET_H
deleted file mode 100644 --- a/gui//src/Vt102Emulation.cpp +++ /dev/null @@ -1,1214 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2007-2008 by Robert Knight <robert.knight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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. -*/ - -// Own -#include "Vt102Emulation.h" - - -// this allows konsole to be compiled without XKB and XTEST extensions -// even though it might be available on a particular system. -#if defined(AVOID_XKB) - #undef HAVE_XKB -#endif - -#if defined(HAVE_XKB) - void scrolllock_set_off(); - void scrolllock_set_on(); -#endif - -// Standard -#include <stdio.h> -#include <unistd.h> -#include <assert.h> - -// Qt -#include <QtCore/QEvent> -#include <QtGui/QKeyEvent> -#include <QtCore/QByteRef> - -// Konsole -#include "KeyboardTranslator.h" -#include "Screen.h" - -Vt102Emulation::Vt102Emulation() - : Emulation(), - _titleUpdateTimer(new QTimer(this)) -{ - _titleUpdateTimer->setSingleShot(true); - QObject::connect(_titleUpdateTimer , SIGNAL(timeout()) , this , SLOT(updateTitle())); - - initTokenizer(); - reset(); -} - -Vt102Emulation::~Vt102Emulation() -{} - -void Vt102Emulation::clearEntireScreen() -{ - _currentScreen->clearEntireScreen(); - bufferedUpdate(); -} - -void Vt102Emulation::reset() -{ - resetTokenizer(); - resetModes(); - resetCharset(0); - _screen[0]->reset(); - resetCharset(1); - _screen[1]->reset(); - setCodec(LocaleCodec); - - bufferedUpdate(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Processing the incoming byte stream */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* Incoming Bytes Event pipeline - - This section deals with decoding the incoming character stream. - Decoding means here, that the stream is first separated into `tokens' - which are then mapped to a `meaning' provided as operations by the - `Screen' class or by the emulation class itself. - - The pipeline proceeds as follows: - - - Tokenizing the ESC codes (onReceiveChar) - - VT100 code page translation of plain characters (applyCharset) - - Interpretation of ESC codes (processToken) - - The escape codes and their meaning are described in the - technical reference of this program. -*/ - -// Tokens ------------------------------------------------------------------ -- - -/* - Since the tokens are the central notion if this section, we've put them - in front. They provide the syntactical elements used to represent the - terminals operations as byte sequences. - - They are encodes here into a single machine word, so that we can later - switch over them easily. Depending on the token itself, additional - argument variables are filled with parameter values. - - The tokens are defined below: - - - CHR - Printable characters (32..255 but DEL (=127)) - - CTL - Control characters (0..31 but ESC (= 27), DEL) - - ESC - Escape codes of the form <ESC><CHR but `[]()+*#'> - - ESC_DE - Escape codes of the form <ESC><any of `()+*#%'> C - - CSI_PN - Escape codes of the form <ESC>'[' {Pn} ';' {Pn} C - - CSI_PS - Escape codes of the form <ESC>'[' {Pn} ';' ... C - - CSI_PR - Escape codes of the form <ESC>'[' '?' {Pn} ';' ... C - - CSI_PE - Escape codes of the form <ESC>'[' '!' {Pn} ';' ... C - - VT52 - VT52 escape codes - - <ESC><Chr> - - <ESC>'Y'{Pc}{Pc} - - XTE_HA - Xterm window/terminal attribute commands - of the form <ESC>`]' {Pn} `;' {Text} <BEL> - (Note that these are handled differently to the other formats) - - The last two forms allow list of arguments. Since the elements of - the lists are treated individually the same way, they are passed - as individual tokens to the interpretation. Further, because the - meaning of the parameters are names (althought represented as numbers), - they are includes within the token ('N'). - -*/ - -#define TY_CONSTRUCT(T,A,N) ( ((((int)N) & 0xffff) << 16) | ((((int)A) & 0xff) << 8) | (((int)T) & 0xff) ) - -#define TY_CHR( ) TY_CONSTRUCT(0,0,0) -#define TY_CTL(A ) TY_CONSTRUCT(1,A,0) -#define TY_ESC(A ) TY_CONSTRUCT(2,A,0) -#define TY_ESC_CS(A,B) TY_CONSTRUCT(3,A,B) -#define TY_ESC_DE(A ) TY_CONSTRUCT(4,A,0) -#define TY_CSI_PS(A,N) TY_CONSTRUCT(5,A,N) -#define TY_CSI_PN(A ) TY_CONSTRUCT(6,A,0) -#define TY_CSI_PR(A,N) TY_CONSTRUCT(7,A,N) - -#define TY_VT52(A) TY_CONSTRUCT(8,A,0) -#define TY_CSI_PG(A) TY_CONSTRUCT(9,A,0) -#define TY_CSI_PE(A) TY_CONSTRUCT(10,A,0) - -#define MAX_ARGUMENT 4096 - -// Tokenizer --------------------------------------------------------------- -- - -/* The tokenizer's state - - The state is represented by the buffer (tokenBuffer, tokenBufferPos), - and accompanied by decoded arguments kept in (argv,argc). - Note that they are kept internal in the tokenizer. -*/ - -void Vt102Emulation::resetTokenizer() -{ - tokenBufferPos = 0; - argc = 0; - argv[0] = 0; - argv[1] = 0; -} - -void Vt102Emulation::addDigit(int digit) -{ - if (argv[argc] < MAX_ARGUMENT) - argv[argc] = 10*argv[argc] + digit; -} - -void Vt102Emulation::addArgument() -{ - argc = qMin(argc+1,MAXARGS-1); - argv[argc] = 0; -} - -void Vt102Emulation::addToCurrentToken(int cc) -{ - tokenBuffer[tokenBufferPos] = cc; - tokenBufferPos = qMin(tokenBufferPos+1,MAX_TOKEN_LENGTH-1); -} - -// Character Class flags used while decoding - -#define CTL 1 // Control character -#define CHR 2 // Printable character -#define CPN 4 // TODO: Document me -#define DIG 8 // Digit -#define SCS 16 // TODO: Document me -#define GRP 32 // TODO: Document me -#define CPS 64 // Character which indicates end of window resize - // escape sequence '\e[8;<row>;<col>t' - -void Vt102Emulation::initTokenizer() -{ - int i; - quint8* s; - for(i = 0;i < 256; ++i) - charClass[i] = 0; - for(i = 0;i < 32; ++i) - charClass[i] |= CTL; - for(i = 32;i < 256; ++i) - charClass[i] |= CHR; - for(s = (quint8*)"@ABCDGHILMPSTXZcdfry"; *s; ++s) - charClass[*s] |= CPN; - // resize = \e[8;<row>;<col>t - for(s = (quint8*)"t"; *s; ++s) - charClass[*s] |= CPS; - for(s = (quint8*)"0123456789"; *s; ++s) - charClass[*s] |= DIG; - for(s = (quint8*)"()+*%"; *s; ++s) - charClass[*s] |= SCS; - for(s = (quint8*)"()+*#[]%"; *s; ++s) - charClass[*s] |= GRP; - - resetTokenizer(); -} - -/* Ok, here comes the nasty part of the decoder. - - Instead of keeping an explicit state, we deduce it from the - token scanned so far. It is then immediately combined with - the current character to form a scanning decision. - - This is done by the following defines. - - - P is the length of the token scanned so far. - - L (often P-1) is the position on which contents we base a decision. - - C is a character or a group of characters (taken from 'charClass'). - - - 'cc' is the current character - - 's' is a pointer to the start of the token buffer - - 'p' is the current position within the token buffer - - Note that they need to applied in proper order. -*/ - -#define lec(P,L,C) (p == (P) && s[(L)] == (C)) -#define lun( ) (p == 1 && cc >= 32 ) -#define les(P,L,C) (p == (P) && s[L] < 256 && (charClass[s[(L)]] & (C)) == (C)) -#define eec(C) (p >= 3 && cc == (C)) -#define ees(C) (p >= 3 && cc < 256 && (charClass[cc] & (C)) == (C)) -#define eps(C) (p >= 3 && s[2] != '?' && s[2] != '!' && s[2] != '>' && cc < 256 && (charClass[cc] & (C)) == (C)) -#define epp( ) (p >= 3 && s[2] == '?') -#define epe( ) (p >= 3 && s[2] == '!') -#define egt( ) (p >= 3 && s[2] == '>') -#define Xpe (tokenBufferPos >= 2 && tokenBuffer[1] == ']') -#define Xte (Xpe && cc == 7 ) -#define ces(C) (cc < 256 && (charClass[cc] & (C)) == (C) && !Xte) - -#define ESC 27 -#define CNTL(c) ((c)-'@') - -// process an incoming unicode character -void Vt102Emulation::receiveChar(int cc) -{ - if (cc == 127) - return; //VT100: ignore. - - if (ces(CTL)) - { - // DEC HACK ALERT! Control Characters are allowed *within* esc sequences in VT100 - // This means, they do neither a resetTokenizer() nor a pushToToken(). Some of them, do - // of course. Guess this originates from a weakly layered handling of the X-on - // X-off protocol, which comes really below this level. - if (cc == CNTL('X') || cc == CNTL('Z') || cc == ESC) - resetTokenizer(); //VT100: CAN or SUB - if (cc != ESC) - { - processToken(TY_CTL(cc+'@' ),0,0); - return; - } - } - // advance the state - addToCurrentToken(cc); - - int* s = tokenBuffer; - int p = tokenBufferPos; - - if (getMode(MODE_Ansi)) - { - if (lec(1,0,ESC)) { return; } - if (lec(1,0,ESC+128)) { s[0] = ESC; receiveChar('['); return; } - if (les(2,1,GRP)) { return; } - if (Xte ) { processWindowAttributeChange(); resetTokenizer(); return; } - if (Xpe ) { return; } - if (lec(3,2,'?')) { return; } - if (lec(3,2,'>')) { return; } - if (lec(3,2,'!')) { return; } - if (lun( )) { processToken( TY_CHR(), applyCharset(cc), 0); resetTokenizer(); return; } - if (lec(2,0,ESC)) { processToken( TY_ESC(s[1]), 0, 0); resetTokenizer(); return; } - if (les(3,1,SCS)) { processToken( TY_ESC_CS(s[1],s[2]), 0, 0); resetTokenizer(); return; } - if (lec(3,1,'#')) { processToken( TY_ESC_DE(s[2]), 0, 0); resetTokenizer(); return; } - if (eps( CPN)) { processToken( TY_CSI_PN(cc), argv[0],argv[1]); resetTokenizer(); return; } - - // resize = \e[8;<row>;<col>t - if (eps(CPS)) - { - processToken( TY_CSI_PS(cc, argv[0]), argv[1], argv[2]); - resetTokenizer(); - return; - } - - if (epe( )) { processToken( TY_CSI_PE(cc), 0, 0); resetTokenizer(); return; } - if (ees(DIG)) { addDigit(cc-'0'); return; } - if (eec(';')) { addArgument(); return; } - for (int i=0;i<=argc;i++) - { - if (epp()) - processToken( TY_CSI_PR(cc,argv[i]), 0, 0); - else if (egt()) - processToken( TY_CSI_PG(cc), 0, 0); // spec. case for ESC]>0c or ESC]>c - else if (cc == 'm' && argc - i >= 4 && (argv[i] == 38 || argv[i] == 48) && argv[i+1] == 2) - { - // ESC[ ... 48;2;<red>;<green>;<blue> ... m -or- ESC[ ... 38;2;<red>;<green>;<blue> ... m - i += 2; - processToken( TY_CSI_PS(cc, argv[i-2]), COLOR_SPACE_RGB, (argv[i] << 16) | (argv[i+1] << 8) | argv[i+2]); - i += 2; - } - else if (cc == 'm' && argc - i >= 2 && (argv[i] == 38 || argv[i] == 48) && argv[i+1] == 5) - { - // ESC[ ... 48;5;<index> ... m -or- ESC[ ... 38;5;<index> ... m - i += 2; - processToken( TY_CSI_PS(cc, argv[i-2]), COLOR_SPACE_256, argv[i]); - } - else - processToken( TY_CSI_PS(cc,argv[i]), 0, 0); - } - resetTokenizer(); - } - else - { - // VT52 Mode - if (lec(1,0,ESC)) - return; - if (les(1,0,CHR)) - { - processToken( TY_CHR(), s[0], 0); - resetTokenizer(); - return; - } - if (lec(2,1,'Y')) - return; - if (lec(3,1,'Y')) - return; - if (p < 4) - { - processToken( TY_VT52(s[1] ), 0, 0); - resetTokenizer(); - return; - } - processToken( TY_VT52(s[1]), s[2], s[3]); - resetTokenizer(); - return; - } -} -void Vt102Emulation::processWindowAttributeChange() -{ - // Describes the window or terminal session attribute to change - // See Session::UserTitleChange for possible values - int attributeToChange = 0; - int i; - for (i = 2; i < tokenBufferPos && - tokenBuffer[i] >= '0' && - tokenBuffer[i] <= '9'; i++) - { - attributeToChange = 10 * attributeToChange + (tokenBuffer[i]-'0'); - } - - if (tokenBuffer[i] != ';') - { - reportDecodingError(); - return; - } - - QString newValue; - newValue.reserve(tokenBufferPos-i-2); - for (int j = 0; j < tokenBufferPos-i-2; j++) - newValue[j] = tokenBuffer[i+1+j]; - - _pendingTitleUpdates[attributeToChange] = newValue; - _titleUpdateTimer->start(20); -} - -void Vt102Emulation::updateTitle() -{ - QListIterator<int> iter( _pendingTitleUpdates.keys() ); - while (iter.hasNext()) { - int arg = iter.next(); - emit titleChanged( arg , _pendingTitleUpdates[arg] ); - } - _pendingTitleUpdates.clear(); -} - -// Interpreting Codes --------------------------------------------------------- - -/* - Now that the incoming character stream is properly tokenized, - meaning is assigned to them. These are either operations of - the current _screen, or of the emulation class itself. - - The token to be interpreteted comes in as a machine word - possibly accompanied by two parameters. - - Likewise, the operations assigned to, come with up to two - arguments. One could consider to make up a proper table - from the function below. - - The technical reference manual provides more information - about this mapping. -*/ - -void Vt102Emulation::processToken(int token, int p, int q) -{ - switch (token) - { - - case TY_CHR( ) : _currentScreen->displayCharacter (p ); break; //UTF16 - - // 127 DEL : ignored on input - - case TY_CTL('@' ) : /* NUL: ignored */ break; - case TY_CTL('A' ) : /* SOH: ignored */ break; - case TY_CTL('B' ) : /* STX: ignored */ break; - case TY_CTL('C' ) : /* ETX: ignored */ break; - case TY_CTL('D' ) : /* EOT: ignored */ break; - case TY_CTL('E' ) : reportAnswerBack ( ); break; //VT100 - case TY_CTL('F' ) : /* ACK: ignored */ break; - case TY_CTL('G' ) : emit stateSet(NOTIFYBELL); - break; //VT100 - case TY_CTL('H' ) : _currentScreen->backspace ( ); break; //VT100 - case TY_CTL('I' ) : _currentScreen->tab ( ); break; //VT100 - case TY_CTL('J' ) : _currentScreen->newLine ( ); break; //VT100 - case TY_CTL('K' ) : _currentScreen->newLine ( ); break; //VT100 - case TY_CTL('L' ) : _currentScreen->newLine ( ); break; //VT100 - case TY_CTL('M' ) : _currentScreen->toStartOfLine ( ); break; //VT100 - - case TY_CTL('N' ) : useCharset ( 1); break; //VT100 - case TY_CTL('O' ) : useCharset ( 0); break; //VT100 - - case TY_CTL('P' ) : /* DLE: ignored */ break; - case TY_CTL('Q' ) : /* DC1: XON continue */ break; //VT100 - case TY_CTL('R' ) : /* DC2: ignored */ break; - case TY_CTL('S' ) : /* DC3: XOFF halt */ break; //VT100 - case TY_CTL('T' ) : /* DC4: ignored */ break; - case TY_CTL('U' ) : /* NAK: ignored */ break; - case TY_CTL('V' ) : /* SYN: ignored */ break; - case TY_CTL('W' ) : /* ETB: ignored */ break; - case TY_CTL('X' ) : _currentScreen->displayCharacter ( 0x2592); break; //VT100 - case TY_CTL('Y' ) : /* EM : ignored */ break; - case TY_CTL('Z' ) : _currentScreen->displayCharacter ( 0x2592); break; //VT100 - case TY_CTL('[' ) : /* ESC: cannot be seen here. */ break; - case TY_CTL('\\' ) : /* FS : ignored */ break; - case TY_CTL(']' ) : /* GS : ignored */ break; - case TY_CTL('^' ) : /* RS : ignored */ break; - case TY_CTL('_' ) : /* US : ignored */ break; - - case TY_ESC('D' ) : _currentScreen->index ( ); break; //VT100 - case TY_ESC('E' ) : _currentScreen->nextLine ( ); break; //VT100 - case TY_ESC('H' ) : _currentScreen->changeTabStop (true ); break; //VT100 - case TY_ESC('M' ) : _currentScreen->reverseIndex ( ); break; //VT100 - case TY_ESC('Z' ) : reportTerminalType ( ); break; - case TY_ESC('c' ) : reset ( ); break; - - case TY_ESC('n' ) : useCharset ( 2); break; - case TY_ESC('o' ) : useCharset ( 3); break; - case TY_ESC('7' ) : saveCursor ( ); break; - case TY_ESC('8' ) : restoreCursor ( ); break; - - case TY_ESC('=' ) : setMode (MODE_AppKeyPad); break; - case TY_ESC('>' ) : resetMode (MODE_AppKeyPad); break; - case TY_ESC('<' ) : setMode (MODE_Ansi ); break; //VT100 - - case TY_ESC_CS('(', '0') : setCharset (0, '0'); break; //VT100 - case TY_ESC_CS('(', 'A') : setCharset (0, 'A'); break; //VT100 - case TY_ESC_CS('(', 'B') : setCharset (0, 'B'); break; //VT100 - - case TY_ESC_CS(')', '0') : setCharset (1, '0'); break; //VT100 - case TY_ESC_CS(')', 'A') : setCharset (1, 'A'); break; //VT100 - case TY_ESC_CS(')', 'B') : setCharset (1, 'B'); break; //VT100 - - case TY_ESC_CS('*', '0') : setCharset (2, '0'); break; //VT100 - case TY_ESC_CS('*', 'A') : setCharset (2, 'A'); break; //VT100 - case TY_ESC_CS('*', 'B') : setCharset (2, 'B'); break; //VT100 - - case TY_ESC_CS('+', '0') : setCharset (3, '0'); break; //VT100 - case TY_ESC_CS('+', 'A') : setCharset (3, 'A'); break; //VT100 - case TY_ESC_CS('+', 'B') : setCharset (3, 'B'); break; //VT100 - - case TY_ESC_CS('%', 'G') : setCodec (Utf8Codec ); break; //LINUX - case TY_ESC_CS('%', '@') : setCodec (LocaleCodec ); break; //LINUX - - case TY_ESC_DE('3' ) : /* Double height line, top half */ - _currentScreen->setLineProperty( LINE_DOUBLEWIDTH , true ); - _currentScreen->setLineProperty( LINE_DOUBLEHEIGHT , true ); - break; - case TY_ESC_DE('4' ) : /* Double height line, bottom half */ - _currentScreen->setLineProperty( LINE_DOUBLEWIDTH , true ); - _currentScreen->setLineProperty( LINE_DOUBLEHEIGHT , true ); - break; - case TY_ESC_DE('5' ) : /* Single width, single height line*/ - _currentScreen->setLineProperty( LINE_DOUBLEWIDTH , false); - _currentScreen->setLineProperty( LINE_DOUBLEHEIGHT , false); - break; - case TY_ESC_DE('6' ) : /* Double width, single height line*/ - _currentScreen->setLineProperty( LINE_DOUBLEWIDTH , true); - _currentScreen->setLineProperty( LINE_DOUBLEHEIGHT , false); - break; - case TY_ESC_DE('8' ) : _currentScreen->helpAlign ( ); break; - -// resize = \e[8;<row>;<col>t - case TY_CSI_PS('t', 8) : setImageSize( q /* columns */, p /* lines */ ); break; - -// change tab text color : \e[28;<color>t color: 0-16,777,215 - case TY_CSI_PS('t', 28) : emit changeTabTextColorRequest ( p ); break; - - case TY_CSI_PS('K', 0) : _currentScreen->clearToEndOfLine ( ); break; - case TY_CSI_PS('K', 1) : _currentScreen->clearToBeginOfLine ( ); break; - case TY_CSI_PS('K', 2) : _currentScreen->clearEntireLine ( ); break; - case TY_CSI_PS('J', 0) : _currentScreen->clearToEndOfScreen ( ); break; - case TY_CSI_PS('J', 1) : _currentScreen->clearToBeginOfScreen ( ); break; - case TY_CSI_PS('J', 2) : _currentScreen->clearEntireScreen ( ); break; - case TY_CSI_PS('J', 3) : clearHistory(); break; - case TY_CSI_PS('g', 0) : _currentScreen->changeTabStop (false ); break; //VT100 - case TY_CSI_PS('g', 3) : _currentScreen->clearTabStops ( ); break; //VT100 - case TY_CSI_PS('h', 4) : _currentScreen-> setMode (MODE_Insert ); break; - case TY_CSI_PS('h', 20) : setMode (MODE_NewLine ); break; - case TY_CSI_PS('i', 0) : /* IGNORE: attached printer */ break; //VT100 - case TY_CSI_PS('l', 4) : _currentScreen-> resetMode (MODE_Insert ); break; - case TY_CSI_PS('l', 20) : resetMode (MODE_NewLine ); break; - case TY_CSI_PS('s', 0) : saveCursor ( ); break; - case TY_CSI_PS('u', 0) : restoreCursor ( ); break; - - case TY_CSI_PS('m', 0) : _currentScreen->setDefaultRendition ( ); break; - case TY_CSI_PS('m', 1) : _currentScreen-> setRendition (RE_BOLD ); break; //VT100 - case TY_CSI_PS('m', 4) : _currentScreen-> setRendition (RE_UNDERLINE); break; //VT100 - case TY_CSI_PS('m', 5) : _currentScreen-> setRendition (RE_BLINK ); break; //VT100 - case TY_CSI_PS('m', 7) : _currentScreen-> setRendition (RE_REVERSE ); break; - case TY_CSI_PS('m', 10) : /* IGNORED: mapping related */ break; //LINUX - case TY_CSI_PS('m', 11) : /* IGNORED: mapping related */ break; //LINUX - case TY_CSI_PS('m', 12) : /* IGNORED: mapping related */ break; //LINUX - case TY_CSI_PS('m', 22) : _currentScreen->resetRendition (RE_BOLD ); break; - case TY_CSI_PS('m', 24) : _currentScreen->resetRendition (RE_UNDERLINE); break; - case TY_CSI_PS('m', 25) : _currentScreen->resetRendition (RE_BLINK ); break; - case TY_CSI_PS('m', 27) : _currentScreen->resetRendition (RE_REVERSE ); break; - - case TY_CSI_PS('m', 30) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 0); break; - case TY_CSI_PS('m', 31) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 1); break; - case TY_CSI_PS('m', 32) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 2); break; - case TY_CSI_PS('m', 33) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 3); break; - case TY_CSI_PS('m', 34) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 4); break; - case TY_CSI_PS('m', 35) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 5); break; - case TY_CSI_PS('m', 36) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 6); break; - case TY_CSI_PS('m', 37) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 7); break; - - case TY_CSI_PS('m', 38) : _currentScreen->setForeColor (p, q); break; - - case TY_CSI_PS('m', 39) : _currentScreen->setForeColor (COLOR_SPACE_DEFAULT, 0); break; - - case TY_CSI_PS('m', 40) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 0); break; - case TY_CSI_PS('m', 41) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 1); break; - case TY_CSI_PS('m', 42) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 2); break; - case TY_CSI_PS('m', 43) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 3); break; - case TY_CSI_PS('m', 44) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 4); break; - case TY_CSI_PS('m', 45) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 5); break; - case TY_CSI_PS('m', 46) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 6); break; - case TY_CSI_PS('m', 47) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 7); break; - - case TY_CSI_PS('m', 48) : _currentScreen->setBackColor (p, q); break; - - case TY_CSI_PS('m', 49) : _currentScreen->setBackColor (COLOR_SPACE_DEFAULT, 1); break; - - case TY_CSI_PS('m', 90) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 8); break; - case TY_CSI_PS('m', 91) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 9); break; - case TY_CSI_PS('m', 92) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 10); break; - case TY_CSI_PS('m', 93) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 11); break; - case TY_CSI_PS('m', 94) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 12); break; - case TY_CSI_PS('m', 95) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 13); break; - case TY_CSI_PS('m', 96) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 14); break; - case TY_CSI_PS('m', 97) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 15); break; - - case TY_CSI_PS('m', 100) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 8); break; - case TY_CSI_PS('m', 101) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 9); break; - case TY_CSI_PS('m', 102) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 10); break; - case TY_CSI_PS('m', 103) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 11); break; - case TY_CSI_PS('m', 104) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 12); break; - case TY_CSI_PS('m', 105) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 13); break; - case TY_CSI_PS('m', 106) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 14); break; - case TY_CSI_PS('m', 107) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 15); break; - - case TY_CSI_PS('n', 5) : reportStatus ( ); break; - case TY_CSI_PS('n', 6) : reportCursorPosition ( ); break; - case TY_CSI_PS('q', 0) : /* IGNORED: LEDs off */ break; //VT100 - case TY_CSI_PS('q', 1) : /* IGNORED: LED1 on */ break; //VT100 - case TY_CSI_PS('q', 2) : /* IGNORED: LED2 on */ break; //VT100 - case TY_CSI_PS('q', 3) : /* IGNORED: LED3 on */ break; //VT100 - case TY_CSI_PS('q', 4) : /* IGNORED: LED4 on */ break; //VT100 - case TY_CSI_PS('x', 0) : reportTerminalParms ( 2); break; //VT100 - case TY_CSI_PS('x', 1) : reportTerminalParms ( 3); break; //VT100 - - case TY_CSI_PN('@' ) : _currentScreen->insertChars (p ); break; - case TY_CSI_PN('A' ) : _currentScreen->cursorUp (p ); break; //VT100 - case TY_CSI_PN('B' ) : _currentScreen->cursorDown (p ); break; //VT100 - case TY_CSI_PN('C' ) : _currentScreen->cursorRight (p ); break; //VT100 - case TY_CSI_PN('D' ) : _currentScreen->cursorLeft (p ); break; //VT100 - case TY_CSI_PN('G' ) : _currentScreen->setCursorX (p ); break; //LINUX - case TY_CSI_PN('H' ) : _currentScreen->setCursorYX (p, q); break; //VT100 - case TY_CSI_PN('I' ) : _currentScreen->tab (p ); break; - case TY_CSI_PN('L' ) : _currentScreen->insertLines (p ); break; - case TY_CSI_PN('M' ) : _currentScreen->deleteLines (p ); break; - case TY_CSI_PN('P' ) : _currentScreen->deleteChars (p ); break; - case TY_CSI_PN('S' ) : _currentScreen->scrollUp (p ); break; - case TY_CSI_PN('T' ) : _currentScreen->scrollDown (p ); break; - case TY_CSI_PN('X' ) : _currentScreen->eraseChars (p ); break; - case TY_CSI_PN('Z' ) : _currentScreen->backtab (p ); break; - case TY_CSI_PN('c' ) : reportTerminalType ( ); break; //VT100 - case TY_CSI_PN('d' ) : _currentScreen->setCursorY (p ); break; //LINUX - case TY_CSI_PN('f' ) : _currentScreen->setCursorYX (p, q); break; //VT100 - case TY_CSI_PN('r' ) : setMargins (p, q); break; //VT100 - case TY_CSI_PN('y' ) : /* IGNORED: Confidence test */ break; //VT100 - - case TY_CSI_PR('h', 1) : setMode (MODE_AppCuKeys); break; //VT100 - case TY_CSI_PR('l', 1) : resetMode (MODE_AppCuKeys); break; //VT100 - case TY_CSI_PR('s', 1) : saveMode (MODE_AppCuKeys); break; //FIXME - case TY_CSI_PR('r', 1) : restoreMode (MODE_AppCuKeys); break; //FIXME - - case TY_CSI_PR('l', 2) : resetMode (MODE_Ansi ); break; //VT100 - - case TY_CSI_PR('h', 3) : setMode (MODE_132Columns);break; //VT100 - case TY_CSI_PR('l', 3) : resetMode (MODE_132Columns);break; //VT100 - - case TY_CSI_PR('h', 4) : /* IGNORED: soft scrolling */ break; //VT100 - case TY_CSI_PR('l', 4) : /* IGNORED: soft scrolling */ break; //VT100 - - case TY_CSI_PR('h', 5) : _currentScreen-> setMode (MODE_Screen ); break; //VT100 - case TY_CSI_PR('l', 5) : _currentScreen-> resetMode (MODE_Screen ); break; //VT100 - - case TY_CSI_PR('h', 6) : _currentScreen-> setMode (MODE_Origin ); break; //VT100 - case TY_CSI_PR('l', 6) : _currentScreen-> resetMode (MODE_Origin ); break; //VT100 - case TY_CSI_PR('s', 6) : _currentScreen-> saveMode (MODE_Origin ); break; //FIXME - case TY_CSI_PR('r', 6) : _currentScreen->restoreMode (MODE_Origin ); break; //FIXME - - case TY_CSI_PR('h', 7) : _currentScreen-> setMode (MODE_Wrap ); break; //VT100 - case TY_CSI_PR('l', 7) : _currentScreen-> resetMode (MODE_Wrap ); break; //VT100 - case TY_CSI_PR('s', 7) : _currentScreen-> saveMode (MODE_Wrap ); break; //FIXME - case TY_CSI_PR('r', 7) : _currentScreen->restoreMode (MODE_Wrap ); break; //FIXME - - case TY_CSI_PR('h', 8) : /* IGNORED: autorepeat on */ break; //VT100 - case TY_CSI_PR('l', 8) : /* IGNORED: autorepeat off */ break; //VT100 - case TY_CSI_PR('s', 8) : /* IGNORED: autorepeat on */ break; //VT100 - case TY_CSI_PR('r', 8) : /* IGNORED: autorepeat off */ break; //VT100 - - case TY_CSI_PR('h', 9) : /* IGNORED: interlace */ break; //VT100 - case TY_CSI_PR('l', 9) : /* IGNORED: interlace */ break; //VT100 - case TY_CSI_PR('s', 9) : /* IGNORED: interlace */ break; //VT100 - case TY_CSI_PR('r', 9) : /* IGNORED: interlace */ break; //VT100 - - case TY_CSI_PR('h', 12) : /* IGNORED: Cursor blink */ break; //att610 - case TY_CSI_PR('l', 12) : /* IGNORED: Cursor blink */ break; //att610 - case TY_CSI_PR('s', 12) : /* IGNORED: Cursor blink */ break; //att610 - case TY_CSI_PR('r', 12) : /* IGNORED: Cursor blink */ break; //att610 - - case TY_CSI_PR('h', 25) : setMode (MODE_Cursor ); break; //VT100 - case TY_CSI_PR('l', 25) : resetMode (MODE_Cursor ); break; //VT100 - case TY_CSI_PR('s', 25) : saveMode (MODE_Cursor ); break; //VT100 - case TY_CSI_PR('r', 25) : restoreMode (MODE_Cursor ); break; //VT100 - - case TY_CSI_PR('h', 40) : setMode(MODE_Allow132Columns ); break; // XTERM - case TY_CSI_PR('l', 40) : resetMode(MODE_Allow132Columns ); break; // XTERM - - case TY_CSI_PR('h', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - case TY_CSI_PR('l', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - case TY_CSI_PR('s', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - case TY_CSI_PR('r', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - - case TY_CSI_PR('h', 47) : setMode (MODE_AppScreen); break; //VT100 - case TY_CSI_PR('l', 47) : resetMode (MODE_AppScreen); break; //VT100 - case TY_CSI_PR('s', 47) : saveMode (MODE_AppScreen); break; //XTERM - case TY_CSI_PR('r', 47) : restoreMode (MODE_AppScreen); break; //XTERM - - case TY_CSI_PR('h', 67) : /* IGNORED: DECBKM */ break; //XTERM - case TY_CSI_PR('l', 67) : /* IGNORED: DECBKM */ break; //XTERM - case TY_CSI_PR('s', 67) : /* IGNORED: DECBKM */ break; //XTERM - case TY_CSI_PR('r', 67) : /* IGNORED: DECBKM */ break; //XTERM - - // XTerm defines the following modes: - // SET_VT200_MOUSE 1000 - // SET_VT200_HIGHLIGHT_MOUSE 1001 - // SET_BTN_EVENT_MOUSE 1002 - // SET_ANY_EVENT_MOUSE 1003 - // - - //Note about mouse modes: - //There are four mouse modes which xterm-compatible terminals can support - 1000,1001,1002,1003 - //Konsole currently supports mode 1000 (basic mouse press and release) and mode 1002 (dragging the mouse). - //TODO: Implementation of mouse modes 1001 (something called hilight tracking) and - //1003 (a slight variation on dragging the mouse) - // - - case TY_CSI_PR('h', 1000) : setMode (MODE_Mouse1000); break; //XTERM - case TY_CSI_PR('l', 1000) : resetMode (MODE_Mouse1000); break; //XTERM - case TY_CSI_PR('s', 1000) : saveMode (MODE_Mouse1000); break; //XTERM - case TY_CSI_PR('r', 1000) : restoreMode (MODE_Mouse1000); break; //XTERM - - case TY_CSI_PR('h', 1001) : /* IGNORED: hilite mouse tracking */ break; //XTERM - case TY_CSI_PR('l', 1001) : resetMode (MODE_Mouse1001); break; //XTERM - case TY_CSI_PR('s', 1001) : /* IGNORED: hilite mouse tracking */ break; //XTERM - case TY_CSI_PR('r', 1001) : /* IGNORED: hilite mouse tracking */ break; //XTERM - - case TY_CSI_PR('h', 1002) : setMode (MODE_Mouse1002); break; //XTERM - case TY_CSI_PR('l', 1002) : resetMode (MODE_Mouse1002); break; //XTERM - case TY_CSI_PR('s', 1002) : saveMode (MODE_Mouse1002); break; //XTERM - case TY_CSI_PR('r', 1002) : restoreMode (MODE_Mouse1002); break; //XTERM - - case TY_CSI_PR('h', 1003) : setMode (MODE_Mouse1003); break; //XTERM - case TY_CSI_PR('l', 1003) : resetMode (MODE_Mouse1003); break; //XTERM - case TY_CSI_PR('s', 1003) : saveMode (MODE_Mouse1003); break; //XTERM - case TY_CSI_PR('r', 1003) : restoreMode (MODE_Mouse1003); break; //XTERM - - case TY_CSI_PR('h', 1034) : /* IGNORED: 8bitinput activation */ break; //XTERM - - case TY_CSI_PR('h', 1047) : setMode (MODE_AppScreen); break; //XTERM - case TY_CSI_PR('l', 1047) : _screen[1]->clearEntireScreen(); resetMode(MODE_AppScreen); break; //XTERM - case TY_CSI_PR('s', 1047) : saveMode (MODE_AppScreen); break; //XTERM - case TY_CSI_PR('r', 1047) : restoreMode (MODE_AppScreen); break; //XTERM - - //FIXME: Unitoken: save translations - case TY_CSI_PR('h', 1048) : saveCursor ( ); break; //XTERM - case TY_CSI_PR('l', 1048) : restoreCursor ( ); break; //XTERM - case TY_CSI_PR('s', 1048) : saveCursor ( ); break; //XTERM - case TY_CSI_PR('r', 1048) : restoreCursor ( ); break; //XTERM - - //FIXME: every once new sequences like this pop up in xterm. - // Here's a guess of what they could mean. - case TY_CSI_PR('h', 1049) : saveCursor(); _screen[1]->clearEntireScreen(); setMode(MODE_AppScreen); break; //XTERM - case TY_CSI_PR('l', 1049) : resetMode(MODE_AppScreen); restoreCursor(); break; //XTERM - - //FIXME: weird DEC reset sequence - case TY_CSI_PE('p' ) : /* IGNORED: reset ( ) */ break; - - //FIXME: when changing between vt52 and ansi mode evtl do some resetting. - case TY_VT52('A' ) : _currentScreen->cursorUp ( 1); break; //VT52 - case TY_VT52('B' ) : _currentScreen->cursorDown ( 1); break; //VT52 - case TY_VT52('C' ) : _currentScreen->cursorRight ( 1); break; //VT52 - case TY_VT52('D' ) : _currentScreen->cursorLeft ( 1); break; //VT52 - - case TY_VT52('F' ) : setAndUseCharset (0, '0'); break; //VT52 - case TY_VT52('G' ) : setAndUseCharset (0, 'B'); break; //VT52 - - case TY_VT52('H' ) : _currentScreen->setCursorYX (1,1 ); break; //VT52 - case TY_VT52('I' ) : _currentScreen->reverseIndex ( ); break; //VT52 - case TY_VT52('J' ) : _currentScreen->clearToEndOfScreen ( ); break; //VT52 - case TY_VT52('K' ) : _currentScreen->clearToEndOfLine ( ); break; //VT52 - case TY_VT52('Y' ) : _currentScreen->setCursorYX (p-31,q-31 ); break; //VT52 - case TY_VT52('Z' ) : reportTerminalType ( ); break; //VT52 - case TY_VT52('<' ) : setMode (MODE_Ansi ); break; //VT52 - case TY_VT52('=' ) : setMode (MODE_AppKeyPad); break; //VT52 - case TY_VT52('>' ) : resetMode (MODE_AppKeyPad); break; //VT52 - - case TY_CSI_PG('c' ) : reportSecondaryAttributes( ); break; //VT100 - - default: - reportDecodingError(); - break; - }; -} - -void Vt102Emulation::clearScreenAndSetColumns(int columnCount) -{ - setImageSize(_currentScreen->getLines(),columnCount); - clearEntireScreen(); - setDefaultMargins(); - _currentScreen->setCursorYX(0,0); -} - -void Vt102Emulation::sendString(const char* s , int length) -{ - if ( length >= 0 ) - emit sendData(s,length); - else - emit sendData(s,strlen(s)); -} - -void Vt102Emulation::reportCursorPosition() -{ - char tmp[20]; - sprintf(tmp,"\033[%d;%dR",_currentScreen->getCursorY()+1,_currentScreen->getCursorX()+1); - sendString(tmp); -} - -void Vt102Emulation::reportTerminalType() -{ - // Primary device attribute response (Request was: ^[[0c or ^[[c (from TT321 Users Guide)) - // VT220: ^[[?63;1;2;3;6;7;8c (list deps on emul. capabilities) - // VT100: ^[[?1;2c - // VT101: ^[[?1;0c - // VT102: ^[[?6v - if (getMode(MODE_Ansi)) - sendString("\033[?1;2c"); // I'm a VT100 - else - sendString("\033/Z"); // I'm a VT52 -} - -void Vt102Emulation::reportSecondaryAttributes() -{ - // Seconday device attribute response (Request was: ^[[>0c or ^[[>c) - if (getMode(MODE_Ansi)) - sendString("\033[>0;115;0c"); // Why 115? ;) - else - sendString("\033/Z"); // FIXME I don't think VT52 knows about it but kept for - // konsoles backward compatibility. -} - -void Vt102Emulation::reportTerminalParms(int p) -// DECREPTPARM -{ - char tmp[100]; - sprintf(tmp,"\033[%d;1;1;112;112;1;0x",p); // not really true. - sendString(tmp); -} - -void Vt102Emulation::reportStatus() -{ - sendString("\033[0n"); //VT100. Device status report. 0 = Ready. -} - -void Vt102Emulation::reportAnswerBack() -{ - // FIXME - Test this with VTTEST - // This is really obsolete VT100 stuff. - const char* ANSWER_BACK = ""; - sendString(ANSWER_BACK); -} - -/*! - `cx',`cy' are 1-based. - `eventType' indicates the button pressed (0-2) - or a general mouse release (3). - - eventType represents the kind of mouse action that occurred: - 0 = Mouse button press or release - 1 = Mouse drag -*/ - -void Vt102Emulation::sendMouseEvent( int cb, int cx, int cy , int eventType ) -{ - if (cx < 1 || cy < 1) - return; - - // normal buttons are passed as 0x20 + button, - // mouse wheel (buttons 4,5) as 0x5c + button - if (cb >= 4) - cb += 0x3c; - - //Mouse motion handling - if ((getMode(MODE_Mouse1002) || getMode(MODE_Mouse1003)) && eventType == 1) - cb += 0x20; //add 32 to signify motion event - - char command[20]; - sprintf(command,"\033[M%c%c%c",cb+0x20,cx+0x20,cy+0x20); - sendString(command); -} - -void Vt102Emulation::sendText( const QString& text ) -{ - if (!text.isEmpty()) - { - QKeyEvent event(QEvent::KeyPress, - 0, - Qt::NoModifier, - text); - - sendKeyEvent(&event); // expose as a big fat keypress event - } -} -void Vt102Emulation::sendKeyEvent( QKeyEvent* event ) -{ - Qt::KeyboardModifiers modifiers = event->modifiers(); - KeyboardTranslator::States states = KeyboardTranslator::NoState; - - // get current states - if (getMode(MODE_NewLine) ) states |= KeyboardTranslator::NewLineState; - if (getMode(MODE_Ansi) ) states |= KeyboardTranslator::AnsiState; - if (getMode(MODE_AppCuKeys)) states |= KeyboardTranslator::CursorKeysState; - if (getMode(MODE_AppScreen)) states |= KeyboardTranslator::AlternateScreenState; - if (getMode(MODE_AppKeyPad) && (modifiers & Qt::KeypadModifier)) - states |= KeyboardTranslator::ApplicationKeypadState; - - // check flow control state - if (modifiers & Qt::ControlModifier) - { - if (event->key() == Qt::Key_S) - emit flowControlKeyPressed(true); - else if (event->key() == Qt::Key_Q) - emit flowControlKeyPressed(false); - } - - // lookup key binding - if ( _keyTranslator ) - { - KeyboardTranslator::Entry entry = _keyTranslator->findEntry( - event->key() , - modifiers, - states ); - - // send result to terminal - QByteArray textToSend; - - // special handling for the Alt (aka. Meta) modifier. pressing - // Alt+[Character] results in Esc+[Character] being sent - // (unless there is an entry defined for this particular combination - // in the keyboard modifier) - bool wantsAltModifier = entry.modifiers() & entry.modifierMask() & Qt::AltModifier; - bool wantsAnyModifier = entry.state() & - entry.stateMask() & KeyboardTranslator::AnyModifierState; - - if ( modifiers & Qt::AltModifier && !(wantsAltModifier || wantsAnyModifier) - && !event->text().isEmpty() ) - { - textToSend.prepend("\033"); - } - - if ( entry.command() != KeyboardTranslator::NoCommand ) - { - if (entry.command() & KeyboardTranslator::EraseCommand) - textToSend += eraseChar(); - - // TODO command handling - } - else if ( !entry.text().isEmpty() ) - { - textToSend += _codec->fromUnicode(entry.text(true,modifiers)); - } - else - textToSend += _codec->fromUnicode(event->text()); - - sendData( textToSend.constData() , textToSend.length() ); - } - else - { - // print an error message to the terminal if no key translator has been - // set - QString translatorError = QString("No keyboard translator available. " - "The information needed to convert key presses " - "into characters to send to the terminal " - "is missing."); - reset(); - receiveData( translatorError.toAscii().constData() , translatorError.count() ); - } -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* VT100 Charsets */ -/* */ -/* ------------------------------------------------------------------------- */ - -// Character Set Conversion ------------------------------------------------ -- - -/* - The processing contains a VT100 specific code translation layer. - It's still in use and mainly responsible for the line drawing graphics. - - These and some other glyphs are assigned to codes (0x5f-0xfe) - normally occupied by the latin letters. Since this codes also - appear within control sequences, the extra code conversion - does not permute with the tokenizer and is placed behind it - in the pipeline. It only applies to tokens, which represent - plain characters. - - This conversion it eventually continued in TerminalDisplay.C, since - it might involve VT100 enhanced fonts, which have these - particular glyphs allocated in (0x00-0x1f) in their code page. -*/ - -#define CHARSET _charset[_currentScreen==_screen[1]] - -// Apply current character map. - -unsigned short Vt102Emulation::applyCharset(unsigned short c) -{ - if (CHARSET.graphic && 0x5f <= c && c <= 0x7e) return vt100_graphics[c-0x5f]; - if (CHARSET.pound && c == '#' ) return 0xa3; //This mode is obsolete - return c; -} - -/* - "Charset" related part of the emulation state. - This configures the VT100 charset filter. - - While most operation work on the current _screen, - the following two are different. -*/ - -void Vt102Emulation::resetCharset(int scrno) -{ - _charset[scrno].cu_cs = 0; - strncpy(_charset[scrno].charset,"BBBB",4); - _charset[scrno].sa_graphic = false; - _charset[scrno].sa_pound = false; - _charset[scrno].graphic = false; - _charset[scrno].pound = false; -} - -void Vt102Emulation::setCharset(int n, int cs) // on both screens. -{ - _charset[0].charset[n&3] = cs; useCharset(_charset[0].cu_cs); - _charset[1].charset[n&3] = cs; useCharset(_charset[1].cu_cs); -} - -void Vt102Emulation::setAndUseCharset(int n, int cs) -{ - CHARSET.charset[n&3] = cs; - useCharset(n&3); -} - -void Vt102Emulation::useCharset(int n) -{ - CHARSET.cu_cs = n&3; - CHARSET.graphic = (CHARSET.charset[n&3] == '0'); - CHARSET.pound = (CHARSET.charset[n&3] == 'A'); //This mode is obsolete -} - -void Vt102Emulation::setDefaultMargins() -{ - _screen[0]->setDefaultMargins(); - _screen[1]->setDefaultMargins(); -} - -void Vt102Emulation::setMargins(int t, int b) -{ - _screen[0]->setMargins(t, b); - _screen[1]->setMargins(t, b); -} - -void Vt102Emulation::saveCursor() -{ - CHARSET.sa_graphic = CHARSET.graphic; - CHARSET.sa_pound = CHARSET.pound; //This mode is obsolete - // we are not clear about these - //sa_charset = charsets[cScreen->_charset]; - //sa_charset_num = cScreen->_charset; - _currentScreen->saveCursor(); -} - -void Vt102Emulation::restoreCursor() -{ - CHARSET.graphic = CHARSET.sa_graphic; - CHARSET.pound = CHARSET.sa_pound; //This mode is obsolete - _currentScreen->restoreCursor(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Mode Operations */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* - Some of the emulations state is either added to the state of the screens. - - This causes some scoping problems, since different emulations choose to - located the mode either to the current _screen or to both. - - For strange reasons, the extend of the rendition attributes ranges over - all screens and not over the actual _screen. - - We decided on the precise precise extend, somehow. -*/ - -// "Mode" related part of the state. These are all booleans. - -void Vt102Emulation::resetModes() -{ - // MODE_Allow132Columns is not reset here - // to match Xterm's behaviour (see Xterm's VTReset() function) - - resetMode(MODE_132Columns); saveMode(MODE_132Columns); - resetMode(MODE_Mouse1000); saveMode(MODE_Mouse1000); - resetMode(MODE_Mouse1001); saveMode(MODE_Mouse1001); - resetMode(MODE_Mouse1002); saveMode(MODE_Mouse1002); - resetMode(MODE_Mouse1003); saveMode(MODE_Mouse1003); - - resetMode(MODE_AppScreen); saveMode(MODE_AppScreen); - resetMode(MODE_AppCuKeys); saveMode(MODE_AppCuKeys); - resetMode(MODE_AppKeyPad); saveMode(MODE_AppKeyPad); - resetMode(MODE_NewLine); - setMode(MODE_Ansi); -} - -void Vt102Emulation::setMode(int m) -{ - _currentModes.mode[m] = true; - switch (m) - { - case MODE_132Columns: - if (getMode(MODE_Allow132Columns)) - clearScreenAndSetColumns(132); - else - _currentModes.mode[m] = false; - break; - case MODE_Mouse1000: - case MODE_Mouse1001: - case MODE_Mouse1002: - case MODE_Mouse1003: - emit programUsesMouseChanged(false); - break; - - case MODE_AppScreen : _screen[1]->clearSelection(); - setScreen(1); - break; - } - if (m < MODES_SCREEN || m == MODE_NewLine) - { - _screen[0]->setMode(m); - _screen[1]->setMode(m); - } -} - -void Vt102Emulation::resetMode(int m) -{ - _currentModes.mode[m] = false; - switch (m) - { - case MODE_132Columns: - if (getMode(MODE_Allow132Columns)) - clearScreenAndSetColumns(80); - break; - case MODE_Mouse1000 : - case MODE_Mouse1001 : - case MODE_Mouse1002 : - case MODE_Mouse1003 : - emit programUsesMouseChanged(true); - break; - - case MODE_AppScreen : - _screen[0]->clearSelection(); - setScreen(0); - break; - } - if (m < MODES_SCREEN || m == MODE_NewLine) - { - _screen[0]->resetMode(m); - _screen[1]->resetMode(m); - } -} - -void Vt102Emulation::saveMode(int m) -{ - _savedModes.mode[m] = _currentModes.mode[m]; -} - -void Vt102Emulation::restoreMode(int m) -{ - if (_savedModes.mode[m]) - setMode(m); - else - resetMode(m); -} - -bool Vt102Emulation::getMode(int m) -{ - return _currentModes.mode[m]; -} - -char Vt102Emulation::eraseChar() const -{ - KeyboardTranslator::Entry entry = _keyTranslator->findEntry( - Qt::Key_Backspace, - 0, - 0); - if ( entry.text().count() > 0 ) - return entry.text()[0]; - else - return '\b'; -} - -// print contents of the scan buffer -static void hexdump(int* s, int len) -{ int i; - for (i = 0; i < len; i++) - { - if (s[i] == '\\') - printf("\\\\"); - else - if ((s[i]) > 32 && s[i] < 127) - printf("%c",s[i]); - else - printf("\\%04x(hex)",s[i]); - } -} - -void Vt102Emulation::reportDecodingError() -{ - if (tokenBufferPos == 0 || ( tokenBufferPos == 1 && (tokenBuffer[0] & 0xff) >= 32) ) - return; - printf("Undecodable sequence: "); - hexdump(tokenBuffer,tokenBufferPos); - printf("\n"); -} -
deleted file mode 100644 --- a/gui//src/Vt102Emulation.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 VT102EMULATION_H -#define VT102EMULATION_H - -// Standard Library -#include <stdio.h> - -// Qt -#include <QtGui/QKeyEvent> -#include <QtCore/QHash> -#include <QtCore/QTimer> - -// Konsole -#include "Emulation.h" -#include "Screen.h" - -#define MODE_AppScreen (MODES_SCREEN+0) // Mode #1 -#define MODE_AppCuKeys (MODES_SCREEN+1) // Application cursor keys (DECCKM) -#define MODE_AppKeyPad (MODES_SCREEN+2) // -#define MODE_Mouse1000 (MODES_SCREEN+3) // Send mouse X,Y position on press and release -#define MODE_Mouse1001 (MODES_SCREEN+4) // Use Hilight mouse tracking -#define MODE_Mouse1002 (MODES_SCREEN+5) // Use cell motion mouse tracking -#define MODE_Mouse1003 (MODES_SCREEN+6) // Use all motion mouse tracking -#define MODE_Ansi (MODES_SCREEN+7) // Use US Ascii for character sets G0-G3 (DECANM) -#define MODE_132Columns (MODES_SCREEN+8) // 80 <-> 132 column mode switch (DECCOLM) -#define MODE_Allow132Columns (MODES_SCREEN+9) // Allow DECCOLM mode -#define MODE_total (MODES_SCREEN+10) - -struct CharCodes -{ - // coding info - char charset[4]; // - int cu_cs; // actual charset. - bool graphic; // Some VT100 tricks - bool pound ; // Some VT100 tricks - bool sa_graphic; // saved graphic - bool sa_pound; // saved pound -}; - -/** - * Provides an xterm compatible terminal emulation based on the DEC VT102 terminal. - * A full description of this terminal can be found at http://vt100.net/docs/vt102-ug/ - * - * In addition, various additional xterm escape sequences are supported to provide - * features such as mouse input handling. - * See http://rtfm.etla.org/xterm/ctlseq.html for a description of xterm's escape - * sequences. - * - */ -class Vt102Emulation : public Emulation -{ -Q_OBJECT - -public: - /** Constructs a new emulation */ - Vt102Emulation(); - ~Vt102Emulation(); - - // reimplemented from Emulation - virtual void clearEntireScreen(); - virtual void reset(); - virtual char eraseChar() const; - -public slots: - // reimplemented from Emulation - virtual void sendString(const char*,int length = -1); - virtual void sendText(const QString& text); - virtual void sendKeyEvent(QKeyEvent*); - virtual void sendMouseEvent(int buttons, int column, int line, int eventType); - -protected: - // reimplemented from Emulation - virtual void setMode(int mode); - virtual void resetMode(int mode); - virtual void receiveChar(int cc); - -private slots: - //causes changeTitle() to be emitted for each (int,QString) pair in pendingTitleUpdates - //used to buffer multiple title updates - void updateTitle(); - -private: - unsigned short applyCharset(unsigned short c); - void setCharset(int n, int cs); - void useCharset(int n); - void setAndUseCharset(int n, int cs); - void saveCursor(); - void restoreCursor(); - void resetCharset(int scrno); - - void setMargins(int top, int bottom); - //set margins for all screens back to their defaults - void setDefaultMargins(); - - // returns true if 'mode' is set or false otherwise - bool getMode (int mode); - // saves the current boolean value of 'mode' - void saveMode (int mode); - // restores the boolean value of 'mode' - void restoreMode(int mode); - // resets all modes - // (except MODE_Allow132Columns) - void resetModes(); - - void resetTokenizer(); - #define MAX_TOKEN_LENGTH 80 - void addToCurrentToken(int cc); - int tokenBuffer[MAX_TOKEN_LENGTH]; //FIXME: overflow? - int tokenBufferPos; -#define MAXARGS 15 - void addDigit(int dig); - void addArgument(); - int argv[MAXARGS]; - int argc; - void initTokenizer(); - - // Set of flags for each of the ASCII characters which indicates - // what category they fall into (printable character, control, digit etc.) - // for the purposes of decoding terminal output - int charClass[256]; - - void reportDecodingError(); - - void processToken(int code, int p, int q); - void processWindowAttributeChange(); - - void reportTerminalType(); - void reportSecondaryAttributes(); - void reportStatus(); - void reportAnswerBack(); - void reportCursorPosition(); - void reportTerminalParms(int p); - - void onScrollLock(); - void scrollLock(const bool lock); - - // clears the screen and resizes it to the specified - // number of columns - void clearScreenAndSetColumns(int columnCount); - - CharCodes _charset[2]; - - class TerminalState - { - public: - // Initializes all modes to false - TerminalState() - { memset(&mode,false,MODE_total * sizeof(bool)); } - - bool mode[MODE_total]; - }; - - TerminalState _currentModes; - TerminalState _savedModes; - - //hash table and timer for buffering calls to the session instance - //to update the name of the session - //or window title. - //these calls occur when certain escape sequences are seen in the - //output from the terminal - QHash<int,QString> _pendingTitleUpdates; - QTimer* _titleUpdateTimer; -}; - -#endif // VT102EMULATION_H
deleted file mode 100644 --- a/gui//src/konsole_export.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - This file is part of the KDE project - Copyright (C) 2009 Patrick Spendrin <ps_ml@gmx.de> - - 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 <kdemacros.h> -#include <QtCore/qglobal.h> -#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 <iostream> -//#define kWarning(x) std::cout - -#include <stdio.h> - -//#define i18n -inline QString i18n(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
deleted file mode 100644 --- a/gui//src/konsole_wcwidth.cpp +++ /dev/null @@ -1,216 +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" - * <http://www.UNIX-systems.org/online.html> - * - * 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; -}
deleted file mode 100644 --- a/gui//src/konsole_wcwidth.h +++ /dev/null @@ -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 <bastian@kde.org> */ -/* - Rewritten for QT4 by e_k <e_k at users.sourceforge.net> -*/ - - -#ifndef _KONSOLE_WCWIDTH_H_ -#define _KONSOLE_WCWIDTH_H_ - -// Qt -#include <QtCore/QBool> -#include <QtCore/QString> - -int konsole_wcwidth(quint16 ucs); -#if 0 -int konsole_wcwidth_cjk(Q_UINT16 ucs); -#endif - -int string_width( const QString &txt ); - -#endif
deleted file mode 100644 --- a/gui//src/kprocess.cpp +++ /dev/null @@ -1,345 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include "kprocess_p.h" - -#include <qfile.h> - -#ifdef Q_OS_WIN -# include <windows.h> -#else -# include <unistd.h> -# include <errno.h> -#endif - -#ifndef Q_OS_WIN -# define STD_OUTPUT_HANDLE 1 -# define STD_ERROR_HANDLE 2 -#endif - -#ifdef _WIN32_WCE -#include <stdio.h> -#endif - -void KProcessPrivate::writeAll(const QByteArray &buf, int fd) -{ -#ifdef Q_OS_WIN -#ifndef _WIN32_WCE - HANDLE h = GetStdHandle(fd); - if (h) { - DWORD wr; - WriteFile(h, buf.data(), buf.size(), &wr, 0); - } -#else - fwrite(buf.data(), 1, buf.size(), (FILE*)fd); -#endif -#else - int off = 0; - do { - int ret = ::write(fd, buf.data() + off, buf.size() - off); - if (ret < 0) { - if (errno != EINTR) - return; - } else { - off += ret; - } - } while (off < buf.size()); -#endif -} - -void KProcessPrivate::forwardStd(KProcess::ProcessChannel good, int fd) -{ - Q_Q(KProcess); - - QProcess::ProcessChannel oc = q->readChannel(); - q->setReadChannel(good); - writeAll(q->readAll(), fd); - q->setReadChannel(oc); -} - -void KProcessPrivate::_k_forwardStdout() -{ -#ifndef _WIN32_WCE - forwardStd(KProcess::StandardOutput, STD_OUTPUT_HANDLE); -#else - forwardStd(KProcess::StandardOutput, (int)stdout); -#endif -} - -void KProcessPrivate::_k_forwardStderr() -{ -#ifndef _WIN32_WCE - forwardStd(KProcess::StandardError, STD_ERROR_HANDLE); -#else - forwardStd(KProcess::StandardError, (int)stderr); -#endif -} - -///////////////////////////// -// public member functions // -///////////////////////////// - -KProcess::KProcess(QObject *parent) : - QProcess(parent), - d_ptr(new KProcessPrivate) -{ - d_ptr->q_ptr = this; - setOutputChannelMode(ForwardedChannels); -} - -KProcess::KProcess(KProcessPrivate *d, QObject *parent) : - QProcess(parent), - d_ptr(d) -{ - d_ptr->q_ptr = this; - setOutputChannelMode(ForwardedChannels); -} - -KProcess::~KProcess() -{ - delete d_ptr; -} - -void KProcess::setOutputChannelMode(OutputChannelMode mode) -{ - Q_D(KProcess); - - d->outputChannelMode = mode; - disconnect(this, SIGNAL(readyReadStandardOutput())); - disconnect(this, SIGNAL(readyReadStandardError())); - switch (mode) { - case OnlyStdoutChannel: - connect(this, SIGNAL(readyReadStandardError()), SLOT(_k_forwardStderr())); - break; - case OnlyStderrChannel: - connect(this, SIGNAL(readyReadStandardOutput()), SLOT(_k_forwardStdout())); - break; - default: - QProcess::setProcessChannelMode((ProcessChannelMode)mode); - return; - } - QProcess::setProcessChannelMode(QProcess::SeparateChannels); -} - -KProcess::OutputChannelMode KProcess::outputChannelMode() const -{ - Q_D(const KProcess); - - return d->outputChannelMode; -} - -void KProcess::setNextOpenMode(QIODevice::OpenMode mode) -{ - Q_D(KProcess); - - d->openMode = mode; -} - -#define DUMMYENV "_KPROCESS_DUMMY_=" - -void KProcess::clearEnvironment() -{ - setEnvironment(QStringList() << QString::fromLatin1(DUMMYENV)); -} - -void KProcess::setEnv(const QString &name, const QString &value, bool overwrite) -{ - QStringList env = environment(); - if (env.isEmpty()) { - env = systemEnvironment(); - env.removeAll(QString::fromLatin1(DUMMYENV)); - } - QString fname(name); - fname.append(QLatin1Char('=')); - for (QStringList::Iterator it = env.begin(); it != env.end(); ++it) - if ((*it).startsWith(fname)) { - if (overwrite) { - *it = fname.append(value); - setEnvironment(env); - } - return; - } - env.append(fname.append(value)); - setEnvironment(env); -} - -void KProcess::unsetEnv(const QString &name) -{ - QStringList env = environment(); - if (env.isEmpty()) { - env = systemEnvironment(); - env.removeAll(QString::fromLatin1(DUMMYENV)); - } - QString fname(name); - fname.append(QLatin1Char('=')); - for (QStringList::Iterator it = env.begin(); it != env.end(); ++it) - if ((*it).startsWith(fname)) { - env.erase(it); - if (env.isEmpty()) - env.append(QString::fromLatin1(DUMMYENV)); - setEnvironment(env); - return; - } -} - -void KProcess::setProgram(const QString &exe, const QStringList &args) -{ - Q_D(KProcess); - - d->prog = exe; - d->args = args; -#ifdef Q_OS_WIN - setNativeArguments(QString()); -#endif -} - -void KProcess::setProgram(const QStringList &argv) -{ - Q_D(KProcess); - - Q_ASSERT( !argv.isEmpty() ); - d->args = argv; - d->prog = d->args.takeFirst(); -#ifdef Q_OS_WIN - setNativeArguments(QString()); -#endif -} - -KProcess &KProcess::operator<<(const QString &arg) -{ - Q_D(KProcess); - - if (d->prog.isEmpty()) - d->prog = arg; - else - d->args << arg; - return *this; -} - -KProcess &KProcess::operator<<(const QStringList &args) -{ - Q_D(KProcess); - - if (d->prog.isEmpty()) - setProgram(args); - else - d->args << args; - return *this; -} - -void KProcess::clearProgram() -{ - Q_D(KProcess); - - d->prog.clear(); - d->args.clear(); -#ifdef Q_OS_WIN - setNativeArguments(QString()); -#endif -} - -void KProcess::setShellCommand(const QString &cmd) -{ - Q_D(KProcess); - d->args.clear(); - d->prog = QString::fromLatin1("/bin/sh"); - d->args << QString::fromLatin1("-c") << cmd; -} - -QStringList KProcess::program() const -{ - Q_D(const KProcess); - - QStringList argv = d->args; - argv.prepend(d->prog); - return argv; -} - -void KProcess::start() -{ - Q_D(KProcess); - - QProcess::start(d->prog, d->args, d->openMode); -} - -int KProcess::execute(int msecs) -{ - start(); - if (!waitForFinished(msecs)) { - kill(); - waitForFinished(-1); - return -2; - } - return (exitStatus() == QProcess::NormalExit) ? exitCode() : -1; -} - -// static -int KProcess::execute(const QString &exe, const QStringList &args, int msecs) -{ - KProcess p; - p.setProgram(exe, args); - return p.execute(msecs); -} - -// static -int KProcess::execute(const QStringList &argv, int msecs) -{ - KProcess p; - p.setProgram(argv); - return p.execute(msecs); -} - -int KProcess::startDetached() -{ - Q_D(KProcess); - - qint64 pid; - if (!QProcess::startDetached(d->prog, d->args, workingDirectory(), &pid)) - return 0; - return (int) pid; -} - -// static -int KProcess::startDetached(const QString &exe, const QStringList &args) -{ - qint64 pid; - if (!QProcess::startDetached(exe, args, QString(), &pid)) - return 0; - return (int) pid; -} - -// static -int KProcess::startDetached(const QStringList &argv) -{ - QStringList args = argv; - QString prog = args.takeFirst(); - return startDetached(prog, args); -} - -int KProcess::pid() const -{ -#ifdef Q_OS_UNIX - return (int) QProcess::pid(); -#else - return QProcess::pid() ? QProcess::pid()->dwProcessId : 0; -#endif -} -
deleted file mode 100644 --- a/gui//src/kprocess.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef KPROCESS_H -#define KPROCESS_H - -#include <QtCore/QProcess> -class KProcess; -class KProcessPrivate; - - -/** - * \class KProcess kprocess.h <KProcess> - * - * Child process invocation, monitoring and control. - * - * This class extends QProcess by some useful functionality, overrides - * some defaults with saner values and wraps parts of the API into a more - * accessible one. - * This is the preferred way of spawning child processes in KDE; don't - * use QProcess directly. - * - * @author Oswald Buddenhagen <ossi@kde.org> - **/ -class KProcess : public QProcess -{ - Q_OBJECT - Q_DECLARE_PRIVATE(KProcess) - -public: - - /** - * Modes in which the output channels can be opened. - */ - enum OutputChannelMode { - SeparateChannels = QProcess::SeparateChannels, - /**< Standard output and standard error are handled by KProcess - as separate channels */ - MergedChannels = QProcess::MergedChannels, - /**< Standard output and standard error are handled by KProcess - as one channel */ - ForwardedChannels = QProcess::ForwardedChannels, - /**< Both standard output and standard error are forwarded - to the parent process' respective channel */ - OnlyStdoutChannel, - /**< Only standard output is handled; standard error is forwarded */ - OnlyStderrChannel /**< Only standard error is handled; standard output is forwarded */ - }; - - /** - * Constructor - */ - explicit KProcess(QObject *parent = 0); - - /** - * Destructor - */ - virtual ~KProcess(); - - /** - * Set how to handle the output channels of the child process. - * - * The default is ForwardedChannels, which is unlike in QProcess. - * Do not request more than you actually handle, as this output is - * simply lost otherwise. - * - * This function must be called before starting the process. - * - * @param mode the output channel handling mode - */ - void setOutputChannelMode(OutputChannelMode mode); - - /** - * Query how the output channels of the child process are handled. - * - * @return the output channel handling mode - */ - OutputChannelMode outputChannelMode() const; - - /** - * Set the QIODevice open mode the process will be opened in. - * - * This function must be called before starting the process, obviously. - * - * @param mode the open mode. Note that this mode is automatically - * "reduced" according to the channel modes and redirections. - * The default is QIODevice::ReadWrite. - */ - void setNextOpenMode(QIODevice::OpenMode mode); - - /** - * Adds the variable @p name to the process' environment. - * - * This function must be called before starting the process. - * - * @param name the name of the environment variable - * @param value the new value for the environment variable - * @param overwrite if @c false and the environment variable is already - * set, the old value will be preserved - */ - void setEnv(const QString &name, const QString &value, bool overwrite = true); - - /** - * Removes the variable @p name from the process' environment. - * - * This function must be called before starting the process. - * - * @param name the name of the environment variable - */ - void unsetEnv(const QString &name); - - /** - * Empties the process' environment. - * - * Note that LD_LIBRARY_PATH/DYLD_LIBRARY_PATH is automatically added - * on *NIX. - * - * This function must be called before starting the process. - */ - void clearEnvironment(); - - /** - * Set the program and the command line arguments. - * - * This function must be called before starting the process, obviously. - * - * @param exe the program to execute - * @param args the command line arguments for the program, - * one per list element - */ - void setProgram(const QString &exe, const QStringList &args = QStringList()); - - /** - * @overload - * - * @param argv the program to execute and the command line arguments - * for the program, one per list element - */ - void setProgram(const QStringList &argv); - - /** - * Append an element to the command line argument list for this process. - * - * If no executable is set yet, it will be set instead. - * - * For example, doing an "ls -l /usr/local/bin" can be achieved by: - * \code - * KProcess p; - * p << "ls" << "-l" << "/usr/local/bin"; - * ... - * \endcode - * - * This function must be called before starting the process, obviously. - * - * @param arg the argument to add - * @return a reference to this KProcess - */ - KProcess &operator<<(const QString& arg); - - /** - * @overload - * - * @param args the arguments to add - * @return a reference to this KProcess - */ - KProcess &operator<<(const QStringList& args); - - /** - * Clear the program and command line argument list. - */ - void clearProgram(); - - /** - * Set a command to execute through a shell (a POSIX sh on *NIX - * and cmd.exe on Windows). - * - * Using this for anything but user-supplied commands is usually a bad - * idea, as the command's syntax depends on the platform. - * Redirections including pipes, etc. are better handled by the - * respective functions provided by QProcess. - * - * If KProcess determines that the command does not really need a - * shell, it will trasparently execute it without one for performance - * reasons. - * - * This function must be called before starting the process, obviously. - * - * @param cmd the command to execute through a shell. - * The caller must make sure that all filenames etc. are properly - * quoted when passed as argument. Failure to do so often results in - * serious security holes. See KShell::quoteArg(). - */ - void setShellCommand(const QString &cmd); - - /** - * Obtain the currently set program and arguments. - * - * @return a list, the first element being the program, the remaining ones - * being command line arguments to the program. - */ - QStringList program() const; - - /** - * Start the process. - * - * @see QProcess::start(const QString &, const QStringList &, OpenMode) - */ - void start(); - - /** - * Start the process, wait for it to finish, and return the exit code. - * - * This method is roughly equivalent to the sequence: - * <code> - * start(); - * waitForFinished(msecs); - * return exitCode(); - * </code> - * - * Unlike the other execute() variants this method is not static, - * so the process can be parametrized properly and talked to. - * - * @param msecs time to wait for process to exit before killing it - * @return -2 if the process could not be started, -1 if it crashed, - * otherwise its exit code - */ - int execute(int msecs = -1); - - /** - * @overload - * - * @param exe the program to execute - * @param args the command line arguments for the program, - * one per list element - * @param msecs time to wait for process to exit before killing it - * @return -2 if the process could not be started, -1 if it crashed, - * otherwise its exit code - */ - static int execute(const QString &exe, const QStringList &args = QStringList(), int msecs = -1); - - /** - * @overload - * - * @param argv the program to execute and the command line arguments - * for the program, one per list element - * @param msecs time to wait for process to exit before killing it - * @return -2 if the process could not be started, -1 if it crashed, - * otherwise its exit code - */ - static int execute(const QStringList &argv, int msecs = -1); - - /** - * Start the process and detach from it. See QProcess::startDetached() - * for details. - * - * Unlike the other startDetached() variants this method is not static, - * so the process can be parametrized properly. - * @note Currently, only the setProgram()/setShellCommand() and - * setWorkingDirectory() parametrizations are supported. - * - * The KProcess object may be re-used immediately after calling this - * function. - * - * @return the PID of the started process or 0 on error - */ - int startDetached(); - - /** - * @overload - * - * @param exe the program to start - * @param args the command line arguments for the program, - * one per list element - * @return the PID of the started process or 0 on error - */ - static int startDetached(const QString &exe, const QStringList &args = QStringList()); - - /** - * @overload - * - * @param argv the program to start and the command line arguments - * for the program, one per list element - * @return the PID of the started process or 0 on error - */ - static int startDetached(const QStringList &argv); - - /** - * Obtain the process' ID as known to the system. - * - * Unlike with QProcess::pid(), this is a real PID also on Windows. - * - * This function can be called only while the process is running. - * It cannot be applied to detached processes. - * - * @return the process ID - */ - int pid() const; - -protected: - /** - * @internal - */ - KProcess(KProcessPrivate *d, QObject *parent); - - /** - * @internal - */ - KProcessPrivate * const d_ptr; - -private: - // hide those - using QProcess::setReadChannelMode; - using QProcess::readChannelMode; - using QProcess::setProcessChannelMode; - using QProcess::processChannelMode; - - Q_PRIVATE_SLOT(d_func(), void _k_forwardStdout()) - Q_PRIVATE_SLOT(d_func(), void _k_forwardStderr()) -}; - -#include "kprocess_p.h" - -#endif -
deleted file mode 100644 --- a/gui//src/kprocess_p.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef KPROCESS_P_H -#define KPROCESS_P_H -class KProcess; -class KProcessPrivate; - -#include "kprocess.h" -class KProcessPrivate { - Q_DECLARE_PUBLIC(KProcess) -protected: - KProcessPrivate() : - openMode(QIODevice::ReadWrite) - { - } - void writeAll(const QByteArray &buf, int fd); - void forwardStd(KProcess::ProcessChannel good, int fd); - void _k_forwardStdout(); - void _k_forwardStderr(); - - QString prog; - QStringList args; - KProcess::OutputChannelMode outputChannelMode; - QIODevice::OpenMode openMode; - - KProcess *q_ptr; -}; - - -#endif
deleted file mode 100644 --- a/gui//src/kpty.cpp +++ /dev/null @@ -1,710 +0,0 @@ -/* - - This file is part of the KDE libraries - Copyright (C) 2002 Waldo Bastian <bastian@kde.org> - Copyright (C) 2002-2003,2007-2008 Oswald Buddenhagen <ossi@kde.org> - Copyright (C) 2010 KDE e.V. <kde-ev-board@kde.org> - Author Adriaan de Groot <groot@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include "kpty_p.h" - -#ifdef __sgi -#define __svr4__ -#endif - -#ifdef __osf__ -#define _OSF_SOURCE -#include <float.h> -#endif - -#ifdef _AIX -#define _ALL_SOURCE -#endif - -// __USE_XOPEN isn't defined by default in ICC -// (needed for ptsname(), grantpt() and unlockpt()) -#ifdef __INTEL_COMPILER -# ifndef __USE_XOPEN -# define __USE_XOPEN -# endif -#endif - -#include <sys/types.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/stat.h> -#include <sys/param.h> - -#include <errno.h> -#include <fcntl.h> -#include <time.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <grp.h> - -#if defined(HAVE_PTY_H) -# include <pty.h> -#endif - -#ifdef HAVE_LIBUTIL_H -# include <libutil.h> -#elif defined(HAVE_UTIL_H) -# include <util.h> -#endif - -#define HAVE_UTMPX -#define _UTMPX_COMPAT - -#ifdef HAVE_UTEMPTER -extern "C" { -# include <utempter.h> -} -#else -# include <utmp.h> -# ifdef HAVE_UTMPX -# include <utmpx.h> -# endif -# if !defined(_PATH_UTMPX) && defined(_UTMPX_FILE) -# define _PATH_UTMPX _UTMPX_FILE -# endif -# if !defined(_PATH_WTMPX) && defined(_WTMPX_FILE) -# define _PATH_WTMPX _WTMPX_FILE -# endif -#endif - -/* for HP-UX (some versions) the extern C is needed, and for other - platforms it doesn't hurt */ -extern "C" { -#include <termios.h> -#if defined(HAVE_TERMIO_H) -# include <termio.h> // struct winsize on some systems -#endif -} - -#if defined (_HPUX_SOURCE) -# define _TERMIOS_INCLUDED -# include <bsdtty.h> -#endif - -#ifdef HAVE_SYS_STROPTS_H -# include <sys/stropts.h> // Defines I_PUSH -# define _NEW_TTY_CTRL -#endif - -#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) || defined (__DragonFly__) -# define _tcgetattr(fd, ttmode) ioctl(fd, TIOCGETA, (char *)ttmode) -#else -# if defined(_HPUX_SOURCE) || defined(__Lynx__) || defined (__CYGWIN__) || defined(__sun) -# define _tcgetattr(fd, ttmode) tcgetattr(fd, ttmode) -# else -# define _tcgetattr(fd, ttmode) ioctl(fd, TCGETS, (char *)ttmode) -# endif -#endif - -#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) || defined (__DragonFly__) -# define _tcsetattr(fd, ttmode) ioctl(fd, TIOCSETA, (char *)ttmode) -#else -# if defined(_HPUX_SOURCE) || defined(__CYGWIN__) || defined(__sun) -# define _tcsetattr(fd, ttmode) tcsetattr(fd, TCSANOW, ttmode) -# else -# define _tcsetattr(fd, ttmode) ioctl(fd, TCSETS, (char *)ttmode) -# endif -#endif - -#include <QtCore/Q_PID> - -#define TTY_GROUP "tty" - -#ifndef PATH_MAX -# ifdef MAXPATHLEN -# define PATH_MAX MAXPATHLEN -# else -# define PATH_MAX 1024 -# endif -#endif - -/////////////////////// -// private functions // -/////////////////////// - -////////////////// -// private data // -////////////////// - -KPtyPrivate::KPtyPrivate(KPty* parent) : - masterFd(-1), slaveFd(-1), ownMaster(true), q_ptr(parent) -{ -} - -KPtyPrivate::~KPtyPrivate() -{ -} - -#ifndef HAVE_OPENPTY -bool KPtyPrivate::chownpty(bool grant) -{ - return !QProcess::execute(KStandardDirs::findExe("kgrantpty"), - QStringList() << (grant?"--grant":"--revoke") << QString::number(masterFd)); -} -#endif - -///////////////////////////// -// public member functions // -///////////////////////////// - -KPty::KPty() : - d_ptr(new KPtyPrivate(this)) -{ -} - -KPty::KPty(KPtyPrivate *d) : - d_ptr(d) -{ - d_ptr->q_ptr = this; -} - -KPty::~KPty() -{ - close(); - delete d_ptr; -} - -bool KPty::open() -{ - Q_D(KPty); - - if (d->masterFd >= 0) - return true; - - d->ownMaster = true; - - QByteArray ptyName; - - // Find a master pty that we can open //////////////////////////////// - - // Because not all the pty animals are created equal, they want to - // be opened by several different methods. - - // We try, as we know them, one by one. - -#ifdef HAVE_OPENPTY - - char ptsn[PATH_MAX]; - if (::openpty( &d->masterFd, &d->slaveFd, ptsn, 0, 0)) - { - d->masterFd = -1; - d->slaveFd = -1; - //kWarning(175) << "Can't open a pseudo teletype"; - return false; - } - d->ttyName = ptsn; - -#else - -#ifdef HAVE__GETPTY // irix - - char *ptsn = _getpty(&d->masterFd, O_RDWR|O_NOCTTY, S_IRUSR|S_IWUSR, 0); - if (ptsn) { - d->ttyName = ptsn; - goto grantedpt; - } - -#elif defined(HAVE_PTSNAME) || defined(TIOCGPTN) - -#ifdef HAVE_POSIX_OPENPT - d->masterFd = ::posix_openpt(O_RDWR|O_NOCTTY); -#elif defined(HAVE_GETPT) - d->masterFd = ::getpt(); -#elif defined(PTM_DEVICE) - //d->masterFd = KDE_open(PTM_DEVICE, O_RDWR|O_NOCTTY); -d->masterFd = ::open(PTM_DEVICE, O_RDWR|O_NOCTTY); -#else -# error No method to open a PTY master detected. -#endif - if (d->masterFd >= 0) - { -#ifdef HAVE_PTSNAME - char *ptsn = ptsname(d->masterFd); - if (ptsn) { - d->ttyName = ptsn; -#else - int ptyno; - if (!ioctl(d->masterFd, TIOCGPTN, &ptyno)) { - char buf[32]; - sprintf(buf, "/dev/pts/%d", ptyno); - d->ttyName = buf; -#endif -#ifdef HAVE_GRANTPT - if (!grantpt(d->masterFd)) - goto grantedpt; -#else - goto gotpty; -#endif - } - ::close(d->masterFd); - d->masterFd = -1; - } -#endif // HAVE_PTSNAME || TIOCGPTN - - // Linux device names, FIXME: Trouble on other systems? - for (const char* s3 = "pqrstuvwxyzabcde"; *s3; s3++) - { - for (const char* s4 = "0123456789abcdef"; *s4; s4++) - { - ptyName = QString().sprintf("/dev/pty%c%c", *s3, *s4).toAscii(); - d->ttyName = QString().sprintf("/dev/tty%c%c", *s3, *s4).toAscii(); - - d->masterFd = ::open(ptyName.data(), O_RDWR); - if (d->masterFd >= 0) - { -#ifdef Q_OS_SOLARIS - /* Need to check the process group of the pty. - * If it exists, then the slave pty is in use, - * and we need to get another one. - */ - int pgrp_rtn; - if (ioctl(d->masterFd, TIOCGPGRP, &pgrp_rtn) == 0 || errno != EIO) { - ::close(d->masterFd); - d->masterFd = -1; - continue; - } -#endif /* Q_OS_SOLARIS */ - if (!access(d->ttyName.data(),R_OK|W_OK)) // checks availability based on permission bits - { - if (!geteuid()) - { - struct group* p = getgrnam(TTY_GROUP); - if (!p) - p = getgrnam("wheel"); - gid_t gid = p ? p->gr_gid : getgid (); - - chown(d->ttyName.data(), getuid(), gid); - chmod(d->ttyName.data(), S_IRUSR|S_IWUSR|S_IWGRP); - } - goto gotpty; - } - ::close(d->masterFd); - d->masterFd = -1; - } - } - } - - //kWarning(175) << "Can't open a pseudo teletype"; - return false; - - gotpty: - KDE_struct_stat st; - if (KDE_stat(d->ttyName.data(), &st)) - return false; // this just cannot happen ... *cough* Yeah right, I just - // had it happen when pty #349 was allocated. I guess - // there was some sort of leak? I only had a few open. - if (((st.st_uid != getuid()) || - (st.st_mode & (S_IRGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH))) && - !d->chownpty(true)) - { - - /*kWarning(175) - << "chownpty failed for device " << ptyName << "::" << d->ttyName - << "\nThis means the communication can be eavesdropped." << endl; -*/ -} - - grantedpt: - -#ifdef HAVE_REVOKE - revoke(d->ttyName.data()); -#endif - -#ifdef HAVE_UNLOCKPT - unlockpt(d->masterFd); -#elif defined(TIOCSPTLCK) - int flag = 0; - ioctl(d->masterFd, TIOCSPTLCK, &flag); -#endif - - d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY); - if (d->slaveFd < 0) - { - //kWarning(175) << "Can't open slave pseudo teletype"; - ::close(d->masterFd); - d->masterFd = -1; - return false; - } - -#if (defined(__svr4__) || defined(__sgi__) || defined(Q_OS_SOLARIS)) - // Solaris uses STREAMS for terminal handling. It is possible - // for the pty handling modules to be left off the stream; in that - // case push them on. ioctl(fd, I_FIND, ...) is documented to return - // 1 if the module is on the stream already. - { - static const char *pt = "ptem"; - static const char *ld = "ldterm"; - if (ioctl(d->slaveFd, I_FIND, pt) == 0) - ioctl(d->slaveFd, I_PUSH, pt); - if (ioctl(d->slaveFd, I_FIND, ld) == 0) - ioctl(d->slaveFd, I_PUSH, ld); - } -#endif - -#endif /* HAVE_OPENPTY */ - - fcntl(d->masterFd, F_SETFD, FD_CLOEXEC); - fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC); - - return true; -} - -bool KPty::open(int fd) -{ -#if !defined(HAVE_PTSNAME) && !defined(TIOCGPTN) - //kWarning(175) << "Unsupported attempt to open pty with fd" << fd; - return false; -#else - Q_D(KPty); - - if (d->masterFd >= 0) { - //kWarning(175) << "Attempting to open an already open pty"; - return false; - } - - d->ownMaster = false; - -# ifdef HAVE_PTSNAME - char *ptsn = ptsname(fd); - if (ptsn) { - d->ttyName = ptsn; -# else - int ptyno; - if (!ioctl(fd, TIOCGPTN, &ptyno)) { - char buf[32]; - sprintf(buf, "/dev/pts/%d", ptyno); - d->ttyName = buf; -# endif - } else { - //kWarning(175) << "Failed to determine pty slave device for fd" << fd; - return false; - } - - d->masterFd = fd; - if (!openSlave()) { - d->masterFd = -1; - return false; - } - - return true; -#endif -} - -void KPty::closeSlave() -{ - Q_D(KPty); - - if (d->slaveFd < 0) - return; - ::close(d->slaveFd); - d->slaveFd = -1; -} - -bool KPty::openSlave() -{ - Q_D(KPty); - - if (d->slaveFd >= 0) - return true; - if (d->masterFd < 0) { - //kWarning(175) << "Attempting to open pty slave while master is closed"; - return false; - } - d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY); - if (d->slaveFd < 0) { - //kWarning(175) << "Can't open slave pseudo teletype"; - return false; - } - fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC); - return true; -} - -void KPty::close() -{ - Q_D(KPty); - - if (d->masterFd < 0) - return; - closeSlave(); - if (d->ownMaster) { -#ifndef HAVE_OPENPTY - // don't bother resetting unix98 pty, it will go away after closing master anyway. - if (memcmp(d->ttyName.data(), "/dev/pts/", 9)) { - if (!geteuid()) { - struct stat st; - if (!stat(d->ttyName.data(), &st)) { - chown(d->ttyName.data(), 0, st.st_gid == getgid() ? 0 : -1); - chmod(d->ttyName.data(), S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); - } - } else { - fcntl(d->masterFd, F_SETFD, 0); - d->chownpty(false); - } - } -#endif - ::close(d->masterFd); - } - d->masterFd = -1; -} - -void KPty::setCTty() -{ - Q_D(KPty); - - // Setup job control ////////////////////////////////// - - // Become session leader, process group leader, - // and get rid of the old controlling terminal. - setsid(); - - // make our slave pty the new controlling terminal. -#ifdef TIOCSCTTY - ioctl(d->slaveFd, TIOCSCTTY, 0); -#else - // __svr4__ hack: the first tty opened after setsid() becomes controlling tty - ::close(open(d->ttyName, O_WRONLY, 0)); -#endif - - // make our new process group the foreground group on the pty - int pgrp = getpid(); -#if defined(_POSIX_VERSION) || defined(__svr4__) - tcsetpgrp(d->slaveFd, pgrp); -#elif defined(TIOCSPGRP) - ioctl(d->slaveFd, TIOCSPGRP, (char *)&pgrp); -#endif -} - -void KPty::login(const char *user, const char *remotehost) -{ -#ifdef HAVE_UTEMPTER - Q_D(KPty); - - addToUtmp(d->ttyName, remotehost, d->masterFd); - Q_UNUSED(user); -#else -# ifdef HAVE_UTMPX - struct utmpx l_struct; -# else - struct utmp l_struct; -# endif - memset(&l_struct, 0, sizeof(l_struct)); - // note: strncpy without terminators _is_ correct here. man 4 utmp - - if (user) - strncpy(l_struct.ut_name, user, sizeof(l_struct.ut_name)); - - if (remotehost) { - strncpy(l_struct.ut_host, remotehost, sizeof(l_struct.ut_host)); -# ifdef HAVE_STRUCT_UTMP_UT_SYSLEN - l_struct.ut_syslen = qMin(strlen(remotehost), sizeof(l_struct.ut_host)); -# endif - } - -# ifndef __GLIBC__ - Q_D(KPty); - const char *str_ptr = d->ttyName.data(); - if (!memcmp(str_ptr, "/dev/", 5)) - str_ptr += 5; - strncpy(l_struct.ut_line, str_ptr, sizeof(l_struct.ut_line)); -# ifdef HAVE_STRUCT_UTMP_UT_ID - strncpy(l_struct.ut_id, - str_ptr + strlen(str_ptr) - sizeof(l_struct.ut_id), - sizeof(l_struct.ut_id)); -# endif -# endif - -# ifdef HAVE_UTMPX - //gettimeofday(&l_struct.ut_tv, 0); - gettimeofday((struct timeval *)&l_struct.ut_tv, 0); -# else - l_struct.ut_time = time(0); -# endif - -# ifdef HAVE_LOGIN -# ifdef HAVE_LOGINX - ::loginx(&l_struct); -# else - ::login(&l_struct); -# endif -# else -# ifdef HAVE_STRUCT_UTMP_UT_TYPE - l_struct.ut_type = USER_PROCESS; -# endif -# ifdef HAVE_STRUCT_UTMP_UT_PID - l_struct.ut_pid = getpid(); -# ifdef HAVE_STRUCT_UTMP_UT_SESSION - l_struct.ut_session = getsid(0); -# endif -# endif -# ifdef HAVE_UTMPX - utmpxname(_PATH_UTMPX); - setutxent(); - pututxline(&l_struct); - endutxent(); - //updwtmpx(_PATH_WTMPX, &l_struct); -# else - utmpname(_PATH_UTMP); - setutent(); - pututline(&l_struct); - endutent(); - updwtmp(_PATH_WTMP, &l_struct); -# endif -# endif -#endif -} - -void KPty::logout() -{ -#ifdef HAVE_UTEMPTER - Q_D(KPty); - - removeLineFromUtmp(d->ttyName, d->masterFd); -#else - Q_D(KPty); - - const char *str_ptr = d->ttyName.data(); - if (!memcmp(str_ptr, "/dev/", 5)) - str_ptr += 5; -# ifdef __GLIBC__ - else { - const char *sl_ptr = strrchr(str_ptr, '/'); - if (sl_ptr) - str_ptr = sl_ptr + 1; - } -# endif -# ifdef HAVE_LOGIN -# ifdef HAVE_LOGINX - ::logoutx(str_ptr, 0, DEAD_PROCESS); -# else - ::logout(str_ptr); -# endif -# else -# ifdef HAVE_UTMPX - struct utmpx l_struct, *ut; -# else - struct utmp l_struct, *ut; -# endif - memset(&l_struct, 0, sizeof(l_struct)); - - strncpy(l_struct.ut_line, str_ptr, sizeof(l_struct.ut_line)); - -# ifdef HAVE_UTMPX - utmpxname(_PATH_UTMPX); - setutxent(); - if ((ut = getutxline(&l_struct))) { -# else - utmpname(_PATH_UTMP); - setutent(); - if ((ut = getutline(&l_struct))) { -# endif - memset(ut->ut_name, 0, sizeof(*ut->ut_name)); - memset(ut->ut_host, 0, sizeof(*ut->ut_host)); -# ifdef HAVE_STRUCT_UTMP_UT_SYSLEN - ut->ut_syslen = 0; -# endif -# ifdef HAVE_STRUCT_UTMP_UT_TYPE - ut->ut_type = DEAD_PROCESS; -# endif -# ifdef HAVE_UTMPX - //gettimeofday(&(ut->ut_tv), 0); - gettimeofday((struct timeval *)&(ut->ut_tv), 0); - pututxline(ut); - } - endutxent(); -# else - ut->ut_time = time(0); - pututline(ut); - } - endutent(); -# endif -# endif -#endif -} - -bool KPty::tcGetAttr(struct ::termios *ttmode) const -{ - Q_D(const KPty); - -#ifdef Q_OS_SOLARIS - if (_tcgetattr(d->slaveFd, ttmode) == 0) return true; -#endif - return _tcgetattr(d->masterFd, ttmode) == 0; -} - -bool KPty::tcSetAttr(struct ::termios *ttmode) -{ - Q_D(KPty); - -#ifdef Q_OS_SOLARIS - if (_tcsetattr(d->slaveFd, ttmode) == 0) return true; -#endif - return _tcsetattr(d->masterFd, ttmode) == 0; -} - -bool KPty::setWinSize(int lines, int columns) -{ - Q_D(KPty); - - struct winsize winSize; - memset(&winSize, 0, sizeof(winSize)); - winSize.ws_row = (unsigned short)lines; - winSize.ws_col = (unsigned short)columns; - return ioctl(d->masterFd, TIOCSWINSZ, (char *)&winSize) == 0; -} - -bool KPty::setEcho(bool echo) -{ - struct ::termios ttmode; - if (!tcGetAttr(&ttmode)) - return false; - if (!echo) - ttmode.c_lflag &= ~ECHO; - else - ttmode.c_lflag |= ECHO; - return tcSetAttr(&ttmode); -} - -const char *KPty::ttyName() const -{ - Q_D(const KPty); - - return d->ttyName.data(); -} - -int KPty::masterFd() const -{ - Q_D(const KPty); - - return d->masterFd; -} - -int KPty::slaveFd() const -{ - Q_D(const KPty); - - return d->slaveFd; -}
deleted file mode 100644 --- a/gui//src/kpty.h +++ /dev/null @@ -1,204 +0,0 @@ -/* This file is part of the KDE libraries - - Copyright (C) 2003,2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef kpty_h -#define kpty_h -#include <QtCore/qglobal.h> - -struct KPtyPrivate; -struct termios; - -/** - * Provides primitives for opening & closing a pseudo TTY pair, assigning the - * controlling TTY, utmp registration and setting various terminal attributes. - */ -class KPty { - Q_DECLARE_PRIVATE(KPty) - -public: - - /** - * Constructor - */ - KPty(); - - /** - * Destructor: - * - * If the pty is still open, it will be closed. Note, however, that - * an utmp registration is @em not undone. - */ - ~KPty(); - - /** - * Create a pty master/slave pair. - * - * @return true if a pty pair was successfully opened - */ - bool open(); - - /** - * Open using an existing pty master. - * - * @param fd an open pty master file descriptor. - * The ownership of the fd remains with the caller; - * it will not be automatically closed at any point. - * @return true if a pty pair was successfully opened - */ - bool open(int fd); - - /** - * Close the pty master/slave pair. - */ - void close(); - - /** - * Close the pty slave descriptor. - * - * When creating the pty, KPty also opens the slave and keeps it open. - * Consequently the master will never receive an EOF notification. - * Usually this is the desired behavior, as a closed pty slave can be - * reopened any time - unlike a pipe or socket. However, in some cases - * pipe-alike behavior might be desired. - * - * After this function was called, slaveFd() and setCTty() cannot be - * used. - */ - void closeSlave(); - - /** - * Open the pty slave descriptor. - * - * This undoes the effect of closeSlave(). - * - * @return true if the pty slave was successfully opened - */ - bool openSlave(); - - /** - * Creates a new session and process group and makes this pty the - * controlling tty. - */ - void setCTty(); - - /** - * Creates an utmp entry for the tty. - * This function must be called after calling setCTty and - * making this pty the stdin. - * @param user the user to be logged on - * @param remotehost the host from which the login is coming. This is - * @em not the local host. For remote logins it should be the hostname - * of the client. For local logins from inside an X session it should - * be the name of the X display. Otherwise it should be empty. - */ - void login(const char *user = 0, const char *remotehost = 0); - - /** - * Removes the utmp entry for this tty. - */ - void logout(); - - /** - * Wrapper around tcgetattr(3). - * - * This function can be used only while the PTY is open. - * You will need an #include <termios.h> to do anything useful - * with it. - * - * @param ttmode a pointer to a termios structure. - * Note: when declaring ttmode, @c struct @c ::termios must be used - - * without the '::' some version of HP-UX thinks, this declares - * the struct in your class, in your method. - * @return @c true on success, false otherwise - */ - bool tcGetAttr(struct ::termios *ttmode) const; - - /** - * Wrapper around tcsetattr(3) with mode TCSANOW. - * - * This function can be used only while the PTY is open. - * - * @param ttmode a pointer to a termios structure. - * @return @c true on success, false otherwise. Note that success means - * that @em at @em least @em one attribute could be set. - */ - bool tcSetAttr(struct ::termios *ttmode); - - /** - * Change the logical (screen) size of the pty. - * The default is 24 lines by 80 columns. - * - * This function can be used only while the PTY is open. - * - * @param lines the number of rows - * @param columns the number of columns - * @return @c true on success, false otherwise - */ - bool setWinSize(int lines, int columns); - - /** - * Set whether the pty should echo input. - * - * Echo is on by default. - * If the output of automatically fed (non-interactive) PTY clients - * needs to be parsed, disabling echo often makes it much simpler. - * - * This function can be used only while the PTY is open. - * - * @param echo true if input should be echoed. - * @return @c true on success, false otherwise - */ - bool setEcho(bool echo); - - /** - * @return the name of the slave pty device. - * - * This function should be called only while the pty is open. - */ - const char *ttyName() const; - - /** - * @return the file descriptor of the master pty - * - * This function should be called only while the pty is open. - */ - int masterFd() const; - - /** - * @return the file descriptor of the slave pty - * - * This function should be called only while the pty slave is open. - */ - int slaveFd() const; - -protected: - /** - * @internal - */ - KPty(KPtyPrivate *d); - - /** - * @internal - */ - KPtyPrivate * const d_ptr; -}; - -#endif -
deleted file mode 100644 --- a/gui//src/kpty_export.h +++ /dev/null @@ -1,46 +0,0 @@ -/* This file is part of the KDE project - Copyright (C) 2007 David Faure <faure@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef KPTY_EXPORT_H -#define KPTY_EXPORT_H - -/* needed for KDE_EXPORT and KDE_IMPORT macros */ -//#include <kdemacros.h> -#include <QtCore/qglobal.h> -#define KDE_EXPORT -#define KDE_IMPORT - -#ifndef KPTY_EXPORT -# if defined(KDELIBS_STATIC_LIBS) - /* No export/import for static libraries */ -# define KPTY_EXPORT -# elif defined(MAKE_KDECORE_LIB) - /* We are building this library */ -# define KPTY_EXPORT KDE_EXPORT -# else - /* We are using this library */ -# define KPTY_EXPORT KDE_IMPORT -# endif -#endif - -# ifndef KPTY_EXPORT_DEPRECATED -# define KPTY_EXPORT_DEPRECATED KDE_DEPRECATED KPTY_EXPORT -# endif - -#endif
deleted file mode 100644 --- a/gui//src/kpty_p.h +++ /dev/null @@ -1,58 +0,0 @@ -/* This file is part of the KDE libraries - - Copyright (C) 2003,2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef kpty_p_h -#define kpty_p_h - -#include "kpty.h" - -#if defined(Q_OS_MAC) -#define HAVE_UTIL_H -#define HAVE_UTMPX -#define _UTMPX_COMPAT -#define HAVE_PTSNAME -#define HAVE_SYS_TIME_H -#else -#define HAVE_PTY_H -#endif - -#define HAVE_OPENPTY - -#include <QtCore/QByteArray> - -struct KPtyPrivate { - Q_DECLARE_PUBLIC(KPty) - - KPtyPrivate(KPty* parent); - virtual ~KPtyPrivate(); -#ifndef HAVE_OPENPTY - bool chownpty(bool grant); -#endif - - int masterFd; - int slaveFd; - bool ownMaster:1; - - QByteArray ttyName; - - KPty *q_ptr; -}; - -#endif
deleted file mode 100644 --- a/gui//src/kptydevice.cpp +++ /dev/null @@ -1,413 +0,0 @@ -/* - - This file is part of the KDE libraries - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - Copyright (C) 2010 KDE e.V. <kde-ev-board@kde.org> - Author Adriaan de Groot <groot@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include "kptydevice.h" -#include "kpty_p.h" -#define i18n - -#include <QtCore/QSocketNotifier> - -#include <unistd.h> -#include <errno.h> -#include <signal.h> -#include <termios.h> -#include <fcntl.h> -#include <sys/ioctl.h> -#ifdef HAVE_SYS_FILIO_H -# include <sys/filio.h> -#endif -#ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -#endif - -#if defined(Q_OS_FREEBSD) || defined(Q_OS_MAC) - // "the other end's output queue size" - kinda braindead, huh? -# define PTY_BYTES_AVAILABLE TIOCOUTQ -#elif defined(TIOCINQ) - // "our end's input queue size" -# define PTY_BYTES_AVAILABLE TIOCINQ -#else - // likewise. more generic ioctl (theoretically) -# define PTY_BYTES_AVAILABLE FIONREAD -#endif - -////////////////// -// private data // -////////////////// - -// Lifted from Qt. I don't think they would mind. ;) -// Re-lift again from Qt whenever a proper replacement for pthread_once appears -static void qt_ignore_sigpipe() -{ - static QBasicAtomicInt atom = Q_BASIC_ATOMIC_INITIALIZER(0); - if (atom.testAndSetRelaxed(0, 1)) { - struct sigaction noaction; - memset(&noaction, 0, sizeof(noaction)); - noaction.sa_handler = SIG_IGN; - sigaction(SIGPIPE, &noaction, 0); - } -} - -#define NO_INTR(ret,func) do { ret = func; } while (ret < 0 && errno == EINTR) - -bool KPtyDevicePrivate::_k_canRead() -{ - Q_Q(KPtyDevice); - qint64 readBytes = 0; - -#ifdef Q_OS_IRIX // this should use a config define, but how to check it? - size_t available; -#else - int available; -#endif - if (!::ioctl(q->masterFd(), PTY_BYTES_AVAILABLE, (char *) &available)) { -#ifdef Q_OS_SOLARIS - // A Pty is a STREAMS module, and those can be activated - // with 0 bytes available. This happens either when ^C is - // pressed, or when an application does an explicit write(a,b,0) - // which happens in experiments fairly often. When 0 bytes are - // available, you must read those 0 bytes to clear the STREAMS - // module, but we don't want to hit the !readBytes case further down. - if (!available) { - char c; - // Read the 0-byte STREAMS message - NO_INTR(readBytes, read(q->masterFd(), &c, 0)); - // Should return 0 bytes read; -1 is error - if (readBytes < 0) { - readNotifier->setEnabled(false); - emit q->readEof(); - return false; - } - return true; - } -#endif - - char *ptr = readBuffer.reserve(available); -#ifdef Q_OS_SOLARIS - // Even if available > 0, it is possible for read() - // to return 0 on Solaris, due to 0-byte writes in the stream. - // Ignore them and keep reading until we hit *some* data. - // In Solaris it is possible to have 15 bytes available - // and to (say) get 0, 0, 6, 0 and 9 bytes in subsequent reads. - // Because the stream is set to O_NONBLOCK in finishOpen(), - // an EOF read will return -1. - readBytes = 0; - while (!readBytes) -#endif - // Useless block braces except in Solaris - { - NO_INTR(readBytes, read(q->masterFd(), ptr, available)); - } - if (readBytes < 0) { - readBuffer.unreserve(available); - q->setErrorString(i18n("Error reading from PTY")); - return false; - } - readBuffer.unreserve(available - readBytes); // *should* be a no-op - } - - if (!readBytes) { - readNotifier->setEnabled(false); - emit q->readEof(); - return false; - } else { - if (!emittedReadyRead) { - emittedReadyRead = true; - emit q->readyRead(); - emittedReadyRead = false; - } - return true; - } -} - -bool KPtyDevicePrivate::_k_canWrite() -{ - Q_Q(KPtyDevice); - - writeNotifier->setEnabled(false); - if (writeBuffer.isEmpty()) - return false; - - qt_ignore_sigpipe(); - int wroteBytes; - NO_INTR(wroteBytes, - write(q->masterFd(), - writeBuffer.readPointer(), writeBuffer.readSize())); - if (wroteBytes < 0) { - q->setErrorString(i18n("Error writing to PTY")); - return false; - } - writeBuffer.free(wroteBytes); - - if (!emittedBytesWritten) { - emittedBytesWritten = true; - emit q->bytesWritten(wroteBytes); - emittedBytesWritten = false; - } - - if (!writeBuffer.isEmpty()) - writeNotifier->setEnabled(true); - return true; -} - -#ifndef timeradd -// Lifted from GLIBC -# define timeradd(a, b, result) \ - do { \ - (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \ - (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \ - if ((result)->tv_usec >= 1000000) { \ - ++(result)->tv_sec; \ - (result)->tv_usec -= 1000000; \ - } \ - } while (0) -# define timersub(a, b, result) \ - do { \ - (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ - (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ - if ((result)->tv_usec < 0) { \ - --(result)->tv_sec; \ - (result)->tv_usec += 1000000; \ - } \ - } while (0) -#endif - -bool KPtyDevicePrivate::doWait(int msecs, bool reading) -{ - Q_Q(KPtyDevice); -#ifndef __linux__ - struct timeval etv; -#endif - struct timeval tv, *tvp; - - if (msecs < 0) - tvp = 0; - else { - tv.tv_sec = msecs / 1000; - tv.tv_usec = (msecs % 1000) * 1000; -#ifndef __linux__ - gettimeofday(&etv, 0); - timeradd(&tv, &etv, &etv); -#endif - tvp = &tv; - } - - while (reading ? readNotifier->isEnabled() : !writeBuffer.isEmpty()) { - fd_set rfds; - fd_set wfds; - - FD_ZERO(&rfds); - FD_ZERO(&wfds); - - if (readNotifier->isEnabled()) - FD_SET(q->masterFd(), &rfds); - if (!writeBuffer.isEmpty()) - FD_SET(q->masterFd(), &wfds); - -#ifndef __linux__ - if (tvp) { - gettimeofday(&tv, 0); - timersub(&etv, &tv, &tv); - if (tv.tv_sec < 0) - tv.tv_sec = tv.tv_usec = 0; - } -#endif - - switch (select(q->masterFd() + 1, &rfds, &wfds, 0, tvp)) { - case -1: - if (errno == EINTR) - break; - return false; - case 0: - q->setErrorString(i18n("PTY operation timed out")); - return false; - default: - if (FD_ISSET(q->masterFd(), &rfds)) { - bool canRead = _k_canRead(); - if (reading && canRead) - return true; - } - if (FD_ISSET(q->masterFd(), &wfds)) { - bool canWrite = _k_canWrite(); - if (!reading) - return canWrite; - } - break; - } - } - return false; -} - -void KPtyDevicePrivate::finishOpen(QIODevice::OpenMode mode) -{ - Q_Q(KPtyDevice); - - q->QIODevice::open(mode); - fcntl(q->masterFd(), F_SETFL, O_NONBLOCK); - readBuffer.clear(); - readNotifier = new QSocketNotifier(q->masterFd(), QSocketNotifier::Read, q); - writeNotifier = new QSocketNotifier(q->masterFd(), QSocketNotifier::Write, q); - QObject::connect(readNotifier, SIGNAL(activated(int)), q, SLOT(_k_canRead())); - QObject::connect(writeNotifier, SIGNAL(activated(int)), q, SLOT(_k_canWrite())); - readNotifier->setEnabled(true); -} - -///////////////////////////// -// public member functions // -///////////////////////////// - -KPtyDevice::KPtyDevice(QObject *parent) : - QIODevice(parent), - KPty(new KPtyDevicePrivate(this)) -{ -} - -KPtyDevice::~KPtyDevice() -{ - close(); -} - -bool KPtyDevice::open(OpenMode mode) -{ - Q_D(KPtyDevice); - - if (masterFd() >= 0) - return true; - - if (!KPty::open()) { - setErrorString(i18n("Error opening PTY")); - return false; - } - - d->finishOpen(mode); - - return true; -} - -bool KPtyDevice::open(int fd, OpenMode mode) -{ - Q_D(KPtyDevice); - - if (!KPty::open(fd)) { - setErrorString(i18n("Error opening PTY")); - return false; - } - - d->finishOpen(mode); - - return true; -} - -void KPtyDevice::close() -{ - Q_D(KPtyDevice); - - if (masterFd() < 0) - return; - - delete d->readNotifier; - delete d->writeNotifier; - - QIODevice::close(); - - KPty::close(); -} - -bool KPtyDevice::isSequential() const -{ - return true; -} - -bool KPtyDevice::canReadLine() const -{ - Q_D(const KPtyDevice); - return QIODevice::canReadLine() || d->readBuffer.canReadLine(); -} - -bool KPtyDevice::atEnd() const -{ - Q_D(const KPtyDevice); - return QIODevice::atEnd() && d->readBuffer.isEmpty(); -} - -qint64 KPtyDevice::bytesAvailable() const -{ - Q_D(const KPtyDevice); - return QIODevice::bytesAvailable() + d->readBuffer.size(); -} - -qint64 KPtyDevice::bytesToWrite() const -{ - Q_D(const KPtyDevice); - return d->writeBuffer.size(); -} - -bool KPtyDevice::waitForReadyRead(int msecs) -{ - Q_D(KPtyDevice); - return d->doWait(msecs, true); -} - -bool KPtyDevice::waitForBytesWritten(int msecs) -{ - Q_D(KPtyDevice); - return d->doWait(msecs, false); -} - -void KPtyDevice::setSuspended(bool suspended) -{ - Q_D(KPtyDevice); - d->readNotifier->setEnabled(!suspended); -} - -bool KPtyDevice::isSuspended() const -{ - Q_D(const KPtyDevice); - return !d->readNotifier->isEnabled(); -} - -// protected -qint64 KPtyDevice::readData(char *data, qint64 maxlen) -{ - Q_D(KPtyDevice); - return d->readBuffer.read(data, (int)qMin<qint64>(maxlen, KMAXINT)); -} - -// protected -qint64 KPtyDevice::readLineData(char *data, qint64 maxlen) -{ - Q_D(KPtyDevice); - return d->readBuffer.readLine(data, (int)qMin<qint64>(maxlen, KMAXINT)); -} - -// protected -qint64 KPtyDevice::writeData(const char *data, qint64 len) -{ - Q_D(KPtyDevice); - Q_ASSERT(len <= KMAXINT); - - d->writeBuffer.write(data, len); - d->writeNotifier->setEnabled(true); - return len; -} -
deleted file mode 100644 --- a/gui//src/kptydevice.h +++ /dev/null @@ -1,353 +0,0 @@ -/* This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef kptydev_h -#define kptydev_h - -struct KPtyPrivate; -struct KPtyDevicePrivate; - -#include "kpty.h" -#include "kpty_p.h" -#include <QtCore/QIODevice> -#include <QSocketNotifier> - -#define Q_DECLARE_PRIVATE_MI(Class, SuperClass) \ - inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(SuperClass::d_ptr); } \ - inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(SuperClass::d_ptr); } \ - friend class Class##Private; - -/** - * Encapsulates KPty into a QIODevice, so it can be used with Q*Stream, etc. - */ -class KPtyDevice : public QIODevice, public KPty { //krazy:exclude=dpointer (via macro) - Q_OBJECT - Q_DECLARE_PRIVATE_MI(KPtyDevice, KPty) - -public: - - /** - * Constructor - */ - KPtyDevice(QObject *parent = 0); - - /** - * Destructor: - * - * If the pty is still open, it will be closed. Note, however, that - * an utmp registration is @em not undone. - */ - virtual ~KPtyDevice(); - - /** - * Create a pty master/slave pair. - * - * @return true if a pty pair was successfully opened - */ - virtual bool open(OpenMode mode = ReadWrite | Unbuffered); - - /** - * Open using an existing pty master. The ownership of the fd - * remains with the caller, i.e., close() will not close the fd. - * - * This is useful if you wish to attach a secondary "controller" to an - * existing pty device such as a terminal widget. - * Note that you will need to use setSuspended() on both devices to - * control which one gets the incoming data from the pty. - * - * @param fd an open pty master file descriptor. - * @param mode the device mode to open the pty with. - * @return true if a pty pair was successfully opened - */ - bool open(int fd, OpenMode mode = ReadWrite | Unbuffered); - - /** - * Close the pty master/slave pair. - */ - virtual void close(); - - /** - * Sets whether the KPtyDevice monitors the pty for incoming data. - * - * When the KPtyDevice is suspended, it will no longer attempt to buffer - * data that becomes available from the pty and it will not emit any - * signals. - * - * Do not use on closed ptys. - * After a call to open(), the pty is not suspended. If you need to - * ensure that no data is read, call this function before the main loop - * is entered again (i.e., immediately after opening the pty). - */ - void setSuspended(bool suspended); - - /** - * Returns true if the KPtyDevice is not monitoring the pty for incoming - * data. - * - * Do not use on closed ptys. - * - * See setSuspended() - */ - bool isSuspended() const; - - /** - * @return always true - */ - virtual bool isSequential() const; - - /** - * @reimp - */ - bool canReadLine() const; - - /** - * @reimp - */ - bool atEnd() const; - - /** - * @reimp - */ - qint64 bytesAvailable() const; - - /** - * @reimp - */ - qint64 bytesToWrite() const; - - bool waitForBytesWritten(int msecs = -1); - bool waitForReadyRead(int msecs = -1); - - -Q_SIGNALS: - /** - * Emitted when EOF is read from the PTY. - * - * Data may still remain in the buffers. - */ - void readEof(); - -protected: - virtual qint64 readData(char *data, qint64 maxSize); - virtual qint64 readLineData(char *data, qint64 maxSize); - virtual qint64 writeData(const char *data, qint64 maxSize); - -private: - Q_PRIVATE_SLOT(d_func(), bool _k_canRead()) - Q_PRIVATE_SLOT(d_func(), bool _k_canWrite()) -}; - -#define KMAXINT ((int)(~0U >> 1)) - -///////////////////////////////////////////////////// -// Helper. Remove when QRingBuffer becomes public. // -///////////////////////////////////////////////////// - -#include <QtCore/qbytearray.h> -#include <QtCore/qlinkedlist.h> - -#define CHUNKSIZE 4096 - -class KRingBuffer -{ -public: - KRingBuffer() - { - clear(); - } - - void clear() - { - buffers.clear(); - QByteArray tmp; - tmp.resize(CHUNKSIZE); - buffers << tmp; - head = tail = 0; - totalSize = 0; - } - - inline bool isEmpty() const - { - return buffers.count() == 1 && !tail; - } - - inline int size() const - { - return totalSize; - } - - inline int readSize() const - { - return (buffers.count() == 1 ? tail : buffers.first().size()) - head; - } - - inline const char *readPointer() const - { - Q_ASSERT(totalSize > 0); - return buffers.first().constData() + head; - } - - void free(int bytes) - { - totalSize -= bytes; - Q_ASSERT(totalSize >= 0); - - forever { - int nbs = readSize(); - - if (bytes < nbs) { - head += bytes; - if (head == tail && buffers.count() == 1) { - buffers.first().resize(CHUNKSIZE); - head = tail = 0; - } - break; - } - - bytes -= nbs; - if (buffers.count() == 1) { - buffers.first().resize(CHUNKSIZE); - head = tail = 0; - break; - } - - buffers.removeFirst(); - head = 0; - } - } - - char *reserve(int bytes) - { - totalSize += bytes; - - char *ptr; - if (tail + bytes <= buffers.last().size()) { - ptr = buffers.last().data() + tail; - tail += bytes; - } else { - buffers.last().resize(tail); - QByteArray tmp; - tmp.resize(qMax(CHUNKSIZE, bytes)); - ptr = tmp.data(); - buffers << tmp; - tail = bytes; - } - return ptr; - } - - // release a trailing part of the last reservation - inline void unreserve(int bytes) - { - totalSize -= bytes; - tail -= bytes; - } - - inline void write(const char *data, int len) - { - memcpy(reserve(len), data, len); - } - - // Find the first occurrence of c and return the index after it. - // If c is not found until maxLength, maxLength is returned, provided - // it is smaller than the buffer size. Otherwise -1 is returned. - int indexAfter(char c, int maxLength = KMAXINT) const - { - int index = 0; - int start = head; - QLinkedList<QByteArray>::ConstIterator it = buffers.begin(); - forever { - if (!maxLength) - return index; - if (index == size()) - return -1; - const QByteArray &buf = *it; - ++it; - int len = qMin((it == buffers.end() ? tail : buf.size()) - start, - maxLength); - const char *ptr = buf.data() + start; - if (const char *rptr = (const char *)memchr(ptr, c, len)) - return index + (rptr - ptr) + 1; - index += len; - maxLength -= len; - start = 0; - } - } - - inline int lineSize(int maxLength = KMAXINT) const - { - return indexAfter('\n', maxLength); - } - - inline bool canReadLine() const - { - return lineSize() != -1; - } - - int read(char *data, int maxLength) - { - int bytesToRead = qMin(size(), maxLength); - int readSoFar = 0; - while (readSoFar < bytesToRead) { - const char *ptr = readPointer(); - int bs = qMin(bytesToRead - readSoFar, readSize()); - memcpy(data + readSoFar, ptr, bs); - readSoFar += bs; - free(bs); - } - return readSoFar; - } - - int readLine(char *data, int maxLength) - { - return read(data, lineSize(qMin(maxLength, size()))); - } - -private: - QLinkedList<QByteArray> buffers; - int head, tail; - int totalSize; -}; - -struct KPtyDevicePrivate : public KPtyPrivate { - Q_DECLARE_PUBLIC(KPtyDevice) - - KPtyDevicePrivate(KPty* parent) : - KPtyPrivate(parent), - emittedReadyRead(false), emittedBytesWritten(false), - readNotifier(0), writeNotifier(0) - { - } - - bool _k_canRead(); - bool _k_canWrite(); - - bool doWait(int msecs, bool reading); - void finishOpen(QIODevice::OpenMode mode); - - bool emittedReadyRead; - bool emittedBytesWritten; - QSocketNotifier *readNotifier; - QSocketNotifier *writeNotifier; - KRingBuffer readBuffer; - KRingBuffer writeBuffer; -}; - -#endif -
deleted file mode 100644 --- a/gui//src/kptyprocess.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - - This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ -#include "kptyprocess.h" -#include "kprocess.h" - -#include "kptydevice.h" - -#include <stdlib.h> -#include <unistd.h> - -////////////////// -// private data // -////////////////// - -KPtyProcess::KPtyProcess(QObject *parent) : - KProcess(new KPtyProcessPrivate, parent) -{ - Q_D(KPtyProcess); - - d->pty = new KPtyDevice(this); - d->pty->open(); - connect(this, SIGNAL(stateChanged(QProcess::ProcessState)), - SLOT(_k_onStateChanged(QProcess::ProcessState))); -} - -KPtyProcess::KPtyProcess(int ptyMasterFd, QObject *parent) : - KProcess(new KPtyProcessPrivate, parent) -{ - Q_D(KPtyProcess); - - d->pty = new KPtyDevice(this); - d->pty->open(ptyMasterFd); - connect(this, SIGNAL(stateChanged(QProcess::ProcessState)), - SLOT(_k_onStateChanged(QProcess::ProcessState))); -} - -KPtyProcess::~KPtyProcess() -{ - Q_D(KPtyProcess); - - if (state() != QProcess::NotRunning && d->addUtmp) { - d->pty->logout(); - disconnect(SIGNAL(stateChanged(QProcess::ProcessState)), - this, SLOT(_k_onStateChanged(QProcess::ProcessState))); - } - delete d->pty; -} - -void KPtyProcess::setPtyChannels(PtyChannels channels) -{ - Q_D(KPtyProcess); - - d->ptyChannels = channels; -} - -KPtyProcess::PtyChannels KPtyProcess::ptyChannels() const -{ - Q_D(const KPtyProcess); - - return d->ptyChannels; -} - -void KPtyProcess::setUseUtmp(bool value) -{ - Q_D(KPtyProcess); - - d->addUtmp = value; -} - -bool KPtyProcess::isUseUtmp() const -{ - Q_D(const KPtyProcess); - - return d->addUtmp; -} - -KPtyDevice *KPtyProcess::pty() const -{ - Q_D(const KPtyProcess); - - return d->pty; -} - -void KPtyProcess::setupChildProcess() -{ - Q_D(KPtyProcess); - - d->pty->setCTty(); - if (d->addUtmp) - d->pty->login(getenv("USER"), getenv("DISPLAY")); - //d->pty->login(KUser(KUser::UseRealUserID).loginName().toLocal8Bit().data(), qgetenv("DISPLAY")); - if (d->ptyChannels & StdinChannel) - dup2(d->pty->slaveFd(), 0); - if (d->ptyChannels & StdoutChannel) - dup2(d->pty->slaveFd(), 1); - if (d->ptyChannels & StderrChannel) - dup2(d->pty->slaveFd(), 2); - - KProcess::setupChildProcess(); -}
deleted file mode 100644 --- a/gui//src/kptyprocess.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef KPTYPROCESS_H -#define KPTYPROCESS_H - -#include "kprocess.h" -#include "kprocess_p.h" -#include "kptydevice.h" - -class KPtyDevice; -class KPtyProcess; -struct KPtyProcessPrivate; - -/** - * This class extends KProcess by support for PTYs (pseudo TTYs). - * - * The PTY is opened as soon as the class is instantiated. Verify that - * it was opened successfully by checking that pty()->masterFd() is not -1. - * - * The PTY is always made the process' controlling TTY. - * Utmp registration and connecting the stdio handles to the PTY are optional. - * - * No attempt to integrate with QProcess' waitFor*() functions was made, - * for it is impossible. Note that execute() does not work with the PTY, too. - * Use the PTY device's waitFor*() functions or use it asynchronously. - * - * @author Oswald Buddenhagen <ossi@kde.org> - */ -class KPtyProcess : public KProcess -{ - Q_OBJECT - Q_DECLARE_PRIVATE(KPtyProcess) - -public: - enum PtyChannelFlag { - NoChannels = 0, /**< The PTY is not connected to any channel. */ - StdinChannel = 1, /**< Connect PTY to stdin. */ - StdoutChannel = 2, /**< Connect PTY to stdout. */ - StderrChannel = 4, /**< Connect PTY to stderr. */ - AllOutputChannels = 6, /**< Connect PTY to all output channels. */ - AllChannels = 7 /**< Connect PTY to all channels. */ - }; - - Q_DECLARE_FLAGS(PtyChannels, PtyChannelFlag) - - /** - * Constructor - */ - explicit KPtyProcess(QObject *parent = 0); - - /** - * Construct a process using an open pty master. - * - * @param ptyMasterFd an open pty master file descriptor. - * The process does not take ownership of the descriptor; - * it will not be automatically closed at any point. - */ - KPtyProcess(int ptyMasterFd, QObject *parent = 0); - - /** - * Destructor - */ - virtual ~KPtyProcess(); - - /** - * Set to which channels the PTY should be assigned. - * - * This function must be called before starting the process. - * - * @param channels the output channel handling mode - */ - void setPtyChannels(PtyChannels channels); - - /** - * Query to which channels the PTY is assigned. - * - * @return the output channel handling mode - */ - PtyChannels ptyChannels() const; - - /** - * Set whether to register the process as a TTY login in utmp. - * - * Utmp is disabled by default. - * It should enabled for interactively fed processes, like terminal - * emulations. - * - * This function must be called before starting the process. - * - * @param value whether to register in utmp. - */ - void setUseUtmp(bool value); - - /** - * Get whether to register the process as a TTY login in utmp. - * - * @return whether to register in utmp - */ - bool isUseUtmp() const; - - /** - * Get the PTY device of this process. - * - * @return the PTY device - */ - KPtyDevice *pty() const; - -protected: - /** - * @reimp - */ - virtual void setupChildProcess(); - -private: - Q_PRIVATE_SLOT(d_func(), void _k_onStateChanged(QProcess::ProcessState)) -}; - -struct KPtyProcessPrivate : KProcessPrivate { - KPtyProcessPrivate() : - ptyChannels(KPtyProcess::NoChannels), - addUtmp(false) - { - } - - void _k_onStateChanged(QProcess::ProcessState newState) - { - if (newState == QProcess::NotRunning && addUtmp) - pty->logout(); - } - - KPtyDevice *pty; - KPtyProcess::PtyChannels ptyChannels; - bool addUtmp : 1; -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(KPtyProcess::PtyChannels) - -#endif
deleted file mode 100644 --- a/gui//syntax_files/cpp.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<syntax> - <item name="keywords"> - <pattern> - \b(auto|const|double|float|int|short|struct|unsigned|break|continue|else|for|long|signed|switch|void|case|default|enum|goto|register|sizeof|typedef|volatile|char|do|extern|if|return|static|union|while|asm|dynamic_cast|namespace|reinterpret_cast|try|bool|explicit|new|static_cast|typeid|catch|false|operator|template|typename|class|friend|private|this|using|const_cast|inline|public|throw|virtual|delete|mutable|protected|true|wchar_t|and|bitand|compl|not_eq|or_eq|xor_eq|and_eq|bitor|not|or|xor)\b - </pattern> - <bold>true</bold> - <foreground>#0000AA</foreground> - </item> - - <item name="defines"> - <pattern>#[^ ]*</pattern> - <foreground>#00AA00</foreground> - </item> - - <item name="quotes"> - <pattern>"([^"]|\\")*"</pattern> - <foreground>#FF0000</foreground> - </item> - - <item name="single-quotes"> - <pattern>'[^']*'</pattern> - <foreground>#FF0000</foreground> - </item> - - <item name="single-line comment"> - <pattern>//.*</pattern> - <foreground>#555555</foreground> - </item> - - <block name="multi-line comment"> - <startPattern>(?!//)/\*</startPattern> - <endPattern>\*/</endPattern> - <foreground>#555555</foreground> - </block> - - <bracket name="{}bracket"> - <startPattern>\{</startPattern> - <endPattern>\}</endPattern> - <background>#ffff00</background> - </bracket> - - <bracket name="()bracket"> - <startPattern>\(</startPattern> - <endPattern>\)</endPattern> - <background>#ffff00</background> - </bracket> - - <bracket name="[]bracket"> - <startPattern>\[</startPattern> - <endPattern>\]</endPattern> - <background>#ffff00</background> - </bracket> - - -</syntax> \ No newline at end of file
deleted file mode 100644 --- a/gui//syntax_files/h.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<syntax> - <item name="keywords"> - <pattern> - \b(auto|const|double|float|int|short|struct|unsigned|break|continue|else|for|long|signed|switch|void|case|default|enum|goto|register|sizeof|typedef|volatile|char|do|extern|if|return|static|union|while|asm|dynamic_cast|namespace|reinterpret_cast|try|bool|explicit|new|static_cast|typeid|catch|false|operator|template|typename|class|friend|private|this|using|const_cast|inline|public|throw|virtual|delete|mutable|protected|true|wchar_t|and|bitand|compl|not_eq|or_eq|xor_eq|and_eq|bitor|not|or|xor)\b - </pattern> - <bold>true</bold> - <foreground>#0000AA</foreground> - </item> - - <item name="defines"> - <pattern>#[^ ]*</pattern> - <foreground>#00AA00</foreground> - </item> - - <item name="quotes"> - <pattern>"([^"]|\\")*"</pattern> - <foreground>#FF0000</foreground> - </item> - - <item name="single-quotes"> - <pattern>'[^']*'</pattern> - <foreground>#FF0000</foreground> - </item> - - <item name="single-line comment"> - <pattern>//.*</pattern> - <foreground>#555555</foreground> - </item> - - <block name="multi-line comment"> - <startPattern>(?!//)/\*</startPattern> - <endPattern>\*/</endPattern> - <foreground>#555555</foreground> - </block> - - <bracket name="{}bracket"> - <startPattern>\{</startPattern> - <endPattern>\}</endPattern> - <background>#ffff00</background> - </bracket> - - <bracket name="()bracket"> - <startPattern>\(</startPattern> - <endPattern>\)</endPattern> - <background>#ffff00</background> - </bracket> - - <bracket name="[]bracket"> - <startPattern>\[</startPattern> - <endPattern>\]</endPattern> - <background>#ffff00</background> - </bracket> - - -</syntax> \ No newline at end of file
deleted file mode 100644 --- a/gui//syntax_files/m.xml +++ /dev/null @@ -1,75 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<syntax> - <item name="keywords"> - <pattern> - \b(all_va_args|break|case|continue|else|elseif|end_unwind_protect|global|gplot|gsplot|otherwise|persistent|replot|return|static|until|unwind_protect|unwind_protect_cleanup|varargin|varargout|casesen|cd|chdir|clear|dbclear|dbstatus|dbstop|dbtype|dbwhere|diary|echo|edit_history|__end__|format|gset|gshow|help|history|hold|iskeyword|isvarname|load|ls|mark_as_command|mislocked|mlock|more|munlock|run_history|save|set|show|type|unmark_command|which|who|whos|for|endfor|if|endif|do|until|while|endwhile|function|endfunction|switch|endswitch|try|end_try_catch|end)\b - </pattern> - <bold>true</bold> - </item> - - <item name="functions"> - <pattern> - \b(argv|e|eps|false|F_DUPFD|F_GETFD|F_GETFL|filesep|F_SETFD|F_SETFL|i|I|inf|Inf|j|J|NA|nan|NaN|O_APPEND|O_ASYNC|O_CREAT|OCTAVE_HOME|OCTAVE_VERSION|O_EXCL|O_NONBLOCK|O_RDONLY|O_RDWR|O_SYNC|O_TRUNC|O_WRONLY|pi|program_invocation_name|program_name|P_tmpdir|realmax|realmin|SEEK_CUR|SEEK_END|SEEK_SET|SIG|stderr|stdin|stdout|true|ans|automatic_replot|beep_on_error|completion_append_char|crash_dumps_octave_core|current_script_file_name|debug_on_error|debug_on_interrupt|debug_on_warning|debug_symtab_lookups|DEFAULT_EXEC_PATH|DEFAULT_LOADPATH|default_save_format|echo_executing_commands|EDITOR|EXEC_PATH|FFTW_WISDOM_PROGRAM|fixed_point_format|gnuplot_binary|gnuplot_command_axes|gnuplot_command_end|gnuplot_command_plot|gnuplot_command_replot|gnuplot_command_splot|gnuplot_command_title|gnuplot_command_using|gnuplot_command_with|gnuplot_has_frames|history_file|history_size|ignore_function_time_stamp|IMAGEPATH|INFO_FILE|INFO_PROGRAM|__kluge_procbuf_delay__|LOADPATH|MAKEINFO_PROGRAM|max_recursion_depth|octave_core_file_format|octave_core_file_limit|octave_core_file_name|output_max_field_width|output_precision|page_output_immediately|PAGER|page_screen_output|print_answer_id_name|print_empty_dimensions|print_rhs_assign_val|PS1|PS2|PS4|save_header_format_string|save_precision|saving_history|sighup_dumps_octave_core|sigterm_dumps_octave_core|silent_functions|split_long_rows|string_fill_char|struct_levels_to_print|suppress_verbose_help_message|variables_can_hide_functions|warn_assign_as_truth_value|warn_divide_by_zero|warn_empty_list_elements|warn_fortran_indexing|warn_function_name_clash|warn_future_time_stamp|warn_imag_to_real|warn_matlab_incompatible|warn_missing_semicolon|warn_neg_dim_as_zero|warn_num_to_str|warn_precedence_change|warn_reload_forces_clear|warn_resize_on_range_error|warn_separator_insert|warn_single_quote_string|warn_str_to_num|warn_undefined_return_values|warn_variable_switch_label|whos_line_format|synchrotron_1|synchrotron_2|syndtable|taylorcoeff|transport_2|transport_3|transport_4|transport_5|trisolve|waitbar|xmlread|zeta|zeta_int|aar|aarmam|ac2poly|ac2rc|acorf|acovf|addpath|ademodce|adim|adsmax|amodce|anderson_darling_cdf|anderson_darling_test|anovan|apkconst|append_save|applylut|ar2poly|ar2rc|arburg|arcext|arfit2|ar_spa|aryule|assert|au|aucapture|auload|auplot|aurecord|ausave|autumn|average_moments|awgn|azimuth|BandToFull|BandToSparse|base64encode|battery|bchpoly|bestblk|best_dir|best_dir_cov|betaln|bfgs|bfgsmin_example|bi2de|biacovf|bilinear|bisdemo|bispec|biterr|blkdiag|blkproc|bmpwrite|bone|bound_convex|boxcar|boxplot|brighten|bs_gradient|butter|buttord|bwborder|bweuler|bwlabel|bwmorph|bwselect|calendar|cceps|cdiff|cellstr|char|cheb|cheb1ord|cheb2ord|chebwin|cheby1|cheby2|chirp|clf|clip|cmpermute|cmunique|cohere|col2im|colfilt|colorgradient|comms|compand|complex|concat|conndef|content|contents|Contents|contourf|convhull|convmtx|cool|copper|corr2|cosets|count|covm|cplxpair|cquadnd|create_lookup_table|crule|crule2d|crule2dgen|csape|csapi|csd|csvread|csvwrite|ctranspose|cumtrapz|czt|d2_min|datenum|datestr|datevec|dct|dct2|dctmtx|de2bi|deal|decimate|decode|deg2rad|del2|delaunay|delaunay3|delta_method|demo|demodmap|deriv|detrend|dfdp|dftmtx|dhbar|dilate|dispatch|distance|dlmread|dlmwrite|dos|double|drawnow|durlev|dxfwrite|edge|edit|ellip|ellipdemo|ellipj|ellipke|ellipord|__ellip_ws|__ellip_ws_min|encode|eomday|erode|example|ExampleEigenValues|ExampleGenEigenValues|expdemo|expfit|eyediagram|factor|factorial|fail|fcnchk|feedback|fem_test|ff2n|fftconv2|fieldnames|fill|fill3|filter2|filtfilt|filtic|findsym|fir1|fir2|fixedpoint|flag|flag_implicit_samplerate|flattopwin|flix|float|fmin|fminbnd|fmins|fminunc|fnder|fnplt|fnval|fplot|freqs|freqs_plot|fsort|fullfact|FullToBand|funm|fzero|gammaln|gapTest|gaussian|gausswin|gconv|gconvmtx|gdeconv|gdftmtx|gen2par|geomean|getfield|getfields|gfft|gftable|gfweight|gget|gifft|ginput|gmm_estimate|gmm_example|gmm_obj|gmm_results|gmm_variance|gmm_variance_inefficient|gquad|gquad2d|gquad2d6|gquad2dgen|gquad6|gquadnd|grace_octave_path|gradient|grayslice|grep|grid|griddata|groots|grpdelay|grule|grule2d|grule2dgen|hadamard|hammgen|hankel|hann|harmmean|hilbert|histeq|histfit|histo|histo2|histo3|histo4|hot|hsv|hup|idct|idct2|idplot|idsim|ifftshift|im2bw|im2col|imadjust|imginfo|imhist|imnoise|impad|impz|imread|imrotate|imshear|imtranslate|imwrite|innerfun|inputname|interp|interp1|interp2|interpft|intersect|invest0|invest1|invfdemo|invfreq|invfreqs|invfreqz|inz|irsa_act|irsa_actcore|irsa_check|irsa_dft|irsa_dftfp|irsa_genreal|irsa_idft|irsa_isregular|irsa_jitsp|irsa_mdsp|irsa_normalize|irsa_plotdft|irsa_resample|irsa_rgenreal|isa|isbw|isdir|isequal|isfield|isgray|isind|ismember|isprime|isrgb|issparse|isunix|jet|kaiser|kaiserord|lambertw|lattice|lauchli|leasqr|leasqrdemo|legend|legendre|levinson|lin2mu|line_min|lloyds|lookup|lookup_table|lpc|lp_test|mad|magic|makelut|MakeShears|map|mat2gray|mat2str|mdsmax|mean2|medfilt2|meshc|minimize|minpol|mkpp|mktheta|mle_estimate|mle_example|mle_obj|mle_results|mle_variance|modmap|mu2lin|mvaar|mvar|mvfilter|mvfreqz|myfeval|nanmax|nanmean|nanmedian|nanmin|nanstd|nansum|ncauer|nchoosek|ncrule|ndims|nelder_mead_min|newmark|nlfilter|nlnewmark|__nlnewmark_fcn__|nmsmax|nonzeros|normplot|now|nrm|nthroot|nze|OCTAVE_FORGE_VERSION|ode23|ode45|ode78|optimset|ordfilt2|orient|pacf|padarray|parameterize|parcor|pareto|pascal|patch|pburg|pcg|pchip|pcolor|pcr|peaks|penddot|pendulum|perms|pie|pink|plot3|__plt3__|poly2ac|poly2ar|poly_2_ex|poly2mask|poly2rc|poly2sym|poly2th|polyarea|polyconf|polyder|polyderiv|polygcd|polystab|__power|ppval|prctile|prettyprint|prettyprint_c|primes|princomp|print|prism|proplan|pulstran|pwelch|pyulear|qaskdeco|qaskenco|qtdecomp|qtgetblk|qtsetblk|quad2dc|quad2dcgen|quad2dg|quad2dggen|quadc|quadg|quadl|quadndg|quantiz|quiver|rad2deg|rainbow|randerr|randint|randsrc|rat|rats|rc2ac|rc2ar|rc2poly|rceps|read_options|read_pdb|rectpuls|resample|rgb2gray|rk2fixed|rk4fixed|rk8fixed|rmfield|rmle|rmpath|roicolor|rosser|rotparams|rotv|rref|rsdecof|rsencof|rsgenpoly|samin_example|save_vrml|sbispec|scale_data|scatter|scatterplot|select_3D_points|selmo|setdiff|setfield|setfields|setxor|sftrans|sgolay|sgolayfilt|sinvest1|slurp_file|sortrows|sound|soundsc|spdiags|specgram|speed|speye|spfun|sphcat|spline|splot|spones|sprand|sprandn|spring|spstats|spsum|sp_test|sptest|spvcat|spy|std2|stem|str2double|strcmpi|stretchlim|strfind|strmatch|strncmp|strncmpi|strsort|strtok|strtoz|struct|strvcat|summer|sumskipnan|surf|surfc|sym2poly|symerr|symfsolve|tabulate|tar|temp_name|test|test_d2_min_1|test_d2_min_2|test_d2_min_3|test_ellipj|test_fminunc_1|testimio|test_inline_1|test_min_1|test_min_2|test_min_3|test_min_4|test_minimize_1|test_nelder_mead_min_1|test_nelder_mead_min_2|test_sncndn|test_struct|test_vmesh|test_vrml_faces|test_wpolyfit|text|textread|tf2zp|tfe|thfm|tics|toeplitz|toggle_grace_use|transpose|trapz|triang|tril|trimmean|tripuls|trisolve|triu|tsademo|tsearchdemo|ucp|uintlut|unique|unix|unmkpp|unscale_parameters|vec2mat|view|vmesh|voronoi|voronoin|vrml_arrow|vrml_Background|vrml_browse|vrml_cyl|vrml_demo_tutorial_1|vrml_demo_tutorial_2|vrml_demo_tutorial_3|vrml_demo_tutorial_4|vrml_ellipsoid|vrml_faces|vrml_flatten|vrml_frame|vrml_group|vrml_kill|vrml_lines|vrml_material|vrml_parallelogram|vrml_PointLight|vrml_points|vrml_select_points|vrml_surf|vrml_text|vrml_thick_surf|vrml_transfo|wavread|wavwrite|weekday|wgn|white|wilkinson|winter|wpolyfit|wpolyfitdemo|write_pdb|wsolve|xcorr|xcorr2|xcov|xlsread|xmlwrite|y2res|zero_count|zoom|zp2tf|zplane|shell_cmd|show|sign|sin|sinh|size|sizeof|sleep|sort|source|splice|sprintf|sqrt|squeeze|sscanf|stat|str2func|streamoff|struct|struct2cell|sum|sumsq|symlink|system|tan|tanh|tilde_expand|tmpfile|tmpnam|toascii|__token_count__|tolower|toupper|type|typeinfo|uint16|uint32|uint64|uint8|umask|undo_string_escapes|unlink|unmark_command|usage|usleep|va_arg|va_start|vectorize|vertcat|vr_val|waitpid|warning|warranty|which|who|whos|zeros|airy|balance|besselh|besseli|besselj|besselk|bessely|betainc|chol|colloc|daspk|daspk_options|dasrt|dasrt_options|dassl|dassl_options|det|eig|endgrent|endpwent|expm|fft|fft2|fftn|fftw_wisdom|filter|find|fsolve|fsolve_options|gammainc|gcd|getgrent|getgrgid|getgrnam|getpwent|getpwnam|getpwuid|getrusage|givens|gmtime|hess|ifft|ifft2|ifftn|inv|inverse|kron|localtime|lpsolve|lpsolve_options|lsode|lsode_options|lu|max|min|minmax|mktime|odessa|odessa_options|pinv|qr|quad|quad_options|qz|rand|randn|schur|setgrent|setpwent|sort|sqrtm|strftime|strptime|svd|syl|time|abcddim|__abcddims__|acot|acoth|acsc|acsch|analdemo|anova|arch_fit|arch_rnd|arch_test|are|arma_rnd|asctime|asec|asech|autocor|autocov|autoreg_matrix|axis|axis2dlim|__axis_label__|bar|bartlett|bartlett_test|base2dec|bddemo|beep|bessel|beta|beta_cdf|betai|beta_inv|beta_pdf|beta_rnd|bin2dec|bincoeff|binomial_cdf|binomial_inv|binomial_pdf|binomial_rnd|bitcmp|bitget|bitset|blackman|blanks|bode|bode_bounds|__bodquist__|bottom_title|bug_report|buildssic|c2d|cart2pol|cart2sph|cauchy_cdf|cauchy_inv|cauchy_pdf|cauchy_rnd|cellidx|center|chisquare_cdf|chisquare_inv|chisquare_pdf|chisquare_rnd|chisquare_test_homogeneity|chisquare_test_independence|circshift|clock|cloglog|close|colormap|columns|com2str|comma|common_size|commutation_matrix|compan|complement|computer|cond|contour|controldemo|conv|cor|corrcoef|cor_test|cot|coth|cov|cputime|create_set|cross|csc|csch|ctime|ctrb|cut|d2c|damp|dare|date|dcgain|deal|deblank|dec2base|dec2bin|dec2hex|deconv|delete|DEMOcontrol|demoquat|detrend|dezero|dgkfdemo|dgram|dhinfdemo|diff|diffpara|dir|discrete_cdf|discrete_inv|discrete_pdf|discrete_rnd|dkalman|dlqe|dlqg|dlqr|dlyap|dmr2d|dmult|dot|dre|dump_prefs|duplication_matrix|durbinlevinson|empirical_cdf|empirical_inv|empirical_pdf|empirical_rnd|erfinv|__errcomm__|errorbar|__errplot__|etime|exponential_cdf|exponential_inv|exponential_pdf|exponential_rnd|f_cdf|fftconv|fftfilt|fftshift|figure|fileparts|findstr|f_inv|fir2sys|flipdim|fliplr|flipud|flops|f_pdf|fractdiff|frdemo|freqchkw|__freqresp__|freqz|freqz_plot|f_rnd|f_test_regression|fullfile|fv|fvl|gamma_cdf|gammai|gamma_inv|gamma_pdf|gamma_rnd|geometric_cdf|geometric_inv|geometric_pdf|geometric_rnd|gls|gram|gray|gray2ind|grid|h2norm|h2syn|hamming|hankel|hanning|hex2dec|hilb|hinf_ctr|hinfdemo|hinfnorm|hinfsyn|hinfsyn_chk|hinfsyn_ric|hist|hotelling_test|hotelling_test_2|housh|hsv2rgb|hurst|hypergeometric_cdf|hypergeometric_inv|hypergeometric_pdf|hypergeometric_rnd|image|imagesc|impulse|imshow|ind2gray|ind2rgb|ind2sub|index|int2str|intersection|invhilb|iqr|irr|isa|is_abcd|is_bool|is_complex|is_controllable|isdefinite|is_detectable|is_dgkf|is_digital|is_duplicate_entry|is_global|is_leap_year|isletter|is_list|is_matrix|is_observable|ispc|is_sample|is_scalar|isscalar|is_signal_list|is_siso|is_square|issquare|is_stabilizable|is_stable|isstr|is_stream|is_struct|is_symmetric|issymmetric|isunix|is_vector|isvector|jet707|kendall|kolmogorov_smirnov_cdf|kolmogorov_smirnov_test|kolmogorov_smirnov_test_2|kruskal_wallis_test|krylov|krylovb|kurtosis|laplace_cdf|laplace_inv|laplace_pdf|laplace_rnd|lcm|lin2mu|listidx|list_primes|loadaudio|loadimage|log2|logical|logistic_cdf|logistic_inv|logistic_pdf|logistic_regression|logistic_regression_derivatives|logistic_regression_likelihood|logistic_rnd|logit|loglog|loglogerr|logm|lognormal_cdf|lognormal_inv|lognormal_pdf|lognormal_rnd|logspace|lower|lqe|lqg|lqr|lsim|ltifr|lyap|mahalanobis|manova|mcnemar_test|mean|meansq|median|menu|mesh|meshdom|meshgrid|minfo|mod|moddemo|moment|mplot|mu2lin|multiplot|nargchk|nextpow2|nichols|norm|normal_cdf|normal_inv|normal_pdf|normal_rnd|not|nper|npv|ntsc2rgb|null|num2str|nyquist|obsv|ocean|ols|oneplot|ord2|orth|__outlist__|pack|packedform|packsys|parallel|paren|pascal_cdf|pascal_inv|pascal_pdf|pascal_rnd|path|periodogram|perror|place|playaudio|plot|plot_border|__plr__|__plr1__|__plr2__|__plt__|__plt1__|__plt2__|__plt2mm__|__plt2mv__|__plt2ss__|__plt2vm__|__plt2vv__|__pltopt__|__pltopt1__|pmt|poisson_cdf|poisson_inv|poisson_pdf|poisson_rnd|pol2cart|polar|poly|polyder|polyderiv|polyfit|polyinteg|polyout|polyreduce|polyval|polyvalm|popen2|postpad|pow2|ppplot|prepad|probit|prompt|prop_test_2|pv|pvl|pzmap|qconj|qcoordinate_plot|qderiv|qderivmat|qinv|qmult|qqplot|qtrans|qtransv|qtransvmat|quaternion|qzhess|qzval|randperm|range|rank|ranks|rate|record|rectangle_lw|rectangle_sw|rem|repmat|residue|rgb2hsv|rgb2ind|rgb2ntsc|rindex|rldemo|rlocus|roots|rot90|rotdim|rotg|rows|run_cmd|run_count|run_test|saveaudio|saveimage|sec|sech|semicolon|semilogx|semilogxerr|semilogy|semilogyerr|series|setaudio|setstr|shg|shift|shiftdim|sign_test|sinc|sinetone|sinewave|skewness|sombrero|sortcom|spearman|spectral_adf|spectral_xdf|spencer|sph2cart|split|ss|ss2sys|ss2tf|ss2zp|stairs|starp|statistics|std|stdnormal_cdf|stdnormal_inv|stdnormal_pdf|stdnormal_rnd|step|__stepimp__|stft|str2mat|str2num|strappend|strcat|strcmp|strerror|strjust|strrep|struct_contains|struct_elements|studentize|sub2ind|subplot|substr|subwindow|swap|swapcols|swaprows|sylvester_matrix|synthesis|sys2fir|sys2ss|sys2tf|sys2zp|sysadd|sysappend|syschnames|__syschnamesl__|syschtsam|__sysconcat__|sysconnect|syscont|__syscont_disc__|__sysdefioname__|__sysdefstname__|sysdimensions|sysdisc|sysdup|sysgetsignals|sysgettsam|sysgettype|sysgroup|__sysgroupn__|sysidx|sysmin|sysmult|sysout|sysprune|sysreorder|sysrepdemo|sysscale|syssetsignals|syssub|sysupdate|table|t_cdf|tempdir|tempname|texas_lotto|tf|tf2ss|tf2sys|__tf2sysl__|tf2zp|__tfl__|tfout|tic|t_inv|title|toc|toeplitz|top_title|t_pdf|trace|triangle_lw|triangle_sw|tril|triu|t_rnd|t_test|t_test_2|t_test_regression|tzero|tzero2|ugain|uniform_cdf|uniform_inv|uniform_pdf|uniform_rnd|union|unix|unpacksys|unwrap|upper|u_test|values|vander|var|var_test|vec|vech|version|vol|weibull_cdf|weibull_inv|weibull_pdf|weibull_rnd|welch_test|wgt1o|wiener_rnd|wilcoxon_test|xlabel|xor|ylabel|yulewalker|zgfmul|zgfslv|zginit|__zgpbal__|zgreduce|zgrownorm|zgscal|zgsgiv|zgshsr|zlabel|zp|zp2ss|__zp2ssg2__|zp2sys|zp2tf|zpout|z_test)\b - </pattern> - <foreground>#0000BB</foreground> - <bold>false</bold> - </item> - - <item name="variables"> - <pattern>[a-zA-Z_][a-zA-Z_0-9]*'?</pattern> - <bold>false</bold> - </item> - - <item name="numbers"> - <pattern>(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?[ij]?</pattern> - <foreground>#BB0000</foreground> - <bold>false</bold> - </item> - - <item name="quotes"> - <pattern>"([^"]|\\")*"</pattern> - <foreground>#FF0000</foreground> - </item> - - <item name="single-quotes"> - <pattern>'([^']|\\')*'</pattern> - <foreground>#FF0000</foreground> - </item> - - <block name="multi-line comment #{"> - <startPattern>#\{</startPattern> - <endPattern>#\}</endPattern> - <foreground>#008800</foreground> - </block> - - <block name="multi-line comment %{"> - <startPattern>%\{</startPattern> - <endPattern>%\}</endPattern> - <foreground>#008800</foreground> - </block> - - <item name="single-line comment"> - <pattern>[#|%].*</pattern> - <foreground>#008800</foreground> - </item> - - <bracket name="{}bracket"> - <startPattern>\{</startPattern> - <endPattern>\}</endPattern> - <background>#ffff00</background> - </bracket> - - <bracket name="()bracket"> - <startPattern>\(</startPattern> - <endPattern>\)</endPattern> - <background>#ffff00</background> - </bracket> - - <bracket name="[]bracket"> - <startPattern>\[</startPattern> - <endPattern>\]</endPattern> - <background>#ffff00</background> - </bracket> - - -</syntax> \ No newline at end of file
deleted file mode 100644 --- a/gui//syntax_files/sh.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<syntax> - <item name="comment"> - <pattern>#[^ ]*</pattern> - <foreground>#00AA00</foreground> - </item> - - <item name="quotes"> - <pattern>"[^"]*"</pattern> - <foreground>#FF0000</foreground> - </item> - - <item name="single-quotes"> - <pattern>'[^']*'</pattern> - <foreground>#FF0000</foreground> - </item> -</syntax> \ No newline at end of file
deleted file mode 100644 --- a/gui/Doxyfile +++ /dev/null @@ -1,1661 +0,0 @@ -# Doxyfile 1.7.1 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a hash (#) is considered a comment and will be ignored -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" ") - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = Quint - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = 0.4 - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = /home/jacob/Desktop/Quint-Documentation - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful is your file systems -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this -# tag. The format is ext=language, where ext is a file extension, and language -# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, -# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions -# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen to replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = NO - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command <command> <input-file>, where <command> is the value of -# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. The create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. - -LAYOUT_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = /home/jacob/Desktop/gnu-octave/gui/src - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 - -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.d \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.idl \ - *.odl \ - *.cs \ - *.php \ - *.php3 \ - *.inc \ - *.m \ - *.mm \ - *.dox \ - *.py \ - *.f90 \ - *.f \ - *.vhd \ - *.vhdl - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = * - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command <filter> <input-file>, where <filter> -# is the value of the INPUT_FILTER tag, and <input-file> is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. If FILTER_PATTERNS is specified, this tag will be -# ignored. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the stylesheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> -# Qt Help Project / Custom Filters</a>. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> -# Qt Help Project / Filter Attributes</a>. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. - -GENERATE_TREEVIEW = NO - -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvances is that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. This is useful -# if you want to understand what is going on. On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = NO - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = YES - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = FreeSans.ttf - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = YES - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = YES - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = NO - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES
deleted file mode 100644 --- a/gui/languages/german +++ /dev/null @@ -1,175 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.0" language="de_DE"> -<context> - <name>FilesDockWidget</name> - <message> - <location filename="../src/FilesDockWidget.cpp" line="9"/> - <source>Current Folder</source> - <translation>Aktuelles Verzeichnis</translation> - </message> -</context> -<context> - <name>HistoryDockWidget</name> - <message> - <location filename="../src/HistoryDockWidget.cpp" line="41"/> - <source>Command History</source> - <translation>Befehlshistorie</translation> - </message> - <message> - <location filename="../src/HistoryDockWidget.cpp" line="60"/> - <source>History updated.</source> - <translation>Befehlshistorie aktualisiert.</translation> - </message> -</context> -<context> - <name>MainWindow</name> - <message> - <location filename="../src/MainWindow.cpp" line="42"/> - <source>Opening file.</source> - <translation>Öffne Datei.</translation> - </message> - <message> - <location filename="../src/MainWindow.cpp" line="68"/> - <source>Save Workspace</source> - <translation>Speichere Arbeitsumgebung</translation> - </message> - <message> - <location filename="../src/MainWindow.cpp" line="76"/> - <source>Load Workspace</source> - <translation>Lade Arbeitsumgebung</translation> - </message> - <message> - <location filename="../src/MainWindow.cpp" line="94"/> - <source>Saving data and shutting down.</source> - <translation>Speichere Daten und schließe.</translation> - </message> - <message> - <location filename="../src/MainWindow.cpp" line="119"/> - <source>Octave Toolbar</source> - <translation>Octave Werkzeugleiste</translation> - </message> - <message> - <location filename="../src/MainWindow.cpp" line="128"/> - <source>Command Window</source> - <translation>Konsolenfenster</translation> - </message> - <message> - <location filename="../src/MainWindow.cpp" line="129"/> - <source>File Editor</source> - <translation>Dateieditor</translation> - </message> - <message> - <location filename="../src/MainWindow.cpp" line="130"/> - <source>Documentation</source> - <translation>Dokumentation</translation> - </message> - <message> - <location filename="../src/MainWindow.cpp" line="131"/> - <source>Service</source> - <translation>Service</translation> - </message> - <message> - <location filename="../src/MainWindow.cpp" line="179"/> - <source>Established link to Octave.</source> - <translation>Verbindung zu Octave hergestellt.</translation> - </message> -</context> -<context> - <name>NumberBar</name> - <message> - <location filename="../src/NumberedCodeEdit.cpp" line="189"/> - <source>Stop Here</source> - <translation>Stoppe hier</translation> - </message> - <message> - <location filename="../src/NumberedCodeEdit.cpp" line="192"/> - <source>Current Line</source> - <translation>Aktuelle Zeile</translation> - </message> - <message> - <location filename="../src/NumberedCodeEdit.cpp" line="195"/> - <source>Error Line</source> - <translation>Fehlerzeile</translation> - </message> -</context> -<context> - <name>NumberedCodeEdit</name> - <message> - <location filename="../src/NumberedCodeEdit.cpp" line="387"/> - <source>This file name is not valid.</source> - <translation>Dieser Dateiname ist nicht gültig.</translation> - </message> - <message> - <location filename="../src/NumberedCodeEdit.cpp" line="388"/> - <source>Octave doesn't understand this file name: -</source> - <translation>Octave versteht diesen Dateityp nicht:</translation> - </message> - <message> - <location filename="../src/NumberedCodeEdit.cpp" line="388"/> - <source> -Please, change it. - Do you want to save your changes?</source> - <translation>Bitte ändern Sie dies. Möchten Sie Ihre Änderungen sichern?</translation> - </message> -</context> -<context> - <name>VariablesDockWidget</name> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="15"/> - <source>Name</source> - <translation>Bezeichner</translation> - </message> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="15"/> - <source>Type</source> - <translation>Typ</translation> - </message> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="15"/> - <source>Value</source> - <translation>Wert</translation> - </message> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="21"/> - <source>Workspace</source> - <translation>Arbeitsumgebung</translation> - </message> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="29"/> - <source>Save</source> - <translation>Sichern</translation> - </message> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="30"/> - <source>Load</source> - <translation>Laden</translation> - </message> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="31"/> - <source>Clear</source> - <translation>Löschen</translation> - </message> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="46"/> - <source>Local</source> - <translation>Lokal</translation> - </message> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="50"/> - <source>Global</source> - <translation>Global</translation> - </message> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="54"/> - <source>Persistent</source> - <translation>Persistent</translation> - </message> - <message> - <location filename="../src/VariablesDockWidget.cpp" line="58"/> - <source>Hidden</source> - <translation>Versteckt</translation> - </message> -</context> -</TS>
deleted file mode 100644 index 13cd427ba4fa69ba638a54f79dbb25ff3e02654c..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@<O00001
deleted file mode 100644 index 919ba14e57ef0be670b475a5ce5614ac477a3e04..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@<O00001
deleted file mode 100644 index 8d014cbea8d1e5745038c7024a7e513067ef3a24..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@<O00001
deleted file mode 100644 index d05aed4e133cf47bae7ff4ead6405862073e0a33..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@<O00001
deleted file mode 100644 index 77b128c4d9f919d3e220d31f0ef679e4be12f08d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@<O00001
deleted file mode 100644 index 582581539bb1f74db61925f2b201ab75b490fea5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@<O00001
deleted file mode 100644 --- a/gui/src/BlockArray.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - Copyright 2000 by Stephan Kulow <coolo@kde.org> - - This program 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 program 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. -*/ - -// Own -#include "BlockArray.h" - -// System -#include <assert.h> -#include <sys/mman.h> -#include <sys/param.h> -#include <unistd.h> -#include <stdio.h> - -#define KDE_fseek ::fseek -#define KDE_lseek ::lseek - -static int blocksize = 0; - -BlockArray::BlockArray() - : size(0), - current(size_t(-1)), - index(size_t(-1)), - lastmap(0), - lastmap_index(size_t(-1)), - lastblock(0), ion(-1), - length(0) -{ - // lastmap_index = index = current = size_t(-1); - if (blocksize == 0) - blocksize = ((sizeof(Block) / getpagesize()) + 1) * getpagesize(); - -} - -BlockArray::~BlockArray() -{ - setHistorySize(0); - assert(!lastblock); -} - -size_t BlockArray::append(Block *block) -{ - if (!size) - return size_t(-1); - - ++current; - if (current >= size) current = 0; - - int rc; - rc = KDE_lseek(ion, current * blocksize, SEEK_SET); if (rc < 0) { perror("HistoryBuffer::add.seek"); setHistorySize(0); return size_t(-1); } - rc = write(ion, block, blocksize); if (rc < 0) { perror("HistoryBuffer::add.write"); setHistorySize(0); return size_t(-1); } - - length++; - if (length > size) length = size; - - ++index; - - delete block; - return current; -} - -size_t BlockArray::newBlock() -{ - if (!size) - return size_t(-1); - append(lastblock); - - lastblock = new Block(); - return index + 1; -} - -Block *BlockArray::lastBlock() const -{ - return lastblock; -} - -bool BlockArray::has(size_t i) const -{ - if (i == index + 1) - return true; - - if (i > index) - return false; - if (index - i >= length) - return false; - return true; -} - -const Block* BlockArray::at(size_t i) -{ - if (i == index + 1) - return lastblock; - - if (i == lastmap_index) - return lastmap; - - if (i > index) { - //kDebug(1211) << "BlockArray::at() i > index\n"; - return 0; - } - -// if (index - i >= length) { -// kDebug(1211) << "BlockArray::at() index - i >= length\n"; -// return 0; -// } - - size_t j = i; // (current - (index - i) + (index/size+1)*size) % size ; - - assert(j < size); - unmap(); - - Block *block = (Block*)mmap(0, blocksize, PROT_READ, MAP_PRIVATE, ion, j * blocksize); - - if (block == (Block*)-1) { perror("mmap"); return 0; } - - lastmap = block; - lastmap_index = i; - - return block; -} - -void BlockArray::unmap() -{ - if (lastmap) { - int res = munmap((char*)lastmap, blocksize); - if (res < 0) perror("munmap"); - } - lastmap = 0; - lastmap_index = size_t(-1); -} - -bool BlockArray::setSize(size_t newsize) -{ - return setHistorySize(newsize * 1024 / blocksize); -} - -bool BlockArray::setHistorySize(size_t newsize) -{ -// kDebug(1211) << "setHistorySize " << size << " " << newsize; - - if (size == newsize) - return false; - - unmap(); - - if (!newsize) { - delete lastblock; - lastblock = 0; - if (ion >= 0) close(ion); - ion = -1; - current = size_t(-1); - return true; - } - - if (!size) { - FILE* tmp = tmpfile(); - if (!tmp) { - perror("konsole: cannot open temp file.\n"); - } else { - ion = dup(fileno(tmp)); - if (ion<0) { - perror("konsole: cannot dup temp file.\n"); - fclose(tmp); - } - } - if (ion < 0) - return false; - - assert(!lastblock); - - lastblock = new Block(); - size = newsize; - return false; - } - - if (newsize > size) { - increaseBuffer(); - size = newsize; - return false; - } else { - decreaseBuffer(newsize); - if (ftruncate(ion, length*blocksize) == -1) - perror("ftruncate"); - size = newsize; - - return true; - } -} - -void moveBlock(FILE *fion, int cursor, int newpos, char *buffer2) -{ - int res = KDE_fseek(fion, cursor * blocksize, SEEK_SET); - if (res) - perror("fseek"); - res = fread(buffer2, blocksize, 1, fion); - if (res != 1) - perror("fread"); - - res = KDE_fseek(fion, newpos * blocksize, SEEK_SET); - if (res) - perror("fseek"); - res = fwrite(buffer2, blocksize, 1, fion); - if (res != 1) - perror("fwrite"); -} - -void BlockArray::decreaseBuffer(size_t newsize) -{ - if (index < newsize) // still fits in whole - return; - - int offset = (current - (newsize - 1) + size) % size; - - if (!offset) - return; - - // The Block constructor could do somthing in future... - char *buffer1 = new char[blocksize]; - - FILE *fion = fdopen(dup(ion), "w+b"); - if (!fion) { - delete [] buffer1; - perror("fdopen/dup"); - return; - } - - int firstblock; - if (current <= newsize) { - firstblock = current + 1; - } else { - firstblock = 0; - } - - size_t oldpos; - for (size_t i = 0, cursor=firstblock; i < newsize; i++) { - oldpos = (size + cursor + offset) % size; - moveBlock(fion, oldpos, cursor, buffer1); - if (oldpos < newsize) { - cursor = oldpos; - } else - cursor++; - } - - current = newsize - 1; - length = newsize; - - delete [] buffer1; - - fclose(fion); - -} - -void BlockArray::increaseBuffer() -{ - if (index < size) // not even wrapped once - return; - - int offset = (current + size + 1) % size; - if (!offset) // no moving needed - return; - - // The Block constructor could do somthing in future... - char *buffer1 = new char[blocksize]; - char *buffer2 = new char[blocksize]; - - int runs = 1; - int bpr = size; // blocks per run - - if (size % offset == 0) { - bpr = size / offset; - runs = offset; - } - - FILE *fion = fdopen(dup(ion), "w+b"); - if (!fion) { - perror("fdopen/dup"); - delete [] buffer1; - delete [] buffer2; - return; - } - - int res; - for (int i = 0; i < runs; i++) - { - // free one block in chain - int firstblock = (offset + i) % size; - res = KDE_fseek(fion, firstblock * blocksize, SEEK_SET); - if (res) - perror("fseek"); - res = fread(buffer1, blocksize, 1, fion); - if (res != 1) - perror("fread"); - int newpos = 0; - for (int j = 1, cursor=firstblock; j < bpr; j++) - { - cursor = (cursor + offset) % size; - newpos = (cursor - offset + size) % size; - moveBlock(fion, cursor, newpos, buffer2); - } - res = KDE_fseek(fion, i * blocksize, SEEK_SET); - if (res) - perror("fseek"); - res = fwrite(buffer1, blocksize, 1, fion); - if (res != 1) - perror("fwrite"); - } - current = size - 1; - length = size; - - delete [] buffer1; - delete [] buffer2; - - fclose(fion); - -} -
deleted file mode 100644 --- a/gui/src/BlockArray.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - Copyright 2000 by Stephan Kulow <coolo@kde.org> - - This program 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 program 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 BLOCKARRAY_H -#define BLOCKARRAY_H - -#include <unistd.h> - -#define BlockSize (1 << 12) -#define ENTRIES ((BlockSize - sizeof(size_t) ) / sizeof(unsigned char)) - -struct Block { - Block() { size = 0; } - unsigned char data[ENTRIES]; - size_t size; -}; - -// /////////////////////////////////////////////////////// - -class BlockArray { -public: - /** - * Creates a history file for holding - * maximal size blocks. If more blocks - * are requested, then it drops earlier - * added ones. - */ - BlockArray(); - - /// destructor - ~BlockArray(); - - /** - * adds the Block at the end of history. - * This may drop other blocks. - * - * The ownership on the block is transferred. - * An unique index number is returned for accessing - * it later (if not yet dropped then) - * - * Note, that the block may be dropped completely - * if history is turned off. - */ - size_t append(Block *block); - - /** - * gets the block at the index. Function may return - * 0 if the block isn't available any more. - * - * The returned block is strictly readonly as only - * maped in memory - and will be invalid on the next - * operation on this class. - */ - const Block *at(size_t index); - - /** - * reorders blocks as needed. If newsize is null, - * the history is emptied completely. The indices - * returned on append won't change their semantic, - * but they may not be valid after this call. - */ - bool setHistorySize(size_t newsize); - - size_t newBlock(); - - Block *lastBlock() const; - - /** - * Convenient function to set the size in KBytes - * instead of blocks - */ - bool setSize(size_t newsize); - - size_t len() const { return length; } - - bool has(size_t index) const; - - size_t getCurrent() const { return current; } - -private: - void unmap(); - void increaseBuffer(); - void decreaseBuffer(size_t newsize); - - size_t size; - // current always shows to the last inserted block - size_t current; - size_t index; - - Block *lastmap; - size_t lastmap_index; - Block *lastblock; - - int ion; - size_t length; - -}; -#endif
deleted file mode 100644 --- a/gui/src/BrowserWidget.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include "BrowserWidget.h" -#include <QVBoxLayout> -#include <QAction> -#include <QStyle> -#include <QApplication> - -BrowserDockWidget::BrowserDockWidget(QWidget *parent, BrowserWidget *browserWidget) - : QDockWidget(parent) { - m_browserWidget = browserWidget; - setWidget(m_browserWidget); -} - -BrowserDockWidget::~BrowserDockWidget() { -} - -BrowserWidget *BrowserDockWidget::browserWidget() { - return m_browserWidget; -} - -BrowserWidget::BrowserWidget(QWidget *parent) - : QWidget(parent) { - construct(); -} - -void BrowserWidget::construct() { - QStyle *style = QApplication::style(); - m_navigationToolBar = new QToolBar(this); - m_webView = new QWebView(this); - m_urlLineEdit = new QLineEdit(this); - m_statusBar = new QStatusBar(this); - - QAction *backAction = new QAction(style->standardIcon(QStyle::SP_ArrowLeft), - "", m_navigationToolBar); - QAction *forwardAction = new QAction(style->standardIcon(QStyle::SP_ArrowRight), - "", m_navigationToolBar); - - m_navigationToolBar->addAction(backAction); - m_navigationToolBar->addAction(forwardAction); - m_navigationToolBar->addWidget(m_urlLineEdit); - - QVBoxLayout *layout = new QVBoxLayout(); - layout->addWidget(m_navigationToolBar); - layout->addWidget(m_webView); - layout->addWidget(m_statusBar); - layout->setMargin(2); - setLayout(layout); - - connect(backAction, SIGNAL(triggered()), m_webView, SLOT(back())); - connect(forwardAction, SIGNAL(triggered()), m_webView, SLOT(forward())); - connect(m_webView, SIGNAL(urlChanged(QUrl)), this, SLOT(setUrl(QUrl))); - connect(m_urlLineEdit, SIGNAL(returnPressed()), this, SLOT(jumpToWebsite())); - //connect(m_webView, SIGNAL(statusBarMessage(QString)), this, SLOT(showMessage(QString))); -} - -void BrowserWidget::setUrl(QUrl url) { - m_urlLineEdit->setText(url.toString()); -} - -void BrowserWidget::jumpToWebsite() { - QString url = m_urlLineEdit->text(); - if(!url.startsWith("http://")) - url = "http://" + url; - load(url); -} - -void BrowserWidget::showStatusMessage(QString message) { - m_statusBar->showMessage(message, 1000); -} - -void BrowserWidget::load(QUrl url) { - m_webView->load(url); -}
deleted file mode 100644 --- a/gui/src/BrowserWidget.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef BROWSERMDISUBWINDOW_H -#define BROWSERMDISUBWINDOW_H - -#include <QWidget> -#include <QToolBar> -#include <QLineEdit> -#include <QtWebKit/QWebView> -#include <QStatusBar> -#include <QDockWidget> - -class BrowserWidget; -class BrowserDockWidget : public QDockWidget { -public: - BrowserDockWidget(QWidget *parent, BrowserWidget *browserWidget); - ~BrowserDockWidget(); - - BrowserWidget *browserWidget(); - -private: - BrowserWidget *m_browserWidget; -}; - -class BrowserWidget : public QWidget { - Q_OBJECT -public: - BrowserWidget(QWidget *parent = 0); - void load(QUrl url); - -public slots: - void setUrl(QUrl url); - void jumpToWebsite(); - void showStatusMessage(QString message); - -private: - void construct(); - - QLineEdit *m_urlLineEdit; - QToolBar *m_navigationToolBar; - QWebView *m_webView; - QStatusBar *m_statusBar; -}; - -#endif // BROWSERMDISUBWINDOW_H
deleted file mode 100644 --- a/gui/src/Character.h +++ /dev/null @@ -1,220 +0,0 @@ -/* - This file is part of Konsole, KDE's terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 CHARACTER_H -#define CHARACTER_H - -// Qt -#include <QtCore/QHash> - -// Local -#include "CharacterColor.h" - -typedef unsigned char LineProperty; - -static const int LINE_DEFAULT = 0; -static const int LINE_WRAPPED = (1 << 0); -static const int LINE_DOUBLEWIDTH = (1 << 1); -static const int LINE_DOUBLEHEIGHT = (1 << 2); - -#define DEFAULT_RENDITION 0 -#define RE_BOLD (1 << 0) -#define RE_BLINK (1 << 1) -#define RE_UNDERLINE (1 << 2) -#define RE_REVERSE (1 << 3) // Screen only -#define RE_INTENSIVE (1 << 3) // Widget only -#define RE_CURSOR (1 << 4) -#define RE_EXTENDED_CHAR (1 << 5) - -/** - * A single character in the terminal which consists of a unicode character - * value, foreground and background colors and a set of rendition attributes - * which specify how it should be drawn. - */ -class Character -{ -public: - /** - * Constructs a new character. - * - * @param _c The unicode character value of this character. - * @param _f The foreground color used to draw the character. - * @param _b The color used to draw the character's background. - * @param _r A set of rendition flags which specify how this character is to be drawn. - */ - inline Character(quint16 _c = ' ', - CharacterColor _f = CharacterColor(COLOR_SPACE_DEFAULT,DEFAULT_FORE_COLOR), - CharacterColor _b = CharacterColor(COLOR_SPACE_DEFAULT,DEFAULT_BACK_COLOR), - quint8 _r = DEFAULT_RENDITION) - : character(_c), rendition(_r), foregroundColor(_f), backgroundColor(_b) {} - - union - { - /** The unicode character value for this character. */ - quint16 character; - /** - * Experimental addition which allows a single Character instance to contain more than - * one unicode character. - * - * charSequence is a hash code which can be used to look up the unicode - * character sequence in the ExtendedCharTable used to create the sequence. - */ - quint16 charSequence; - }; - - /** A combination of RENDITION flags which specify options for drawing the character. */ - quint8 rendition; - - /** The foreground color used to draw this character. */ - CharacterColor foregroundColor; - /** The color used to draw this character's background. */ - CharacterColor backgroundColor; - - /** - * Returns true if this character has a transparent background when - * it is drawn with the specified @p palette. - */ - bool isTransparent(const ColorEntry* palette) const; - /** - * Returns true if this character should always be drawn in bold when - * it is drawn with the specified @p palette, independent of whether - * or not the character has the RE_BOLD rendition flag. - */ - ColorEntry::FontWeight fontWeight(const ColorEntry* base) const; - - /** - * returns true if the format (color, rendition flag) of the compared characters is equal - */ - bool equalsFormat(const Character &other) const; - - /** - * Compares two characters and returns true if they have the same unicode character value, - * rendition and colors. - */ - friend bool operator == (const Character& a, const Character& b); - /** - * Compares two characters and returns true if they have different unicode character values, - * renditions or colors. - */ - friend bool operator != (const Character& a, const Character& b); -}; - -inline bool operator == (const Character& a, const Character& b) -{ - return a.character == b.character && - a.rendition == b.rendition && - a.foregroundColor == b.foregroundColor && - a.backgroundColor == b.backgroundColor; -} - -inline bool operator != (const Character& a, const Character& b) -{ - return a.character != b.character || - a.rendition != b.rendition || - a.foregroundColor != b.foregroundColor || - a.backgroundColor != b.backgroundColor; -} - -inline bool Character::isTransparent(const ColorEntry* base) const -{ - return ((backgroundColor._colorSpace == COLOR_SPACE_DEFAULT) && - base[backgroundColor._u+0+(backgroundColor._v?BASE_COLORS:0)].transparent) - || ((backgroundColor._colorSpace == COLOR_SPACE_SYSTEM) && - base[backgroundColor._u+2+(backgroundColor._v?BASE_COLORS:0)].transparent); -} - -inline bool Character::equalsFormat(const Character& other) const -{ - return - backgroundColor==other.backgroundColor && - foregroundColor==other.foregroundColor && - rendition==other.rendition; -} - -inline ColorEntry::FontWeight Character::fontWeight(const ColorEntry* base) const -{ - if (backgroundColor._colorSpace == COLOR_SPACE_DEFAULT) - return base[backgroundColor._u+0+(backgroundColor._v?BASE_COLORS:0)].fontWeight; - else if (backgroundColor._colorSpace == COLOR_SPACE_SYSTEM) - return base[backgroundColor._u+2+(backgroundColor._v?BASE_COLORS:0)].fontWeight; - else - return ColorEntry::UseCurrentFormat; -} - -extern unsigned short vt100_graphics[32]; - - -/** - * A table which stores sequences of unicode characters, referenced - * by hash keys. The hash key itself is the same size as a unicode - * character ( ushort ) so that it can occupy the same space in - * a structure. - */ -class ExtendedCharTable -{ -public: - /** Constructs a new character table. */ - ExtendedCharTable(); - ~ExtendedCharTable(); - - /** - * Adds a sequences of unicode characters to the table and returns - * a hash code which can be used later to look up the sequence - * using lookupExtendedChar() - * - * If the same sequence already exists in the table, the hash - * of the existing sequence will be returned. - * - * @param unicodePoints An array of unicode character points - * @param length Length of @p unicodePoints - */ - ushort createExtendedChar(ushort* unicodePoints , ushort length); - /** - * Looks up and returns a pointer to a sequence of unicode characters - * which was added to the table using createExtendedChar(). - * - * @param hash The hash key returned by createExtendedChar() - * @param length This variable is set to the length of the - * character sequence. - * - * @return A unicode character sequence of size @p length. - */ - ushort* lookupExtendedChar(ushort hash , ushort& length) const; - - /** The global ExtendedCharTable instance. */ - static ExtendedCharTable instance; -private: - // calculates the hash key of a sequence of unicode points of size 'length' - ushort extendedCharHash(ushort* unicodePoints , ushort length) const; - // tests whether the entry in the table specified by 'hash' matches the - // character sequence 'unicodePoints' of size 'length' - bool extendedCharMatch(ushort hash , ushort* unicodePoints , ushort length) const; - // internal, maps hash keys to character sequence buffers. The first ushort - // in each value is the length of the buffer, followed by the ushorts in the buffer - // themselves. - QHash<ushort,ushort*> extendedCharTable; -}; - -Q_DECLARE_TYPEINFO(Character, Q_MOVABLE_TYPE); - -#endif // CHARACTER_H -
deleted file mode 100644 --- a/gui/src/CharacterColor.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - This file is part of Konsole, KDE's terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 CHARACTERCOLOR_H -#define CHARACTERCOLOR_H - -// Qt -#include <QtGui/QColor> - -/** - * An entry in a terminal display's color palette. - * - * A color palette is an array of 16 ColorEntry instances which map - * system color indexes (from 0 to 15) into actual colors. - * - * Each entry can be set as bold, in which case any text - * drawn using the color should be drawn in bold. - * - * Each entry can also be transparent, in which case the terminal - * display should avoid drawing the background for any characters - * using the entry as a background. - */ -class ColorEntry -{ -public: - /** Specifies the weight to use when drawing text with this color. */ - enum FontWeight - { - /** Always draw text in this color with a bold weight. */ - Bold, - /** Always draw text in this color with a normal weight. */ - Normal, - /** - * Use the current font weight set by the terminal application. - * This is the default behavior. - */ - UseCurrentFormat - }; - - /** - * Constructs a new color palette entry. - * - * @param c The color value for this entry. - * @param tr Specifies that the color should be transparent when used as a background color. - * @param weight Specifies the font weight to use when drawing text with this color. - */ - ColorEntry(QColor c, bool tr, FontWeight weight = UseCurrentFormat) - : color(c), transparent(tr), fontWeight(weight) {} - - /** - * Constructs a new color palette entry with an undefined color, and - * with the transparent and bold flags set to false. - */ - ColorEntry() : transparent(false), fontWeight(UseCurrentFormat) {} - - /** - * Sets the color, transparency and boldness of this color to those of @p rhs. - */ - void operator=(const ColorEntry& rhs) - { - color = rhs.color; - transparent = rhs.transparent; - fontWeight = rhs.fontWeight; - } - - /** The color value of this entry for display. */ - QColor color; - - /** - * If true character backgrounds using this color should be transparent. - * This is not applicable when the color is used to render text. - */ - bool transparent; - /** - * Specifies the font weight to use when drawing text with this color. - * This is not applicable when the color is used to draw a character's background. - */ - FontWeight fontWeight; -}; - - -// Attributed Character Representations /////////////////////////////// - -// Colors - -#define BASE_COLORS (2+8) -#define INTENSITIES 2 -#define TABLE_COLORS (INTENSITIES*BASE_COLORS) - -#define DEFAULT_FORE_COLOR 0 -#define DEFAULT_BACK_COLOR 1 - -//a standard set of colors using black text on a white background. -//defined in TerminalDisplay.cpp - -extern const ColorEntry base_color_table[TABLE_COLORS]; - -/* CharacterColor is a union of the various color spaces. - - Assignment is as follows: - - Type - Space - Values - - 0 - Undefined - u: 0, v:0 w:0 - 1 - Default - u: 0..1 v:intense w:0 - 2 - System - u: 0..7 v:intense w:0 - 3 - Index(256) - u: 16..255 v:0 w:0 - 4 - RGB - u: 0..255 v:0..256 w:0..256 - - Default colour space has two separate colours, namely - default foreground and default background colour. -*/ - -#define COLOR_SPACE_UNDEFINED 0 -#define COLOR_SPACE_DEFAULT 1 -#define COLOR_SPACE_SYSTEM 2 -#define COLOR_SPACE_256 3 -#define COLOR_SPACE_RGB 4 - -/** - * Describes the color of a single character in the terminal. - */ -class CharacterColor -{ - friend class Character; - -public: - /** Constructs a new CharacterColor whoose color and color space are undefined. */ - CharacterColor() - : _colorSpace(COLOR_SPACE_UNDEFINED), - _u(0), - _v(0), - _w(0) - {} - - /** - * Constructs a new CharacterColor using the specified @p colorSpace and with - * color value @p co - * - * The meaning of @p co depends on the @p colorSpace used. - * - * TODO : Document how @p co relates to @p colorSpace - * - * TODO : Add documentation about available color spaces. - */ - CharacterColor(quint8 colorSpace, int co) - : _colorSpace(colorSpace), - _u(0), - _v(0), - _w(0) - { - switch (colorSpace) - { - case COLOR_SPACE_DEFAULT: - _u = co & 1; - break; - case COLOR_SPACE_SYSTEM: - _u = co & 7; - _v = (co >> 3) & 1; - break; - case COLOR_SPACE_256: - _u = co & 255; - break; - case COLOR_SPACE_RGB: - _u = co >> 16; - _v = co >> 8; - _w = co; - break; - default: - _colorSpace = COLOR_SPACE_UNDEFINED; - } - } - - /** - * Returns true if this character color entry is valid. - */ - bool isValid() - { - return _colorSpace != COLOR_SPACE_UNDEFINED; - } - - /** - * Toggles the value of this color between a normal system color and the corresponding intensive - * system color. - * - * This is only applicable if the color is using the COLOR_SPACE_DEFAULT or COLOR_SPACE_SYSTEM - * color spaces. - */ - void toggleIntensive(); - - /** - * Returns the color within the specified color @p palette - * - * The @p palette is only used if this color is one of the 16 system colors, otherwise - * it is ignored. - */ - QColor color(const ColorEntry* palette) const; - - /** - * Compares two colors and returns true if they represent the same color value and - * use the same color space. - */ - friend bool operator == (const CharacterColor& a, const CharacterColor& b); - /** - * Compares two colors and returns true if they represent different color values - * or use different color spaces. - */ - friend bool operator != (const CharacterColor& a, const CharacterColor& b); - -private: - quint8 _colorSpace; - - // bytes storing the character color - quint8 _u; - quint8 _v; - quint8 _w; -}; - -inline bool operator == (const CharacterColor& a, const CharacterColor& b) -{ - return a._colorSpace == b._colorSpace && - a._u == b._u && - a._v == b._v && - a._w == b._w; -} -inline bool operator != (const CharacterColor& a, const CharacterColor& b) -{ - return !operator==(a,b); -} - -inline const QColor color256(quint8 u, const ColorEntry* base) -{ - // 0.. 16: system colors - if (u < 8) return base[u+2 ].color; u -= 8; - if (u < 8) return base[u+2+BASE_COLORS].color; u -= 8; - - // 16..231: 6x6x6 rgb color cube - if (u < 216) return QColor(((u/36)%6) ? (40*((u/36)%6)+55) : 0, - ((u/ 6)%6) ? (40*((u/ 6)%6)+55) : 0, - ((u/ 1)%6) ? (40*((u/ 1)%6)+55) : 0); u -= 216; - - // 232..255: gray, leaving out black and white - int gray = u*10+8; return QColor(gray,gray,gray); -} - -inline QColor CharacterColor::color(const ColorEntry* base) const -{ - switch (_colorSpace) - { - case COLOR_SPACE_DEFAULT: return base[_u+0+(_v?BASE_COLORS:0)].color; - case COLOR_SPACE_SYSTEM: return base[_u+2+(_v?BASE_COLORS:0)].color; - case COLOR_SPACE_256: return color256(_u,base); - case COLOR_SPACE_RGB: return QColor(_u,_v,_w); - case COLOR_SPACE_UNDEFINED: return QColor(); - } - - Q_ASSERT(false); // invalid color space - - return QColor(); -} - -inline void CharacterColor::toggleIntensive() -{ - if (_colorSpace == COLOR_SPACE_SYSTEM || _colorSpace == COLOR_SPACE_DEFAULT) - { - _v = !_v; - } -} - -#endif // CHARACTERCOLOR_H -
deleted file mode 100644 --- a/gui/src/ColorTables.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef _COLOR_TABLE_H -#define _COLOR_TABLE_H - -#include "CharacterColor.h" - -static const ColorEntry whiteonblack_color_table[TABLE_COLORS] = -{ - // normal - ColorEntry(QColor(0xFF,0xFF,0xFF), 0, 0 ), ColorEntry( QColor(0x00,0x00,0x00), 1, 0 ), // Dfore, Dback - ColorEntry(QColor(0x00,0x00,0x00), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0x18), 0, 0 ), // Black, Red - ColorEntry(QColor(0x18,0xB2,0x18), 0, 0 ), ColorEntry( QColor(0xB2,0x68,0x18), 0, 0 ), // Green, Yellow - ColorEntry(QColor(0x18,0x18,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0x18,0xB2), 0, 0 ), // Blue, Magenta - ColorEntry(QColor(0x18,0xB2,0xB2), 0, 0 ), ColorEntry( QColor(0xB2,0xB2,0xB2), 0, 0 ), // Cyan, White - // intensiv - ColorEntry(QColor(0x00,0x00,0x00), 0, 1 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 1, 0 ), - ColorEntry(QColor(0x68,0x68,0x68), 0, 0 ), ColorEntry( QColor(0xFF,0x54,0x54), 0, 0 ), - ColorEntry(QColor(0x54,0xFF,0x54), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0x54), 0, 0 ), - ColorEntry(QColor(0x54,0x54,0xFF), 0, 0 ), ColorEntry( QColor(0xFF,0x54,0xFF), 0, 0 ), - ColorEntry(QColor(0x54,0xFF,0xFF), 0, 0 ), ColorEntry( QColor(0xFF,0xFF,0xFF), 0, 0 ) -}; - -static const ColorEntry greenonblack_color_table[TABLE_COLORS] = -{ - ColorEntry(QColor( 24, 240, 24), 0, 0), ColorEntry(QColor( 0, 0, 0), 1, 0), - ColorEntry(QColor( 0, 0, 0), 0, 0), ColorEntry(QColor( 178, 24, 24), 0, 0), - ColorEntry(QColor( 24, 178, 24), 0, 0), ColorEntry(QColor( 178, 104, 24), 0, 0), - ColorEntry(QColor( 24, 24, 178), 0, 0), ColorEntry(QColor( 178, 24, 178), 0, 0), - ColorEntry(QColor( 24, 178, 178), 0, 0), ColorEntry(QColor( 178, 178, 178), 0, 0), - // intensive colors - ColorEntry(QColor( 24, 240, 24), 0, 1 ), ColorEntry(QColor( 0, 0, 0), 1, 0 ), - ColorEntry(QColor( 104, 104, 104), 0, 0 ), ColorEntry(QColor( 255, 84, 84), 0, 0 ), - ColorEntry(QColor( 84, 255, 84), 0, 0 ), ColorEntry(QColor( 255, 255, 84), 0, 0 ), - ColorEntry(QColor( 84, 84, 255), 0, 0 ), ColorEntry(QColor( 255, 84, 255), 0, 0 ), - ColorEntry(QColor( 84, 255, 255), 0, 0 ), ColorEntry(QColor( 255, 255, 255), 0, 0 ) -}; - -static const ColorEntry blackonlightyellow_color_table[TABLE_COLORS] = -{ - ColorEntry(QColor( 0, 0, 0), 0, 0), ColorEntry(QColor( 255, 255, 221), 1, 0), - ColorEntry(QColor( 0, 0, 0), 0, 0), ColorEntry(QColor( 178, 24, 24), 0, 0), - ColorEntry(QColor( 24, 178, 24), 0, 0), ColorEntry(QColor( 178, 104, 24), 0, 0), - ColorEntry(QColor( 24, 24, 178), 0, 0), ColorEntry(QColor( 178, 24, 178), 0, 0), - ColorEntry(QColor( 24, 178, 178), 0, 0), ColorEntry(QColor( 178, 178, 178), 0, 0), - ColorEntry(QColor( 0, 0, 0), 0, 1), ColorEntry(QColor( 255, 255, 221), 1, 0), - ColorEntry(QColor(104, 104, 104), 0, 0), ColorEntry(QColor( 255, 84, 84), 0, 0), - ColorEntry(QColor( 84, 255, 84), 0, 0), ColorEntry(QColor( 255, 255, 84), 0, 0), - ColorEntry(QColor( 84, 84, 255), 0, 0), ColorEntry(QColor( 255, 84, 255), 0, 0), - ColorEntry(QColor( 84, 255, 255), 0, 0), ColorEntry(QColor( 255, 255, 255), 0, 0) -}; - - - - - -#endif -
deleted file mode 100644 --- a/gui/src/DefaultTranslatorText.h +++ /dev/null @@ -1,2 +0,0 @@ -"keyboard \"Fallback Key Translator\"\n" -"key Tab : \"\\t\" \0"
deleted file mode 100644 --- a/gui/src/Emulation.cpp +++ /dev/null @@ -1,404 +0,0 @@ -/* - Copyright 2007-2008 Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - Copyright 1996 by Matthias Ettrich <ettrich@kde.org> - - This program 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 program 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. -*/ - -// Own -#include "Emulation.h" - -// System -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -// Qt -#include <QtGui/QApplication> -#include <QtGui/QClipboard> -#include <QtCore/QHash> -#include <QtGui/QKeyEvent> -#include <QtCore/QRegExp> -#include <QtCore/QTextStream> -#include <QtCore/QThread> - -#include <QtCore/QTime> - -// Konsole -#include "KeyboardTranslator.h" -#include "Screen.h" -#include "TerminalCharacterDecoder.h" -#include "ScreenWindow.h" - -Emulation::Emulation() : - _currentScreen(0), - _codec(0), - _decoder(0), - _keyTranslator(0), - _usesMouse(false) -{ - // create screens with a default size - _screen[0] = new Screen(40,80); - _screen[1] = new Screen(40,80); - _currentScreen = _screen[0]; - - QObject::connect(&_bulkTimer1, SIGNAL(timeout()), this, SLOT(showBulk()) ); - QObject::connect(&_bulkTimer2, SIGNAL(timeout()), this, SLOT(showBulk()) ); - - // listen for mouse status changes - connect( this , SIGNAL(programUsesMouseChanged(bool)) , - SLOT(usesMouseChanged(bool)) ); -} - -bool Emulation::programUsesMouse() const -{ - return _usesMouse; -} - -void Emulation::usesMouseChanged(bool usesMouse) -{ - _usesMouse = usesMouse; -} - -ScreenWindow* Emulation::createWindow() -{ - ScreenWindow* window = new ScreenWindow(); - window->setScreen(_currentScreen); - _windows << window; - - connect(window , SIGNAL(selectionChanged()), - this , SLOT(bufferedUpdate())); - - connect(this , SIGNAL(outputChanged()), - window , SLOT(notifyOutputChanged()) ); - return window; -} - -Emulation::~Emulation() -{ - QListIterator<ScreenWindow*> windowIter(_windows); - - while (windowIter.hasNext()) - { - delete windowIter.next(); - } - - delete _screen[0]; - delete _screen[1]; - delete _decoder; -} - -void Emulation::setScreen(int n) -{ - Screen *old = _currentScreen; - _currentScreen = _screen[n & 1]; - if (_currentScreen != old) - { - // tell all windows onto this emulation to switch to the newly active screen - foreach(ScreenWindow* window,_windows) - window->setScreen(_currentScreen); - } -} - -void Emulation::clearHistory() -{ - _screen[0]->setScroll( _screen[0]->getScroll() , false ); -} -void Emulation::setHistory(const HistoryType& t) -{ - _screen[0]->setScroll(t); - - showBulk(); -} - -const HistoryType& Emulation::history() const -{ - return _screen[0]->getScroll(); -} - -void Emulation::setCodec(const QTextCodec * qtc) -{ - if (qtc) - _codec = qtc; - else - setCodec(LocaleCodec); - - delete _decoder; - _decoder = _codec->makeDecoder(); - - emit useUtf8Request(utf8()); -} - -void Emulation::setCodec(EmulationCodec codec) -{ - if ( codec == Utf8Codec ) - setCodec( QTextCodec::codecForName("utf8") ); - else if ( codec == LocaleCodec ) - setCodec( QTextCodec::codecForLocale() ); -} - -void Emulation::setKeyBindings(const QString& name) -{ - _keyTranslator = KeyboardTranslatorManager::instance()->findTranslator(name); - if (!_keyTranslator) - { - _keyTranslator = KeyboardTranslatorManager::instance()->defaultTranslator(); - } -} - -QString Emulation::keyBindings() const -{ - return _keyTranslator->name(); -} - -void Emulation::receiveChar(int c) -// process application unicode input to terminal -// this is a trivial scanner -{ - c &= 0xff; - switch (c) - { - case '\b' : _currentScreen->backspace(); break; - case '\t' : _currentScreen->tab(); break; - case '\n' : _currentScreen->newLine(); break; - case '\r' : _currentScreen->toStartOfLine(); break; - case 0x07 : emit stateSet(NOTIFYBELL); - break; - default : _currentScreen->displayCharacter(c); break; - }; -} - -void Emulation::sendKeyEvent( QKeyEvent* ev ) -{ - emit stateSet(NOTIFYNORMAL); - - if (!ev->text().isEmpty()) - { // A block of text - // Note that the text is proper unicode. - // We should do a conversion here - emit sendData(ev->text().toUtf8(), ev->text().length()); - } -} - -void Emulation::sendString(const char*,int) -{ - // default implementation does nothing -} - -void Emulation::sendMouseEvent(int /*buttons*/, int /*column*/, int /*row*/, int /*eventType*/) -{ - // default implementation does nothing -} - -/* - We are doing code conversion from locale to unicode first. -TODO: Character composition from the old code. See #96536 -*/ - -void Emulation::receiveData(const char* text, int length) -{ - emit stateSet(NOTIFYACTIVITY); - - bufferedUpdate(); - - QString unicodeText = _decoder->toUnicode(text,length); - - //send characters to terminal emulator - for (int i=0;i<unicodeText.length();i++) - receiveChar(unicodeText[i].unicode()); - - //look for z-modem indicator - //-- someone who understands more about z-modems that I do may be able to move - //this check into the above for loop? - for (int i=0;i<length;i++) - { - if (text[i] == '\030') - { - if ((length-i-1 > 3) && (strncmp(text+i+1, "B00", 3) == 0)) - emit zmodemDetected(); - } - } -} - -void Emulation::writeToStream( TerminalCharacterDecoder* _decoder , - int startLine , - int endLine) -{ - _currentScreen->writeLinesToStream(_decoder,startLine,endLine); -} - -int Emulation::lineCount() const -{ - // sum number of lines currently on _screen plus number of lines in history - return _currentScreen->getLines() + _currentScreen->getHistLines(); -} - -#define BULK_TIMEOUT1 10 -#define BULK_TIMEOUT2 40 - -void Emulation::showBulk() -{ - _bulkTimer1.stop(); - _bulkTimer2.stop(); - - emit outputChanged(); - - _currentScreen->resetScrolledLines(); - _currentScreen->resetDroppedLines(); -} - -void Emulation::bufferedUpdate() -{ - _bulkTimer1.setSingleShot(true); - _bulkTimer1.start(BULK_TIMEOUT1); - if (!_bulkTimer2.isActive()) - { - _bulkTimer2.setSingleShot(true); - _bulkTimer2.start(BULK_TIMEOUT2); - } -} - -char Emulation::eraseChar() const -{ - return '\b'; -} - -void Emulation::setImageSize(int lines, int columns) -{ - if ((lines < 1) || (columns < 1)) - return; - - QSize screenSize[2] = { QSize(_screen[0]->getColumns(), - _screen[0]->getLines()), - QSize(_screen[1]->getColumns(), - _screen[1]->getLines()) }; - QSize newSize(columns,lines); - - if (newSize == screenSize[0] && newSize == screenSize[1]) - return; - - _screen[0]->resizeImage(lines,columns); - _screen[1]->resizeImage(lines,columns); - - emit imageSizeChanged(lines,columns); - - bufferedUpdate(); -} - -QSize Emulation::imageSize() const -{ - return QSize(_currentScreen->getColumns(), _currentScreen->getLines()); -} - -ushort ExtendedCharTable::extendedCharHash(ushort* unicodePoints , ushort length) const -{ - ushort hash = 0; - for ( ushort i = 0 ; i < length ; i++ ) - { - hash = 31*hash + unicodePoints[i]; - } - return hash; -} -bool ExtendedCharTable::extendedCharMatch(ushort hash , ushort* unicodePoints , ushort length) const -{ - ushort* entry = extendedCharTable[hash]; - - // compare given length with stored sequence length ( given as the first ushort in the - // stored buffer ) - if ( entry == 0 || entry[0] != length ) - return false; - // if the lengths match, each character must be checked. the stored buffer starts at - // entry[1] - for ( int i = 0 ; i < length ; i++ ) - { - if ( entry[i+1] != unicodePoints[i] ) - return false; - } - return true; -} -ushort ExtendedCharTable::createExtendedChar(ushort* unicodePoints , ushort length) -{ - // look for this sequence of points in the table - ushort hash = extendedCharHash(unicodePoints,length); - - // check existing entry for match - while ( extendedCharTable.contains(hash) ) - { - if ( extendedCharMatch(hash,unicodePoints,length) ) - { - // this sequence already has an entry in the table, - // return its hash - return hash; - } - else - { - // if hash is already used by another, different sequence of unicode character - // points then try next hash - hash++; - } - } - - - // add the new sequence to the table and - // return that index - ushort* buffer = new ushort[length+1]; - buffer[0] = length; - for ( int i = 0 ; i < length ; i++ ) - buffer[i+1] = unicodePoints[i]; - - extendedCharTable.insert(hash,buffer); - - return hash; -} - -ushort* ExtendedCharTable::lookupExtendedChar(ushort hash , ushort& length) const -{ - // lookup index in table and if found, set the length - // argument and return a pointer to the character sequence - - ushort* buffer = extendedCharTable[hash]; - if ( buffer ) - { - length = buffer[0]; - return buffer+1; - } - else - { - length = 0; - return 0; - } -} - -ExtendedCharTable::ExtendedCharTable() -{ -} -ExtendedCharTable::~ExtendedCharTable() -{ - // free all allocated character buffers - QHashIterator<ushort,ushort*> iter(extendedCharTable); - while ( iter.hasNext() ) - { - iter.next(); - delete[] iter.value(); - } -} - -// global instance -ExtendedCharTable ExtendedCharTable::instance; - -
deleted file mode 100644 --- a/gui/src/Emulation.h +++ /dev/null @@ -1,462 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 EMULATION_H -#define EMULATION_H - -// System -#include <stdio.h> - -// Qt -#include <QtGui/QKeyEvent> -#include <QtCore/QTextCodec> -#include <QtCore/QTextStream> -#include <QtCore/QTimer> - - -class KeyboardTranslator; -class HistoryType; -class Screen; -class ScreenWindow; -class TerminalCharacterDecoder; - -/** - * This enum describes the available states which - * the terminal emulation may be set to. - * - * These are the values used by Emulation::stateChanged() - */ -enum -{ - /** The emulation is currently receiving user input. */ - NOTIFYNORMAL=0, - /** - * The terminal program has triggered a bell event - * to get the user's attention. - */ - NOTIFYBELL=1, - /** - * The emulation is currently receiving data from its - * terminal input. - */ - NOTIFYACTIVITY=2, - - // unused here? - NOTIFYSILENCE=3 -}; - -/** - * Base class for terminal emulation back-ends. - * - * The back-end is responsible for decoding an incoming character stream and - * producing an output image of characters. - * - * When input from the terminal is received, the receiveData() slot should be called with - * the data which has arrived. The emulation will process the data and update the - * screen image accordingly. The codec used to decode the incoming character stream - * into the unicode characters used internally can be specified using setCodec() - * - * The size of the screen image can be specified by calling setImageSize() with the - * desired number of lines and columns. When new lines are added, old content - * is moved into a history store, which can be set by calling setHistory(). - * - * The screen image can be accessed by creating a ScreenWindow onto this emulation - * by calling createWindow(). Screen windows provide access to a section of the - * output. Each screen window covers the same number of lines and columns as the - * image size returned by imageSize(). The screen window can be moved up and down - * and provides transparent access to both the current on-screen image and the - * previous output. The screen windows emit an outputChanged signal - * when the section of the image they are looking at changes. - * Graphical views can then render the contents of a screen window, listening for notifications - * of output changes from the screen window which they are associated with and updating - * accordingly. - * - * The emulation also is also responsible for converting input from the connected views such - * as keypresses and mouse activity into a character string which can be sent - * to the terminal program. Key presses can be processed by calling the sendKeyEvent() slot, - * while mouse events can be processed using the sendMouseEvent() slot. When the character - * stream has been produced, the emulation will emit a sendData() signal with a pointer - * to the character buffer. This data should be fed to the standard input of the terminal - * process. The translation of key presses into an output character stream is performed - * using a lookup in a set of key bindings which map key sequences to output - * character sequences. The name of the key bindings set used can be specified using - * setKeyBindings() - * - * The emulation maintains certain state information which changes depending on the - * input received. The emulation can be reset back to its starting state by calling - * reset(). - * - * The emulation also maintains an activity state, which specifies whether - * terminal is currently active ( when data is received ), normal - * ( when the terminal is idle or receiving user input ) or trying - * to alert the user ( also known as a "Bell" event ). The stateSet() signal - * is emitted whenever the activity state is set. This can be used to determine - * how long the emulation has been active/idle for and also respond to - * a 'bell' event in different ways. - */ -class Emulation : public QObject -{ -Q_OBJECT - -public: - - /** Constructs a new terminal emulation */ - Emulation(); - ~Emulation(); - - /** - * Creates a new window onto the output from this emulation. The contents - * of the window are then rendered by views which are set to use this window using the - * TerminalDisplay::setScreenWindow() method. - */ - ScreenWindow* createWindow(); - - /** Returns the size of the screen image which the emulation produces */ - QSize imageSize() const; - - /** - * Returns the total number of lines, including those stored in the history. - */ - int lineCount() const; - - /** - * Sets the history store used by this emulation. When new lines - * are added to the output, older lines at the top of the screen are transferred to a history - * store. - * - * The number of lines which are kept and the storage location depend on the - * type of store. - */ - void setHistory(const HistoryType&); - /** Returns the history store used by this emulation. See setHistory() */ - const HistoryType& history() const; - /** Clears the history scroll. */ - void clearHistory(); - - /** - * Copies the output history from @p startLine to @p endLine - * into @p stream, using @p decoder to convert the terminal - * characters into text. - * - * @param decoder A decoder which converts lines of terminal characters with - * appearance attributes into output text. PlainTextDecoder is the most commonly - * used decoder. - * @param startLine Index of first line to copy - * @param endLine Index of last line to copy - */ - virtual void writeToStream(TerminalCharacterDecoder* decoder,int startLine,int endLine); - - /** Returns the codec used to decode incoming characters. See setCodec() */ - const QTextCodec* codec() const { return _codec; } - /** Sets the codec used to decode incoming characters. */ - void setCodec(const QTextCodec*); - - /** - * Convenience method. - * Returns true if the current codec used to decode incoming - * characters is UTF-8 - */ - bool utf8() const - { Q_ASSERT(_codec); return _codec->mibEnum() == 106; } - - - /** TODO Document me */ - virtual char eraseChar() const; - - /** - * Sets the key bindings used to key events - * ( received through sendKeyEvent() ) into character - * streams to send to the terminal. - */ - void setKeyBindings(const QString& name); - /** - * Returns the name of the emulation's current key bindings. - * See setKeyBindings() - */ - QString keyBindings() const; - - /** - * Copies the current image into the history and clears the screen. - */ - virtual void clearEntireScreen() =0; - - /** Resets the state of the terminal. */ - virtual void reset() =0; - - /** - * Returns true if the active terminal program wants - * mouse input events. - * - * The programUsesMouseChanged() signal is emitted when this - * changes. - */ - bool programUsesMouse() const; - -public slots: - - /** Change the size of the emulation's image */ - virtual void setImageSize(int lines, int columns); - - /** - * Interprets a sequence of characters and sends the result to the terminal. - * This is equivalent to calling sendKeyEvent() for each character in @p text in succession. - */ - virtual void sendText(const QString& text) = 0; - - /** - * Interprets a key press event and emits the sendData() signal with - * the resulting character stream. - */ - virtual void sendKeyEvent(QKeyEvent*); - - /** - * Converts information about a mouse event into an xterm-compatible escape - * sequence and emits the character sequence via sendData() - */ - virtual void sendMouseEvent(int buttons, int column, int line, int eventType); - - /** - * Sends a string of characters to the foreground terminal process. - * - * @param string The characters to send. - * @param length Length of @p string or if set to a negative value, @p string will - * be treated as a null-terminated string and its length will be determined automatically. - */ - virtual void sendString(const char* string, int length = -1) = 0; - - /** - * Processes an incoming stream of characters. receiveData() decodes the incoming - * character buffer using the current codec(), and then calls receiveChar() for - * each unicode character in the resulting buffer. - * - * receiveData() also starts a timer which causes the outputChanged() signal - * to be emitted when it expires. The timer allows multiple updates in quick - * succession to be buffered into a single outputChanged() signal emission. - * - * @param buffer A string of characters received from the terminal program. - * @param len The length of @p buffer - */ - void receiveData(const char* buffer,int len); - -signals: - - /** - * Emitted when a buffer of data is ready to send to the - * standard input of the terminal. - * - * @param data The buffer of data ready to be sent - * @param len The length of @p data in bytes - */ - void sendData(const char* data,int len); - - /** - * Requests that sending of input to the emulation - * from the terminal process be suspended or resumed. - * - * @param suspend If true, requests that sending of - * input from the terminal process' stdout be - * suspended. Otherwise requests that sending of - * input be resumed. - */ - void lockPtyRequest(bool suspend); - - /** - * Requests that the pty used by the terminal process - * be set to UTF 8 mode. - * - * TODO: More documentation - */ - void useUtf8Request(bool); - - /** - * Emitted when the activity state of the emulation is set. - * - * @param state The new activity state, one of NOTIFYNORMAL, NOTIFYACTIVITY - * or NOTIFYBELL - */ - void stateSet(int state); - - /** TODO Document me */ - void zmodemDetected(); - - - /** - * Requests that the color of the text used - * to represent the tabs associated with this - * emulation be changed. This is a Konsole-specific - * extension from pre-KDE 4 times. - * - * TODO: Document how the parameter works. - */ - void changeTabTextColorRequest(int color); - - /** - * This is emitted when the program running in the shell indicates whether or - * not it is interested in mouse events. - * - * @param usesMouse This will be true if the program wants to be informed about - * mouse events or false otherwise. - */ - void programUsesMouseChanged(bool usesMouse); - - /** - * Emitted when the contents of the screen image change. - * The emulation buffers the updates from successive image changes, - * and only emits outputChanged() at sensible intervals when - * there is a lot of terminal activity. - * - * Normally there is no need for objects other than the screen windows - * created with createWindow() to listen for this signal. - * - * ScreenWindow objects created using createWindow() will emit their - * own outputChanged() signal in response to this signal. - */ - void outputChanged(); - - /** - * Emitted when the program running in the terminal wishes to update the - * session's title. This also allows terminal programs to customize other - * aspects of the terminal emulation display. - * - * This signal is emitted when the escape sequence "\033]ARG;VALUE\007" - * is received in the input string, where ARG is a number specifying what - * should change and VALUE is a string specifying the new value. - * - * TODO: The name of this method is not very accurate since this method - * is used to perform a whole range of tasks besides just setting - * the user-title of the session. - * - * @param title Specifies what to change. - * <ul> - * <li>0 - Set window icon text and session title to @p newTitle</li> - * <li>1 - Set window icon text to @p newTitle</li> - * <li>2 - Set session title to @p newTitle</li> - * <li>11 - Set the session's default background color to @p newTitle, - * where @p newTitle can be an HTML-style string ("#RRGGBB") or a named - * color (eg 'red', 'blue'). - * See http://doc.trolltech.com/4.2/qcolor.html#setNamedColor for more - * details. - * </li> - * <li>31 - Supposedly treats @p newTitle as a URL and opens it (NOT IMPLEMENTED)</li> - * <li>32 - Sets the icon associated with the session. @p newTitle is the name - * of the icon to use, which can be the name of any icon in the current KDE icon - * theme (eg: 'konsole', 'kate', 'folder_home')</li> - * </ul> - * @param newTitle Specifies the new title - */ - - void titleChanged(int title,const QString& newTitle); - - /** - * Emitted when the program running in the terminal changes the - * screen size. - */ - void imageSizeChanged(int lineCount , int columnCount); - - /** - * Emitted when the terminal program requests to change various properties - * of the terminal display. - * - * A profile change command occurs when a special escape sequence, followed - * by a string containing a series of name and value pairs is received. - * This string can be parsed using a ProfileCommandParser instance. - * - * @param text A string expected to contain a series of key and value pairs in - * the form: name=value;name2=value2 ... - */ - void profileChangeCommandReceived(const QString& text); - - /** - * Emitted when a flow control key combination ( Ctrl+S or Ctrl+Q ) is pressed. - * @param suspendKeyPressed True if Ctrl+S was pressed to suspend output or Ctrl+Q to - * resume output. - */ - void flowControlKeyPressed(bool suspendKeyPressed); - -protected: - virtual void setMode(int mode) = 0; - virtual void resetMode(int mode) = 0; - - /** - * Processes an incoming character. See receiveData() - * @p ch A unicode character code. - */ - virtual void receiveChar(int ch); - - /** - * Sets the active screen. The terminal has two screens, primary and alternate. - * The primary screen is used by default. When certain interactive programs such - * as Vim are run, they trigger a switch to the alternate screen. - * - * @param index 0 to switch to the primary screen, or 1 to switch to the alternate screen - */ - void setScreen(int index); - - enum EmulationCodec - { - LocaleCodec = 0, - Utf8Codec = 1 - }; - void setCodec(EmulationCodec codec); // codec number, 0 = locale, 1=utf8 - - - QList<ScreenWindow*> _windows; - - Screen* _currentScreen; // pointer to the screen which is currently active, - // this is one of the elements in the screen[] array - - Screen* _screen[2]; // 0 = primary screen ( used by most programs, including the shell - // scrollbars are enabled in this mode ) - // 1 = alternate ( used by vi , emacs etc. - // scrollbars are not enabled in this mode ) - - - //decodes an incoming C-style character stream into a unicode QString using - //the current text codec. (this allows for rendering of non-ASCII characters in text files etc.) - const QTextCodec* _codec; - QTextDecoder* _decoder; - const KeyboardTranslator* _keyTranslator; // the keyboard layout - -protected slots: - /** - * Schedules an update of attached views. - * Repeated calls to bufferedUpdate() in close succession will result in only a single update, - * much like the Qt buffered update of widgets. - */ - void bufferedUpdate(); - -private slots: - - // triggered by timer, causes the emulation to send an updated screen image to each - // view - void showBulk(); - - void usesMouseChanged(bool usesMouse); - -private: - bool _usesMouse; - QTimer _bulkTimer1; - QTimer _bulkTimer2; - -}; - -#endif // ifndef EMULATION_H
deleted file mode 100644 --- a/gui/src/FileEditorDockWidget.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include "FileEditorDockWidget.h" -#include <QVBoxLayout> -#include <QApplication> -#include <QFile> -#include <QFileDialog> -#include <QMessageBox> -#include <QAction> - -FileEditorDockWidget::FileEditorDockWidget(QWidget *parent) - : QDockWidget(parent) { - construct(); -} - -void FileEditorDockWidget::loadFile(QString fileName) { - m_fileName = fileName; - setWindowTitle(fileName); - m_simpleEditor->load(fileName); -} - -void FileEditorDockWidget::newFile() { - if(m_modified) { - int decision - = QMessageBox::question(this, - "Open New File", - "Do you want to save the current file?", - QMessageBox::Yes, QMessageBox::No); - - if(decision == QMessageBox::Yes) { - saveFile(); - if(m_modified) { - // If the user attempted to save the file, but it's still - // modified, then probably something went wrong, so we quit here. - return; - } - } - } - - m_fileName = "<unnamed>"; - setWindowTitle(m_fileName); - m_simpleEditor->setPlainText(""); -} - -void FileEditorDockWidget::saveFile() { - QString saveFileName = QFileDialog::getSaveFileName(this, "Save File", m_fileName); - if(saveFileName.isEmpty()) - return; - - QFile file(saveFileName); - file.open(QFile::WriteOnly); - - if(file.write(m_simpleEditor->toPlainText().toLocal8Bit()) == -1) { - QMessageBox::warning(this, - "Error Saving File", - QString("The file could not be saved: %1.").arg(file.errorString())); - } else { - m_simpleEditor->document()->setModified(false); - } - - file.close(); -} - -void FileEditorDockWidget::showToolTipNew() { - m_statusBar->showMessage("Create a new file.", 2000); -} - -void FileEditorDockWidget::showToolTipSave() { - m_statusBar->showMessage("Save the file.", 2000); -} - -void FileEditorDockWidget::showToolTipUndo() { - m_statusBar->showMessage("Revert previous changes.", 2000); -} - -void FileEditorDockWidget::showToolTipRedo() { - m_statusBar->showMessage("Append previous changes.", 2000); -} - -void FileEditorDockWidget::registerModified(bool modified) { - m_modified = modified; -} - -void FileEditorDockWidget::construct() { - QStyle *style = QApplication::style(); - setWidget(new QWidget()); - m_toolBar = new QToolBar(this); - m_simpleEditor = new SimpleEditor(this); - m_statusBar = new QStatusBar(this); - m_numberedTextView = new NumberedCodeEdit(this, m_simpleEditor); - - m_simpleEditor->setFont(QFont("Courier")); - m_simpleEditor->setLineWrapMode(QPlainTextEdit::NoWrap); - - QAction *newAction = new QAction(style->standardIcon(QStyle::SP_FileIcon), - "", m_toolBar); - QAction *saveAction = new QAction(style->standardIcon(QStyle::SP_DriveHDIcon), - "", m_toolBar); - QAction *undoAction = new QAction(style->standardIcon(QStyle::SP_ArrowLeft), - "", m_toolBar); - QAction *redoAction = new QAction(style->standardIcon(QStyle::SP_ArrowRight), - "", m_toolBar); - - m_toolBar->addAction(newAction); - m_toolBar->addAction(saveAction); - m_toolBar->addAction(undoAction); - m_toolBar->addAction(redoAction); - - QVBoxLayout *layout = new QVBoxLayout(); - layout->addWidget(m_toolBar); - layout->addWidget(m_numberedTextView); - layout->addWidget(m_statusBar); - layout->setMargin(2); - widget()->setLayout(layout); - - connect(newAction, SIGNAL(triggered()), this, SLOT(newFile())); - connect(undoAction, SIGNAL(triggered()), m_simpleEditor, SLOT(undo())); - connect(redoAction, SIGNAL(triggered()), m_simpleEditor, SLOT(redo())); - connect(saveAction, SIGNAL(triggered()), this, SLOT(saveFile())); - - connect(newAction, SIGNAL(hovered()), this, SLOT(showToolTipNew())); - connect(undoAction, SIGNAL(hovered()), this, SLOT(showToolTipUndo())); - connect(redoAction, SIGNAL(hovered()), this, SLOT(showToolTipRedo())); - connect(saveAction, SIGNAL(hovered()), this, SLOT(showToolTipSave())); - - connect(m_simpleEditor, SIGNAL(modificationChanged(bool)), this, SLOT(registerModified(bool))); - - m_fileName = ""; - setWindowTitle(m_fileName); -}
deleted file mode 100644 --- a/gui/src/FileEditorDockWidget.h +++ /dev/null @@ -1,54 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef FILEEDITORDOCKWIDGET_H -#define FILEEDITORDOCKWIDGET_H - -#include <QDockWidget> -#include <QToolBar> -#include <QStatusBar> -#include "SimpleEditor.h" -#include "NumberedCodeEdit.h" - -class FileEditorDockWidget : public QDockWidget { - Q_OBJECT -public: - FileEditorDockWidget(QWidget *parent = 0); - void loadFile(QString fileName); - -public slots: - void newFile(); - void saveFile(); - - void showToolTipNew(); - void showToolTipSave(); - void showToolTipUndo(); - void showToolTipRedo(); - - void registerModified(bool modified); -private: - void construct(); - QToolBar *m_toolBar; - SimpleEditor *m_simpleEditor; - NumberedCodeEdit *m_numberedTextView; - QStatusBar *m_statusBar; - QString m_fileName; - bool m_modified; -}; - -#endif // FILEEDITORDOCKWIDGET_H
deleted file mode 100644 --- a/gui/src/FilesDockWidget.cpp +++ /dev/null @@ -1,98 +0,0 @@ -#include "FilesDockWidget.h" - -#include <QApplication> -#include <QFileInfo> - -FilesDockWidget::FilesDockWidget(QWidget *parent) - : QDockWidget(parent) { - setObjectName("FilesDockWidget"); - setWindowTitle(tr("Current Folder")); - setWidget(new QWidget(this)); - - // Create a toolbar - m_navigationToolBar = new QToolBar("", widget()); - m_navigationToolBar->setAllowedAreas(Qt::TopToolBarArea); - m_navigationToolBar->setMovable(false); - m_navigationToolBar->setIconSize(QSize (20,20)); - - // Add a button to the toolbar with the QT standard icon for up-directory - // TODO: Maybe change this to be an up-directory icon that is OS specific??? - QStyle *style = QApplication::style(); - m_directoryIcon = style->standardIcon(QStyle::SP_FileDialogToParent); - m_directoryUpAction = new QAction(m_directoryIcon, "", m_navigationToolBar); - m_currentDirectory = new QLineEdit(m_navigationToolBar); - - m_navigationToolBar->addAction(m_directoryUpAction); - m_navigationToolBar->addWidget(m_currentDirectory); - connect(m_directoryUpAction, SIGNAL(triggered()), this, SLOT(onUpDirectory())); - - // TODO: Add other buttons for creating directories - - // Create the QFileSystemModel starting in the home directory - QString homePath = QDir::homePath(); - // TODO: This should occur after Octave has been initialized and the startup directory of Octave is established - - m_fileSystemModel = new QFileSystemModel(this); - m_fileSystemModel->setFilter(QDir::NoDotAndDotDot | QDir::AllEntries); - QModelIndex rootPathIndex = m_fileSystemModel->setRootPath(homePath); - - // Attach the model to the QTreeView and set the root index - m_fileTreeView = new QTreeView(widget()); - m_fileTreeView->setModel(m_fileSystemModel); - m_fileTreeView->setRootIndex(rootPathIndex); - m_fileTreeView->setSortingEnabled(true); - m_fileTreeView->setAlternatingRowColors(true); - m_fileTreeView->setAnimated(true); - setCurrentDirectory(m_fileSystemModel->fileInfo(rootPathIndex).absoluteFilePath()); - - connect(m_fileTreeView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(itemDoubleClicked(const QModelIndex &))); - - // Layout the widgets vertically with the toolbar on top - QVBoxLayout *layout = new QVBoxLayout(); - layout->setSpacing(0); - layout->addWidget(m_navigationToolBar); - layout->addWidget(m_fileTreeView); - widget()->setLayout(layout); - // TODO: Add right-click contextual menus for copying, pasting, deleting files (and others) - - connect(m_currentDirectory, SIGNAL(returnPressed()), this, SLOT(currentDirectoryEntered())); - //m_currentDirectory->setEnabled(false); -} - -void FilesDockWidget::itemDoubleClicked(const QModelIndex &index) -{ - QFileInfo fileInfo = m_fileSystemModel->fileInfo(index); - if (fileInfo.isDir()) { - m_fileSystemModel->setRootPath(fileInfo.absolutePath()); - m_fileTreeView->setRootIndex(index); - setCurrentDirectory(m_fileSystemModel->fileInfo(index).absoluteFilePath()); - } else { - QFileInfo fileInfo = m_fileSystemModel->fileInfo(index); - emit openFile(fileInfo.filePath()); - } -} - -void FilesDockWidget::setCurrentDirectory(QString currentDirectory) { - m_currentDirectory->setText(currentDirectory); -} - -void FilesDockWidget::onUpDirectory(void) { - // Move up an inm_fileTreeView->setRootIndex(m_fileSystemModel->index(dir.absolutePath()));dex node - QDir dir = QDir(m_fileSystemModel->filePath(m_fileTreeView->rootIndex())); - dir.cdUp(); - m_fileSystemModel->setRootPath(dir.absolutePath()); - m_fileTreeView->setRootIndex(m_fileSystemModel->index(dir.absolutePath())); - setCurrentDirectory(dir.absolutePath()); -} - -void FilesDockWidget::currentDirectoryEntered() { - QFileInfo fileInfo(m_currentDirectory->text()); - if (fileInfo.isDir()) { - m_fileTreeView->setRootIndex(m_fileSystemModel->index(fileInfo.absolutePath())); - m_fileSystemModel->setRootPath(fileInfo.absolutePath()); - setCurrentDirectory(fileInfo.absoluteFilePath()); - } else { - if(QFile::exists(fileInfo.absoluteFilePath())) - emit openFile(fileInfo.absoluteFilePath()); - } -}
deleted file mode 100644 --- a/gui/src/FilesDockWidget.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 John P. Swensen, Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef FILESDOCKWIDGET_H -#define FILESDOCKWIDGET_H - -#include <QListView> -#include <QDate> -#include <QObject> -#include <QWidget> -#include <QListWidget> -#include <QFileSystemModel> -#include <QToolBar> -#include <QToolButton> -#include <QVBoxLayout> -#include <QAction> -#include <QTreeView> - -#include <vector> -#include <string> - -#undef PACKAGE_BUGREPORT -#undef PACKAGE_NAME -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION -#include "octave/config.h" -#include "octave/octave.h" -#include "octave/str-vec.h" -#include "octave/cmd-hist.h" -#include <QDockWidget> -#include <QLineEdit> - -class FilesDockWidget : public QDockWidget { - Q_OBJECT -public : - FilesDockWidget(QWidget *parent = 0); -public slots: - /** Slot for handling a change in directory via double click. */ - void itemDoubleClicked(const QModelIndex &index); - - /** Slot for handling the up-directory button in the toolbar. */ - void onUpDirectory(); - - void setCurrentDirectory(QString currentDirectory); - - void currentDirectoryEntered(); - -signals: - void openFile(QString fileName); - -private: - // TODO: Add toolbar with buttons for navigating the path, creating dirs, etc - - /** Toolbar for file and directory manipulation. */ - QToolBar *m_navigationToolBar; - - /** Variables for the up-directory action. */ - QIcon m_directoryIcon; - QAction *m_directoryUpAction; - QToolButton *upDirectoryButton; - - /** The file system model. */ - QFileSystemModel *m_fileSystemModel; - - /** The file system view. */ - QTreeView *m_fileTreeView; - QLineEdit *m_currentDirectory; -}; - -#endif // FILESDOCKWIDGET_H
deleted file mode 100644 --- a/gui/src/Filter.cpp +++ /dev/null @@ -1,534 +0,0 @@ -/* - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - - This program 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 program 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. -*/ - -// Own -#include "Filter.h" - -// System -#include <iostream> - -// Qt -#include <QtGui/QAction> -#include <QtGui/QApplication> -#include <QtGui/QClipboard> -#include <QtCore/QString> -#include <QtCore/QTextStream> -#include <QtCore/QSharedData> -#include <QtCore/QFile> - -// Konsole -#include "TerminalCharacterDecoder.h" -#include "konsole_wcwidth.h" -#include "konsole_export.h" - -FilterChain::~FilterChain() -{ - QMutableListIterator<Filter*> iter(*this); - - while ( iter.hasNext() ) - { - Filter* filter = iter.next(); - iter.remove(); - delete filter; - } -} - -void FilterChain::addFilter(Filter* filter) -{ - append(filter); -} -void FilterChain::removeFilter(Filter* filter) -{ - removeAll(filter); -} -bool FilterChain::containsFilter(Filter* filter) -{ - return contains(filter); -} -void FilterChain::reset() -{ - QListIterator<Filter*> iter(*this); - while (iter.hasNext()) - iter.next()->reset(); -} -void FilterChain::setBuffer(const QString* buffer , const QList<int>* linePositions) -{ - QListIterator<Filter*> iter(*this); - while (iter.hasNext()) - iter.next()->setBuffer(buffer,linePositions); -} -void FilterChain::process() -{ - QListIterator<Filter*> iter(*this); - while (iter.hasNext()) - iter.next()->process(); -} -void FilterChain::clear() -{ - QList<Filter*>::clear(); -} -Filter::HotSpot* FilterChain::hotSpotAt(int line , int column) const -{ - QListIterator<Filter*> iter(*this); - while (iter.hasNext()) - { - Filter* filter = iter.next(); - Filter::HotSpot* spot = filter->hotSpotAt(line,column); - if ( spot != 0 ) - { - return spot; - } - } - - return 0; -} - -QList<Filter::HotSpot*> FilterChain::hotSpots() const -{ - QList<Filter::HotSpot*> list; - QListIterator<Filter*> iter(*this); - while (iter.hasNext()) - { - Filter* filter = iter.next(); - list << filter->hotSpots(); - } - return list; -} -//QList<Filter::HotSpot*> FilterChain::hotSpotsAtLine(int line) const; - -TerminalImageFilterChain::TerminalImageFilterChain() -: _buffer(0) -, _linePositions(0) -{ -} - -TerminalImageFilterChain::~TerminalImageFilterChain() -{ - delete _buffer; - delete _linePositions; -} - -void TerminalImageFilterChain::setImage(const Character* const image , int lines , int columns, const QVector<LineProperty>& lineProperties) -{ - if (empty()) - return; - - // reset all filters and hotspots - reset(); - - PlainTextDecoder decoder; - decoder.setTrailingWhitespace(false); - - // setup new shared buffers for the filters to process on - QString* newBuffer = new QString(); - QList<int>* newLinePositions = new QList<int>(); - setBuffer( newBuffer , newLinePositions ); - - // free the old buffers - delete _buffer; - delete _linePositions; - - _buffer = newBuffer; - _linePositions = newLinePositions; - - QTextStream lineStream(_buffer); - decoder.begin(&lineStream); - - for (int i=0 ; i < lines ; i++) - { - _linePositions->append(_buffer->length()); - decoder.decodeLine(image + i*columns,columns,LINE_DEFAULT); - - // pretend that each line ends with a newline character. - // this prevents a link that occurs at the end of one line - // being treated as part of a link that occurs at the start of the next line - // - // the downside is that links which are spread over more than one line are not - // highlighted. - // - // TODO - Use the "line wrapped" attribute associated with lines in a - // terminal image to avoid adding this imaginary character for wrapped - // lines - if ( !(lineProperties.value(i,LINE_DEFAULT) & LINE_WRAPPED) ) - lineStream << QChar('\n'); - } - decoder.end(); -} - -Filter::Filter() : -_linePositions(0), -_buffer(0) -{ -} - -Filter::~Filter() -{ - QListIterator<HotSpot*> iter(_hotspotList); - while (iter.hasNext()) - { - delete iter.next(); - } -} -void Filter::reset() -{ - _hotspots.clear(); - _hotspotList.clear(); -} - -void Filter::setBuffer(const QString* buffer , const QList<int>* linePositions) -{ - _buffer = buffer; - _linePositions = linePositions; -} - -void Filter::getLineColumn(int position , int& startLine , int& startColumn) -{ - Q_ASSERT( _linePositions ); - Q_ASSERT( _buffer ); - - - for (int i = 0 ; i < _linePositions->count() ; i++) - { - int nextLine = 0; - - if ( i == _linePositions->count()-1 ) - nextLine = _buffer->length() + 1; - else - nextLine = _linePositions->value(i+1); - - if ( _linePositions->value(i) <= position && position < nextLine ) - { - startLine = i; - startColumn = string_width(buffer()->mid(_linePositions->value(i),position - _linePositions->value(i))); - return; - } - } -} - - -/*void Filter::addLine(const QString& text) -{ - _linePositions << _buffer.length(); - _buffer.append(text); -}*/ - -const QString* Filter::buffer() -{ - return _buffer; -} -Filter::HotSpot::~HotSpot() -{ -} -void Filter::addHotSpot(HotSpot* spot) -{ - _hotspotList << spot; - - for (int line = spot->startLine() ; line <= spot->endLine() ; line++) - { - _hotspots.insert(line,spot); - } -} -QList<Filter::HotSpot*> Filter::hotSpots() const -{ - return _hotspotList; -} -QList<Filter::HotSpot*> Filter::hotSpotsAtLine(int line) const -{ - return _hotspots.values(line); -} - -Filter::HotSpot* Filter::hotSpotAt(int line , int column) const -{ - QListIterator<HotSpot*> spotIter(_hotspots.values(line)); - - while (spotIter.hasNext()) - { - HotSpot* spot = spotIter.next(); - - if ( spot->startLine() == line && spot->startColumn() > column ) - continue; - if ( spot->endLine() == line && spot->endColumn() < column ) - continue; - - return spot; - } - - return 0; -} - -Filter::HotSpot::HotSpot(int startLine , int startColumn , int endLine , int endColumn) - : _startLine(startLine) - , _startColumn(startColumn) - , _endLine(endLine) - , _endColumn(endColumn) - , _type(NotSpecified) -{ -} -QString Filter::HotSpot::tooltip() const -{ - return QString(); -} -QList<QAction*> Filter::HotSpot::actions() -{ - return QList<QAction*>(); -} -int Filter::HotSpot::startLine() const -{ - return _startLine; -} -int Filter::HotSpot::endLine() const -{ - return _endLine; -} -int Filter::HotSpot::startColumn() const -{ - return _startColumn; -} -int Filter::HotSpot::endColumn() const -{ - return _endColumn; -} -Filter::HotSpot::Type Filter::HotSpot::type() const -{ - return _type; -} -void Filter::HotSpot::setType(Type type) -{ - _type = type; -} - -RegExpFilter::RegExpFilter() -{ -} - -RegExpFilter::HotSpot::HotSpot(int startLine,int startColumn,int endLine,int endColumn) - : Filter::HotSpot(startLine,startColumn,endLine,endColumn) -{ - setType(Marker); -} - -void RegExpFilter::HotSpot::activate(QObject*) -{ -} - -void RegExpFilter::HotSpot::setCapturedTexts(const QStringList& texts) -{ - _capturedTexts = texts; -} -QStringList RegExpFilter::HotSpot::capturedTexts() const -{ - return _capturedTexts; -} - -void RegExpFilter::setRegExp(const QRegExp& regExp) -{ - _searchText = regExp; -} -QRegExp RegExpFilter::regExp() const -{ - return _searchText; -} -/*void RegExpFilter::reset(int) -{ - _buffer = QString(); -}*/ -void RegExpFilter::process() -{ - int pos = 0; - const QString* text = buffer(); - - Q_ASSERT( text ); - - // ignore any regular expressions which match an empty string. - // otherwise the while loop below will run indefinitely - static const QString emptyString(""); - if ( _searchText.exactMatch(emptyString) ) - return; - - while(pos >= 0) - { - pos = _searchText.indexIn(*text,pos); - - if ( pos >= 0 ) - { - int startLine = 0; - int endLine = 0; - int startColumn = 0; - int endColumn = 0; - - getLineColumn(pos,startLine,startColumn); - getLineColumn(pos + _searchText.matchedLength(),endLine,endColumn); - - RegExpFilter::HotSpot* spot = newHotSpot(startLine,startColumn, - endLine,endColumn); - spot->setCapturedTexts(_searchText.capturedTexts()); - - addHotSpot( spot ); - pos += _searchText.matchedLength(); - - // if matchedLength == 0, the program will get stuck in an infinite loop - if ( _searchText.matchedLength() == 0 ) - pos = -1; - } - } -} - -RegExpFilter::HotSpot* RegExpFilter::newHotSpot(int startLine,int startColumn, - int endLine,int endColumn) -{ - return new RegExpFilter::HotSpot(startLine,startColumn, - endLine,endColumn); -} -RegExpFilter::HotSpot* UrlFilter::newHotSpot(int startLine,int startColumn,int endLine, - int endColumn) -{ - return new UrlFilter::HotSpot(startLine,startColumn, - endLine,endColumn); -} -UrlFilter::HotSpot::HotSpot(int startLine,int startColumn,int endLine,int endColumn) -: RegExpFilter::HotSpot(startLine,startColumn,endLine,endColumn) -, _urlObject(new FilterObject(this)) -{ - setType(Link); -} -QString UrlFilter::HotSpot::tooltip() const -{ - QString url = capturedTexts().first(); - - const UrlType kind = urlType(); - - if ( kind == StandardUrl ) - return QString(); - else if ( kind == Email ) - return QString(); - else - return QString(); -} -UrlFilter::HotSpot::UrlType UrlFilter::HotSpot::urlType() const -{ - QString url = capturedTexts().first(); - - if ( FullUrlRegExp.exactMatch(url) ) - return StandardUrl; - else if ( EmailAddressRegExp.exactMatch(url) ) - return Email; - else - return Unknown; -} - -void UrlFilter::HotSpot::activate(QObject* object) -{ - QString url = capturedTexts().first(); - - const UrlType kind = urlType(); - - const QString& actionName = object ? object->objectName() : QString(); - - if ( actionName == "copy-action" ) - { - QApplication::clipboard()->setText(url); - return; - } - - if ( !object || actionName == "open-action" ) - { - if ( kind == StandardUrl ) - { - // if the URL path does not include the protocol ( eg. "www.kde.org" ) then - // prepend http:// ( eg. "www.kde.org" --> "http://www.kde.org" ) - if (!url.contains("://")) - { - url.prepend("http://"); - } - } - else if ( kind == Email ) - { - url.prepend("mailto:"); - } - - //new KRun(url,QApplication::activeWindow()); - } -} - -// Note: Altering these regular expressions can have a major effect on the performance of the filters -// used for finding URLs in the text, especially if they are very general and could match very long -// pieces of text. -// Please be careful when altering them. - -//regexp matches: -// full url: -// protocolname:// or www. followed by anything other than whitespaces, <, >, ' or ", and ends before whitespaces, <, >, ', ", ], !, comma and dot -const QRegExp UrlFilter::FullUrlRegExp("(www\\.(?!\\.)|[a-z][a-z0-9+.-]*://)[^\\s<>'\"]+[^!,\\.\\s<>'\"\\]]"); -// email address: -// [word chars, dots or dashes]@[word chars, dots or dashes].[word chars] -const QRegExp UrlFilter::EmailAddressRegExp("\\b(\\w|\\.|-)+@(\\w|\\.|-)+\\.\\w+\\b"); - -// matches full url or email address -const QRegExp UrlFilter::CompleteUrlRegExp('('+FullUrlRegExp.pattern()+'|'+ - EmailAddressRegExp.pattern()+')'); - -UrlFilter::UrlFilter() -{ - setRegExp( CompleteUrlRegExp ); -} -UrlFilter::HotSpot::~HotSpot() -{ - delete _urlObject; -} -void FilterObject::activated() -{ - _filter->activate(sender()); -} -QList<QAction*> UrlFilter::HotSpot::actions() -{ - QList<QAction*> list; - - const UrlType kind = urlType(); - - QAction* openAction = new QAction(_urlObject); - QAction* copyAction = new QAction(_urlObject);; - - Q_ASSERT( kind == StandardUrl || kind == Email ); - - if ( kind == StandardUrl ) - { - openAction->setText(i18n("Open Link")); - copyAction->setText(i18n("Copy Link Address")); - } - else if ( kind == Email ) - { - openAction->setText(i18n("Send Email To...")); - copyAction->setText(i18n("Copy Email Address")); - } - - // object names are set here so that the hotspot performs the - // correct action when activated() is called with the triggered - // action passed as a parameter. - openAction->setObjectName( QLatin1String("open-action" )); - copyAction->setObjectName( QLatin1String("copy-action" )); - - QObject::connect( openAction , SIGNAL(triggered()) , _urlObject , SLOT(activated()) ); - QObject::connect( copyAction , SIGNAL(triggered()) , _urlObject , SLOT(activated()) ); - - list << openAction; - list << copyAction; - - return list; -} -
deleted file mode 100644 --- a/gui/src/Filter.h +++ /dev/null @@ -1,379 +0,0 @@ -/* - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - - This program 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 program 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 FILTER_H -#define FILTER_H - -// Qt -#include <QtGui/QAction> -#include <QtCore/QList> -#include <QtCore/QObject> -#include <QtCore/QStringList> -#include <QtCore/QHash> -#include <QtCore/QRegExp> - -// Local -#include "Character.h" - - -/** - * A filter processes blocks of text looking for certain patterns (such as URLs or keywords from a list) - * and marks the areas which match the filter's patterns as 'hotspots'. - * - * Each hotspot has a type identifier associated with it ( such as a link or a highlighted section ), - * and an action. When the user performs some activity such as a mouse-click in a hotspot area ( the exact - * action will depend on what is displaying the block of text which the filter is processing ), the hotspot's - * activate() method should be called. Depending on the type of hotspot this will trigger a suitable response. - * - * For example, if a hotspot represents a URL then a suitable action would be opening that URL in a web browser. - * Hotspots may have more than one action, in which case the list of actions can be obtained using the - * actions() method. - * - * Different subclasses of filter will return different types of hotspot. - * Subclasses must reimplement the process() method to examine a block of text and identify sections of interest. - * When processing the text they should create instances of Filter::HotSpot subclasses for sections of interest - * and add them to the filter's list of hotspots using addHotSpot() - */ -class Filter -{ -public: - /** - * Represents an area of text which matched the pattern a particular filter has been looking for. - * - * Each hotspot has a type identifier associated with it ( such as a link or a highlighted section ), - * and an action. When the user performs some activity such as a mouse-click in a hotspot area ( the exact - * action will depend on what is displaying the block of text which the filter is processing ), the hotspot's - * activate() method should be called. Depending on the type of hotspot this will trigger a suitable response. - * - * For example, if a hotspot represents a URL then a suitable action would be opening that URL in a web browser. - * Hotspots may have more than one action, in which case the list of actions can be obtained using the - * actions() method. These actions may then be displayed in a popup menu or toolbar for example. - */ - class HotSpot - { - public: - /** - * Constructs a new hotspot which covers the area from (@p startLine,@p startColumn) to (@p endLine,@p endColumn) - * in a block of text. - */ - HotSpot(int startLine , int startColumn , int endLine , int endColumn); - virtual ~HotSpot(); - - enum Type - { - // the type of the hotspot is not specified - NotSpecified, - // this hotspot represents a clickable link - Link, - // this hotspot represents a marker - Marker - }; - - /** Returns the line when the hotspot area starts */ - int startLine() const; - /** Returns the line where the hotspot area ends */ - int endLine() const; - /** Returns the column on startLine() where the hotspot area starts */ - int startColumn() const; - /** Returns the column on endLine() where the hotspot area ends */ - int endColumn() const; - /** - * Returns the type of the hotspot. This is usually used as a hint for views on how to represent - * the hotspot graphically. eg. Link hotspots are typically underlined when the user mouses over them - */ - Type type() const; - /** - * Causes the an action associated with a hotspot to be triggered. - * - * @param object The object which caused the hotspot to be triggered. This is - * typically null ( in which case the default action should be performed ) or - * one of the objects from the actions() list. In which case the associated - * action should be performed. - */ - virtual void activate(QObject* object = 0) = 0; - /** - * Returns a list of actions associated with the hotspot which can be used in a - * menu or toolbar - */ - virtual QList<QAction*> actions(); - - /** - * Returns the text of a tooltip to be shown when the mouse moves over the hotspot, or - * an empty string if there is no tooltip associated with this hotspot. - * - * The default implementation returns an empty string. - */ - virtual QString tooltip() const; - - protected: - /** Sets the type of a hotspot. This should only be set once */ - void setType(Type type); - - private: - int _startLine; - int _startColumn; - int _endLine; - int _endColumn; - Type _type; - - }; - - /** Constructs a new filter. */ - Filter(); - virtual ~Filter(); - - /** Causes the filter to process the block of text currently in its internal buffer */ - virtual void process() = 0; - - /** - * Empties the filters internal buffer and resets the line count back to 0. - * All hotspots are deleted. - */ - void reset(); - - /** Adds a new line of text to the filter and increments the line count */ - //void addLine(const QString& string); - - /** Returns the hotspot which covers the given @p line and @p column, or 0 if no hotspot covers that area */ - HotSpot* hotSpotAt(int line , int column) const; - - /** Returns the list of hotspots identified by the filter */ - QList<HotSpot*> hotSpots() const; - - /** Returns the list of hotspots identified by the filter which occur on a given line */ - QList<HotSpot*> hotSpotsAtLine(int line) const; - - /** - * TODO: Document me - */ - void setBuffer(const QString* buffer , const QList<int>* linePositions); - -protected: - /** Adds a new hotspot to the list */ - void addHotSpot(HotSpot*); - /** Returns the internal buffer */ - const QString* buffer(); - /** Converts a character position within buffer() to a line and column */ - void getLineColumn(int position , int& startLine , int& startColumn); - -private: - QMultiHash<int,HotSpot*> _hotspots; - QList<HotSpot*> _hotspotList; - - const QList<int>* _linePositions; - const QString* _buffer; -}; - -/** - * A filter which searches for sections of text matching a regular expression and creates a new RegExpFilter::HotSpot - * instance for them. - * - * Subclasses can reimplement newHotSpot() to return custom hotspot types when matches for the regular expression - * are found. - */ -class RegExpFilter : public Filter -{ -public: - /** - * Type of hotspot created by RegExpFilter. The capturedTexts() method can be used to find the text - * matched by the filter's regular expression. - */ - class HotSpot : public Filter::HotSpot - { - public: - HotSpot(int startLine, int startColumn, int endLine , int endColumn); - virtual void activate(QObject* object = 0); - - /** Sets the captured texts associated with this hotspot */ - void setCapturedTexts(const QStringList& texts); - /** Returns the texts found by the filter when matching the filter's regular expression */ - QStringList capturedTexts() const; - private: - QStringList _capturedTexts; - }; - - /** Constructs a new regular expression filter */ - RegExpFilter(); - - /** - * Sets the regular expression which the filter searches for in blocks of text. - * - * Regular expressions which match the empty string are treated as not matching - * anything. - */ - void setRegExp(const QRegExp& text); - /** Returns the regular expression which the filter searches for in blocks of text */ - QRegExp regExp() const; - - /** - * Reimplemented to search the filter's text buffer for text matching regExp() - * - * If regexp matches the empty string, then process() will return immediately - * without finding results. - */ - virtual void process(); - -protected: - /** - * Called when a match for the regular expression is encountered. Subclasses should reimplement this - * to return custom hotspot types - */ - virtual RegExpFilter::HotSpot* newHotSpot(int startLine,int startColumn, - int endLine,int endColumn); - -private: - QRegExp _searchText; -}; - -class FilterObject; - -/** A filter which matches URLs in blocks of text */ -class UrlFilter : public RegExpFilter -{ -public: - /** - * Hotspot type created by UrlFilter instances. The activate() method opens a web browser - * at the given URL when called. - */ - class HotSpot : public RegExpFilter::HotSpot - { - public: - HotSpot(int startLine,int startColumn,int endLine,int endColumn); - virtual ~HotSpot(); - - virtual QList<QAction*> actions(); - - /** - * Open a web browser at the current URL. The url itself can be determined using - * the capturedTexts() method. - */ - virtual void activate(QObject* object = 0); - - virtual QString tooltip() const; - private: - enum UrlType - { - StandardUrl, - Email, - Unknown - }; - UrlType urlType() const; - - FilterObject* _urlObject; - }; - - UrlFilter(); - -protected: - virtual RegExpFilter::HotSpot* newHotSpot(int,int,int,int); - -private: - - static const QRegExp FullUrlRegExp; - static const QRegExp EmailAddressRegExp; - - // combined OR of FullUrlRegExp and EmailAddressRegExp - static const QRegExp CompleteUrlRegExp; -}; - -class FilterObject : public QObject -{ -Q_OBJECT -public: - FilterObject(Filter::HotSpot* filter) : _filter(filter) {} -private slots: - void activated(); -private: - Filter::HotSpot* _filter; -}; - -/** - * A chain which allows a group of filters to be processed as one. - * The chain owns the filters added to it and deletes them when the chain itself is destroyed. - * - * Use addFilter() to add a new filter to the chain. - * When new text to be filtered arrives, use addLine() to add each additional - * line of text which needs to be processed and then after adding the last line, use - * process() to cause each filter in the chain to process the text. - * - * After processing a block of text, the reset() method can be used to set the filter chain's - * internal cursor back to the first line. - * - * The hotSpotAt() method will return the first hotspot which covers a given position. - * - * The hotSpots() and hotSpotsAtLine() method return all of the hotspots in the text and on - * a given line respectively. - */ -class FilterChain : protected QList<Filter*> -{ -public: - virtual ~FilterChain(); - - /** Adds a new filter to the chain. The chain will delete this filter when it is destroyed */ - void addFilter(Filter* filter); - /** Removes a filter from the chain. The chain will no longer delete the filter when destroyed */ - void removeFilter(Filter* filter); - /** Returns true if the chain contains @p filter */ - bool containsFilter(Filter* filter); - /** Removes all filters from the chain */ - void clear(); - - /** Resets each filter in the chain */ - void reset(); - /** - * Processes each filter in the chain - */ - void process(); - - /** Sets the buffer for each filter in the chain to process. */ - void setBuffer(const QString* buffer , const QList<int>* linePositions); - - /** Returns the first hotspot which occurs at @p line, @p column or 0 if no hotspot was found */ - Filter::HotSpot* hotSpotAt(int line , int column) const; - /** Returns a list of all the hotspots in all the chain's filters */ - QList<Filter::HotSpot*> hotSpots() const; - /** Returns a list of all hotspots at the given line in all the chain's filters */ - QList<Filter::HotSpot> hotSpotsAtLine(int line) const; - -}; - -/** A filter chain which processes character images from terminal displays */ -class TerminalImageFilterChain : public FilterChain -{ -public: - TerminalImageFilterChain(); - virtual ~TerminalImageFilterChain(); - - /** - * Set the current terminal image to @p image. - * - * @param image The terminal image - * @param lines The number of lines in the terminal image - * @param columns The number of columns in the terminal image - * @param lineProperties The line properties to set for image - */ - void setImage(const Character* const image , int lines , int columns, - const QVector<LineProperty>& lineProperties); - -private: - QString* _buffer; - QList<int>* _linePositions; -}; - -#endif //FILTER_H
deleted file mode 100644 --- a/gui/src/History.cpp +++ /dev/null @@ -1,696 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - Copyright (C) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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. -*/ - -// Own -#include "History.h" - -// System -#include <iostream> -#include <stdlib.h> -#include <assert.h> -#include <stdio.h> -#include <sys/types.h> -#include <sys/mman.h> -#include <unistd.h> -#include <errno.h> - - -// Reasonable line size -#define LINE_SIZE 1024 - -/* - An arbitrary long scroll. - - One can modify the scroll only by adding either cells - or newlines, but access it randomly. - - The model is that of an arbitrary wide typewriter scroll - in that the scroll is a serie of lines and each line is - a serie of cells with no overwriting permitted. - - The implementation provides arbitrary length and numbers - of cells and line/column indexed read access to the scroll - at constant costs. - -KDE4: Can we use QTemporaryFile here, instead of KTempFile? - -FIXME: some complain about the history buffer comsuming the - memory of their machines. This problem is critical - since the history does not behave gracefully in cases - where the memory is used up completely. - - I put in a workaround that should handle it problem - now gracefully. I'm not satisfied with the solution. - -FIXME: Terminating the history is not properly indicated - in the menu. We should throw a signal. - -FIXME: There is noticeable decrease in speed, also. Perhaps, - there whole feature needs to be revisited therefore. - Disadvantage of a more elaborated, say block-oriented - scheme with wrap around would be it's complexity. -*/ - -//FIXME: tempory replacement for tmpfile -// this is here one for debugging purpose. - -//#define tmpfile xTmpFile - -// History File /////////////////////////////////////////// - -/* - A Row(X) data type which allows adding elements to the end. -*/ - -HistoryFile::HistoryFile() - : ion(-1), - length(0), - fileMap(0) -{ - if (tmpFile.open()) - { - tmpFile.setAutoRemove(true); - ion = tmpFile.handle(); - } -} - -HistoryFile::~HistoryFile() -{ - if (fileMap) - unmap(); -} - -//TODO: Mapping the entire file in will cause problems if the history file becomes exceedingly large, -//(ie. larger than available memory). HistoryFile::map() should only map in sections of the file at a time, -//to avoid this. -void HistoryFile::map() -{ - assert( fileMap == 0 ); - - fileMap = (char*)mmap( 0 , length , PROT_READ , MAP_PRIVATE , ion , 0 ); - - //if mmap'ing fails, fall back to the read-lseek combination - if ( fileMap == MAP_FAILED ) - { - readWriteBalance = 0; - fileMap = 0; - qDebug() << ": mmap'ing history failed. errno = " << errno; - } -} - -void HistoryFile::unmap() -{ - int result = munmap( fileMap , length ); - assert( result == 0 ); - - fileMap = 0; -} - -bool HistoryFile::isMapped() -{ - return (fileMap != 0); -} - -void HistoryFile::add(const unsigned char* bytes, int len) -{ - if ( fileMap ) - unmap(); - - readWriteBalance++; - - int rc = 0; - - rc = lseek(ion,length,SEEK_SET); if (rc < 0) { perror("HistoryFile::add.seek"); return; } - rc = write(ion,bytes,len); if (rc < 0) { perror("HistoryFile::add.write"); return; } - length += rc; -} - -void HistoryFile::get(unsigned char* bytes, int len, int loc) -{ - //count number of get() calls vs. number of add() calls. - //If there are many more get() calls compared with add() - //calls (decided by using MAP_THRESHOLD) then mmap the log - //file to improve performance. - readWriteBalance--; - if ( !fileMap && readWriteBalance < MAP_THRESHOLD ) - map(); - - if ( fileMap ) - { - for (int i=0;i<len;i++) - bytes[i]=fileMap[loc+i]; - } - else - { - int rc = 0; - - if (loc < 0 || len < 0 || loc + len > length) - fprintf(stderr,"getHist(...,%d,%d): invalid args.\n",len,loc); - rc = lseek(ion,loc,SEEK_SET); if (rc < 0) { perror("HistoryFile::get.seek"); return; } - rc = read(ion,bytes,len); if (rc < 0) { perror("HistoryFile::get.read"); return; } - } -} - -int HistoryFile::len() -{ - return length; -} - - -// History Scroll abstract base class ////////////////////////////////////// - - -HistoryScroll::HistoryScroll(HistoryType* t) - : m_histType(t) -{ -} - -HistoryScroll::~HistoryScroll() -{ - delete m_histType; -} - -bool HistoryScroll::hasScroll() -{ - return true; -} - -// History Scroll File ////////////////////////////////////// - -/* - The history scroll makes a Row(Row(Cell)) from - two history buffers. The index buffer contains - start of line positions which refere to the cells - buffer. - - Note that index[0] addresses the second line - (line #1), while the first line (line #0) starts - at 0 in cells. -*/ - -HistoryScrollFile::HistoryScrollFile(const QString &logFileName) - : HistoryScroll(new HistoryTypeFile(logFileName)), - m_logFileName(logFileName) -{ -} - -HistoryScrollFile::~HistoryScrollFile() -{ -} - -int HistoryScrollFile::getLines() -{ - return index.len() / sizeof(int); -} - -int HistoryScrollFile::getLineLen(int lineno) -{ - return (startOfLine(lineno+1) - startOfLine(lineno)) / sizeof(Character); -} - -bool HistoryScrollFile::isWrappedLine(int lineno) -{ - if (lineno>=0 && lineno <= getLines()) { - unsigned char flag; - lineflags.get((unsigned char*)&flag,sizeof(unsigned char),(lineno)*sizeof(unsigned char)); - return flag; - } - return false; -} - -int HistoryScrollFile::startOfLine(int lineno) -{ - if (lineno <= 0) return 0; - if (lineno <= getLines()) - { - - if (!index.isMapped()) - index.map(); - - int res; - index.get((unsigned char*)&res,sizeof(int),(lineno-1)*sizeof(int)); - return res; - } - return cells.len(); -} - -void HistoryScrollFile::getCells(int lineno, int colno, int count, Character res[]) -{ - cells.get((unsigned char*)res,count*sizeof(Character),startOfLine(lineno)+colno*sizeof(Character)); -} - -void HistoryScrollFile::addCells(const Character text[], int count) -{ - cells.add((unsigned char*)text,count*sizeof(Character)); -} - -void HistoryScrollFile::addLine(bool previousWrapped) -{ - if (index.isMapped()) - index.unmap(); - - int locn = cells.len(); - index.add((unsigned char*)&locn,sizeof(int)); - unsigned char flags = previousWrapped ? 0x01 : 0x00; - lineflags.add((unsigned char*)&flags,sizeof(unsigned char)); -} - - -// History Scroll Buffer ////////////////////////////////////// -HistoryScrollBuffer::HistoryScrollBuffer(unsigned int maxLineCount) - : HistoryScroll(new HistoryTypeBuffer(maxLineCount)) - ,_historyBuffer() - ,_maxLineCount(0) - ,_usedLines(0) - ,_head(0) -{ - setMaxNbLines(maxLineCount); -} - -HistoryScrollBuffer::~HistoryScrollBuffer() -{ - delete[] _historyBuffer; -} - -void HistoryScrollBuffer::addCellsVector(const QVector<Character>& cells) -{ - _head++; - if ( _usedLines < _maxLineCount ) - _usedLines++; - - if ( _head >= _maxLineCount ) - { - _head = 0; - } - - _historyBuffer[bufferIndex(_usedLines-1)] = cells; - _wrappedLine[bufferIndex(_usedLines-1)] = false; -} -void HistoryScrollBuffer::addCells(const Character a[], int count) -{ - HistoryLine newLine(count); - qCopy(a,a+count,newLine.begin()); - - addCellsVector(newLine); -} - -void HistoryScrollBuffer::addLine(bool previousWrapped) -{ - _wrappedLine[bufferIndex(_usedLines-1)] = previousWrapped; -} - -int HistoryScrollBuffer::getLines() -{ - return _usedLines; -} - -int HistoryScrollBuffer::getLineLen(int lineNumber) -{ - Q_ASSERT( lineNumber >= 0 && lineNumber < _maxLineCount ); - - if ( lineNumber < _usedLines ) - { - return _historyBuffer[bufferIndex(lineNumber)].size(); - } - else - { - return 0; - } -} - -bool HistoryScrollBuffer::isWrappedLine(int lineNumber) -{ - Q_ASSERT( lineNumber >= 0 && lineNumber < _maxLineCount ); - - if (lineNumber < _usedLines) - { - //kDebug() << "Line" << lineNumber << "wrapped is" << _wrappedLine[bufferIndex(lineNumber)]; - return _wrappedLine[bufferIndex(lineNumber)]; - } - else - return false; -} - -void HistoryScrollBuffer::getCells(int lineNumber, int startColumn, int count, Character* buffer) -{ - if ( count == 0 ) return; - - Q_ASSERT( lineNumber < _maxLineCount ); - - if (lineNumber >= _usedLines) - { - memset(buffer, 0, count * sizeof(Character)); - return; - } - - const HistoryLine& line = _historyBuffer[bufferIndex(lineNumber)]; - - //kDebug() << "startCol " << startColumn; - //kDebug() << "line.size() " << line.size(); - //kDebug() << "count " << count; - - Q_ASSERT( startColumn <= line.size() - count ); - - memcpy(buffer, line.constData() + startColumn , count * sizeof(Character)); -} - -void HistoryScrollBuffer::setMaxNbLines(unsigned int lineCount) -{ - HistoryLine* oldBuffer = _historyBuffer; - HistoryLine* newBuffer = new HistoryLine[lineCount]; - - for ( int i = 0 ; i < qMin(_usedLines,(int)lineCount) ; i++ ) - { - newBuffer[i] = oldBuffer[bufferIndex(i)]; - } - - _usedLines = qMin(_usedLines,(int)lineCount); - _maxLineCount = lineCount; - _head = ( _usedLines == _maxLineCount ) ? 0 : _usedLines-1; - - _historyBuffer = newBuffer; - delete[] oldBuffer; - - _wrappedLine.resize(lineCount); -} - -int HistoryScrollBuffer::bufferIndex(int lineNumber) -{ - Q_ASSERT( lineNumber >= 0 ); - Q_ASSERT( lineNumber < _maxLineCount ); - Q_ASSERT( (_usedLines == _maxLineCount) || lineNumber <= _head ); - - if ( _usedLines == _maxLineCount ) - { - return (_head+lineNumber+1) % _maxLineCount; - } - else - { - return lineNumber; - } -} - - -// History Scroll None ////////////////////////////////////// - -HistoryScrollNone::HistoryScrollNone() - : HistoryScroll(new HistoryTypeNone()) -{ -} - -HistoryScrollNone::~HistoryScrollNone() -{ -} - -bool HistoryScrollNone::hasScroll() -{ - return false; -} - -int HistoryScrollNone::getLines() -{ - return 0; -} - -int HistoryScrollNone::getLineLen(int) -{ - return 0; -} - -bool HistoryScrollNone::isWrappedLine(int /*lineno*/) -{ - return false; -} - -void HistoryScrollNone::getCells(int, int, int, Character []) -{ -} - -void HistoryScrollNone::addCells(const Character [], int) -{ -} - -void HistoryScrollNone::addLine(bool) -{ -} - -// History Scroll BlockArray ////////////////////////////////////// - -HistoryScrollBlockArray::HistoryScrollBlockArray(size_t size) - : HistoryScroll(new HistoryTypeBlockArray(size)) -{ - m_blockArray.setHistorySize(size); // nb. of lines. -} - -HistoryScrollBlockArray::~HistoryScrollBlockArray() -{ -} - -int HistoryScrollBlockArray::getLines() -{ - return m_lineLengths.count(); -} - -int HistoryScrollBlockArray::getLineLen(int lineno) -{ - if ( m_lineLengths.contains(lineno) ) - return m_lineLengths[lineno]; - else - return 0; -} - -bool HistoryScrollBlockArray::isWrappedLine(int /*lineno*/) -{ - return false; -} - -void HistoryScrollBlockArray::getCells(int lineno, int colno, - int count, Character res[]) -{ - if (!count) return; - - const Block *b = m_blockArray.at(lineno); - - if (!b) { - memset(res, 0, count * sizeof(Character)); // still better than random data - return; - } - - assert(((colno + count) * sizeof(Character)) < ENTRIES); - memcpy(res, b->data + (colno * sizeof(Character)), count * sizeof(Character)); -} - -void HistoryScrollBlockArray::addCells(const Character a[], int count) -{ - Block *b = m_blockArray.lastBlock(); - - if (!b) return; - - // put cells in block's data - assert((count * sizeof(Character)) < ENTRIES); - - memset(b->data, 0, ENTRIES); - - memcpy(b->data, a, count * sizeof(Character)); - b->size = count * sizeof(Character); - - size_t res = m_blockArray.newBlock(); - assert (res > 0); - Q_UNUSED( res ); - - m_lineLengths.insert(m_blockArray.getCurrent(), count); -} - -void HistoryScrollBlockArray::addLine(bool) -{ -} - -////////////////////////////////////////////////////////////////////// -// History Types -////////////////////////////////////////////////////////////////////// - -HistoryType::HistoryType() -{ -} - -HistoryType::~HistoryType() -{ -} - -////////////////////////////// - -HistoryTypeNone::HistoryTypeNone() -{ -} - -bool HistoryTypeNone::isEnabled() const -{ - return false; -} - -HistoryScroll* HistoryTypeNone::scroll(HistoryScroll *old) const -{ - delete old; - return new HistoryScrollNone(); -} - -int HistoryTypeNone::maximumLineCount() const -{ - return 0; -} - -////////////////////////////// - -HistoryTypeBlockArray::HistoryTypeBlockArray(size_t size) - : m_size(size) -{ -} - -bool HistoryTypeBlockArray::isEnabled() const -{ - return true; -} - -int HistoryTypeBlockArray::maximumLineCount() const -{ - return m_size; -} - -HistoryScroll* HistoryTypeBlockArray::scroll(HistoryScroll *old) const -{ - delete old; - return new HistoryScrollBlockArray(m_size); -} - - -////////////////////////////// - -HistoryTypeBuffer::HistoryTypeBuffer(unsigned int nbLines) - : m_nbLines(nbLines) -{ -} - -bool HistoryTypeBuffer::isEnabled() const -{ - return true; -} - -int HistoryTypeBuffer::maximumLineCount() const -{ - return m_nbLines; -} - -HistoryScroll* HistoryTypeBuffer::scroll(HistoryScroll *old) const -{ - if (old) - { - HistoryScrollBuffer *oldBuffer = dynamic_cast<HistoryScrollBuffer*>(old); - if (oldBuffer) - { - oldBuffer->setMaxNbLines(m_nbLines); - return oldBuffer; - } - - HistoryScroll *newScroll = new HistoryScrollBuffer(m_nbLines); - int lines = old->getLines(); - int startLine = 0; - if (lines > (int) m_nbLines) - startLine = lines - m_nbLines; - - Character line[LINE_SIZE]; - for(int i = startLine; i < lines; i++) - { - int size = old->getLineLen(i); - if (size > LINE_SIZE) - { - Character *tmp_line = new Character[size]; - old->getCells(i, 0, size, tmp_line); - newScroll->addCells(tmp_line, size); - newScroll->addLine(old->isWrappedLine(i)); - delete [] tmp_line; - } - else - { - old->getCells(i, 0, size, line); - newScroll->addCells(line, size); - newScroll->addLine(old->isWrappedLine(i)); - } - } - delete old; - return newScroll; - } - return new HistoryScrollBuffer(m_nbLines); -} - -////////////////////////////// - -HistoryTypeFile::HistoryTypeFile(const QString& fileName) - : m_fileName(fileName) -{ -} - -bool HistoryTypeFile::isEnabled() const -{ - return true; -} - -const QString& HistoryTypeFile::getFileName() const -{ - return m_fileName; -} - -HistoryScroll* HistoryTypeFile::scroll(HistoryScroll *old) const -{ - if (dynamic_cast<HistoryFile *>(old)) - return old; // Unchanged. - - HistoryScroll *newScroll = new HistoryScrollFile(m_fileName); - - Character line[LINE_SIZE]; - int lines = (old != 0) ? old->getLines() : 0; - for(int i = 0; i < lines; i++) - { - int size = old->getLineLen(i); - if (size > LINE_SIZE) - { - Character *tmp_line = new Character[size]; - old->getCells(i, 0, size, tmp_line); - newScroll->addCells(tmp_line, size); - newScroll->addLine(old->isWrappedLine(i)); - delete [] tmp_line; - } - else - { - old->getCells(i, 0, size, line); - newScroll->addCells(line, size); - newScroll->addLine(old->isWrappedLine(i)); - } - } - - delete old; - return newScroll; -} - -int HistoryTypeFile::maximumLineCount() const -{ - return 0; -}
deleted file mode 100644 --- a/gui/src/History.h +++ /dev/null @@ -1,307 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - Copyright (C) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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 HISTORY_H -#define HISTORY_H - -// Qt -#include <QtCore/QBitRef> -#include <QtCore/QHash> -#include <QtCore> - -// Konsole -#include "BlockArray.h" -#include "Character.h" - -class HistoryFile -{ -public: - HistoryFile(); - virtual ~HistoryFile(); - - virtual void add(const unsigned char* bytes, int len); - virtual void get(unsigned char* bytes, int len, int loc); - virtual int len(); - - //mmaps the file in read-only mode - void map(); - //un-mmaps the file - void unmap(); - //returns true if the file is mmap'ed - bool isMapped(); - - -private: - int ion; - int length; - QTemporaryFile tmpFile; - - //pointer to start of mmap'ed file data, or 0 if the file is not mmap'ed - char* fileMap; - - //incremented whenver 'add' is called and decremented whenever - //'get' is called. - //this is used to detect when a large number of lines are being read and processed from the history - //and automatically mmap the file for better performance (saves the overhead of many lseek-read calls). - int readWriteBalance; - - //when readWriteBalance goes below this threshold, the file will be mmap'ed automatically - static const int MAP_THRESHOLD = -1000; -}; - -////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////// -// Abstract base class for file and buffer versions -////////////////////////////////////////////////////////////////////// -class HistoryType; - -class HistoryScroll -{ -public: - HistoryScroll(HistoryType*); - virtual ~HistoryScroll(); - - virtual bool hasScroll(); - - // access to history - virtual int getLines() = 0; - virtual int getLineLen(int lineno) = 0; - virtual void getCells(int lineno, int colno, int count, Character res[]) = 0; - virtual bool isWrappedLine(int lineno) = 0; - - // backward compatibility (obsolete) - Character getCell(int lineno, int colno) { Character res; getCells(lineno,colno,1,&res); return res; } - - // adding lines. - virtual void addCells(const Character a[], int count) = 0; - // convenience method - this is virtual so that subclasses can take advantage - // of QVector's implicit copying - virtual void addCellsVector(const QVector<Character>& cells) - { - addCells(cells.data(),cells.size()); - } - - virtual void addLine(bool previousWrapped=false) = 0; - - // - // FIXME: Passing around constant references to HistoryType instances - // is very unsafe, because those references will no longer - // be valid if the history scroll is deleted. - // - const HistoryType& getType() { return *m_histType; } - -protected: - HistoryType* m_histType; - -}; - - - -////////////////////////////////////////////////////////////////////// -// File-based history (e.g. file log, no limitation in length) -////////////////////////////////////////////////////////////////////// - -class HistoryScrollFile : public HistoryScroll -{ -public: - HistoryScrollFile(const QString &logFileName); - virtual ~HistoryScrollFile(); - - virtual int getLines(); - virtual int getLineLen(int lineno); - virtual void getCells(int lineno, int colno, int count, Character res[]); - virtual bool isWrappedLine(int lineno); - - virtual void addCells(const Character a[], int count); - virtual void addLine(bool previousWrapped=false); - -private: - int startOfLine(int lineno); - - QString m_logFileName; - HistoryFile index; // lines Row(int) - HistoryFile cells; // text Row(Character) - HistoryFile lineflags; // flags Row(unsigned char) -}; - - -////////////////////////////////////////////////////////////////////// -// Buffer-based history (limited to a fixed nb of lines) -////////////////////////////////////////////////////////////////////// -class HistoryScrollBuffer : public HistoryScroll -{ -public: - typedef QVector<Character> HistoryLine; - - HistoryScrollBuffer(unsigned int maxNbLines = 1000); - virtual ~HistoryScrollBuffer(); - - virtual int getLines(); - virtual int getLineLen(int lineno); - virtual void getCells(int lineno, int colno, int count, Character res[]); - virtual bool isWrappedLine(int lineno); - - virtual void addCells(const Character a[], int count); - virtual void addCellsVector(const QVector<Character>& cells); - virtual void addLine(bool previousWrapped=false); - - void setMaxNbLines(unsigned int nbLines); - unsigned int maxNbLines() { return _maxLineCount; } - - -private: - int bufferIndex(int lineNumber); - - HistoryLine* _historyBuffer; - QBitArray _wrappedLine; - int _maxLineCount; - int _usedLines; - int _head; -}; - -////////////////////////////////////////////////////////////////////// -// Nothing-based history (no history :-) -////////////////////////////////////////////////////////////////////// -class HistoryScrollNone : public HistoryScroll -{ -public: - HistoryScrollNone(); - virtual ~HistoryScrollNone(); - - virtual bool hasScroll(); - - virtual int getLines(); - virtual int getLineLen(int lineno); - virtual void getCells(int lineno, int colno, int count, Character res[]); - virtual bool isWrappedLine(int lineno); - - virtual void addCells(const Character a[], int count); - virtual void addLine(bool previousWrapped=false); -}; - -////////////////////////////////////////////////////////////////////// -// BlockArray-based history -////////////////////////////////////////////////////////////////////// -class HistoryScrollBlockArray : public HistoryScroll -{ -public: - HistoryScrollBlockArray(size_t size); - virtual ~HistoryScrollBlockArray(); - - virtual int getLines(); - virtual int getLineLen(int lineno); - virtual void getCells(int lineno, int colno, int count, Character res[]); - virtual bool isWrappedLine(int lineno); - - virtual void addCells(const Character a[], int count); - virtual void addLine(bool previousWrapped=false); - -protected: - BlockArray m_blockArray; - QHash<int,size_t> m_lineLengths; -}; - -////////////////////////////////////////////////////////////////////// -// History type -////////////////////////////////////////////////////////////////////// - -class HistoryType -{ -public: - HistoryType(); - virtual ~HistoryType(); - - /** - * Returns true if the history is enabled ( can store lines of output ) - * or false otherwise. - */ - virtual bool isEnabled() const = 0; - /** - * Returns true if the history size is unlimited. - */ - bool isUnlimited() const { return maximumLineCount() == 0; } - /** - * Returns the maximum number of lines which this history type - * can store or 0 if the history can store an unlimited number of lines. - */ - virtual int maximumLineCount() const = 0; - - virtual HistoryScroll* scroll(HistoryScroll *) const = 0; -}; - -class HistoryTypeNone : public HistoryType -{ -public: - HistoryTypeNone(); - - virtual bool isEnabled() const; - virtual int maximumLineCount() const; - - virtual HistoryScroll* scroll(HistoryScroll *) const; -}; - -class HistoryTypeBlockArray : public HistoryType -{ -public: - HistoryTypeBlockArray(size_t size); - - virtual bool isEnabled() const; - virtual int maximumLineCount() const; - - virtual HistoryScroll* scroll(HistoryScroll *) const; - -protected: - size_t m_size; -}; - -class HistoryTypeFile : public HistoryType -{ -public: - HistoryTypeFile(const QString& fileName=QString()); - - virtual bool isEnabled() const; - virtual const QString& getFileName() const; - virtual int maximumLineCount() const; - - virtual HistoryScroll* scroll(HistoryScroll *) const; - -protected: - QString m_fileName; -}; - - -class HistoryTypeBuffer : public HistoryType -{ -public: - HistoryTypeBuffer(unsigned int nbLines); - - virtual bool isEnabled() const; - virtual int maximumLineCount() const; - - virtual HistoryScroll* scroll(HistoryScroll *) const; - -protected: - unsigned int m_nbLines; -}; - -#endif // HISTORY_H
deleted file mode 100644 --- a/gui/src/HistoryDockWidget.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include "HistoryDockWidget.h" -#include <QHBoxLayout> - -HistoryDockWidget::HistoryDockWidget(QWidget *parent) - : QDockWidget(parent) { - setObjectName("HistoryDockWidget"); - construct(); -} - -void HistoryDockWidget::handleListViewItemDoubleClicked(QModelIndex modelIndex) { - QString command = m_historyListModel->data(modelIndex, 0).toString(); - emit commandDoubleClicked(command); -} - -void HistoryDockWidget::construct() { - m_historyListModel = new QStringListModel(); - m_historyListView = new QListView(this); - m_historyListView->setModel(m_historyListModel); - m_historyListView->setAlternatingRowColors(true); - m_historyListView->setEditTriggers(QAbstractItemView::NoEditTriggers); - QHBoxLayout *layout = new QHBoxLayout(); - - setWindowTitle(tr("Command History")); - setWidget(new QWidget()); - - layout->addWidget(m_historyListView); - layout->setMargin(2); - - widget()->setLayout(layout); - connect(m_historyListView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(handleListViewItemDoubleClicked(QModelIndex))); -} - -void HistoryDockWidget::updateHistory(string_vector historyEntries) { - QStringList stringList = m_historyListModel->stringList(); - for(int i = 0; i < historyEntries.length(); i++) { - QString command(historyEntries[i].c_str()); - if(!command.startsWith("#")) { - stringList.push_front(command); - } - } - m_historyListModel->setStringList(stringList); - emit information(tr("History updated.")); -}
deleted file mode 100644 --- a/gui/src/HistoryDockWidget.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef HISTORYDOCKWIDGET_H -#define HISTORYDOCKWIDGET_H - -#include <QDockWidget> -#include <QListView> -#include <QStringListModel> - -// Octave includes -#undef PACKAGE_BUGREPORT -#undef PACKAGE_NAME -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION -#undef PACKAGE_URL -#include "octave/config.h" - -#include "octave/debug.h" -#include "octave/octave.h" -#include "octave/symtab.h" -#include "octave/parse.h" -#include "octave/unwind-prot.h" -#include "octave/toplev.h" -#include "octave/load-path.h" -#include "octave/error.h" -#include "octave/quit.h" -#include "octave/variables.h" -#include "octave/sighandlers.h" -#include "octave/sysdep.h" -#include "octave/str-vec.h" -#include "octave/cmd-hist.h" -#include "octave/cmd-edit.h" -#include "octave/oct-env.h" -#include "octave/symtab.h" -#include "cmd-edit.h" - -class HistoryDockWidget : public QDockWidget { - Q_OBJECT -public: - HistoryDockWidget(QWidget *parent = 0); - void updateHistory(string_vector historyEntries); - -signals: - void information(QString message); - void commandDoubleClicked(QString command); - -private slots: - void handleListViewItemDoubleClicked(QModelIndex modelIndex); - -private: - void construct(); - QListView *m_historyListView; - QStringListModel *m_historyListModel; -}; - -#endif // HISTORYDOCKWIDGET_H
deleted file mode 100644 --- a/gui/src/ImageViewerDockWidget.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "ImageViewerDockWidget.h" -#include <QLabel> -#include <QPixmap> -#include <QScrollArea> - -ImageViewerDockWidget::ImageViewerDockWidget(QPixmap pixmap, QWidget *parent) - : QDockWidget(parent), - m_pixmap(pixmap) { - construct(); -} - -void ImageViewerDockWidget::construct() { - QLabel *label = new QLabel(); - label->setBackgroundRole(QPalette::Base); - label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); - label->setScaledContents(true); - label->setPixmap(m_pixmap); - - QScrollArea *scrollArea = new QScrollArea(this); - scrollArea->setBackgroundRole(QPalette::Dark); - scrollArea->setWidget(label); - setWidget(scrollArea); -}
deleted file mode 100644 --- a/gui/src/ImageViewerDockWidget.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef IMAGEVIEWERDOCKWIDGET_H -#define IMAGEVIEWERDOCKWIDGET_H - -#include <QDockWidget> - -class ImageViewerDockWidget : public QDockWidget { -public: - ImageViewerDockWidget(QPixmap pixmap, QWidget *parent = 0); - -private: - void construct(); - QPixmap m_pixmap; -}; - -#endif // IMAGEVIEWERDOCKWIDGET_H
deleted file mode 100644 --- a/gui/src/KeyboardTranslator.cpp +++ /dev/null @@ -1,970 +0,0 @@ -/* - This source file is part of Konsole, a terminal emulator. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - - This program 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 program 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. -*/ - -// Own -#include "KeyboardTranslator.h" - -// System -#include <ctype.h> -#include <stdio.h> - -// Qt -#include <QtCore/QBuffer> -#include <QtCore/QFile> -#include <QtCore/QFileInfo> -#include <QtCore/QTextStream> -#include <QtGui/QKeySequence> -#include <QtCore/QDir> -#include <QtCore/QStringList> -#include <QtCore/QDebug> -#include <QtCore/QDataStream> - -const QByteArray KeyboardTranslatorManager::defaultTranslatorText( -"keyboard \"Fallback Key Translator\"\n" -"key Tab : \"\\t\"" -); - -KeyboardTranslatorManager::KeyboardTranslatorManager() - : _haveLoadedAll(false) -{ -} -KeyboardTranslatorManager::~KeyboardTranslatorManager() -{ - qDeleteAll(_translators); -} -QString KeyboardTranslatorManager::findTranslatorPath(const QString& name) -{ - return QString("../kb-layouts/" + name + ".keytab"); - // return KGlobal::dirs()->findResource("data","konsole/"+name+".keytab"); -} -void KeyboardTranslatorManager::findTranslators() -{ - //QStringList list = KGlobal::dirs()->findAllResources("data", - // "konsole/*.keytab", - // KStandardDirs::NoDuplicates); - - QDir dir("../kb-layouts/"); - QStringList filters; - filters << "*.keytab"; - dir.setNameFilters(filters); - QStringList list = dir.entryList(filters); - - // add the name of each translator to the list and associated - // the name with a null pointer to indicate that the translator - // has not yet been loaded from disk - QStringListIterator listIter(list); - while (listIter.hasNext()) - { - QString translatorPath = listIter.next(); - - QString name = QFileInfo(translatorPath).baseName(); - - if ( !_translators.contains(name) ) - _translators.insert(name,0); - } - - _haveLoadedAll = true; -} - -const KeyboardTranslator* KeyboardTranslatorManager::findTranslator(const QString& name) -{ - if ( name.isEmpty() ) - return defaultTranslator(); - - if ( _translators.contains(name) && _translators[name] != 0 ) - return _translators[name]; - - KeyboardTranslator* translator = loadTranslator(name); - - if ( translator != 0 ) - _translators[name] = translator; - //else if ( !name.isEmpty() ) - // kWarning() << "Unable to load translator" << name; - - return translator; -} - -bool KeyboardTranslatorManager::saveTranslator(const KeyboardTranslator* translator) -{ - //const QString path = KGlobal::dirs()->saveLocation("data","konsole/")+translator->name() - // +".keytab"; - const QString path = ".keytab"; - - //kDebug() << "Saving translator to" << path; - - QFile destination(path); - if (!destination.open(QIODevice::WriteOnly | QIODevice::Text)) - { - //kWarning() << "Unable to save keyboard translation:" - // << destination.errorString(); - return false; - } - - { - KeyboardTranslatorWriter writer(&destination); - writer.writeHeader(translator->description()); - - QListIterator<KeyboardTranslator::Entry> iter(translator->entries()); - while ( iter.hasNext() ) - writer.writeEntry(iter.next()); - } - - destination.close(); - - return true; -} - -KeyboardTranslator* KeyboardTranslatorManager::loadTranslator(const QString& name) -{ - const QString& path = findTranslatorPath(name); - - QFile source(path); - if (name.isEmpty() || !source.open(QIODevice::ReadOnly | QIODevice::Text)) - return 0; - - return loadTranslator(&source,name); -} - -const KeyboardTranslator* KeyboardTranslatorManager::defaultTranslator() -{ - // Try to find the default.keytab file if it exists, otherwise - // fall back to the hard-coded one - const KeyboardTranslator* translator = findTranslator("default"); - if (!translator) - { - QBuffer textBuffer; - textBuffer.setData(defaultTranslatorText); - textBuffer.open(QIODevice::ReadOnly); - translator = loadTranslator(&textBuffer,"fallback"); - } - return translator; -} - -KeyboardTranslator* KeyboardTranslatorManager::loadTranslator(QIODevice* source,const QString& name) -{ - KeyboardTranslator* translator = new KeyboardTranslator(name); - KeyboardTranslatorReader reader(source); - translator->setDescription( reader.description() ); - while ( reader.hasNextEntry() ) - translator->addEntry(reader.nextEntry()); - - source->close(); - - if ( !reader.parseError() ) - { - return translator; - } - else - { - delete translator; - return 0; - } -} - -KeyboardTranslatorWriter::KeyboardTranslatorWriter(QIODevice* destination) -: _destination(destination) -{ - Q_ASSERT( destination && destination->isWritable() ); - - _writer = new QTextStream(_destination); -} -KeyboardTranslatorWriter::~KeyboardTranslatorWriter() -{ - delete _writer; -} -void KeyboardTranslatorWriter::writeHeader( const QString& description ) -{ - *_writer << "keyboard \"" << description << '\"' << '\n'; -} -void KeyboardTranslatorWriter::writeEntry( const KeyboardTranslator::Entry& entry ) -{ - QString result; - if ( entry.command() != KeyboardTranslator::NoCommand ) - result = entry.resultToString(); - else - result = '\"' + entry.resultToString() + '\"'; - - *_writer << "key " << entry.conditionToString() << " : " << result << '\n'; -} - - -// each line of the keyboard translation file is one of: -// -// - keyboard "name" -// - key KeySequence : "characters" -// - key KeySequence : CommandName -// -// KeySequence begins with the name of the key ( taken from the Qt::Key enum ) -// and is followed by the keyboard modifiers and state flags ( with + or - in front -// of each modifier or flag to indicate whether it is required ). All keyboard modifiers -// and flags are optional, if a particular modifier or state is not specified it is -// assumed not to be a part of the sequence. The key sequence may contain whitespace -// -// eg: "key Up+Shift : scrollLineUp" -// "key Next-Shift : "\E[6~" -// -// (lines containing only whitespace are ignored, parseLine assumes that comments have -// already been removed) -// - -KeyboardTranslatorReader::KeyboardTranslatorReader( QIODevice* source ) - : _source(source) - , _hasNext(false) -{ - // read input until we find the description - while ( _description.isEmpty() && !source->atEnd() ) - { - QList<Token> tokens = tokenize( QString(source->readLine()) ); - if ( !tokens.isEmpty() && tokens.first().type == Token::TitleKeyword ) - _description = QString(tokens[1].text.toLatin1().data()); - } - // read first entry (if any) - readNext(); -} -void KeyboardTranslatorReader::readNext() -{ - // find next entry - while ( !_source->atEnd() ) - { - const QList<Token>& tokens = tokenize( QString(_source->readLine()) ); - if ( !tokens.isEmpty() && tokens.first().type == Token::KeyKeyword ) - { - KeyboardTranslator::States flags = KeyboardTranslator::NoState; - KeyboardTranslator::States flagMask = KeyboardTranslator::NoState; - Qt::KeyboardModifiers modifiers = Qt::NoModifier; - Qt::KeyboardModifiers modifierMask = Qt::NoModifier; - - int keyCode = Qt::Key_unknown; - - decodeSequence(tokens[1].text.toLower(), - keyCode, - modifiers, - modifierMask, - flags, - flagMask); - - KeyboardTranslator::Command command = KeyboardTranslator::NoCommand; - QByteArray text; - - // get text or command - if ( tokens[2].type == Token::OutputText ) - { - text = tokens[2].text.toLocal8Bit(); - } - else if ( tokens[2].type == Token::Command ) - { - // identify command - // if (!parseAsCommand(tokens[2].text,command)) - // kWarning() << "Command" << tokens[2].text << "not understood."; - } - - KeyboardTranslator::Entry newEntry; - newEntry.setKeyCode( keyCode ); - newEntry.setState( flags ); - newEntry.setStateMask( flagMask ); - newEntry.setModifiers( modifiers ); - newEntry.setModifierMask( modifierMask ); - newEntry.setText( text ); - newEntry.setCommand( command ); - - _nextEntry = newEntry; - - _hasNext = true; - - return; - } - } - - _hasNext = false; -} - -bool KeyboardTranslatorReader::parseAsCommand(const QString& text,KeyboardTranslator::Command& command) -{ - if ( text.compare("erase",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::EraseCommand; - else if ( text.compare("scrollpageup",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::ScrollPageUpCommand; - else if ( text.compare("scrollpagedown",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::ScrollPageDownCommand; - else if ( text.compare("scrolllineup",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::ScrollLineUpCommand; - else if ( text.compare("scrolllinedown",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::ScrollLineDownCommand; - else if ( text.compare("scrolllock",Qt::CaseInsensitive) == 0 ) - command = KeyboardTranslator::ScrollLockCommand; - else - return false; - - return true; -} - -bool KeyboardTranslatorReader::decodeSequence(const QString& text, - int& keyCode, - Qt::KeyboardModifiers& modifiers, - Qt::KeyboardModifiers& modifierMask, - KeyboardTranslator::States& flags, - KeyboardTranslator::States& flagMask) -{ - bool isWanted = true; - bool endOfItem = false; - QString buffer; - - Qt::KeyboardModifiers tempModifiers = modifiers; - Qt::KeyboardModifiers tempModifierMask = modifierMask; - KeyboardTranslator::States tempFlags = flags; - KeyboardTranslator::States tempFlagMask = flagMask; - - for ( int i = 0 ; i < text.count() ; i++ ) - { - const QChar& ch = text[i]; - bool isFirstLetter = i == 0; - bool isLastLetter = ( i == text.count()-1 ); - endOfItem = true; - if ( ch.isLetterOrNumber() ) - { - endOfItem = false; - buffer.append(ch); - } else if ( isFirstLetter ) - { - buffer.append(ch); - } - - if ( (endOfItem || isLastLetter) && !buffer.isEmpty() ) - { - Qt::KeyboardModifier itemModifier = Qt::NoModifier; - int itemKeyCode = 0; - KeyboardTranslator::State itemFlag = KeyboardTranslator::NoState; - - if ( parseAsModifier(buffer,itemModifier) ) - { - tempModifierMask |= itemModifier; - - if ( isWanted ) - tempModifiers |= itemModifier; - } - else if ( parseAsStateFlag(buffer,itemFlag) ) - { - tempFlagMask |= itemFlag; - - if ( isWanted ) - tempFlags |= itemFlag; - } - else if ( parseAsKeyCode(buffer,itemKeyCode) ) - keyCode = itemKeyCode; - //else - // kWarning() << "Unable to parse key binding item:" << buffer; - - buffer.clear(); - } - - // check if this is a wanted / not-wanted flag and update the - // state ready for the next item - if ( ch == '+' ) - isWanted = true; - else if ( ch == '-' ) - isWanted = false; - } - - modifiers = tempModifiers; - modifierMask = tempModifierMask; - flags = tempFlags; - flagMask = tempFlagMask; - - return true; -} - -bool KeyboardTranslatorReader::parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier) -{ - if ( item == "shift" ) - modifier = Qt::ShiftModifier; - else if ( item == "ctrl" || item == "control" ) - modifier = Qt::ControlModifier; - else if ( item == "alt" ) - modifier = Qt::AltModifier; - else if ( item == "meta" ) - modifier = Qt::MetaModifier; - else if ( item == "keypad" ) - modifier = Qt::KeypadModifier; - else - return false; - - return true; -} -bool KeyboardTranslatorReader::parseAsStateFlag(const QString& item , KeyboardTranslator::State& flag) -{ - if ( item == "appcukeys" || item == "appcursorkeys" ) - flag = KeyboardTranslator::CursorKeysState; - else if ( item == "ansi" ) - flag = KeyboardTranslator::AnsiState; - else if ( item == "newline" ) - flag = KeyboardTranslator::NewLineState; - else if ( item == "appscreen" ) - flag = KeyboardTranslator::AlternateScreenState; - else if ( item == "anymod" || item == "anymodifier" ) - flag = KeyboardTranslator::AnyModifierState; - else if ( item == "appkeypad" ) - flag = KeyboardTranslator::ApplicationKeypadState; - else - return false; - - return true; -} -bool KeyboardTranslatorReader::parseAsKeyCode(const QString& item , int& keyCode) -{ - QKeySequence sequence = QKeySequence::fromString(item); - if ( !sequence.isEmpty() ) - { - keyCode = sequence[0]; - - if ( sequence.count() > 1 ) - { - //kWarning() << "Unhandled key codes in sequence: " << item; - } - } - // additional cases implemented for backwards compatibility with KDE 3 - else if ( item == "prior" ) - keyCode = Qt::Key_PageUp; - else if ( item == "next" ) - keyCode = Qt::Key_PageDown; - else - return false; - - return true; -} - -QString KeyboardTranslatorReader::description() const -{ - return _description; -} -bool KeyboardTranslatorReader::hasNextEntry() -{ - return _hasNext; -} -KeyboardTranslator::Entry KeyboardTranslatorReader::createEntry( const QString& condition , - const QString& result ) -{ - QString entryString("keyboard \"temporary\"\nkey "); - entryString.append(condition); - entryString.append(" : "); - - // if 'result' is the name of a command then the entry result will be that command, - // otherwise the result will be treated as a string to echo when the key sequence - // specified by 'condition' is pressed - KeyboardTranslator::Command command; - if (parseAsCommand(result,command)) - entryString.append(result); - else - entryString.append('\"' + result + '\"'); - - QByteArray array = entryString.toUtf8(); - QBuffer buffer(&array); - buffer.open(QIODevice::ReadOnly); - KeyboardTranslatorReader reader(&buffer); - - KeyboardTranslator::Entry entry; - if ( reader.hasNextEntry() ) - entry = reader.nextEntry(); - - return entry; -} - -KeyboardTranslator::Entry KeyboardTranslatorReader::nextEntry() -{ - Q_ASSERT( _hasNext ); - KeyboardTranslator::Entry entry = _nextEntry; - readNext(); - return entry; -} -bool KeyboardTranslatorReader::parseError() -{ - return false; -} -QList<KeyboardTranslatorReader::Token> KeyboardTranslatorReader::tokenize(const QString& line) -{ - QString text = line; - - // remove comments - bool inQuotes = false; - int commentPos = -1; - for (int i=text.length()-1;i>=0;i--) - { - QChar ch = text[i]; - if (ch == '\"') - inQuotes = !inQuotes; - else if (ch == '#' && !inQuotes) - commentPos = i; - } - if (commentPos != -1) - text.remove(commentPos,text.length()); - - text = text.simplified(); - - // title line: keyboard "title" - static QRegExp title("keyboard\\s+\"(.*)\""); - // key line: key KeySequence : "output" - // key line: key KeySequence : command - static QRegExp key("key\\s+([\\w\\+\\s\\-\\*\\.]+)\\s*:\\s*(\"(.*)\"|\\w+)"); - - QList<Token> list; - if ( text.isEmpty() ) - { - return list; - } - - if ( title.exactMatch(text) ) - { - Token titleToken = { Token::TitleKeyword , QString() }; - Token textToken = { Token::TitleText , title.capturedTexts()[1] }; - - list << titleToken << textToken; - } - else if ( key.exactMatch(text) ) - { - Token keyToken = { Token::KeyKeyword , QString() }; - Token sequenceToken = { Token::KeySequence , key.capturedTexts()[1].remove(' ') }; - - list << keyToken << sequenceToken; - - if ( key.capturedTexts()[3].isEmpty() ) - { - // capturedTexts()[2] is a command - Token commandToken = { Token::Command , key.capturedTexts()[2] }; - list << commandToken; - } - else - { - // capturedTexts()[3] is the output string - Token outputToken = { Token::OutputText , key.capturedTexts()[3] }; - list << outputToken; - } - } - else - { - //kWarning() << "Line in keyboard translator file could not be understood:" << text; - } - - return list; -} - -QList<QString> KeyboardTranslatorManager::allTranslators() -{ - if ( !_haveLoadedAll ) - { - findTranslators(); - } - - return _translators.keys(); -} - -KeyboardTranslator::Entry::Entry() -: _keyCode(0) -, _modifiers(Qt::NoModifier) -, _modifierMask(Qt::NoModifier) -, _state(NoState) -, _stateMask(NoState) -, _command(NoCommand) -{ -} - -bool KeyboardTranslator::Entry::operator==(const Entry& rhs) const -{ - return _keyCode == rhs._keyCode && - _modifiers == rhs._modifiers && - _modifierMask == rhs._modifierMask && - _state == rhs._state && - _stateMask == rhs._stateMask && - _command == rhs._command && - _text == rhs._text; -} - -bool KeyboardTranslator::Entry::matches(int keyCode , - Qt::KeyboardModifiers modifiers, - States testState) const -{ - if ( _keyCode != keyCode ) - return false; - - if ( (modifiers & _modifierMask) != (_modifiers & _modifierMask) ) - return false; - - // if modifiers is non-zero, the 'any modifier' state is implicit - if ( modifiers != 0 ) - testState |= AnyModifierState; - - if ( (testState & _stateMask) != (_state & _stateMask) ) - return false; - - // special handling for the 'Any Modifier' state, which checks for the presence of - // any or no modifiers. In this context, the 'keypad' modifier does not count. - bool anyModifiersSet = modifiers != 0 && modifiers != Qt::KeypadModifier; - bool wantAnyModifier = _state & KeyboardTranslator::AnyModifierState; - if ( _stateMask & KeyboardTranslator::AnyModifierState ) - { - if ( wantAnyModifier != anyModifiersSet ) - return false; - } - - return true; -} -QByteArray KeyboardTranslator::Entry::escapedText(bool expandWildCards,Qt::KeyboardModifiers modifiers) const -{ - QByteArray result(text(expandWildCards,modifiers)); - - for ( int i = 0 ; i < result.count() ; i++ ) - { - char ch = result[i]; - char replacement = 0; - - switch ( ch ) - { - case 27 : replacement = 'E'; break; - case 8 : replacement = 'b'; break; - case 12 : replacement = 'f'; break; - case 9 : replacement = 't'; break; - case 13 : replacement = 'r'; break; - case 10 : replacement = 'n'; break; - default: - // any character which is not printable is replaced by an equivalent - // \xhh escape sequence (where 'hh' are the corresponding hex digits) - if ( !QChar(ch).isPrint() ) - replacement = 'x'; - } - - if ( replacement == 'x' ) - { - result.replace(i,1,"\\x"+QByteArray(1,ch).toHex()); - } else if ( replacement != 0 ) - { - result.remove(i,1); - result.insert(i,'\\'); - result.insert(i+1,replacement); - } - } - - return result; -} -QByteArray KeyboardTranslator::Entry::unescape(const QByteArray& input) const -{ - QByteArray result(input); - - for ( int i = 0 ; i < result.count()-1 ; i++ ) - { - - QByteRef ch = result[i]; - if ( ch == '\\' ) - { - char replacement[2] = {0,0}; - int charsToRemove = 2; - bool escapedChar = true; - - switch ( result[i+1] ) - { - case 'E' : replacement[0] = 27; break; - case 'b' : replacement[0] = 8 ; break; - case 'f' : replacement[0] = 12; break; - case 't' : replacement[0] = 9 ; break; - case 'r' : replacement[0] = 13; break; - case 'n' : replacement[0] = 10; break; - case 'x' : - { - // format is \xh or \xhh where 'h' is a hexadecimal - // digit from 0-9 or A-F which should be replaced - // with the corresponding character value - char hexDigits[3] = {0}; - - if ( (i < result.count()-2) && isxdigit(result[i+2]) ) - hexDigits[0] = result[i+2]; - if ( (i < result.count()-3) && isxdigit(result[i+3]) ) - hexDigits[1] = result[i+3]; - - unsigned charValue = 0; - sscanf(hexDigits,"%x",&charValue); - - replacement[0] = (char)charValue; - charsToRemove = 2 + strlen(hexDigits); - } - break; - default: - escapedChar = false; - } - - if ( escapedChar ) - result.replace(i,charsToRemove,replacement); - } - } - - return result; -} - -void KeyboardTranslator::Entry::insertModifier( QString& item , int modifier ) const -{ - if ( !(modifier & _modifierMask) ) - return; - - if ( modifier & _modifiers ) - item += '+'; - else - item += '-'; - - if ( modifier == Qt::ShiftModifier ) - item += "Shift"; - else if ( modifier == Qt::ControlModifier ) - item += "Ctrl"; - else if ( modifier == Qt::AltModifier ) - item += "Alt"; - else if ( modifier == Qt::MetaModifier ) - item += "Meta"; - else if ( modifier == Qt::KeypadModifier ) - item += "KeyPad"; -} -void KeyboardTranslator::Entry::insertState( QString& item , int state ) const -{ - if ( !(state & _stateMask) ) - return; - - if ( state & _state ) - item += '+' ; - else - item += '-' ; - - if ( state == KeyboardTranslator::AlternateScreenState ) - item += "AppScreen"; - else if ( state == KeyboardTranslator::NewLineState ) - item += "NewLine"; - else if ( state == KeyboardTranslator::AnsiState ) - item += "Ansi"; - else if ( state == KeyboardTranslator::CursorKeysState ) - item += "AppCursorKeys"; - else if ( state == KeyboardTranslator::AnyModifierState ) - item += "AnyModifier"; - else if ( state == KeyboardTranslator::ApplicationKeypadState ) - item += "AppKeypad"; -} -QString KeyboardTranslator::Entry::resultToString(bool expandWildCards,Qt::KeyboardModifiers modifiers) const -{ - if ( !_text.isEmpty() ) - return escapedText(expandWildCards,modifiers); - else if ( _command == EraseCommand ) - return "Erase"; - else if ( _command == ScrollPageUpCommand ) - return "ScrollPageUp"; - else if ( _command == ScrollPageDownCommand ) - return "ScrollPageDown"; - else if ( _command == ScrollLineUpCommand ) - return "ScrollLineUp"; - else if ( _command == ScrollLineDownCommand ) - return "ScrollLineDown"; - else if ( _command == ScrollLockCommand ) - return "ScrollLock"; - - return QString(); -} -QString KeyboardTranslator::Entry::conditionToString() const -{ - QString result = QKeySequence(_keyCode).toString(); - - insertModifier( result , Qt::ShiftModifier ); - insertModifier( result , Qt::ControlModifier ); - insertModifier( result , Qt::AltModifier ); - insertModifier( result , Qt::MetaModifier ); - insertModifier( result , Qt::KeypadModifier ); - - insertState( result , KeyboardTranslator::AlternateScreenState ); - insertState( result , KeyboardTranslator::NewLineState ); - insertState( result , KeyboardTranslator::AnsiState ); - insertState( result , KeyboardTranslator::CursorKeysState ); - insertState( result , KeyboardTranslator::AnyModifierState ); - insertState( result , KeyboardTranslator::ApplicationKeypadState ); - - return result; -} - -KeyboardTranslator::KeyboardTranslator(const QString& name) -: _name(name) -{ -} - -void KeyboardTranslator::setDescription(const QString& description) -{ - _description = description; -} -QString KeyboardTranslator::description() const -{ - return _description; -} -void KeyboardTranslator::setName(const QString& name) -{ - _name = name; -} -QString KeyboardTranslator::name() const -{ - return _name; -} - -QList<KeyboardTranslator::Entry> KeyboardTranslator::entries() const -{ - return _entries.values(); -} - -void KeyboardTranslator::addEntry(const Entry& entry) -{ - const int keyCode = entry.keyCode(); - _entries.insert(keyCode,entry); -} -void KeyboardTranslator::replaceEntry(const Entry& existing , const Entry& replacement) -{ - if ( !existing.isNull() ) - _entries.remove(existing.keyCode(),existing); - _entries.insert(replacement.keyCode(),replacement); -} -void KeyboardTranslator::removeEntry(const Entry& entry) -{ - _entries.remove(entry.keyCode(),entry); -} -KeyboardTranslator::Entry KeyboardTranslator::findEntry(int keyCode, Qt::KeyboardModifiers modifiers, States state) const -{ - foreach(const Entry& entry, _entries.values(keyCode)) - { - if ( entry.matches(keyCode,modifiers,state) ) - return entry; - } - return Entry(); // entry not found -} -void KeyboardTranslatorManager::addTranslator(KeyboardTranslator* translator) -{ - _translators.insert(translator->name(),translator); - - // if ( !saveTranslator(translator) ) - // kWarning() << "Unable to save translator" << translator->name() - // << "to disk."; -} -bool KeyboardTranslatorManager::deleteTranslator(const QString& name) -{ - Q_ASSERT( _translators.contains(name) ); - - // locate and delete - QString path = findTranslatorPath(name); - if ( QFile::remove(path) ) - { - _translators.remove(name); - return true; - } - else - { - //kWarning() << "Failed to remove translator - " << path; - return false; - } -} - -/** - * @internal - */ -typedef void (*KdeCleanUpFunction)(); - -/** - * @internal - * - * Helper class for K_GLOBAL_STATIC to clean up the object on library unload or application - * shutdown. - */ -class KCleanUpGlobalStatic -{ - public: - KdeCleanUpFunction func; - - inline ~KCleanUpGlobalStatic() { func(); } -}; - - - -#ifdef Q_CC_MSVC -/** - * @internal - * - * MSVC seems to give anonymous structs the same name which fails at link time. So instead we name - * the struct and hope that by adding the line number to the name it's unique enough to never clash. - */ -# define K_GLOBAL_STATIC_STRUCT_NAME(NAME) _k_##NAME##__LINE__ -#else -/** - * @internal - * - * Make the struct of the K_GLOBAL_STATIC anonymous. - */ -# define K_GLOBAL_STATIC_STRUCT_NAME(NAME) -#endif - - - -#define K_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ARGS) \ -static QBasicAtomicPointer<TYPE > _k_static_##NAME = Q_BASIC_ATOMIC_INITIALIZER(0); \ -static bool _k_static_##NAME##_destroyed; \ -static struct K_GLOBAL_STATIC_STRUCT_NAME(NAME) \ -{ \ - inline bool isDestroyed() const \ - { \ - return _k_static_##NAME##_destroyed; \ - } \ - inline bool exists() const \ - { \ - return _k_static_##NAME != 0; \ - } \ - inline operator TYPE*() \ - { \ - return operator->(); \ - } \ - inline TYPE *operator->() \ - { \ - if (!_k_static_##NAME) { \ - if (isDestroyed()) { \ - qFatal("Fatal Error: Accessed global static '%s *%s()' after destruction. " \ - "Defined at %s:%d", #TYPE, #NAME, __FILE__, __LINE__); \ - } \ - TYPE *x = new TYPE ARGS; \ - if (!_k_static_##NAME.testAndSetOrdered(0, x) \ - && _k_static_##NAME != x ) { \ - delete x; \ - } else { \ - static KCleanUpGlobalStatic cleanUpObject = { destroy }; \ - } \ - } \ - return _k_static_##NAME; \ - } \ - inline TYPE &operator*() \ - { \ - return *operator->(); \ - } \ - static void destroy() \ - { \ - _k_static_##NAME##_destroyed = true; \ - TYPE *x = _k_static_##NAME; \ - _k_static_##NAME = 0; \ - delete x; \ - } \ -} NAME; - -#define K_GLOBAL_STATIC(TYPE, NAME) K_GLOBAL_STATIC_WITH_ARGS(TYPE, NAME, ()) - -K_GLOBAL_STATIC( KeyboardTranslatorManager , theKeyboardTranslatorManager ) -KeyboardTranslatorManager* KeyboardTranslatorManager::instance() -{ - return theKeyboardTranslatorManager; -}
deleted file mode 100644 --- a/gui/src/KeyboardTranslator.h +++ /dev/null @@ -1,577 +0,0 @@ -/* - This source file is part of Konsole, a terminal emulator. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - - This program 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 program 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 KEYBOARDTRANSLATOR_H -#define KEYBOARDTRANSLATOR_H - -// Qt -#include <QtCore/QHash> -#include <QtCore/QList> -#include <QtGui/QKeySequence> -#include <QtCore/QMetaType> -#include <QtCore/QVarLengthArray> - -class QIODevice; -class QTextStream; - -/** - * A convertor which maps between key sequences pressed by the user and the - * character strings which should be sent to the terminal and commands - * which should be invoked when those character sequences are pressed. - * - * Konsole supports multiple keyboard translators, allowing the user to - * specify the character sequences which are sent to the terminal - * when particular key sequences are pressed. - * - * A key sequence is defined as a key code, associated keyboard modifiers - * (Shift,Ctrl,Alt,Meta etc.) and state flags which indicate the state - * which the terminal must be in for the key sequence to apply. - */ -class KeyboardTranslator -{ -public: - /** - * The meaning of a particular key sequence may depend upon the state which - * the terminal emulation is in. Therefore findEntry() may return a different - * Entry depending upon the state flags supplied. - * - * This enum describes the states which may be associated with with a particular - * entry in the keyboard translation entry. - */ - enum State - { - /** Indicates that no special state is active */ - NoState = 0, - /** - * TODO More documentation - */ - NewLineState = 1, - /** - * Indicates that the terminal is in 'Ansi' mode. - * TODO: More documentation - */ - AnsiState = 2, - /** - * TODO More documentation - */ - CursorKeysState = 4, - /** - * Indicates that the alternate screen ( typically used by interactive programs - * such as screen or vim ) is active - */ - AlternateScreenState = 8, - /** Indicates that any of the modifier keys is active. */ - AnyModifierState = 16, - /** Indicates that the numpad is in application mode. */ - ApplicationKeypadState = 32 - }; - Q_DECLARE_FLAGS(States,State) - - /** - * This enum describes commands which are associated with particular key sequences. - */ - enum Command - { - /** Indicates that no command is associated with this command sequence */ - NoCommand = 0, - /** TODO Document me */ - SendCommand = 1, - /** Scroll the terminal display up one page */ - ScrollPageUpCommand = 2, - /** Scroll the terminal display down one page */ - ScrollPageDownCommand = 4, - /** Scroll the terminal display up one line */ - ScrollLineUpCommand = 8, - /** Scroll the terminal display down one line */ - ScrollLineDownCommand = 16, - /** Toggles scroll lock mode */ - ScrollLockCommand = 32, - /** Echos the operating system specific erase character. */ - EraseCommand = 64 - }; - Q_DECLARE_FLAGS(Commands,Command) - - /** - * Represents an association between a key sequence pressed by the user - * and the character sequence and commands associated with it for a particular - * KeyboardTranslator. - */ - class Entry - { - public: - /** - * Constructs a new entry for a keyboard translator. - */ - Entry(); - - /** - * Returns true if this entry is null. - * This is true for newly constructed entries which have no properties set. - */ - bool isNull() const; - - /** Returns the commands associated with this entry */ - Command command() const; - /** Sets the command associated with this entry. */ - void setCommand(Command command); - - /** - * Returns the character sequence associated with this entry, optionally replacing - * wildcard '*' characters with numbers to indicate the keyboard modifiers being pressed. - * - * TODO: The numbers used to replace '*' characters are taken from the Konsole/KDE 3 code. - * Document them. - * - * @param expandWildCards Specifies whether wild cards (occurrences of the '*' character) in - * the entry should be replaced with a number to indicate the modifier keys being pressed. - * - * @param modifiers The keyboard modifiers being pressed. - */ - QByteArray text(bool expandWildCards = false, - Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; - - /** Sets the character sequence associated with this entry */ - void setText(const QByteArray& text); - - /** - * Returns the character sequence associated with this entry, - * with any non-printable characters replaced with escape sequences. - * - * eg. \\E for Escape, \\t for tab, \\n for new line. - * - * @param expandWildCards See text() - * @param modifiers See text() - */ - QByteArray escapedText(bool expandWildCards = false, - Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; - - /** Returns the character code ( from the Qt::Key enum ) associated with this entry */ - int keyCode() const; - /** Sets the character code associated with this entry */ - void setKeyCode(int keyCode); - - /** - * Returns a bitwise-OR of the enabled keyboard modifiers associated with this entry. - * If a modifier is set in modifierMask() but not in modifiers(), this means that the entry - * only matches when that modifier is NOT pressed. - * - * If a modifier is not set in modifierMask() then the entry matches whether the modifier - * is pressed or not. - */ - Qt::KeyboardModifiers modifiers() const; - - /** Returns the keyboard modifiers which are valid in this entry. See modifiers() */ - Qt::KeyboardModifiers modifierMask() const; - - /** See modifiers() */ - void setModifiers( Qt::KeyboardModifiers modifiers ); - /** See modifierMask() and modifiers() */ - void setModifierMask( Qt::KeyboardModifiers modifiers ); - - /** - * Returns a bitwise-OR of the enabled state flags associated with this entry. - * If flag is set in stateMask() but not in state(), this means that the entry only - * matches when the terminal is NOT in that state. - * - * If a state is not set in stateMask() then the entry matches whether the terminal - * is in that state or not. - */ - States state() const; - - /** Returns the state flags which are valid in this entry. See state() */ - States stateMask() const; - - /** See state() */ - void setState( States state ); - /** See stateMask() */ - void setStateMask( States mask ); - - /** - * Returns the key code and modifiers associated with this entry - * as a QKeySequence - */ - //QKeySequence keySequence() const; - - /** - * Returns this entry's conditions ( ie. its key code, modifier and state criteria ) - * as a string. - */ - QString conditionToString() const; - - /** - * Returns this entry's result ( ie. its command or character sequence ) - * as a string. - * - * @param expandWildCards See text() - * @param modifiers See text() - */ - QString resultToString(bool expandWildCards = false, - Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; - - /** - * Returns true if this entry matches the given key sequence, specified - * as a combination of @p keyCode , @p modifiers and @p state. - */ - bool matches( int keyCode , - Qt::KeyboardModifiers modifiers , - States flags ) const; - - bool operator==(const Entry& rhs) const; - - private: - void insertModifier( QString& item , int modifier ) const; - void insertState( QString& item , int state ) const; - QByteArray unescape(const QByteArray& text) const; - - int _keyCode; - Qt::KeyboardModifiers _modifiers; - Qt::KeyboardModifiers _modifierMask; - States _state; - States _stateMask; - - Command _command; - QByteArray _text; - }; - - /** Constructs a new keyboard translator with the given @p name */ - KeyboardTranslator(const QString& name); - - //KeyboardTranslator(const KeyboardTranslator& other); - - /** Returns the name of this keyboard translator */ - QString name() const; - - /** Sets the name of this keyboard translator */ - void setName(const QString& name); - - /** Returns the descriptive name of this keyboard translator */ - QString description() const; - - /** Sets the descriptive name of this keyboard translator */ - void setDescription(const QString& description); - - /** - * Looks for an entry in this keyboard translator which matches the given - * key code, keyboard modifiers and state flags. - * - * Returns the matching entry if found or a null Entry otherwise ( ie. - * entry.isNull() will return true ) - * - * @param keyCode A key code from the Qt::Key enum - * @param modifiers A combination of modifiers - * @param state Optional flags which specify the current state of the terminal - */ - Entry findEntry(int keyCode , - Qt::KeyboardModifiers modifiers , - States state = NoState) const; - - /** - * Adds an entry to this keyboard translator's table. Entries can be looked up according - * to their key sequence using findEntry() - */ - void addEntry(const Entry& entry); - - /** - * Replaces an entry in the translator. If the @p existing entry is null, - * then this is equivalent to calling addEntry(@p replacement) - */ - void replaceEntry(const Entry& existing , const Entry& replacement); - - /** - * Removes an entry from the table. - */ - void removeEntry(const Entry& entry); - - /** Returns a list of all entries in the translator. */ - QList<Entry> entries() const; - -private: - - QMultiHash<int,Entry> _entries; // entries in this keyboard translation, - // entries are indexed according to - // their keycode - QString _name; - QString _description; -}; -Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::States) -Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::Commands) - -/** - * Parses the contents of a Keyboard Translator (.keytab) file and - * returns the entries found in it. - * - * Usage example: - * - * @code - * QFile source( "/path/to/keytab" ); - * source.open( QIODevice::ReadOnly ); - * - * KeyboardTranslator* translator = new KeyboardTranslator( "name-of-translator" ); - * - * KeyboardTranslatorReader reader(source); - * while ( reader.hasNextEntry() ) - * translator->addEntry(reader.nextEntry()); - * - * source.close(); - * - * if ( !reader.parseError() ) - * { - * // parsing succeeded, do something with the translator - * } - * else - * { - * // parsing failed - * } - * @endcode - */ -class KeyboardTranslatorReader -{ -public: - /** Constructs a new reader which parses the given @p source */ - KeyboardTranslatorReader( QIODevice* source ); - - /** - * Returns the description text. - * TODO: More documentation - */ - QString description() const; - - /** Returns true if there is another entry in the source stream */ - bool hasNextEntry(); - /** Returns the next entry found in the source stream */ - KeyboardTranslator::Entry nextEntry(); - - /** - * Returns true if an error occurred whilst parsing the input or - * false if no error occurred. - */ - bool parseError(); - - /** - * Parses a condition and result string for a translator entry - * and produces a keyboard translator entry. - * - * The condition and result strings are in the same format as in - */ - static KeyboardTranslator::Entry createEntry( const QString& condition , - const QString& result ); -private: - struct Token - { - enum Type - { - TitleKeyword, - TitleText, - KeyKeyword, - KeySequence, - Command, - OutputText - }; - Type type; - QString text; - }; - QList<Token> tokenize(const QString&); - void readNext(); - bool decodeSequence(const QString& , - int& keyCode, - Qt::KeyboardModifiers& modifiers, - Qt::KeyboardModifiers& modifierMask, - KeyboardTranslator::States& state, - KeyboardTranslator::States& stateFlags); - - static bool parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier); - static bool parseAsStateFlag(const QString& item , KeyboardTranslator::State& state); - static bool parseAsKeyCode(const QString& item , int& keyCode); - static bool parseAsCommand(const QString& text , KeyboardTranslator::Command& command); - - QIODevice* _source; - QString _description; - KeyboardTranslator::Entry _nextEntry; - bool _hasNext; -}; - -/** Writes a keyboard translation to disk. */ -class KeyboardTranslatorWriter -{ -public: - /** - * Constructs a new writer which saves data into @p destination. - * The caller is responsible for closing the device when writing is complete. - */ - KeyboardTranslatorWriter(QIODevice* destination); - ~KeyboardTranslatorWriter(); - - /** - * Writes the header for the keyboard translator. - * @param description Description of the keyboard translator. - */ - void writeHeader( const QString& description ); - /** Writes a translator entry. */ - void writeEntry( const KeyboardTranslator::Entry& entry ); - -private: - QIODevice* _destination; - QTextStream* _writer; -}; - -/** - * Manages the keyboard translations available for use by terminal sessions, - * see KeyboardTranslator. - */ -class KeyboardTranslatorManager -{ -public: - /** - * Constructs a new KeyboardTranslatorManager and loads the list of - * available keyboard translations. - * - * The keyboard translations themselves are not loaded until they are - * first requested via a call to findTranslator() - */ - KeyboardTranslatorManager(); - ~KeyboardTranslatorManager(); - - /** - * Adds a new translator. If a translator with the same name - * already exists, it will be replaced by the new translator. - * - * TODO: More documentation. - */ - void addTranslator(KeyboardTranslator* translator); - - /** - * Deletes a translator. Returns true on successful deletion or false otherwise. - * - * TODO: More documentation - */ - bool deleteTranslator(const QString& name); - - /** Returns the default translator for Konsole. */ - const KeyboardTranslator* defaultTranslator(); - - /** - * Returns the keyboard translator with the given name or 0 if no translator - * with that name exists. - * - * The first time that a translator with a particular name is requested, - * the on-disk .keyboard file is loaded and parsed. - */ - const KeyboardTranslator* findTranslator(const QString& name); - /** - * Returns a list of the names of available keyboard translators. - * - * The first time this is called, a search for available - * translators is started. - */ - QList<QString> allTranslators(); - - /** Returns the global KeyboardTranslatorManager instance. */ - static KeyboardTranslatorManager* instance(); - -private: - static const QByteArray defaultTranslatorText; - - void findTranslators(); // locate the available translators - KeyboardTranslator* loadTranslator(const QString& name); // loads the translator - // with the given name - KeyboardTranslator* loadTranslator(QIODevice* device,const QString& name); - - bool saveTranslator(const KeyboardTranslator* translator); - QString findTranslatorPath(const QString& name); - - QHash<QString,KeyboardTranslator*> _translators; // maps translator-name -> KeyboardTranslator - // instance - bool _haveLoadedAll; -}; - -inline int KeyboardTranslator::Entry::keyCode() const { return _keyCode; } -inline void KeyboardTranslator::Entry::setKeyCode(int keyCode) { _keyCode = keyCode; } - -inline void KeyboardTranslator::Entry::setModifiers( Qt::KeyboardModifiers modifier ) -{ - _modifiers = modifier; -} -inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifiers() const { return _modifiers; } - -inline void KeyboardTranslator::Entry::setModifierMask( Qt::KeyboardModifiers mask ) -{ - _modifierMask = mask; -} -inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifierMask() const { return _modifierMask; } - -inline bool KeyboardTranslator::Entry::isNull() const -{ - return ( *this == Entry() ); -} - -inline void KeyboardTranslator::Entry::setCommand( Command command ) -{ - _command = command; -} -inline KeyboardTranslator::Command KeyboardTranslator::Entry::command() const { return _command; } - -inline void KeyboardTranslator::Entry::setText( const QByteArray& text ) -{ - _text = unescape(text); -} -inline int oneOrZero(int value) -{ - return value ? 1 : 0; -} -inline QByteArray KeyboardTranslator::Entry::text(bool expandWildCards,Qt::KeyboardModifiers modifiers) const -{ - QByteArray expandedText = _text; - - if (expandWildCards) - { - int modifierValue = 1; - modifierValue += oneOrZero(modifiers & Qt::ShiftModifier); - modifierValue += oneOrZero(modifiers & Qt::AltModifier) << 1; - modifierValue += oneOrZero(modifiers & Qt::ControlModifier) << 2; - - for (int i=0;i<_text.length();i++) - { - if (expandedText[i] == '*') - expandedText[i] = '0' + modifierValue; - } - } - - return expandedText; -} - -inline void KeyboardTranslator::Entry::setState( States state ) -{ - _state = state; -} -inline KeyboardTranslator::States KeyboardTranslator::Entry::state() const { return _state; } - -inline void KeyboardTranslator::Entry::setStateMask( States stateMask ) -{ - _stateMask = stateMask; -} -inline KeyboardTranslator::States KeyboardTranslator::Entry::stateMask() const { return _stateMask; } - - -Q_DECLARE_METATYPE(KeyboardTranslator::Entry) -Q_DECLARE_METATYPE(const KeyboardTranslator*) - -#endif // KEYBOARDTRANSLATOR_H -
deleted file mode 100644 --- a/gui/src/LineFont.h +++ /dev/null @@ -1,21 +0,0 @@ -// WARNING: Autogenerated by "fontembedder ./linefont.src". -// You probably do not want to hand-edit this! - -static const quint32 LineChars[] = { - 0x00007c00, 0x000fffe0, 0x00421084, 0x00e739ce, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00427000, 0x004e7380, 0x00e77800, 0x00ef7bc0, - 0x00421c00, 0x00439ce0, 0x00e73c00, 0x00e7bde0, 0x00007084, 0x000e7384, 0x000079ce, 0x000f7bce, - 0x00001c84, 0x00039ce4, 0x00003dce, 0x0007bdee, 0x00427084, 0x004e7384, 0x004279ce, 0x00e77884, - 0x00e779ce, 0x004f7bce, 0x00ef7bc4, 0x00ef7bce, 0x00421c84, 0x00439ce4, 0x00423dce, 0x00e73c84, - 0x00e73dce, 0x0047bdee, 0x00e7bde4, 0x00e7bdee, 0x00427c00, 0x0043fce0, 0x004e7f80, 0x004fffe0, - 0x004fffe0, 0x00e7fde0, 0x006f7fc0, 0x00efffe0, 0x00007c84, 0x0003fce4, 0x000e7f84, 0x000fffe4, - 0x00007dce, 0x0007fdee, 0x000f7fce, 0x000fffee, 0x00427c84, 0x0043fce4, 0x004e7f84, 0x004fffe4, - 0x00427dce, 0x00e77c84, 0x00e77dce, 0x0047fdee, 0x004e7fce, 0x00e7fde4, 0x00ef7f84, 0x004fffee, - 0x00efffe4, 0x00e7fdee, 0x00ef7fce, 0x00efffee, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x000f83e0, 0x00a5294a, 0x004e1380, 0x00a57800, 0x00ad0bc0, 0x004390e0, 0x00a53c00, 0x00a5a1e0, - 0x000e1384, 0x0000794a, 0x000f0b4a, 0x000390e4, 0x00003d4a, 0x0007a16a, 0x004e1384, 0x00a5694a, - 0x00ad2b4a, 0x004390e4, 0x00a52d4a, 0x00a5a16a, 0x004f83e0, 0x00a57c00, 0x00ad83e0, 0x000f83e4, - 0x00007d4a, 0x000f836a, 0x004f93e4, 0x00a57d4a, 0x00ad836a, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001c00, 0x00001084, 0x00007000, 0x00421000, - 0x00039ce0, 0x000039ce, 0x000e7380, 0x00e73800, 0x000e7f80, 0x00e73884, 0x0003fce0, 0x004239ce -};
deleted file mode 100644 --- a/gui/src/MainWindow.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include <QMenuBar> -#include <QMenu> -#include <QAction> -#include <QSettings> -#include <QDesktopServices> -#include <QFileDialog> -#include "MainWindow.h" -#include "FileEditorDockWidget.h" -#include "ImageViewerDockWidget.h" - -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent), - m_isRunning(true) { - setObjectName("MainWindow"); - - QDesktopServices desktopServices; - m_settingsFile = desktopServices.storageLocation(QDesktopServices::HomeLocation) + "/.quint/settings.ini"; - construct(); - establishOctaveLink(); -} - -MainWindow::~MainWindow() { -} - -void MainWindow::handleOpenFileRequest(QString fileName) { - reportStatusMessage(tr("Opening file.")); - QPixmap pixmap; - if(pixmap.load(fileName)) { - ImageViewerDockWidget *imageViewerDockWidget = new ImageViewerDockWidget(pixmap, this); - imageViewerDockWidget->setWindowTitle(fileName); - addDockWidget(Qt::RightDockWidgetArea, imageViewerDockWidget); - } else { - FileEditorDockWidget *fileEditorDockWidget = new FileEditorDockWidget(this); - fileEditorDockWidget->loadFile(fileName); - addDockWidget(Qt::RightDockWidgetArea, fileEditorDockWidget); - } -} - -void MainWindow::reportStatusMessage(QString statusMessage) { - m_statusBar->showMessage(statusMessage, 1000); -} - -void MainWindow::handleSaveWorkspaceRequest() { - QDesktopServices desktopServices; - QString selectedFile = QFileDialog::getSaveFileName(this, tr("Save Workspace"), - desktopServices.storageLocation(QDesktopServices::HomeLocation) + "/.quint/workspace"); - m_octaveTerminalDockWidget->octaveTerminal()->sendText(QString("save \'%1\'\n").arg(selectedFile)); - m_octaveTerminalDockWidget->octaveTerminal()->setFocus(); -} - -void MainWindow::handleLoadWorkspaceRequest() { - QDesktopServices desktopServices; - QString selectedFile = QFileDialog::getOpenFileName(this, tr("Load Workspace"), - desktopServices.storageLocation(QDesktopServices::HomeLocation) + "/.quint/workspace"); - m_octaveTerminalDockWidget->octaveTerminal()->sendText(QString("load \'%1\'\n").arg(selectedFile)); - m_octaveTerminalDockWidget->octaveTerminal()->setFocus(); -} - -void MainWindow::handleClearWorkspaceRequest() { - m_octaveTerminalDockWidget->octaveTerminal()->sendText("clear\n"); - m_octaveTerminalDockWidget->octaveTerminal()->setFocus(); -} - -void MainWindow::handleCommandDoubleClicked(QString command) { - m_octaveTerminalDockWidget->octaveTerminal()->sendText(command); - m_octaveTerminalDockWidget->octaveTerminal()->setFocus(); -} - -void MainWindow::closeEvent(QCloseEvent *closeEvent) { - m_isRunning = false; - reportStatusMessage(tr("Saving data and shutting down.")); - writeSettings(); - - m_octaveCallbackThread->terminate(); - m_octaveCallbackThread->wait(); - - m_octaveMainThread->terminate(); - QMainWindow::closeEvent(closeEvent); -} - -void MainWindow::readSettings() { - QSettings settings(m_settingsFile, QSettings::IniFormat); - restoreGeometry(settings.value("MainWindow/geometry").toByteArray()); - restoreState(settings.value("MainWindow/windowState").toByteArray()); -} - -void MainWindow::writeSettings() { - QSettings settings(m_settingsFile, QSettings::IniFormat); - settings.setValue("MainWindow/geometry", saveGeometry()); - settings.setValue("MainWindow/windowState", saveState()); -} - -void MainWindow::construct() { - setWindowTitle("Octave"); - setWindowIcon(QIcon("../media/quint_icon_small.png")); - QStyle *style = QApplication::style(); - resize(800, 600); - - m_octaveTerminalDockWidget = new OctaveTerminalDockWidget(this, new OctaveTerminal(this)); - m_variablesDockWidget = new VariablesDockWidget(this); - m_historyDockWidget = new HistoryDockWidget(this); - m_filesDockWidget = new FilesDockWidget(this); - m_browserDockWidget = new BrowserDockWidget(this, new BrowserWidget(this)); - m_serviceDockWidget = new BrowserDockWidget(this, new BrowserWidget(this)); - - m_browserDockWidget->setObjectName("BrowserWidget"); - m_browserDockWidget->setWindowTitle(tr("Documentation")); - m_serviceDockWidget->setObjectName("ServiceWidget"); - m_serviceDockWidget->setWindowTitle(tr("Service")); - - // This is needed, since a QMainWindow without a central widget is not supported. - setCentralWidget(new QWidget(this)); - centralWidget()->setObjectName("CentralWidget"); - centralWidget()->hide(); - - setDockOptions(QMainWindow::AllowTabbedDocks | QMainWindow::AllowNestedDocks | QMainWindow::AnimatedDocks); - - addDockWidget(Qt::RightDockWidgetArea, m_octaveTerminalDockWidget); - addDockWidget(Qt::LeftDockWidgetArea, m_variablesDockWidget); - addDockWidget(Qt::LeftDockWidgetArea, m_historyDockWidget); - addDockWidget(Qt::LeftDockWidgetArea, m_filesDockWidget); - addDockWidget(Qt::LeftDockWidgetArea, m_browserDockWidget); - addDockWidget(Qt::LeftDockWidgetArea, m_serviceDockWidget); - - // TODO: Add meaningfull toolbar items. - m_generalPurposeToolbar = new QToolBar(tr("Octave Toolbar"), this); - QAction *commandAction = new QAction(style->standardIcon(QStyle::SP_CommandLink), - "", m_generalPurposeToolbar); - QAction *computerAction = new QAction(style->standardIcon(QStyle::SP_ComputerIcon), - "", m_generalPurposeToolbar); - m_generalPurposeToolbar->addAction(commandAction); - m_generalPurposeToolbar->addAction(computerAction); - addToolBar(m_generalPurposeToolbar); - - // Create status bar. - - m_statusBar = new QStatusBar(this); - setStatusBar(m_statusBar); - - readSettings(); - - connect(m_filesDockWidget, SIGNAL(openFile(QString)), this, SLOT(handleOpenFileRequest(QString))); - connect(m_historyDockWidget, SIGNAL(information(QString)), this, SLOT(reportStatusMessage(QString))); - connect(m_historyDockWidget, SIGNAL(commandDoubleClicked(QString)), this, SLOT(handleCommandDoubleClicked(QString))); - connect(m_variablesDockWidget, SIGNAL(saveWorkspace()), this, SLOT(handleSaveWorkspaceRequest())); - connect(m_variablesDockWidget, SIGNAL(loadWorkspace()), this, SLOT(handleLoadWorkspaceRequest())); - connect(m_variablesDockWidget, SIGNAL(clearWorkspace()), this, SLOT(handleClearWorkspaceRequest())); - - m_browserDockWidget->browserWidget()->load(QUrl("http://www.gnu.org/software/octave/doc/interpreter/")); - m_serviceDockWidget->browserWidget()->load(QUrl("http://powerup.ath.cx/bugtracker")); - -} - -void MainWindow::establishOctaveLink() { - m_octaveMainThread = new OctaveMainThread(this); - m_octaveMainThread->start(); - - m_octaveCallbackThread = new OctaveCallbackThread(this, this); - m_octaveCallbackThread->start(); - - command_editor::add_event_hook(OctaveLink::readlineEventHook); - - int fdm, fds; - if(openpty(&fdm, &fds, 0, 0, 0) < 0) { - assert(0); - } - dup2 (fds, 0); - dup2 (fds, 1); - dup2 (fds, 2); - m_octaveTerminalDockWidget->octaveTerminal()->openTeletype(fdm); - reportStatusMessage(tr("Established link to Octave.")); -}
deleted file mode 100644 --- a/gui/src/MainWindow.h +++ /dev/null @@ -1,180 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include <QtGui/QMainWindow> -#include <QThread> -#include <QTabWidget> -#include <QMdiArea> -#include <QStatusBar> -#include <QToolBar> -#include <QQueue> -#include "OctaveTerminal.h" -#include "OctaveLink.h" -#include "VariablesDockWidget.h" -#include "HistoryDockWidget.h" -#include "FilesDockWidget.h" -#include "SimpleEditor.h" -#include "BrowserWidget.h" - -// Octave includes -#undef PACKAGE_BUGREPORT -#undef PACKAGE_NAME -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION -#undef PACKAGE_URL -#include "octave/config.h" - -#include "octave/debug.h" -#include "octave/octave.h" -#include "octave/symtab.h" -#include "octave/parse.h" -#include "octave/unwind-prot.h" -#include "octave/toplev.h" -#include "octave/load-path.h" -#include "octave/error.h" -#include "octave/quit.h" -#include "octave/variables.h" -#include "octave/sighandlers.h" -#include "octave/sysdep.h" -#include "octave/str-vec.h" -#include "octave/cmd-hist.h" -#include "octave/cmd-edit.h" -#include "octave/oct-env.h" -#include "octave/symtab.h" -#include "cmd-edit.h" - -typedef struct yy_buffer_state *YY_BUFFER_STATE; -extern OCTINTERP_API YY_BUFFER_STATE create_buffer (FILE *f); -extern OCTINTERP_API void switch_to_buffer (YY_BUFFER_STATE buf); -extern OCTINTERP_API FILE *get_input_from_stdin (void); - -// System -#include <termios.h> -#include <sys/types.h> -#include <signal.h> -#include <sys/types.h> -#include <sys/wait.h> -#include <iostream> -#include <vector> -#include "pty.h" - -class OctaveMainThread; -class OctaveCallbackThread; - -/** - * \class MainWindow - * - * Represents the main window. - */ -class MainWindow : public QMainWindow { - Q_OBJECT -public: - MainWindow(QWidget *parent = 0); - ~MainWindow(); - - bool isRunning() { return m_isRunning; } - OctaveTerminal *octaveTerminal() { return m_octaveTerminalDockWidget->octaveTerminal(); } - VariablesDockWidget *variablesDockWidget() { return m_variablesDockWidget; } - HistoryDockWidget *historyDockWidget() { return m_historyDockWidget; } - FilesDockWidget *filesDockWidget() { return m_filesDockWidget; } - -public slots: - void handleOpenFileRequest(QString fileName); - void reportStatusMessage(QString statusMessage); - void handleSaveWorkspaceRequest(); - void handleLoadWorkspaceRequest(); - void handleClearWorkspaceRequest(); - void handleCommandDoubleClicked(QString command); - -protected: - void closeEvent(QCloseEvent *closeEvent); - void readSettings(); - void writeSettings(); - -private: - void construct(); - void establishOctaveLink(); - OctaveTerminalDockWidget *m_octaveTerminalDockWidget; - VariablesDockWidget *m_variablesDockWidget; - HistoryDockWidget *m_historyDockWidget; - FilesDockWidget *m_filesDockWidget; - BrowserDockWidget *m_browserDockWidget; - BrowserDockWidget *m_serviceDockWidget; - - QStatusBar *m_statusBar; - QToolBar *m_generalPurposeToolbar; - QString m_settingsFile; - - // Threads for running octave and managing the data interaction. - OctaveMainThread *m_octaveMainThread; - OctaveCallbackThread *m_octaveCallbackThread; - bool m_isRunning; -}; - -class OctaveMainThread : public QThread { - Q_OBJECT -public: - OctaveMainThread(QObject *parent) - : QThread(parent) { - } -protected: - void run() { - int argc = 3; - const char* argv[] = {"octave", "--interactive", "--line-editing"}; - octave_main(argc, (char**)argv, 1); - main_loop(); - clean_up_and_exit(0); - } -}; - -class OctaveCallbackThread : public QThread { - Q_OBJECT -public: - OctaveCallbackThread(QObject *parent, MainWindow *mainWindow) - : QThread(parent), - m_mainWindow(mainWindow) { - } - -protected: - void run() { - while(m_mainWindow->isRunning()) { - - // Get a full variable list. - QList<SymbolRecord> symbolTable = OctaveLink::instance()->currentSymbolTable(); - if(symbolTable.size()) { - m_mainWindow->variablesDockWidget()->setVariablesList(symbolTable); - } - - // Collect history list. - string_vector historyList = OctaveLink::instance()->currentHistory(); - if(historyList.length()) { - m_mainWindow->historyDockWidget()->updateHistory(historyList); - } - - usleep(100000); - } - } -private: - MainWindow *m_mainWindow; -}; - -#endif // MAINWINDOW_H
deleted file mode 100644 --- a/gui/src/NumberedCodeEdit.cpp +++ /dev/null @@ -1,591 +0,0 @@ -/* This file is part of the KDE libraries - Copyright (C) 2005, 2006 KJSEmbed Authors - See included AUTHORS file. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ -#include <QTextDocument> -#include <QTextBlock> -#include <QHBoxLayout> -#include <QScrollBar> -#include <QPainter> -#include <QAbstractTextDocumentLayout> -#include <QToolTip> -#include <QTextStream> -#include <QProcess> -#include <QRegExp> -#include <QMessageBox> -#include <QFileInfo> - -#include "NumberedCodeEdit.h" -#include "config.h" - -NumberBar::NumberBar( QWidget *parent ) - : QWidget( parent ), edit(0), currentLine(-1), bugLine(-1) -{ - // Make room for 4 digits and the breakpoint icon - setFixedWidth( fontMetrics().width( QString("0000") + 10 + 32 ) ); - stopMarker = QPixmap();// QString(ICON_PATH) + "/stop.png" ); - currentMarker = QPixmap();// QString(ICON_PATH) + "/bookmark.png" ); - bugMarker = QPixmap();// QString(ICON_PATH) + "/bug.png" ); -} - -NumberBar::~NumberBar() -{ -} - -void NumberBar::setCurrentLine( int lineno ) -{ - currentLine = lineno; - update(); -} - -void NumberBar::setBugLine( int lineno ) -{ - bugLine = lineno; -} - -void NumberBar::toggleBreakpoint( int lineno ) -{ - if(lineno > 0) - { - int i = breakpoints.indexOf(lineno); - - if(i > -1) - breakpoints.removeAt(i); - else - breakpoints.push_back(lineno); - } - update(); -} - -void NumberBar::setTextEdit( SimpleEditor *edit ) -{ - this->edit = edit; - setFixedWidth( edit->fontMetrics().width( QString("0000") + 10 + 32 ) ); - connect( edit->document()->documentLayout(), SIGNAL( update(const QRectF &) ), - this, SLOT( update() ) ); - connect( edit->verticalScrollBar(), SIGNAL(valueChanged(int) ), - this, SLOT( update() ) ); -} - -void NumberBar::paintEvent( QPaintEvent * ) -{ - QVector<qreal> lines_list; - int first_line_no; - edit->publicBlockBoundingRectList(lines_list, first_line_no); - - const QFontMetrics fm = edit->fontMetrics(); - const int ascent = fontMetrics().ascent(); // height = ascent + descent - - QPainter p(this); - p.setPen(palette().windowText().color()); - - bugRect = QRect(); - stopRect = QRect(); - currentRect = QRect(); - - int position_y; - int lineCount; - - const int lines_list_size=lines_list.size(); - - for(int i=0;i<lines_list_size;i++) - { - position_y=qRound( lines_list[i] ); - lineCount=first_line_no+i; - - const QString txt = QString::number( lineCount ); - p.drawText( width() - fm.width(txt)- 2, position_y+ascent, txt ); - - // Bug marker - if ( bugLine == lineCount ) { - p.drawPixmap( 1, position_y, bugMarker ); - bugRect = QRect( 19, position_y, bugMarker.width(), bugMarker.height() ); - } - - // Stop marker - if ( breakpoints.contains(lineCount) ) { - p.drawPixmap( 1, position_y, stopMarker ); - stopRect = QRect( 1, position_y,stopMarker.width(), stopMarker.height() ); - } - - // Current line marker - if ( currentLine == lineCount ) { - p.drawPixmap( 1, position_y, currentMarker ); - currentRect = QRect( 1, position_y, currentMarker.width(), currentMarker.height() ); - } - } - - /* - - int contentsY = edit->verticalScrollBar()->value(); - qreal pageBottom = contentsY + edit->viewport()->height(); - const QFontMetrics fm = fontMetrics(); - const int ascent = fontMetrics().ascent() + 1; // height = ascent + descent + 1 - int lineCount = 1; - - QPainter p(this); - p.setPen(palette().windowText().color()); - - bugRect = QRect(); - stopRect = QRect(); - currentRect = QRect(); - - for ( QTextBlock block = edit->document()->begin(); - block.isValid(); block = block.next(), ++lineCount ) { - - const QRectF boundingRect = edit->publicBlockBoundingRect( block ); - - QPointF position = boundingRect.topLeft(); - if ( position.y() + boundingRect.height() < contentsY ) - continue; - if ( position.y() > pageBottom ) - break; - - const QString txt = QString::number( lineCount ); - p.drawText( width() - fm.width(txt), qRound( position.y() ) - contentsY + ascent, txt ); - - // Bug marker - if ( bugLine == lineCount ) { - p.drawPixmap( 1, qRound( position.y() ) - contentsY, bugMarker ); - bugRect = QRect( 1, qRound( position.y() ) - contentsY, bugMarker.width(), bugMarker.height() ); - } - - // Stop marker - if ( breakpoints.contains(lineCount) ) { - p.drawPixmap( 19, qRound( position.y() ) - contentsY, stopMarker ); - stopRect = QRect( 19, qRound( position.y() ) - contentsY, stopMarker.width(), stopMarker.height() ); - } - - // Current line marker - if ( currentLine == lineCount ) { - p.drawPixmap( 19, qRound( position.y() ) - contentsY, currentMarker ); - currentRect = QRect( 19, qRound( position.y() ) - contentsY, currentMarker.width(), currentMarker.height() ); - } - } - */ -} - -bool NumberBar::event( QEvent *event ) -{ - if ( event->type() == QEvent::ToolTip ) { - QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); - - if ( stopRect.contains( helpEvent->pos() ) ) { - QToolTip::showText( helpEvent->globalPos(), tr("Stop Here")); - } - else if ( currentRect.contains( helpEvent->pos() ) ) { - QToolTip::showText( helpEvent->globalPos(), tr("Current Line")); - } - else if ( bugRect.contains( helpEvent->pos() ) ) { - QToolTip::showText( helpEvent->globalPos(), tr("Error Line" )); - } - } - - return QWidget::event(event); -} - -QList<int> *NumberBar::getBreakpoints() -{ - return &breakpoints; -} - - - -NumberedCodeEdit::NumberedCodeEdit( QWidget *parent, SimpleEditor *textEdit ) - : QFrame( parent ) -{ - setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); - setLineWidth( 2 ); - - view=textEdit; - view->installEventFilter( this ); - - connect( view->document(), SIGNAL(contentsChange(int,int,int)), this, SLOT(textChanged(int,int,int)) ); - - connect( view, SIGNAL(cursorPositionChanged()), this, SLOT(cursor_moved_cb()) ); - - // Setup the line number pane - - numbers = new NumberBar( this ); - numbers->setTextEdit( view ); - //numbers=NULL; - - - vbox = new QVBoxLayout(this); - vbox->setSpacing( 0 ); - vbox->setMargin( 0 ); - - hbox = new QHBoxLayout; - vbox->addLayout(hbox); - - hbox->setSpacing( 0 ); - hbox->setMargin( 0 ); - hbox->addWidget( numbers ); - hbox->addWidget( view ); - - textModifiedOk=false; - - QHBoxLayout *messages_layout= new QHBoxLayout; - vbox->addLayout(messages_layout); - messages_layout->setSpacing( 0 ); - messages_layout->setMargin( 0 ); - } - - -NumberedCodeEdit::~NumberedCodeEdit() -{ - hide(); - //printf("Borrado ntv\n"); -} - -void NumberedCodeEdit::setCurrentLine( int lineno ) -{ - currentLine = lineno; - if(numbers!=NULL) numbers->setCurrentLine( lineno ); - - //Move cursor to lineno - if(lineno>-1) - { - QTextCursor cursor=textEdit()->textCursor(); - - cursor.movePosition(QTextCursor::Start); - - for(int i=1;i<lineno;i++) - cursor.movePosition(QTextCursor::NextBlock); - - textEdit()->setTextCursor(cursor); - } - - textChanged( 0, 0, 1 ); -} - -void NumberedCodeEdit::toggleBreakpoint( int lineno ) -{ - if(numbers!=NULL) numbers->toggleBreakpoint( lineno ); -} - -void NumberedCodeEdit::setBugLine( int lineno ) -{ - if(numbers!=NULL) numbers->setBugLine( lineno ); -} - -void NumberedCodeEdit::textChanged( int /*pos*/, int removed, int added ) -{ - //Q_UNUSED( pos ); - - if ( removed == 0 && added == 0 ) - return; - - //QTextBlock block = highlight.block(); - //QTextBlock block = view->document()->begin(); - //QTextBlockFormat fmt = block.blockFormat(); - //QColor bg = view->palette().base().color(); - //fmt.setBackground( bg ); - //highlight.setBlockFormat( fmt ); - /* - QTextBlockFormat fmt; - - int lineCount = 1; - for ( QTextBlock block = view->document()->begin(); - block.isValid() && block!=view->document()->end(); block = block.next(), ++lineCount ) { - - if ( lineCount == currentLine ) - { - fmt = block.blockFormat(); - QColor bg = view->palette().highlight().color(); - fmt.setBackground( bg ); - - highlight = QTextCursor( block ); - highlight.movePosition( QTextCursor::EndOfBlock, QTextCursor::KeepAnchor ); - highlight.setBlockFormat( fmt ); - - break; - } - } - */ - - if( !textModifiedOk && view->document()->isModified() ) - { - textModifiedOk=true; - emit textModified(); - } -} - -bool NumberedCodeEdit::eventFilter( QObject *obj, QEvent *event ) -{ - if ( obj != view ) - return QFrame::eventFilter(obj, event); - - if ( event->type() == QEvent::ToolTip ) { - QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); - - QTextCursor cursor = view->cursorForPosition( helpEvent->pos() ); - cursor.movePosition( QTextCursor::StartOfWord, QTextCursor::MoveAnchor ); - cursor.movePosition( QTextCursor::EndOfWord, QTextCursor::KeepAnchor ); - - QString word = cursor.selectedText(); - emit mouseHover( word ); - emit mouseHover( helpEvent->pos(), word ); - - // QToolTip::showText( helpEvent->globalPos(), word ); // For testing - } - - return false; -} - -QList<int> *NumberedCodeEdit::getBreakpoints() -{ - QList<int> *br=NULL; - if(numbers!=NULL) br=numbers->getBreakpoints(); - return br; -} - -void NumberedCodeEdit::open(QString path) -{ - FILE *fl; - - fl = fopen(path.toLocal8Bit().constData(), "rt"); - if(fl) - { - fclose(fl); - filePath = path; - - textEdit()->load(path); - - textModifiedOk=false; - textEdit()->document()->setModified(false); - }else{ - throw path; - } -} - -bool NumberedCodeEdit::save(QString path) -{ - FILE *fl; - - if(path.isEmpty()) path = filePath; - QRegExp re("[A-Za-z_][A-Za-z0-9_]*\\.m"); - - if( ! re.exactMatch( QFileInfo(path).fileName() ) ) - { - QMessageBox msgBox; - msgBox.setText( tr("This file name is not valid.") ); - msgBox.setInformativeText(tr("Octave doesn't understand this file name:\n")+path+tr("\nPlease, change it.\n Do you want to save your changes?")); - msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel); - msgBox.setDefaultButton(QMessageBox::Save); - int ret = msgBox.exec(); - switch (ret) - { - case QMessageBox::Save: - // Save was clicked - break; - case QMessageBox::Cancel: - // Cancel was clicked - return false; - break; - default: - // should never be reached - break; - } - } - - - fl = fopen(path.toLocal8Bit().constData(), "wt"); - if(fl) - { - filePath = path; - QTextStream *stream = new QTextStream(fl); - (*stream) << textEdit()->document()->toPlainText(); - delete stream; - fclose(fl); - textModifiedOk=false; - view->document()->setModified(false); - }else{ - return false; - } - - return true; -} - -QString NumberedCodeEdit::path() -{ - return filePath; -} - -void NumberedCodeEdit::setPath(QString path) -{ - filePath=path; - textEdit()->setFile(path); -} - -void NumberedCodeEdit::setModified(bool modify) -{ - textModifiedOk=modify; -} - -bool NumberedCodeEdit::modified() -{ - return textModifiedOk; -} - -void NumberedCodeEdit::cursor_moved_cb() -{ - QTextCursor cursor=view->textCursor(); - QTextBlock actual_block=cursor.block(); - int lineCount=1; - QTextBlock block = view->document()->begin(); - - for ( ;block.isValid() && actual_block!=block; block = block.next()) lineCount++ ; -} - -static QString startLineInsertText(QString str, QString textToInsert) -{ - str.replace(QChar(0x2029), "\n"); - //printf("str=%s\n", str.toLocal8Bit().data() ); - - QStringList list = str.split("\n"); - - for(int i=0;i<list.size();i++) - { - QString s=list[i]; - - int x; - - for(x=0;x<s.size();x++) - { - if( s.at(x)!=' ' && s.at(x)!='\t' ) break; - } - - QString s1=s.left(x); - QString s2=s.right(s.size()-x); - list[i]=s1+textToInsert+s2; - } - - return list.join("\n"); -} - -static QString startLineRemoveText(QString str, QStringList textToRemove) -{ - str.replace(QChar(0x2029), "\n"); - - QStringList list = str.split("\n"); - - for(int i=0;i<list.size();i++) - { - QString s=list[i]; - - int x; - - for(x=0;x<s.size();x++) - { - if( s.at(x)!=' ' && s.at(x)!='\t' ) break; - } - - QString s1=s.left(x); - QString s2=s.right(s.size()-x); - - for(int k=0;k<textToRemove.size();k++) - { - if(s1.endsWith(textToRemove[k])) - { - s1=s1.left(s1.size()-textToRemove[k].size()); - break; - } - else if(s2.startsWith(textToRemove[k])) - { - s2=s2.right(s2.size()-textToRemove[k].size()); - break; - } - } - - //printf("s1=%s s2=%s \n", s1.toLocal8Bit().data(), s2.toLocal8Bit().data()); - list[i]=s1+s2; - } - - return list.join("\n"); -} - -void NumberedCodeEdit::indent() -{ - QTextCursor cursor(textEdit()->textCursor()); - - if( !cursor.hasSelection() ) return; - - QString str=cursor.selectedText(); - - str=startLineInsertText(str, "\t"); - - cursor.insertText(str); - cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); - textEdit()->setTextCursor(cursor); -} - -void NumberedCodeEdit::unindent() -{ - //QTextDocument *doc=textEdit()->document(); - - QTextCursor cursor(textEdit()->textCursor()); - - if( !cursor.hasSelection() ) return; - - QString str=cursor.selectedText(); - - QStringList textToRemove; - textToRemove << "\t" << " "; - str=startLineRemoveText(str, textToRemove); - - cursor.insertText(str); - cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); - textEdit()->setTextCursor(cursor); -} - -void NumberedCodeEdit::comment() -{ - //QTextDocument *doc=textEdit()->document(); - - QTextCursor cursor(textEdit()->textCursor()); - - if( !cursor.hasSelection() ) return; - - QString str=cursor.selectedText(); - - str=startLineInsertText(str, "%"); - - cursor.insertText(str); - cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); - textEdit()->setTextCursor(cursor); -} - -void NumberedCodeEdit::uncomment() -{ - //QTextDocument *doc=textEdit()->document(); - - QTextCursor cursor(textEdit()->textCursor()); - - if( !cursor.hasSelection() ) return; - - QString str=cursor.selectedText(); - - QStringList textToRemove; - textToRemove << "%" << "#"; - str=startLineRemoveText(str, textToRemove); - - cursor.insertText(str); - cursor.setPosition(cursor.position()-str.size(), QTextCursor::KeepAnchor); - textEdit()->setTextCursor(cursor); -}
deleted file mode 100644 --- a/gui/src/NumberedCodeEdit.h +++ /dev/null @@ -1,169 +0,0 @@ -/* This file is part of the KDE libraries - Copyright (C) 2005, 2006 KJSEmbed Authors - See included AUTHORS file. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ -// -*- c++ -*- -#ifndef NUMBERED_TEXT_VIEW_H -#define NUMBERED_TEXT_VIEW_H - -#include <QFrame> -#include <QPixmap> -#include <QTextCursor> -#include <QLabel> -#include <QVBoxLayout> -#include <QHBoxLayout> -#include "SimpleEditor.h" - -class SimpleEditor; -class QHBoxLayout; - -/** - * @internal Used to display the numbers. - */ -class NumberBar : public QWidget -{ - Q_OBJECT - -public: - NumberBar( QWidget *parent ); - ~NumberBar(); - - void setCurrentLine( int lineno ); - void setBugLine( int lineno ); - void toggleBreakpoint( int lineno ); - QList<int> *getBreakpoints(); - - void setTextEdit( SimpleEditor *edit ); - void paintEvent( QPaintEvent *ev ); - -protected: - bool event( QEvent *ev ); - -private: - SimpleEditor *edit; - QPixmap stopMarker; - QPixmap currentMarker; - QPixmap bugMarker; - QList<int> breakpoints; - int currentLine; - int bugLine; - QRect stopRect; - QRect currentRect; - QRect bugRect; -}; - -/** - * Displays a CodeEdit with line numbers. - */ -class NumberedCodeEdit : public QFrame -{ - Q_OBJECT - -public: - NumberedCodeEdit( QWidget *parent = 0 , SimpleEditor *textEdit=new SimpleEditor() ); - ~NumberedCodeEdit(); - - QList<int> *getBreakpoints(); - - void open(QString path); - - /**Saves file to path. @return true if all is OK.*/ - bool save(QString path = QString()); - - QString path(); - void setPath(QString path); - - bool modified(); - void setModified(bool modify); - - /** Returns the CodeEdit of the main view. */ - SimpleEditor *textEdit() const { return view; } - - /** - * Sets the line that should have the current line indicator. - * A value of -1 indicates no line should show the indicator. - */ - void setCurrentLine( int lineno ); - - /** - * Toggle breakpoint - */ - void toggleBreakpoint( int lineno ); - - /** - * Sets the line that should have the bug line indicator. - * A value of -1 indicates no line should show the indicator. - */ - void setBugLine( int lineno ); - - /** @internal Used to get tooltip events from the view for the hover signal. */ - bool eventFilter( QObject *obj, QEvent *event ); - - /**Indent selected text.*/ - void indent(); - - /**UnIndent selected text.*/ - void unindent(); - - /**Comment selected text.*/ - void comment(); - - /**UnComment selected text.*/ - void uncomment(); - -signals: - /** - * Emitted when the mouse is hovered over the text edit component. - * @param word The word under the mouse pointer - */ - void mouseHover( const QString &word ); - - /** - * Emitted when the mouse is hovered over the text edit component. - * @param pos The position of the mouse pointer. - * @param word The word under the mouse pointer - */ - void mouseHover( const QPoint &pos, const QString &word ); - - /** - * Emitted when file is changed. - */ - void textModified(); - -protected slots: - /** @internal Used to update the highlight on the current line. */ - void textChanged( int pos, int added, int removed ); -public slots: - void cursor_moved_cb(); - -private: - QString filePath; - QLabel *line_column_label; - SimpleEditor *view; - NumberBar *numbers; - QHBoxLayout *hbox; - QVBoxLayout *vbox; - int currentLine; - QTextCursor highlight; - bool textModifiedOk; -}; - - -#endif // NUMBERED_TEXT_VIEW_H - -
deleted file mode 100644 --- a/gui/src/OctaveLink.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - -Copyright (C) 2007,2008,2009 John P. Swensen - -Octave 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, or (at your option) any -later version. - -Octave 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 Octave; see the file COPYING. If not, write to the Free -Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301, USA. - -*/ - -// Born July 13, 2007. - -#include "OctaveLink.h" - -OctaveLink OctaveLink::m_singleton; - - -OctaveLink::OctaveLink() - : QObject(), - m_previousHistoryLength(0) { - m_symbolTableSemaphore = new QSemaphore(1); - m_historySemaphore = new QSemaphore(1); -} - -OctaveLink::~OctaveLink() { -} - -int OctaveLink::readlineEventHook() { - OctaveLink::instance()->processOctaveServerData(); - return 0; -} - -QString OctaveLink::octaveValueAsQString(OctaveValue octaveValue) { - // Convert single qouted string. - if(octaveValue.is_sq_string()) { - return QString("\'%1\'").arg(octaveValue.string_value().c_str()); - - // Convert double qouted string. - } else if(octaveValue.is_dq_string()) { - return QString("\"%1\"").arg(octaveValue.string_value().c_str()); - - // Convert real scalar. - } else if(octaveValue.is_real_scalar()) { - return QString("%1").arg(octaveValue.scalar_value()); - - // Convert complex scalar. - } else if(octaveValue.is_complex_scalar()) { - return QString("%1 + %2i").arg(octaveValue.scalar_value()).arg(octaveValue.complex_value().imag()); - - // Convert range. - } else if(octaveValue.is_range()) { - return QString("%1 : %2 : %3").arg(octaveValue.range_value().base()) - .arg(octaveValue.range_value().inc()) - .arg(octaveValue.range_value().limit()); - - // Convert real matrix. - } else if(octaveValue.is_real_matrix()) { - // TODO: Convert real matrix into a string. - return QString("{matrix}"); - - // Convert complex matrix. - } else if(octaveValue.is_complex_matrix()) { - // TODO: Convert complex matrix into a string. - return QString("{complex matrix}"); - - // If everything else does not fit, we could not recognize the type. - } else { - return QString("<Type not recognized>"); - } -} - -void OctaveLink::fetchSymbolTable() { - m_symbolTableSemaphore->acquire(); - m_symbolTableBuffer.clear(); - std::list<SymbolRecord> allVariables = symbol_table::all_variables(); - std::list<SymbolRecord>::iterator iterator; - for(iterator = allVariables.begin(); iterator != allVariables.end(); iterator++) - m_symbolTableBuffer.append(*iterator); - m_symbolTableSemaphore->release(); - emit symbolTableChanged(); -} - - -void OctaveLink::fetchHistory() { - int currentLen = command_history::length(); - if(currentLen != m_previousHistoryLength) { - m_historySemaphore->acquire(); - for(int i = m_previousHistoryLength; i < currentLen; i++) { - m_historyBuffer.append(command_history::get_entry(i)); - } - m_historySemaphore->release(); - m_previousHistoryLength = currentLen; - emit historyChanged(); - } -} - -QList<SymbolRecord> OctaveLink::currentSymbolTable() { - QList<SymbolRecord> m_symbolTableCopy; - - // Generate a deep copy of the current symbol table. - m_symbolTableSemaphore->acquire(); - foreach(SymbolRecord symbolRecord, m_symbolTableBuffer) - m_symbolTableCopy.append(symbolRecord); - m_symbolTableSemaphore->release(); - - return m_symbolTableCopy; -} - -string_vector OctaveLink::currentHistory() { - m_historySemaphore->acquire(); - string_vector retval(m_historyBuffer); - m_historyBuffer = string_vector(); - m_historySemaphore->release(); - return retval; -} - -void OctaveLink::processOctaveServerData() { - fetchSymbolTable(); - fetchHistory(); -} -
deleted file mode 100644 --- a/gui/src/OctaveLink.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * - * Copyright (C) 2007, 2008, 2009 John P. Swensen - * - * This file is as a part of OctaveDE. - * - * Octave 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, or (at your option) any - * later version. - * - * Octave 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 Octave; see the file COPYING. If not, write to the Free - * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * */ -#ifndef OCTAVELINK_H -#define OCTAVELINK_H - -// Octave includes -#undef PACKAGE_BUGREPORT -#undef PACKAGE_NAME -#undef PACKAGE_STRING -#undef PACKAGE_TARNAME -#undef PACKAGE_VERSION -#undef PACKAGE_URL -#include <octave/config.h> -#include "octave/cmd-edit.h" -#include "octave/error.h" -#include "octave/file-io.h" -#include "octave/input.h" -#include "octave/lex.h" -#include "octave/load-path.h" -#include "octave/octave.h" -#include "octave/oct-hist.h" -#include "octave/oct-map.h" -#include "octave/oct-obj.h" -#include "octave/ops.h" -#include "octave/ov.h" -#include "octave/ov-usr-fcn.h" -#include "octave/symtab.h" -#include "octave/pt.h" -#include "octave/pt-eval.h" -#include "octave/config.h" -#include "octave/Range.h" -#include "octave/toplev.h" -#include "octave/procstream.h" -#include "octave/sighandlers.h" -#include "octave/debug.h" -#include "octave/sysdep.h" -#include "octave/ov.h" -#include "octave/unwind-prot.h" -#include "octave/utils.h" -#include "octave/variables.h" - -// Standard includes -#include <iostream> -#include <string> -#include <vector> -#include <readline/readline.h> - -// Qt includes -#include <QMutexLocker> -#include <QMutex> -#include <QFileInfo> -#include <QList> -#include <QString> -#include <QVector> -#include <QSemaphore> -#include <QObject> - -typedef symbol_table::symbol_record SymbolRecord; -typedef octave_value OctaveValue; - -/** - * \class OctaveLink - * Manages a link to an octave instance. - */ -class OctaveLink : QObject -{ - Q_OBJECT -public: - static OctaveLink *instance() { return &m_singleton; } - static int readlineEventHook(void); - static QString octaveValueAsQString(OctaveValue octaveValue); - - /** - * Returns a copy of the current symbol table buffer. - * \return Copy of the current symbol table buffer. - */ - QList<SymbolRecord> currentSymbolTable(); - - /** - * Returns a copy of the current history buffer. - * \return Copy of the current history buffer. - */ - string_vector currentHistory(); - - void processOctaveServerData(); - - /** - * Updates the current symbol table with new data - * from octave. - */ - void fetchSymbolTable(); - - /** - * Updates the current history buffer with new data - * from octave. - */ - void fetchHistory(); - -signals: - void symbolTableChanged(); - void historyChanged(); - -private: - OctaveLink(); - ~OctaveLink(); - - /** Variable related member variables. */ - QSemaphore *m_symbolTableSemaphore; - QList<SymbolRecord> m_symbolTableBuffer; - - /** History related member variables. */ - QSemaphore *m_historySemaphore; - string_vector m_historyBuffer; - int m_previousHistoryLength; - - static OctaveLink m_singleton; -}; -#endif // OCTAVELINK_H -
deleted file mode 100644 --- a/gui/src/OctaveTerminal.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include "OctaveTerminal.h" -#include <QHBoxLayout> -#include <QVBoxLayout> -#include <QStringListModel> -#include <QStringList> - -OctaveTerminalDockWidget::OctaveTerminalDockWidget(QWidget *parent, OctaveTerminal *octaveTerminal) - : QDockWidget(parent) { - setObjectName("OctaveTerminalDockWidget"); - setWindowTitle(tr("Octave terminal")); - m_octaveTerminal = octaveTerminal; - setWidget(m_octaveTerminal); -} - -OctaveTerminalDockWidget::~OctaveTerminalDockWidget() { -} - -OctaveTerminal *OctaveTerminalDockWidget::octaveTerminal() { - return m_octaveTerminal; -} - -OctaveTerminal::OctaveTerminal(QWidget *parent) - : QTerminalWidget(0, parent) { - construct(); -} - -OctaveTerminal::~OctaveTerminal() { -} - -void OctaveTerminal::construct() { - setScrollBarPosition(QTerminalWidget::ScrollBarRight); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); -} -
deleted file mode 100644 --- a/gui/src/OctaveTerminal.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef OCTAVETERMINAL_H -#define OCTAVETERMINAL_H - -#include "QTerminalWidget.h" -#include <QDockWidget> - -class OctaveTerminal; -class OctaveTerminalDockWidget : public QDockWidget { -public: - OctaveTerminalDockWidget(QWidget *parent, OctaveTerminal *octaveTerminal); - ~OctaveTerminalDockWidget(); - - OctaveTerminal *octaveTerminal(); - -private: - OctaveTerminal *m_octaveTerminal; -}; - -class OctaveTerminal : public QTerminalWidget { - Q_OBJECT -public: - OctaveTerminal(QWidget *parent = 0); - ~OctaveTerminal(); - -private: - void construct(); -}; -#endif // OCTAVETERMINAL_H
deleted file mode 100644 --- a/gui/src/ProcessInfo.cpp +++ /dev/null @@ -1,1054 +0,0 @@ -/* - Copyright 2007-2008 by Robert Knight <robertknight@gmail.countm> - - This program 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 program 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. -*/ - -// Own -#include "ProcessInfo.h" - -// Unix -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <unistd.h> -#include <pwd.h> - -// Qt -#include <QtCore/QDir> -#include <QtCore/QFileInfo> -#include <QtCore/QRegExp> -#include <QtCore/QTextStream> -#include <QtCore/QStringList> -#include <QtCore/QSet> - -// KDE -#include "konsole_export.h" - -#if defined(Q_OS_MAC) -#include <sys/sysctl.h> -#include <libproc.h> -#ifdef HAVE_SYS_PROC_INFO_H -#include <sys/proc_info.h> -#endif -#ifdef HAVE_SYS_PROC_H -#include <sys/proc.h> -#endif -//#include <kde_file.h> -#define KDE_struct_stat struct stat -#define KDE_stat ::stat -#endif - -#if defined(Q_OS_FREEBSD) -#include <sys/sysctl.h> //krazy:exclude=includes -#include <sys/types.h> -#include <sys/user.h> -#include <sys/syslimits.h> -#include <libutil.h> -#endif - -ProcessInfo::ProcessInfo(int pid , bool enableEnvironmentRead) - : _fields( ARGUMENTS | ENVIRONMENT ) // arguments and environments - // are currently always valid, - // they just return an empty - // vector / map respectively - // if no arguments - // or environment bindings - // have been explicitly set - , _enableEnvironmentRead(enableEnvironmentRead) - , _pid(pid) - , _parentPid(0) - , _foregroundPid(0) - , _userId(0) - , _lastError(NoError) - , _userName(QString()) - , _userHomeDir(QString()) -{ -} - -ProcessInfo::Error ProcessInfo::error() const { return _lastError; } -void ProcessInfo::setError(Error error) { _lastError = error; } - -void ProcessInfo::update() -{ - readProcessInfo(_pid,_enableEnvironmentRead); -} - -QString ProcessInfo::validCurrentDir() const -{ - bool ok = false; - - // read current dir, if an error occurs try the parent as the next - // best option - int currentPid = parentPid(&ok); - QString dir = currentDir(&ok); - while ( !ok && currentPid != 0 ) - { - ProcessInfo* current = ProcessInfo::newInstance(currentPid); - current->update(); - currentPid = current->parentPid(&ok); - dir = current->currentDir(&ok); - delete current; - } - - return dir; -} - -QString ProcessInfo::format(const QString& input) const -{ - bool ok = false; - - QString output(input); - - // search for and replace known marker - output.replace("%u",userName()); - output.replace("%n",name(&ok)); - output.replace("%c",formatCommand(name(&ok),arguments(&ok),ShortCommandFormat)); - output.replace("%C",formatCommand(name(&ok),arguments(&ok),LongCommandFormat)); - - QString dir = validCurrentDir(); - if (output.contains("%D")) - { - QString homeDir = userHomeDir(); - QString tempDir = dir; - // Change User's Home Dir w/ ~ only at the beginning - if (tempDir.startsWith(homeDir)) - { - tempDir.remove(0, homeDir.length()); - tempDir.prepend('~'); - } - output.replace("%D", tempDir); - } - output.replace("%d", dir); - - // remove any remaining %[LETTER] sequences - // output.replace(QRegExp("%\\w"), QString()); - - return output; -} - -QString ProcessInfo::formatCommand(const QString& name, - const QVector<QString>& arguments, - CommandFormat format) const -{ - Q_UNUSED(name); - Q_UNUSED(format); - - // TODO Implement me - return QStringList(QList<QString>::fromVector(arguments)).join(" "); -} - -QVector<QString> ProcessInfo::arguments(bool* ok) const -{ - *ok = _fields & ARGUMENTS; - - return _arguments; -} - -QMap<QString,QString> ProcessInfo::environment(bool* ok) const -{ - *ok = _fields & ENVIRONMENT; - - return _environment; -} - -bool ProcessInfo::isValid() const -{ - return _fields & PROCESS_ID; -} - -int ProcessInfo::pid(bool* ok) const -{ - *ok = _fields & PROCESS_ID; - - return _pid; -} - -int ProcessInfo::parentPid(bool* ok) const -{ - *ok = _fields & PARENT_PID; - - return _parentPid; -} - -int ProcessInfo::foregroundPid(bool* ok) const -{ - *ok = _fields & FOREGROUND_PID; - - return _foregroundPid; -} - -QString ProcessInfo::name(bool* ok) const -{ - *ok = _fields & NAME; - - return _name; -} - -int ProcessInfo::userId(bool* ok) const -{ - *ok = _fields & UID; - - return _userId; -} - -QString ProcessInfo::userName() const -{ - return _userName; -} - -QString ProcessInfo::userHomeDir() const -{ - return _userHomeDir; -} - -void ProcessInfo::setPid(int pid) -{ - _pid = pid; - _fields |= PROCESS_ID; -} - -void ProcessInfo::setUserId(int uid) -{ - _userId = uid; - _fields |= UID; -} - -void ProcessInfo::setUserName(const QString& name) -{ - _userName = name; - setUserHomeDir(); -} - -void ProcessInfo::setUserHomeDir() -{ - QString usersName = userName(); - // JPS: I don't know a good QT replacement - //if (!usersName.isEmpty()) - // _userHomeDir = KUser(usersName).homeDir(); - //else - _userHomeDir = QDir::homePath(); -} - -void ProcessInfo::setParentPid(int pid) -{ - _parentPid = pid; - _fields |= PARENT_PID; -} -void ProcessInfo::setForegroundPid(int pid) -{ - _foregroundPid = pid; - _fields |= FOREGROUND_PID; -} - -QString ProcessInfo::currentDir(bool* ok) const -{ - if (ok) - *ok = _fields & CURRENT_DIR; - - return _currentDir; -} -void ProcessInfo::setCurrentDir(const QString& dir) -{ - _fields |= CURRENT_DIR; - _currentDir = dir; -} - -void ProcessInfo::setName(const QString& name) -{ - _name = name; - _fields |= NAME; -} -void ProcessInfo::addArgument(const QString& argument) -{ - _arguments << argument; -} - -void ProcessInfo::addEnvironmentBinding(const QString& name , const QString& value) -{ - _environment.insert(name,value); -} - -void ProcessInfo::setFileError( QFile::FileError error ) -{ - switch ( error ) - { - case PermissionsError: - setError( PermissionsError ); - break; - case NoError: - setError( NoError ); - break; - default: - setError( UnknownError ); - } -} - -// -// ProcessInfo::newInstance() is way at the bottom so it can see all of the -// implementations of the UnixProcessInfo abstract class. -// - -NullProcessInfo::NullProcessInfo(int pid,bool enableEnvironmentRead) - : ProcessInfo(pid,enableEnvironmentRead) -{ -} - -bool NullProcessInfo::readProcessInfo(int /*pid*/ , bool /*enableEnvironmentRead*/) -{ - return false; -} - -void NullProcessInfo::readUserName() -{ -} - -UnixProcessInfo::UnixProcessInfo(int pid,bool enableEnvironmentRead) - : ProcessInfo(pid,enableEnvironmentRead) -{ -} - -bool UnixProcessInfo::readProcessInfo(int pid , bool enableEnvironmentRead) -{ - bool ok = readProcInfo(pid); - if (ok) - { - ok |= readArguments(pid); - ok |= readCurrentDir(pid); - if ( enableEnvironmentRead ) - { - ok |= readEnvironment(pid); - } - } - return ok; -} - -void UnixProcessInfo::readUserName() -{ - bool ok = false; - int uid = userId(&ok); - if (!ok) return; - - struct passwd passwdStruct; - struct passwd *getpwResult; - char *getpwBuffer; - long getpwBufferSize; - int getpwStatus; - - getpwBufferSize = sysconf(_SC_GETPW_R_SIZE_MAX); - if (getpwBufferSize == -1) - getpwBufferSize = 16384; - - getpwBuffer = new char[getpwBufferSize]; - if (getpwBuffer == NULL) - return; - getpwStatus = getpwuid_r(uid, &passwdStruct, getpwBuffer, getpwBufferSize, &getpwResult); - if (getpwResult != NULL) - setUserName(QString(passwdStruct.pw_name)); - else - setUserName(QString()); - delete [] getpwBuffer; -} - - -class LinuxProcessInfo : public UnixProcessInfo -{ -public: - LinuxProcessInfo(int pid, bool env) : - UnixProcessInfo(pid,env) - { - } - -private: - virtual bool readProcInfo(int pid) - { - // indicies of various fields within the process status file which - // contain various information about the process - const int PARENT_PID_FIELD = 3; - const int PROCESS_NAME_FIELD = 1; - const int GROUP_PROCESS_FIELD = 7; - - QString parentPidString; - QString processNameString; - QString foregroundPidString; - QString uidLine; - QString uidString; - QStringList uidStrings; - - // For user id read process status file ( /proc/<pid>/status ) - // Can not use getuid() due to it does not work for 'su' - QFile statusInfo( QString("/proc/%1/status").arg(pid) ); - if ( statusInfo.open(QIODevice::ReadOnly) ) - { - QTextStream stream(&statusInfo); - QString statusLine; - do { - statusLine = stream.readLine(0); - if (statusLine.startsWith(QLatin1String("Uid:"))) - uidLine = statusLine; - } while (!statusLine.isNull() && uidLine.isNull()); - - uidStrings << uidLine.split('\t', QString::SkipEmptyParts); - // Must be 5 entries: 'Uid: %d %d %d %d' and - // uid string must be less than 5 chars (uint) - if (uidStrings.size() == 5) - uidString = uidStrings[1]; - if (uidString.size() > 5) - uidString.clear(); - - bool ok = false; - int uid = uidString.toInt(&ok); - if (ok) - setUserId(uid); - readUserName(); - } - else - { - setFileError( statusInfo.error() ); - return false; - } - - - // read process status file ( /proc/<pid/stat ) - // - // the expected file format is a list of fields separated by spaces, using - // parenthesies to escape fields such as the process name which may itself contain - // spaces: - // - // FIELD FIELD (FIELD WITH SPACES) FIELD FIELD - // - QFile processInfo( QString("/proc/%1/stat").arg(pid) ); - if ( processInfo.open(QIODevice::ReadOnly) ) - { - QTextStream stream(&processInfo); - QString data = stream.readAll(); - - int stack = 0; - int field = 0; - int pos = 0; - - while (pos < data.count()) - { - QChar c = data[pos]; - - if ( c == '(' ) - stack++; - else if ( c == ')' ) - stack--; - else if ( stack == 0 && c == ' ' ) - field++; - else - { - switch ( field ) - { - case PARENT_PID_FIELD: - parentPidString.append(c); - break; - case PROCESS_NAME_FIELD: - processNameString.append(c); - break; - case GROUP_PROCESS_FIELD: - foregroundPidString.append(c); - break; - } - } - - pos++; - } - } - else - { - setFileError( processInfo.error() ); - return false; - } - - // check that data was read successfully - bool ok = false; - int foregroundPid = foregroundPidString.toInt(&ok); - if (ok) - setForegroundPid(foregroundPid); - - int parentPid = parentPidString.toInt(&ok); - if (ok) - setParentPid(parentPid); - - if (!processNameString.isEmpty()) - setName(processNameString); - - // update object state - setPid(pid); - - return ok; - } - - virtual bool readArguments(int pid) - { - // read command-line arguments file found at /proc/<pid>/cmdline - // the expected format is a list of strings delimited by null characters, - // and ending in a double null character pair. - - QFile argumentsFile( QString("/proc/%1/cmdline").arg(pid) ); - if ( argumentsFile.open(QIODevice::ReadOnly) ) - { - QTextStream stream(&argumentsFile); - QString data = stream.readAll(); - - QStringList argList = data.split( QChar('\0') ); - - foreach ( const QString &entry , argList ) - { - if (!entry.isEmpty()) - addArgument(entry); - } - } - else - { - setFileError( argumentsFile.error() ); - } - - return true; - } - - virtual bool readCurrentDir(int pid) - { - QFileInfo info( QString("/proc/%1/cwd").arg(pid) ); - - const bool readable = info.isReadable(); - - if ( readable && info.isSymLink() ) - { - setCurrentDir( info.symLinkTarget() ); - return true; - } - else - { - if ( !readable ) - setError( PermissionsError ); - else - setError( UnknownError ); - - return false; - } - } - - virtual bool readEnvironment(int pid) - { - // read environment bindings file found at /proc/<pid>/environ - // the expected format is a list of KEY=VALUE strings delimited by null - // characters and ending in a double null character pair. - - QFile environmentFile( QString("/proc/%1/environ").arg(pid) ); - if ( environmentFile.open(QIODevice::ReadOnly) ) - { - QTextStream stream(&environmentFile); - QString data = stream.readAll(); - - QStringList bindingList = data.split( QChar('\0') ); - - foreach( const QString &entry , bindingList ) - { - QString name; - QString value; - - int splitPos = entry.indexOf('='); - - if ( splitPos != -1 ) - { - name = entry.mid(0,splitPos); - value = entry.mid(splitPos+1,-1); - - addEnvironmentBinding(name,value); - } - } - } - else - { - setFileError( environmentFile.error() ); - } - - return true; - } -} ; - -#if defined(Q_OS_FREEBSD) -class FreeBSDProcessInfo : public UnixProcessInfo -{ -public: - FreeBSDProcessInfo(int pid, bool readEnvironment) : - UnixProcessInfo(pid, readEnvironment) - { - } - -private: - virtual bool readProcInfo(int pid) - { - int managementInfoBase[4]; - size_t mibLength; - struct kinfo_proc* kInfoProc; - - managementInfoBase[0] = CTL_KERN; - managementInfoBase[1] = KERN_PROC; - managementInfoBase[2] = KERN_PROC_PID; - managementInfoBase[3] = pid; - - if (sysctl(managementInfoBase, 4, NULL, &mibLength, NULL, 0) == -1) - return false; - - kInfoProc = new struct kinfo_proc [mibLength]; - - if (sysctl(managementInfoBase, 4, kInfoProc, &mibLength, NULL, 0) == -1) - { - delete [] kInfoProc; - return false; - } - -#if defined(__DragonFly__) - setName(kInfoProc->kp_comm); - setPid(kInfoProc->kp_pid); - setParentPid(kInfoProc->kp_ppid); - setForegroundPid(kInfoProc->kp_pgid); - setUserId(kInfoProc->kp_uid); -#else - setName(kInfoProc->ki_comm); - setPid(kInfoProc->ki_pid); - setParentPid(kInfoProc->ki_ppid); - setForegroundPid(kInfoProc->ki_pgid); - setUserId(kInfoProc->ki_uid); -#endif - - readUserName(); - - delete [] kInfoProc; - return true; - } - - virtual bool readArguments(int pid) - { - char args[ARG_MAX]; - int managementInfoBase[4]; - size_t len; - - managementInfoBase[0] = CTL_KERN; - managementInfoBase[1] = KERN_PROC; - managementInfoBase[2] = KERN_PROC_PID; - managementInfoBase[3] = pid; - - len = sizeof(args); - if (sysctl(managementInfoBase, 4, args, &len, NULL, 0) == -1) - return false; - - const QStringList argumentList = QString(args).split(QChar('\0')); - - for (QStringList::const_iterator it = argumentList.begin(); it != argumentList.end(); ++it) - { - addArgument(*it); - } - - return true; - } - - virtual bool readEnvironment(int pid) - { - // Not supported in FreeBSD? - return false; - } - - virtual bool readCurrentDir(int pid) - { -#if defined(__DragonFly__) - char buf[PATH_MAX]; - int managementInfoBase[4]; - size_t len; - - managementInfoBase[0] = CTL_KERN; - managementInfoBase[1] = KERN_PROC; - managementInfoBase[2] = KERN_PROC_CWD; - managementInfoBase[3] = pid; - - len = sizeof(buf); - if (sysctl(managementInfoBase, 4, buf, &len, NULL, 0) == -1) - return false; - - setCurrentDir(buf); - - return true; -#else - int numrecords; - struct kinfo_file* info = 0; - - info = kinfo_getfile(pid, &numrecords); - - if (!info) - return false; - - for (int i = 0; i < numrecords; ++i) - { - if (info[i].kf_fd == KF_FD_TYPE_CWD) - { - setCurrentDir(info[i].kf_path); - - free(info); - return true; - } - } - - free(info); - return false; -#endif - } -} ; -#endif - -#if defined(Q_OS_MAC) -class MacProcessInfo : public UnixProcessInfo -{ -public: - MacProcessInfo(int pid, bool env) : - UnixProcessInfo(pid, env) - { - } - -private: - virtual bool readProcInfo(int pid) - { - int managementInfoBase[4]; - size_t mibLength; - struct kinfo_proc* kInfoProc; - KDE_struct_stat statInfo; - - // Find the tty device of 'pid' (Example: /dev/ttys001) - managementInfoBase[0] = CTL_KERN; - managementInfoBase[1] = KERN_PROC; - managementInfoBase[2] = KERN_PROC_PID; - managementInfoBase[3] = pid; - - if (sysctl(managementInfoBase, 4, NULL, &mibLength, NULL, 0) == -1) - { - return false; - } - else - { - kInfoProc = new struct kinfo_proc [mibLength]; - if (sysctl(managementInfoBase, 4, kInfoProc, &mibLength, NULL, 0) == -1) - { - delete [] kInfoProc; - return false; - } - else - { - QString deviceNumber = QString(devname(((&kInfoProc->kp_eproc)->e_tdev), S_IFCHR)); - QString fullDeviceName = QString("/dev/") + deviceNumber.rightJustified(3, '0'); - delete [] kInfoProc; - - QByteArray deviceName = fullDeviceName.toLatin1(); - const char* ttyName = deviceName.data(); - - if (KDE_stat(ttyName, &statInfo) != 0) - return false; - - // Find all processes attached to ttyName - managementInfoBase[0] = CTL_KERN; - managementInfoBase[1] = KERN_PROC; - managementInfoBase[2] = KERN_PROC_TTY; - managementInfoBase[3] = statInfo.st_rdev; - - mibLength = 0; - if (sysctl(managementInfoBase, sizeof(managementInfoBase)/sizeof(int), NULL, &mibLength, NULL, 0) == -1) - return false; - - kInfoProc = new struct kinfo_proc [mibLength]; - if (sysctl(managementInfoBase, sizeof(managementInfoBase)/sizeof(int), kInfoProc, &mibLength, NULL, 0) == -1) - return false; - - // The foreground program is the first one - setName(QString(kInfoProc->kp_proc.p_comm)); - - delete [] kInfoProc; - } - } - return true; - } - - virtual bool readArguments(int pid) - { - Q_UNUSED(pid); - return false; - } - virtual bool readCurrentDir(int pid) - { - struct proc_vnodepathinfo vpi; - int nb = proc_pidinfo(pid, PROC_PIDVNODEPATHINFO, 0, &vpi, sizeof(vpi)); - if (nb == sizeof(vpi)) - { - setCurrentDir(QString(vpi.pvi_cdir.vip_path)); - return true; - } - return false; - } - virtual bool readEnvironment(int pid) - { - Q_UNUSED(pid); - return false; - } -} ; -#endif - -#ifdef Q_OS_SOLARIS - // The procfs structure definition requires off_t to be - // 32 bits, which only applies if FILE_OFFSET_BITS=32. - // Futz around here to get it to compile regardless, - // although some of the structure sizes might be wrong. - // Fortunately, the structures we actually use don't use - // off_t, and we're safe. - #if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS==64) - #undef _FILE_OFFSET_BITS - #endif - #include <procfs.h> -#else - // On non-Solaris platforms, define a fake psinfo structure - // so that the SolarisProcessInfo class can be compiled - // - // That avoids the trap where you change the API and - // don't notice it in #ifdeffed platform-specific parts - // of the code. - struct psinfo { - int pr_ppid; - int pr_pgid; - char* pr_fname; - char* pr_psargs; - } ; - static const int PRARGSZ=1; -#endif - -class SolarisProcessInfo : public UnixProcessInfo -{ -public: - SolarisProcessInfo(int pid, bool readEnvironment) - : UnixProcessInfo(pid,readEnvironment) - { - } -private: - virtual bool readProcInfo(int pid) - { - QFile psinfo( QString("/proc/%1/psinfo").arg(pid) ); - if ( psinfo.open( QIODevice::ReadOnly ) ) - { - struct psinfo info; - if (psinfo.read((char *)&info,sizeof(info)) != sizeof(info)) - { - return false; - } - - setParentPid(info.pr_ppid); - setForegroundPid(info.pr_pgid); - setName(info.pr_fname); - setPid(pid); - - // Bogus, because we're treating the arguments as one single string - info.pr_psargs[PRARGSZ-1]=0; - addArgument(info.pr_psargs); - } - return true; - } - - virtual bool readArguments(int /*pid*/) - { - // Handled in readProcInfo() - return false; - } - - virtual bool readEnvironment(int /*pid*/) - { - // Not supported in Solaris - return false; - } - - virtual bool readCurrentDir(int pid) - { - QFileInfo info( QString("/proc/%1/path/cwd").arg(pid) ); - const bool readable = info.isReadable(); - - if ( readable && info.isSymLink() ) - { - setCurrentDir( info.symLinkTarget() ); - return true; - } - else - { - if ( !readable ) - setError( PermissionsError ); - else - setError( UnknownError ); - - return false; - } - } -} ; - -SSHProcessInfo::SSHProcessInfo(const ProcessInfo& process) - : _process(process) -{ - bool ok = false; - - // check that this is a SSH process - const QString& name = _process.name(&ok); - - if ( !ok || name != "ssh" ) - { - //if ( !ok ) - // kWarning() << "Could not read process info"; - //else - // kWarning() << "Process is not a SSH process"; - - return; - } - - // read arguments - const QVector<QString>& args = _process.arguments(&ok); - - // SSH options - // these are taken from the SSH manual ( accessed via 'man ssh' ) - - // options which take no arguments - static const QString noOptionsArguments("1246AaCfgkMNnqsTtVvXxY"); - // options which take one argument - static const QString singleOptionArguments("bcDeFiLlmOopRSw"); - - if ( ok ) - { - // find the username, host and command arguments - // - // the username/host is assumed to be the first argument - // which is not an option - // ( ie. does not start with a dash '-' character ) - // or an argument to a previous option. - // - // the command, if specified, is assumed to be the argument following - // the username and host - // - // note that we skip the argument at index 0 because that is the - // program name ( expected to be 'ssh' in this case ) - for ( int i = 1 ; i < args.count() ; i++ ) - { - // if this argument is an option then skip it, plus any - // following arguments which refer to this option - if ( args[i].startsWith('-') ) - { - QChar argChar = ( args[i].length() > 1 ) ? args[i][1] : '\0'; - - if ( noOptionsArguments.contains(argChar) ) - continue; - else if ( singleOptionArguments.contains(argChar) ) - { - i++; - continue; - } - } - - // check whether the host has been found yet - // if not, this must be the username/host argument - if ( _host.isEmpty() ) - { - // check to see if only a hostname is specified, or whether - // both a username and host are specified ( in which case they - // are separated by an '@' character: username@host ) - - int separatorPosition = args[i].indexOf('@'); - if ( separatorPosition != -1 ) - { - // username and host specified - _user = args[i].left(separatorPosition); - _host = args[i].mid(separatorPosition+1); - } - else - { - // just the host specified - _host = args[i]; - } - } - else - { - // host has already been found, this must be the command argument - _command = args[i]; - } - - } - } - else - { - //kWarning() << "Could not read arguments"; - - return; - } -} - -QString SSHProcessInfo::userName() const -{ - return _user; -} -QString SSHProcessInfo::host() const -{ - return _host; -} -QString SSHProcessInfo::command() const -{ - return _command; -} -QString SSHProcessInfo::format(const QString& input) const -{ - QString output(input); - - // test whether host is an ip address - // in which case 'short host' and 'full host' - // markers in the input string are replaced with - // the full address - bool isIpAddress = false; - - struct in_addr address; - if ( inet_aton(_host.toLocal8Bit().constData(),&address) != 0 ) - isIpAddress = true; - else - isIpAddress = false; - - // search for and replace known markers - output.replace("%u",_user); - - if ( isIpAddress ) - output.replace("%h",_host); - else - output.replace("%h",_host.left(_host.indexOf('.'))); - - output.replace("%H",_host); - output.replace("%c",_command); - - return output; -} - -ProcessInfo* ProcessInfo::newInstance(int pid,bool enableEnvironmentRead) -{ -#ifdef Q_OS_LINUX - return new LinuxProcessInfo(pid,enableEnvironmentRead); -#elif defined(Q_OS_SOLARIS) - return new SolarisProcessInfo(pid,enableEnvironmentRead); -#elif defined(Q_OS_MAC) - return new MacProcessInfo(pid,enableEnvironmentRead); -#elif defined(Q_OS_FREEBSD) - return new FreeBSDProcessInfo(pid,enableEnvironmentRead); -#else - return new NullProcessInfo(pid,enableEnvironmentRead); -#endif -} -
deleted file mode 100644 --- a/gui/src/ProcessInfo.h +++ /dev/null @@ -1,454 +0,0 @@ -/* - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - - This program 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 program 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 PROCESSINFO_H -#define PROCESSINFO_H - -// Qt -#include <QtCore/QFile> -#include <QtCore/QMap> -#include <QtCore/QString> -#include <QtCore/QVector> - -/** - * Takes a snapshot of the state of a process and provides access to - * information such as the process name, parent process, - * the foreground process in the controlling terminal, - * the arguments with which the process was started and the - * environment. - * - * To create a new snapshot, construct a new ProcessInfo instance, - * using ProcessInfo::newInstance(), - * passing the process identifier of the process you are interested in. - * - * After creating a new instance, call the update() method to take a - * snapshot of the current state of the process. - * - * Before calling any additional methods, check that the process state - * was read successfully using the isValid() method. - * - * Each accessor method which provides information about the process state ( such as pid(), - * currentDir(), name() ) takes a pointer to a boolean as an argument. If the information - * requested was read successfully then the boolean is set to true, otherwise it is set - * to false, in which case the return value from the function should be ignored. - * If this boolean is set to false, it may indicate an error reading the process information, - * or it may indicate that the information is not available on the current platform. - * - * eg. - * - * @code - * ProcessInfo* info = ProcessInfo::newInstance(pid); - * info->update(); - * - * if ( info->isValid() ) - * { - * bool ok; - * QString value = info->name(&ok); - * - * if ( ok ) kDebug() << "process name - " << name; - * int parentPid = info->parentPid(&ok); - * if ( ok ) kDebug() << "parent process - " << parentPid; - * int foregroundPid = info->foregroundColororegroundPid(&ok); - * if ( ok ) kDebug() << "foreground process - " << foregroundPid; - * } - * @endcode - */ -class ProcessInfo -{ -public: - /** - * Constructs a new instance of a suitable ProcessInfo sub-class for - * the current platform which provides information about a given process. - * - * @param pid The pid of the process to examine - * @param readEnvironment Specifies whether environment bindings should - * be read. If this is false, then environment() calls will - * always fail. This is an optimization to avoid the overhead - * of reading the (potentially large) environment data when it - * is not required. - */ - static ProcessInfo* newInstance(int pid,bool readEnvironment = false); - - virtual ~ProcessInfo() {} - - /** - * Updates the information about the process. This must - * be called before attempting to use any of the accessor methods. - */ - void update(); - - /** Returns true if the process state was read successfully. */ - bool isValid() const; - /** - * Returns the process id. - * - * @param ok Set to true if the process id was read successfully or false otherwise - */ - int pid(bool* ok) const; - /** - * Returns the id of the parent process id was read successfully or false otherwise - * - * @param ok Set to true if the parent process id - */ - int parentPid(bool* ok) const; - - /** - * Returns the id of the current foreground process - * - * NOTE: Using the foregroundProcessGroup() method of the Pty - * instance associated with the terminal of interest is preferred - * over using this method. - * - * @param ok Set to true if the foreground process id was read successfully or false otherwise - */ - int foregroundPid(bool* ok) const; - - /* Returns the user id of the process */ - int userId(bool* ok) const; - - /** Returns the user's name of the process */ - QString userName() const; - - /** Returns the user's home directory of the process */ - QString userHomeDir() const; - - /** Returns the name of the current process */ - QString name(bool* ok) const; - - /** - * Returns the command-line arguments which the process - * was started with. - * - * The first argument is the name used to launch the process. - * - * @param ok Set to true if the arguments were read successfully or false otherwise. - */ - QVector<QString> arguments(bool* ok) const; - /** - * Returns the environment bindings which the process - * was started with. - * In the returned map, the key is the name of the environment variable, - * and the value is the corresponding value. - * - * @param ok Set to true if the environment bindings were read successfully or false otherwise - */ - QMap<QString,QString> environment(bool* ok) const; - - /** - * Returns the current working directory of the process - * - * @param ok Set to true if the current working directory was read successfully or false otherwise - */ - QString currentDir(bool* ok) const; - - /** - * Returns the current working directory of the process (or its parent) - */ - QString validCurrentDir() const; - - /** Forces the user home directory to be calculated */ - void setUserHomeDir(); - - /** - * Parses an input string, looking for markers beginning with a '%' - * character and returns a string with the markers replaced - * with information from this process description. - * <br> - * The markers recognised are: - * <ul> - * <li> %u - Name of the user which owns the process. </li> - * <li> %n - Replaced with the name of the process. </li> - * <li> %d - Replaced with the last part of the path name of the - * process' current working directory. - * - * (eg. if the current directory is '/home/bob' then - * 'bob' would be returned) - * </li> - * <li> %D - Replaced with the current working directory of the process. </li> - * </ul> - */ - QString format(const QString& text) const; - - /** - * This enum describes the errors which can occur when trying to read - * a process's information. - */ - enum Error - { - /** No error occurred. */ - NoError, - /** The nature of the error is unknown. */ - UnknownError, - /** Konsole does not have permission to obtain the process information. */ - PermissionsError - }; - - /** - * Returns the last error which occurred. - */ - Error error() const; - -protected: - /** - * Constructs a new process instance. You should not call the constructor - * of ProcessInfo or its subclasses directly. Instead use the - * static ProcessInfo::newInstance() method which will return - * a suitable ProcessInfo instance for the current platform. - */ - explicit ProcessInfo(int pid , bool readEnvironment = false); - - /** - * This is called on construction to read the process state - * Subclasses should reimplement this function to provide - * platform-specific process state reading functionality. - * - * When called, readProcessInfo() should attempt to read all - * of the necessary state information. If the attempt is successful, - * it should set the process id using setPid(), and update - * the other relevant information using setParentPid(), setName(), - * setArguments() etc. - * - * Calls to isValid() will return true only if the process id - * has been set using setPid() - * - * @param pid The process id of the process to read - * @param readEnvironment Specifies whether the environment bindings - * for the process should be read - */ - virtual bool readProcessInfo(int pid , bool readEnvironment) = 0; - - /* Read the user name */ - virtual void readUserName(void) = 0; - - /** Sets the process id associated with this ProcessInfo instance */ - void setPid(int pid); - /** Sets the parent process id as returned by parentPid() */ - void setParentPid(int pid); - /** Sets the foreground process id as returend by foregroundPid() */ - void setForegroundPid(int pid); - /** Sets the user id associated with this ProcessInfo instance */ - void setUserId(int uid); - /** Sets the user name of the process as set by readUserName() */ - void setUserName(const QString& name); - /** Sets the name of the process as returned by name() */ - void setName(const QString& name); - /** Sets the current working directory for the process */ - void setCurrentDir(const QString& dir); - - /** Sets the error */ - void setError( Error error ); - - /** Convenience method. Sets the error based on a QFile error code. */ - void setFileError( QFile::FileError error ); - - /** - * Adds a commandline argument for the process, as returned - * by arguments() - */ - void addArgument(const QString& argument); - /** - * Adds an environment binding for the process, as returned by - * environment() - * - * @param name The name of the environment variable, eg. "PATH" - * @param value The value of the environment variable, eg. "/bin" - */ - void addEnvironmentBinding(const QString& name , const QString& value); - -private: - enum CommandFormat - { - ShortCommandFormat, - LongCommandFormat - }; - // takes a process name and its arguments and produces formatted output - QString formatCommand(const QString& name , const QVector<QString>& arguments , - CommandFormat format) const; - - // valid bits for _fields variable, ensure that - // _fields is changed to an int if more than 8 fields are added - enum FIELD_BITS - { - PROCESS_ID = 1, - PARENT_PID = 2, - FOREGROUND_PID = 4, - ARGUMENTS = 8, - ENVIRONMENT = 16, - NAME = 32, - CURRENT_DIR = 64, - UID =128 - }; - - char _fields; // a bitmap indicating which fields are valid - // used to set the "ok" parameters for the public - // accessor functions - - bool _enableEnvironmentRead; // specifies whether to read the environment - // bindings when update() is called - int _pid; - int _parentPid; - int _foregroundPid; - int _userId; - - Error _lastError; - - QString _name; - QString _userName; - QString _userHomeDir; - QString _currentDir; - - QVector<QString> _arguments; - QMap<QString,QString> _environment; -}; - -/** - * Implementation of ProcessInfo which does nothing. - * Used on platforms where a suitable ProcessInfo subclass is not - * available. - * - * isValid() will always return false for instances of NullProcessInfo - */ -class NullProcessInfo : public ProcessInfo -{ -public: - /** - * Constructs a new NullProcessInfo instance. - * See ProcessInfo::newInstance() - */ - explicit NullProcessInfo(int pid,bool readEnvironment = false); -protected: - virtual bool readProcessInfo(int pid,bool readEnvironment); - virtual void readUserName(void); -}; - -/** - * Implementation of ProcessInfo for Unix platforms which uses - * the /proc filesystem - */ -class UnixProcessInfo : public ProcessInfo -{ -public: - /** - * Constructs a new instance of UnixProcessInfo. - * See ProcessInfo::newInstance() - */ - explicit UnixProcessInfo(int pid,bool readEnvironment = false); - -protected: - /** - * Implementation of ProcessInfo::readProcessInfo(); calls the - * four private methods below in turn. - */ - virtual bool readProcessInfo(int pid , bool readEnvironment); - - virtual void readUserName(void); - -private: - /** - * Read the standard process information -- PID, parent PID, foreground PID. - * @param pid process ID to use - * @return true on success - */ - virtual bool readProcInfo(int pid)=0; - - /** - * Read the environment of the process. Sets _environment. - * @param pid process ID to use - * @return true on success - */ - virtual bool readEnvironment(int pid)=0; - - /** - * Determine what arguments were passed to the process. Sets _arguments. - * @param pid process ID to use - * @return true on success - */ - virtual bool readArguments(int pid)=0; - - /** - * Determine the current directory of the process. - * @param pid process ID to use - * @return true on success - */ - virtual bool readCurrentDir(int pid)=0; -}; - -/** - * Lightweight class which provides additional information about SSH processes. - */ -class SSHProcessInfo -{ -public: - /** - * Constructs a new SSHProcessInfo instance which provides additional - * information about the specified SSH process. - * - * @param process A ProcessInfo instance for a SSH process. - */ - SSHProcessInfo(const ProcessInfo& process); - - /** - * Returns the user name which the user initially logged into on - * the remote computer. - */ - QString userName() const; - - /** - * Returns the host which the user has connected to. - */ - QString host() const; - - /** - * Returns the command which the user specified to execute on the - * remote computer when starting the SSH process. - */ - QString command() const; - - /** - * Operates in the same way as ProcessInfo::format(), except - * that the set of markers understood is different: - * - * %u - Replaced with user name which the user initially logged - * into on the remote computer. - * %h - Replaced with the first part of the host name which - * is connected to. - * %H - Replaced with the full host name of the computer which - * is connected to. - * %c - Replaced with the command which the user specified - * to execute when starting the SSH process. - */ - QString format(const QString& input) const; - -private: - const ProcessInfo& _process; - QString _user; - QString _host; - QString _command; -}; - -#endif //PROCESSINFO_H - -/* - Local Variables: - mode: c++ - c-file-style: "stroustrup" - indent-tabs-mode: nil - tab-width: 4 - End: -*/
deleted file mode 100644 --- a/gui/src/Pty.cpp +++ /dev/null @@ -1,310 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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. -*/ - -// Own -#include "kprocess_p.h" -#include "kptyprocess.h" -#include "Pty.h" - -// System -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> -#include <termios.h> -#include <signal.h> - -// Qt -#include <QtCore/QStringList> - -#include "kpty.h" -#include "kptydevice.h" - - -void Pty::setWindowSize(int lines, int cols) -{ - _windowColumns = cols; - _windowLines = lines; - - if (pty()->masterFd() >= 0) - pty()->setWinSize(lines, cols); -} -QSize Pty::windowSize() const -{ - return QSize(_windowColumns,_windowLines); -} - -void Pty::setFlowControlEnabled(bool enable) -{ - _xonXoff = enable; - - if (pty()->masterFd() >= 0) - { - struct ::termios ttmode; - pty()->tcGetAttr(&ttmode); - if (!enable) - ttmode.c_iflag &= ~(IXOFF | IXON); - else - ttmode.c_iflag |= (IXOFF | IXON); - //if (!pty()->tcSetAttr(&ttmode)) - // kWarning() << "Unable to set terminal attributes."; - } -} -bool Pty::flowControlEnabled() const -{ - if (pty()->masterFd() >= 0) - { - struct ::termios ttmode; - pty()->tcGetAttr(&ttmode); - return ttmode.c_iflag & IXOFF && - ttmode.c_iflag & IXON; - } - //kWarning() << "Unable to get flow control status, terminal not connected."; - return false; -} - -void Pty::setUtf8Mode(bool enable) -{ -#ifdef IUTF8 // XXX not a reasonable place to check it. - _utf8 = enable; - - if (pty()->masterFd() >= 0) - { - struct ::termios ttmode; - pty()->tcGetAttr(&ttmode); - if (!enable) - ttmode.c_iflag &= ~IUTF8; - else - ttmode.c_iflag |= IUTF8; - // if (!pty()->tcSetAttr(&ttmode)) - // kWarning() << "Unable to set terminal attributes."; - } -#endif -} - -void Pty::setErase(char erase) -{ - _eraseChar = erase; - - if (pty()->masterFd() >= 0) - { - struct ::termios ttmode; - pty()->tcGetAttr(&ttmode); - ttmode.c_cc[VERASE] = erase; - //if (!pty()->tcSetAttr(&ttmode)) - // kWarning() << "Unable to set terminal attributes."; - } -} - -char Pty::erase() const -{ - if (pty()->masterFd() >= 0) - { - struct ::termios ttyAttributes; - pty()->tcGetAttr(&ttyAttributes); - return ttyAttributes.c_cc[VERASE]; - } - - return _eraseChar; -} - -void Pty::addEnvironmentVariables(const QStringList& environment) -{ - QListIterator<QString> iter(environment); - while (iter.hasNext()) - { - QString pair = iter.next(); - - // split on the first '=' character - int pos = pair.indexOf('='); - - if ( pos >= 0 ) - { - QString variable = pair.left(pos); - QString value = pair.mid(pos+1); - - setEnv(variable,value); - } - } -} - -int Pty::start(const QString& program, - const QStringList& programArguments, - const QStringList& environment, - ulong winid, - bool addToUtmp, - const QString& dbusService, - const QString& dbusSession) -{ - clearProgram(); - - // For historical reasons, the first argument in programArguments is the - // name of the program to execute, so create a list consisting of all - // but the first argument to pass to setProgram() - Q_ASSERT(programArguments.count() >= 1); - setProgram(program.toLatin1(),programArguments.mid(1)); - - addEnvironmentVariables(environment); - - if ( !dbusService.isEmpty() ) - setEnv("KONSOLE_DBUS_SERVICE",dbusService); - if ( !dbusSession.isEmpty() ) - setEnv("KONSOLE_DBUS_SESSION", dbusSession); - - setEnv("WINDOWID", QString::number(winid)); - - // unless the LANGUAGE environment variable has been set explicitly - // set it to a null string - // this fixes the problem where KCatalog sets the LANGUAGE environment - // variable during the application's startup to something which - // differs from LANG,LC_* etc. and causes programs run from - // the terminal to display messages in the wrong language - // - // this can happen if LANG contains a language which KDE - // does not have a translation for - // - // BR:149300 - setEnv("LANGUAGE",QString(),false /* do not overwrite existing value if any */); - - setUseUtmp(addToUtmp); - - struct ::termios ttmode; - pty()->tcGetAttr(&ttmode); - if (!_xonXoff) - ttmode.c_iflag &= ~(IXOFF | IXON); - else - ttmode.c_iflag |= (IXOFF | IXON); -#ifdef IUTF8 // XXX not a reasonable place to check it. - if (!_utf8) - ttmode.c_iflag &= ~IUTF8; - else - ttmode.c_iflag |= IUTF8; -#endif - - if (_eraseChar != 0) - ttmode.c_cc[VERASE] = _eraseChar; - - //if (!pty()->tcSetAttr(&ttmode)) - // kWarning() << "Unable to set terminal attributes."; - - pty()->setWinSize(_windowLines, _windowColumns); - - KProcess::start(); - - if (!waitForStarted()) - return -1; - - return 0; -} - -void Pty::setWriteable(bool writeable) -{ - //KDE_struct_stat sbuf; - struct stat sbuf; - //KDE_stat(pty()->ttyName(), &sbuf); - ::stat(pty()->ttyName(), &sbuf); - if (writeable) - chmod(pty()->ttyName(), sbuf.st_mode | S_IWGRP); - else - chmod(pty()->ttyName(), sbuf.st_mode & ~(S_IWGRP|S_IWOTH)); -} - -Pty::Pty(int masterFd, QObject* parent) - : KPtyProcess(masterFd,parent) -{ - init(); -} -Pty::Pty(QObject* parent) - : KPtyProcess(parent) -{ - init(); -} -void Pty::init() -{ - _windowColumns = 0; - _windowLines = 0; - _eraseChar = 0; - _xonXoff = true; - _utf8 =true; - - connect(pty(), SIGNAL(readyRead()) , this , SLOT(dataReceived())); - setPtyChannels(KPtyProcess::AllChannels); -} - -Pty::~Pty() -{ -} - -void Pty::sendData(const char* data, int length) -{ - if (!length) - return; - - if (!pty()->write(data,length)) - { - //kWarning() << "Pty::doSendJobs - Could not send input data to terminal process."; - return; - } -} - -void Pty::dataReceived() -{ - QByteArray data = pty()->readAll(); - emit receivedData(data.constData(),data.count()); -} - -void Pty::lockPty(bool lock) -{ - Q_UNUSED(lock); - -// TODO: Support for locking the Pty - //if (lock) - //suspend(); - //else - //resume(); -} - -int Pty::foregroundProcessGroup() const -{ - int pid = tcgetpgrp(pty()->masterFd()); - - if ( pid != -1 ) - { - return pid; - } - - return 0; -} - -void Pty::setupChildProcess() -{ - KPtyProcess::setupChildProcess(); - - // reset all signal handlers - // this ensures that terminal applications respond to - // signals generated via key sequences such as Ctrl+C - // (which sends SIGINT) - struct sigaction action; - sigemptyset(&action.sa_mask); - action.sa_handler = SIG_DFL; - action.sa_flags = 0; - for (int signal=1;signal < NSIG; signal++) - sigaction(signal,&action,0L); -}
deleted file mode 100644 --- a/gui/src/Pty.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - This file is part of Konsole, KDE's terminal emulator. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 PTY_H -#define PTY_H - -// Qt -#include <QtCore/QStringList> -#include <QtCore/QVector> -#include <QtCore/QList> -#include <QtCore/QSize> - -// KDE -#include "kprocess.h" -#include "kptyprocess.h" - -/** - * The Pty class is used to start the terminal process, - * send data to it, receive data from it and manipulate - * various properties of the pseudo-teletype interface - * used to communicate with the process. - * - * To use this class, construct an instance and connect - * to the sendData slot and receivedData signal to - * send data to or receive data from the process. - * - * To start the terminal process, call the start() method - * with the program name and appropriate arguments. - */ -//class KONSOLEPRIVATE_EXPORT Pty: public KPtyProcess -class Pty: public KPtyProcess -{ -Q_OBJECT - - public: - - /** - * Constructs a new Pty. - * - * Connect to the sendData() slot and receivedData() signal to prepare - * for sending and receiving data from the terminal process. - * - * To start the terminal process, call the run() method with the - * name of the program to start and appropriate arguments. - */ - explicit Pty(QObject* parent = 0); - - /** - * Construct a process using an open pty master. - * See KPtyProcess::KPtyProcess() - */ - explicit Pty(int ptyMasterFd, QObject* parent = 0); - - ~Pty(); - - /** - * Starts the terminal process. - * - * Returns 0 if the process was started successfully or non-zero - * otherwise. - * - * @param program Path to the program to start - * @param arguments Arguments to pass to the program being started - * @param environment A list of key=value pairs which will be added - * to the environment for the new process. At the very least this - * should include an assignment for the TERM environment variable. - * @param winid Specifies the value of the WINDOWID environment variable - * in the process's environment. - * @param addToUtmp Specifies whether a utmp entry should be created for - * the pty used. See K3Process::setUsePty() - * @param dbusService Specifies the value of the KONSOLE_DBUS_SERVICE - * environment variable in the process's environment. - * @param dbusSession Specifies the value of the KONSOLE_DBUS_SESSION - * environment variable in the process's environment. - */ - int start( const QString& program, - const QStringList& arguments, - const QStringList& environment, - ulong winid, - bool addToUtmp, - const QString& dbusService, - const QString& dbusSession - ); - - /** TODO: Document me */ - void setWriteable(bool writeable); - - /** - * Enables or disables Xon/Xoff flow control. The flow control setting - * may be changed later by a terminal application, so flowControlEnabled() - * may not equal the value of @p on in the previous call to setFlowControlEnabled() - */ - void setFlowControlEnabled(bool on); - - /** Queries the terminal state and returns true if Xon/Xoff flow control is enabled. */ - bool flowControlEnabled() const; - - /** - * Sets the size of the window (in lines and columns of characters) - * used by this teletype. - */ - void setWindowSize(int lines, int cols); - - /** Returns the size of the window used by this teletype. See setWindowSize() */ - QSize windowSize() const; - - /** TODO Document me */ - void setErase(char erase); - - /** */ - char erase() const; - - /** - * Returns the process id of the teletype's current foreground - * process. This is the process which is currently reading - * input sent to the terminal via. sendData() - * - * If there is a problem reading the foreground process group, - * 0 will be returned. - */ - int foregroundProcessGroup() const; - - public slots: - - /** - * Put the pty into UTF-8 mode on systems which support it. - */ - void setUtf8Mode(bool on); - - /** - * Suspend or resume processing of data from the standard - * output of the terminal process. - * - * See K3Process::suspend() and K3Process::resume() - * - * @param lock If true, processing of output is suspended, - * otherwise processing is resumed. - */ - void lockPty(bool lock); - - /** - * Sends data to the process currently controlling the - * teletype ( whose id is returned by foregroundProcessGroup() ) - * - * @param buffer Pointer to the data to send. - * @param length Length of @p buffer. - */ - void sendData(const char* buffer, int length); - - signals: - - /** - * Emitted when a new block of data is received from - * the teletype. - * - * @param buffer Pointer to the data received. - * @param length Length of @p buffer - */ - void receivedData(const char* buffer, int length); - - protected: - void setupChildProcess(); - - private slots: - // called when data is received from the terminal process - void dataReceived(); - - private: - void init(); - - // takes a list of key=value pairs and adds them - // to the environment for the process - void addEnvironmentVariables(const QStringList& environment); - - int _windowColumns; - int _windowLines; - char _eraseChar; - bool _xonXoff; - bool _utf8; -}; - -#endif // PTY_H
deleted file mode 100644 --- a/gui/src/QTerminalWidget.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* Copyright (C) 2008 e_k (e_k@users.sourceforge.net) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include "QTerminalWidget.h" -#include "Session.h" -#include "TerminalDisplay.h" - -struct TermWidgetImpl -{ - TermWidgetImpl(QWidget* parent = 0); - - TerminalDisplay *m_terminalDisplay; - Session *m_session; - Session* createSession(); - TerminalDisplay* createTerminalDisplay(Session *session, QWidget* parent); -}; - -TermWidgetImpl::TermWidgetImpl(QWidget* parent) -{ - QPalette palette = QApplication::palette(); - m_session = createSession(); - m_terminalDisplay = createTerminalDisplay(this->m_session, parent); - m_terminalDisplay->setBackgroundColor(palette.color(QPalette::Base)); - m_terminalDisplay->setForegroundColor(palette.color(QPalette::Text)); -} - -Session *TermWidgetImpl::createSession() -{ - Session *session = new Session(); - session->setTitle(Session::NameRole, "QTerminalWidget"); - session->setProgram("/bin/bash"); - session->setArguments(QStringList()); - session->setAutoClose(true); - session->setCodec(QTextCodec::codecForName("UTF-8")); - session->setFlowControlEnabled(true); - session->setHistoryType(HistoryTypeBuffer(1000)); - session->setDarkBackground(true); - session->setKeyBindings(""); - return session; -} - -TerminalDisplay *TermWidgetImpl::createTerminalDisplay(Session *session, QWidget* parent) -{ - TerminalDisplay* display = new TerminalDisplay(parent); - display->setBellMode(TerminalDisplay::NotifyBell); - display->setTerminalSizeHint(true); - display->setTripleClickMode(TerminalDisplay::SelectWholeLine); - display->setTerminalSizeStartup(true); - display->setRandomSeed(session->sessionId() * 31); - return display; -} - -QTerminalWidget::QTerminalWidget(int startnow, QWidget *parent) - :QWidget(parent) -{ - m_impl = new TermWidgetImpl(this); - - initialize(); - - if(startnow && m_impl->m_session) { - m_impl->m_session->run(); - } - - setFocus(Qt::OtherFocusReason); - m_impl->m_terminalDisplay->resize(this->size()); - setFocusProxy(m_impl->m_terminalDisplay); -} - -void QTerminalWidget::startShellProgram() -{ - if(m_impl->m_session->isRunning()) - return; - - m_impl->m_session->run(); -} - -void QTerminalWidget::initialize() -{ - m_impl->m_terminalDisplay->setSize(80, 40); - - QFont font = QApplication::font(); - font.setFamily("Monospace"); - font.setPointSize(10); - font.setStyleHint(QFont::TypeWriter); - setTerminalFont(font); - setScrollBarPosition(NoScrollBar); - - m_impl->m_session->addView(m_impl->m_terminalDisplay); - - connect(m_impl->m_session, SIGNAL(finished()), this, SLOT(sessionFinished())); -} - -QTerminalWidget::~QTerminalWidget() -{ - emit destroyed(); -} - -void QTerminalWidget::setTerminalFont(QFont &font) -{ - if (!m_impl->m_terminalDisplay) - return; - m_impl->m_terminalDisplay->setVTFont(font); -} - -void QTerminalWidget::setShellProgram(QString progname) -{ - if (!m_impl->m_session) - return; - m_impl->m_session->setProgram(progname); -} - -void QTerminalWidget::openTeletype(int fd) -{ - if ( m_impl->m_session->isRunning() ) - return; - - m_impl->m_session->openTeletype(fd); -} - -void QTerminalWidget::setArgs(QStringList &args) -{ - if (!m_impl->m_session) - return; - m_impl->m_session->setArguments(args); -} - -void QTerminalWidget::setTextCodec(QTextCodec *codec) -{ - if (!m_impl->m_session) - return; - m_impl->m_session->setCodec(codec); -} - -void QTerminalWidget::setSize(int h, int v) -{ - if (!m_impl->m_terminalDisplay) - return; - m_impl->m_terminalDisplay->setSize(h, v); -} - -void QTerminalWidget::setHistorySize(int lines) -{ - if (lines < 0) - m_impl->m_session->setHistoryType(HistoryTypeFile()); - else - m_impl->m_session->setHistoryType(HistoryTypeBuffer(lines)); -} - -void QTerminalWidget::setScrollBarPosition(ScrollBarPosition pos) -{ - if (!m_impl->m_terminalDisplay) - return; - m_impl->m_terminalDisplay->setScrollBarPosition((TerminalDisplay::ScrollBarPosition)pos); -} - -void QTerminalWidget::sendText(const QString &text) -{ - m_impl->m_session->sendText(text); -} - -void QTerminalWidget::installEventFilterOnDisplay(QObject *object) { - m_impl->m_terminalDisplay->installEventFilter(object); -} - -void QTerminalWidget::resizeEvent(QResizeEvent*) -{ - m_impl->m_terminalDisplay->resize(this->size()); - m_impl->m_terminalDisplay->update(); -} - -void QTerminalWidget::sessionFinished() -{ - emit finished(); -} - -
deleted file mode 100644 --- a/gui/src/QTerminalWidget.h +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2008 e_k (e_k@users.sourceforge.net) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef QTERMINALWIDGET_H -#define QTERMINALWIDGET_H - -#include <QtGui> - -struct TermWidgetImpl; -/** - * \class QTerminalWidget - * This class forms a widget class that can be inserted into other widgets. - */ -class QTerminalWidget : public QWidget -{ - Q_OBJECT -public: - /** - * \enum ScrollBarPosition - * Defines the scrollbar position of the terminal. - */ - enum ScrollBarPosition - { - NoScrollBar, - ScrollBarLeft, - ScrollBarRight - }; - - QTerminalWidget(int startnow = 1, QWidget *parent = 0); - ~QTerminalWidget(); - - void startShellProgram(); - void openTeletype(int fd); - - /** Default is application font with family Monospace, size 10. */ - void setTerminalFont(QFont &font); - - /** Shell program, default is /bin/bash. */ - void setShellProgram(QString progname); - - /** Shell program args, default is none. */ - void setArgs(QStringList &args); - - /** Text codec, default is UTF-8. */ - void setTextCodec(QTextCodec *codec); - - /** Resize terminal widget. */ - void setSize(int h, int v); - - /** History size for scrolling, values below zero mean infinite. */ - void setHistorySize(int lines); - - /** Presence of scrollbar. By default, there is no scrollbar present. */ - void setScrollBarPosition(ScrollBarPosition); - - /** Send some text to the terminal. */ - void sendText(const QString &text); - - /** Installs an event filter onto the display. */ - void installEventFilterOnDisplay(QObject *object); - -signals: - /** Emitted, when the current program has finished. */ - void finished(); - -protected: - virtual void resizeEvent(QResizeEvent *); - -protected slots: - void sessionFinished(); - -private: - /** Performs initial operations on this widget. */ - void initialize(); - TermWidgetImpl *m_impl; -}; - -#endif // QTERMINALWIDGET_H
deleted file mode 100644 --- a/gui/src/Quint.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* Quint - A graphical user interface for Octave - * Copyright (C) 2011 Jacob Dawid - * jacob.dawid@googlemail.com - * - * This program 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 3 of the License, or - * (at your option) any later version. - * - * This program 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, see <http://www.gnu.org/licenses/>. - */ - -#include <QtGui/QApplication> -#include <QTranslator> -#include <QSettings> -#include "MainWindow.h" - -int main(int argc, char *argv[]) -{ - QApplication application(argc, argv); - - QDesktopServices desktopServices; - QSettings settings( - desktopServices.storageLocation(QDesktopServices::HomeLocation) - + "/.quint/settings.ini", QSettings::IniFormat); - - QTranslator translator; - translator.load(QString("../languages/%1.qm").arg(settings.value("application/language").toString())); - application.installTranslator(&translator); - - MainWindow w; - w.show(); - - return application.exec(); -}
deleted file mode 100644 --- a/gui/src/Screen.cpp +++ /dev/null @@ -1,1356 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2007-2008 by Robert Knight <robert.knight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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. - */ - -// Own -#include "Screen.h" - -// Standard -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <assert.h> -#include <string.h> -#include <ctype.h> - -// Qt -#include <QtCore/QTextStream> -#include <QtCore/QDate> - - -// Konsole -#include "konsole_wcwidth.h" -#include "TerminalCharacterDecoder.h" - -//FIXME: this is emulation specific. Use false for xterm, true for ANSI. -//FIXME: see if we can get this from terminfo. -#define BS_CLEARS false - -//Macro to convert x,y position on screen to position within an image. -// -//Originally the image was stored as one large contiguous block of -//memory, so a position within the image could be represented as an -//offset from the beginning of the block. For efficiency reasons this -//is no longer the case. -//Many internal parts of this class still use this representation for parameters and so on, -//notably moveImage() and clearImage(). -//This macro converts from an X,Y position into an image offset. -#ifndef loc -#define loc(X,Y) ((Y)*columns+(X)) -#endif - - -Character Screen::defaultChar = Character(' ', - CharacterColor(COLOR_SPACE_DEFAULT,DEFAULT_FORE_COLOR), - CharacterColor(COLOR_SPACE_DEFAULT,DEFAULT_BACK_COLOR), - DEFAULT_RENDITION); - -//#define REVERSE_WRAPPED_LINES // for wrapped line debug - - Screen::Screen(int l, int c) -: lines(l), - columns(c), - screenLines(new ImageLine[lines+1] ), - _scrolledLines(0), - _droppedLines(0), - history(new HistoryScrollNone()), - cuX(0), cuY(0), - currentRendition(0), - _topMargin(0), _bottomMargin(0), - selBegin(0), selTopLeft(0), selBottomRight(0), - blockSelectionMode(false), - effectiveForeground(CharacterColor()), effectiveBackground(CharacterColor()), effectiveRendition(0), - lastPos(-1) -{ - lineProperties.resize(lines+1); - for (int i=0;i<lines+1;i++) - lineProperties[i]=LINE_DEFAULT; - - initTabStops(); - clearSelection(); - reset(); -} - -/*! Destructor -*/ - -Screen::~Screen() -{ - delete[] screenLines; - delete history; -} - -void Screen::cursorUp(int n) - //=CUU -{ - if (n == 0) n = 1; // Default - int stop = cuY < _topMargin ? 0 : _topMargin; - cuX = qMin(columns-1,cuX); // nowrap! - cuY = qMax(stop,cuY-n); -} - -void Screen::cursorDown(int n) - //=CUD -{ - if (n == 0) n = 1; // Default - int stop = cuY > _bottomMargin ? lines-1 : _bottomMargin; - cuX = qMin(columns-1,cuX); // nowrap! - cuY = qMin(stop,cuY+n); -} - -void Screen::cursorLeft(int n) - //=CUB -{ - if (n == 0) n = 1; // Default - cuX = qMin(columns-1,cuX); // nowrap! - cuX = qMax(0,cuX-n); -} - -void Screen::cursorRight(int n) - //=CUF -{ - if (n == 0) n = 1; // Default - cuX = qMin(columns-1,cuX+n); -} - -void Screen::setMargins(int top, int bot) - //=STBM -{ - if (top == 0) top = 1; // Default - if (bot == 0) bot = lines; // Default - top = top - 1; // Adjust to internal lineno - bot = bot - 1; // Adjust to internal lineno - if ( !( 0 <= top && top < bot && bot < lines ) ) - { //Debug()<<" setRegion("<<top<<","<<bot<<") : bad range."; - return; // Default error action: ignore - } - _topMargin = top; - _bottomMargin = bot; - cuX = 0; - cuY = getMode(MODE_Origin) ? top : 0; - -} - -int Screen::topMargin() const -{ - return _topMargin; -} -int Screen::bottomMargin() const -{ - return _bottomMargin; -} - -void Screen::index() - //=IND -{ - if (cuY == _bottomMargin) - scrollUp(1); - else if (cuY < lines-1) - cuY += 1; -} - -void Screen::reverseIndex() - //=RI -{ - if (cuY == _topMargin) - scrollDown(_topMargin,1); - else if (cuY > 0) - cuY -= 1; -} - -void Screen::nextLine() - //=NEL -{ - toStartOfLine(); index(); -} - -void Screen::eraseChars(int n) -{ - if (n == 0) n = 1; // Default - int p = qMax(0,qMin(cuX+n-1,columns-1)); - clearImage(loc(cuX,cuY),loc(p,cuY),' '); -} - -void Screen::deleteChars(int n) -{ - Q_ASSERT( n >= 0 ); - - // always delete at least one char - if (n == 0) - n = 1; - - // if cursor is beyond the end of the line there is nothing to do - if ( cuX >= screenLines[cuY].count() ) - return; - - if ( cuX+n > screenLines[cuY].count() ) - n = screenLines[cuY].count() - cuX; - - Q_ASSERT( n >= 0 ); - Q_ASSERT( cuX+n <= screenLines[cuY].count() ); - - screenLines[cuY].remove(cuX,n); -} - -void Screen::insertChars(int n) -{ - if (n == 0) n = 1; // Default - - if ( screenLines[cuY].size() < cuX ) - screenLines[cuY].resize(cuX); - - screenLines[cuY].insert(cuX,n,' '); - - if ( screenLines[cuY].count() > columns ) - screenLines[cuY].resize(columns); -} - -void Screen::deleteLines(int n) -{ - if (n == 0) n = 1; // Default - scrollUp(cuY,n); -} - -void Screen::insertLines(int n) -{ - if (n == 0) n = 1; // Default - scrollDown(cuY,n); -} - -void Screen::setMode(int m) -{ - currentModes[m] = true; - switch(m) - { - case MODE_Origin : cuX = 0; cuY = _topMargin; break; //FIXME: home - } -} - -void Screen::resetMode(int m) -{ - currentModes[m] = false; - switch(m) - { - case MODE_Origin : cuX = 0; cuY = 0; break; //FIXME: home - } -} - -void Screen::saveMode(int m) -{ - savedModes[m] = currentModes[m]; -} - -void Screen::restoreMode(int m) -{ - currentModes[m] = savedModes[m]; -} - -bool Screen::getMode(int m) const -{ - return currentModes[m]; -} - -void Screen::saveCursor() -{ - savedState.cursorColumn = cuX; - savedState.cursorLine = cuY; - savedState.rendition = currentRendition; - savedState.foreground = currentForeground; - savedState.background = currentBackground; -} - -void Screen::restoreCursor() -{ - cuX = qMin(savedState.cursorColumn,columns-1); - cuY = qMin(savedState.cursorLine,lines-1); - currentRendition = savedState.rendition; - currentForeground = savedState.foreground; - currentBackground = savedState.background; - updateEffectiveRendition(); -} - -void Screen::resizeImage(int new_lines, int new_columns) -{ - if ((new_lines==lines) && (new_columns==columns)) return; - - if (cuY > new_lines-1) - { // attempt to preserve focus and lines - _bottomMargin = lines-1; //FIXME: margin lost - for (int i = 0; i < cuY-(new_lines-1); i++) - { - addHistLine(); scrollUp(0,1); - } - } - - // create new screen lines and copy from old to new - - ImageLine* newScreenLines = new ImageLine[new_lines+1]; - for (int i=0; i < qMin(lines-1,new_lines+1) ;i++) - newScreenLines[i]=screenLines[i]; - for (int i=lines;(i > 0) && (i<new_lines+1);i++) - newScreenLines[i].resize( new_columns ); - - lineProperties.resize(new_lines+1); - for (int i=lines;(i > 0) && (i<new_lines+1);i++) - lineProperties[i] = LINE_DEFAULT; - - clearSelection(); - - delete[] screenLines; - screenLines = newScreenLines; - - lines = new_lines; - columns = new_columns; - cuX = qMin(cuX,columns-1); - cuY = qMin(cuY,lines-1); - - // FIXME: try to keep values, evtl. - _topMargin=0; - _bottomMargin=lines-1; - initTabStops(); - clearSelection(); -} - -void Screen::setDefaultMargins() -{ - _topMargin = 0; - _bottomMargin = lines-1; -} - - -/* - Clarifying rendition here and in the display. - - currently, the display's color table is - 0 1 2 .. 9 10 .. 17 - dft_fg, dft_bg, dim 0..7, intensive 0..7 - - currentForeground, currentBackground contain values 0..8; - - 0 = default color - - 1..8 = ansi specified color - - re_fg, re_bg contain values 0..17 - due to the TerminalDisplay's color table - - rendition attributes are - - attr widget screen - -------------- ------ ------ - RE_UNDERLINE XX XX affects foreground only - RE_BLINK XX XX affects foreground only - RE_BOLD XX XX affects foreground only - RE_REVERSE -- XX - RE_TRANSPARENT XX -- affects background only - RE_INTENSIVE XX -- affects foreground only - - Note that RE_BOLD is used in both widget - and screen rendition. Since xterm/vt102 - is to poor to distinguish between bold - (which is a font attribute) and intensive - (which is a color attribute), we translate - this and RE_BOLD in falls eventually appart - into RE_BOLD and RE_INTENSIVE. - */ - -void Screen::reverseRendition(Character& p) const -{ - CharacterColor f = p.foregroundColor; - CharacterColor b = p.backgroundColor; - - p.foregroundColor = b; - p.backgroundColor = f; //p->r &= ~RE_TRANSPARENT; -} - -void Screen::updateEffectiveRendition() -{ - effectiveRendition = currentRendition; - if (currentRendition & RE_REVERSE) - { - effectiveForeground = currentBackground; - effectiveBackground = currentForeground; - } - else - { - effectiveForeground = currentForeground; - effectiveBackground = currentBackground; - } - - if (currentRendition & RE_BOLD) - effectiveForeground.toggleIntensive(); -} - -void Screen::copyFromHistory(Character* dest, int startLine, int count) const -{ - Q_ASSERT( startLine >= 0 && count > 0 && startLine + count <= history->getLines() ); - - for (int line = startLine; line < startLine + count; line++) - { - const int length = qMin(columns,history->getLineLen(line)); - const int destLineOffset = (line-startLine)*columns; - - history->getCells(line,0,length,dest + destLineOffset); - - for (int column = length; column < columns; column++) - dest[destLineOffset+column] = defaultChar; - - // invert selected text - if (selBegin !=-1) - { - for (int column = 0; column < columns; column++) - { - if (isSelected(column,line)) - { - reverseRendition(dest[destLineOffset + column]); - } - } - } - } -} - -void Screen::copyFromScreen(Character* dest , int startLine , int count) const -{ - Q_ASSERT( startLine >= 0 && count > 0 && startLine + count <= lines ); - - for (int line = startLine; line < (startLine+count) ; line++) - { - int srcLineStartIndex = line*columns; - int destLineStartIndex = (line-startLine)*columns; - - for (int column = 0; column < columns; column++) - { - int srcIndex = srcLineStartIndex + column; - int destIndex = destLineStartIndex + column; - - dest[destIndex] = screenLines[srcIndex/columns].value(srcIndex%columns,defaultChar); - - // invert selected text - if (selBegin != -1 && isSelected(column,line + history->getLines())) - reverseRendition(dest[destIndex]); - } - - } -} - -void Screen::getImage( Character* dest, int size, int startLine, int endLine ) const -{ - Q_ASSERT( startLine >= 0 ); - Q_ASSERT( endLine >= startLine && endLine < history->getLines() + lines ); - - const int mergedLines = endLine - startLine + 1; - - Q_ASSERT( size >= mergedLines * columns ); - Q_UNUSED( size ); - - const int linesInHistoryBuffer = qBound(0,history->getLines()-startLine,mergedLines); - const int linesInScreenBuffer = mergedLines - linesInHistoryBuffer; - - // copy lines from history buffer - if (linesInHistoryBuffer > 0) - copyFromHistory(dest,startLine,linesInHistoryBuffer); - - // copy lines from screen buffer - if (linesInScreenBuffer > 0) - copyFromScreen(dest + linesInHistoryBuffer*columns, - startLine + linesInHistoryBuffer - history->getLines(), - linesInScreenBuffer); - - // invert display when in screen mode - if (getMode(MODE_Screen)) - { - for (int i = 0; i < mergedLines*columns; i++) - reverseRendition(dest[i]); // for reverse display - } - - // mark the character at the current cursor position - int cursorIndex = loc(cuX, cuY + linesInHistoryBuffer); - if(getMode(MODE_Cursor) && cursorIndex < columns*mergedLines) - dest[cursorIndex].rendition |= RE_CURSOR; -} - -QVector<LineProperty> Screen::getLineProperties( int startLine , int endLine ) const -{ - Q_ASSERT( startLine >= 0 ); - Q_ASSERT( endLine >= startLine && endLine < history->getLines() + lines ); - - const int mergedLines = endLine-startLine+1; - const int linesInHistory = qBound(0,history->getLines()-startLine,mergedLines); - const int linesInScreen = mergedLines - linesInHistory; - - QVector<LineProperty> result(mergedLines); - int index = 0; - - // copy properties for lines in history - for (int line = startLine; line < startLine + linesInHistory; line++) - { - //TODO Support for line properties other than wrapped lines - if (history->isWrappedLine(line)) - { - result[index] = (LineProperty)(result[index] | LINE_WRAPPED); - } - index++; - } - - // copy properties for lines in screen buffer - const int firstScreenLine = startLine + linesInHistory - history->getLines(); - for (int line = firstScreenLine; line < firstScreenLine+linesInScreen; line++) - { - result[index]=lineProperties[line]; - index++; - } - - return result; -} - -void Screen::reset(bool clearScreen) -{ - setMode(MODE_Wrap ); saveMode(MODE_Wrap ); // wrap at end of margin - resetMode(MODE_Origin); saveMode(MODE_Origin); // position refere to [1,1] - resetMode(MODE_Insert); saveMode(MODE_Insert); // overstroke - setMode(MODE_Cursor); // cursor visible - resetMode(MODE_Screen); // screen not inverse - resetMode(MODE_NewLine); - - _topMargin=0; - _bottomMargin=lines-1; - - setDefaultRendition(); - saveCursor(); - - if ( clearScreen ) - clear(); -} - -void Screen::clear() -{ - clearEntireScreen(); - home(); -} - -void Screen::backspace() -{ - cuX = qMin(columns-1,cuX); // nowrap! - cuX = qMax(0,cuX-1); - - if (screenLines[cuY].size() < cuX+1) - screenLines[cuY].resize(cuX+1); - - if (BS_CLEARS) - screenLines[cuY][cuX].character = ' '; -} - -void Screen::tab(int n) -{ - // note that TAB is a format effector (does not write ' '); - if (n == 0) n = 1; - while((n > 0) && (cuX < columns-1)) - { - cursorRight(1); - while((cuX < columns-1) && !tabStops[cuX]) - cursorRight(1); - n--; - } -} - -void Screen::backtab(int n) -{ - // note that TAB is a format effector (does not write ' '); - if (n == 0) n = 1; - while((n > 0) && (cuX > 0)) - { - cursorLeft(1); while((cuX > 0) && !tabStops[cuX]) cursorLeft(1); - n--; - } -} - -void Screen::clearTabStops() -{ - for (int i = 0; i < columns; i++) tabStops[i] = false; -} - -void Screen::changeTabStop(bool set) -{ - if (cuX >= columns) return; - tabStops[cuX] = set; -} - -void Screen::initTabStops() -{ - tabStops.resize(columns); - - // Arrg! The 1st tabstop has to be one longer than the other. - // i.e. the kids start counting from 0 instead of 1. - // Other programs might behave correctly. Be aware. - for (int i = 0; i < columns; i++) - tabStops[i] = (i%8 == 0 && i != 0); -} - -void Screen::newLine() -{ - if (getMode(MODE_NewLine)) - toStartOfLine(); - index(); -} - -void Screen::checkSelection(int from, int to) -{ - if (selBegin == -1) - return; - int scr_TL = loc(0, history->getLines()); - //Clear entire selection if it overlaps region [from, to] - if ( (selBottomRight >= (from+scr_TL)) && (selTopLeft <= (to+scr_TL)) ) - clearSelection(); -} - -void Screen::displayCharacter(unsigned short c) -{ - // Note that VT100 does wrapping BEFORE putting the character. - // This has impact on the assumption of valid cursor positions. - // We indicate the fact that a newline has to be triggered by - // putting the cursor one right to the last column of the screen. - - int w = konsole_wcwidth(c); - if (w <= 0) - return; - - if (cuX+w > columns) { - if (getMode(MODE_Wrap)) { - lineProperties[cuY] = (LineProperty)(lineProperties[cuY] | LINE_WRAPPED); - nextLine(); - } - else - cuX = columns-w; - } - - // ensure current line vector has enough elements - int size = screenLines[cuY].size(); - if (size < cuX+w) - { - screenLines[cuY].resize(cuX+w); - } - - if (getMode(MODE_Insert)) insertChars(w); - - lastPos = loc(cuX,cuY); - - // check if selection is still valid. - checkSelection(lastPos, lastPos); - - Character& currentChar = screenLines[cuY][cuX]; - - currentChar.character = c; - currentChar.foregroundColor = effectiveForeground; - currentChar.backgroundColor = effectiveBackground; - currentChar.rendition = effectiveRendition; - - int i = 0; - int newCursorX = cuX + w--; - while(w) - { - i++; - - if ( screenLines[cuY].size() < cuX + i + 1 ) - screenLines[cuY].resize(cuX+i+1); - - Character& ch = screenLines[cuY][cuX + i]; - ch.character = 0; - ch.foregroundColor = effectiveForeground; - ch.backgroundColor = effectiveBackground; - ch.rendition = effectiveRendition; - - w--; - } - cuX = newCursorX; -} - -void Screen::compose(const QString& /*compose*/) -{ - Q_ASSERT( 0 /*Not implemented yet*/ ); - - /* if (lastPos == -1) - return; - - QChar c(image[lastPos].character); - compose.prepend(c); - //compose.compose(); ### FIXME! - image[lastPos].character = compose[0].unicode();*/ -} - -int Screen::scrolledLines() const -{ - return _scrolledLines; -} -int Screen::droppedLines() const -{ - return _droppedLines; -} -void Screen::resetDroppedLines() -{ - _droppedLines = 0; -} -void Screen::resetScrolledLines() -{ - _scrolledLines = 0; -} - -void Screen::scrollUp(int n) -{ - if (n == 0) n = 1; // Default - if (_topMargin == 0) addHistLine(); // history.history - scrollUp(_topMargin, n); -} - -QRect Screen::lastScrolledRegion() const -{ - return _lastScrolledRegion; -} - -void Screen::scrollUp(int from, int n) -{ - if (n <= 0 || from + n > _bottomMargin) return; - - _scrolledLines -= n; - _lastScrolledRegion = QRect(0,_topMargin,columns-1,(_bottomMargin-_topMargin)); - - //FIXME: make sure `topMargin', `bottomMargin', `from', `n' is in bounds. - moveImage(loc(0,from),loc(0,from+n),loc(columns-1,_bottomMargin)); - clearImage(loc(0,_bottomMargin-n+1),loc(columns-1,_bottomMargin),' '); -} - -void Screen::scrollDown(int n) -{ - if (n == 0) n = 1; // Default - scrollDown(_topMargin, n); -} - -void Screen::scrollDown(int from, int n) -{ - _scrolledLines += n; - - //FIXME: make sure `topMargin', `bottomMargin', `from', `n' is in bounds. - if (n <= 0) - return; - if (from > _bottomMargin) - return; - if (from + n > _bottomMargin) - n = _bottomMargin - from; - moveImage(loc(0,from+n),loc(0,from),loc(columns-1,_bottomMargin-n)); - clearImage(loc(0,from),loc(columns-1,from+n-1),' '); -} - -void Screen::setCursorYX(int y, int x) -{ - setCursorY(y); setCursorX(x); -} - -void Screen::setCursorX(int x) -{ - if (x == 0) x = 1; // Default - x -= 1; // Adjust - cuX = qMax(0,qMin(columns-1, x)); -} - -void Screen::setCursorY(int y) -{ - if (y == 0) y = 1; // Default - y -= 1; // Adjust - cuY = qMax(0,qMin(lines -1, y + (getMode(MODE_Origin) ? _topMargin : 0) )); -} - -void Screen::home() -{ - cuX = 0; - cuY = 0; -} - -void Screen::toStartOfLine() -{ - cuX = 0; -} - -int Screen::getCursorX() const -{ - return cuX; -} - -int Screen::getCursorY() const -{ - return cuY; -} - -void Screen::clearImage(int loca, int loce, char c) -{ - int scr_TL=loc(0,history->getLines()); - //FIXME: check positions - - //Clear entire selection if it overlaps region to be moved... - if ( (selBottomRight > (loca+scr_TL) )&&(selTopLeft < (loce+scr_TL)) ) - { - clearSelection(); - } - - int topLine = loca/columns; - int bottomLine = loce/columns; - - Character clearCh(c,currentForeground,currentBackground,DEFAULT_RENDITION); - - //if the character being used to clear the area is the same as the - //default character, the affected lines can simply be shrunk. - bool isDefaultCh = (clearCh == Character()); - - for (int y=topLine;y<=bottomLine;y++) - { - lineProperties[y] = 0; - - int endCol = ( y == bottomLine) ? loce%columns : columns-1; - int startCol = ( y == topLine ) ? loca%columns : 0; - - QVector<Character>& line = screenLines[y]; - - if ( isDefaultCh && endCol == columns-1 ) - { - line.resize(startCol); - } - else - { - if (line.size() < endCol + 1) - line.resize(endCol+1); - - Character* data = line.data(); - for (int i=startCol;i<=endCol;i++) - data[i]=clearCh; - } - } -} - -void Screen::moveImage(int dest, int sourceBegin, int sourceEnd) -{ - Q_ASSERT( sourceBegin <= sourceEnd ); - - int lines=(sourceEnd-sourceBegin)/columns; - - //move screen image and line properties: - //the source and destination areas of the image may overlap, - //so it matters that we do the copy in the right order - - //forwards if dest < sourceBegin or backwards otherwise. - //(search the web for 'memmove implementation' for details) - if (dest < sourceBegin) - { - for (int i=0;i<=lines;i++) - { - screenLines[ (dest/columns)+i ] = screenLines[ (sourceBegin/columns)+i ]; - lineProperties[(dest/columns)+i]=lineProperties[(sourceBegin/columns)+i]; - } - } - else - { - for (int i=lines;i>=0;i--) - { - screenLines[ (dest/columns)+i ] = screenLines[ (sourceBegin/columns)+i ]; - lineProperties[(dest/columns)+i]=lineProperties[(sourceBegin/columns)+i]; - } - } - - if (lastPos != -1) - { - int diff = dest - sourceBegin; // Scroll by this amount - lastPos += diff; - if ((lastPos < 0) || (lastPos >= (lines*columns))) - lastPos = -1; - } - - // Adjust selection to follow scroll. - if (selBegin != -1) - { - bool beginIsTL = (selBegin == selTopLeft); - int diff = dest - sourceBegin; // Scroll by this amount - int scr_TL=loc(0,history->getLines()); - int srca = sourceBegin+scr_TL; // Translate index from screen to global - int srce = sourceEnd+scr_TL; // Translate index from screen to global - int desta = srca+diff; - int deste = srce+diff; - - if ((selTopLeft >= srca) && (selTopLeft <= srce)) - selTopLeft += diff; - else if ((selTopLeft >= desta) && (selTopLeft <= deste)) - selBottomRight = -1; // Clear selection (see below) - - if ((selBottomRight >= srca) && (selBottomRight <= srce)) - selBottomRight += diff; - else if ((selBottomRight >= desta) && (selBottomRight <= deste)) - selBottomRight = -1; // Clear selection (see below) - - if (selBottomRight < 0) - { - clearSelection(); - } - else - { - if (selTopLeft < 0) - selTopLeft = 0; - } - - if (beginIsTL) - selBegin = selTopLeft; - else - selBegin = selBottomRight; - } -} - -void Screen::clearToEndOfScreen() -{ - clearImage(loc(cuX,cuY),loc(columns-1,lines-1),' '); -} - -void Screen::clearToBeginOfScreen() -{ - clearImage(loc(0,0),loc(cuX,cuY),' '); -} - -void Screen::clearEntireScreen() -{ - // Add entire screen to history - for (int i = 0; i < (lines-1); i++) - { - addHistLine(); scrollUp(0,1); - } - - clearImage(loc(0,0),loc(columns-1,lines-1),' '); -} - -/*! fill screen with 'E' - This is to aid screen alignment - */ - -void Screen::helpAlign() -{ - clearImage(loc(0,0),loc(columns-1,lines-1),'E'); -} - -void Screen::clearToEndOfLine() -{ - clearImage(loc(cuX,cuY),loc(columns-1,cuY),' '); -} - -void Screen::clearToBeginOfLine() -{ - clearImage(loc(0,cuY),loc(cuX,cuY),' '); -} - -void Screen::clearEntireLine() -{ - clearImage(loc(0,cuY),loc(columns-1,cuY),' '); -} - -void Screen::setRendition(int re) -{ - currentRendition |= re; - updateEffectiveRendition(); -} - -void Screen::resetRendition(int re) -{ - currentRendition &= ~re; - updateEffectiveRendition(); -} - -void Screen::setDefaultRendition() -{ - setForeColor(COLOR_SPACE_DEFAULT,DEFAULT_FORE_COLOR); - setBackColor(COLOR_SPACE_DEFAULT,DEFAULT_BACK_COLOR); - currentRendition = DEFAULT_RENDITION; - updateEffectiveRendition(); -} - -void Screen::setForeColor(int space, int color) -{ - currentForeground = CharacterColor(space, color); - - if ( currentForeground.isValid() ) - updateEffectiveRendition(); - else - setForeColor(COLOR_SPACE_DEFAULT,DEFAULT_FORE_COLOR); -} - -void Screen::setBackColor(int space, int color) -{ - currentBackground = CharacterColor(space, color); - - if ( currentBackground.isValid() ) - updateEffectiveRendition(); - else - setBackColor(COLOR_SPACE_DEFAULT,DEFAULT_BACK_COLOR); -} - -void Screen::clearSelection() -{ - selBottomRight = -1; - selTopLeft = -1; - selBegin = -1; -} - -void Screen::getSelectionStart(int& column , int& line) const -{ - if ( selTopLeft != -1 ) - { - column = selTopLeft % columns; - line = selTopLeft / columns; - } - else - { - column = cuX + getHistLines(); - line = cuY + getHistLines(); - } -} -void Screen::getSelectionEnd(int& column , int& line) const -{ - if ( selBottomRight != -1 ) - { - column = selBottomRight % columns; - line = selBottomRight / columns; - } - else - { - column = cuX + getHistLines(); - line = cuY + getHistLines(); - } -} -void Screen::setSelectionStart(const int x, const int y, const bool mode) -{ - selBegin = loc(x,y); - /* FIXME, HACK to correct for x too far to the right... */ - if (x == columns) selBegin--; - - selBottomRight = selBegin; - selTopLeft = selBegin; - blockSelectionMode = mode; -} - -void Screen::setSelectionEnd( const int x, const int y) -{ - if (selBegin == -1) - return; - - int endPos = loc(x,y); - - if (endPos < selBegin) - { - selTopLeft = endPos; - selBottomRight = selBegin; - } - else - { - /* FIXME, HACK to correct for x too far to the right... */ - if (x == columns) - endPos--; - - selTopLeft = selBegin; - selBottomRight = endPos; - } - - // Normalize the selection in column mode - if (blockSelectionMode) - { - int topRow = selTopLeft / columns; - int topColumn = selTopLeft % columns; - int bottomRow = selBottomRight / columns; - int bottomColumn = selBottomRight % columns; - - selTopLeft = loc(qMin(topColumn,bottomColumn),topRow); - selBottomRight = loc(qMax(topColumn,bottomColumn),bottomRow); - } -} - -bool Screen::isSelected( const int x,const int y) const -{ - bool columnInSelection = true; - if (blockSelectionMode) - { - columnInSelection = x >= (selTopLeft % columns) && - x <= (selBottomRight % columns); - } - - int pos = loc(x,y); - return pos >= selTopLeft && pos <= selBottomRight && columnInSelection; -} - -QString Screen::selectedText(bool preserveLineBreaks) const -{ - QString result; - QTextStream stream(&result, QIODevice::ReadWrite); - - PlainTextDecoder decoder; - decoder.begin(&stream); - writeSelectionToStream(&decoder , preserveLineBreaks); - decoder.end(); - - return result; -} - -bool Screen::isSelectionValid() const -{ - return selTopLeft >= 0 && selBottomRight >= 0; -} - -void Screen::writeSelectionToStream(TerminalCharacterDecoder* decoder , - bool preserveLineBreaks) const -{ - if (!isSelectionValid()) - return; - writeToStream(decoder,selTopLeft,selBottomRight,preserveLineBreaks); -} - -void Screen::writeToStream(TerminalCharacterDecoder* decoder, - int startIndex, int endIndex, - bool preserveLineBreaks) const -{ - int top = startIndex / columns; - int left = startIndex % columns; - - int bottom = endIndex / columns; - int right = endIndex % columns; - - Q_ASSERT( top >= 0 && left >= 0 && bottom >= 0 && right >= 0 ); - - for (int y=top;y<=bottom;y++) - { - int start = 0; - if ( y == top || blockSelectionMode ) start = left; - - int count = -1; - if ( y == bottom || blockSelectionMode ) count = right - start + 1; - - const bool appendNewLine = ( y != bottom ); - int copied = copyLineToStream( y, - start, - count, - decoder, - appendNewLine, - preserveLineBreaks ); - - // if the selection goes beyond the end of the last line then - // append a new line character. - // - // this makes it possible to 'select' a trailing new line character after - // the text on a line. - if ( y == bottom && - copied < count ) - { - Character newLineChar('\n'); - decoder->decodeLine(&newLineChar,1,0); - } - } -} - -int Screen::copyLineToStream(int line , - int start, - int count, - TerminalCharacterDecoder* decoder, - bool appendNewLine, - bool preserveLineBreaks) const -{ - //buffer to hold characters for decoding - //the buffer is static to avoid initialising every - //element on each call to copyLineToStream - //(which is unnecessary since all elements will be overwritten anyway) - static const int MAX_CHARS = 1024; - static Character characterBuffer[MAX_CHARS]; - - assert( count < MAX_CHARS ); - - LineProperty currentLineProperties = 0; - - //determine if the line is in the history buffer or the screen image - if (line < history->getLines()) - { - const int lineLength = history->getLineLen(line); - - // ensure that start position is before end of line - start = qMin(start,qMax(0,lineLength-1)); - - // retrieve line from history buffer. It is assumed - // that the history buffer does not store trailing white space - // at the end of the line, so it does not need to be trimmed here - if (count == -1) - { - count = lineLength-start; - } - else - { - count = qMin(start+count,lineLength)-start; - } - - // safety checks - assert( start >= 0 ); - assert( count >= 0 ); - assert( (start+count) <= history->getLineLen(line) ); - - history->getCells(line,start,count,characterBuffer); - - if ( history->isWrappedLine(line) ) - currentLineProperties |= LINE_WRAPPED; - } - else - { - if ( count == -1 ) - count = columns - start; - - assert( count >= 0 ); - - const int screenLine = line-history->getLines(); - - Character* data = screenLines[screenLine].data(); - int length = screenLines[screenLine].count(); - - //retrieve line from screen image - for (int i=start;i < qMin(start+count,length);i++) - { - characterBuffer[i-start] = data[i]; - } - - // count cannot be any greater than length - count = qBound(0,count,length-start); - - Q_ASSERT( screenLine < lineProperties.count() ); - currentLineProperties |= lineProperties[screenLine]; - } - - // add new line character at end - const bool omitLineBreak = (currentLineProperties & LINE_WRAPPED) || - !preserveLineBreaks; - - if ( !omitLineBreak && appendNewLine && (count+1 < MAX_CHARS) ) - { - characterBuffer[count] = '\n'; - count++; - } - - //decode line and write to text stream - decoder->decodeLine( (Character*) characterBuffer , - count, currentLineProperties ); - - return count; -} - -void Screen::writeLinesToStream(TerminalCharacterDecoder* decoder, int fromLine, int toLine) const -{ - writeToStream(decoder,loc(0,fromLine),loc(columns-1,toLine)); -} - -void Screen::addHistLine() -{ - // add line to history buffer - // we have to take care about scrolling, too... - - if (hasScroll()) - { - int oldHistLines = history->getLines(); - - history->addCellsVector(screenLines[0]); - history->addLine( lineProperties[0] & LINE_WRAPPED ); - - int newHistLines = history->getLines(); - - bool beginIsTL = (selBegin == selTopLeft); - - // If the history is full, increment the count - // of dropped lines - if ( newHistLines == oldHistLines ) - _droppedLines++; - - // Adjust selection for the new point of reference - if (newHistLines > oldHistLines) - { - if (selBegin != -1) - { - selTopLeft += columns; - selBottomRight += columns; - } - } - - if (selBegin != -1) - { - // Scroll selection in history up - int top_BR = loc(0, 1+newHistLines); - - if (selTopLeft < top_BR) - selTopLeft -= columns; - - if (selBottomRight < top_BR) - selBottomRight -= columns; - - if (selBottomRight < 0) - clearSelection(); - else - { - if (selTopLeft < 0) - selTopLeft = 0; - } - - if (beginIsTL) - selBegin = selTopLeft; - else - selBegin = selBottomRight; - } - } - -} - -int Screen::getHistLines() const -{ - return history->getLines(); -} - -void Screen::setScroll(const HistoryType& t , bool copyPreviousScroll) -{ - clearSelection(); - - if ( copyPreviousScroll ) - history = t.scroll(history); - else - { - HistoryScroll* oldScroll = history; - history = t.scroll(0); - delete oldScroll; - } -} - -bool Screen::hasScroll() const -{ - return history->hasScroll(); -} - -const HistoryType& Screen::getScroll() const -{ - return history->getType(); -} - -void Screen::setLineProperty(LineProperty property , bool enable) -{ - if ( enable ) - lineProperties[cuY] = (LineProperty)(lineProperties[cuY] | property); - else - lineProperties[cuY] = (LineProperty)(lineProperties[cuY] & ~property); -} -void Screen::fillWithDefaultChar(Character* dest, int count) -{ - for (int i=0;i<count;i++) - dest[i] = defaultChar; -}
deleted file mode 100644 --- a/gui/src/Screen.h +++ /dev/null @@ -1,670 +0,0 @@ -/* - This file is part of Konsole, KDE's terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 SCREEN_H -#define SCREEN_H - -// Qt -#include <QtCore/QRect> -#include <QtCore/QTextStream> -#include <QtCore/QVarLengthArray> - -// Konsole -#include "Character.h" -#include "History.h" - -#define MODE_Origin 0 -#define MODE_Wrap 1 -#define MODE_Insert 2 -#define MODE_Screen 3 -#define MODE_Cursor 4 -#define MODE_NewLine 5 -#define MODES_SCREEN 6 - -class TerminalCharacterDecoder; - -/** - \brief An image of characters with associated attributes. - - The terminal emulation ( Emulation ) receives a serial stream of - characters from the program currently running in the terminal. - From this stream it creates an image of characters which is ultimately - rendered by the display widget ( TerminalDisplay ). Some types of emulation - may have more than one screen image. - - getImage() is used to retrieve the currently visible image - which is then used by the display widget to draw the output from the - terminal. - - The number of lines of output history which are kept in addition to the current - screen image depends on the history scroll being used to store the output. - The scroll is specified using setScroll() - The output history can be retrieved using writeToStream() - - The screen image has a selection associated with it, specified using - setSelectionStart() and setSelectionEnd(). The selected text can be retrieved - using selectedText(). When getImage() is used to retrieve the visible image, - characters which are part of the selection have their colours inverted. -*/ -class Screen -{ -public: - /** Construct a new screen image of size @p lines by @p columns. */ - Screen(int lines, int columns); - ~Screen(); - - // VT100/2 Operations - // Cursor Movement - - /** - * Move the cursor up by @p n lines. The cursor will stop at the - * top margin. - */ - void cursorUp(int n); - /** - * Move the cursor down by @p n lines. The cursor will stop at the - * bottom margin. - */ - void cursorDown(int n); - /** - * Move the cursor to the left by @p n columns. - * The cursor will stop at the first column. - */ - void cursorLeft(int n); - /** - * Move the cursor to the right by @p n columns. - * The cursor will stop at the right-most column. - */ - void cursorRight(int n); - /** Position the cursor on line @p y. */ - void setCursorY(int y); - /** Position the cursor at column @p x. */ - void setCursorX(int x); - /** Position the cursor at line @p y, column @p x. */ - void setCursorYX(int y, int x); - /** - * Sets the margins for scrolling the screen. - * - * @param topLine The top line of the new scrolling margin. - * @param bottomLine The bottom line of the new scrolling margin. - */ - void setMargins(int topLine , int bottomLine); - /** Returns the top line of the scrolling region. */ - int topMargin() const; - /** Returns the bottom line of the scrolling region. */ - int bottomMargin() const; - - /** - * Resets the scrolling margins back to the top and bottom lines - * of the screen. - */ - void setDefaultMargins(); - - /** - * Moves the cursor down one line, if the MODE_NewLine mode - * flag is enabled then the cursor is returned to the leftmost - * column first. - * - * Equivalent to NextLine() if the MODE_NewLine flag is set - * or index() otherwise. - */ - void newLine(); - /** - * Moves the cursor down one line and positions it at the beginning - * of the line. Equivalent to calling Return() followed by index() - */ - void nextLine(); - - /** - * Move the cursor down one line. If the cursor is on the bottom - * line of the scrolling region (as returned by bottomMargin()) the - * scrolling region is scrolled up by one line instead. - */ - void index(); - /** - * Move the cursor up one line. If the cursor is on the top line - * of the scrolling region (as returned by topMargin()) the scrolling - * region is scrolled down by one line instead. - */ - void reverseIndex(); - - /** - * Scroll the scrolling region of the screen up by @p n lines. - * The scrolling region is initially the whole screen, but can be changed - * using setMargins() - */ - void scrollUp(int n); - /** - * Scroll the scrolling region of the screen down by @p n lines. - * The scrolling region is initially the whole screen, but can be changed - * using setMargins() - */ - void scrollDown(int n); - /** - * Moves the cursor to the beginning of the current line. - * Equivalent to setCursorX(0) - */ - void toStartOfLine(); - /** - * Moves the cursor one column to the left and erases the character - * at the new cursor position. - */ - void backspace(); - /** Moves the cursor @p n tab-stops to the right. */ - void tab(int n = 1); - /** Moves the cursor @p n tab-stops to the left. */ - void backtab(int n); - - // Editing - - /** - * Erase @p n characters beginning from the current cursor position. - * This is equivalent to over-writing @p n characters starting with the current - * cursor position with spaces. - * If @p n is 0 then one character is erased. - */ - void eraseChars(int n); - /** - * Delete @p n characters beginning from the current cursor position. - * If @p n is 0 then one character is deleted. - */ - void deleteChars(int n); - /** - * Insert @p n blank characters beginning from the current cursor position. - * The position of the cursor is not altered. - * If @p n is 0 then one character is inserted. - */ - void insertChars(int n); - /** - * Removes @p n lines beginning from the current cursor position. - * The position of the cursor is not altered. - * If @p n is 0 then one line is removed. - */ - void deleteLines(int n); - /** - * Inserts @p lines beginning from the current cursor position. - * The position of the cursor is not altered. - * If @p n is 0 then one line is inserted. - */ - void insertLines(int n); - /** Clears all the tab stops. */ - void clearTabStops(); - /** Sets or removes a tab stop at the cursor's current column. */ - void changeTabStop(bool set); - - /** Resets (clears) the specified screen @p mode. */ - void resetMode(int mode); - /** Sets (enables) the specified screen @p mode. */ - void setMode(int mode); - /** - * Saves the state of the specified screen @p mode. It can be restored - * using restoreMode() - */ - void saveMode(int mode); - /** Restores the state of a screen @p mode saved by calling saveMode() */ - void restoreMode(int mode); - /** Returns whether the specified screen @p mode is enabled or not .*/ - bool getMode(int mode) const; - - /** - * Saves the current position and appearance (text color and style) of the cursor. - * It can be restored by calling restoreCursor() - */ - void saveCursor(); - /** Restores the position and appearance of the cursor. See saveCursor() */ - void restoreCursor(); - - /** Clear the whole screen, moving the current screen contents into the history first. */ - void clearEntireScreen(); - /** - * Clear the area of the screen from the current cursor position to the end of - * the screen. - */ - void clearToEndOfScreen(); - /** - * Clear the area of the screen from the current cursor position to the start - * of the screen. - */ - void clearToBeginOfScreen(); - /** Clears the whole of the line on which the cursor is currently positioned. */ - void clearEntireLine(); - /** Clears from the current cursor position to the end of the line. */ - void clearToEndOfLine(); - /** Clears from the current cursor position to the beginning of the line. */ - void clearToBeginOfLine(); - - /** Fills the entire screen with the letter 'E' */ - void helpAlign(); - - /** - * Enables the given @p rendition flag. Rendition flags control the appearance - * of characters on the screen. - * - * @see Character::rendition - */ - void setRendition(int rendition); - /** - * Disables the given @p rendition flag. Rendition flags control the appearance - * of characters on the screen. - * - * @see Character::rendition - */ - void resetRendition(int rendition); - - /** - * Sets the cursor's foreground color. - * @param space The color space used by the @p color argument - * @param color The new foreground color. The meaning of this depends on - * the color @p space used. - * - * @see CharacterColor - */ - void setForeColor(int space, int color); - /** - * Sets the cursor's background color. - * @param space The color space used by the @p color argumnet. - * @param color The new background color. The meaning of this depends on - * the color @p space used. - * - * @see CharacterColor - */ - void setBackColor(int space, int color); - /** - * Resets the cursor's color back to the default and sets the - * character's rendition flags back to the default settings. - */ - void setDefaultRendition(); - - /** Returns the column which the cursor is positioned at. */ - int getCursorX() const; - /** Returns the line which the cursor is positioned on. */ - int getCursorY() const; - - /** Clear the entire screen and move the cursor to the home position. - * Equivalent to calling clearEntireScreen() followed by home(). - */ - void clear(); - /** - * Sets the position of the cursor to the 'home' position at the top-left - * corner of the screen (0,0) - */ - void home(); - /** - * Resets the state of the screen. This resets the various screen modes - * back to their default states. The cursor style and colors are reset - * (as if setDefaultRendition() had been called) - * - * <ul> - * <li>Line wrapping is enabled.</li> - * <li>Origin mode is disabled.</li> - * <li>Insert mode is disabled.</li> - * <li>Cursor mode is enabled. TODO Document me</li> - * <li>Screen mode is disabled. TODO Document me</li> - * <li>New line mode is disabled. TODO Document me</li> - * </ul> - * - * If @p clearScreen is true then the screen contents are erased entirely, - * otherwise they are unaltered. - */ - void reset(bool clearScreen = true); - - /** - * Displays a new character at the current cursor position. - * - * If the cursor is currently positioned at the right-edge of the screen and - * line wrapping is enabled then the character is added at the start of a new - * line below the current one. - * - * If the MODE_Insert screen mode is currently enabled then the character - * is inserted at the current cursor position, otherwise it will replace the - * character already at the current cursor position. - */ - void displayCharacter(unsigned short c); - - // Do composition with last shown character FIXME: Not implemented yet for KDE 4 - void compose(const QString& compose); - - /** - * Resizes the image to a new fixed size of @p new_lines by @p new_columns. - * In the case that @p new_columns is smaller than the current number of columns, - * existing lines are not truncated. This prevents characters from being lost - * if the terminal display is resized smaller and then larger again. - * - * The top and bottom margins are reset to the top and bottom of the new - * screen size. Tab stops are also reset and the current selection is - * cleared. - */ - void resizeImage(int new_lines, int new_columns); - - /** - * Returns the current screen image. - * The result is an array of Characters of size [getLines()][getColumns()] which - * must be freed by the caller after use. - * - * @param dest Buffer to copy the characters into - * @param size Size of @p dest in Characters - * @param startLine Index of first line to copy - * @param endLine Index of last line to copy - */ - void getImage( Character* dest , int size , int startLine , int endLine ) const; - - /** - * Returns the additional attributes associated with lines in the image. - * The most important attribute is LINE_WRAPPED which specifies that the - * line is wrapped, - * other attributes control the size of characters in the line. - */ - QVector<LineProperty> getLineProperties( int startLine , int endLine ) const; - - - /** Return the number of lines. */ - int getLines() const - { return lines; } - /** Return the number of columns. */ - int getColumns() const - { return columns; } - /** Return the number of lines in the history buffer. */ - int getHistLines() const; - /** - * Sets the type of storage used to keep lines in the history. - * If @p copyPreviousScroll is true then the contents of the previous - * history buffer are copied into the new scroll. - */ - void setScroll(const HistoryType& , bool copyPreviousScroll = true); - /** Returns the type of storage used to keep lines in the history. */ - const HistoryType& getScroll() const; - /** - * Returns true if this screen keeps lines that are scrolled off the screen - * in a history buffer. - */ - bool hasScroll() const; - - /** - * Sets the start of the selection. - * - * @param column The column index of the first character in the selection. - * @param line The line index of the first character in the selection. - * @param blockSelectionMode True if the selection is in column mode. - */ - void setSelectionStart(const int column, const int line, const bool blockSelectionMode); - - /** - * Sets the end of the current selection. - * - * @param column The column index of the last character in the selection. - * @param line The line index of the last character in the selection. - */ - void setSelectionEnd(const int column, const int line); - - /** - * Retrieves the start of the selection or the cursor position if there - * is no selection. - */ - void getSelectionStart(int& column , int& line) const; - - /** - * Retrieves the end of the selection or the cursor position if there - * is no selection. - */ - void getSelectionEnd(int& column , int& line) const; - - /** Clears the current selection */ - void clearSelection(); - - /** - * Returns true if the character at (@p column, @p line) is part of the - * current selection. - */ - bool isSelected(const int column,const int line) const; - - /** - * Convenience method. Returns the currently selected text. - * @param preserveLineBreaks Specifies whether new line characters should - * be inserted into the returned text at the end of each terminal line. - */ - QString selectedText(bool preserveLineBreaks) const; - - /** - * Copies part of the output to a stream. - * - * @param decoder A decoder which converts terminal characters into text - * @param fromLine The first line in the history to retrieve - * @param toLine The last line in the history to retrieve - */ - void writeLinesToStream(TerminalCharacterDecoder* decoder, int fromLine, int toLine) const; - - /** - * Copies the selected characters, set using @see setSelBeginXY and @see setSelExtentXY - * into a stream. - * - * @param decoder A decoder which converts terminal characters into text. - * PlainTextDecoder is the most commonly used decoder which converts characters - * into plain text with no formatting. - * @param preserveLineBreaks Specifies whether new line characters should - * be inserted into the returned text at the end of each terminal line. - */ - void writeSelectionToStream(TerminalCharacterDecoder* decoder , bool - preserveLineBreaks = true) const; - - /** - * Checks if the text between from and to is inside the current - * selection. If this is the case, the selection is cleared. The - * from and to are coordinates in the current viewable window. - * The loc(x,y) macro can be used to generate these values from a - * column,line pair. - * - * @param from The start of the area to check. - * @param to The end of the area to check - */ - void checkSelection(int from, int to); - - /** - * Sets or clears an attribute of the current line. - * - * @param property The attribute to set or clear - * Possible properties are: - * LINE_WRAPPED: Specifies that the line is wrapped. - * LINE_DOUBLEWIDTH: Specifies that the characters in the current line - * should be double the normal width. - * LINE_DOUBLEHEIGHT:Specifies that the characters in the current line - * should be double the normal height. - * Double-height lines are formed of two lines containing the same characters, - * with both having the LINE_DOUBLEHEIGHT attribute. - * This allows other parts of the code to work on the - * assumption that all lines are the same height. - * - * @param enable true to apply the attribute to the current line or false to remove it - */ - void setLineProperty(LineProperty property , bool enable); - - /** - * Returns the number of lines that the image has been scrolled up or down by, - * since the last call to resetScrolledLines(). - * - * a positive return value indicates that the image has been scrolled up, - * a negative return value indicates that the image has been scrolled down. - */ - int scrolledLines() const; - - /** - * Returns the region of the image which was last scrolled. - * - * This is the area of the image from the top margin to the - * bottom margin when the last scroll occurred. - */ - QRect lastScrolledRegion() const; - - /** - * Resets the count of the number of lines that the image has been scrolled up or down by, - * see scrolledLines() - */ - void resetScrolledLines(); - - /** - * Returns the number of lines of output which have been - * dropped from the history since the last call - * to resetDroppedLines() - * - * If the history is not unlimited then it will drop - * the oldest lines of output if new lines are added when - * it is full. - */ - int droppedLines() const; - - /** - * Resets the count of the number of lines dropped from - * the history. - */ - void resetDroppedLines(); - - /** - * Fills the buffer @p dest with @p count instances of the default (ie. blank) - * Character style. - */ - static void fillWithDefaultChar(Character* dest, int count); - -private: - - //copies a line of text from the screen or history into a stream using a - //specified character decoder. Returns the number of lines actually copied, - //which may be less than 'count' if (start+count) is more than the number of characters on - //the line - // - //line - the line number to copy, from 0 (the earliest line in the history) up to - // history->getLines() + lines - 1 - //start - the first column on the line to copy - //count - the number of characters on the line to copy - //decoder - a decoder which converts terminal characters (an Character array) into text - //appendNewLine - if true a new line character (\n) is appended to the end of the line - int copyLineToStream(int line, - int start, - int count, - TerminalCharacterDecoder* decoder, - bool appendNewLine, - bool preserveLineBreaks) const; - - //fills a section of the screen image with the character 'c' - //the parameters are specified as offsets from the start of the screen image. - //the loc(x,y) macro can be used to generate these values from a column,line pair. - void clearImage(int loca, int loce, char c); - - //move screen image between 'sourceBegin' and 'sourceEnd' to 'dest'. - //the parameters are specified as offsets from the start of the screen image. - //the loc(x,y) macro can be used to generate these values from a column,line pair. - // - //NOTE: moveImage() can only move whole lines - void moveImage(int dest, int sourceBegin, int sourceEnd); - // scroll up 'i' lines in current region, clearing the bottom 'i' lines - void scrollUp(int from, int i); - // scroll down 'i' lines in current region, clearing the top 'i' lines - void scrollDown(int from, int i); - - void addHistLine(); - - void initTabStops(); - - void updateEffectiveRendition(); - void reverseRendition(Character& p) const; - - bool isSelectionValid() const; - // copies text from 'startIndex' to 'endIndex' to a stream - // startIndex and endIndex are positions generated using the loc(x,y) macro - void writeToStream(TerminalCharacterDecoder* decoder, int startIndex, - int endIndex, bool preserveLineBreaks = true) const; - // copies 'count' lines from the screen buffer into 'dest', - // starting from 'startLine', where 0 is the first line in the screen buffer - void copyFromScreen(Character* dest, int startLine, int count) const; - // copies 'count' lines from the history buffer into 'dest', - // starting from 'startLine', where 0 is the first line in the history - void copyFromHistory(Character* dest, int startLine, int count) const; - - - // screen image ---------------- - int lines; - int columns; - - typedef QVector<Character> ImageLine; // [0..columns] - ImageLine* screenLines; // [lines] - - int _scrolledLines; - QRect _lastScrolledRegion; - - int _droppedLines; - - QVarLengthArray<LineProperty,64> lineProperties; - - // history buffer --------------- - HistoryScroll* history; - - // cursor location - int cuX; - int cuY; - - // cursor color and rendition info - CharacterColor currentForeground; - CharacterColor currentBackground; - quint8 currentRendition; - - // margins ---------------- - int _topMargin; - int _bottomMargin; - - // states ---------------- - int currentModes[MODES_SCREEN]; - int savedModes[MODES_SCREEN]; - - // ---------------------------- - - QBitArray tabStops; - - // selection ------------------- - int selBegin; // The first location selected. - int selTopLeft; // TopLeft Location. - int selBottomRight; // Bottom Right Location. - bool blockSelectionMode; // Column selection mode - - // effective colors and rendition ------------ - CharacterColor effectiveForeground; // These are derived from - CharacterColor effectiveBackground; // the cu_* variables above - quint8 effectiveRendition; // to speed up operation - - class SavedState - { - public: - SavedState() - : cursorColumn(0),cursorLine(0),rendition(0) {} - - int cursorColumn; - int cursorLine; - quint8 rendition; - CharacterColor foreground; - CharacterColor background; - }; - SavedState savedState; - - // last position where we added a character - int lastPos; - - static Character defaultChar; -}; - -#endif // SCREEN_H
deleted file mode 100644 --- a/gui/src/ScreenWindow.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* - Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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. -*/ - -// Own -#include "ScreenWindow.h" - -// Qt -#include <QtCore> - -// Konsole -#include "Screen.h" - -ScreenWindow::ScreenWindow(QObject* parent) - : QObject(parent) - , _windowBuffer(0) - , _windowBufferSize(0) - , _bufferNeedsUpdate(true) - , _windowLines(1) - , _currentLine(0) - , _trackOutput(true) - , _scrollCount(0) -{ -} -ScreenWindow::~ScreenWindow() -{ - delete[] _windowBuffer; -} -void ScreenWindow::setScreen(Screen* screen) -{ - Q_ASSERT( screen ); - - _screen = screen; -} - -Screen* ScreenWindow::screen() const -{ - return _screen; -} - -Character* ScreenWindow::getImage() -{ - // reallocate internal buffer if the window size has changed - int size = windowLines() * windowColumns(); - if (_windowBuffer == 0 || _windowBufferSize != size) - { - delete[] _windowBuffer; - _windowBufferSize = size; - _windowBuffer = new Character[size]; - _bufferNeedsUpdate = true; - } - - if (!_bufferNeedsUpdate) - return _windowBuffer; - - _screen->getImage(_windowBuffer,size, - currentLine(),endWindowLine()); - - // this window may look beyond the end of the screen, in which - // case there will be an unused area which needs to be filled - // with blank characters - fillUnusedArea(); - - _bufferNeedsUpdate = false; - return _windowBuffer; -} - -void ScreenWindow::fillUnusedArea() -{ - int screenEndLine = _screen->getHistLines() + _screen->getLines() - 1; - int windowEndLine = currentLine() + windowLines() - 1; - - int unusedLines = windowEndLine - screenEndLine; - int charsToFill = unusedLines * windowColumns(); - - Screen::fillWithDefaultChar(_windowBuffer + _windowBufferSize - charsToFill,charsToFill); -} - -// return the index of the line at the end of this window, or if this window -// goes beyond the end of the screen, the index of the line at the end -// of the screen. -// -// when passing a line number to a Screen method, the line number should -// never be more than endWindowLine() -// -int ScreenWindow::endWindowLine() const -{ - return qMin(currentLine() + windowLines() - 1, - lineCount() - 1); -} -QVector<LineProperty> ScreenWindow::getLineProperties() -{ - QVector<LineProperty> result = _screen->getLineProperties(currentLine(),endWindowLine()); - - if (result.count() != windowLines()) - result.resize(windowLines()); - - return result; -} - -QString ScreenWindow::selectedText( bool preserveLineBreaks ) const -{ - return _screen->selectedText( preserveLineBreaks ); -} - -void ScreenWindow::getSelectionStart( int& column , int& line ) -{ - _screen->getSelectionStart(column,line); - line -= currentLine(); -} -void ScreenWindow::getSelectionEnd( int& column , int& line ) -{ - _screen->getSelectionEnd(column,line); - line -= currentLine(); -} -void ScreenWindow::setSelectionStart( int column , int line , bool columnMode ) -{ - _screen->setSelectionStart( column , qMin(line + currentLine(),endWindowLine()) , columnMode); - - _bufferNeedsUpdate = true; - emit selectionChanged(); -} - -void ScreenWindow::setSelectionEnd( int column , int line ) -{ - _screen->setSelectionEnd( column , qMin(line + currentLine(),endWindowLine()) ); - - _bufferNeedsUpdate = true; - emit selectionChanged(); -} - -bool ScreenWindow::isSelected( int column , int line ) -{ - return _screen->isSelected( column , qMin(line + currentLine(),endWindowLine()) ); -} - -void ScreenWindow::clearSelection() -{ - _screen->clearSelection(); - - emit selectionChanged(); -} - -void ScreenWindow::setWindowLines(int lines) -{ - Q_ASSERT(lines > 0); - _windowLines = lines; -} -int ScreenWindow::windowLines() const -{ - return _windowLines; -} - -int ScreenWindow::windowColumns() const -{ - return _screen->getColumns(); -} - -int ScreenWindow::lineCount() const -{ - return _screen->getHistLines() + _screen->getLines(); -} - -int ScreenWindow::columnCount() const -{ - return _screen->getColumns(); -} - -QPoint ScreenWindow::cursorPosition() const -{ - QPoint position; - - position.setX( _screen->getCursorX() ); - position.setY( _screen->getCursorY() ); - - return position; -} - -int ScreenWindow::currentLine() const -{ - return qBound(0,_currentLine,lineCount()-windowLines()); -} - -void ScreenWindow::scrollBy( RelativeScrollMode mode , int amount ) -{ - if ( mode == ScrollLines ) - { - scrollTo( currentLine() + amount ); - } - else if ( mode == ScrollPages ) - { - scrollTo( currentLine() + amount * ( windowLines() / 2 ) ); - } -} - -bool ScreenWindow::atEndOfOutput() const -{ - return currentLine() == (lineCount()-windowLines()); -} - -void ScreenWindow::scrollTo( int line ) -{ - int maxCurrentLineNumber = lineCount() - windowLines(); - line = qBound(0,line,maxCurrentLineNumber); - - const int delta = line - _currentLine; - _currentLine = line; - - // keep track of number of lines scrolled by, - // this can be reset by calling resetScrollCount() - _scrollCount += delta; - - _bufferNeedsUpdate = true; - - emit scrolled(_currentLine); -} - -void ScreenWindow::setTrackOutput(bool trackOutput) -{ - _trackOutput = trackOutput; -} - -bool ScreenWindow::trackOutput() const -{ - return _trackOutput; -} - -int ScreenWindow::scrollCount() const -{ - return _scrollCount; -} - -void ScreenWindow::resetScrollCount() -{ - _scrollCount = 0; -} - -QRect ScreenWindow::scrollRegion() const -{ - bool equalToScreenSize = windowLines() == _screen->getLines(); - - if ( atEndOfOutput() && equalToScreenSize ) - return _screen->lastScrolledRegion(); - else - return QRect(0,0,windowColumns(),windowLines()); -} - -void ScreenWindow::notifyOutputChanged() -{ - // move window to the bottom of the screen and update scroll count - // if this window is currently tracking the bottom of the screen - if ( _trackOutput ) - { - _scrollCount -= _screen->scrolledLines(); - _currentLine = qMax(0,_screen->getHistLines() - (windowLines()-_screen->getLines())); - } - else - { - // if the history is not unlimited then it may - // have run out of space and dropped the oldest - // lines of output - in this case the screen - // window's current line number will need to - // be adjusted - otherwise the output will scroll - _currentLine = qMax(0,_currentLine - - _screen->droppedLines()); - - // ensure that the screen window's current position does - // not go beyond the bottom of the screen - _currentLine = qMin( _currentLine , _screen->getHistLines() ); - } - - _bufferNeedsUpdate = true; - - emit outputChanged(); -}
deleted file mode 100644 --- a/gui/src/ScreenWindow.h +++ /dev/null @@ -1,251 +0,0 @@ -/* - Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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 SCREENWINDOW_H -#define SCREENWINDOW_H - -// Qt -#include <QtCore/QObject> -#include <QtCore/QPoint> -#include <QtCore/QRect> - -// Konsole -#include "Character.h" - -class Screen; - -/** - * Provides a window onto a section of a terminal screen. - * This window can then be rendered by a terminal display widget ( TerminalDisplay ). - * - * To use the screen window, create a new ScreenWindow() instance and associated it with - * a terminal screen using setScreen(). - * Use the scrollTo() method to scroll the window up and down on the screen. - * Call the getImage() method to retrieve the character image which is currently visible in the window. - * - * setTrackOutput() controls whether the window moves to the bottom of the associated screen when new - * lines are added to it. - * - * Whenever the output from the underlying screen is changed, the notifyOutputChanged() slot should - * be called. This in turn will update the window's position and emit the outputChanged() signal - * if necessary. - */ -class ScreenWindow : public QObject -{ -Q_OBJECT - -public: - /** - * Constructs a new screen window with the given parent. - * A screen must be specified by calling setScreen() before calling getImage() or getLineProperties(). - * - * You should not call this constructor directly, instead use the Emulation::createWindow() method - * to create a window on the emulation which you wish to view. This allows the emulation - * to notify the window when the associated screen has changed and synchronize selection updates - * between all views on a session. - */ - ScreenWindow(QObject* parent = 0); - virtual ~ScreenWindow(); - - /** Sets the screen which this window looks onto */ - void setScreen(Screen* screen); - /** Returns the screen which this window looks onto */ - Screen* screen() const; - - /** - * Returns the image of characters which are currently visible through this window - * onto the screen. - * - * The buffer is managed by the ScreenWindow instance and does not need to be - * deleted by the caller. - */ - Character* getImage(); - - /** - * Returns the line attributes associated with the lines of characters which - * are currently visible through this window - */ - QVector<LineProperty> getLineProperties(); - - /** - * Returns the number of lines which the region of the window - * specified by scrollRegion() has been scrolled by since the last call - * to resetScrollCount(). scrollRegion() is in most cases the - * whole window, but will be a smaller area in, for example, applications - * which provide split-screen facilities. - * - * This is not guaranteed to be accurate, but allows views to optimise - * rendering by reducing the amount of costly text rendering that - * needs to be done when the output is scrolled. - */ - int scrollCount() const; - - /** - * Resets the count of scrolled lines returned by scrollCount() - */ - void resetScrollCount(); - - /** - * Returns the area of the window which was last scrolled, this is - * usually the whole window area. - * - * Like scrollCount(), this is not guaranteed to be accurate, - * but allows views to optimise rendering. - */ - QRect scrollRegion() const; - - /** - * Sets the start of the selection to the given @p line and @p column within - * the window. - */ - void setSelectionStart( int column , int line , bool columnMode ); - /** - * Sets the end of the selection to the given @p line and @p column within - * the window. - */ - void setSelectionEnd( int column , int line ); - /** - * Retrieves the start of the selection within the window. - */ - void getSelectionStart( int& column , int& line ); - /** - * Retrieves the end of the selection within the window. - */ - void getSelectionEnd( int& column , int& line ); - /** - * Returns true if the character at @p line , @p column is part of the selection. - */ - bool isSelected( int column , int line ); - /** - * Clears the current selection - */ - void clearSelection(); - - /** Sets the number of lines in the window */ - void setWindowLines(int lines); - /** Returns the number of lines in the window */ - int windowLines() const; - /** Returns the number of columns in the window */ - int windowColumns() const; - - /** Returns the total number of lines in the screen */ - int lineCount() const; - /** Returns the total number of columns in the screen */ - int columnCount() const; - - /** Returns the index of the line which is currently at the top of this window */ - int currentLine() const; - - /** - * Returns the position of the cursor - * within the window. - */ - QPoint cursorPosition() const; - - /** - * Convenience method. Returns true if the window is currently at the bottom - * of the screen. - */ - bool atEndOfOutput() const; - - /** Scrolls the window so that @p line is at the top of the window */ - void scrollTo( int line ); - - enum RelativeScrollMode - { - ScrollLines, - ScrollPages - }; - - /** - * Scrolls the window relative to its current position on the screen. - * - * @param mode Specifies whether @p amount refers to the number of lines or the number - * of pages to scroll. - * @param amount The number of lines or pages ( depending on @p mode ) to scroll by. If - * this number is positive, the view is scrolled down. If this number is negative, the view - * is scrolled up. - */ - void scrollBy( RelativeScrollMode mode , int amount ); - - /** - * Specifies whether the window should automatically move to the bottom - * of the screen when new output is added. - * - * If this is set to true, the window will be moved to the bottom of the associated screen ( see - * screen() ) when the notifyOutputChanged() method is called. - */ - void setTrackOutput(bool trackOutput); - /** - * Returns whether the window automatically moves to the bottom of the screen as - * new output is added. See setTrackOutput() - */ - bool trackOutput() const; - - /** - * Returns the text which is currently selected. - * - * @param preserveLineBreaks See Screen::selectedText() - */ - QString selectedText( bool preserveLineBreaks ) const; - -public slots: - /** - * Notifies the window that the contents of the associated terminal screen have changed. - * This moves the window to the bottom of the screen if trackOutput() is true and causes - * the outputChanged() signal to be emitted. - */ - void notifyOutputChanged(); - -signals: - /** - * Emitted when the contents of the associated terminal screen ( see screen() ) changes. - */ - void outputChanged(); - - /** - * Emitted when the screen window is scrolled to a different position. - * - * @param line The line which is now at the top of the window. - */ - void scrolled(int line); - - /** - * Emitted when the selection is changed. - */ - void selectionChanged(); - -private: - int endWindowLine() const; - void fillUnusedArea(); - - Screen* _screen; // see setScreen() , screen() - Character* _windowBuffer; - int _windowBufferSize; - bool _bufferNeedsUpdate; - - int _windowLines; - int _currentLine; // see scrollTo() , currentLine() - bool _trackOutput; // see setTrackOutput() , trackOutput() - int _scrollCount; // count of lines which the window has been scrolled by since - // the last call to resetScrollCount() -}; -#endif // SCREENWINDOW_H
deleted file mode 100644 --- a/gui/src/Session.cpp +++ /dev/null @@ -1,1209 +0,0 @@ -/* - This file is part of Konsole - - Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - Copyright 2009 by Thomas Dreibholz <dreibh@iem.uni-due.de> - - This program 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 program 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. -*/ - -// Own -#include "Session.h" - -// Standard -#include <assert.h> -#include <stdlib.h> -#include <signal.h> - -// Qt -#include <QtGui/QApplication> -#include <QtCore/QByteRef> -#include <QtCore/QDir> -#include <QtCore/QFile> -#include <QtCore/QRegExp> -#include <QtCore/QStringList> -#include <QtCore/QDate> - -#include "kprocess.h" -#include "kptydevice.h" - -#include "ProcessInfo.h" -#include "Pty.h" -#include "TerminalDisplay.h" -#include "ShellCommand.h" -#include "Vt102Emulation.h" - -int Session::lastSessionId = 0; - -// HACK This is copied out of QUuid::createUuid with reseeding forced. -// Required because color schemes repeatedly seed the RNG... -// ...with a constant. -QUuid createUuid() -{ - static const int intbits = sizeof(int)*8; - static int randbits = 0; - if (!randbits) - { - int max = RAND_MAX; - do { ++randbits; } while ((max=max>>1)); - } - - qsrand(uint(QDateTime::currentDateTime().toTime_t())); - qrand(); // Skip first - - QUuid result; - uint *data = &(result.data1); - int chunks = 16 / sizeof(uint); - while (chunks--) { - uint randNumber = 0; - for (int filled = 0; filled < intbits; filled += randbits) - randNumber |= qrand()<<filled; - *(data+chunks) = randNumber; - } - - result.data4[0] = (result.data4[0] & 0x3F) | 0x80; // UV_DCE - result.data3 = (result.data3 & 0x0FFF) | 0x4000; // UV_Random - - return result; -} - -Session::Session(QObject* parent) : - QObject(parent) - , _shellProcess(0) - , _emulation(0) - , _monitorActivity(false) - , _monitorSilence(false) - , _notifiedActivity(false) - , _autoClose(true) - , _wantedClose(false) - , _silenceSeconds(10) - , _addToUtmp(true) - , _flowControl(true) - , _fullScripting(false) - , _sessionId(0) - , _sessionProcessInfo(0) - , _foregroundProcessInfo(0) - , _foregroundPid(0) - //, _zmodemBusy(false) - //, _zmodemProc(0) - //, _zmodemProgress(0) - , _hasDarkBackground(false) -{ - _uniqueIdentifier = createUuid(); - - //prepare DBus communication - //new SessionAdaptor(this); - _sessionId = ++lastSessionId; - - // JPS: commented out for lack of DBUS support by default on OSX - //QDBusConnection::sessionBus().registerObject(QLatin1String("/Sessions/")+QString::number(_sessionId), this); - - //create emulation backend - _emulation = new Vt102Emulation(); - - connect( _emulation, SIGNAL( titleChanged( int, const QString & ) ), - this, SLOT( setUserTitle( int, const QString & ) ) ); - connect( _emulation, SIGNAL( stateSet(int) ), - this, SLOT( activityStateSet(int) ) ); - //connect( _emulation, SIGNAL( zmodemDetected() ), this , - // SLOT( fireZModemDetected() ) ); - connect( _emulation, SIGNAL( changeTabTextColorRequest( int ) ), - this, SIGNAL( changeTabTextColorRequest( int ) ) ); - connect( _emulation, SIGNAL(profileChangeCommandReceived(const QString&)), - this, SIGNAL( profileChangeCommandReceived(const QString&)) ); - connect( _emulation, SIGNAL(flowControlKeyPressed(bool)) , this, - SLOT(updateFlowControlState(bool)) ); - - //create new teletype for I/O with shell process - openTeletype(-1); - - //setup timer for monitoring session activity - _monitorTimer = new QTimer(this); - _monitorTimer->setSingleShot(true); - connect(_monitorTimer, SIGNAL(timeout()), this, SLOT(monitorTimerDone())); -} - -void Session::openTeletype(int fd) -{ - if (_shellProcess && isRunning()) - { - //kWarning() << "Attempted to open teletype in a running session."; - return; - } - - delete _shellProcess; - - if (fd < 0) - _shellProcess = new Pty(); - 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(lockPtyRequest(bool)),_shellProcess,SLOT(lockPty(bool)) ); - connect( _emulation,SIGNAL(useUtf8Request(bool)),_shellProcess,SLOT(setUtf8Mode(bool)) ); - connect( _shellProcess,SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(done(int)) ); - connect( _emulation,SIGNAL(imageSizeChanged(int,int)),this,SLOT(updateWindowSize(int,int)) ); -} - -WId Session::windowId() const -{ - // Returns a window ID for this session which is used - // to set the WINDOWID environment variable in the shell - // process. - // - // Sessions can have multiple views or no views, which means - // that a single ID is not always going to be accurate. - // - // If there are no views, the window ID is just 0. If - // there are multiple views, then the window ID for the - // top-level window which contains the first view is - // returned - - if ( _views.count() == 0 ) - return 0; - else - { - QWidget* window = _views.first(); - - Q_ASSERT( window ); - - while ( window->parentWidget() != 0 ) - window = window->parentWidget(); - - return window->winId(); - } -} - -void Session::setDarkBackground(bool darkBackground) -{ - _hasDarkBackground = darkBackground; -} -bool Session::hasDarkBackground() const -{ - return _hasDarkBackground; -} -bool Session::isRunning() const -{ - return _shellProcess->state() == QProcess::Running; -} - -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 _emulation->codec()->name(); -} - -void Session::setProgram(const QString& program) -{ - _program = ShellCommand::expand(program); -} -void Session::setInitialWorkingDirectory(const QString& dir) -{ - //_initialWorkingDir = KShell::tildeExpand(ShellCommand::expand(dir)); - _initialWorkingDir = ShellCommand::expand(dir); -} -void Session::setArguments(const QStringList& arguments) -{ - _arguments = ShellCommand::expand(arguments); -} - -QString Session::currentWorkingDirectory() -{ - // only returned cached value - if (_currentWorkingDir.isEmpty()) updateWorkingDirectory(); - return _currentWorkingDir; -} -ProcessInfo* Session::updateWorkingDirectory() -{ - ProcessInfo *process = getProcessInfo(); - _currentWorkingDir = process->validCurrentDir(); - return process; -} - -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 -{ - // Upon a KPty error, there is no description on what that error was... - // Check to see if the given program is executable. - QString exec = QFile::encodeName(program); - - if (exec.isEmpty()) - return QString(); - - // if 'exec' is not specified, fall back to default shell. if that - // is not set then fall back to /bin/sh - if ( exec.isEmpty() ) - exec = qgetenv("SHELL"); - if ( exec.isEmpty() ) - exec = "/bin/sh"; - return program; -} - -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)); -} - -QString Session::shellSessionId() const -{ - QString friendlyUuid(_uniqueIdentifier.toString()); - friendlyUuid.remove('-').remove('{').remove('}'); - - return friendlyUuid; -} - -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(); - } - - const int CHOICE_COUNT = 3; - QString programs[CHOICE_COUNT] = {_program,qgetenv("SHELL"),"/bin/sh"}; - QString exec; - int choice = 0; - while (choice < CHOICE_COUNT) - { - exec = checkProgram(programs[choice]); - if (exec.isEmpty()) - choice++; - else - 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; - - // JPS: commented out for lack of DBUS support by default on OSX - QString dbusService = ""; //QDBusConnection::sessionBus().baseService(); - if (!_initialWorkingDir.isEmpty()) - _shellProcess->setWorkingDirectory(_initialWorkingDir); - else - _shellProcess->setWorkingDirectory(QDir::homePath()); - - _shellProcess->setFlowControlEnabled(_flowControl); - _shellProcess->setErase(_emulation->eraseChar()); - - // this is not strictly accurate use of the COLORFGBG variable. This does not - // tell the terminal exactly which colors are being used, but instead approximates - // the color scheme as "black on white" or "white on black" depending on whether - // the background color is deemed dark or not - QString backgroundColorHint = _hasDarkBackground ? "COLORFGBG=15;0" : "COLORFGBG=0;15"; - _environment << backgroundColorHint; - _environment << QString("SHELL_SESSION_ID=%1").arg(shellSessionId()); - - int result = _shellProcess->start(exec, - arguments, - _environment, - windowId(), - _addToUtmp, - dbusService, - (QLatin1String("/Sessions/") + - QString::number(_sessionId))); - - 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. - - emit started(); -} - -void Session::setUserTitle( int what, const QString &caption ) -{ - //set to true if anything is actually changed (eg. old _nameTitle != new _nameTitle ) - bool modified = false; - - if ((what == IconNameAndWindowTitle) || (what == WindowTitle)) - { - if ( _userTitle != caption ) { - _userTitle = caption; - modified = true; - } - } - - if ((what == IconNameAndWindowTitle) || (what == IconName)) - { - if ( _iconText != caption ) { - _iconText = caption; - modified = true; - } - } - - if (what == TextColor || what == BackgroundColor) - { - QString colorString = caption.section(';',0,0); - QColor color = QColor(colorString); - if (color.isValid()) - { - if (what == TextColor) - emit changeForegroundColorRequest(color); - else - emit changeBackgroundColorRequest(color); - } - } - - if (what == SessionName) - { - if ( _nameTitle != caption ) { - setTitle(Session::NameRole,caption); - return; - } - } - - if (what == 31) - { - QString cwd=caption; - cwd=cwd.replace( QRegExp("^~"), QDir::homePath() ); - emit openUrlRequest(cwd); - } - - // change icon via \033]32;Icon\007 - if (what == 32) - { - if ( _iconName != caption ) { - _iconName = caption; - - modified = true; - } - } - - if (what == ProfileChange) - { - emit profileChangeCommandReceived(caption); - return; - } - - if ( modified ) - emit titleChanged(); -} - -QString Session::userTitle() const -{ - return _userTitle; -} -void Session::setTabTitleFormat(TabTitleContext context , const QString& format) -{ - if ( context == LocalTabTitle ) - _localTabTitleFormat = format; - else if ( context == RemoteTabTitle ) - _remoteTabTitleFormat = format; -} -QString Session::tabTitleFormat(TabTitleContext context) const -{ - if ( context == LocalTabTitle ) - return _localTabTitleFormat; - else if ( context == RemoteTabTitle ) - return _remoteTabTitleFormat; - - return QString(); -} - -void Session::monitorTimerDone() -{ - //FIXME: The idea here is that the notification popup will appear to tell the user than output from - //the terminal has stopped and the popup will disappear when the user activates the session. - // - //This breaks with the addition of multiple views of a session. The popup should disappear - //when any of the views of the session becomes active - - - //FIXME: Make message text for this notification and the activity notification more descriptive. - if (_monitorSilence) { - //KNotification::event("Silence", i18n("Silence in session '%1'", _nameTitle)propagateSize, QPixmap(), - // QApplication::activeWindow(), - // KNotification::CloseWhenWidgetActivated); - emit stateChanged(NOTIFYSILENCE); - } - else - { - emit stateChanged(NOTIFYNORMAL); - } - - _notifiedActivity=false; -} -void Session::updateFlowControlState(bool suspended) -{ - if (suspended) - { - if (flowControlEnabled()) - { - foreach(TerminalDisplay* display,_views) - { - if (display->flowControlWarningEnabled()) - display->outputSuspended(true); - } - } - } - else - { - foreach(TerminalDisplay* display,_views) - display->outputSuspended(false); - } -} -void Session::activityStateSet(int state) -{ - if (state==NOTIFYBELL) - { - emit bellRequest(QString("Bell in session '%1'").arg(_nameTitle.toLatin1().data())); - } - else if (state==NOTIFYACTIVITY) - { - if (_monitorSilence) { - _monitorTimer->start(_silenceSeconds*1000); - } - - if ( _monitorActivity ) { - //FIXME: See comments in Session::monitorTimerDone() - if (!_notifiedActivity) { - //KNotification::event("Activity", i18n("Activity in session '%1'", _nameTitle), QPixmap(), - // QApplication::activeWindow(), - //KNotification::CloseWhenWidgetActivated); - _notifiedActivity=true; - } - } - } - - if ( state==NOTIFYACTIVITY && !_monitorActivity ) - state = NOTIFYNORMAL; - if ( state==NOTIFYSILENCE && !_monitorSilence ) - state = NOTIFYNORMAL; - - emit stateChanged(state); -} - -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); - _shellProcess->setWindowSize(existingSize.height(),existingSize.width()); -} - -bool Session::kill(int signal) -{ - int result = ::kill(_shellProcess->pid(),signal); - - if ( result == 0 ) - { - _shellProcess->waitForFinished(); - return true; - } - else - return false; -} - -void Session::close() -{ - _autoClose = true; - _wantedClose = true; - - if (!isRunning() || !kill(SIGHUP)) - { - 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. - QTimer::singleShot(1, this, SIGNAL(finished())); - } -} - -void Session::sendText(const QString &text) const -{ - _emulation->sendText(text); -} - -void Session::sendMouseEvent(int buttons, int column, int line, int eventType) -{ - _emulation->sendMouseEvent(buttons, column, line, eventType); -} - -Session::~Session() -{ - if (_foregroundProcessInfo) - delete _foregroundProcessInfo; - if (_sessionProcessInfo) - delete _sessionProcessInfo; - delete _emulation; - delete _shellProcess; - //delete _zmodemProc; -} - -void Session::done(int exitStatus) -{ - if (!_autoClose) - { - _userTitle = QString("@info:shell This session is done"); - emit titleChanged(); - return; - } - - QString message; - QTextStream msgStream(&message); - if (!_wantedClose || exitStatus != 0) - { - if (_shellProcess->exitStatus() == QProcess::NormalExit) - { - msgStream << "Program '" << _program << "' exited with statis " << 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(); -} - -Emulation* Session::emulation() const -{ - return _emulation; -} - -QString Session::keyBindings() const -{ - return _emulation->keyBindings(); -} - -QStringList Session::environment() const -{ - return _environment; -} - -void Session::setEnvironment(const QStringList& environment) -{ - _environment = environment; -} - -int Session::sessionId() const -{ - return _sessionId; -} - -void Session::setKeyBindings(const QString &id) -{ - _emulation->setKeyBindings(id); -} - -void Session::setTitle(TitleRole role , const QString& newTitle) -{ - if ( title(role) != newTitle ) - { - if ( role == NameRole ) - _nameTitle = newTitle; - else if ( role == DisplayedTitleRole ) - _displayTitle = newTitle; - - emit titleChanged(); - } -} - -QString Session::title(TitleRole role) const -{ - if ( role == NameRole ) - return _nameTitle; - else if ( role == DisplayedTitleRole ) - return _displayTitle; - else - return QString(); -} - -ProcessInfo* Session::getProcessInfo() -{ - ProcessInfo* process; - - if (isForegroundProcessActive()) - process = _foregroundProcessInfo; - else - { - updateSessionProcessInfo(); - process = _sessionProcessInfo; - } - - return process; -} - -void Session::updateSessionProcessInfo() -{ - Q_ASSERT(_shellProcess); - if (!_sessionProcessInfo) - { - _sessionProcessInfo = ProcessInfo::newInstance(processId()); - _sessionProcessInfo->setUserHomeDir(); - } - _sessionProcessInfo->update(); -} - -bool Session::updateForegroundProcessInfo() -{ - bool valid = (_foregroundProcessInfo != 0); - - // has foreground process changed? - Q_ASSERT(_shellProcess); - int pid = _shellProcess->foregroundProcessGroup(); - if (pid != _foregroundPid) - { - if (valid) - delete _foregroundProcessInfo; - _foregroundProcessInfo = ProcessInfo::newInstance(pid); - _foregroundPid = pid; - valid = true; - } - - if (valid) - { - _foregroundProcessInfo->update(); - valid = _foregroundProcessInfo->isValid(); - } - - return valid; -} - -bool Session::isRemote() -{ - ProcessInfo* process = getProcessInfo(); - - bool ok = false; - return ( process->name(&ok) == "ssh" && ok ); -} - -QString Session::getDynamicTitle() -{ - // update current directory from process - ProcessInfo* process = updateWorkingDirectory(); - - // format tab titles using process info - bool ok = false; - QString title; - if ( process->name(&ok) == "ssh" && ok ) - { - SSHProcessInfo sshInfo(*process); - title = sshInfo.format(tabTitleFormat(Session::RemoteTabTitle)); - } - else - title = process->format(tabTitleFormat(Session::LocalTabTitle)); - - return title; -} - -void Session::setIconName(const QString& iconName) -{ - if ( iconName != _iconName ) - { - _iconName = iconName; - emit titleChanged(); - } -} - -void Session::setIconText(const QString& iconText) -{ - _iconText = iconText; -} - -QString Session::iconName() const -{ - return _iconName; -} - -QString Session::iconText() const -{ - return _iconText; -} - -void Session::setHistoryType(const HistoryType &hType) -{ - _emulation->setHistory(hType); -} - -const HistoryType& Session::historyType() const -{ - return _emulation->history(); -} - -void Session::clearHistory() -{ - _emulation->clearHistory(); -} - -QStringList Session::arguments() const -{ - return _arguments; -} - -QString Session::program() const -{ - return _program; -} - -// unused currently -bool Session::isMonitorActivity() const { return _monitorActivity; } -// unused currently -bool Session::isMonitorSilence() const { return _monitorSilence; } - -void Session::setMonitorActivity(bool _monitor) -{ - _monitorActivity=_monitor; - _notifiedActivity=false; - - activityStateSet(NOTIFYNORMAL); -} - -void Session::setMonitorSilence(bool _monitor) -{ - if (_monitorSilence==_monitor) - return; - - _monitorSilence=_monitor; - if (_monitorSilence) - { - _monitorTimer->start(_silenceSeconds*1000); - } - else - _monitorTimer->stop(); - - activityStateSet(NOTIFYNORMAL); -} - -void Session::setMonitorSilenceSeconds(int seconds) -{ - _silenceSeconds=seconds; - if (_monitorSilence) { - _monitorTimer->start(_silenceSeconds*1000); - } -} - -void Session::setAddToUtmp(bool set) -{ - _addToUtmp = set; -} - -void Session::setFlowControlEnabled(bool enabled) -{ - _flowControl = enabled; - - if (_shellProcess) - _shellProcess->setFlowControlEnabled(_flowControl); - emit flowControlEnabledChanged(enabled); -} -bool Session::flowControlEnabled() const -{ - if (_shellProcess) - return _shellProcess->flowControlEnabled(); - else - return _flowControl; -} - -void Session::onReceiveBlock( const char* buf, int len ) -{ - _emulation->receiveData( buf, len ); - emit receivedData( QString::fromLatin1( buf, len ) ); -} - -QSize Session::size() -{ - return _emulation->imageSize(); -} - -void Session::setSize(const QSize& size) -{ - if ((size.width() <= 1) || (size.height() <= 1)) - return; - - emit resizeRequest(size); -} -int Session::processId() const -{ - return _shellProcess->pid(); -} - -void Session::setTitle(int role , const QString& title) -{ - switch (role) { - case (0): - this->setTitle(Session::NameRole, title); - break; - case (1): - this->setTitle(Session::DisplayedTitleRole, title); - break; - } -} - -QString Session::title(int role) const -{ - switch (role) { - case (0): - return this->title(Session::NameRole); - case (1): - return this->title(Session::DisplayedTitleRole); - default: - return QString(); - } -} - -void Session::setTabTitleFormat(int context , const QString& format) -{ - switch (context) { - case (0): - this->setTabTitleFormat(Session::LocalTabTitle, format); - break; - case (1): - this->setTabTitleFormat(Session::RemoteTabTitle, format); - break; - } -} - -QString Session::tabTitleFormat(int context) const -{ - switch (context) { - case (0): - return this->tabTitleFormat(Session::LocalTabTitle); - case (1): - return this->tabTitleFormat(Session::RemoteTabTitle); - default: - return QString(); - } -} - -int Session::foregroundProcessId() -{ - int pid; - - bool ok = false; - pid = getProcessInfo()->pid(&ok); - if (!ok) - pid = -1; - - return pid; -} - -bool Session::isForegroundProcessActive() -{ - // foreground process info is always updated after this - return updateForegroundProcessInfo() && (processId() != _foregroundPid); -} - -QString Session::foregroundProcessName() -{ - QString name; - - if (updateForegroundProcessInfo()) - { - bool ok = false; - name = _foregroundProcessInfo->name(&ok); - if (!ok) - name.clear(); - } - - return name; -} - -SessionGroup::SessionGroup(QObject* parent) - : QObject(parent), _masterMode(0) -{ -} -SessionGroup::~SessionGroup() -{ -} -int SessionGroup::masterMode() const { return _masterMode; } -QList<Session*> SessionGroup::sessions() const { return _sessions.keys(); } -bool SessionGroup::masterStatus(Session* session) const { return _sessions[session]; } - -void SessionGroup::addSession(Session* session) -{ - connect(session,SIGNAL(finished()),this,SLOT(sessionFinished())); - _sessions.insert(session,false); -} -void SessionGroup::removeSession(Session* session) -{ - disconnect(session,SIGNAL(finished()),this,SLOT(sessionFinished())); - setMasterStatus(session,false); - _sessions.remove(session); -} -void SessionGroup::sessionFinished() -{ - Session* session = qobject_cast<Session*>(sender()); - Q_ASSERT(session); - removeSession(session); -} -void SessionGroup::setMasterMode(int mode) -{ - _masterMode = mode; -} -QList<Session*> SessionGroup::masters() const -{ - return _sessions.keys(true); -} -void SessionGroup::setMasterStatus(Session* session , bool master) -{ - const bool wasMaster = _sessions[session]; - - if (wasMaster == master) { - // No status change -> nothing to do. - return; - } - _sessions[session] = master; - - if(master) { - connect( session->emulation() , SIGNAL(sendData(const char*,int)) , this, - SLOT(forwardData(const char*,int)) ); - } - else { - disconnect( session->emulation() , SIGNAL(sendData(const char*,int)) , this, - SLOT(forwardData(const char*,int)) ); - } -} -void SessionGroup::forwardData(const char* data, int size) -{ - static bool _inForwardData = false; - if(_inForwardData) { // Avoid recursive calls among session groups! - // A recursive call happens when a master in group A calls forwardData() - // in group B. If one of the destination sessions in group B is also a - // master of a group including the master session of group A, this would - // again call forwardData() in group A, and so on. - return; - } - - _inForwardData = true; - QListIterator<Session*> iter(_sessions.keys()); - while(iter.hasNext()) { - Session* other = iter.next(); - if(!_sessions[other]) { - other->emulation()->sendString(data, size); - } - } - _inForwardData = false; -} - -
deleted file mode 100644 --- a/gui/src/Session.h +++ /dev/null @@ -1,752 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - Copyright 2009 by Thomas Dreibholz <dreibh@iem.uni-due.de> - - This program 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 program 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 SESSION_H -#define SESSION_H - -// Qt -#include <QtCore/QStringList> -#include <QtCore/QByteRef> -#include <QtCore/QSize> -#include <QUuid> -#include <QWidget> - -// Konsole -#include "History.h" - -class KProcess; -class KUrl; -class Emulation; -class Pty; -class ProcessInfo; -class TerminalDisplay; - //class ZModemDialog; -/** - * Represents a terminal session consisting of a pseudo-teletype and a terminal emulation. - * The pseudo-teletype (or PTY) handles I/O between the terminal process and Konsole. - * The terminal emulation ( Emulation and subclasses ) processes the output stream from the - * PTY and produces a character image which is then shown on views connected to the session. - * - * Each Session can be connected to one or more views by using the addView() method. - * The attached views can then display output from the program running in the terminal - * or send input to the program in the terminal in the form of keypresses and mouse - * activity. - */ -class Session : public QObject -{ -Q_OBJECT -Q_CLASSINFO("D-Bus Interface", "org.kde.konsole.Session") - -public: - Q_PROPERTY(QString name READ nameTitle) - Q_PROPERTY(int processId READ processId) - Q_PROPERTY(QString keyBindings READ keyBindings WRITE setKeyBindings) - Q_PROPERTY(QSize size READ size WRITE setSize) - - /** - * Constructs a new session. - * - * To start the terminal process, call the run() method, - * after specifying the program and arguments - * using setProgram() and setArguments() - * - * If no program or arguments are specified explicitly, the Session - * falls back to using the program specified in the SHELL environment - * variable. - */ - explicit Session(QObject* parent = 0); - ~Session(); - - /** - * Connect to an existing terminal. When a new Session() is constructed it - * automatically searches for and opens a new teletype. If you want to - * use an existing teletype (given its file descriptor) call this after - * constructing the session. - * - * Calling openTeletype() while a session is running has no effect. - * - * @param masterFd The file descriptor of the pseudo-teletype master (See KPtyProcess::KPtyProcess()) - */ - void openTeletype(int masterFd); - - /** - * Returns true if the session is currently running. This will be true - * after run() has been called successfully. - */ - bool isRunning() const; - - /** - * Adds a new view for this session. - * - * The viewing widget will display the output from the terminal and - * input from the viewing widget (key presses, mouse activity etc.) - * will be sent to the terminal. - * - * Views can be removed using removeView(). The session is automatically - * closed when the last view is removed. - */ - void addView(TerminalDisplay* widget); - /** - * Removes a view from this session. When the last view is removed, - * the session will be closed automatically. - * - * @p widget will no longer display output from or send input - * to the terminal - */ - void removeView(TerminalDisplay* widget); - - /** - * Returns the views connected to this session - */ - QList<TerminalDisplay*> views() const; - - /** - * Returns the terminal emulation instance being used to encode / decode - * characters to / from the process. - */ - Emulation* emulation() const; - - /** Returns the unique ID for this session. */ - int sessionId() const; - - /** - * This enum describes the contexts for which separate - * tab title formats may be specified. - */ - enum TabTitleContext - { - /** Default tab title format */ - LocalTabTitle, - /** - * Tab title format used session currently contains - * a connection to a remote computer (via SSH) - */ - RemoteTabTitle - }; - - /** - * Returns true if the session currently contains a connection to a - * remote computer. It currently supports ssh. - */ - bool isRemote(); - - /** - * Sets the format used by this session for tab titles. - * - * @param context The context whoose format should be set. - * @param format The tab title format. This may be a mixture - * of plain text and dynamic elements denoted by a '%' character - * followed by a letter. (eg. %d for directory). The dynamic - * elements available depend on the @p context - */ - void setTabTitleFormat(TabTitleContext context , const QString& format); - /** Returns the format used by this session for tab titles. */ - QString tabTitleFormat(TabTitleContext context) const; - - - /** Returns the arguments passed to the shell process when run() is called. */ - QStringList arguments() const; - /** Returns the program name of the shell process started when run() is called. */ - QString program() const; - - /** - * Sets the command line arguments which the session's program will be passed when - * run() is called. - */ - void setArguments(const QStringList& arguments); - /** Sets the program to be executed when run() is called. */ - void setProgram(const QString& program); - - /** Returns the session's current working directory. */ - QString initialWorkingDirectory() { return _initialWorkingDir; } - - /** - * Sets the initial working directory for the session when it is run - * This has no effect once the session has been started. - */ - void setInitialWorkingDirectory( const QString& dir ); - - /** - * Returns the current directory of the foreground process in the session - */ - QString currentWorkingDirectory(); - - /** - * Sets the type of history store used by this session. - * Lines of output produced by the terminal are added - * to the history store. The type of history store - * used affects the number of lines which can be - * remembered before they are lost and the storage - * (in memory, on-disk etc.) used. - */ - void setHistoryType(const HistoryType& type); - /** - * Returns the type of history store used by this session. - */ - const HistoryType& historyType() const; - /** - * Clears the history store used by this session. - */ - void clearHistory(); - - /** - * Sets the key bindings used by this session. The bindings - * specify how input key sequences are translated into - * the character stream which is sent to the terminal. - * - * @param id The name of the key bindings to use. The - * names of available key bindings can be determined using the - * KeyboardTranslatorManager class. - */ - void setKeyBindings(const QString& id); - /** Returns the name of the key bindings used by this session. */ - QString keyBindings() const; - - /** - * This enum describes the available title roles. - */ - enum TitleRole - { - /** The name of the session. */ - NameRole, - /** The title of the session which is displayed in tabs etc. */ - DisplayedTitleRole - }; - - /** - * Return the session title set by the user (ie. the program running - * in the terminal), or an empty string if the user has not set a custom title - */ - QString userTitle() const; - - /** Convenience method used to read the name property. Returns title(Session::NameRole). */ - QString nameTitle() const { return title(Session::NameRole); } - /** Returns a title generated from tab format and process information. */ - QString getDynamicTitle(); - - /** Sets the name of the icon associated with this session. */ - void setIconName(const QString& iconName); - /** Returns the name of the icon associated with this session. */ - QString iconName() const; - - /** Return URL for the session. */ - //KUrl getUrl(); - - /** Sets the text of the icon associated with this session. */ - void setIconText(const QString& iconText); - /** Returns the text of the icon associated with this session. */ - QString iconText() const; - - /** Sets the session's title for the specified @p role to @p title. */ - void setTitle(TitleRole role , const QString& title); - - /** Returns the session's title for the specified @p role. */ - QString title(TitleRole role) const; - - /** - * Specifies whether a utmp entry should be created for the pty used by this session. - * If true, KPty::login() is called when the session is started. - */ - void setAddToUtmp(bool); - - /** - * Specifies whether to close the session automatically when the terminal - * process terminates. - */ - void setAutoClose(bool b) { _autoClose = b; } - - /** Returns true if the user has started a program in the session. */ - bool isForegroundProcessActive(); - - /** Returns the name of the current foreground process. */ - QString foregroundProcessName(); - - /** Returns the terminal session's window size in lines and columns. */ - QSize size(); - /** - * Emits a request to resize the session to accommodate - * the specified window size. - * - * @param size The size in lines and columns to request. - */ - void setSize(const QSize& size); - - /** - * Sets whether the session has a dark background or not. The session - * uses this information to set the COLORFGBG variable in the process's - * environment, which allows the programs running in the terminal to determine - * whether the background is light or dark and use appropriate colors by default. - * - * This has no effect once the session is running. - */ - void setDarkBackground(bool darkBackground); - /** - * Returns true if the session has a dark background. - * See setDarkBackground() - */ - bool hasDarkBackground() const; - - /** - * Attempts to get the shell program to redraw the current display area. - * This can be used after clearing the screen, for example, to get the - * shell to redraw the prompt line. - */ - void refresh(); - - // void startZModem(const QString &rz, const QString &dir, const QStringList &list); - // void cancelZModem(); - // bool isZModemBusy() { return _zmodemBusy; } - - /** - * Possible values of the @p what parameter for setUserTitle() - * See "Operating System Controls" section on http://rtfm.etla.org/xterm/ctlseq.html - */ - enum UserTitleChange - { - IconNameAndWindowTitle = 0, - IconName = 1, - WindowTitle = 2, - TextColor = 10, - BackgroundColor = 11, - SessionName = 30, - ProfileChange = 50 // this clashes with Xterm's font change command - }; - - // Sets the text codec used by this sessions terminal emulation. - void setCodec(QTextCodec* codec); - - // session management - //void saveSession(KConfigGroup& group); - //void restoreSession(KConfigGroup& group); - -public slots: - - /** - * Starts the terminal session. - * - * This creates the terminal process and connects the teletype to it. - */ - void run(); - - /** - * Returns the environment of this session as a list of strings like - * VARIABLE=VALUE - */ - Q_SCRIPTABLE QStringList environment() const; - - /** - * Sets the environment for this session. - * @p environment should be a list of strings like - * VARIABLE=VALUE - */ - Q_SCRIPTABLE void setEnvironment(const QStringList& environment); - - /** - * Closes the terminal session. This sends a hangup signal - * (SIGHUP) to the terminal process and causes the finished() - * signal to be emitted. If the process does not respond to the SIGHUP signal - * then the terminal connection (the pty) is closed and Konsole waits for the - * process to exit. - */ - Q_SCRIPTABLE void close(); - - /** - * Changes the session title or other customizable aspects of the terminal - * emulation display. For a list of what may be changed see the - * Emulation::titleChanged() signal. - * - * @param what The feature being changed. Value is one of UserTitleChange - * @param caption The text part of the terminal command - */ - void setUserTitle( int what , const QString &caption ); - - /** - * Enables monitoring for activity in the session. - * This will cause notifySessionState() to be emitted - * with the NOTIFYACTIVITY state flag when output is - * received from the terminal. - */ - Q_SCRIPTABLE void setMonitorActivity(bool); - - /** Returns true if monitoring for activity is enabled. */ - Q_SCRIPTABLE bool isMonitorActivity() const; - - /** - * Enables monitoring for silence in the session. - * This will cause notifySessionState() to be emitted - * with the NOTIFYSILENCE state flag when output is not - * received from the terminal for a certain period of - * time, specified with setMonitorSilenceSeconds() - */ - Q_SCRIPTABLE void setMonitorSilence(bool); - - /** - * Returns true if monitoring for inactivity (silence) - * in the session is enabled. - */ - Q_SCRIPTABLE bool isMonitorSilence() const; - - /** See setMonitorSilence() */ - Q_SCRIPTABLE void setMonitorSilenceSeconds(int seconds); - - /** - * Sets whether flow control is enabled for this terminal - * session. - */ - Q_SCRIPTABLE void setFlowControlEnabled(bool enabled); - - /** Returns whether flow control is enabled for this terminal session. */ - Q_SCRIPTABLE bool flowControlEnabled() const; - - /** - * Sends @p text to the current foreground terminal program. - */ - Q_SCRIPTABLE void sendText(const QString& text) const; - - /** - * Sends a mouse event of type @p eventType emitted by button - * @p buttons on @p column/@p line to the current foreground - * terminal program - */ - Q_SCRIPTABLE void sendMouseEvent(int buttons, int column, int line, int eventType); - - /** - * Returns the process id of the terminal process. - * This is the id used by the system API to refer to the process. - */ - Q_SCRIPTABLE int processId() const; - - /** - * Returns the process id of the terminal's foreground process. - * This is initially the same as processId() but can change - * as the user starts other programs inside the terminal. - */ - Q_SCRIPTABLE int foregroundProcessId(); - - /** Sets the text codec used by this sessions terminal emulation. - * Overloaded to accept a QByteArray for convenience since DBus - * does not accept QTextCodec directky. - */ - Q_SCRIPTABLE bool setCodec(QByteArray codec); - - /** Returns the codec used to decode incoming characters in this - * terminal emulation - */ - Q_SCRIPTABLE 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 - * exported directly through DBus - */ - Q_SCRIPTABLE void setTitle(int role, const QString& title); - - /** Returns the session's title for the specified @p role. - * This is an overloaded member function for setTitle(TitleRole) - * provided for convenience since enum data types may not be - * exported directly through DBus - */ - Q_SCRIPTABLE QString title(int role) const; - - /** Returns the "friendly" version of the QUuid of this session. - * This is a QUuid with the braces and dashes removed, so it cannot be - * used to construct a new QUuid. The same text appears in the - * SHELL_SESSION_ID environment variable. - */ - Q_SCRIPTABLE QString shellSessionId() const; - - /** Sets the session's tab title format for the specified @p context to @p format. - * This is an overloaded member function for setTabTitleFormat(TabTitleContext, QString) - * provided for convenience since enum data types may not be - * exported directly through DBus - */ - Q_SCRIPTABLE void setTabTitleFormat(int context, const QString& format); - - /** Returns the session's tab title format for the specified @p context. - * This is an overloaded member function for tabTitleFormat(TitleRole) - * provided for convenience since enum data types may not be - * exported directly through DBus - */ - Q_SCRIPTABLE QString tabTitleFormat(int context) const; - -signals: - - /** Emitted when the terminal process starts. */ - void started(); - - /** - * Emitted when the terminal process exits. - */ - void finished(); - - /** - * Emitted when output is received from the terminal process. - */ - void receivedData( const QString& text ); - - /** Emitted when the session's title has changed. */ - void titleChanged(); - - /** - * Emitted when the activity state of this session changes. - * - * @param state The new state of the session. This may be one - * of NOTIFYNORMAL, NOTIFYSILENCE or NOTIFYACTIVITY - */ - void stateChanged(int state); - - /** Emitted when a bell event occurs in the session. */ - void bellRequest( const QString& message ); - - /** - * Requests that the color the text for any tabs associated with - * this session should be changed; - * - * TODO: Document what the parameter does - */ - void changeTabTextColorRequest(int); - - /** - * Requests that the background color of views on this session - * should be changed. - */ - void changeBackgroundColorRequest(const QColor&); - /** - * Requests that the text color of views on this session should - * be changed to @p color. - */ - void changeForegroundColorRequest(const QColor&); - - /** TODO: Document me. */ - void openUrlRequest(const QString& url); - - /** TODO: Document me. */ - //void zmodemDetected(); - - /** - * 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. - * - * @param text The text of the command. This is a string of the form - * "PropertyName=Value;PropertyName=Value ..." - */ - void profileChangeCommandReceived(const QString& text); - - /** - * Emitted when the flow control state changes. - * - * @param enabled True if flow control is enabled or false otherwise. - */ - void flowControlEnabledChanged(bool enabled); - -private slots: - void done(int); - - // void fireZModemDetected(); - - 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 zmodemReadStatus(); - //void zmodemReadAndSendBlock(); - //void zmodemRcvBlock(const char *data, int len); - //void zmodemFinished(); - - void updateFlowControlState(bool suspended); - void updateWindowSize(int lines, int columns); -private: - - void updateTerminalSize(); - WId windowId() const; - 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; - ProcessInfo* getProcessInfo(); - void updateSessionProcessInfo(); - bool updateForegroundProcessInfo(); - ProcessInfo* updateWorkingDirectory(); - - QUuid _uniqueIdentifier; // SHELL_SESSION_ID - - Pty* _shellProcess; - Emulation* _emulation; - - QList<TerminalDisplay*> _views; - - bool _monitorActivity; - bool _monitorSilence; - bool _notifiedActivity; - bool _masterMode; - bool _autoClose; - bool _wantedClose; - QTimer* _monitorTimer; - - int _silenceSeconds; - - QString _nameTitle; - QString _displayTitle; - QString _userTitle; - - QString _localTabTitleFormat; - QString _remoteTabTitleFormat; - - QString _iconName; - QString _iconText; // as set by: echo -en '\033]1;IconText\007 - bool _addToUtmp; - bool _flowControl; - bool _fullScripting; - - QString _program; - QStringList _arguments; - - QStringList _environment; - int _sessionId; - - QString _initialWorkingDir; - QString _currentWorkingDir; - - ProcessInfo* _sessionProcessInfo; - ProcessInfo* _foregroundProcessInfo; - int _foregroundPid; - - // ZModem - // bool _zmodemBusy; - // KProcess* _zmodemProc; - // ZModemDialog* _zmodemProgress; - - // Color/Font Changes by ESC Sequences - - QColor _modifiedBackground; // as set by: echo -en '\033]11;Color\007 - - QString _profileKey; - - bool _hasDarkBackground; - - static int lastSessionId; - -}; - -/** - * Provides a group of sessions which is divided into master and slave sessions. - * Activity in master sessions can be propagated to all sessions within the group. - * The type of activity which is propagated and method of propagation is controlled - * by the masterMode() flags. - */ -class SessionGroup : public QObject -{ -Q_OBJECT - -public: - /** Constructs an empty session group. */ - SessionGroup(QObject* parent); - /** Destroys the session group and removes all connections between master and slave sessions. */ - ~SessionGroup(); - - /** Adds a session to the group. */ - void addSession( Session* session ); - /** Removes a session from the group. */ - void removeSession( Session* session ); - - /** Returns the list of sessions currently in the group. */ - QList<Session*> sessions() const; - - /** - * Sets whether a particular session is a master within the group. - * Changes or activity in the group's master sessions may be propagated - * to all the sessions in the group, depending on the current masterMode() - * - * @param session The session whoose master status should be changed. - * @param master True to make this session a master or false otherwise - */ - void setMasterStatus( Session* session , bool master ); - /** Returns the master status of a session. See setMasterStatus() */ - bool masterStatus( Session* session ) const; - - /** - * This enum describes the options for propagating certain activity or - * changes in the group's master sessions to all sessions in the group. - */ - enum MasterMode - { - /** - * Any input key presses in the master sessions are sent to all - * sessions in the group. - */ - CopyInputToAll = 1 - }; - - /** - * Specifies which activity in the group's master sessions is propagated - * to all sessions in the group. - * - * @param mode A bitwise OR of MasterMode flags. - */ - void setMasterMode( int mode ); - /** - * Returns a bitwise OR of the active MasterMode flags for this group. - * See setMasterMode() - */ - int masterMode() const; - -private slots: - void sessionFinished(); - void forwardData(const char* data, int size); - -private: - QList<Session*> masters() const; - - // maps sessions to their master status - QHash<Session*,bool> _sessions; - - int _masterMode; -}; - -#endif - -/* - Local Variables: - mode: c++ - c-file-style: "stroustrup" - indent-tabs-mode: nil - tab-width: 4 - End: -*/
deleted file mode 100644 --- a/gui/src/ShellCommand.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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. -*/ - -// Own -#include "ShellCommand.h" - -//some versions of gcc(4.3) require explicit include -#include <cstdlib> - -// expands environment variables in 'text' -// function copied from kdelibs/kio/kio/kurlcompletion.cpp -static bool expandEnv(QString& text); - -ShellCommand::ShellCommand(const QString& fullCommand) -{ - bool inQuotes = false; - - QString builder; - - for ( int i = 0 ; i < fullCommand.count() ; i++ ) - { - QChar ch = fullCommand[i]; - - const bool isLastChar = ( i == fullCommand.count() - 1 ); - const bool isQuote = ( ch == '\'' || ch == '\"' ); - - if ( !isLastChar && isQuote ) - inQuotes = !inQuotes; - else - { - if ( (!ch.isSpace() || inQuotes) && !isQuote ) - builder.append(ch); - - if ( (ch.isSpace() && !inQuotes) || ( i == fullCommand.count()-1 ) ) - { - _arguments << builder; - builder.clear(); - } - } - } -} -ShellCommand::ShellCommand(const QString& command , const QStringList& arguments) -{ - _arguments = arguments; - - if ( !_arguments.isEmpty() ) - _arguments[0] == command; -} -QString ShellCommand::fullCommand() const -{ - return _arguments.join(QChar(' ')); -} -QString ShellCommand::command() const -{ - if ( !_arguments.isEmpty() ) - return _arguments[0]; - else - return QString(); -} -QStringList ShellCommand::arguments() const -{ - return _arguments; -} -bool ShellCommand::isRootCommand() const -{ - Q_ASSERT(0); // not implemented yet - return false; -} -bool ShellCommand::isAvailable() const -{ - Q_ASSERT(0); // not implemented yet - return false; -} -QStringList ShellCommand::expand(const QStringList& items) -{ - QStringList result; - - foreach( QString item , items ) - result << expand(item); - - return result; -} -QString ShellCommand::expand(const QString& text) -{ - QString result = text; - expandEnv(result); - return result; -} - -/* - * expandEnv - * - * Expand environment variables in text. Escaped '$' characters are ignored. - * Return true if any variables were expanded - */ -static bool expandEnv( QString &text ) -{ - // Find all environment variables beginning with '$' - // - int pos = 0; - - bool expanded = false; - - while ( (pos = text.indexOf(QLatin1Char('$'), pos)) != -1 ) { - - // Skip escaped '$' - // - if ( pos > 0 && text.at(pos-1) == QLatin1Char('\\') ) { - pos++; - } - // Variable found => expand - // - else { - // Find the end of the variable = next '/' or ' ' - // - int pos2 = text.indexOf( QLatin1Char(' '), pos+1 ); - int pos_tmp = text.indexOf( QLatin1Char('/'), pos+1 ); - - if ( pos2 == -1 || (pos_tmp != -1 && pos_tmp < pos2) ) - pos2 = pos_tmp; - - if ( pos2 == -1 ) - pos2 = text.length(); - - // Replace if the variable is terminated by '/' or ' ' - // and defined - // - if ( pos2 >= 0 ) { - int len = pos2 - pos; - QString key = text.mid( pos+1, len-1); - QString value = - QString::fromLocal8Bit( ::getenv(key.toLocal8Bit()) ); - - if ( !value.isEmpty() ) { - expanded = true; - text.replace( pos, len, value ); - pos = pos + value.length(); - } - else { - pos = pos2; - } - } - } - } - - return expanded; -}
deleted file mode 100644 --- a/gui/src/ShellCommand.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> - - Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 - - This program 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 program 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 SHELLCOMMAND_H -#define SHELLCOMMAND_H - -// Qt -#include <QtCore/QStringList> - -/** - * A class to parse and extract information about shell commands. - * - * ShellCommand can be used to: - * - * <ul> - * <li>Take a command-line (eg "/bin/sh -c /path/to/my/script") and split it - * into its component parts (eg. the command "/bin/sh" and the arguments - * "-c","/path/to/my/script") - * </li> - * <li>Take a command and a list of arguments and combine them to - * form a complete command line. - * </li> - * <li>Determine whether the binary specified by a command exists in the - * user's PATH. - * </li> - * <li>Determine whether a command-line specifies the execution of - * another command as the root user using su/sudo etc. - * </li> - * </ul> - */ -class ShellCommand -{ -public: - /** - * Constructs a ShellCommand from a command line. - * - * @param fullCommand The command line to parse. - */ - ShellCommand(const QString& fullCommand); - /** - * Constructs a ShellCommand with the specified @p command and @p arguments. - */ - ShellCommand(const QString& command , const QStringList& arguments); - - /** Returns the command. */ - QString command() const; - /** Returns the arguments. */ - QStringList arguments() const; - - /** - * Returns the full command line. - */ - QString fullCommand() const; - - /** Returns true if this is a root command. */ - bool isRootCommand() const; - /** Returns true if the program specified by @p command() exists. */ - bool isAvailable() const; - - /** Expands environment variables in @p text .*/ - static QString expand(const QString& text); - - /** Expands environment variables in each string in @p list. */ - static QStringList expand(const QStringList& items); - -private: - QStringList _arguments; -}; -#endif // SHELLCOMMAND_H -
deleted file mode 100644 --- a/gui/src/SimpleEditor.cpp +++ /dev/null @@ -1,288 +0,0 @@ -/* Copyright (C) 2010 P.L. Lucas - * - * This program 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 program 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., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "SimpleEditor.h" -#include <QFile> -#include <QTextStream> -#include <QTextBlock> -#include <QFileInfo> -#include <QDir> - -SimpleEditor::SimpleEditor(QWidget *parent) - : QPlainTextEdit(parent), - m_syntaxHighlighter(0), - m_firstTimeUse(true) { - - m_completerModel = new QStringListModel (); - m_completer = new QCompleter(m_completerModel, this); - m_completer->setCompletionMode(QCompleter::PopupCompletion); - m_completer->setWidget(this); - m_autoIndentation = true; - m_automaticIndentationStatement = true; - - QFont font; - font.setFamily("Courier"); - font.setPointSize(10); - setFont(font); - - connect(m_completer, SIGNAL(activated(const QString &)), this, SLOT(activated(const QString &))); - connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChangedCallBack())); - connect(document(), SIGNAL(contentsChange(int, int, int)), this, SLOT(autoComplete(int, int, int))); -} - -void SimpleEditor::loadSyntaxXMLDescription() { - QString installPath = QString("../syntax_files") - + QDir::separator(); - - QFileInfo file(m_currentFileName); - QString suffix = file.suffix(); - - if(m_commandsCompletionList.isEmpty()) { - QString home = QDir::home().path() - + QDir::separator() - + ".qtoctave" - + QDir::separator() - + "commands.txt"; - - QFile file(home); - - if(file.open(QFile::ReadOnly)) { - char buf[1024]; - while(file.readLine(buf, sizeof(buf)) >= 0) { - m_commandsCompletionList.append(QString(buf).trimmed()); - } - file.close(); - } - } - - QFileInfo xml(installPath + suffix + ".xml"); - if(xml.exists()) { - m_syntaxHighlighter = new SyntaxHighlighter(document()); - m_syntaxHighlighter->load(xml.absoluteFilePath()); - m_syntaxHighlighter->setDocument(document()); - } -} - -bool SimpleEditor::load(QString file) { - if(file.isEmpty()) { - setPlainText(""); - m_currentFileName = file; - return true; - } - - FILE *input = fopen(file.toLocal8Bit().data(),"r"); - if(!input) - return false; - fclose(input); - QFile in(file); - if(!in.open(QIODevice::ReadOnly | QIODevice::Text)) { - return false; - } - QByteArray data = in.readAll(); - setPlainText(QString::fromLocal8Bit(data)); - m_currentFileName = file; - m_firstTimeUse = false; - - loadSyntaxXMLDescription(); - - return true; -} - -bool SimpleEditor::save() { - QFile::remove(m_currentFileName + "~"); - QFile::copy(m_currentFileName, m_currentFileName + "~"); - FILE *out=fopen(m_currentFileName.toLocal8Bit().data(),"w"); - if(!out) - return false; - fprintf(out, "%s", toPlainText().toLocal8Bit().data()); - fclose(out); - document()->setModified(false); - return true; -} - -void SimpleEditor::keyPressEvent(QKeyEvent * keyEvent) { - //In all cases completer popup must been hided. - if(keyEvent->key() != Qt::Key_Return && keyEvent->key() != Qt::Key_Enter) { - QAbstractItemView *view = m_completer->popup(); - if(view->isVisible()) view->hide(); - } - - if(keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) { - QAbstractItemView *view = m_completer->popup(); - if(view->isVisible()) { - QString word = view->currentIndex().data().toString(); - if(word.isEmpty()) { - word = m_completer->currentCompletion(); - } - activated(word); - return; - } else if(m_autoIndentation) { - QTextCursor cursor = textCursor(); - QString line = cursor.block().text(); - QString line2 = line; - for(int i=0;i<line.length();i++) { - if(line[i] != ' ' && line[i] != '\t') { - line.resize(i); - break; - } - } - - cursor.insertText("\n" + line); - if(m_automaticIndentationStatement) { - QRegExp re("^while .*|^if .*|^for .*|^switch .*|^do$|^try|^function .*|^else$|^elseif .*"); - if(re.exactMatch(line2.trimmed())) { - cursor.insertText("\t"); - } - } - setTextCursor(cursor); - } else { - QPlainTextEdit::keyPressEvent(keyEvent); - } - } else if(keyEvent->key() == Qt::Key_Tab) { - QTextCursor cursor=textCursor(); - int start=cursor.selectionStart(); - int end=cursor.selectionEnd(); - if(start == end) { - QPlainTextEdit::keyPressEvent(keyEvent); - return; - } - cursor.beginEditBlock(); - cursor.setPosition(end); - end=cursor.blockNumber(); - cursor.setPosition(start); - cursor.movePosition(QTextCursor::StartOfBlock); - while(true) { - cursor.insertText("\t"); - if(cursor.blockNumber()>=end) { - break; - } - cursor.movePosition(QTextCursor::NextBlock); - } - cursor.endEditBlock(); - } else if(keyEvent->key()==Qt::Key_Backtab) { - QTextCursor cursor=textCursor(); - int start=cursor.selectionStart(); - int end=cursor.selectionEnd(); - if(start==end) { - QPlainTextEdit::keyPressEvent(keyEvent); - return; - } - cursor.beginEditBlock(); - cursor.setPosition(end); - end=cursor.blockNumber(); - cursor.setPosition(start); - cursor.movePosition(QTextCursor::StartOfBlock); - while(true) { - QString line=cursor.block().text(); - if(line.length()>0 && (line[0]==' ' || line[0] =='\t')) { - cursor.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor); - cursor.removeSelectedText(); - } - if(cursor.blockNumber()>=end) break; - cursor.movePosition(QTextCursor::NextBlock); - cursor.movePosition(QTextCursor::StartOfBlock); - } - cursor.endEditBlock(); - } else { - if(keyEvent->key()==(Qt::Key_B) && Qt::ControlModifier==keyEvent->modifiers()) { - autoComplete(0); - return; - } - QPlainTextEdit::keyPressEvent(keyEvent); - } -} - -void SimpleEditor::setCharFormat(QTextCharFormat charFormat) { - this->m_charFormat=charFormat; - QTextCursor cursor=textCursor(); - cursor.movePosition(QTextCursor::Start); - cursor.setCharFormat(charFormat); - cursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); - setFont(charFormat.font()); - - QFontMetrics fm(charFormat.font()); - int textWidthInPixels = fm.width(" "); - setTabStopWidth(textWidthInPixels); -} - -void SimpleEditor::activated(const QString& text) { - QAbstractItemView *view=m_completer->popup(); - QTextCursor cursor=textCursor(); - cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor); - cursor.insertText(text); - view->hide(); -} - -void SimpleEditor::autoComplete(int position, int charsRemoved, int charsAdded) { - if(charsAdded==1) - autoComplete(); -} - -void SimpleEditor::autoComplete(int size) { - QTextCursor cursor = textCursor(); - cursor.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor); - if(cursor.selectedText().endsWith(" ") - || cursor.selectedText().trimmed().length() < size) { - return; - } - - QStringList list=toPlainText().split(QRegExp("\\W+")); - list.removeDuplicates(); - list.removeOne(cursor.selectedText()); - list.sort(); - list.append(m_commandsCompletionList); - - m_completerModel->setStringList(list); - m_completer->setCompletionPrefix(cursor.selectedText()); - - if(m_completer->completionCount() > 0) { - QRect r=cursorRect(cursor); - r.setWidth(200); - m_completer->complete(r); - } -} - -QString SimpleEditor::getFileName() { - return m_currentFileName; -} - -void SimpleEditor::setFile(QString file) { - m_currentFileName = file; - loadSyntaxXMLDescription(); -} - -void SimpleEditor::cursorPositionChangedCallBack() { - if(m_syntaxHighlighter) - m_syntaxHighlighter->setFormatPairBrackets(this); -} - -void SimpleEditor::publicBlockBoundingRectList(QVector<qreal> &list, int &firstLine) { - qreal pageBottom = height(); - QPointF offset = contentOffset(); - QTextBlock block = firstVisibleBlock(); - firstLine = block.blockNumber() + 1; - qreal first_position = blockBoundingGeometry(block).topLeft().y(); - for(; block.isValid(); block = block.next()) { - QRectF position = blockBoundingGeometry(block); - qreal y = position.topLeft().y() + offset.y() - first_position; - if(y > pageBottom) - break; - list.append(y); - } -} -
deleted file mode 100644 --- a/gui/src/SimpleEditor.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (C) 2010 P.L. Lucas - * - * This program 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 program 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., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef SIMPLEEDITOR_H -#define SIMPLEEDITOR_H - -#include <QPlainTextEdit> -#include <QCompleter> -#include <QStringListModel> -#include "SyntaxHighlighter.h" - -class SimpleEditor : public QPlainTextEdit { - Q_OBJECT -public: - SimpleEditor(QWidget * parent = 0); - bool load(QString file); - bool save(); - QString getFileName(); - void setFile(QString file); - void setCharFormat(QTextCharFormat m_charFormat); - void publicBlockBoundingRectList(QVector<qreal> &list, int &firstLine); - void loadSyntaxXMLDescription(); - -public slots: - void activated(const QString& text); - void cursorPositionChangedCallBack(); - void autoComplete(int size = 3); - void autoComplete(int position, int charsRemoved, int charsAdded); - -protected: - virtual void keyPressEvent(QKeyEvent * e); - -private: - bool m_firstTimeUse; - QString m_currentFileName; - QTextCharFormat m_charFormat; - QCompleter *m_completer; - QStringListModel *m_completerModel; - SyntaxHighlighter *m_syntaxHighlighter; - QStringList m_commandsCompletionList; - bool m_autoIndentation; - bool m_automaticIndentationStatement; -}; - -#endif // SIMPLEEDITOR_H -
deleted file mode 100644 --- a/gui/src/SyntaxHighlighter.cpp +++ /dev/null @@ -1,486 +0,0 @@ -/* Copyright (C) 2010 P.L. Lucas - * - * This program 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 program 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., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - */ - - -#include "SyntaxHighlighter.h" -#include <QXmlStreamReader> -#include <QStack> -#include <QFile> -#include <stdio.h> - -SyntaxHighlighter::SyntaxHighlighter(QObject * parent):QSyntaxHighlighter(parent) -{ -} - - -bool SyntaxHighlighter::load(QString file) -{ - QXmlStreamReader xml; - QStack <QString> stack; - QFile fileDevice(file); - if (!fileDevice.open(QFile::ReadOnly | QFile::Text)) { - return false; - } - - xml.setDevice(&fileDevice); - - QMap <QString,QString> values; - - QVector<QString> xmlMainItems; - xmlMainItems << "item" << "block" << "bracket"; - - int ruleOrder=0; - - while (!xml.atEnd()) - { - QXmlStreamReader::TokenType tokenType=xml.readNext(); - switch(tokenType) - { - case QXmlStreamReader::StartElement: - if(xml.name()!="syntax") - { - if( xmlMainItems.contains(xml.name().toString()) ) - stack.push(xml.name().toString()); - else - values[xml.name().toString()]=xml.readElementText().trimmed(); - } - break; - case QXmlStreamReader::EndElement: - if(stack.isEmpty()) break; - QString name=stack.top(); - if(name==xml.name()) stack.pop(); - if(stack.isEmpty()) - { - QTextCharFormat format; - if(values.contains("bold") && values["bold"]=="true") format.setFontWeight(QFont::Bold); - if(values.contains("underline") && values["underline"]=="true") format.setFontUnderline(true); - if(values.contains("italic") && values["italic"]=="true") format.setFontItalic(true); - if(values.contains("foreground")) format.setForeground(QBrush(QColor(values["foreground"]))); - if(values.contains("background")) format.setBackground(QBrush(QColor(values["background"]))); - if(name=="item") - { - HighlightingRule rule; - rule.format=format; - rule.pattern=QRegExp(values["pattern"]); - rule.ruleOrder=ruleOrder++; - highlightingRules.append(rule); - values.clear(); - } - else if(name=="block" || name=="bracket") - { - HighlightingBlockRule rule; - rule.format=format; - rule.startPattern=QRegExp(values["startPattern"]); - rule.endPattern=QRegExp(values["endPattern"]); - rule.ruleOrder=ruleOrder++; - if(name=="block") highlightingBlockRules.append(rule); - else highlightingBracketsRules.append(rule); //Bracket rule - values.clear(); - } - } - break; - } - } - if (xml.hasError()) - { - // do error handling - printf("Error %s: %ld:%ld %s\n", file.toLocal8Bit().data(), xml.lineNumber(), xml.columnNumber(), xml.errorString().toLocal8Bit().data() ); - return false; - } - - return true; -} - -SyntaxHighlighter::Rule1st SyntaxHighlighter::highlight1stRule(const QString & text, int startIndex) -{ - Rule1st rule1st; - rule1st.startIndex=text.length(); - rule1st.rule=-1; - - for(int i=0; i<highlightingRules.size(); i++) - { - HighlightingRule *rule=&(highlightingRules[i]); - - QRegExp *expression = &(rule->pattern); - int index = rule->lastFound; - if(index>-1 && index<startIndex) - { - rule->lastFound = index = expression->indexIn(text, startIndex); - } - if ( index>-1 && index<rule1st.startIndex ) - { - rule1st.startIndex=index; - rule1st.length=expression->matchedLength(); - rule1st.rule=i; - rule1st.ruleOrder=rule->ruleOrder; - } - - if(index==startIndex) break; - } - - if(rule1st.rule==-1) rule1st.startIndex=-1; - - return rule1st; -} - -SyntaxHighlighter::Rule1st SyntaxHighlighter::highlight1stBlockRule(const QString & text, int startIndex) -{ - Rule1st rule1st; - rule1st.startIndex=text.length(); - rule1st.rule=-1; - - for(int i=0; i<highlightingBlockRules.size(); i++) - { - HighlightingBlockRule rule=highlightingBlockRules[i]; - - int index = rule.startPattern.indexIn(text, startIndex); - - if ( index>-1 && index<rule1st.startIndex ) - { - rule1st.startIndex=index; - rule1st.rule=i; - rule1st.ruleOrder=rule.ruleOrder; - } - - if(index==startIndex) break; - } - - if(rule1st.rule==-1) rule1st.startIndex=-1; - - return rule1st; -} - -/**Inserts brackets in position order in blockData->brackets - */ -static void insertInOrder(BlockData *blockData, BlockData::Bracket &bracket) -{ - if(blockData->brackets.isEmpty()) blockData->brackets.append(bracket); - else - { - int j=0; - - for(;j<blockData->brackets.size();j++) - { - if(blockData->brackets[j].pos>bracket.pos) - { - blockData->brackets.insert(j,bracket); - break; - } - } - if(j>=blockData->brackets.size()) - { - blockData->brackets.append(bracket); - } - } -} - - -void SyntaxHighlighter::findBrackets(const QString & text, int start, int end, BlockData *blockData) -{ - //blockData->brackets.clear(); - - if( end<0 || end>text.length() ) end=text.length(); - - if(start>end) return; - - for(int i=0; i<highlightingBracketsRules.size(); i++) - { - HighlightingBlockRule rule=highlightingBracketsRules[i]; - - int startIndex=start; - - int index = rule.startPattern.indexIn(text, startIndex); - - while( index>-1 && index<end ) - { - BlockData::Bracket bracket; - bracket.pos=index; - bracket.type=i; - bracket.length=rule.startPattern.matchedLength(); - bracket.startBracketOk=true; - - startIndex=index+bracket.length; - - insertInOrder(blockData, bracket); - index = rule.startPattern.indexIn(text, startIndex); - } - - startIndex=start; - - index = rule.endPattern.indexIn(text, startIndex); - - - - while( index>-1 && index<end ) - { - BlockData::Bracket bracket; - bracket.pos=index; - bracket.type=i; - bracket.length=rule.endPattern.matchedLength(); - bracket.startBracketOk=false; - insertInOrder(blockData, bracket); - startIndex=index+bracket.length; - index = rule.endPattern.indexIn(text, startIndex); - } - } -} - - -int SyntaxHighlighter::ruleSetFormat(Rule1st rule1st) -{ - HighlightingRule rule=highlightingRules[rule1st.rule]; - - setFormat(rule1st.startIndex, rule1st.length, rule.format); - - return rule1st.startIndex + rule1st.length; -} - - -int SyntaxHighlighter::blockRuleSetFormat(const QString & text, Rule1st rule1st) -{ - HighlightingBlockRule rule=highlightingBlockRules[rule1st.rule]; - - int endIndex = rule.endPattern.indexIn(text, rule1st.startIndex); - int commentLength; - if (endIndex == -1) - { - setCurrentBlockState(rule1st.rule); - commentLength = text.length() - rule1st.startIndex; - setFormat(rule1st.startIndex, commentLength, rule.format); - return text.length(); - } - else - { - commentLength = endIndex - rule1st.startIndex - + rule.endPattern.matchedLength(); - setFormat(rule1st.startIndex, commentLength, rule.format); - - return endIndex+1; - } -} - - -void SyntaxHighlighter::highlightBlock ( const QString & text ) -{ - - setCurrentBlockState(-1); - - int startIndex = 0; - - //Checks previous block state - if (previousBlockState() >= 0) - { - Rule1st rule1st; - rule1st.rule=previousBlockState(); - rule1st.startIndex=0; - - startIndex=blockRuleSetFormat(text,rule1st); - - //TODO: Posible fallo al establecer el estado del bloque - - if(startIndex==text.length()) return; - } - - //Gets BlockData - BlockData *blockData=new BlockData(); - - //Finds first rule to apply. - - Rule1st rule1st, blockRule1st; - - //Find initial matches - for(int i=0; i<highlightingRules.size(); i++) - { - HighlightingRule *rule= &(highlightingRules[i]); - QRegExp *expression = &(rule->pattern); - int index = expression->indexIn(text, startIndex); - rule->lastFound = index; - } - - rule1st=highlight1stRule( text, startIndex); - blockRule1st=highlight1stBlockRule( text, startIndex); - - while(rule1st.rule>=0 || blockRule1st.rule>=0) - { - if(rule1st.rule>=0 && blockRule1st.rule>=0) - { - if - ( - rule1st.startIndex<blockRule1st.startIndex - || - ( - rule1st.startIndex==blockRule1st.startIndex - && - rule1st.ruleOrder<blockRule1st.ruleOrder - ) - ) - { - findBrackets(text, startIndex, rule1st.startIndex, blockData); - startIndex=ruleSetFormat(rule1st); - rule1st=highlight1stRule( text, startIndex); - } - else - { - findBrackets(text, startIndex, blockRule1st.startIndex, blockData); - startIndex=blockRuleSetFormat(text,blockRule1st); - blockRule1st=highlight1stBlockRule( text, startIndex); - } - } - else if(rule1st.rule>=0) - { - findBrackets(text, startIndex, rule1st.startIndex, blockData); - startIndex=ruleSetFormat(rule1st); - rule1st=highlight1stRule( text, startIndex); - } - else - { - findBrackets(text, startIndex, blockRule1st.startIndex, blockData); - startIndex=blockRuleSetFormat(text,blockRule1st); - blockRule1st=highlight1stBlockRule( text, startIndex); - } - } - - findBrackets(text,startIndex, -1, blockData); - - setCurrentBlockUserData(blockData); -} - -/**Search brackets in one QTextBlock.*/ -static BlockData::Bracket *searchBracket(int i, int increment, int &bracketsCount, BlockData *blockData, BlockData::Bracket *bracket1) -{ - if(blockData==NULL) return NULL; - - if(i==-1) i=blockData->brackets.size()-1; - - for(; i>=0 && i<blockData->brackets.size(); i+=increment) - { - BlockData::Bracket *bracket=&(blockData->brackets[i]); - if(bracket->type==bracket1->type) - { - if(bracket->startBracketOk!=bracket1->startBracketOk) - bracketsCount--; - else - bracketsCount++; - - if(bracketsCount==0) - return bracket; - } - } - - //printf("[searchBracket] bracketsCount=%d\n", bracketsCount); - - return NULL; -} - -void SyntaxHighlighter::setFormatPairBrackets(QPlainTextEdit *textEdit) -{ - QList<QTextEdit::ExtraSelection> selections; - - textEdit->setExtraSelections(selections); - - QTextCursor cursor=textEdit->textCursor(); - QTextBlock block=cursor.block(); - BlockData *blockData=(BlockData *)block.userData(); - if(blockData==NULL) return; - - int pos=cursor.position()-block.position(); - - BlockData::Bracket *bracket1; - QTextBlock block_bracket1=block; - - int i=blockData->brackets.size()-1; - for(; i>=0; i--) - { - BlockData::Bracket *bracket=&(blockData->brackets[i]); - if(bracket->pos==pos) - { - bracket1=bracket; - break; - } - } - - if(i<0) return; - - int increment=(bracket1->startBracketOk) ? +1:-1; - int bracketsCount=0; - //Looks in this block the other bracket - BlockData::Bracket *bracket2=NULL; - QTextBlock block_bracket2=block; - - bracket2=searchBracket( i, increment, bracketsCount, blockData, bracket1); - - { //Search brackets in other blocks - while( bracket2==NULL ) - { - if(increment>0) - { - block_bracket2=block_bracket2.next(); - i=0; - } - else - { - block_bracket2=block_bracket2.previous(); - i=-1; - } - - if(!block_bracket2.isValid()) break; - - blockData=(BlockData *)block_bracket2.userData(); - /* - printf("[Syntax::setFormatPairBrackets] Interno brackets.size=%d\n", blockData->brackets.size()); - for(int x=0;x<blockData->brackets.size();x++) - { - BlockData::Bracket *bracket=&(blockData->brackets[x]); - printf("[Syntax::setFormatPairBrackets] bracket.pos=%d bracket.type=%d bracket.len=%d bracket.start=%d\n", bracket->pos, bracket->type, bracket->length, (bracket->startBracketOk) ); - } - */ - - bracket2=searchBracket( i, increment, bracketsCount, blockData, bracket1); - } - - if(bracket2==NULL) return; - } - - pos=cursor.position(); - - QTextEdit::ExtraSelection selection1; - - cursor.setPosition(pos+bracket1->length, QTextCursor::KeepAnchor); - selection1.cursor=cursor; - selection1.format=highlightingBracketsRules[bracket1->type].format; - - pos=bracket2->pos+block_bracket2.position(); - QTextEdit::ExtraSelection selection2; - cursor.setPosition(pos); - cursor.setPosition(pos+bracket2->length, QTextCursor::KeepAnchor); - selection2.cursor=cursor; - selection2.format=highlightingBracketsRules[bracket2->type].format; - - selections.append(selection1); selections.append(selection2); - - textEdit->setExtraSelections(selections); - -} - - - -BlockData::BlockData():QTextBlockUserData() -{ -} - -
deleted file mode 100644 --- a/gui/src/SyntaxHighlighter.h +++ /dev/null @@ -1,107 +0,0 @@ -/* Copyright (C) 2010 P.L. Lucas - * - * This program 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 program 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., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __SYNTAX_H__ -#define __SYNTAX_H__ - -#include <QSyntaxHighlighter> -#include <QTextBlockUserData> -#include <QVector> -#include <QPlainTextEdit> - -class BlockData:public QTextBlockUserData -{ - public: - BlockData(); - - struct Bracket - { - int type; //Type of bracket - int pos; //Position of bracket - int length; //Number of chars of bracket - bool startBracketOk; //Is it a start or end bracket? - }; - - QVector <Bracket> brackets; -}; - -class SyntaxHighlighter:public QSyntaxHighlighter -{ - Q_OBJECT - - struct HighlightingRule - { - QRegExp pattern; - QTextCharFormat format; - int ruleOrder; - int lastFound; - }; - - QVector<HighlightingRule> highlightingRules; - - struct HighlightingBlockRule - { - QRegExp startPattern, endPattern; - QTextCharFormat format; - int ruleOrder; - }; - - QVector<HighlightingBlockRule> highlightingBlockRules; - QVector<HighlightingBlockRule> highlightingBracketsRules; - - struct Rule1st - { - int rule; - int startIndex; - int length; - int ruleOrder; - }; - - /**1st rule to apply from startIndex. - */ - Rule1st highlight1stRule(const QString & text, int startIndex); - - /**1st block rule to apply from startIndex. - */ - Rule1st highlight1stBlockRule(const QString & text, int startIndex); - - /** Set format using rule. - */ - int ruleSetFormat(Rule1st rule); - - /** Set format using block rule. - */ - int blockRuleSetFormat(const QString & text, Rule1st rule1st); - - /** Finds brackets and put them in BlockData. - */ - void findBrackets(const QString & text, int start, int end, BlockData *blockData); - - public: - - SyntaxHighlighter(QObject * parent = 0); - bool load(QString file); - - /**Formats pair of brackets - */ - void setFormatPairBrackets(QPlainTextEdit *textEdit); - - protected: - void highlightBlock ( const QString & text ); -}; -#endif
deleted file mode 100644 --- a/gui/src/TerminalCharacterDecoder.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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 Lesser 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. -*/ - -// Own -#include "TerminalCharacterDecoder.h" - -// Qt -#include <QtCore/QTextStream> - -// Konsole -#include "konsole_wcwidth.h" - -PlainTextDecoder::PlainTextDecoder() - : _output(0) - , _includeTrailingWhitespace(true) - , _recordLinePositions(false) -{ - -} -void PlainTextDecoder::setTrailingWhitespace(bool enable) -{ - _includeTrailingWhitespace = enable; -} -bool PlainTextDecoder::trailingWhitespace() const -{ - return _includeTrailingWhitespace; -} -void PlainTextDecoder::begin(QTextStream* output) -{ - _output = output; - if (!_linePositions.isEmpty()) - _linePositions.clear(); -} -void PlainTextDecoder::end() -{ - _output = 0; -} - -void PlainTextDecoder::setRecordLinePositions(bool record) -{ - _recordLinePositions = record; -} -QList<int> PlainTextDecoder::linePositions() const -{ - return _linePositions; -} -void PlainTextDecoder::decodeLine(const Character* const characters, int count, LineProperty /*properties*/ - ) -{ - Q_ASSERT( _output ); - - if (_recordLinePositions && _output->string()) - { - int pos = _output->string()->count(); - _linePositions << pos; - } - - //TODO should we ignore or respect the LINE_WRAPPED line property? - - //note: we build up a QString and send it to the text stream rather writing into the text - //stream a character at a time because it is more efficient. - //(since QTextStream always deals with QStrings internally anyway) - QString plainText; - plainText.reserve(count); - - int outputCount = count; - - // if inclusion of trailing whitespace is disabled then find the end of the - // line - if ( !_includeTrailingWhitespace ) - { - for (int i = count-1 ; i >= 0 ; i--) - { - if ( characters[i].character != ' ' ) - break; - else - outputCount--; - } - } - - for (int i=0;i<outputCount;) - { - plainText.append( QChar(characters[i].character) ); - i += qMax(1,konsole_wcwidth(characters[i].character)); - } - *_output << plainText; -} - -HTMLDecoder::HTMLDecoder() : - _output(0) - ,_colorTable(base_color_table) - ,_innerSpanOpen(false) - ,_lastRendition(DEFAULT_RENDITION) -{ - -} - -void HTMLDecoder::begin(QTextStream* output) -{ - _output = output; - - QString text; - - //open monospace span - openSpan(text,"font-family:monospace"); - - *output << text; -} - -void HTMLDecoder::end() -{ - Q_ASSERT( _output ); - - QString text; - - closeSpan(text); - - *_output << text; - - _output = 0; - -} - -//TODO: Support for LineProperty (mainly double width , double height) -void HTMLDecoder::decodeLine(const Character* const characters, int count, LineProperty /*properties*/ - ) -{ - Q_ASSERT( _output ); - - QString text; - - int spaceCount = 0; - - for (int i=0;i<count;i++) - { - QChar ch(characters[i].character); - - //check if appearance of character is different from previous char - if ( characters[i].rendition != _lastRendition || - characters[i].foregroundColor != _lastForeColor || - characters[i].backgroundColor != _lastBackColor ) - { - if ( _innerSpanOpen ) - closeSpan(text); - - _lastRendition = characters[i].rendition; - _lastForeColor = characters[i].foregroundColor; - _lastBackColor = characters[i].backgroundColor; - - //build up style string - QString style; - - bool useBold; - ColorEntry::FontWeight weight = characters[i].fontWeight(_colorTable); - if (weight == ColorEntry::UseCurrentFormat) - useBold = _lastRendition & RE_BOLD; - else - useBold = weight == ColorEntry::Bold; - - if (useBold) - style.append("font-weight:bold;"); - - if ( _lastRendition & RE_UNDERLINE ) - style.append("font-decoration:underline;"); - - //colours - a colour table must have been defined first - if ( _colorTable ) - { - style.append( QString("color:%1;").arg(_lastForeColor.color(_colorTable).name() ) ); - - if (!characters[i].isTransparent(_colorTable)) - { - style.append( QString("background-color:%1;").arg(_lastBackColor.color(_colorTable).name() ) ); - } - } - - //open the span with the current style - openSpan(text,style); - _innerSpanOpen = true; - } - - //handle whitespace - if (ch.isSpace()) - spaceCount++; - else - spaceCount = 0; - - - //output current character - if (spaceCount < 2) - { - //escape HTML tag characters and just display others as they are - if ( ch == '<' ) - text.append("<"); - else if (ch == '>') - text.append(">"); - else - text.append(ch); - } - else - { - text.append(" "); //HTML truncates multiple spaces, so use a space marker instead - } - - } - - //close any remaining open inner spans - if ( _innerSpanOpen ) - closeSpan(text); - - //start new line - text.append("<br>"); - - *_output << text; -} -void HTMLDecoder::openSpan(QString& text , const QString& style) -{ - text.append( QString("<span style=\"%1\">").arg(style) ); -} - -void HTMLDecoder::closeSpan(QString& text) -{ - text.append("</span>"); -} - -void HTMLDecoder::setColorTable(const ColorEntry* table) -{ - _colorTable = table; -}
deleted file mode 100644 --- a/gui/src/TerminalCharacterDecoder.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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 Lesser 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 TERMINAL_CHARACTER_DECODER_H -#define TERMINAL_CHARACTER_DECODER_H - -#include "Character.h" - -#include <QList> - -class QTextStream; - -/** - * Base class for terminal character decoders - * - * The decoder converts lines of terminal characters which consist of a unicode character, foreground - * and background colours and other appearance-related properties into text strings. - * - * Derived classes may produce either plain text with no other colour or appearance information, or - * they may produce text which incorporates these additional properties. - */ -class TerminalCharacterDecoder -{ -public: - virtual ~TerminalCharacterDecoder() {} - - /** Begin decoding characters. The resulting text is appended to @p output. */ - virtual void begin(QTextStream* output) = 0; - /** End decoding. */ - virtual void end() = 0; - - /** - * Converts a line of terminal characters with associated properties into a text string - * and writes the string into an output QTextStream. - * - * @param characters An array of characters of length @p count. - * @param count The number of characters - * @param properties Additional properties which affect all characters in the line - */ - virtual void decodeLine(const Character* const characters, - int count, - LineProperty properties) = 0; -}; - -/** - * A terminal character decoder which produces plain text, ignoring colours and other appearance-related - * properties of the original characters. - */ -class PlainTextDecoder : public TerminalCharacterDecoder -{ -public: - PlainTextDecoder(); - - /** - * Set whether trailing whitespace at the end of lines should be included - * in the output. - * Defaults to true. - */ - void setTrailingWhitespace(bool enable); - /** - * Returns whether trailing whitespace at the end of lines is included - * in the output. - */ - bool trailingWhitespace() const; - /** - * Returns of character positions in the output stream - * at which new lines where added. Returns an empty if setTrackLinePositions() is false or if - * the output device is not a string. - */ - QList<int> linePositions() const; - /** Enables recording of character positions at which new lines are added. See linePositions() */ - void setRecordLinePositions(bool record); - - virtual void begin(QTextStream* output); - virtual void end(); - - virtual void decodeLine(const Character* const characters, - int count, - LineProperty properties); - - -private: - QTextStream* _output; - bool _includeTrailingWhitespace; - - bool _recordLinePositions; - QList<int> _linePositions; -}; - -/** - * A terminal character decoder which produces pretty HTML markup - */ -class HTMLDecoder : public TerminalCharacterDecoder -{ -public: - /** - * Constructs an HTML decoder using a default black-on-white color scheme. - */ - HTMLDecoder(); - - /** - * Sets the colour table which the decoder uses to produce the HTML colour codes in its - * output - */ - void setColorTable( const ColorEntry* table ); - - virtual void decodeLine(const Character* const characters, - int count, - LineProperty properties); - - virtual void begin(QTextStream* output); - virtual void end(); - -private: - void openSpan(QString& text , const QString& style); - void closeSpan(QString& text); - - QTextStream* _output; - const ColorEntry* _colorTable; - bool _innerSpanOpen; - quint8 _lastRendition; - CharacterColor _lastForeColor; - CharacterColor _lastBackColor; - -}; - -#endif
deleted file mode 100644 --- a/gui/src/TerminalDisplay.cpp +++ /dev/null @@ -1,2975 +0,0 @@ -/* - This file is part of Konsole, a terminal emulator for KDE. - - Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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. -*/ - -// Own -#include "TerminalDisplay.h" - -// Qt -#include <QtGui/QApplication> -#include <QtGui/QBoxLayout> -#include <QtGui/QClipboard> -#include <QtGui/QKeyEvent> -#include <QtCore/QEvent> -#include <QtCore/QTime> -#include <QtCore/QFile> -#include <QtGui/QGridLayout> -#include <QtGui/QLabel> -#include <QtGui/QLayout> -#include <QtGui/QPainter> -#include <QtGui/QPixmap> -#include <QtGui/QScrollBar> -#include <QtGui/QStyle> -#include <QtCore/QTimer> -#include <QtGui/QToolTip> -#include <QtCore/QTextStream> - -#include "Filter.h" -#include "konsole_wcwidth.h" -#include "ScreenWindow.h" -#include "TerminalCharacterDecoder.h" - -#ifndef loc -#define loc(X,Y) ((Y)*_columns+(X)) -#endif - -#define yMouseScroll 1 - -#define REPCHAR "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ - "abcdefgjijklmnopqrstuvwxyz" \ - "0123456789./+@" - -const ColorEntry base_color_table[TABLE_COLORS] = -// The following are almost IBM standard color codes, with some slight -// gamma correction for the dim colors to compensate for bright X screens. -// It contains the 8 ansiterm/xterm colors in 2 intensities. -{ - // Fixme: could add faint colors here, also. - // normal - ColorEntry(QColor(0x00,0x00,0x00), 0), ColorEntry( QColor(0xB2,0xB2,0xB2), 1), // Dfore, Dback - ColorEntry(QColor(0x00,0x00,0x00), 0), ColorEntry( QColor(0xB2,0x18,0x18), 0), // Black, Red - ColorEntry(QColor(0x18,0xB2,0x18), 0), ColorEntry( QColor(0xB2,0x68,0x18), 0), // Green, Yellow - ColorEntry(QColor(0x18,0x18,0xB2), 0), ColorEntry( QColor(0xB2,0x18,0xB2), 0), // Blue, Magenta - ColorEntry(QColor(0x18,0xB2,0xB2), 0), ColorEntry( QColor(0xB2,0xB2,0xB2), 0), // Cyan, White - // intensiv - ColorEntry(QColor(0x00,0x00,0x00), 0), ColorEntry( QColor(0xFF,0xFF,0xFF), 1), - ColorEntry(QColor(0x68,0x68,0x68), 0), ColorEntry( QColor(0xFF,0x54,0x54), 0), - ColorEntry(QColor(0x54,0xFF,0x54), 0), ColorEntry( QColor(0xFF,0xFF,0x54), 0), - ColorEntry(QColor(0x54,0x54,0xFF), 0), ColorEntry( QColor(0xFF,0x54,0xFF), 0), - ColorEntry(QColor(0x54,0xFF,0xFF), 0), ColorEntry( QColor(0xFF,0xFF,0xFF), 0) -}; - -// scroll increment used when dragging selection at top/bottom of window. - -// static -bool TerminalDisplay::_antialiasText = true; -bool TerminalDisplay::HAVE_TRANSPARENCY = false; - -// we use this to force QPainter to display text in LTR mode -// more information can be found in: http://unicode.org/reports/tr9/ -const QChar LTR_OVERRIDE_CHAR( 0x202D ); - -/* ------------------------------------------------------------------------- */ -/* */ -/* Colors */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* Note that we use ANSI color order (bgr), while IBMPC color order is (rgb) - - Code 0 1 2 3 4 5 6 7 - ----------- ------- ------- ------- ------- ------- ------- ------- ------- - ANSI (bgr) Black Red Green Yellow Blue Magenta Cyan White - IBMPC (rgb) Black Blue Green Cyan Red Magenta Yellow White -*/ - -ScreenWindow* TerminalDisplay::screenWindow() const -{ - return _screenWindow; -} -void TerminalDisplay::setScreenWindow(ScreenWindow* window) -{ - // disconnect existing screen window if any - if ( _screenWindow ) - { - disconnect( _screenWindow , 0 , this , 0 ); - } - - _screenWindow = window; - - if ( window ) - { - -// TODO: Determine if this is an issue. -//#warning "The order here is not specified - does it matter whether updateImage or updateLineProperties comes first?" - connect( _screenWindow , SIGNAL(outputChanged()) , this , SLOT(updateLineProperties()) ); - connect( _screenWindow , SIGNAL(outputChanged()) , this , SLOT(updateImage()) ); - window->setWindowLines(_lines); - } -} - -const ColorEntry* TerminalDisplay::colorTable() const -{ - return _colorTable; -} -void TerminalDisplay::setBackgroundColor(const QColor& color) -{ - _colorTable[DEFAULT_BACK_COLOR].color = color; - QPalette p = palette(); - p.setColor( backgroundRole(), color ); - setPalette( p ); - - // Avoid propagating the palette change to the scroll bar - _scrollBar->setPalette( QApplication::palette() ); - - update(); -} -void TerminalDisplay::setForegroundColor(const QColor& color) -{ - _colorTable[DEFAULT_FORE_COLOR].color = color; - - update(); -} -void TerminalDisplay::setColorTable(const ColorEntry table[]) -{ - for (int i = 0; i < TABLE_COLORS; i++) - _colorTable[i] = table[i]; - - setBackgroundColor(_colorTable[DEFAULT_BACK_COLOR].color); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Font */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* - The VT100 has 32 special graphical characters. The usual vt100 extended - xterm fonts have these at 0x00..0x1f. - - QT's iso mapping leaves 0x00..0x7f without any changes. But the graphicals - come in here as proper unicode characters. - - We treat non-iso10646 fonts as VT100 extended and do the requiered mapping - from unicode to 0x00..0x1f. The remaining translation is then left to the - QCodec. -*/ - -static inline bool isLineChar(quint16 c) { return ((c & 0xFF80) == 0x2500);} -static inline bool isLineCharString(const QString& string) -{ - return (string.length() > 0) && (isLineChar(string.at(0).unicode())); -} - - -// assert for i in [0..31] : vt100extended(vt100_graphics[i]) == i. - -unsigned short vt100_graphics[32] = -{ // 0/8 1/9 2/10 3/11 4/12 5/13 6/14 7/15 - 0x0020, 0x25C6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, - 0x00b1, 0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, - 0xF800, 0xF801, 0x2500, 0xF803, 0xF804, 0x251c, 0x2524, 0x2534, - 0x252c, 0x2502, 0x2264, 0x2265, 0x03C0, 0x2260, 0x00A3, 0x00b7 -}; - -void TerminalDisplay::fontChange(const QFont&) -{ - QFontMetrics fm(font()); - _fontHeight = fm.height() + _lineSpacing; - - // waba TerminalDisplay 1.123: - // "Base character width on widest ASCII character. This prevents too wide - // characters in the presence of double wide (e.g. Japanese) characters." - // Get the width from representative normal width characters - _fontWidth = qRound((double)fm.width(REPCHAR)/(double)strlen(REPCHAR)); - - _fixedFont = true; - - int fw = fm.width(REPCHAR[0]); - for(unsigned int i=1; i< strlen(REPCHAR); i++) - { - if (fw != fm.width(REPCHAR[i])) - { - _fixedFont = false; - break; - } - } - - if (_fontWidth < 1) - _fontWidth=1; - - _fontAscent = fm.ascent(); - - emit changedFontMetricSignal( _fontHeight, _fontWidth ); - propagateSize(); - update(); -} - -void TerminalDisplay::setVTFont(const QFont& f) -{ - QFont font = f; - - QFontMetrics metrics(font); - - if ( !QFontInfo(font).fixedPitch() ) - { - //kWarning() << "Using an unsupported variable-width font in the terminal. This may produce display errors."; - } - - if ( metrics.height() < height() && metrics.maxWidth() < width() ) - { - // hint that text should be drawn without anti-aliasing. - // depending on the user's font configuration, this may not be respected - if (!_antialiasText) - font.setStyleStrategy( QFont::NoAntialias ); - - // experimental optimization. Konsole assumes that the terminal is using a - // mono-spaced font, in which case kerning information should have an effect. - // Disabling kerning saves some computation when rendering text. - font.setKerning(false); - - QWidget::setFont(font); - fontChange(font); - } -} - -void TerminalDisplay::setFont(const QFont &) -{ - // ignore font change request if not coming from konsole itself -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Constructor / Destructor */ -/* */ -/* ------------------------------------------------------------------------- */ - -TerminalDisplay::TerminalDisplay(QWidget *parent) -:QWidget(parent) -,_screenWindow(0) -,_allowBell(true) -,_gridLayout(0) -,_fontHeight(1) -,_fontWidth(1) -,_fontAscent(1) -,_boldIntense(true) -,_lines(1) -,_columns(1) -,_usedLines(1) -,_usedColumns(1) -,_contentHeight(1) -,_contentWidth(1) -,_image(0) -,_randomSeed(0) -,_resizing(false) -,_terminalSizeHint(false) -,_terminalSizeStartup(true) -,_bidiEnabled(false) -,_actSel(0) -,_wordSelectionMode(false) -,_lineSelectionMode(false) -,_preserveLineBreaks(false) -,_columnSelectionMode(false) -,_scrollbarLocation(NoScrollBar) -,_wordCharacters(":@-./_~") -,_bellMode(SystemBeepBell) -,_blinking(false) -,_hasBlinker(false) -,_cursorBlinking(false) -,_hasBlinkingCursor(false) -,_allowBlinkingText(true) -,_ctrlDrag(true) -,_tripleClickMode(SelectWholeLine) -,_isFixedSize(false) -,_possibleTripleClick(false) -,_resizeWidget(0) -,_resizeTimer(0) -,_flowControlWarningEnabled(false) -,_outputSuspendedLabel(0) -,_lineSpacing(0) -,_colorsInverted(false) -,_blendColor(qRgba(0,0,0,0xff)) -,_filterChain(new TerminalImageFilterChain()) -,_cursorShape(BlockCursor) -{ - // terminal applications are not designed with Right-To-Left in mind, - // so the layout is forced to Left-To-Right - setLayoutDirection(Qt::LeftToRight); - - // The offsets are not yet calculated. - // Do not calculate these too often to be more smoothly when resizing - // konsole in opaque mode. - _topMargin = DEFAULT_TOP_MARGIN; - _leftMargin = DEFAULT_LEFT_MARGIN; - - // create scroll bar for scrolling output up and down - // set the scroll bar's slider to occupy the whole area of the scroll bar initially - _scrollBar = new QScrollBar(this); - setScroll(0,0); - _scrollBar->setCursor( Qt::ArrowCursor ); - connect(_scrollBar, SIGNAL(valueChanged(int)), this, - SLOT(scrollBarPositionChanged(int))); - - // setup timers for blinking cursor and text - _blinkTimer = new QTimer(this); - connect(_blinkTimer, SIGNAL(timeout()), this, SLOT(blinkEvent())); - _blinkCursorTimer = new QTimer(this); - connect(_blinkCursorTimer, SIGNAL(timeout()), this, SLOT(blinkCursorEvent())); - - //KCursor::setAutoHideCursor( this, true ); - - setUsesMouse(true); - setColorTable(base_color_table); - setMouseTracking(true); - - // Enable drag and drop - setAcceptDrops(true); // attempt - dragInfo.state = diNone; - - setFocusPolicy( Qt::WheelFocus ); - - // enable input method support - setAttribute(Qt::WA_InputMethodEnabled, true); - - // this is an important optimization, it tells Qt - // that TerminalDisplay will handle repainting its entire area. - setAttribute(Qt::WA_OpaquePaintEvent); - - _gridLayout = new QGridLayout(this); - _gridLayout->setContentsMargins(0, 0, 0, 0); - - setLayout( _gridLayout ); - - new AutoScrollHandler(this); -} - -TerminalDisplay::~TerminalDisplay() -{ - disconnect(_blinkTimer); - disconnect(_blinkCursorTimer); - qApp->removeEventFilter( this ); - - delete[] _image; - - delete _gridLayout; - delete _outputSuspendedLabel; - delete _filterChain; -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Display Operations */ -/* */ -/* ------------------------------------------------------------------------- */ - -/** - A table for emulating the simple (single width) unicode drawing chars. - It represents the 250x - 257x glyphs. If it's zero, we can't use it. - if it's not, it's encoded as follows: imagine a 5x5 grid where the points are numbered - 0 to 24 left to top, top to bottom. Each point is represented by the corresponding bit. - - Then, the pixels basically have the following interpretation: - _|||_ - -...- - -...- - -...- - _|||_ - -where _ = none - | = vertical line. - - = horizontal line. - */ - - -enum LineEncode -{ - TopL = (1<<1), - TopC = (1<<2), - TopR = (1<<3), - - LeftT = (1<<5), - Int11 = (1<<6), - Int12 = (1<<7), - Int13 = (1<<8), - RightT = (1<<9), - - LeftC = (1<<10), - Int21 = (1<<11), - Int22 = (1<<12), - Int23 = (1<<13), - RightC = (1<<14), - - LeftB = (1<<15), - Int31 = (1<<16), - Int32 = (1<<17), - Int33 = (1<<18), - RightB = (1<<19), - - BotL = (1<<21), - BotC = (1<<22), - BotR = (1<<23) -}; - -#include "LineFont.h" - -static void drawLineChar(QPainter& paint, int x, int y, int w, int h, uchar code) -{ - //Calculate cell midpoints, end points. - int cx = x + w/2; - int cy = y + h/2; - int ex = x + w - 1; - int ey = y + h - 1; - - quint32 toDraw = LineChars[code]; - - //Top _lines: - if (toDraw & TopL) - paint.drawLine(cx-1, y, cx-1, cy-2); - if (toDraw & TopC) - paint.drawLine(cx, y, cx, cy-2); - if (toDraw & TopR) - paint.drawLine(cx+1, y, cx+1, cy-2); - - //Bot _lines: - if (toDraw & BotL) - paint.drawLine(cx-1, cy+2, cx-1, ey); - if (toDraw & BotC) - paint.drawLine(cx, cy+2, cx, ey); - if (toDraw & BotR) - paint.drawLine(cx+1, cy+2, cx+1, ey); - - //Left _lines: - if (toDraw & LeftT) - paint.drawLine(x, cy-1, cx-2, cy-1); - if (toDraw & LeftC) - paint.drawLine(x, cy, cx-2, cy); - if (toDraw & LeftB) - paint.drawLine(x, cy+1, cx-2, cy+1); - - //Right _lines: - if (toDraw & RightT) - paint.drawLine(cx+2, cy-1, ex, cy-1); - if (toDraw & RightC) - paint.drawLine(cx+2, cy, ex, cy); - if (toDraw & RightB) - paint.drawLine(cx+2, cy+1, ex, cy+1); - - //Intersection points. - if (toDraw & Int11) - paint.drawPoint(cx-1, cy-1); - if (toDraw & Int12) - paint.drawPoint(cx, cy-1); - if (toDraw & Int13) - paint.drawPoint(cx+1, cy-1); - - if (toDraw & Int21) - paint.drawPoint(cx-1, cy); - if (toDraw & Int22) - paint.drawPoint(cx, cy); - if (toDraw & Int23) - paint.drawPoint(cx+1, cy); - - if (toDraw & Int31) - paint.drawPoint(cx-1, cy+1); - if (toDraw & Int32) - paint.drawPoint(cx, cy+1); - if (toDraw & Int33) - paint.drawPoint(cx+1, cy+1); - -} - -void TerminalDisplay::drawLineCharString( QPainter& painter, int x, int y, const QString& str, - const Character* attributes) -{ - const QPen& currentPen = painter.pen(); - - if ( (attributes->rendition & RE_BOLD) && _boldIntense ) - { - QPen boldPen(currentPen); - boldPen.setWidth(3); - painter.setPen( boldPen ); - } - - for (int i=0 ; i < str.length(); i++) - { - uchar code = str[i].cell(); - if (LineChars[code]) - drawLineChar(painter, x + (_fontWidth*i), y, _fontWidth, _fontHeight, code); - } - - painter.setPen( currentPen ); -} - -void TerminalDisplay::setKeyboardCursorShape(KeyboardCursorShape shape) -{ - _cursorShape = shape; -} -TerminalDisplay::KeyboardCursorShape TerminalDisplay::keyboardCursorShape() const -{ - return _cursorShape; -} -void TerminalDisplay::setKeyboardCursorColor(bool useForegroundColor, const QColor& color) -{ - if (useForegroundColor) - _cursorColor = QColor(); // an invalid color means that - // the foreground color of the - // current character should - // be used - - else - _cursorColor = color; -} -QColor TerminalDisplay::keyboardCursorColor() const -{ - return _cursorColor; -} - -void TerminalDisplay::setOpacity(qreal opacity) -{ - QColor color(_blendColor); - color.setAlphaF(opacity); - - // enable automatic background filling to prevent the display - // flickering if there is no transparency - /*if ( color.alpha() == 255 ) - { - setAutoFillBackground(true); - } - else - { - setAutoFillBackground(false); - }*/ - - _blendColor = color.rgba(); -} - -void TerminalDisplay::drawBackground(QPainter& painter, const QRect& rect, const QColor& backgroundColor, bool useOpacitySetting ) -{ - // the area of the widget showing the contents of the terminal display is drawn - // using the background color from the color scheme set with setColorTable() - // - // the area of the widget behind the scroll-bar is drawn using the background - // brush from the scroll-bar's palette, to give the effect of the scroll-bar - // being outside of the terminal display and visual consistency with other KDE - // applications. - // - QRect scrollBarArea = _scrollBar->isVisible() ? - rect.intersected(_scrollBar->geometry()) : - QRect(); - QRegion contentsRegion = QRegion(rect).subtracted(scrollBarArea); - QRect contentsRect = contentsRegion.boundingRect(); - - if ( HAVE_TRANSPARENCY && qAlpha(_blendColor) < 0xff && useOpacitySetting ) - { - QColor color(backgroundColor); - color.setAlpha(qAlpha(_blendColor)); - - painter.save(); - painter.setCompositionMode(QPainter::CompositionMode_Source); - painter.fillRect(contentsRect, color); - painter.restore(); - } - else - painter.fillRect(contentsRect, backgroundColor); - - painter.fillRect(scrollBarArea,_scrollBar->palette().background()); -} - -void TerminalDisplay::drawCursor(QPainter& painter, - const QRect& rect, - const QColor& foregroundColor, - const QColor& /*backgroundColor*/, - bool& invertCharacterColor) -{ - QRect cursorRect = rect; - cursorRect.setHeight(_fontHeight - _lineSpacing - 1); - - if (!_cursorBlinking) - { - if ( _cursorColor.isValid() ) - painter.setPen(_cursorColor); - else - painter.setPen(foregroundColor); - - if ( _cursorShape == BlockCursor ) - { - // draw the cursor outline, adjusting the area so that - // it is draw entirely inside 'rect' - int penWidth = qMax(1,painter.pen().width()); - - painter.drawRect(cursorRect.adjusted(penWidth/2, - penWidth/2, - - penWidth/2 - penWidth%2, - - penWidth/2 - penWidth%2)); - if ( hasFocus() ) - { - painter.fillRect(cursorRect, _cursorColor.isValid() ? _cursorColor : foregroundColor); - - if ( !_cursorColor.isValid() ) - { - // invert the colour used to draw the text to ensure that the character at - // the cursor position is readable - invertCharacterColor = true; - } - } - } - else if ( _cursorShape == UnderlineCursor ) - painter.drawLine(cursorRect.left(), - cursorRect.bottom(), - cursorRect.right(), - cursorRect.bottom()); - else if ( _cursorShape == IBeamCursor ) - painter.drawLine(cursorRect.left(), - cursorRect.top(), - cursorRect.left(), - cursorRect.bottom()); - - } -} - -void TerminalDisplay::drawCharacters(QPainter& painter, - const QRect& rect, - const QString& text, - const Character* style, - bool invertCharacterColor) -{ - // don't draw text which is currently blinking - if ( _blinking && (style->rendition & RE_BLINK) ) - return; - - // setup bold and underline - bool useBold; - ColorEntry::FontWeight weight = style->fontWeight(_colorTable); - if (weight == ColorEntry::UseCurrentFormat) - useBold = ((style->rendition & RE_BOLD) && _boldIntense) || font().bold(); - else - useBold = (weight == ColorEntry::Bold) ? true : false; - bool useUnderline = style->rendition & RE_UNDERLINE || font().underline(); - - QFont font = painter.font(); - if ( font.bold() != useBold - || font.underline() != useUnderline ) - { - font.setBold(useBold); - font.setUnderline(useUnderline); - painter.setFont(font); - } - - // setup pen - const CharacterColor& textColor = ( invertCharacterColor ? style->backgroundColor : style->foregroundColor ); - const QColor color = textColor.color(_colorTable); - QPen pen = painter.pen(); - if ( pen.color() != color ) - { - pen.setColor(color); - painter.setPen(color); - } - - // draw text - if ( isLineCharString(text) ) - drawLineCharString(painter,rect.x(),rect.y(),text,style); - else - { - // the drawText(rect,flags,string) overload is used here with null flags - // instead of drawText(rect,string) because the (rect,string) overload causes - // the application's default layout direction to be used instead of - // the widget-specific layout direction, which should always be - // Qt::LeftToRight for this widget - // This was discussed in: http://lists.kde.org/?t=120552223600002&r=1&w=2 - if (_bidiEnabled) - painter.drawText(rect,0,text); - else - painter.drawText(rect,0,LTR_OVERRIDE_CHAR+text); - } -} - -void TerminalDisplay::drawTextFragment(QPainter& painter , - const QRect& rect, - const QString& text, - const Character* style) -{ - painter.save(); - - // setup painter - const QColor foregroundColor = style->foregroundColor.color(_colorTable); - const QColor backgroundColor = style->backgroundColor.color(_colorTable); - - // draw background if different from the display's background color - if ( backgroundColor != palette().background().color() ) - drawBackground(painter,rect,backgroundColor, - false /* do not use transparency */); - - // draw cursor shape if the current character is the cursor - // this may alter the foreground and background colors - bool invertCharacterColor = false; - if ( style->rendition & RE_CURSOR ) - drawCursor(painter,rect,foregroundColor,backgroundColor,invertCharacterColor); - - // draw text - drawCharacters(painter,rect,text,style,invertCharacterColor); - - painter.restore(); -} - -void TerminalDisplay::setRandomSeed(uint randomSeed) { _randomSeed = randomSeed; } -uint TerminalDisplay::randomSeed() const { return _randomSeed; } - -#if 0 -/*! - Set XIM Position -*/ -void TerminalDisplay::setCursorPos(const int curx, const int cury) -{ - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - - int xpos, ypos; - ypos = _topMargin + tLy + _fontHeight*(cury-1) + _fontAscent; - xpos = _leftMargin + tLx + _fontWidth*curx; - _cursorLine = cury; - _cursorCol = curx; -} -#endif - -// scrolls the image by 'lines', down if lines > 0 or up otherwise. -// -// the terminal emulation keeps track of the scrolling of the character -// image as it receives input, and when the view is updated, it calls scrollImage() -// with the final scroll amount. this improves performance because scrolling the -// display is much cheaper than re-rendering all the text for the -// part of the image which has moved up or down. -// Instead only new lines have to be drawn -void TerminalDisplay::scrollImage(int lines , const QRect& screenWindowRegion) -{ - // if the flow control warning is enabled this will interfere with the - // scrolling optimizations and cause artifacts. the simple solution here - // is to just disable the optimization whilst it is visible - if ( _outputSuspendedLabel && _outputSuspendedLabel->isVisible() ) - return; - - // constrain the region to the display - // the bottom of the region is capped to the number of lines in the display's - // internal image - 2, so that the height of 'region' is strictly less - // than the height of the internal image. - QRect region = screenWindowRegion; - region.setBottom( qMin(region.bottom(),this->_lines-2) ); - - // return if there is nothing to do - if ( lines == 0 - || _image == 0 - || !region.isValid() - || (region.top() + abs(lines)) >= region.bottom() - || this->_lines <= region.height() ) return; - - // hide terminal size label to prevent it being scrolled - if (_resizeWidget && _resizeWidget->isVisible()) - _resizeWidget->hide(); - - // Note: With Qt 4.4 the left edge of the scrolled area must be at 0 - // to get the correct (newly exposed) part of the widget repainted. - // - // The right edge must be before the left edge of the scroll bar to - // avoid triggering a repaint of the entire widget, the distance is - // given by SCROLLBAR_CONTENT_GAP - // - // Set the QT_FLUSH_PAINT environment variable to '1' before starting the - // application to monitor repainting. - // - int scrollBarWidth = _scrollBar->isHidden() ? 0 : _scrollBar->width(); - const int SCROLLBAR_CONTENT_GAP = 1; - QRect scrollRect; - if ( _scrollbarLocation == ScrollBarLeft ) - { - scrollRect.setLeft(scrollBarWidth+SCROLLBAR_CONTENT_GAP); - scrollRect.setRight(width()); - } - else - { - scrollRect.setLeft(0); - scrollRect.setRight(width() - scrollBarWidth - SCROLLBAR_CONTENT_GAP); - } - void* firstCharPos = &_image[ region.top() * this->_columns ]; - void* lastCharPos = &_image[ (region.top() + abs(lines)) * this->_columns ]; - - int top = _topMargin + (region.top() * _fontHeight); - int linesToMove = region.height() - abs(lines); - int bytesToMove = linesToMove * - this->_columns * - sizeof(Character); - - Q_ASSERT( linesToMove > 0 ); - Q_ASSERT( bytesToMove > 0 ); - - //scroll internal image - if ( lines > 0 ) - { - // check that the memory areas that we are going to move are valid - Q_ASSERT( (char*)lastCharPos + bytesToMove < - (char*)(_image + (this->_lines * this->_columns)) ); - - Q_ASSERT( (lines*this->_columns) < _imageSize ); - - //scroll internal image down - memmove( firstCharPos , lastCharPos , bytesToMove ); - - //set region of display to scroll - scrollRect.setTop(top); - } - else - { - // check that the memory areas that we are going to move are valid - Q_ASSERT( (char*)firstCharPos + bytesToMove < - (char*)(_image + (this->_lines * this->_columns)) ); - - //scroll internal image up - memmove( lastCharPos , firstCharPos , bytesToMove ); - - //set region of the display to scroll - scrollRect.setTop(top + abs(lines) * _fontHeight); - } - scrollRect.setHeight(linesToMove * _fontHeight ); - - Q_ASSERT(scrollRect.isValid() && !scrollRect.isEmpty()); - - //scroll the display vertically to match internal _image - scroll( 0 , _fontHeight * (-lines) , scrollRect ); -} - -QRegion TerminalDisplay::hotSpotRegion() const -{ - QRegion region; - foreach( Filter::HotSpot* hotSpot , _filterChain->hotSpots() ) - { - QRect r; - if (hotSpot->startLine()==hotSpot->endLine()) { - r.setLeft(hotSpot->startColumn()); - r.setTop(hotSpot->startLine()); - r.setRight(hotSpot->endColumn()); - r.setBottom(hotSpot->endLine()); - region |= imageToWidget(r);; - } else { - r.setLeft(hotSpot->startColumn()); - r.setTop(hotSpot->startLine()); - r.setRight(_columns); - r.setBottom(hotSpot->startLine()); - region |= imageToWidget(r);; - for ( int line = hotSpot->startLine()+1 ; line < hotSpot->endLine() ; line++ ) { - r.setLeft(0); - r.setTop(line); - r.setRight(_columns); - r.setBottom(line); - region |= imageToWidget(r);; - } - r.setLeft(0); - r.setTop(hotSpot->endLine()); - r.setRight(hotSpot->endColumn()); - r.setBottom(hotSpot->endLine()); - region |= imageToWidget(r);; - } - } - return region; -} - -void TerminalDisplay::processFilters() -{ - if (!_screenWindow) - return; - - QRegion preUpdateHotSpots = hotSpotRegion(); - - // use _screenWindow->getImage() here rather than _image because - // other classes may call processFilters() when this display's - // ScreenWindow emits a scrolled() signal - which will happen before - // updateImage() is called on the display and therefore _image is - // out of date at this point - _filterChain->setImage( _screenWindow->getImage(), - _screenWindow->windowLines(), - _screenWindow->windowColumns(), - _screenWindow->getLineProperties() ); - _filterChain->process(); - - QRegion postUpdateHotSpots = hotSpotRegion(); - - update( preUpdateHotSpots | postUpdateHotSpots ); -} - -void TerminalDisplay::updateImage() -{ - if ( !_screenWindow ) - return; - - // optimization - scroll the existing image where possible and - // avoid expensive text drawing for parts of the image that - // can simply be moved up or down - scrollImage( _screenWindow->scrollCount() , - _screenWindow->scrollRegion() ); - _screenWindow->resetScrollCount(); - - if (!_image) { - // Create _image. - // The emitted changedContentSizeSignal also leads to getImage being recreated, so do this first. - updateImageSize(); - } - - Character* const newimg = _screenWindow->getImage(); - int lines = _screenWindow->windowLines(); - int columns = _screenWindow->windowColumns(); - - setScroll( _screenWindow->currentLine() , _screenWindow->lineCount() ); - - Q_ASSERT( this->_usedLines <= this->_lines ); - Q_ASSERT( this->_usedColumns <= this->_columns ); - - int y,x,len; - - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - _hasBlinker = false; - - CharacterColor cf; // undefined - CharacterColor _clipboard; // undefined - int cr = -1; // undefined - - const int linesToUpdate = qMin(this->_lines, qMax(0,lines )); - const int columnsToUpdate = qMin(this->_columns,qMax(0,columns)); - - QChar *disstrU = new QChar[columnsToUpdate]; - char *dirtyMask = new char[columnsToUpdate+2]; - QRegion dirtyRegion; - - // debugging variable, this records the number of lines that are found to - // be 'dirty' ( ie. have changed from the old _image to the new _image ) and - // which therefore need to be repainted - int dirtyLineCount = 0; - - for (y = 0; y < linesToUpdate; ++y) - { - const Character* currentLine = &_image[y*this->_columns]; - const Character* const newLine = &newimg[y*columns]; - - bool updateLine = false; - - // The dirty mask indicates which characters need repainting. We also - // mark surrounding neighbours dirty, in case the character exceeds - // its cell boundaries - memset(dirtyMask, 0, columnsToUpdate+2); - - for( x = 0 ; x < columnsToUpdate ; ++x) - { - if ( newLine[x] != currentLine[x] ) - { - dirtyMask[x] = true; - } - } - - if (!_resizing) // not while _resizing, we're expecting a paintEvent - for (x = 0; x < columnsToUpdate; ++x) - { - _hasBlinker |= (newLine[x].rendition & RE_BLINK); - - // Start drawing if this character or the next one differs. - // We also take the next one into account to handle the situation - // where characters exceed their cell width. - if (dirtyMask[x]) - { - quint16 c = newLine[x+0].character; - if ( !c ) - continue; - int p = 0; - disstrU[p++] = c; //fontMap(c); - bool lineDraw = isLineChar(c); - bool doubleWidth = (x+1 == columnsToUpdate) ? false : (newLine[x+1].character == 0); - cr = newLine[x].rendition; - _clipboard = newLine[x].backgroundColor; - if (newLine[x].foregroundColor != cf) cf = newLine[x].foregroundColor; - int lln = columnsToUpdate - x; - for (len = 1; len < lln; ++len) - { - const Character& ch = newLine[x+len]; - - if (!ch.character) - continue; // Skip trailing part of multi-col chars. - - bool nextIsDoubleWidth = (x+len+1 == columnsToUpdate) ? false : (newLine[x+len+1].character == 0); - - if ( ch.foregroundColor != cf || - ch.backgroundColor != _clipboard || - ch.rendition != cr || - !dirtyMask[x+len] || - isLineChar(c) != lineDraw || - nextIsDoubleWidth != doubleWidth ) - break; - - disstrU[p++] = c; //fontMap(c); - } - - QString unistr(disstrU, p); - - bool saveFixedFont = _fixedFont; - if (lineDraw) - _fixedFont = false; - if (doubleWidth) - _fixedFont = false; - - updateLine = true; - - _fixedFont = saveFixedFont; - x += len - 1; - } - - } - - //both the top and bottom halves of double height _lines must always be redrawn - //although both top and bottom halves contain the same characters, only - //the top one is actually - //drawn. - if (_lineProperties.count() > y) - updateLine |= (_lineProperties[y] & LINE_DOUBLEHEIGHT); - - // if the characters on the line are different in the old and the new _image - // then this line must be repainted. - if (updateLine) - { - dirtyLineCount++; - - // add the area occupied by this line to the region which needs to be - // repainted - QRect dirtyRect = QRect( _leftMargin+tLx , - _topMargin+tLy+_fontHeight*y , - _fontWidth * columnsToUpdate , - _fontHeight ); - - dirtyRegion |= dirtyRect; - } - - // replace the line of characters in the old _image with the - // current line of the new _image - memcpy((void*)currentLine,(const void*)newLine,columnsToUpdate*sizeof(Character)); - } - - // if the new _image is smaller than the previous _image, then ensure that the area - // outside the new _image is cleared - if ( linesToUpdate < _usedLines ) - { - dirtyRegion |= QRect( _leftMargin+tLx , - _topMargin+tLy+_fontHeight*linesToUpdate , - _fontWidth * this->_columns , - _fontHeight * (_usedLines-linesToUpdate) ); - } - _usedLines = linesToUpdate; - - if ( columnsToUpdate < _usedColumns ) - { - dirtyRegion |= QRect( _leftMargin+tLx+columnsToUpdate*_fontWidth , - _topMargin+tLy , - _fontWidth * (_usedColumns-columnsToUpdate) , - _fontHeight * this->_lines ); - } - _usedColumns = columnsToUpdate; - - dirtyRegion |= _inputMethodData.previousPreeditRect; - - // update the parts of the display which have changed - update(dirtyRegion); - - if ( _hasBlinker && !_blinkTimer->isActive()) _blinkTimer->start( TEXT_BLINK_DELAY ); - if (!_hasBlinker && _blinkTimer->isActive()) { _blinkTimer->stop(); _blinking = false; } - delete[] dirtyMask; - delete[] disstrU; - -} - -void TerminalDisplay::showResizeNotification() -{ - if (_terminalSizeHint && isVisible()) - { - if (_terminalSizeStartup) { - _terminalSizeStartup=false; - return; - } - if (!_resizeWidget) - { - _resizeWidget = new QLabel(QString("Size: XXX x XXX"), this); - _resizeWidget->setMinimumWidth(_resizeWidget->fontMetrics().width(QString("Size: XXX x XXX"))); - _resizeWidget->setMinimumHeight(_resizeWidget->sizeHint().height()); - _resizeWidget->setAlignment(Qt::AlignCenter); - - _resizeWidget->setStyleSheet("background-color:palette(window);border-style:solid;border-width:1px;border-color:palette(dark)"); - - _resizeTimer = new QTimer(this); - _resizeTimer->setSingleShot(true); - connect(_resizeTimer, SIGNAL(timeout()), _resizeWidget, SLOT(hide())); - } - QString sizeStr = QString("Size: %1 x %2").arg(_columns).arg(_lines); - _resizeWidget->setText(sizeStr); - _resizeWidget->move((width()-_resizeWidget->width())/2, - (height()-_resizeWidget->height())/2+20); - _resizeWidget->show(); - _resizeTimer->start(1000); - } -} - -void TerminalDisplay::setBlinkingCursor(bool blink) -{ - _hasBlinkingCursor=blink; - - if (blink && !_blinkCursorTimer->isActive()) - _blinkCursorTimer->start(QApplication::cursorFlashTime() / 2); - - if (!blink && _blinkCursorTimer->isActive()) - { - _blinkCursorTimer->stop(); - if (_cursorBlinking) - blinkCursorEvent(); - else - _cursorBlinking = false; - } -} - -void TerminalDisplay::setBlinkingTextEnabled(bool blink) -{ - _allowBlinkingText = blink; - - if (blink && !_blinkTimer->isActive()) - _blinkTimer->start(TEXT_BLINK_DELAY); - - if (!blink && _blinkTimer->isActive()) - { - _blinkTimer->stop(); - _blinking = false; - } -} - -void TerminalDisplay::focusOutEvent(QFocusEvent*) -{ - // trigger a repaint of the cursor so that it is both visible (in case - // it was hidden during blinking) - // and drawn in a focused out state - _cursorBlinking = false; - updateCursor(); - - _blinkCursorTimer->stop(); - if (_blinking) - blinkEvent(); - - _blinkTimer->stop(); -} -void TerminalDisplay::focusInEvent(QFocusEvent*) -{ - if (_hasBlinkingCursor) - { - _blinkCursorTimer->start(); - } - updateCursor(); - - if (_hasBlinker) - _blinkTimer->start(); -} - -void TerminalDisplay::paintEvent( QPaintEvent* pe ) -{ - QPainter paint(this); - - foreach (const QRect &rect, (pe->region() & contentsRect()).rects()) - { - drawBackground(paint,rect,palette().background().color(), - true /* use opacity setting */); - drawContents(paint, rect); - } - drawInputMethodPreeditString(paint,preeditRect()); - paintFilters(paint); -} - -QPoint TerminalDisplay::cursorPosition() const -{ - if (_screenWindow) - return _screenWindow->cursorPosition(); - else - return QPoint(0,0); -} - -QRect TerminalDisplay::preeditRect() const -{ - const int preeditLength = string_width(_inputMethodData.preeditString); - - if ( preeditLength == 0 ) - return QRect(); - - return QRect(_leftMargin + _fontWidth*cursorPosition().x(), - _topMargin + _fontHeight*cursorPosition().y(), - _fontWidth*preeditLength, - _fontHeight); -} - -void TerminalDisplay::drawInputMethodPreeditString(QPainter& painter , const QRect& rect) -{ - if ( _inputMethodData.preeditString.isEmpty() ) - return; - - const QPoint cursorPos = cursorPosition(); - - bool invertColors = false; - const QColor background = _colorTable[DEFAULT_BACK_COLOR].color; - const QColor foreground = _colorTable[DEFAULT_FORE_COLOR].color; - const Character* style = &_image[loc(cursorPos.x(),cursorPos.y())]; - - drawBackground(painter,rect,background,true); - drawCursor(painter,rect,foreground,background,invertColors); - drawCharacters(painter,rect,_inputMethodData.preeditString,style,invertColors); - - _inputMethodData.previousPreeditRect = rect; -} - -FilterChain* TerminalDisplay::filterChain() const -{ - return _filterChain; -} - -void TerminalDisplay::paintFilters(QPainter& painter) -{ - // get color of character under mouse and use it to draw - // lines for filters - QPoint cursorPos = mapFromGlobal(QCursor::pos()); - int cursorLine; - int cursorColumn; - int scrollBarWidth = (_scrollbarLocation == ScrollBarLeft) ? _scrollBar->width() : 0; - - getCharacterPosition( cursorPos , cursorLine , cursorColumn ); - Character cursorCharacter = _image[loc(cursorColumn,cursorLine)]; - - painter.setPen( QPen(cursorCharacter.foregroundColor.color(colorTable())) ); - - // iterate over hotspots identified by the display's currently active filters - // and draw appropriate visuals to indicate the presence of the hotspot - - QList<Filter::HotSpot*> spots = _filterChain->hotSpots(); - QListIterator<Filter::HotSpot*> iter(spots); - while (iter.hasNext()) - { - Filter::HotSpot* spot = iter.next(); - - QRegion region; - if ( spot->type() == Filter::HotSpot::Link ) { - QRect r; - if (spot->startLine()==spot->endLine()) { - r.setCoords( spot->startColumn()*_fontWidth + 1 + scrollBarWidth, - spot->startLine()*_fontHeight + 1, - (spot->endColumn()-1)*_fontWidth - 1 + scrollBarWidth, - (spot->endLine()+1)*_fontHeight - 1 ); - region |= r; - } else { - r.setCoords( spot->startColumn()*_fontWidth + 1 + scrollBarWidth, - spot->startLine()*_fontHeight + 1, - (_columns-1)*_fontWidth - 1 + scrollBarWidth, - (spot->startLine()+1)*_fontHeight - 1 ); - region |= r; - for ( int line = spot->startLine()+1 ; line < spot->endLine() ; line++ ) { - r.setCoords( 0*_fontWidth + 1 + scrollBarWidth, - line*_fontHeight + 1, - (_columns-1)*_fontWidth - 1 + scrollBarWidth, - (line+1)*_fontHeight - 1 ); - region |= r; - } - r.setCoords( 0*_fontWidth + 1 + scrollBarWidth, - spot->endLine()*_fontHeight + 1, - (spot->endColumn()-1)*_fontWidth - 1 + scrollBarWidth, - (spot->endLine()+1)*_fontHeight - 1 ); - region |= r; - } - } - - for ( int line = spot->startLine() ; line <= spot->endLine() ; line++ ) - { - int startColumn = 0; - int endColumn = _columns-1; // TODO use number of _columns which are actually - // occupied on this line rather than the width of the - // display in _columns - - // ignore whitespace at the end of the lines - while ( QChar(_image[loc(endColumn,line)].character).isSpace() && endColumn > 0 ) - endColumn--; - - // increment here because the column which we want to set 'endColumn' to - // is the first whitespace character at the end of the line - endColumn++; - - if ( line == spot->startLine() ) - startColumn = spot->startColumn(); - if ( line == spot->endLine() ) - endColumn = spot->endColumn(); - - // subtract one pixel from - // the right and bottom so that - // we do not overdraw adjacent - // hotspots - // - // subtracting one pixel from all sides also prevents an edge case where - // moving the mouse outside a link could still leave it underlined - // because the check below for the position of the cursor - // finds it on the border of the target area - QRect r; - r.setCoords( startColumn*_fontWidth + 1 + scrollBarWidth, - line*_fontHeight + 1, - endColumn*_fontWidth - 1 + scrollBarWidth, - (line+1)*_fontHeight - 1 ); - // Underline link hotspots - if ( spot->type() == Filter::HotSpot::Link ) - { - QFontMetrics metrics(font()); - - // find the baseline (which is the invisible line that the characters in the font sit on, - // with some having tails dangling below) - int baseline = r.bottom() - metrics.descent(); - // find the position of the underline below that - int underlinePos = baseline + metrics.underlinePos(); - if ( region.contains( mapFromGlobal(QCursor::pos()) ) ){ - painter.drawLine( r.left() , underlinePos , - r.right() , underlinePos ); - } - } - // Marker hotspots simply have a transparent rectanglular shape - // drawn on top of them - else if ( spot->type() == Filter::HotSpot::Marker ) - { - //TODO - Do not use a hardcoded colour for this - painter.fillRect(r,QBrush(QColor(255,0,0,120))); - } - } - } -} -void TerminalDisplay::drawContents(QPainter &paint, const QRect &rect) -{ - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - - int lux = qMin(_usedColumns-1, qMax(0,(rect.left() - tLx - _leftMargin ) / _fontWidth)); - int luy = qMin(_usedLines-1, qMax(0,(rect.top() - tLy - _topMargin ) / _fontHeight)); - int rlx = qMin(_usedColumns-1, qMax(0,(rect.right() - tLx - _leftMargin ) / _fontWidth)); - int rly = qMin(_usedLines-1, qMax(0,(rect.bottom() - tLy - _topMargin ) / _fontHeight)); - - const int bufferSize = _usedColumns; - QString unistr; - unistr.reserve(bufferSize); - for (int y = luy; y <= rly; y++) - { - quint16 c = _image[loc(lux,y)].character; - int x = lux; - if(!c && x) - x--; // Search for start of multi-column character - for (; x <= rlx; x++) - { - int len = 1; - int p = 0; - - // reset our buffer to the maximal size - unistr.resize(bufferSize); - QChar *disstrU = unistr.data(); - - // is this a single character or a sequence of characters ? - if ( _image[loc(x,y)].rendition & RE_EXTENDED_CHAR ) - { - // sequence of characters - ushort extendedCharLength = 0; - ushort* chars = ExtendedCharTable::instance - .lookupExtendedChar(_image[loc(x,y)].charSequence,extendedCharLength); - for ( int index = 0 ; index < extendedCharLength ; index++ ) - { - Q_ASSERT( p < bufferSize ); - disstrU[p++] = chars[index]; - } - } - else - { - // single character - c = _image[loc(x,y)].character; - if (c) - { - Q_ASSERT( p < bufferSize ); - disstrU[p++] = c; //fontMap(c); - } - } - - bool lineDraw = isLineChar(c); - bool doubleWidth = (_image[ qMin(loc(x,y)+1,_imageSize) ].character == 0); - CharacterColor currentForeground = _image[loc(x,y)].foregroundColor; - CharacterColor currentBackground = _image[loc(x,y)].backgroundColor; - quint8 currentRendition = _image[loc(x,y)].rendition; - - while (x+len <= rlx && - _image[loc(x+len,y)].foregroundColor == currentForeground && - _image[loc(x+len,y)].backgroundColor == currentBackground && - _image[loc(x+len,y)].rendition == currentRendition && - (_image[ qMin(loc(x+len,y)+1,_imageSize) ].character == 0) == doubleWidth && - isLineChar( c = _image[loc(x+len,y)].character) == lineDraw) // Assignment! - { - if (c) - disstrU[p++] = c; //fontMap(c); - if (doubleWidth) // assert((_image[loc(x+len,y)+1].character == 0)), see above if condition - len++; // Skip trailing part of multi-column character - len++; - } - if ((x+len < _usedColumns) && (!_image[loc(x+len,y)].character)) - len++; // Adjust for trailing part of multi-column character - - bool save__fixedFont = _fixedFont; - if (lineDraw) - _fixedFont = false; - if (doubleWidth) - _fixedFont = false; - unistr.resize(p); - - // Create a text scaling matrix for double width and double height lines. - QMatrix textScale; - - if (y < _lineProperties.size()) - { - if (_lineProperties[y] & LINE_DOUBLEWIDTH) - textScale.scale(2,1); - - if (_lineProperties[y] & LINE_DOUBLEHEIGHT) - textScale.scale(1,2); - } - - //Apply text scaling matrix. - paint.setWorldMatrix(textScale, true); - - //calculate the area in which the text will be drawn - QRect textArea = QRect( _leftMargin+tLx+_fontWidth*x , _topMargin+tLy+_fontHeight*y , _fontWidth*len , _fontHeight); - - //move the calculated area to take account of scaling applied to the painter. - //the position of the area from the origin (0,0) is scaled - //by the opposite of whatever - //transformation has been applied to the painter. this ensures that - //painting does actually start from textArea.topLeft() - //(instead of textArea.topLeft() * painter-scale) - textArea.moveTopLeft( textScale.inverted().map(textArea.topLeft()) ); - - //paint text fragment - drawTextFragment( paint, - textArea, - unistr, - &_image[loc(x,y)] ); //, - //0, - //!_isPrinting ); - - _fixedFont = save__fixedFont; - - //reset back to single-width, single-height _lines - paint.setWorldMatrix(textScale.inverted(), true); - - if (y < _lineProperties.size()-1) - { - //double-height _lines are represented by two adjacent _lines - //containing the same characters - //both _lines will have the LINE_DOUBLEHEIGHT attribute. - //If the current line has the LINE_DOUBLEHEIGHT attribute, - //we can therefore skip the next line - if (_lineProperties[y] & LINE_DOUBLEHEIGHT) - y++; - } - - x += len - 1; - } - } -} - -void TerminalDisplay::blinkEvent() -{ - if (!_allowBlinkingText) return; - - _blinking = !_blinking; - - //TODO: Optimize to only repaint the areas of the widget - // where there is blinking text - // rather than repainting the whole widget. - update(); -} - -QRect TerminalDisplay::imageToWidget(const QRect& imageArea) const -{ - QRect result; - result.setLeft( _leftMargin + _fontWidth * imageArea.left() ); - result.setTop( _topMargin + _fontHeight * imageArea.top() ); - result.setWidth( _fontWidth * imageArea.width() ); - result.setHeight( _fontHeight * imageArea.height() ); - - return result; -} - -void TerminalDisplay::updateCursor() -{ - QRect cursorRect = imageToWidget( QRect(cursorPosition(),QSize(1,1)) ); - update(cursorRect); -} - -void TerminalDisplay::blinkCursorEvent() -{ - _cursorBlinking = !_cursorBlinking; - updateCursor(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Resizing */ -/* */ -/* ------------------------------------------------------------------------- */ - -void TerminalDisplay::resizeEvent(QResizeEvent*) -{ - updateImageSize(); -} - -void TerminalDisplay::propagateSize() -{ - if (_isFixedSize) - { - setSize(_columns, _lines); - QWidget::setFixedSize(sizeHint()); - parentWidget()->adjustSize(); - parentWidget()->setFixedSize(parentWidget()->sizeHint()); - return; - } - if (_image) - updateImageSize(); -} - -void TerminalDisplay::updateImageSize() -{ - Character* oldimg = _image; - int oldlin = _lines; - int oldcol = _columns; - - makeImage(); - - // copy the old image to reduce flicker - int lines = qMin(oldlin,_lines); - int columns = qMin(oldcol,_columns); - - if (oldimg) - { - for (int line = 0; line < lines; line++) - { - memcpy((void*)&_image[_columns*line], - (void*)&oldimg[oldcol*line],columns*sizeof(Character)); - } - delete[] oldimg; - } - - if (_screenWindow) - _screenWindow->setWindowLines(_lines); - - _resizing = (oldlin!=_lines) || (oldcol!=_columns); - - if ( _resizing ) - { - showResizeNotification(); - emit changedContentSizeSignal(_contentHeight, _contentWidth); // expose resizeEvent - } - - _resizing = false; -} - -//showEvent and hideEvent are reimplemented here so that it appears to other classes that the -//display has been resized when the display is hidden or shown. -// -//TODO: Perhaps it would be better to have separate signals for show and hide instead of using -//the same signal as the one for a content size change -void TerminalDisplay::showEvent(QShowEvent*) -{ - emit changedContentSizeSignal(_contentHeight,_contentWidth); -} -void TerminalDisplay::hideEvent(QHideEvent*) -{ - emit changedContentSizeSignal(_contentHeight,_contentWidth); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Scrollbar */ -/* */ -/* ------------------------------------------------------------------------- */ - -void TerminalDisplay::scrollBarPositionChanged(int) -{ - if ( !_screenWindow ) - return; - - _screenWindow->scrollTo( _scrollBar->value() ); - - // if the thumb has been moved to the bottom of the _scrollBar then set - // the display to automatically track new output, - // that is, scroll down automatically - // to how new _lines as they are added - const bool atEndOfOutput = (_scrollBar->value() == _scrollBar->maximum()); - _screenWindow->setTrackOutput( atEndOfOutput ); - - updateImage(); -} - -void TerminalDisplay::setScroll(int cursor, int slines) -{ - // update _scrollBar if the range or value has changed, - // otherwise return - // - // setting the range or value of a _scrollBar will always trigger - // a repaint, so it should be avoided if it is not necessary - if ( _scrollBar->minimum() == 0 && - _scrollBar->maximum() == (slines - _lines) && - _scrollBar->value() == cursor ) - { - return; - } - - disconnect(_scrollBar, SIGNAL(valueChanged(int)), this, SLOT(scrollBarPositionChanged(int))); - _scrollBar->setRange(0,slines - _lines); - _scrollBar->setSingleStep(1); - _scrollBar->setPageStep(_lines); - _scrollBar->setValue(cursor); - connect(_scrollBar, SIGNAL(valueChanged(int)), this, SLOT(scrollBarPositionChanged(int))); -} - -void TerminalDisplay::setScrollBarPosition(ScrollBarPosition position) -{ - if (_scrollbarLocation == position) - return; - - if ( position == NoScrollBar ) - _scrollBar->hide(); - else - _scrollBar->show(); - - _topMargin = _leftMargin = 1; - _scrollbarLocation = position; - - propagateSize(); - update(); -} - -void TerminalDisplay::mousePressEvent(QMouseEvent* ev) -{ - if ( _possibleTripleClick && (ev->button()==Qt::LeftButton) ) { - mouseTripleClickEvent(ev); - return; - } - - if ( !contentsRect().contains(ev->pos()) ) return; - - if ( !_screenWindow ) return; - - int charLine; - int charColumn; - getCharacterPosition(ev->pos(),charLine,charColumn); - QPoint pos = QPoint(charColumn,charLine); - - if ( ev->button() == Qt::LeftButton) - { - _lineSelectionMode = false; - _wordSelectionMode = false; - - emit isBusySelecting(true); // Keep it steady... - // Drag only when the Control key is hold - bool selected = false; - - // The receiver of the testIsSelected() signal will adjust - // 'selected' accordingly. - //emit testIsSelected(pos.x(), pos.y(), selected); - - selected = _screenWindow->isSelected(pos.x(),pos.y()); - - if ((!_ctrlDrag || ev->modifiers() & Qt::ControlModifier) && selected ) { - // The user clicked inside selected text - dragInfo.state = diPending; - dragInfo.start = ev->pos(); - } - else { - // No reason to ever start a drag event - dragInfo.state = diNone; - - _preserveLineBreaks = !( ( ev->modifiers() & Qt::ControlModifier ) && !(ev->modifiers() & Qt::AltModifier) ); - _columnSelectionMode = (ev->modifiers() & Qt::AltModifier) && (ev->modifiers() & Qt::ControlModifier); - - if (_mouseMarks || (ev->modifiers() & Qt::ShiftModifier)) - { - _screenWindow->clearSelection(); - - //emit clearSelectionSignal(); - pos.ry() += _scrollBar->value(); - _iPntSel = _pntSel = pos; - _actSel = 1; // left mouse button pressed but nothing selected yet. - - } - else - { - emit mouseSignal( 0, charColumn + 1, charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , 0); - } - } - } - else if ( ev->button() == Qt::MidButton ) - { - if ( _mouseMarks || (!_mouseMarks && (ev->modifiers() & Qt::ShiftModifier)) ) - emitSelection(true,ev->modifiers() & Qt::ControlModifier); - else - emit mouseSignal( 1, charColumn +1, charLine +1 +_scrollBar->value() -_scrollBar->maximum() , 0); - } - else if ( ev->button() == Qt::RightButton ) - { - if (_mouseMarks || (ev->modifiers() & Qt::ShiftModifier)) - emit configureRequest(ev->pos()); - else - emit mouseSignal( 2, charColumn +1, charLine +1 +_scrollBar->value() -_scrollBar->maximum() , 0); - } -} - -QList<QAction*> TerminalDisplay::filterActions(const QPoint& position) -{ - int charLine, charColumn; - getCharacterPosition(position,charLine,charColumn); - - Filter::HotSpot* spot = _filterChain->hotSpotAt(charLine,charColumn); - - return spot ? spot->actions() : QList<QAction*>(); -} - -void TerminalDisplay::mouseMoveEvent(QMouseEvent* ev) -{ - int charLine = 0; - int charColumn = 0; - int scrollBarWidth = (_scrollbarLocation == ScrollBarLeft) ? _scrollBar->width() : 0; - - getCharacterPosition(ev->pos(),charLine,charColumn); - - // handle filters - // change link hot-spot appearance on mouse-over - Filter::HotSpot* spot = _filterChain->hotSpotAt(charLine,charColumn); - if ( spot && spot->type() == Filter::HotSpot::Link) - { - QRegion previousHotspotArea = _mouseOverHotspotArea; - _mouseOverHotspotArea = QRegion(); - QRect r; - if (spot->startLine()==spot->endLine()) { - r.setCoords( spot->startColumn()*_fontWidth + scrollBarWidth, - spot->startLine()*_fontHeight, - spot->endColumn()*_fontWidth + scrollBarWidth, - (spot->endLine()+1)*_fontHeight - 1 ); - _mouseOverHotspotArea |= r; - } else { - r.setCoords( spot->startColumn()*_fontWidth + scrollBarWidth, - spot->startLine()*_fontHeight, - _columns*_fontWidth - 1 + scrollBarWidth, - (spot->startLine()+1)*_fontHeight ); - _mouseOverHotspotArea |= r; - for ( int line = spot->startLine()+1 ; line < spot->endLine() ; line++ ) { - r.setCoords( 0*_fontWidth + scrollBarWidth, - line*_fontHeight, - _columns*_fontWidth + scrollBarWidth, - (line+1)*_fontHeight ); - _mouseOverHotspotArea |= r; - } - r.setCoords( 0*_fontWidth + scrollBarWidth, - spot->endLine()*_fontHeight, - spot->endColumn()*_fontWidth + scrollBarWidth, - (spot->endLine()+1)*_fontHeight ); - _mouseOverHotspotArea |= r; - } - // display tooltips when mousing over links - // TODO: Extend this to work with filter types other than links - const QString& tooltip = spot->tooltip(); - if ( !tooltip.isEmpty() ) - { - QToolTip::showText( mapToGlobal(ev->pos()) , tooltip , this , _mouseOverHotspotArea.boundingRect() ); - } - - update( _mouseOverHotspotArea | previousHotspotArea ); - } - else if ( !_mouseOverHotspotArea.isEmpty() ) - { - update( _mouseOverHotspotArea ); - // set hotspot area to an invalid rectangle - _mouseOverHotspotArea = QRegion(); - } - - // for auto-hiding the cursor, we need mouseTracking - if (ev->buttons() == Qt::NoButton ) return; - - // if the terminal is interested in mouse movements - // then emit a mouse movement signal, unless the shift - // key is being held down, which overrides this. - if (!_mouseMarks && !(ev->modifiers() & Qt::ShiftModifier)) - { - int button = 3; - if (ev->buttons() & Qt::LeftButton) - button = 0; - if (ev->buttons() & Qt::MidButton) - button = 1; - if (ev->buttons() & Qt::RightButton) - button = 2; - - - emit mouseSignal( button, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum(), - 1 ); - - return; - } - - if (dragInfo.state == diPending) - { - // we had a mouse down, but haven't confirmed a drag yet - // if the mouse has moved sufficiently, we will confirm - - int distance = 10; //KGlobalSettings::dndEventDelay(); - if ( ev->x() > dragInfo.start.x() + distance || ev->x() < dragInfo.start.x() - distance || - ev->y() > dragInfo.start.y() + distance || ev->y() < dragInfo.start.y() - distance) - { - // we've left the drag square, we can start a real drag operation now - emit isBusySelecting(false); // Ok.. we can breath again. - - _screenWindow->clearSelection(); - doDrag(); - } - return; - } - else if (dragInfo.state == diDragging) - { - // this isn't technically needed because mouseMoveEvent is suppressed during - // Qt drag operations, replaced by dragMoveEvent - return; - } - - if (_actSel == 0) return; - - // don't extend selection while pasting - if (ev->buttons() & Qt::MidButton) return; - - extendSelection( ev->pos() ); -} - -void TerminalDisplay::extendSelection( const QPoint& position ) -{ - QPoint pos = position; - - if ( !_screenWindow ) - return; - - //if ( !contentsRect().contains(ev->pos()) ) return; - QPoint tL = contentsRect().topLeft(); - int tLx = tL.x(); - int tLy = tL.y(); - int scroll = _scrollBar->value(); - - // we're in the process of moving the mouse with the left button pressed - // the mouse cursor will kept caught within the bounds of the text in - // this widget. - - int linesBeyondWidget = 0; - - QRect textBounds(tLx + _leftMargin, - tLy + _topMargin, - _usedColumns*_fontWidth-1, - _usedLines*_fontHeight-1); - - // Adjust position within text area bounds. - QPoint oldpos = pos; - - pos.setX( qBound(textBounds.left(),pos.x(),textBounds.right()) ); - pos.setY( qBound(textBounds.top(),pos.y(),textBounds.bottom()) ); - - if ( oldpos.y() > textBounds.bottom() ) - { - linesBeyondWidget = (oldpos.y()-textBounds.bottom()) / _fontHeight; - _scrollBar->setValue(_scrollBar->value()+linesBeyondWidget+1); // scrollforward - } - if ( oldpos.y() < textBounds.top() ) - { - linesBeyondWidget = (textBounds.top()-oldpos.y()) / _fontHeight; - _scrollBar->setValue(_scrollBar->value()-linesBeyondWidget-1); // history - } - - int charColumn = 0; - int charLine = 0; - getCharacterPosition(pos,charLine,charColumn); - - QPoint here = QPoint(charColumn,charLine); //QPoint((pos.x()-tLx-_leftMargin+(_fontWidth/2))/_fontWidth,(pos.y()-tLy-_topMargin)/_fontHeight); - QPoint ohere; - QPoint _iPntSelCorr = _iPntSel; - _iPntSelCorr.ry() -= _scrollBar->value(); - QPoint _pntSelCorr = _pntSel; - _pntSelCorr.ry() -= _scrollBar->value(); - bool swapping = false; - - if ( _wordSelectionMode ) - { - // Extend to word boundaries - int i; - QChar selClass; - - bool left_not_right = ( here.y() < _iPntSelCorr.y() || - ( here.y() == _iPntSelCorr.y() && here.x() < _iPntSelCorr.x() ) ); - bool old_left_not_right = ( _pntSelCorr.y() < _iPntSelCorr.y() || - ( _pntSelCorr.y() == _iPntSelCorr.y() && _pntSelCorr.x() < _iPntSelCorr.x() ) ); - swapping = left_not_right != old_left_not_right; - - // Find left (left_not_right ? from here : from start) - QPoint left = left_not_right ? here : _iPntSelCorr; - i = loc(left.x(),left.y()); - if (i>=0 && i<=_imageSize) { - selClass = charClass(_image[i].character); - while ( ((left.x()>0) || (left.y()>0 && (_lineProperties[left.y()-1] & LINE_WRAPPED) )) - && charClass(_image[i-1].character) == selClass ) - { i--; if (left.x()>0) left.rx()--; else {left.rx()=_usedColumns-1; left.ry()--;} } - } - - // Find left (left_not_right ? from start : from here) - QPoint right = left_not_right ? _iPntSelCorr : here; - i = loc(right.x(),right.y()); - if (i>=0 && i<=_imageSize) { - selClass = charClass(_image[i].character); - while( ((right.x()<_usedColumns-1) || (right.y()<_usedLines-1 && (_lineProperties[right.y()] & LINE_WRAPPED) )) - && charClass(_image[i+1].character) == selClass ) - { i++; if (right.x()<_usedColumns-1) right.rx()++; else {right.rx()=0; right.ry()++; } } - } - - // Pick which is start (ohere) and which is extension (here) - if ( left_not_right ) - { - here = left; ohere = right; - } - else - { - here = right; ohere = left; - } - ohere.rx()++; - } - - if ( _lineSelectionMode ) - { - // Extend to complete line - bool above_not_below = ( here.y() < _iPntSelCorr.y() ); - - QPoint above = above_not_below ? here : _iPntSelCorr; - QPoint below = above_not_below ? _iPntSelCorr : here; - - while (above.y()>0 && (_lineProperties[above.y()-1] & LINE_WRAPPED) ) - above.ry()--; - while (below.y()<_usedLines-1 && (_lineProperties[below.y()] & LINE_WRAPPED) ) - below.ry()++; - - above.setX(0); - below.setX(_usedColumns-1); - - // Pick which is start (ohere) and which is extension (here) - if ( above_not_below ) - { - here = above; ohere = below; - } - else - { - here = below; ohere = above; - } - - QPoint newSelBegin = QPoint( ohere.x(), ohere.y() ); - swapping = !(_tripleSelBegin==newSelBegin); - _tripleSelBegin = newSelBegin; - - ohere.rx()++; - } - - int offset = 0; - if ( !_wordSelectionMode && !_lineSelectionMode ) - { - int i; - QChar selClass; - - bool left_not_right = ( here.y() < _iPntSelCorr.y() || - ( here.y() == _iPntSelCorr.y() && here.x() < _iPntSelCorr.x() ) ); - bool old_left_not_right = ( _pntSelCorr.y() < _iPntSelCorr.y() || - ( _pntSelCorr.y() == _iPntSelCorr.y() && _pntSelCorr.x() < _iPntSelCorr.x() ) ); - swapping = left_not_right != old_left_not_right; - - // Find left (left_not_right ? from here : from start) - QPoint left = left_not_right ? here : _iPntSelCorr; - - // Find left (left_not_right ? from start : from here) - QPoint right = left_not_right ? _iPntSelCorr : here; - if ( right.x() > 0 && !_columnSelectionMode ) - { - i = loc(right.x(),right.y()); - if (i>=0 && i<=_imageSize) { - selClass = charClass(_image[i-1].character); - /* if (selClass == ' ') - { - while ( right.x() < _usedColumns-1 && charClass(_image[i+1].character) == selClass && (right.y()<_usedLines-1) && - !(_lineProperties[right.y()] & LINE_WRAPPED)) - { i++; right.rx()++; } - if (right.x() < _usedColumns-1) - right = left_not_right ? _iPntSelCorr : here; - else - right.rx()++; // will be balanced later because of offset=-1; - }*/ - } - } - - // Pick which is start (ohere) and which is extension (here) - if ( left_not_right ) - { - here = left; ohere = right; offset = 0; - } - else - { - here = right; ohere = left; offset = -1; - } - } - - if ((here == _pntSelCorr) && (scroll == _scrollBar->value())) return; // not moved - - if (here == ohere) return; // It's not left, it's not right. - - if ( _actSel < 2 || swapping ) - { - if ( _columnSelectionMode && !_lineSelectionMode && !_wordSelectionMode ) - { - _screenWindow->setSelectionStart( ohere.x() , ohere.y() , true ); - } - else - { - _screenWindow->setSelectionStart( ohere.x()-1-offset , ohere.y() , false ); - } - - } - - _actSel = 2; // within selection - _pntSel = here; - _pntSel.ry() += _scrollBar->value(); - - if ( _columnSelectionMode && !_lineSelectionMode && !_wordSelectionMode ) - { - _screenWindow->setSelectionEnd( here.x() , here.y() ); - } - else - { - _screenWindow->setSelectionEnd( here.x()+offset , here.y() ); - } - -} - -void TerminalDisplay::mouseReleaseEvent(QMouseEvent* ev) -{ - if ( !_screenWindow ) - return; - - int charLine; - int charColumn; - getCharacterPosition(ev->pos(),charLine,charColumn); - - if ( ev->button() == Qt::LeftButton) - { - emit isBusySelecting(false); - if(dragInfo.state == diPending) - { - // We had a drag event pending but never confirmed. Kill selection - _screenWindow->clearSelection(); - //emit clearSelectionSignal(); - } - else - { - if ( _actSel > 1 ) - { - setSelection( _screenWindow->selectedText(_preserveLineBreaks) ); - } - - _actSel = 0; - - //FIXME: emits a release event even if the mouse is - // outside the range. The procedure used in `mouseMoveEvent' - // applies here, too. - - if (!_mouseMarks && !(ev->modifiers() & Qt::ShiftModifier)) - emit mouseSignal( 3, // release - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , 0); - } - dragInfo.state = diNone; - } - - - if ( !_mouseMarks && - ((ev->button() == Qt::RightButton && !(ev->modifiers() & Qt::ShiftModifier)) - || ev->button() == Qt::MidButton) ) - { - emit mouseSignal( 3, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , - 0); - } -} - -void TerminalDisplay::getCharacterPosition(const QPoint& widgetPoint,int& line,int& column) const -{ - column = (widgetPoint.x() + _fontWidth/2 -contentsRect().left()-_leftMargin) / _fontWidth; - line = (widgetPoint.y()-contentsRect().top()-_topMargin) / _fontHeight; - - if ( line < 0 ) - line = 0; - if ( column < 0 ) - column = 0; - - if ( line >= _usedLines ) - line = _usedLines-1; - - // the column value returned can be equal to _usedColumns, which - // is the position just after the last character displayed in a line. - // - // this is required so that the user can select characters in the right-most - // column (or left-most for right-to-left input) - if ( column > _usedColumns ) - column = _usedColumns; -} - -void TerminalDisplay::updateLineProperties() -{ - if ( !_screenWindow ) - return; - - _lineProperties = _screenWindow->getLineProperties(); -} - -void TerminalDisplay::mouseDoubleClickEvent(QMouseEvent* ev) -{ - if ( ev->button() != Qt::LeftButton) return; - if ( !_screenWindow ) return; - - int charLine = 0; - int charColumn = 0; - - getCharacterPosition(ev->pos(),charLine,charColumn); - - QPoint pos(charColumn,charLine); - - // pass on double click as two clicks. - if (!_mouseMarks && !(ev->modifiers() & Qt::ShiftModifier)) - { - // Send just _ONE_ click event, since the first click of the double click - // was already sent by the click handler - emit mouseSignal( 0, - pos.x()+1, - pos.y()+1 +_scrollBar->value() -_scrollBar->maximum(), - 0 ); // left button - return; - } - - _screenWindow->clearSelection(); - QPoint bgnSel = pos; - QPoint endSel = pos; - int i = loc(bgnSel.x(),bgnSel.y()); - _iPntSel = bgnSel; - _iPntSel.ry() += _scrollBar->value(); - - _wordSelectionMode = true; - - // find word boundaries... - QChar selClass = charClass(_image[i].character); - { - // find the start of the word - int x = bgnSel.x(); - while ( ((x>0) || (bgnSel.y()>0 && (_lineProperties[bgnSel.y()-1] & LINE_WRAPPED) )) - && charClass(_image[i-1].character) == selClass ) - { - i--; - if (x>0) - x--; - else - { - x=_usedColumns-1; - bgnSel.ry()--; - } - } - - bgnSel.setX(x); - _screenWindow->setSelectionStart( bgnSel.x() , bgnSel.y() , false ); - - // find the end of the word - i = loc( endSel.x(), endSel.y() ); - x = endSel.x(); - while( ((x<_usedColumns-1) || (endSel.y()<_usedLines-1 && (_lineProperties[endSel.y()] & LINE_WRAPPED) )) - && charClass(_image[i+1].character) == selClass ) - { - i++; - if (x<_usedColumns-1) - x++; - else - { - x=0; - endSel.ry()++; - } - } - - endSel.setX(x); - - // In word selection mode don't select @ (64) if at end of word. - if ( ( QChar( _image[i].character ) == '@' ) && ( ( endSel.x() - bgnSel.x() ) > 0 ) ) - endSel.setX( x - 1 ); - - - _actSel = 2; // within selection - - _screenWindow->setSelectionEnd( endSel.x() , endSel.y() ); - - setSelection( _screenWindow->selectedText(_preserveLineBreaks) ); - } - - _possibleTripleClick=true; - - QTimer::singleShot(QApplication::doubleClickInterval(),this, - SLOT(tripleClickTimeout())); -} - -void TerminalDisplay::wheelEvent( QWheelEvent* ev ) -{ - if (ev->orientation() != Qt::Vertical) - return; - - // if the terminal program is not interested mouse events - // then send the event to the scrollbar if the slider has room to move - // or otherwise send simulated up / down key presses to the terminal program - // for the benefit of programs such as 'less' - if ( _mouseMarks ) - { - bool canScroll = _scrollBar->maximum() > 0; - if (canScroll) - _scrollBar->event(ev); - else - { - // assume that each Up / Down key event will cause the terminal application - // to scroll by one line. - // - // to get a reasonable scrolling speed, scroll by one line for every 5 degrees - // of mouse wheel rotation. Mouse wheels typically move in steps of 15 degrees, - // giving a scroll of 3 lines - int key = ev->delta() > 0 ? Qt::Key_Up : Qt::Key_Down; - - // QWheelEvent::delta() gives rotation in eighths of a degree - int wheelDegrees = ev->delta() / 8; - int linesToScroll = abs(wheelDegrees) / 5; - - QKeyEvent keyScrollEvent(QEvent::KeyPress,key,Qt::NoModifier); - - for (int i=0;i<linesToScroll;i++) - emit keyPressedSignal(&keyScrollEvent); - } - } - else - { - // terminal program wants notification of mouse activity - - int charLine; - int charColumn; - getCharacterPosition( ev->pos() , charLine , charColumn ); - - emit mouseSignal( ev->delta() > 0 ? 4 : 5, - charColumn + 1, - charLine + 1 +_scrollBar->value() -_scrollBar->maximum() , - 0); - } -} - -void TerminalDisplay::tripleClickTimeout() -{ - _possibleTripleClick=false; -} - -void TerminalDisplay::mouseTripleClickEvent(QMouseEvent* ev) -{ - if ( !_screenWindow ) return; - - int charLine; - int charColumn; - getCharacterPosition(ev->pos(),charLine,charColumn); - _iPntSel = QPoint(charColumn,charLine); - - _screenWindow->clearSelection(); - - _lineSelectionMode = true; - _wordSelectionMode = false; - - _actSel = 2; // within selection - emit isBusySelecting(true); // Keep it steady... - - while (_iPntSel.y()>0 && (_lineProperties[_iPntSel.y()-1] & LINE_WRAPPED) ) - _iPntSel.ry()--; - - if (_tripleClickMode == SelectForwardsFromCursor) { - // find word boundary start - int i = loc(_iPntSel.x(),_iPntSel.y()); - QChar selClass = charClass(_image[i].character); - int x = _iPntSel.x(); - - while ( ((x>0) || - (_iPntSel.y()>0 && (_lineProperties[_iPntSel.y()-1] & LINE_WRAPPED) ) - ) - && charClass(_image[i-1].character) == selClass ) - { - i--; - if (x>0) - x--; - else - { - x=_columns-1; - _iPntSel.ry()--; - } - } - - _screenWindow->setSelectionStart( x , _iPntSel.y() , false ); - _tripleSelBegin = QPoint( x, _iPntSel.y() ); - } - else if (_tripleClickMode == SelectWholeLine) { - _screenWindow->setSelectionStart( 0 , _iPntSel.y() , false ); - _tripleSelBegin = QPoint( 0, _iPntSel.y() ); - } - - while (_iPntSel.y()<_lines-1 && (_lineProperties[_iPntSel.y()] & LINE_WRAPPED) ) - _iPntSel.ry()++; - - _screenWindow->setSelectionEnd( _columns - 1 , _iPntSel.y() ); - - setSelection(_screenWindow->selectedText(_preserveLineBreaks)); - - _iPntSel.ry() += _scrollBar->value(); -} - - -bool TerminalDisplay::focusNextPrevChild( bool next ) -{ - if (next) - return false; // This disables changing the active part in konqueror - // when pressing Tab - return QWidget::focusNextPrevChild( next ); -} - - -QChar TerminalDisplay::charClass(QChar qch) const -{ - if ( qch.isSpace() ) return ' '; - - if ( qch.isLetterOrNumber() || _wordCharacters.contains(qch, Qt::CaseInsensitive ) ) - return 'a'; - - return qch; -} - -void TerminalDisplay::setWordCharacters(const QString& wc) -{ - _wordCharacters = wc; -} - -void TerminalDisplay::setUsesMouse(bool on) -{ - _mouseMarks = on; - setCursor( _mouseMarks ? Qt::IBeamCursor : Qt::ArrowCursor ); -} -bool TerminalDisplay::usesMouse() const -{ - return _mouseMarks; -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Clipboard */ -/* */ -/* ------------------------------------------------------------------------- */ - -#undef KeyPress - -void TerminalDisplay::emitSelection(bool useXselection,bool appendReturn) -{ - if ( !_screenWindow ) - return; - - // Paste Clipboard by simulating keypress events - QString text = QApplication::clipboard()->text(useXselection ? QClipboard::Selection : - QClipboard::Clipboard); - if(appendReturn) - text.append("\r"); - if ( ! text.isEmpty() ) - { - text.replace('\n', '\r'); - QKeyEvent e(QEvent::KeyPress, 0, Qt::NoModifier, text); - emit keyPressedSignal(&e); // expose as a big fat keypress event - - _screenWindow->clearSelection(); - } -} - -void TerminalDisplay::setSelection(const QString& t) -{ - QApplication::clipboard()->setText(t, QClipboard::Selection); -} - -void TerminalDisplay::copyClipboard() -{ - if ( !_screenWindow ) - return; - - QString text = _screenWindow->selectedText(_preserveLineBreaks); - if (!text.isEmpty()) - QApplication::clipboard()->setText(text); -} - -void TerminalDisplay::pasteClipboard() -{ - emitSelection(false,false); -} - -void TerminalDisplay::pasteSelection() -{ - emitSelection(true,false); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Keyboard */ -/* */ -/* ------------------------------------------------------------------------- */ - -void TerminalDisplay::setFlowControlWarningEnabled( bool enable ) -{ - _flowControlWarningEnabled = enable; - - // if the dialog is currently visible and the flow control warning has - // been disabled then hide the dialog - if (!enable) - outputSuspended(false); -} - -void TerminalDisplay::keyPressEvent( QKeyEvent* event ) -{ - bool emitKeyPressSignal = true; - - if(event->modifiers() == Qt::ControlModifier) - { - switch(event->key()) { - case Qt::Key_C: - copyClipboard(); - break; - case Qt::Key_V: - pasteClipboard(); - break; - }; - } else if ( event->modifiers() == Qt::ShiftModifier ) { - bool update = true; - - if ( event->key() == Qt::Key_PageUp ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollPages , -1 ); - } - else if ( event->key() == Qt::Key_PageDown ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollPages , 1 ); - } - else if ( event->key() == Qt::Key_Up ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollLines , -1 ); - } - else if ( event->key() == Qt::Key_Down ) - { - _screenWindow->scrollBy( ScreenWindow::ScrollLines , 1 ); - } - else - update = false; - - if ( update ) - { - _screenWindow->setTrackOutput( _screenWindow->atEndOfOutput() ); - - updateLineProperties(); - updateImage(); - - // do not send key press to terminal - emitKeyPressSignal = false; - } - } - - _actSel=0; // Key stroke implies a screen update, so TerminalDisplay won't - // know where the current selection is. - - if (_hasBlinkingCursor) - { - _blinkCursorTimer->start(QApplication::cursorFlashTime() / 2); - if (_cursorBlinking) - blinkCursorEvent(); - else - _cursorBlinking = false; - } - - if ( emitKeyPressSignal ) - emit keyPressedSignal(event); - - event->accept(); -} - -void TerminalDisplay::inputMethodEvent( QInputMethodEvent* event ) -{ - QKeyEvent keyEvent(QEvent::KeyPress,0,Qt::NoModifier,event->commitString()); - emit keyPressedSignal(&keyEvent); - - _inputMethodData.preeditString = event->preeditString(); - update(preeditRect() | _inputMethodData.previousPreeditRect); - - event->accept(); -} -QVariant TerminalDisplay::inputMethodQuery( Qt::InputMethodQuery query ) const -{ - const QPoint cursorPos = _screenWindow ? _screenWindow->cursorPosition() : QPoint(0,0); - switch ( query ) - { - case Qt::ImMicroFocus: - return imageToWidget(QRect(cursorPos.x(),cursorPos.y(),1,1)); - break; - case Qt::ImFont: - return font(); - break; - case Qt::ImCursorPosition: - // return the cursor position within the current line - return cursorPos.x(); - break; - case Qt::ImSurroundingText: - { - // return the text from the current line - QString lineText; - QTextStream stream(&lineText); - PlainTextDecoder decoder; - decoder.begin(&stream); - decoder.decodeLine(&_image[loc(0,cursorPos.y())],_usedColumns,_lineProperties[cursorPos.y()]); - decoder.end(); - return lineText; - } - break; - case Qt::ImCurrentSelection: - return QString(); - break; - default: - break; - } - - return QVariant(); -} - -bool TerminalDisplay::handleShortcutOverrideEvent(QKeyEvent* keyEvent) -{ - int modifiers = keyEvent->modifiers(); - - // When a possible shortcut combination is pressed, - // emit the overrideShortcutCheck() signal to allow the host - // to decide whether the terminal should override it or not. - if (modifiers != Qt::NoModifier) - { - int modifierCount = 0; - unsigned int currentModifier = Qt::ShiftModifier; - - while (currentModifier <= Qt::KeypadModifier) - { - if (modifiers & currentModifier) - modifierCount++; - currentModifier <<= 1; - } - if (modifierCount < 2) - { - bool override = false; - emit overrideShortcutCheck(keyEvent,override); - if (override) - { - keyEvent->accept(); - return true; - } - } - } - - // Override any of the following shortcuts because - // they are needed by the terminal - int keyCode = keyEvent->key() | modifiers; - switch ( keyCode ) - { - // list is taken from the QLineEdit::event() code - case Qt::Key_Tab: - case Qt::Key_Delete: - case Qt::Key_Home: - case Qt::Key_End: - case Qt::Key_Backspace: - case Qt::Key_Left: - case Qt::Key_Right: - keyEvent->accept(); - return true; - } - return false; -} - -bool TerminalDisplay::event(QEvent* event) -{ - bool eventHandled = false; - switch (event->type()) - { - case QEvent::ShortcutOverride: - eventHandled = handleShortcutOverrideEvent((QKeyEvent*)event); - break; - case QEvent::PaletteChange: - case QEvent::ApplicationPaletteChange: - _scrollBar->setPalette( QApplication::palette() ); - break; - default: - break; - } - return eventHandled ? true : QWidget::event(event); -} - -void TerminalDisplay::setBellMode(int mode) -{ - _bellMode=mode; -} - -void TerminalDisplay::enableBell() -{ - _allowBell = true; -} - -void TerminalDisplay::bell(const QString& message) -{ - if (_bellMode==NoBell) return; - - //limit the rate at which bells can occur - //...mainly for sound effects where rapid bells in sequence - //produce a horrible noise - if ( _allowBell ) - { - _allowBell = false; - QTimer::singleShot(500,this,SLOT(enableBell())); - - if (_bellMode==SystemBeepBell) - { - // TODO: This will need added back in at some point - //KNotification::beep(); - } - else if (_bellMode==NotifyBell) - { - // TODO: This will need added back in at some point - //KNotification::event("BellVisible", message,QPixmap(),this); - } - else if (_bellMode==VisualBell) - { - swapColorTable(); - QTimer::singleShot(200,this,SLOT(swapColorTable())); - } - } -} - -void TerminalDisplay::swapColorTable() -{ - ColorEntry color = _colorTable[1]; - _colorTable[1]=_colorTable[0]; - _colorTable[0]= color; - _colorsInverted = !_colorsInverted; - update(); -} - -void TerminalDisplay::clearImage() -{ - // We initialize _image[_imageSize] too. See makeImage() - for (int i = 0; i <= _imageSize; i++) - { - _image[i].character = ' '; - _image[i].foregroundColor = CharacterColor(COLOR_SPACE_DEFAULT, - DEFAULT_FORE_COLOR); - _image[i].backgroundColor = CharacterColor(COLOR_SPACE_DEFAULT, - DEFAULT_BACK_COLOR); - _image[i].rendition = DEFAULT_RENDITION; - } -} - -void TerminalDisplay::calcGeometry() -{ - _scrollBar->resize(_scrollBar->sizeHint().width(), contentsRect().height()); - switch(_scrollbarLocation) - { - case NoScrollBar : - _leftMargin = DEFAULT_LEFT_MARGIN; - _contentWidth = contentsRect().width() - 2 * DEFAULT_LEFT_MARGIN; - break; - case ScrollBarLeft : - _leftMargin = DEFAULT_LEFT_MARGIN + _scrollBar->width(); - _contentWidth = contentsRect().width() - 2 * DEFAULT_LEFT_MARGIN - _scrollBar->width(); - _scrollBar->move(contentsRect().topLeft()); - break; - case ScrollBarRight: - _leftMargin = DEFAULT_LEFT_MARGIN; - _contentWidth = contentsRect().width() - 2 * DEFAULT_LEFT_MARGIN - _scrollBar->width(); - _scrollBar->move(contentsRect().topRight() - QPoint(_scrollBar->width()-1,0)); - break; - } - - _topMargin = DEFAULT_TOP_MARGIN; - _contentHeight = contentsRect().height() - 2 * DEFAULT_TOP_MARGIN + /* mysterious */ 1; - - if (!_isFixedSize) - { - // ensure that display is always at least one column wide - _columns = qMax(1,_contentWidth / _fontWidth); - _usedColumns = qMin(_usedColumns,_columns); - - // ensure that display is always at least one line high - _lines = qMax(1,_contentHeight / _fontHeight); - _usedLines = qMin(_usedLines,_lines); - } -} - -void TerminalDisplay::makeImage() -{ - calcGeometry(); - - // confirm that array will be of non-zero size, since the painting code - // assumes a non-zero array length - Q_ASSERT( _lines > 0 && _columns > 0 ); - Q_ASSERT( _usedLines <= _lines && _usedColumns <= _columns ); - - _imageSize=_lines*_columns; - - // We over-commit one character so that we can be more relaxed in dealing with - // certain boundary conditions: _image[_imageSize] is a valid but unused position - _image = new Character[_imageSize+1]; - - clearImage(); -} - -// calculate the needed size, this must be synced with calcGeometry() -void TerminalDisplay::setSize(int columns, int lines) -{ - int scrollBarWidth = _scrollBar->isHidden() ? 0 : _scrollBar->sizeHint().width(); - int horizontalMargin = 2 * DEFAULT_LEFT_MARGIN; - int verticalMargin = 2 * DEFAULT_TOP_MARGIN; - - QSize newSize = QSize( horizontalMargin + scrollBarWidth + (columns * _fontWidth) , - verticalMargin + (lines * _fontHeight) ); - - if ( newSize != size() ) - { - _size = newSize; - updateGeometry(); - } -} - -void TerminalDisplay::setFixedSize(int cols, int lins) -{ - _isFixedSize = true; - - //ensure that display is at least one line by one column in size - _columns = qMax(1,cols); - _lines = qMax(1,lins); - _usedColumns = qMin(_usedColumns,_columns); - _usedLines = qMin(_usedLines,_lines); - - if (_image) - { - delete[] _image; - makeImage(); - } - setSize(cols, lins); - QWidget::setFixedSize(_size); -} - -QSize TerminalDisplay::sizeHint() const -{ - return _size; -} - - -/* --------------------------------------------------------------------- */ -/* */ -/* Drag & Drop */ -/* */ -/* --------------------------------------------------------------------- */ - -void TerminalDisplay::dragEnterEvent(QDragEnterEvent* event) -{ - if (event->mimeData()->hasFormat("text/plain")) - event->acceptProposedAction(); -} - -void TerminalDisplay::dropEvent(QDropEvent* event) -{ - //KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); - - QString dropText; - /* - if (!urls.isEmpty()) - { - for ( int i = 0 ; i < urls.count() ; i++ ) - { - KUrl url = KIO::NetAccess::mostLocalUrl( urls[i] , 0 ); - QString urlText; - - if (url.isLocalFile()) - urlText = url.path(); - else - urlText = url.url(); - - // in future it may be useful to be able to insert file names with drag-and-drop - // without quoting them (this only affects paths with spaces in) - urlText = KShell::quoteArg(urlText); - - dropText += urlText; - - if ( i != urls.count()-1 ) - dropText += ' '; - } - } - else - { - dropText = event->mimeData()->text(); - } - */ - - if(event->mimeData()->hasFormat("text/plain")) - { - emit sendStringToEmu(dropText.toLocal8Bit()); - } -} - -void TerminalDisplay::doDrag() -{ - dragInfo.state = diDragging; - dragInfo.dragObject = new QDrag(this); - QMimeData *mimeData = new QMimeData; - mimeData->setText(QApplication::clipboard()->text(QClipboard::Selection)); - dragInfo.dragObject->setMimeData(mimeData); - dragInfo.dragObject->start(Qt::CopyAction); - // Don't delete the QTextDrag object. Qt will delete it when it's done with it. -} - -void TerminalDisplay::outputSuspended(bool suspended) -{ - //create the label when this function is first called - if (!_outputSuspendedLabel) - { - //This label includes a link to an English language website - //describing the 'flow control' (Xon/Xoff) feature found in almost - //all terminal emulators. - //If there isn't a suitable article available in the target language the link - //can simply be removed. - _outputSuspendedLabel = new QLabel( QString("<qt>Output has been " - "<a href=\"http://en.wikipedia.org/wiki/Flow_control\">suspended</a>" - " by pressing Ctrl+S." - " Press <b>Ctrl+Q</b> to resume.</qt>"), - this ); - - QPalette palette(_outputSuspendedLabel->palette()); - //KColorScheme::adjustBackground(palette,KColorScheme::NeutralBackground); - _outputSuspendedLabel->setPalette(palette); - _outputSuspendedLabel->setAutoFillBackground(true); - _outputSuspendedLabel->setBackgroundRole(QPalette::Base); - _outputSuspendedLabel->setFont(QApplication::font()); - _outputSuspendedLabel->setContentsMargins(5, 5, 5, 5); - - //enable activation of "Xon/Xoff" link in label - _outputSuspendedLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse | - Qt::LinksAccessibleByKeyboard); - _outputSuspendedLabel->setOpenExternalLinks(true); - _outputSuspendedLabel->setVisible(false); - - _gridLayout->addWidget(_outputSuspendedLabel); - _gridLayout->addItem( new QSpacerItem(0,0,QSizePolicy::Expanding, - QSizePolicy::Expanding), - 1,0); - - } - - _outputSuspendedLabel->setVisible(suspended); -} - -uint TerminalDisplay::lineSpacing() const -{ - return _lineSpacing; -} - -void TerminalDisplay::setLineSpacing(uint i) -{ - _lineSpacing = i; - setVTFont(font()); // Trigger an update. -} - -AutoScrollHandler::AutoScrollHandler(QWidget* parent) -: QObject(parent) -, _timerId(0) -{ - //parent->installEventFilter(this); -} -void AutoScrollHandler::timerEvent(QTimerEvent* event) -{ - if (event->timerId() != _timerId) - return; - - QMouseEvent mouseEvent( QEvent::MouseMove, - widget()->mapFromGlobal(QCursor::pos()), - Qt::NoButton, - Qt::LeftButton, - Qt::NoModifier); - - QApplication::sendEvent(widget(),&mouseEvent); -} -bool AutoScrollHandler::eventFilter(QObject* watched,QEvent* event) -{ - Q_ASSERT( watched == parent() ); - Q_UNUSED( watched ); - - QMouseEvent* mouseEvent = (QMouseEvent*)event; - switch (event->type()) - { - case QEvent::MouseMove: - { - bool mouseInWidget = widget()->rect().contains(mouseEvent->pos()); - - if (mouseInWidget) - { - if (_timerId) - killTimer(_timerId); - _timerId = 0; - } - else - { - if (!_timerId && (mouseEvent->buttons() & Qt::LeftButton)) - _timerId = startTimer(100); - } - break; - } - case QEvent::MouseButtonRelease: - if (_timerId && (mouseEvent->buttons() & ~Qt::LeftButton)) - { - killTimer(_timerId); - _timerId = 0; - } - break; - default: - break; - }; - - return false; -}
deleted file mode 100644 --- a/gui/src/TerminalDisplay.h +++ /dev/null @@ -1,816 +0,0 @@ -/* - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 TERMINALDISPLAY_H -#define TERMINALDISPLAY_H - -// Qt -#include <QtGui/QColor> -#include <QtCore/QPointer> -#include <QtGui/QWidget> - -// Konsole -#include "Filter.h" -#include "Character.h" - -class QDrag; -class QDragEnterEvent; -class QDropEvent; -class QLabel; -class QTimer; -class QEvent; -class QGridLayout; -class QKeyEvent; -class QScrollBar; -class QShowEvent; -class QHideEvent; -class QTimerEvent; -class QWidget; - -class KMenu; - -extern unsigned short vt100_graphics[32]; - -class ScreenWindow; - -/** - * A widget which displays output from a terminal emulation and sends input keypresses and mouse activity - * to the terminal. - * - * When the terminal emulation receives new output from the program running in the terminal, - * it will update the display by calling updateImage(). - * - * TODO More documentation - */ -class TerminalDisplay : public QWidget -{ - Q_OBJECT - -public: - /** Constructs a new terminal display widget with the specified parent. */ - TerminalDisplay(QWidget *parent=0); - virtual ~TerminalDisplay(); - - /** Returns the terminal color palette used by the display. */ - const ColorEntry* colorTable() const; - /** Sets the terminal color palette used by the display. */ - void setColorTable(const ColorEntry table[]); - /** - * Sets the seed used to generate random colors for the display - * (in color schemes that support them). - */ - void setRandomSeed(uint seed); - /** - * Returns the seed used to generate random colors for the display - * (in color schemes that support them). - */ - uint randomSeed() const; - - /** Sets the opacity of the terminal display. */ - void setOpacity(qreal opacity); - - /** - * This enum describes the location where the scroll bar is positioned in the display widget. - */ - enum ScrollBarPosition - { - /** Do not show the scroll bar. */ - NoScrollBar=0, - /** Show the scroll bar on the left side of the display. */ - ScrollBarLeft=1, - /** Show the scroll bar on the right side of the display. */ - ScrollBarRight=2 - }; - /** - * Specifies whether the terminal display has a vertical scroll bar, and if so whether it - * is shown on the left or right side of the display. - */ - void setScrollBarPosition(ScrollBarPosition position); - - /** - * Sets the current position and range of the display's scroll bar. - * - * @param cursor The position of the scroll bar's thumb. - * @param lines The maximum value of the scroll bar. - */ - void setScroll(int cursor, int lines); - - /** - * Returns the display's filter chain. When the image for the display is updated, - * the text is passed through each filter in the chain. Each filter can define - * hotspots which correspond to certain strings (such as URLs or particular words). - * Depending on the type of the hotspots created by the filter ( returned by Filter::Hotspot::type() ) - * the view will draw visual cues such as underlines on mouse-over for links or translucent - * rectangles for markers. - * - * To add a new filter to the view, call: - * viewWidget->filterChain()->addFilter( filterObject ); - */ - FilterChain* filterChain() const; - - /** - * Updates the filters in the display's filter chain. This will cause - * the hotspots to be updated to match the current image. - * - * WARNING: This function can be expensive depending on the - * image size and number of filters in the filterChain() - * - * TODO - This API does not really allow efficient usage. Revise it so - * that the processing can be done in a better way. - * - * eg: - * - Area of interest may be known ( eg. mouse cursor hovering - * over an area ) - */ - void processFilters(); - - /** - * Returns a list of menu actions created by the filters for the content - * at the given @p position. - */ - QList<QAction*> filterActions(const QPoint& position); - - /** Returns true if the cursor is set to blink or false otherwise. */ - bool blinkingCursor() { return _hasBlinkingCursor; } - /** Specifies whether or not the cursor blinks. */ - void setBlinkingCursor(bool blink); - - /** Specifies whether or not text can blink. */ - void setBlinkingTextEnabled(bool blink); - - void setCtrlDrag(bool enable) { _ctrlDrag=enable; } - bool ctrlDrag() { return _ctrlDrag; } - - /** - * This enum describes the methods for selecting text when - * the user triple-clicks within the display. - */ - enum TripleClickMode - { - /** Select the whole line underneath the cursor. */ - SelectWholeLine, - /** Select from the current cursor position to the end of the line. */ - SelectForwardsFromCursor - }; - /** Sets how the text is selected when the user triple clicks within the display. */ - void setTripleClickMode(TripleClickMode mode) { _tripleClickMode = mode; } - /** See setTripleClickSelectionMode() */ - TripleClickMode tripleClickMode() { return _tripleClickMode; } - - void setLineSpacing(uint); - uint lineSpacing() const; - - void emitSelection(bool useXselection,bool appendReturn); - - /** - * This enum describes the available shapes for the keyboard cursor. - * See setKeyboardCursorShape() - */ - enum KeyboardCursorShape - { - /** A rectangular block which covers the entire area of the cursor character. */ - BlockCursor, - /** - * A single flat line which occupies the space at the bottom of the cursor - * character's area. - */ - UnderlineCursor, - /** - * An cursor shaped like the capital letter 'I', similar to the IBeam - * cursor used in Qt/KDE text editors. - */ - IBeamCursor - }; - /** - * Sets the shape of the keyboard cursor. This is the cursor drawn - * at the position in the terminal where keyboard input will appear. - * - * In addition the terminal display widget also has a cursor for - * the mouse pointer, which can be set using the QWidget::setCursor() - * method. - * - * Defaults to BlockCursor - */ - void setKeyboardCursorShape(KeyboardCursorShape shape); - /** - * Returns the shape of the keyboard cursor. See setKeyboardCursorShape() - */ - KeyboardCursorShape keyboardCursorShape() const; - - /** - * Sets the color used to draw the keyboard cursor. - * - * The keyboard cursor defaults to using the foreground color of the character - * underneath it. - * - * @param useForegroundColor If true, the cursor color will change to match - * the foreground color of the character underneath it as it is moved, in this - * case, the @p color parameter is ignored and the color of the character - * under the cursor is inverted to ensure that it is still readable. - * @param color The color to use to draw the cursor. This is only taken into - * account if @p useForegroundColor is false. - */ - void setKeyboardCursorColor(bool useForegroundColor , const QColor& color); - - /** - * Returns the color of the keyboard cursor, or an invalid color if the keyboard - * cursor color is set to change according to the foreground color of the character - * underneath it. - */ - QColor keyboardCursorColor() const; - - /** - * Returns the number of lines of text which can be displayed in the widget. - * - * This will depend upon the height of the widget and the current font. - * See fontHeight() - */ - int lines() { return _lines; } - /** - * Returns the number of characters of text which can be displayed on - * each line in the widget. - * - * This will depend upon the width of the widget and the current font. - * See fontWidth() - */ - int columns() { return _columns; } - - /** - * Returns the height of the characters in the font used to draw the text in the display. - */ - int fontHeight() { return _fontHeight; } - /** - * Returns the width of the characters in the display. - * This assumes the use of a fixed-width font. - */ - int fontWidth() { return _fontWidth; } - - void setSize(int cols, int lins); - void setFixedSize(int cols, int lins); - - // reimplemented - QSize sizeHint() const; - - /** - * Sets which characters, in addition to letters and numbers, - * are regarded as being part of a word for the purposes - * of selecting words in the display by double clicking on them. - * - * The word boundaries occur at the first and last characters which - * are either a letter, number, or a character in @p wc - * - * @param wc An array of characters which are to be considered parts - * of a word ( in addition to letters and numbers ). - */ - void setWordCharacters(const QString& wc); - /** - * Returns the characters which are considered part of a word for the - * purpose of selecting words in the display with the mouse. - * - * @see setWordCharacters() - */ - QString wordCharacters() { return _wordCharacters; } - - /** - * Sets the type of effect used to alert the user when a 'bell' occurs in the - * terminal session. - * - * The terminal session can trigger the bell effect by calling bell() with - * the alert message. - */ - void setBellMode(int mode); - /** - * Returns the type of effect used to alert the user when a 'bell' occurs in - * the terminal session. - * - * See setBellMode() - */ - int bellMode() { return _bellMode; } - - /** - * This enum describes the different types of sounds and visual effects which - * can be used to alert the user when a 'bell' occurs in the terminal - * session. - */ - enum BellMode - { - /** A system beep. */ - SystemBeepBell=0, - /** - * KDE notification. This may play a sound, show a passive popup - * or perform some other action depending on the user's settings. - */ - NotifyBell=1, - /** A silent, visual bell (eg. inverting the display's colors briefly) */ - VisualBell=2, - /** No bell effects */ - NoBell=3 - }; - - void setSelection(const QString &t); - - /** - * Reimplemented. Has no effect. Use setVTFont() to change the font - * used to draw characters in the display. - */ - virtual void setFont(const QFont &); - - /** Returns the font used to draw characters in the display */ - QFont getVTFont() { return font(); } - - /** - * Sets the font used to draw the display. Has no effect if @p font - * is larger than the size of the display itself. - */ - void setVTFont(const QFont& font); - - /** - * Specified whether anti-aliasing of text in the terminal display - * is enabled or not. Defaults to enabled. - */ - static void setAntialias( bool antialias ) { _antialiasText = antialias; } - /** - * Returns true if anti-aliasing of text in the terminal is enabled. - */ - static bool antialias() { return _antialiasText; } - - /** - * Specifies whether characters with intense colors should be rendered - * as bold. Defaults to true. - */ - void setBoldIntense(bool value) { _boldIntense = value; } - /** - * Returns true if characters with intense colors are rendered in bold. - */ - bool getBoldIntense() { return _boldIntense; } - - /** - * Sets whether or not the current height and width of the - * terminal in lines and columns is displayed whilst the widget - * is being resized. - */ - void setTerminalSizeHint(bool on) { _terminalSizeHint=on; } - /** - * Returns whether or not the current height and width of - * the terminal in lines and columns is displayed whilst the widget - * is being resized. - */ - bool terminalSizeHint() { return _terminalSizeHint; } - /** - * Sets whether the terminal size display is shown briefly - * after the widget is first shown. - * - * See setTerminalSizeHint() , isTerminalSizeHint() - */ - void setTerminalSizeStartup(bool on) { _terminalSizeStartup=on; } - - /** - * Sets the status of the BiDi rendering inside the terminal display. - * Defaults to disabled. - */ - void setBidiEnabled(bool set) { _bidiEnabled=set; } - /** - * Returns the status of the BiDi rendering in this widget. - */ - bool isBidiEnabled() { return _bidiEnabled; } - - /** - * Sets the terminal screen section which is displayed in this widget. - * When updateImage() is called, the display fetches the latest character image from the - * the associated terminal screen window. - * - * In terms of the model-view paradigm, the ScreenWindow is the model which is rendered - * by the TerminalDisplay. - */ - void setScreenWindow( ScreenWindow* window ); - /** Returns the terminal screen section which is displayed in this widget. See setScreenWindow() */ - ScreenWindow* screenWindow() const; - - static bool HAVE_TRANSPARENCY; - -public slots: - - /** - * Causes the terminal display to fetch the latest character image from the associated - * terminal screen ( see setScreenWindow() ) and redraw the display. - */ - void updateImage(); - /** - * Causes the terminal display to fetch the latest line status flags from the - * associated terminal screen ( see setScreenWindow() ). - */ - void updateLineProperties(); - - /** Copies the selected text to the clipboard. */ - void copyClipboard(); - /** - * Pastes the content of the clipboard into the - * display. - */ - void pasteClipboard(); - /** - * Pastes the content of the selection into the - * display. - */ - void pasteSelection(); - - /** - * Changes whether the flow control warning box should be shown when the flow control - * stop key (Ctrl+S) are pressed. - */ - void setFlowControlWarningEnabled(bool enabled); - /** - * Returns true if the flow control warning box is enabled. - * See outputSuspended() and setFlowControlWarningEnabled() - */ - bool flowControlWarningEnabled() const - { return _flowControlWarningEnabled; } - - /** - * Causes the widget to display or hide a message informing the user that terminal - * output has been suspended (by using the flow control key combination Ctrl+S) - * - * @param suspended True if terminal output has been suspended and the warning message should - * be shown or false to indicate that terminal output has been resumed and that - * the warning message should disappear. - */ - void outputSuspended(bool suspended); - - /** - * Sets whether the program whoose output is being displayed in the view - * is interested in mouse events. - * - * If this is set to true, mouse signals will be emitted by the view when the user clicks, drags - * or otherwise moves the mouse inside the view. - * The user interaction needed to create selections will also change, and the user will be required - * to hold down the shift key to create a selection or perform other mouse activities inside the - * view area - since the program running in the terminal is being allowed to handle normal mouse - * events itself. - * - * @param usesMouse Set to true if the program running in the terminal is interested in mouse events - * or false otherwise. - */ - void setUsesMouse(bool usesMouse); - - /** See setUsesMouse() */ - bool usesMouse() const; - - /** - * Shows a notification that a bell event has occurred in the terminal. - * TODO: More documentation here - */ - void bell(const QString& message); - - /** - * Sets the background of the display to the specified color. - * @see setColorTable(), setForegroundColor() - */ - void setBackgroundColor(const QColor& color); - - /** - * Sets the text of the display to the specified color. - * @see setColorTable(), setBackgroundColor() - */ - void setForegroundColor(const QColor& color); - -signals: - - /** - * Emitted when the user presses a key whilst the terminal widget has focus. - */ - void keyPressedSignal(QKeyEvent *e); - - /** - * A mouse event occurred. - * @param button The mouse button (0 for left button, 1 for middle button, 2 for right button, 3 for release) - * @param column The character column where the event occurred - * @param line The character row where the event occurred - * @param eventType The type of event. 0 for a mouse press / release or 1 for mouse motion - */ - void mouseSignal(int button, int column, int line, int eventType); - void changedFontMetricSignal(int height, int width); - void changedContentSizeSignal(int height, int width); - - /** - * Emitted when the user right clicks on the display, or right-clicks with the Shift - * key held down if usesMouse() is true. - * - * This can be used to display a context menu. - */ - void configureRequest(const QPoint& position); - - /** - * When a shortcut which is also a valid terminal key sequence is pressed while - * the terminal widget has focus, this signal is emitted to allow the host to decide - * whether the shortcut should be overridden. - * When the shortcut is overridden, the key sequence will be sent to the terminal emulation instead - * and the action associated with the shortcut will not be triggered. - * - * @p override is set to false by default and the shortcut will be triggered as normal. - */ - void overrideShortcutCheck(QKeyEvent* keyEvent,bool& override); - - void isBusySelecting(bool); - void sendStringToEmu(const char*); - -protected: - virtual bool event( QEvent * ); - - virtual void paintEvent( QPaintEvent * ); - - virtual void showEvent(QShowEvent*); - virtual void hideEvent(QHideEvent*); - virtual void resizeEvent(QResizeEvent*); - - virtual void fontChange(const QFont &font); - virtual void focusInEvent(QFocusEvent* event); - virtual void focusOutEvent(QFocusEvent* event); - virtual void keyPressEvent(QKeyEvent* event); - virtual void mouseDoubleClickEvent(QMouseEvent* ev); - virtual void mousePressEvent( QMouseEvent* ); - virtual void mouseReleaseEvent( QMouseEvent* ); - virtual void mouseMoveEvent( QMouseEvent* ); - virtual void extendSelection( const QPoint& pos ); - virtual void wheelEvent( QWheelEvent* ); - - virtual bool focusNextPrevChild( bool next ); - - // drag and drop - virtual void dragEnterEvent(QDragEnterEvent* event); - virtual void dropEvent(QDropEvent* event); - void doDrag(); - enum DragState { diNone, diPending, diDragging }; - - struct _dragInfo { - DragState state; - QPoint start; - QDrag *dragObject; - } dragInfo; - - // classifies the 'ch' into one of three categories - // and returns a character to indicate which category it is in - // - // - A space (returns ' ') - // - Part of a word (returns 'a') - // - Other characters (returns the input character) - QChar charClass(QChar ch) const; - - void clearImage(); - - void mouseTripleClickEvent(QMouseEvent* ev); - - // reimplemented - virtual void inputMethodEvent ( QInputMethodEvent* event ); - virtual QVariant inputMethodQuery( Qt::InputMethodQuery query ) const; - -protected slots: - - void scrollBarPositionChanged(int value); - void blinkEvent(); - void blinkCursorEvent(); - - //Renables bell noises and visuals. Used to disable further bells for a short period of time - //after emitting the first in a sequence of bell events. - void enableBell(); - -private slots: - - void swapColorTable(); - void tripleClickTimeout(); // resets possibleTripleClick - -private: - - // -- Drawing helpers -- - - // divides the part of the display specified by 'rect' into - // fragments according to their colors and styles and calls - // drawTextFragment() to draw the fragments - void drawContents(QPainter &paint, const QRect &rect); - // draws a section of text, all the text in this section - // has a common color and style - void drawTextFragment(QPainter& painter, const QRect& rect, - const QString& text, const Character* style); - // draws the background for a text fragment - // if useOpacitySetting is true then the color's alpha value will be set to - // the display's transparency (set with setOpacity()), otherwise the background - // will be drawn fully opaque - void drawBackground(QPainter& painter, const QRect& rect, const QColor& color, - bool useOpacitySetting); - // draws the cursor character - void drawCursor(QPainter& painter, const QRect& rect , const QColor& foregroundColor, - const QColor& backgroundColor , bool& invertColors); - // draws the characters or line graphics in a text fragment - void drawCharacters(QPainter& painter, const QRect& rect, const QString& text, - const Character* style, bool invertCharacterColor); - // draws a string of line graphics - void drawLineCharString(QPainter& painter, int x, int y, - const QString& str, const Character* attributes); - - // draws the preedit string for input methods - void drawInputMethodPreeditString(QPainter& painter , const QRect& rect); - - // -- - - // maps an area in the character image to an area on the widget - QRect imageToWidget(const QRect& imageArea) const; - - // maps a point on the widget to the position ( ie. line and column ) - // of the character at that point. - void getCharacterPosition(const QPoint& widgetPoint,int& line,int& column) const; - - // the area where the preedit string for input methods will be draw - QRect preeditRect() const; - - // shows a notification window in the middle of the widget indicating the terminal's - // current size in columns and lines - void showResizeNotification(); - - // scrolls the image by a number of lines. - // 'lines' may be positive ( to scroll the image down ) - // or negative ( to scroll the image up ) - // 'region' is the part of the image to scroll - currently only - // the top, bottom and height of 'region' are taken into account, - // the left and right are ignored. - void scrollImage(int lines , const QRect& region); - - void calcGeometry(); - void propagateSize(); - void updateImageSize(); - void makeImage(); - - void paintFilters(QPainter& painter); - - // returns a region covering all of the areas of the widget which contain - // a hotspot - QRegion hotSpotRegion() const; - - // returns the position of the cursor in columns and lines - QPoint cursorPosition() const; - - // redraws the cursor - void updateCursor(); - - bool handleShortcutOverrideEvent(QKeyEvent* event); - - // the window onto the terminal screen which this display - // is currently showing. - QPointer<ScreenWindow> _screenWindow; - - bool _allowBell; - - QGridLayout* _gridLayout; - - bool _fixedFont; // has fixed pitch - int _fontHeight; // height - int _fontWidth; // width - int _fontAscent; // ascend - bool _boldIntense; // Whether intense colors should be rendered with bold font - - int _leftMargin; // offset - int _topMargin; // offset - - int _lines; // the number of lines that can be displayed in the widget - int _columns; // the number of columns that can be displayed in the widget - - int _usedLines; // the number of lines that are actually being used, this will be less - // than 'lines' if the character image provided with setImage() is smaller - // than the maximum image size which can be displayed - - int _usedColumns; // the number of columns that are actually being used, this will be less - // than 'columns' if the character image provided with setImage() is smaller - // than the maximum image size which can be displayed - - int _contentHeight; - int _contentWidth; - Character* _image; // [lines][columns] - // only the area [usedLines][usedColumns] in the image contains valid data - - int _imageSize; - QVector<LineProperty> _lineProperties; - - ColorEntry _colorTable[TABLE_COLORS]; - uint _randomSeed; - - bool _resizing; - bool _terminalSizeHint; - bool _terminalSizeStartup; - bool _bidiEnabled; - bool _mouseMarks; - - QPoint _iPntSel; // initial selection point - QPoint _pntSel; // current selection point - QPoint _tripleSelBegin; // help avoid flicker - int _actSel; // selection state - bool _wordSelectionMode; - bool _lineSelectionMode; - bool _preserveLineBreaks; - bool _columnSelectionMode; - - QClipboard* _clipboard; - QScrollBar* _scrollBar; - ScrollBarPosition _scrollbarLocation; - QString _wordCharacters; - int _bellMode; - - bool _blinking; // hide text in paintEvent - bool _hasBlinker; // has characters to blink - bool _cursorBlinking; // hide cursor in paintEvent - bool _hasBlinkingCursor; // has blinking cursor enabled - bool _allowBlinkingText; // allow text to blink - bool _ctrlDrag; // require Ctrl key for drag - TripleClickMode _tripleClickMode; - bool _isFixedSize; //Columns / lines are locked. - QTimer* _blinkTimer; // active when hasBlinker - QTimer* _blinkCursorTimer; // active when hasBlinkingCursor - - KMenu* _drop; - QString _dropText; - int _dndFileCount; - - bool _possibleTripleClick; // is set in mouseDoubleClickEvent and deleted - // after QApplication::doubleClickInterval() delay - - - QLabel* _resizeWidget; - QTimer* _resizeTimer; - - bool _flowControlWarningEnabled; - - //widgets related to the warning message that appears when the user presses Ctrl+S to suspend - //terminal output - informing them what has happened and how to resume output - QLabel* _outputSuspendedLabel; - - uint _lineSpacing; - - bool _colorsInverted; // true during visual bell - - QSize _size; - - QRgb _blendColor; - - // list of filters currently applied to the display. used for links and - // search highlight - TerminalImageFilterChain* _filterChain; - QRegion _mouseOverHotspotArea; - - KeyboardCursorShape _cursorShape; - - // custom cursor color. if this is invalid then the foreground - // color of the character under the cursor is used - QColor _cursorColor; - - - struct InputMethodData - { - QString preeditString; - QRect previousPreeditRect; - }; - InputMethodData _inputMethodData; - - static bool _antialiasText; // do we antialias or not - - //the delay in milliseconds between redrawing blinking text - static const int TEXT_BLINK_DELAY = 500; - static const int DEFAULT_LEFT_MARGIN = 1; - static const int DEFAULT_TOP_MARGIN = 1; - -public: - static void setTransparencyEnabled(bool enable) - { - HAVE_TRANSPARENCY = enable; - } -}; - -class AutoScrollHandler : public QObject -{ -Q_OBJECT - -public: - AutoScrollHandler(QWidget* parent); -protected: - virtual void timerEvent(QTimerEvent* event); - virtual bool eventFilter(QObject* watched,QEvent* event); -private: - QWidget* widget() const { return static_cast<QWidget*>(parent()); } - int _timerId; -}; - - -#endif // TERMINALDISPLAY_H
deleted file mode 100644 --- a/gui/src/VariablesDockWidget.cpp +++ /dev/null @@ -1,168 +0,0 @@ -#include "VariablesDockWidget.h" -#include <QHBoxLayout> -#include <QVBoxLayout> -#include <QPushButton> - -VariablesDockWidget::VariablesDockWidget(QWidget *parent) - : QDockWidget(parent) { - setObjectName("VariablesDockWidget"); - construct(); -} - -void VariablesDockWidget::construct() { - m_updateSemaphore = new QSemaphore(1); - QStringList headerLabels; - headerLabels << tr("Name") << tr("Type") << tr("Value"); - m_variablesTreeWidget = new QTreeWidget(this); - m_variablesTreeWidget->setHeaderHidden(false); - m_variablesTreeWidget->setHeaderLabels(headerLabels); - QVBoxLayout *layout = new QVBoxLayout(); - - setWindowTitle(tr("Workspace")); - setWidget(new QWidget()); - - layout->addWidget(m_variablesTreeWidget); - QWidget *buttonBar = new QWidget(this); - layout->addWidget(buttonBar); - - QHBoxLayout *buttonBarLayout = new QHBoxLayout(); - QPushButton *saveWorkspaceButton = new QPushButton(tr("Save"), buttonBar); - QPushButton *loadWorkspaceButton = new QPushButton(tr("Load"), buttonBar); - QPushButton *clearWorkspaceButton = new QPushButton(tr("Clear"), buttonBar); - buttonBarLayout->addWidget(saveWorkspaceButton); - buttonBarLayout->addWidget(loadWorkspaceButton); - buttonBarLayout->addWidget(clearWorkspaceButton); - buttonBarLayout->setMargin(2); - buttonBar->setLayout(buttonBarLayout); - - layout->setMargin(2); - widget()->setLayout(layout); - - connect(saveWorkspaceButton, SIGNAL(clicked()), this, SLOT(emitSaveWorkspace())); - connect(loadWorkspaceButton, SIGNAL(clicked()), this, SLOT(emitLoadWorkspace())); - connect(clearWorkspaceButton, SIGNAL(clicked()), this, SLOT(emitClearWorkspace())); - - QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(); - treeWidgetItem->setData(0, 0, QString(tr("Local"))); - m_variablesTreeWidget->insertTopLevelItem(0, treeWidgetItem); - - treeWidgetItem = new QTreeWidgetItem(); - treeWidgetItem->setData(0, 0, QString(tr("Global"))); - m_variablesTreeWidget->insertTopLevelItem(1, treeWidgetItem); - - treeWidgetItem = new QTreeWidgetItem(); - treeWidgetItem->setData(0, 0, QString(tr("Persistent"))); - m_variablesTreeWidget->insertTopLevelItem(2, treeWidgetItem); - - treeWidgetItem = new QTreeWidgetItem(); - treeWidgetItem->setData(0, 0, QString(tr("Hidden"))); - m_variablesTreeWidget->insertTopLevelItem(3, treeWidgetItem); - - m_variablesTreeWidget->expandAll(); - m_variablesTreeWidget->setAlternatingRowColors(true); - m_variablesTreeWidget->setAnimated(true); -} - -void VariablesDockWidget::updateTreeEntry(QTreeWidgetItem *treeItem, SymbolRecord symbolRecord) { - treeItem->setData(0, 0, QString(symbolRecord.name().c_str())); - treeItem->setData(1, 0, QString(symbolRecord.varval().type_name().c_str())); - treeItem->setData(2, 0, OctaveLink::octaveValueAsQString(symbolRecord.varval())); -} - -void VariablesDockWidget::setVariablesList(QList<SymbolRecord> symbolTable) { - m_updateSemaphore->acquire(); - // Split the symbol table into its different scopes. - QList<SymbolRecord> localSymbolTable; - QList<SymbolRecord> globalSymbolTable; - QList<SymbolRecord> persistentSymbolTable; - QList<SymbolRecord> hiddenSymbolTable; - - foreach(SymbolRecord symbolRecord, symbolTable) { - // It's true that being global or hidden includes it's can mean it's also locally visible, - // but we want to distinguish that here. - if(symbolRecord.is_local() && !symbolRecord.is_global() && !symbolRecord.is_hidden()) { - localSymbolTable.append(symbolRecord); - } - - if(symbolRecord.is_global()) { - globalSymbolTable.append(symbolRecord); - } - - if(symbolRecord.is_persistent()) { - persistentSymbolTable.append(symbolRecord); - } - - if(symbolRecord.is_hidden()) { - hiddenSymbolTable.append(symbolRecord); - } - } - - updateScope(0, localSymbolTable); - updateScope(1, globalSymbolTable); - updateScope(2, persistentSymbolTable); - updateScope(3, hiddenSymbolTable); - m_updateSemaphore->release(); -} - -void VariablesDockWidget::updateScope(int topLevelItemIndex, QList<SymbolRecord> symbolTable) { - // This method may be a little bit confusing; variablesList is a complete list of all - // variables that are in the workspace currently. - QTreeWidgetItem *topLevelItem = m_variablesTreeWidget->topLevelItem(topLevelItemIndex); - - // First we check, if any variables that exist in the model tree have to be updated - // or created. So we walk the variablesList check against the tree. - foreach(SymbolRecord symbolRecord, symbolTable) { - int childCount = topLevelItem->childCount(); - bool alreadyExists = false; - QTreeWidgetItem *child; - - // Search for the corresponding item in the tree. If it has been found, child - // will contain the appropriate QTreeWidgetItem* pointing at it. - for(int i = 0; i < childCount; i++) { - child = topLevelItem->child(i); - if(child->data(0, 0).toString() == QString(symbolRecord.name().c_str())) { - alreadyExists = true; - break; - } - } - - // If it already exists, just update it. - if(alreadyExists) { - updateTreeEntry(child, symbolRecord); - } else { - // It does not exist, so create a new one and set the right values. - child = new QTreeWidgetItem(); - updateTreeEntry(child, symbolRecord); - topLevelItem->addChild(child); - } - } - - // Check the tree against the list for deleted variables. - for(int i = 0; i < topLevelItem->childCount(); i++) { - bool existsInVariableList = false; - QTreeWidgetItem *child = topLevelItem->child(i); - foreach(SymbolRecord symbolRecord, symbolTable) { - if(QString(symbolRecord.name().c_str()) == child->data(0, 0).toString()) { - existsInVariableList = true; - } - } - - if(!existsInVariableList) { - topLevelItem->removeChild(child); - delete child; - i--; - } - } -} - -void VariablesDockWidget::emitSaveWorkspace() { - emit saveWorkspace(); -} - -void VariablesDockWidget::emitLoadWorkspace() { - emit loadWorkspace(); -} - -void VariablesDockWidget::emitClearWorkspace() { - emit clearWorkspace(); -}
deleted file mode 100644 --- a/gui/src/VariablesDockWidget.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef VARIABLESDOCKWIDGET_H -#define VARIABLESDOCKWIDGET_H - -#include <QDockWidget> -#include <QTreeWidget> -#include <QSemaphore> -#include "OctaveLink.h" - -class VariablesDockWidget : public QDockWidget -{ - Q_OBJECT -public: - VariablesDockWidget(QWidget *parent = 0); - void setVariablesList(QList<SymbolRecord> symbolTable); - -signals: - void saveWorkspace(); - void loadWorkspace(); - void clearWorkspace(); - -private slots: - void emitSaveWorkspace(); - void emitLoadWorkspace(); - void emitClearWorkspace(); - -private: - void construct(); - void updateTreeEntry(QTreeWidgetItem *treeItem, SymbolRecord symbolRecord); - void updateScope(int topLevelItemIndex, QList<SymbolRecord> symbolTable); - QTreeWidget *m_variablesTreeWidget; - QSemaphore *m_updateSemaphore; -}; - -#endif // VARIABLESDOCKWIDGET_H
deleted file mode 100644 --- a/gui/src/Vt102Emulation.cpp +++ /dev/null @@ -1,1214 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2007-2008 by Robert Knight <robert.knight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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. -*/ - -// Own -#include "Vt102Emulation.h" - - -// this allows konsole to be compiled without XKB and XTEST extensions -// even though it might be available on a particular system. -#if defined(AVOID_XKB) - #undef HAVE_XKB -#endif - -#if defined(HAVE_XKB) - void scrolllock_set_off(); - void scrolllock_set_on(); -#endif - -// Standard -#include <stdio.h> -#include <unistd.h> -#include <assert.h> - -// Qt -#include <QtCore/QEvent> -#include <QtGui/QKeyEvent> -#include <QtCore/QByteRef> - -// Konsole -#include "KeyboardTranslator.h" -#include "Screen.h" - -Vt102Emulation::Vt102Emulation() - : Emulation(), - _titleUpdateTimer(new QTimer(this)) -{ - _titleUpdateTimer->setSingleShot(true); - QObject::connect(_titleUpdateTimer , SIGNAL(timeout()) , this , SLOT(updateTitle())); - - initTokenizer(); - reset(); -} - -Vt102Emulation::~Vt102Emulation() -{} - -void Vt102Emulation::clearEntireScreen() -{ - _currentScreen->clearEntireScreen(); - bufferedUpdate(); -} - -void Vt102Emulation::reset() -{ - resetTokenizer(); - resetModes(); - resetCharset(0); - _screen[0]->reset(); - resetCharset(1); - _screen[1]->reset(); - setCodec(LocaleCodec); - - bufferedUpdate(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Processing the incoming byte stream */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* Incoming Bytes Event pipeline - - This section deals with decoding the incoming character stream. - Decoding means here, that the stream is first separated into `tokens' - which are then mapped to a `meaning' provided as operations by the - `Screen' class or by the emulation class itself. - - The pipeline proceeds as follows: - - - Tokenizing the ESC codes (onReceiveChar) - - VT100 code page translation of plain characters (applyCharset) - - Interpretation of ESC codes (processToken) - - The escape codes and their meaning are described in the - technical reference of this program. -*/ - -// Tokens ------------------------------------------------------------------ -- - -/* - Since the tokens are the central notion if this section, we've put them - in front. They provide the syntactical elements used to represent the - terminals operations as byte sequences. - - They are encodes here into a single machine word, so that we can later - switch over them easily. Depending on the token itself, additional - argument variables are filled with parameter values. - - The tokens are defined below: - - - CHR - Printable characters (32..255 but DEL (=127)) - - CTL - Control characters (0..31 but ESC (= 27), DEL) - - ESC - Escape codes of the form <ESC><CHR but `[]()+*#'> - - ESC_DE - Escape codes of the form <ESC><any of `()+*#%'> C - - CSI_PN - Escape codes of the form <ESC>'[' {Pn} ';' {Pn} C - - CSI_PS - Escape codes of the form <ESC>'[' {Pn} ';' ... C - - CSI_PR - Escape codes of the form <ESC>'[' '?' {Pn} ';' ... C - - CSI_PE - Escape codes of the form <ESC>'[' '!' {Pn} ';' ... C - - VT52 - VT52 escape codes - - <ESC><Chr> - - <ESC>'Y'{Pc}{Pc} - - XTE_HA - Xterm window/terminal attribute commands - of the form <ESC>`]' {Pn} `;' {Text} <BEL> - (Note that these are handled differently to the other formats) - - The last two forms allow list of arguments. Since the elements of - the lists are treated individually the same way, they are passed - as individual tokens to the interpretation. Further, because the - meaning of the parameters are names (althought represented as numbers), - they are includes within the token ('N'). - -*/ - -#define TY_CONSTRUCT(T,A,N) ( ((((int)N) & 0xffff) << 16) | ((((int)A) & 0xff) << 8) | (((int)T) & 0xff) ) - -#define TY_CHR( ) TY_CONSTRUCT(0,0,0) -#define TY_CTL(A ) TY_CONSTRUCT(1,A,0) -#define TY_ESC(A ) TY_CONSTRUCT(2,A,0) -#define TY_ESC_CS(A,B) TY_CONSTRUCT(3,A,B) -#define TY_ESC_DE(A ) TY_CONSTRUCT(4,A,0) -#define TY_CSI_PS(A,N) TY_CONSTRUCT(5,A,N) -#define TY_CSI_PN(A ) TY_CONSTRUCT(6,A,0) -#define TY_CSI_PR(A,N) TY_CONSTRUCT(7,A,N) - -#define TY_VT52(A) TY_CONSTRUCT(8,A,0) -#define TY_CSI_PG(A) TY_CONSTRUCT(9,A,0) -#define TY_CSI_PE(A) TY_CONSTRUCT(10,A,0) - -#define MAX_ARGUMENT 4096 - -// Tokenizer --------------------------------------------------------------- -- - -/* The tokenizer's state - - The state is represented by the buffer (tokenBuffer, tokenBufferPos), - and accompanied by decoded arguments kept in (argv,argc). - Note that they are kept internal in the tokenizer. -*/ - -void Vt102Emulation::resetTokenizer() -{ - tokenBufferPos = 0; - argc = 0; - argv[0] = 0; - argv[1] = 0; -} - -void Vt102Emulation::addDigit(int digit) -{ - if (argv[argc] < MAX_ARGUMENT) - argv[argc] = 10*argv[argc] + digit; -} - -void Vt102Emulation::addArgument() -{ - argc = qMin(argc+1,MAXARGS-1); - argv[argc] = 0; -} - -void Vt102Emulation::addToCurrentToken(int cc) -{ - tokenBuffer[tokenBufferPos] = cc; - tokenBufferPos = qMin(tokenBufferPos+1,MAX_TOKEN_LENGTH-1); -} - -// Character Class flags used while decoding - -#define CTL 1 // Control character -#define CHR 2 // Printable character -#define CPN 4 // TODO: Document me -#define DIG 8 // Digit -#define SCS 16 // TODO: Document me -#define GRP 32 // TODO: Document me -#define CPS 64 // Character which indicates end of window resize - // escape sequence '\e[8;<row>;<col>t' - -void Vt102Emulation::initTokenizer() -{ - int i; - quint8* s; - for(i = 0;i < 256; ++i) - charClass[i] = 0; - for(i = 0;i < 32; ++i) - charClass[i] |= CTL; - for(i = 32;i < 256; ++i) - charClass[i] |= CHR; - for(s = (quint8*)"@ABCDGHILMPSTXZcdfry"; *s; ++s) - charClass[*s] |= CPN; - // resize = \e[8;<row>;<col>t - for(s = (quint8*)"t"; *s; ++s) - charClass[*s] |= CPS; - for(s = (quint8*)"0123456789"; *s; ++s) - charClass[*s] |= DIG; - for(s = (quint8*)"()+*%"; *s; ++s) - charClass[*s] |= SCS; - for(s = (quint8*)"()+*#[]%"; *s; ++s) - charClass[*s] |= GRP; - - resetTokenizer(); -} - -/* Ok, here comes the nasty part of the decoder. - - Instead of keeping an explicit state, we deduce it from the - token scanned so far. It is then immediately combined with - the current character to form a scanning decision. - - This is done by the following defines. - - - P is the length of the token scanned so far. - - L (often P-1) is the position on which contents we base a decision. - - C is a character or a group of characters (taken from 'charClass'). - - - 'cc' is the current character - - 's' is a pointer to the start of the token buffer - - 'p' is the current position within the token buffer - - Note that they need to applied in proper order. -*/ - -#define lec(P,L,C) (p == (P) && s[(L)] == (C)) -#define lun( ) (p == 1 && cc >= 32 ) -#define les(P,L,C) (p == (P) && s[L] < 256 && (charClass[s[(L)]] & (C)) == (C)) -#define eec(C) (p >= 3 && cc == (C)) -#define ees(C) (p >= 3 && cc < 256 && (charClass[cc] & (C)) == (C)) -#define eps(C) (p >= 3 && s[2] != '?' && s[2] != '!' && s[2] != '>' && cc < 256 && (charClass[cc] & (C)) == (C)) -#define epp( ) (p >= 3 && s[2] == '?') -#define epe( ) (p >= 3 && s[2] == '!') -#define egt( ) (p >= 3 && s[2] == '>') -#define Xpe (tokenBufferPos >= 2 && tokenBuffer[1] == ']') -#define Xte (Xpe && cc == 7 ) -#define ces(C) (cc < 256 && (charClass[cc] & (C)) == (C) && !Xte) - -#define ESC 27 -#define CNTL(c) ((c)-'@') - -// process an incoming unicode character -void Vt102Emulation::receiveChar(int cc) -{ - if (cc == 127) - return; //VT100: ignore. - - if (ces(CTL)) - { - // DEC HACK ALERT! Control Characters are allowed *within* esc sequences in VT100 - // This means, they do neither a resetTokenizer() nor a pushToToken(). Some of them, do - // of course. Guess this originates from a weakly layered handling of the X-on - // X-off protocol, which comes really below this level. - if (cc == CNTL('X') || cc == CNTL('Z') || cc == ESC) - resetTokenizer(); //VT100: CAN or SUB - if (cc != ESC) - { - processToken(TY_CTL(cc+'@' ),0,0); - return; - } - } - // advance the state - addToCurrentToken(cc); - - int* s = tokenBuffer; - int p = tokenBufferPos; - - if (getMode(MODE_Ansi)) - { - if (lec(1,0,ESC)) { return; } - if (lec(1,0,ESC+128)) { s[0] = ESC; receiveChar('['); return; } - if (les(2,1,GRP)) { return; } - if (Xte ) { processWindowAttributeChange(); resetTokenizer(); return; } - if (Xpe ) { return; } - if (lec(3,2,'?')) { return; } - if (lec(3,2,'>')) { return; } - if (lec(3,2,'!')) { return; } - if (lun( )) { processToken( TY_CHR(), applyCharset(cc), 0); resetTokenizer(); return; } - if (lec(2,0,ESC)) { processToken( TY_ESC(s[1]), 0, 0); resetTokenizer(); return; } - if (les(3,1,SCS)) { processToken( TY_ESC_CS(s[1],s[2]), 0, 0); resetTokenizer(); return; } - if (lec(3,1,'#')) { processToken( TY_ESC_DE(s[2]), 0, 0); resetTokenizer(); return; } - if (eps( CPN)) { processToken( TY_CSI_PN(cc), argv[0],argv[1]); resetTokenizer(); return; } - - // resize = \e[8;<row>;<col>t - if (eps(CPS)) - { - processToken( TY_CSI_PS(cc, argv[0]), argv[1], argv[2]); - resetTokenizer(); - return; - } - - if (epe( )) { processToken( TY_CSI_PE(cc), 0, 0); resetTokenizer(); return; } - if (ees(DIG)) { addDigit(cc-'0'); return; } - if (eec(';')) { addArgument(); return; } - for (int i=0;i<=argc;i++) - { - if (epp()) - processToken( TY_CSI_PR(cc,argv[i]), 0, 0); - else if (egt()) - processToken( TY_CSI_PG(cc), 0, 0); // spec. case for ESC]>0c or ESC]>c - else if (cc == 'm' && argc - i >= 4 && (argv[i] == 38 || argv[i] == 48) && argv[i+1] == 2) - { - // ESC[ ... 48;2;<red>;<green>;<blue> ... m -or- ESC[ ... 38;2;<red>;<green>;<blue> ... m - i += 2; - processToken( TY_CSI_PS(cc, argv[i-2]), COLOR_SPACE_RGB, (argv[i] << 16) | (argv[i+1] << 8) | argv[i+2]); - i += 2; - } - else if (cc == 'm' && argc - i >= 2 && (argv[i] == 38 || argv[i] == 48) && argv[i+1] == 5) - { - // ESC[ ... 48;5;<index> ... m -or- ESC[ ... 38;5;<index> ... m - i += 2; - processToken( TY_CSI_PS(cc, argv[i-2]), COLOR_SPACE_256, argv[i]); - } - else - processToken( TY_CSI_PS(cc,argv[i]), 0, 0); - } - resetTokenizer(); - } - else - { - // VT52 Mode - if (lec(1,0,ESC)) - return; - if (les(1,0,CHR)) - { - processToken( TY_CHR(), s[0], 0); - resetTokenizer(); - return; - } - if (lec(2,1,'Y')) - return; - if (lec(3,1,'Y')) - return; - if (p < 4) - { - processToken( TY_VT52(s[1] ), 0, 0); - resetTokenizer(); - return; - } - processToken( TY_VT52(s[1]), s[2], s[3]); - resetTokenizer(); - return; - } -} -void Vt102Emulation::processWindowAttributeChange() -{ - // Describes the window or terminal session attribute to change - // See Session::UserTitleChange for possible values - int attributeToChange = 0; - int i; - for (i = 2; i < tokenBufferPos && - tokenBuffer[i] >= '0' && - tokenBuffer[i] <= '9'; i++) - { - attributeToChange = 10 * attributeToChange + (tokenBuffer[i]-'0'); - } - - if (tokenBuffer[i] != ';') - { - reportDecodingError(); - return; - } - - QString newValue; - newValue.reserve(tokenBufferPos-i-2); - for (int j = 0; j < tokenBufferPos-i-2; j++) - newValue[j] = tokenBuffer[i+1+j]; - - _pendingTitleUpdates[attributeToChange] = newValue; - _titleUpdateTimer->start(20); -} - -void Vt102Emulation::updateTitle() -{ - QListIterator<int> iter( _pendingTitleUpdates.keys() ); - while (iter.hasNext()) { - int arg = iter.next(); - emit titleChanged( arg , _pendingTitleUpdates[arg] ); - } - _pendingTitleUpdates.clear(); -} - -// Interpreting Codes --------------------------------------------------------- - -/* - Now that the incoming character stream is properly tokenized, - meaning is assigned to them. These are either operations of - the current _screen, or of the emulation class itself. - - The token to be interpreteted comes in as a machine word - possibly accompanied by two parameters. - - Likewise, the operations assigned to, come with up to two - arguments. One could consider to make up a proper table - from the function below. - - The technical reference manual provides more information - about this mapping. -*/ - -void Vt102Emulation::processToken(int token, int p, int q) -{ - switch (token) - { - - case TY_CHR( ) : _currentScreen->displayCharacter (p ); break; //UTF16 - - // 127 DEL : ignored on input - - case TY_CTL('@' ) : /* NUL: ignored */ break; - case TY_CTL('A' ) : /* SOH: ignored */ break; - case TY_CTL('B' ) : /* STX: ignored */ break; - case TY_CTL('C' ) : /* ETX: ignored */ break; - case TY_CTL('D' ) : /* EOT: ignored */ break; - case TY_CTL('E' ) : reportAnswerBack ( ); break; //VT100 - case TY_CTL('F' ) : /* ACK: ignored */ break; - case TY_CTL('G' ) : emit stateSet(NOTIFYBELL); - break; //VT100 - case TY_CTL('H' ) : _currentScreen->backspace ( ); break; //VT100 - case TY_CTL('I' ) : _currentScreen->tab ( ); break; //VT100 - case TY_CTL('J' ) : _currentScreen->newLine ( ); break; //VT100 - case TY_CTL('K' ) : _currentScreen->newLine ( ); break; //VT100 - case TY_CTL('L' ) : _currentScreen->newLine ( ); break; //VT100 - case TY_CTL('M' ) : _currentScreen->toStartOfLine ( ); break; //VT100 - - case TY_CTL('N' ) : useCharset ( 1); break; //VT100 - case TY_CTL('O' ) : useCharset ( 0); break; //VT100 - - case TY_CTL('P' ) : /* DLE: ignored */ break; - case TY_CTL('Q' ) : /* DC1: XON continue */ break; //VT100 - case TY_CTL('R' ) : /* DC2: ignored */ break; - case TY_CTL('S' ) : /* DC3: XOFF halt */ break; //VT100 - case TY_CTL('T' ) : /* DC4: ignored */ break; - case TY_CTL('U' ) : /* NAK: ignored */ break; - case TY_CTL('V' ) : /* SYN: ignored */ break; - case TY_CTL('W' ) : /* ETB: ignored */ break; - case TY_CTL('X' ) : _currentScreen->displayCharacter ( 0x2592); break; //VT100 - case TY_CTL('Y' ) : /* EM : ignored */ break; - case TY_CTL('Z' ) : _currentScreen->displayCharacter ( 0x2592); break; //VT100 - case TY_CTL('[' ) : /* ESC: cannot be seen here. */ break; - case TY_CTL('\\' ) : /* FS : ignored */ break; - case TY_CTL(']' ) : /* GS : ignored */ break; - case TY_CTL('^' ) : /* RS : ignored */ break; - case TY_CTL('_' ) : /* US : ignored */ break; - - case TY_ESC('D' ) : _currentScreen->index ( ); break; //VT100 - case TY_ESC('E' ) : _currentScreen->nextLine ( ); break; //VT100 - case TY_ESC('H' ) : _currentScreen->changeTabStop (true ); break; //VT100 - case TY_ESC('M' ) : _currentScreen->reverseIndex ( ); break; //VT100 - case TY_ESC('Z' ) : reportTerminalType ( ); break; - case TY_ESC('c' ) : reset ( ); break; - - case TY_ESC('n' ) : useCharset ( 2); break; - case TY_ESC('o' ) : useCharset ( 3); break; - case TY_ESC('7' ) : saveCursor ( ); break; - case TY_ESC('8' ) : restoreCursor ( ); break; - - case TY_ESC('=' ) : setMode (MODE_AppKeyPad); break; - case TY_ESC('>' ) : resetMode (MODE_AppKeyPad); break; - case TY_ESC('<' ) : setMode (MODE_Ansi ); break; //VT100 - - case TY_ESC_CS('(', '0') : setCharset (0, '0'); break; //VT100 - case TY_ESC_CS('(', 'A') : setCharset (0, 'A'); break; //VT100 - case TY_ESC_CS('(', 'B') : setCharset (0, 'B'); break; //VT100 - - case TY_ESC_CS(')', '0') : setCharset (1, '0'); break; //VT100 - case TY_ESC_CS(')', 'A') : setCharset (1, 'A'); break; //VT100 - case TY_ESC_CS(')', 'B') : setCharset (1, 'B'); break; //VT100 - - case TY_ESC_CS('*', '0') : setCharset (2, '0'); break; //VT100 - case TY_ESC_CS('*', 'A') : setCharset (2, 'A'); break; //VT100 - case TY_ESC_CS('*', 'B') : setCharset (2, 'B'); break; //VT100 - - case TY_ESC_CS('+', '0') : setCharset (3, '0'); break; //VT100 - case TY_ESC_CS('+', 'A') : setCharset (3, 'A'); break; //VT100 - case TY_ESC_CS('+', 'B') : setCharset (3, 'B'); break; //VT100 - - case TY_ESC_CS('%', 'G') : setCodec (Utf8Codec ); break; //LINUX - case TY_ESC_CS('%', '@') : setCodec (LocaleCodec ); break; //LINUX - - case TY_ESC_DE('3' ) : /* Double height line, top half */ - _currentScreen->setLineProperty( LINE_DOUBLEWIDTH , true ); - _currentScreen->setLineProperty( LINE_DOUBLEHEIGHT , true ); - break; - case TY_ESC_DE('4' ) : /* Double height line, bottom half */ - _currentScreen->setLineProperty( LINE_DOUBLEWIDTH , true ); - _currentScreen->setLineProperty( LINE_DOUBLEHEIGHT , true ); - break; - case TY_ESC_DE('5' ) : /* Single width, single height line*/ - _currentScreen->setLineProperty( LINE_DOUBLEWIDTH , false); - _currentScreen->setLineProperty( LINE_DOUBLEHEIGHT , false); - break; - case TY_ESC_DE('6' ) : /* Double width, single height line*/ - _currentScreen->setLineProperty( LINE_DOUBLEWIDTH , true); - _currentScreen->setLineProperty( LINE_DOUBLEHEIGHT , false); - break; - case TY_ESC_DE('8' ) : _currentScreen->helpAlign ( ); break; - -// resize = \e[8;<row>;<col>t - case TY_CSI_PS('t', 8) : setImageSize( q /* columns */, p /* lines */ ); break; - -// change tab text color : \e[28;<color>t color: 0-16,777,215 - case TY_CSI_PS('t', 28) : emit changeTabTextColorRequest ( p ); break; - - case TY_CSI_PS('K', 0) : _currentScreen->clearToEndOfLine ( ); break; - case TY_CSI_PS('K', 1) : _currentScreen->clearToBeginOfLine ( ); break; - case TY_CSI_PS('K', 2) : _currentScreen->clearEntireLine ( ); break; - case TY_CSI_PS('J', 0) : _currentScreen->clearToEndOfScreen ( ); break; - case TY_CSI_PS('J', 1) : _currentScreen->clearToBeginOfScreen ( ); break; - case TY_CSI_PS('J', 2) : _currentScreen->clearEntireScreen ( ); break; - case TY_CSI_PS('J', 3) : clearHistory(); break; - case TY_CSI_PS('g', 0) : _currentScreen->changeTabStop (false ); break; //VT100 - case TY_CSI_PS('g', 3) : _currentScreen->clearTabStops ( ); break; //VT100 - case TY_CSI_PS('h', 4) : _currentScreen-> setMode (MODE_Insert ); break; - case TY_CSI_PS('h', 20) : setMode (MODE_NewLine ); break; - case TY_CSI_PS('i', 0) : /* IGNORE: attached printer */ break; //VT100 - case TY_CSI_PS('l', 4) : _currentScreen-> resetMode (MODE_Insert ); break; - case TY_CSI_PS('l', 20) : resetMode (MODE_NewLine ); break; - case TY_CSI_PS('s', 0) : saveCursor ( ); break; - case TY_CSI_PS('u', 0) : restoreCursor ( ); break; - - case TY_CSI_PS('m', 0) : _currentScreen->setDefaultRendition ( ); break; - case TY_CSI_PS('m', 1) : _currentScreen-> setRendition (RE_BOLD ); break; //VT100 - case TY_CSI_PS('m', 4) : _currentScreen-> setRendition (RE_UNDERLINE); break; //VT100 - case TY_CSI_PS('m', 5) : _currentScreen-> setRendition (RE_BLINK ); break; //VT100 - case TY_CSI_PS('m', 7) : _currentScreen-> setRendition (RE_REVERSE ); break; - case TY_CSI_PS('m', 10) : /* IGNORED: mapping related */ break; //LINUX - case TY_CSI_PS('m', 11) : /* IGNORED: mapping related */ break; //LINUX - case TY_CSI_PS('m', 12) : /* IGNORED: mapping related */ break; //LINUX - case TY_CSI_PS('m', 22) : _currentScreen->resetRendition (RE_BOLD ); break; - case TY_CSI_PS('m', 24) : _currentScreen->resetRendition (RE_UNDERLINE); break; - case TY_CSI_PS('m', 25) : _currentScreen->resetRendition (RE_BLINK ); break; - case TY_CSI_PS('m', 27) : _currentScreen->resetRendition (RE_REVERSE ); break; - - case TY_CSI_PS('m', 30) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 0); break; - case TY_CSI_PS('m', 31) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 1); break; - case TY_CSI_PS('m', 32) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 2); break; - case TY_CSI_PS('m', 33) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 3); break; - case TY_CSI_PS('m', 34) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 4); break; - case TY_CSI_PS('m', 35) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 5); break; - case TY_CSI_PS('m', 36) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 6); break; - case TY_CSI_PS('m', 37) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 7); break; - - case TY_CSI_PS('m', 38) : _currentScreen->setForeColor (p, q); break; - - case TY_CSI_PS('m', 39) : _currentScreen->setForeColor (COLOR_SPACE_DEFAULT, 0); break; - - case TY_CSI_PS('m', 40) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 0); break; - case TY_CSI_PS('m', 41) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 1); break; - case TY_CSI_PS('m', 42) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 2); break; - case TY_CSI_PS('m', 43) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 3); break; - case TY_CSI_PS('m', 44) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 4); break; - case TY_CSI_PS('m', 45) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 5); break; - case TY_CSI_PS('m', 46) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 6); break; - case TY_CSI_PS('m', 47) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 7); break; - - case TY_CSI_PS('m', 48) : _currentScreen->setBackColor (p, q); break; - - case TY_CSI_PS('m', 49) : _currentScreen->setBackColor (COLOR_SPACE_DEFAULT, 1); break; - - case TY_CSI_PS('m', 90) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 8); break; - case TY_CSI_PS('m', 91) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 9); break; - case TY_CSI_PS('m', 92) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 10); break; - case TY_CSI_PS('m', 93) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 11); break; - case TY_CSI_PS('m', 94) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 12); break; - case TY_CSI_PS('m', 95) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 13); break; - case TY_CSI_PS('m', 96) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 14); break; - case TY_CSI_PS('m', 97) : _currentScreen->setForeColor (COLOR_SPACE_SYSTEM, 15); break; - - case TY_CSI_PS('m', 100) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 8); break; - case TY_CSI_PS('m', 101) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 9); break; - case TY_CSI_PS('m', 102) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 10); break; - case TY_CSI_PS('m', 103) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 11); break; - case TY_CSI_PS('m', 104) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 12); break; - case TY_CSI_PS('m', 105) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 13); break; - case TY_CSI_PS('m', 106) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 14); break; - case TY_CSI_PS('m', 107) : _currentScreen->setBackColor (COLOR_SPACE_SYSTEM, 15); break; - - case TY_CSI_PS('n', 5) : reportStatus ( ); break; - case TY_CSI_PS('n', 6) : reportCursorPosition ( ); break; - case TY_CSI_PS('q', 0) : /* IGNORED: LEDs off */ break; //VT100 - case TY_CSI_PS('q', 1) : /* IGNORED: LED1 on */ break; //VT100 - case TY_CSI_PS('q', 2) : /* IGNORED: LED2 on */ break; //VT100 - case TY_CSI_PS('q', 3) : /* IGNORED: LED3 on */ break; //VT100 - case TY_CSI_PS('q', 4) : /* IGNORED: LED4 on */ break; //VT100 - case TY_CSI_PS('x', 0) : reportTerminalParms ( 2); break; //VT100 - case TY_CSI_PS('x', 1) : reportTerminalParms ( 3); break; //VT100 - - case TY_CSI_PN('@' ) : _currentScreen->insertChars (p ); break; - case TY_CSI_PN('A' ) : _currentScreen->cursorUp (p ); break; //VT100 - case TY_CSI_PN('B' ) : _currentScreen->cursorDown (p ); break; //VT100 - case TY_CSI_PN('C' ) : _currentScreen->cursorRight (p ); break; //VT100 - case TY_CSI_PN('D' ) : _currentScreen->cursorLeft (p ); break; //VT100 - case TY_CSI_PN('G' ) : _currentScreen->setCursorX (p ); break; //LINUX - case TY_CSI_PN('H' ) : _currentScreen->setCursorYX (p, q); break; //VT100 - case TY_CSI_PN('I' ) : _currentScreen->tab (p ); break; - case TY_CSI_PN('L' ) : _currentScreen->insertLines (p ); break; - case TY_CSI_PN('M' ) : _currentScreen->deleteLines (p ); break; - case TY_CSI_PN('P' ) : _currentScreen->deleteChars (p ); break; - case TY_CSI_PN('S' ) : _currentScreen->scrollUp (p ); break; - case TY_CSI_PN('T' ) : _currentScreen->scrollDown (p ); break; - case TY_CSI_PN('X' ) : _currentScreen->eraseChars (p ); break; - case TY_CSI_PN('Z' ) : _currentScreen->backtab (p ); break; - case TY_CSI_PN('c' ) : reportTerminalType ( ); break; //VT100 - case TY_CSI_PN('d' ) : _currentScreen->setCursorY (p ); break; //LINUX - case TY_CSI_PN('f' ) : _currentScreen->setCursorYX (p, q); break; //VT100 - case TY_CSI_PN('r' ) : setMargins (p, q); break; //VT100 - case TY_CSI_PN('y' ) : /* IGNORED: Confidence test */ break; //VT100 - - case TY_CSI_PR('h', 1) : setMode (MODE_AppCuKeys); break; //VT100 - case TY_CSI_PR('l', 1) : resetMode (MODE_AppCuKeys); break; //VT100 - case TY_CSI_PR('s', 1) : saveMode (MODE_AppCuKeys); break; //FIXME - case TY_CSI_PR('r', 1) : restoreMode (MODE_AppCuKeys); break; //FIXME - - case TY_CSI_PR('l', 2) : resetMode (MODE_Ansi ); break; //VT100 - - case TY_CSI_PR('h', 3) : setMode (MODE_132Columns);break; //VT100 - case TY_CSI_PR('l', 3) : resetMode (MODE_132Columns);break; //VT100 - - case TY_CSI_PR('h', 4) : /* IGNORED: soft scrolling */ break; //VT100 - case TY_CSI_PR('l', 4) : /* IGNORED: soft scrolling */ break; //VT100 - - case TY_CSI_PR('h', 5) : _currentScreen-> setMode (MODE_Screen ); break; //VT100 - case TY_CSI_PR('l', 5) : _currentScreen-> resetMode (MODE_Screen ); break; //VT100 - - case TY_CSI_PR('h', 6) : _currentScreen-> setMode (MODE_Origin ); break; //VT100 - case TY_CSI_PR('l', 6) : _currentScreen-> resetMode (MODE_Origin ); break; //VT100 - case TY_CSI_PR('s', 6) : _currentScreen-> saveMode (MODE_Origin ); break; //FIXME - case TY_CSI_PR('r', 6) : _currentScreen->restoreMode (MODE_Origin ); break; //FIXME - - case TY_CSI_PR('h', 7) : _currentScreen-> setMode (MODE_Wrap ); break; //VT100 - case TY_CSI_PR('l', 7) : _currentScreen-> resetMode (MODE_Wrap ); break; //VT100 - case TY_CSI_PR('s', 7) : _currentScreen-> saveMode (MODE_Wrap ); break; //FIXME - case TY_CSI_PR('r', 7) : _currentScreen->restoreMode (MODE_Wrap ); break; //FIXME - - case TY_CSI_PR('h', 8) : /* IGNORED: autorepeat on */ break; //VT100 - case TY_CSI_PR('l', 8) : /* IGNORED: autorepeat off */ break; //VT100 - case TY_CSI_PR('s', 8) : /* IGNORED: autorepeat on */ break; //VT100 - case TY_CSI_PR('r', 8) : /* IGNORED: autorepeat off */ break; //VT100 - - case TY_CSI_PR('h', 9) : /* IGNORED: interlace */ break; //VT100 - case TY_CSI_PR('l', 9) : /* IGNORED: interlace */ break; //VT100 - case TY_CSI_PR('s', 9) : /* IGNORED: interlace */ break; //VT100 - case TY_CSI_PR('r', 9) : /* IGNORED: interlace */ break; //VT100 - - case TY_CSI_PR('h', 12) : /* IGNORED: Cursor blink */ break; //att610 - case TY_CSI_PR('l', 12) : /* IGNORED: Cursor blink */ break; //att610 - case TY_CSI_PR('s', 12) : /* IGNORED: Cursor blink */ break; //att610 - case TY_CSI_PR('r', 12) : /* IGNORED: Cursor blink */ break; //att610 - - case TY_CSI_PR('h', 25) : setMode (MODE_Cursor ); break; //VT100 - case TY_CSI_PR('l', 25) : resetMode (MODE_Cursor ); break; //VT100 - case TY_CSI_PR('s', 25) : saveMode (MODE_Cursor ); break; //VT100 - case TY_CSI_PR('r', 25) : restoreMode (MODE_Cursor ); break; //VT100 - - case TY_CSI_PR('h', 40) : setMode(MODE_Allow132Columns ); break; // XTERM - case TY_CSI_PR('l', 40) : resetMode(MODE_Allow132Columns ); break; // XTERM - - case TY_CSI_PR('h', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - case TY_CSI_PR('l', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - case TY_CSI_PR('s', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - case TY_CSI_PR('r', 41) : /* IGNORED: obsolete more(1) fix */ break; //XTERM - - case TY_CSI_PR('h', 47) : setMode (MODE_AppScreen); break; //VT100 - case TY_CSI_PR('l', 47) : resetMode (MODE_AppScreen); break; //VT100 - case TY_CSI_PR('s', 47) : saveMode (MODE_AppScreen); break; //XTERM - case TY_CSI_PR('r', 47) : restoreMode (MODE_AppScreen); break; //XTERM - - case TY_CSI_PR('h', 67) : /* IGNORED: DECBKM */ break; //XTERM - case TY_CSI_PR('l', 67) : /* IGNORED: DECBKM */ break; //XTERM - case TY_CSI_PR('s', 67) : /* IGNORED: DECBKM */ break; //XTERM - case TY_CSI_PR('r', 67) : /* IGNORED: DECBKM */ break; //XTERM - - // XTerm defines the following modes: - // SET_VT200_MOUSE 1000 - // SET_VT200_HIGHLIGHT_MOUSE 1001 - // SET_BTN_EVENT_MOUSE 1002 - // SET_ANY_EVENT_MOUSE 1003 - // - - //Note about mouse modes: - //There are four mouse modes which xterm-compatible terminals can support - 1000,1001,1002,1003 - //Konsole currently supports mode 1000 (basic mouse press and release) and mode 1002 (dragging the mouse). - //TODO: Implementation of mouse modes 1001 (something called hilight tracking) and - //1003 (a slight variation on dragging the mouse) - // - - case TY_CSI_PR('h', 1000) : setMode (MODE_Mouse1000); break; //XTERM - case TY_CSI_PR('l', 1000) : resetMode (MODE_Mouse1000); break; //XTERM - case TY_CSI_PR('s', 1000) : saveMode (MODE_Mouse1000); break; //XTERM - case TY_CSI_PR('r', 1000) : restoreMode (MODE_Mouse1000); break; //XTERM - - case TY_CSI_PR('h', 1001) : /* IGNORED: hilite mouse tracking */ break; //XTERM - case TY_CSI_PR('l', 1001) : resetMode (MODE_Mouse1001); break; //XTERM - case TY_CSI_PR('s', 1001) : /* IGNORED: hilite mouse tracking */ break; //XTERM - case TY_CSI_PR('r', 1001) : /* IGNORED: hilite mouse tracking */ break; //XTERM - - case TY_CSI_PR('h', 1002) : setMode (MODE_Mouse1002); break; //XTERM - case TY_CSI_PR('l', 1002) : resetMode (MODE_Mouse1002); break; //XTERM - case TY_CSI_PR('s', 1002) : saveMode (MODE_Mouse1002); break; //XTERM - case TY_CSI_PR('r', 1002) : restoreMode (MODE_Mouse1002); break; //XTERM - - case TY_CSI_PR('h', 1003) : setMode (MODE_Mouse1003); break; //XTERM - case TY_CSI_PR('l', 1003) : resetMode (MODE_Mouse1003); break; //XTERM - case TY_CSI_PR('s', 1003) : saveMode (MODE_Mouse1003); break; //XTERM - case TY_CSI_PR('r', 1003) : restoreMode (MODE_Mouse1003); break; //XTERM - - case TY_CSI_PR('h', 1034) : /* IGNORED: 8bitinput activation */ break; //XTERM - - case TY_CSI_PR('h', 1047) : setMode (MODE_AppScreen); break; //XTERM - case TY_CSI_PR('l', 1047) : _screen[1]->clearEntireScreen(); resetMode(MODE_AppScreen); break; //XTERM - case TY_CSI_PR('s', 1047) : saveMode (MODE_AppScreen); break; //XTERM - case TY_CSI_PR('r', 1047) : restoreMode (MODE_AppScreen); break; //XTERM - - //FIXME: Unitoken: save translations - case TY_CSI_PR('h', 1048) : saveCursor ( ); break; //XTERM - case TY_CSI_PR('l', 1048) : restoreCursor ( ); break; //XTERM - case TY_CSI_PR('s', 1048) : saveCursor ( ); break; //XTERM - case TY_CSI_PR('r', 1048) : restoreCursor ( ); break; //XTERM - - //FIXME: every once new sequences like this pop up in xterm. - // Here's a guess of what they could mean. - case TY_CSI_PR('h', 1049) : saveCursor(); _screen[1]->clearEntireScreen(); setMode(MODE_AppScreen); break; //XTERM - case TY_CSI_PR('l', 1049) : resetMode(MODE_AppScreen); restoreCursor(); break; //XTERM - - //FIXME: weird DEC reset sequence - case TY_CSI_PE('p' ) : /* IGNORED: reset ( ) */ break; - - //FIXME: when changing between vt52 and ansi mode evtl do some resetting. - case TY_VT52('A' ) : _currentScreen->cursorUp ( 1); break; //VT52 - case TY_VT52('B' ) : _currentScreen->cursorDown ( 1); break; //VT52 - case TY_VT52('C' ) : _currentScreen->cursorRight ( 1); break; //VT52 - case TY_VT52('D' ) : _currentScreen->cursorLeft ( 1); break; //VT52 - - case TY_VT52('F' ) : setAndUseCharset (0, '0'); break; //VT52 - case TY_VT52('G' ) : setAndUseCharset (0, 'B'); break; //VT52 - - case TY_VT52('H' ) : _currentScreen->setCursorYX (1,1 ); break; //VT52 - case TY_VT52('I' ) : _currentScreen->reverseIndex ( ); break; //VT52 - case TY_VT52('J' ) : _currentScreen->clearToEndOfScreen ( ); break; //VT52 - case TY_VT52('K' ) : _currentScreen->clearToEndOfLine ( ); break; //VT52 - case TY_VT52('Y' ) : _currentScreen->setCursorYX (p-31,q-31 ); break; //VT52 - case TY_VT52('Z' ) : reportTerminalType ( ); break; //VT52 - case TY_VT52('<' ) : setMode (MODE_Ansi ); break; //VT52 - case TY_VT52('=' ) : setMode (MODE_AppKeyPad); break; //VT52 - case TY_VT52('>' ) : resetMode (MODE_AppKeyPad); break; //VT52 - - case TY_CSI_PG('c' ) : reportSecondaryAttributes( ); break; //VT100 - - default: - reportDecodingError(); - break; - }; -} - -void Vt102Emulation::clearScreenAndSetColumns(int columnCount) -{ - setImageSize(_currentScreen->getLines(),columnCount); - clearEntireScreen(); - setDefaultMargins(); - _currentScreen->setCursorYX(0,0); -} - -void Vt102Emulation::sendString(const char* s , int length) -{ - if ( length >= 0 ) - emit sendData(s,length); - else - emit sendData(s,strlen(s)); -} - -void Vt102Emulation::reportCursorPosition() -{ - char tmp[20]; - sprintf(tmp,"\033[%d;%dR",_currentScreen->getCursorY()+1,_currentScreen->getCursorX()+1); - sendString(tmp); -} - -void Vt102Emulation::reportTerminalType() -{ - // Primary device attribute response (Request was: ^[[0c or ^[[c (from TT321 Users Guide)) - // VT220: ^[[?63;1;2;3;6;7;8c (list deps on emul. capabilities) - // VT100: ^[[?1;2c - // VT101: ^[[?1;0c - // VT102: ^[[?6v - if (getMode(MODE_Ansi)) - sendString("\033[?1;2c"); // I'm a VT100 - else - sendString("\033/Z"); // I'm a VT52 -} - -void Vt102Emulation::reportSecondaryAttributes() -{ - // Seconday device attribute response (Request was: ^[[>0c or ^[[>c) - if (getMode(MODE_Ansi)) - sendString("\033[>0;115;0c"); // Why 115? ;) - else - sendString("\033/Z"); // FIXME I don't think VT52 knows about it but kept for - // konsoles backward compatibility. -} - -void Vt102Emulation::reportTerminalParms(int p) -// DECREPTPARM -{ - char tmp[100]; - sprintf(tmp,"\033[%d;1;1;112;112;1;0x",p); // not really true. - sendString(tmp); -} - -void Vt102Emulation::reportStatus() -{ - sendString("\033[0n"); //VT100. Device status report. 0 = Ready. -} - -void Vt102Emulation::reportAnswerBack() -{ - // FIXME - Test this with VTTEST - // This is really obsolete VT100 stuff. - const char* ANSWER_BACK = ""; - sendString(ANSWER_BACK); -} - -/*! - `cx',`cy' are 1-based. - `eventType' indicates the button pressed (0-2) - or a general mouse release (3). - - eventType represents the kind of mouse action that occurred: - 0 = Mouse button press or release - 1 = Mouse drag -*/ - -void Vt102Emulation::sendMouseEvent( int cb, int cx, int cy , int eventType ) -{ - if (cx < 1 || cy < 1) - return; - - // normal buttons are passed as 0x20 + button, - // mouse wheel (buttons 4,5) as 0x5c + button - if (cb >= 4) - cb += 0x3c; - - //Mouse motion handling - if ((getMode(MODE_Mouse1002) || getMode(MODE_Mouse1003)) && eventType == 1) - cb += 0x20; //add 32 to signify motion event - - char command[20]; - sprintf(command,"\033[M%c%c%c",cb+0x20,cx+0x20,cy+0x20); - sendString(command); -} - -void Vt102Emulation::sendText( const QString& text ) -{ - if (!text.isEmpty()) - { - QKeyEvent event(QEvent::KeyPress, - 0, - Qt::NoModifier, - text); - - sendKeyEvent(&event); // expose as a big fat keypress event - } -} -void Vt102Emulation::sendKeyEvent( QKeyEvent* event ) -{ - Qt::KeyboardModifiers modifiers = event->modifiers(); - KeyboardTranslator::States states = KeyboardTranslator::NoState; - - // get current states - if (getMode(MODE_NewLine) ) states |= KeyboardTranslator::NewLineState; - if (getMode(MODE_Ansi) ) states |= KeyboardTranslator::AnsiState; - if (getMode(MODE_AppCuKeys)) states |= KeyboardTranslator::CursorKeysState; - if (getMode(MODE_AppScreen)) states |= KeyboardTranslator::AlternateScreenState; - if (getMode(MODE_AppKeyPad) && (modifiers & Qt::KeypadModifier)) - states |= KeyboardTranslator::ApplicationKeypadState; - - // check flow control state - if (modifiers & Qt::ControlModifier) - { - if (event->key() == Qt::Key_S) - emit flowControlKeyPressed(true); - else if (event->key() == Qt::Key_Q) - emit flowControlKeyPressed(false); - } - - // lookup key binding - if ( _keyTranslator ) - { - KeyboardTranslator::Entry entry = _keyTranslator->findEntry( - event->key() , - modifiers, - states ); - - // send result to terminal - QByteArray textToSend; - - // special handling for the Alt (aka. Meta) modifier. pressing - // Alt+[Character] results in Esc+[Character] being sent - // (unless there is an entry defined for this particular combination - // in the keyboard modifier) - bool wantsAltModifier = entry.modifiers() & entry.modifierMask() & Qt::AltModifier; - bool wantsAnyModifier = entry.state() & - entry.stateMask() & KeyboardTranslator::AnyModifierState; - - if ( modifiers & Qt::AltModifier && !(wantsAltModifier || wantsAnyModifier) - && !event->text().isEmpty() ) - { - textToSend.prepend("\033"); - } - - if ( entry.command() != KeyboardTranslator::NoCommand ) - { - if (entry.command() & KeyboardTranslator::EraseCommand) - textToSend += eraseChar(); - - // TODO command handling - } - else if ( !entry.text().isEmpty() ) - { - textToSend += _codec->fromUnicode(entry.text(true,modifiers)); - } - else - textToSend += _codec->fromUnicode(event->text()); - - sendData( textToSend.constData() , textToSend.length() ); - } - else - { - // print an error message to the terminal if no key translator has been - // set - QString translatorError = QString("No keyboard translator available. " - "The information needed to convert key presses " - "into characters to send to the terminal " - "is missing."); - reset(); - receiveData( translatorError.toAscii().constData() , translatorError.count() ); - } -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* VT100 Charsets */ -/* */ -/* ------------------------------------------------------------------------- */ - -// Character Set Conversion ------------------------------------------------ -- - -/* - The processing contains a VT100 specific code translation layer. - It's still in use and mainly responsible for the line drawing graphics. - - These and some other glyphs are assigned to codes (0x5f-0xfe) - normally occupied by the latin letters. Since this codes also - appear within control sequences, the extra code conversion - does not permute with the tokenizer and is placed behind it - in the pipeline. It only applies to tokens, which represent - plain characters. - - This conversion it eventually continued in TerminalDisplay.C, since - it might involve VT100 enhanced fonts, which have these - particular glyphs allocated in (0x00-0x1f) in their code page. -*/ - -#define CHARSET _charset[_currentScreen==_screen[1]] - -// Apply current character map. - -unsigned short Vt102Emulation::applyCharset(unsigned short c) -{ - if (CHARSET.graphic && 0x5f <= c && c <= 0x7e) return vt100_graphics[c-0x5f]; - if (CHARSET.pound && c == '#' ) return 0xa3; //This mode is obsolete - return c; -} - -/* - "Charset" related part of the emulation state. - This configures the VT100 charset filter. - - While most operation work on the current _screen, - the following two are different. -*/ - -void Vt102Emulation::resetCharset(int scrno) -{ - _charset[scrno].cu_cs = 0; - strncpy(_charset[scrno].charset,"BBBB",4); - _charset[scrno].sa_graphic = false; - _charset[scrno].sa_pound = false; - _charset[scrno].graphic = false; - _charset[scrno].pound = false; -} - -void Vt102Emulation::setCharset(int n, int cs) // on both screens. -{ - _charset[0].charset[n&3] = cs; useCharset(_charset[0].cu_cs); - _charset[1].charset[n&3] = cs; useCharset(_charset[1].cu_cs); -} - -void Vt102Emulation::setAndUseCharset(int n, int cs) -{ - CHARSET.charset[n&3] = cs; - useCharset(n&3); -} - -void Vt102Emulation::useCharset(int n) -{ - CHARSET.cu_cs = n&3; - CHARSET.graphic = (CHARSET.charset[n&3] == '0'); - CHARSET.pound = (CHARSET.charset[n&3] == 'A'); //This mode is obsolete -} - -void Vt102Emulation::setDefaultMargins() -{ - _screen[0]->setDefaultMargins(); - _screen[1]->setDefaultMargins(); -} - -void Vt102Emulation::setMargins(int t, int b) -{ - _screen[0]->setMargins(t, b); - _screen[1]->setMargins(t, b); -} - -void Vt102Emulation::saveCursor() -{ - CHARSET.sa_graphic = CHARSET.graphic; - CHARSET.sa_pound = CHARSET.pound; //This mode is obsolete - // we are not clear about these - //sa_charset = charsets[cScreen->_charset]; - //sa_charset_num = cScreen->_charset; - _currentScreen->saveCursor(); -} - -void Vt102Emulation::restoreCursor() -{ - CHARSET.graphic = CHARSET.sa_graphic; - CHARSET.pound = CHARSET.sa_pound; //This mode is obsolete - _currentScreen->restoreCursor(); -} - -/* ------------------------------------------------------------------------- */ -/* */ -/* Mode Operations */ -/* */ -/* ------------------------------------------------------------------------- */ - -/* - Some of the emulations state is either added to the state of the screens. - - This causes some scoping problems, since different emulations choose to - located the mode either to the current _screen or to both. - - For strange reasons, the extend of the rendition attributes ranges over - all screens and not over the actual _screen. - - We decided on the precise precise extend, somehow. -*/ - -// "Mode" related part of the state. These are all booleans. - -void Vt102Emulation::resetModes() -{ - // MODE_Allow132Columns is not reset here - // to match Xterm's behaviour (see Xterm's VTReset() function) - - resetMode(MODE_132Columns); saveMode(MODE_132Columns); - resetMode(MODE_Mouse1000); saveMode(MODE_Mouse1000); - resetMode(MODE_Mouse1001); saveMode(MODE_Mouse1001); - resetMode(MODE_Mouse1002); saveMode(MODE_Mouse1002); - resetMode(MODE_Mouse1003); saveMode(MODE_Mouse1003); - - resetMode(MODE_AppScreen); saveMode(MODE_AppScreen); - resetMode(MODE_AppCuKeys); saveMode(MODE_AppCuKeys); - resetMode(MODE_AppKeyPad); saveMode(MODE_AppKeyPad); - resetMode(MODE_NewLine); - setMode(MODE_Ansi); -} - -void Vt102Emulation::setMode(int m) -{ - _currentModes.mode[m] = true; - switch (m) - { - case MODE_132Columns: - if (getMode(MODE_Allow132Columns)) - clearScreenAndSetColumns(132); - else - _currentModes.mode[m] = false; - break; - case MODE_Mouse1000: - case MODE_Mouse1001: - case MODE_Mouse1002: - case MODE_Mouse1003: - emit programUsesMouseChanged(false); - break; - - case MODE_AppScreen : _screen[1]->clearSelection(); - setScreen(1); - break; - } - if (m < MODES_SCREEN || m == MODE_NewLine) - { - _screen[0]->setMode(m); - _screen[1]->setMode(m); - } -} - -void Vt102Emulation::resetMode(int m) -{ - _currentModes.mode[m] = false; - switch (m) - { - case MODE_132Columns: - if (getMode(MODE_Allow132Columns)) - clearScreenAndSetColumns(80); - break; - case MODE_Mouse1000 : - case MODE_Mouse1001 : - case MODE_Mouse1002 : - case MODE_Mouse1003 : - emit programUsesMouseChanged(true); - break; - - case MODE_AppScreen : - _screen[0]->clearSelection(); - setScreen(0); - break; - } - if (m < MODES_SCREEN || m == MODE_NewLine) - { - _screen[0]->resetMode(m); - _screen[1]->resetMode(m); - } -} - -void Vt102Emulation::saveMode(int m) -{ - _savedModes.mode[m] = _currentModes.mode[m]; -} - -void Vt102Emulation::restoreMode(int m) -{ - if (_savedModes.mode[m]) - setMode(m); - else - resetMode(m); -} - -bool Vt102Emulation::getMode(int m) -{ - return _currentModes.mode[m]; -} - -char Vt102Emulation::eraseChar() const -{ - KeyboardTranslator::Entry entry = _keyTranslator->findEntry( - Qt::Key_Backspace, - 0, - 0); - if ( entry.text().count() > 0 ) - return entry.text()[0]; - else - return '\b'; -} - -// print contents of the scan buffer -static void hexdump(int* s, int len) -{ int i; - for (i = 0; i < len; i++) - { - if (s[i] == '\\') - printf("\\\\"); - else - if ((s[i]) > 32 && s[i] < 127) - printf("%c",s[i]); - else - printf("\\%04x(hex)",s[i]); - } -} - -void Vt102Emulation::reportDecodingError() -{ - if (tokenBufferPos == 0 || ( tokenBufferPos == 1 && (tokenBuffer[0] & 0xff) >= 32) ) - return; - printf("Undecodable sequence: "); - hexdump(tokenBuffer,tokenBufferPos); - printf("\n"); -} -
deleted file mode 100644 --- a/gui/src/Vt102Emulation.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - This file is part of Konsole, an X terminal. - - Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> - Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> - - This program 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 program 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 VT102EMULATION_H -#define VT102EMULATION_H - -// Standard Library -#include <stdio.h> - -// Qt -#include <QtGui/QKeyEvent> -#include <QtCore/QHash> -#include <QtCore/QTimer> - -// Konsole -#include "Emulation.h" -#include "Screen.h" - -#define MODE_AppScreen (MODES_SCREEN+0) // Mode #1 -#define MODE_AppCuKeys (MODES_SCREEN+1) // Application cursor keys (DECCKM) -#define MODE_AppKeyPad (MODES_SCREEN+2) // -#define MODE_Mouse1000 (MODES_SCREEN+3) // Send mouse X,Y position on press and release -#define MODE_Mouse1001 (MODES_SCREEN+4) // Use Hilight mouse tracking -#define MODE_Mouse1002 (MODES_SCREEN+5) // Use cell motion mouse tracking -#define MODE_Mouse1003 (MODES_SCREEN+6) // Use all motion mouse tracking -#define MODE_Ansi (MODES_SCREEN+7) // Use US Ascii for character sets G0-G3 (DECANM) -#define MODE_132Columns (MODES_SCREEN+8) // 80 <-> 132 column mode switch (DECCOLM) -#define MODE_Allow132Columns (MODES_SCREEN+9) // Allow DECCOLM mode -#define MODE_total (MODES_SCREEN+10) - -struct CharCodes -{ - // coding info - char charset[4]; // - int cu_cs; // actual charset. - bool graphic; // Some VT100 tricks - bool pound ; // Some VT100 tricks - bool sa_graphic; // saved graphic - bool sa_pound; // saved pound -}; - -/** - * Provides an xterm compatible terminal emulation based on the DEC VT102 terminal. - * A full description of this terminal can be found at http://vt100.net/docs/vt102-ug/ - * - * In addition, various additional xterm escape sequences are supported to provide - * features such as mouse input handling. - * See http://rtfm.etla.org/xterm/ctlseq.html for a description of xterm's escape - * sequences. - * - */ -class Vt102Emulation : public Emulation -{ -Q_OBJECT - -public: - /** Constructs a new emulation */ - Vt102Emulation(); - ~Vt102Emulation(); - - // reimplemented from Emulation - virtual void clearEntireScreen(); - virtual void reset(); - virtual char eraseChar() const; - -public slots: - // reimplemented from Emulation - virtual void sendString(const char*,int length = -1); - virtual void sendText(const QString& text); - virtual void sendKeyEvent(QKeyEvent*); - virtual void sendMouseEvent(int buttons, int column, int line, int eventType); - -protected: - // reimplemented from Emulation - virtual void setMode(int mode); - virtual void resetMode(int mode); - virtual void receiveChar(int cc); - -private slots: - //causes changeTitle() to be emitted for each (int,QString) pair in pendingTitleUpdates - //used to buffer multiple title updates - void updateTitle(); - -private: - unsigned short applyCharset(unsigned short c); - void setCharset(int n, int cs); - void useCharset(int n); - void setAndUseCharset(int n, int cs); - void saveCursor(); - void restoreCursor(); - void resetCharset(int scrno); - - void setMargins(int top, int bottom); - //set margins for all screens back to their defaults - void setDefaultMargins(); - - // returns true if 'mode' is set or false otherwise - bool getMode (int mode); - // saves the current boolean value of 'mode' - void saveMode (int mode); - // restores the boolean value of 'mode' - void restoreMode(int mode); - // resets all modes - // (except MODE_Allow132Columns) - void resetModes(); - - void resetTokenizer(); - #define MAX_TOKEN_LENGTH 80 - void addToCurrentToken(int cc); - int tokenBuffer[MAX_TOKEN_LENGTH]; //FIXME: overflow? - int tokenBufferPos; -#define MAXARGS 15 - void addDigit(int dig); - void addArgument(); - int argv[MAXARGS]; - int argc; - void initTokenizer(); - - // Set of flags for each of the ASCII characters which indicates - // what category they fall into (printable character, control, digit etc.) - // for the purposes of decoding terminal output - int charClass[256]; - - void reportDecodingError(); - - void processToken(int code, int p, int q); - void processWindowAttributeChange(); - - void reportTerminalType(); - void reportSecondaryAttributes(); - void reportStatus(); - void reportAnswerBack(); - void reportCursorPosition(); - void reportTerminalParms(int p); - - void onScrollLock(); - void scrollLock(const bool lock); - - // clears the screen and resizes it to the specified - // number of columns - void clearScreenAndSetColumns(int columnCount); - - CharCodes _charset[2]; - - class TerminalState - { - public: - // Initializes all modes to false - TerminalState() - { memset(&mode,false,MODE_total * sizeof(bool)); } - - bool mode[MODE_total]; - }; - - TerminalState _currentModes; - TerminalState _savedModes; - - //hash table and timer for buffering calls to the session instance - //to update the name of the session - //or window title. - //these calls occur when certain escape sequences are seen in the - //output from the terminal - QHash<int,QString> _pendingTitleUpdates; - QTimer* _titleUpdateTimer; -}; - -#endif // VT102EMULATION_H
deleted file mode 100644 --- a/gui/src/konsole_export.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - This file is part of the KDE project - Copyright (C) 2009 Patrick Spendrin <ps_ml@gmx.de> - - 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 <kdemacros.h> -#include <QtCore/qglobal.h> -#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 <iostream> -//#define kWarning(x) std::cout - -#include <stdio.h> - -//#define i18n -inline QString i18n(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
deleted file mode 100644 --- a/gui/src/konsole_wcwidth.cpp +++ /dev/null @@ -1,216 +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" - * <http://www.UNIX-systems.org/online.html> - * - * 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; -}
deleted file mode 100644 --- a/gui/src/konsole_wcwidth.h +++ /dev/null @@ -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 <bastian@kde.org> */ -/* - Rewritten for QT4 by e_k <e_k at users.sourceforge.net> -*/ - - -#ifndef _KONSOLE_WCWIDTH_H_ -#define _KONSOLE_WCWIDTH_H_ - -// Qt -#include <QtCore/QBool> -#include <QtCore/QString> - -int konsole_wcwidth(quint16 ucs); -#if 0 -int konsole_wcwidth_cjk(Q_UINT16 ucs); -#endif - -int string_width( const QString &txt ); - -#endif
deleted file mode 100644 --- a/gui/src/kprocess.cpp +++ /dev/null @@ -1,345 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include "kprocess_p.h" - -#include <qfile.h> - -#ifdef Q_OS_WIN -# include <windows.h> -#else -# include <unistd.h> -# include <errno.h> -#endif - -#ifndef Q_OS_WIN -# define STD_OUTPUT_HANDLE 1 -# define STD_ERROR_HANDLE 2 -#endif - -#ifdef _WIN32_WCE -#include <stdio.h> -#endif - -void KProcessPrivate::writeAll(const QByteArray &buf, int fd) -{ -#ifdef Q_OS_WIN -#ifndef _WIN32_WCE - HANDLE h = GetStdHandle(fd); - if (h) { - DWORD wr; - WriteFile(h, buf.data(), buf.size(), &wr, 0); - } -#else - fwrite(buf.data(), 1, buf.size(), (FILE*)fd); -#endif -#else - int off = 0; - do { - int ret = ::write(fd, buf.data() + off, buf.size() - off); - if (ret < 0) { - if (errno != EINTR) - return; - } else { - off += ret; - } - } while (off < buf.size()); -#endif -} - -void KProcessPrivate::forwardStd(KProcess::ProcessChannel good, int fd) -{ - Q_Q(KProcess); - - QProcess::ProcessChannel oc = q->readChannel(); - q->setReadChannel(good); - writeAll(q->readAll(), fd); - q->setReadChannel(oc); -} - -void KProcessPrivate::_k_forwardStdout() -{ -#ifndef _WIN32_WCE - forwardStd(KProcess::StandardOutput, STD_OUTPUT_HANDLE); -#else - forwardStd(KProcess::StandardOutput, (int)stdout); -#endif -} - -void KProcessPrivate::_k_forwardStderr() -{ -#ifndef _WIN32_WCE - forwardStd(KProcess::StandardError, STD_ERROR_HANDLE); -#else - forwardStd(KProcess::StandardError, (int)stderr); -#endif -} - -///////////////////////////// -// public member functions // -///////////////////////////// - -KProcess::KProcess(QObject *parent) : - QProcess(parent), - d_ptr(new KProcessPrivate) -{ - d_ptr->q_ptr = this; - setOutputChannelMode(ForwardedChannels); -} - -KProcess::KProcess(KProcessPrivate *d, QObject *parent) : - QProcess(parent), - d_ptr(d) -{ - d_ptr->q_ptr = this; - setOutputChannelMode(ForwardedChannels); -} - -KProcess::~KProcess() -{ - delete d_ptr; -} - -void KProcess::setOutputChannelMode(OutputChannelMode mode) -{ - Q_D(KProcess); - - d->outputChannelMode = mode; - disconnect(this, SIGNAL(readyReadStandardOutput())); - disconnect(this, SIGNAL(readyReadStandardError())); - switch (mode) { - case OnlyStdoutChannel: - connect(this, SIGNAL(readyReadStandardError()), SLOT(_k_forwardStderr())); - break; - case OnlyStderrChannel: - connect(this, SIGNAL(readyReadStandardOutput()), SLOT(_k_forwardStdout())); - break; - default: - QProcess::setProcessChannelMode((ProcessChannelMode)mode); - return; - } - QProcess::setProcessChannelMode(QProcess::SeparateChannels); -} - -KProcess::OutputChannelMode KProcess::outputChannelMode() const -{ - Q_D(const KProcess); - - return d->outputChannelMode; -} - -void KProcess::setNextOpenMode(QIODevice::OpenMode mode) -{ - Q_D(KProcess); - - d->openMode = mode; -} - -#define DUMMYENV "_KPROCESS_DUMMY_=" - -void KProcess::clearEnvironment() -{ - setEnvironment(QStringList() << QString::fromLatin1(DUMMYENV)); -} - -void KProcess::setEnv(const QString &name, const QString &value, bool overwrite) -{ - QStringList env = environment(); - if (env.isEmpty()) { - env = systemEnvironment(); - env.removeAll(QString::fromLatin1(DUMMYENV)); - } - QString fname(name); - fname.append(QLatin1Char('=')); - for (QStringList::Iterator it = env.begin(); it != env.end(); ++it) - if ((*it).startsWith(fname)) { - if (overwrite) { - *it = fname.append(value); - setEnvironment(env); - } - return; - } - env.append(fname.append(value)); - setEnvironment(env); -} - -void KProcess::unsetEnv(const QString &name) -{ - QStringList env = environment(); - if (env.isEmpty()) { - env = systemEnvironment(); - env.removeAll(QString::fromLatin1(DUMMYENV)); - } - QString fname(name); - fname.append(QLatin1Char('=')); - for (QStringList::Iterator it = env.begin(); it != env.end(); ++it) - if ((*it).startsWith(fname)) { - env.erase(it); - if (env.isEmpty()) - env.append(QString::fromLatin1(DUMMYENV)); - setEnvironment(env); - return; - } -} - -void KProcess::setProgram(const QString &exe, const QStringList &args) -{ - Q_D(KProcess); - - d->prog = exe; - d->args = args; -#ifdef Q_OS_WIN - setNativeArguments(QString()); -#endif -} - -void KProcess::setProgram(const QStringList &argv) -{ - Q_D(KProcess); - - Q_ASSERT( !argv.isEmpty() ); - d->args = argv; - d->prog = d->args.takeFirst(); -#ifdef Q_OS_WIN - setNativeArguments(QString()); -#endif -} - -KProcess &KProcess::operator<<(const QString &arg) -{ - Q_D(KProcess); - - if (d->prog.isEmpty()) - d->prog = arg; - else - d->args << arg; - return *this; -} - -KProcess &KProcess::operator<<(const QStringList &args) -{ - Q_D(KProcess); - - if (d->prog.isEmpty()) - setProgram(args); - else - d->args << args; - return *this; -} - -void KProcess::clearProgram() -{ - Q_D(KProcess); - - d->prog.clear(); - d->args.clear(); -#ifdef Q_OS_WIN - setNativeArguments(QString()); -#endif -} - -void KProcess::setShellCommand(const QString &cmd) -{ - Q_D(KProcess); - d->args.clear(); - d->prog = QString::fromLatin1("/bin/sh"); - d->args << QString::fromLatin1("-c") << cmd; -} - -QStringList KProcess::program() const -{ - Q_D(const KProcess); - - QStringList argv = d->args; - argv.prepend(d->prog); - return argv; -} - -void KProcess::start() -{ - Q_D(KProcess); - - QProcess::start(d->prog, d->args, d->openMode); -} - -int KProcess::execute(int msecs) -{ - start(); - if (!waitForFinished(msecs)) { - kill(); - waitForFinished(-1); - return -2; - } - return (exitStatus() == QProcess::NormalExit) ? exitCode() : -1; -} - -// static -int KProcess::execute(const QString &exe, const QStringList &args, int msecs) -{ - KProcess p; - p.setProgram(exe, args); - return p.execute(msecs); -} - -// static -int KProcess::execute(const QStringList &argv, int msecs) -{ - KProcess p; - p.setProgram(argv); - return p.execute(msecs); -} - -int KProcess::startDetached() -{ - Q_D(KProcess); - - qint64 pid; - if (!QProcess::startDetached(d->prog, d->args, workingDirectory(), &pid)) - return 0; - return (int) pid; -} - -// static -int KProcess::startDetached(const QString &exe, const QStringList &args) -{ - qint64 pid; - if (!QProcess::startDetached(exe, args, QString(), &pid)) - return 0; - return (int) pid; -} - -// static -int KProcess::startDetached(const QStringList &argv) -{ - QStringList args = argv; - QString prog = args.takeFirst(); - return startDetached(prog, args); -} - -int KProcess::pid() const -{ -#ifdef Q_OS_UNIX - return (int) QProcess::pid(); -#else - return QProcess::pid() ? QProcess::pid()->dwProcessId : 0; -#endif -} -
deleted file mode 100644 --- a/gui/src/kprocess.h +++ /dev/null @@ -1,342 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef KPROCESS_H -#define KPROCESS_H - -#include <QtCore/QProcess> -class KProcess; -class KProcessPrivate; - - -/** - * \class KProcess kprocess.h <KProcess> - * - * Child process invocation, monitoring and control. - * - * This class extends QProcess by some useful functionality, overrides - * some defaults with saner values and wraps parts of the API into a more - * accessible one. - * This is the preferred way of spawning child processes in KDE; don't - * use QProcess directly. - * - * @author Oswald Buddenhagen <ossi@kde.org> - **/ -class KProcess : public QProcess -{ - Q_OBJECT - Q_DECLARE_PRIVATE(KProcess) - -public: - - /** - * Modes in which the output channels can be opened. - */ - enum OutputChannelMode { - SeparateChannels = QProcess::SeparateChannels, - /**< Standard output and standard error are handled by KProcess - as separate channels */ - MergedChannels = QProcess::MergedChannels, - /**< Standard output and standard error are handled by KProcess - as one channel */ - ForwardedChannels = QProcess::ForwardedChannels, - /**< Both standard output and standard error are forwarded - to the parent process' respective channel */ - OnlyStdoutChannel, - /**< Only standard output is handled; standard error is forwarded */ - OnlyStderrChannel /**< Only standard error is handled; standard output is forwarded */ - }; - - /** - * Constructor - */ - explicit KProcess(QObject *parent = 0); - - /** - * Destructor - */ - virtual ~KProcess(); - - /** - * Set how to handle the output channels of the child process. - * - * The default is ForwardedChannels, which is unlike in QProcess. - * Do not request more than you actually handle, as this output is - * simply lost otherwise. - * - * This function must be called before starting the process. - * - * @param mode the output channel handling mode - */ - void setOutputChannelMode(OutputChannelMode mode); - - /** - * Query how the output channels of the child process are handled. - * - * @return the output channel handling mode - */ - OutputChannelMode outputChannelMode() const; - - /** - * Set the QIODevice open mode the process will be opened in. - * - * This function must be called before starting the process, obviously. - * - * @param mode the open mode. Note that this mode is automatically - * "reduced" according to the channel modes and redirections. - * The default is QIODevice::ReadWrite. - */ - void setNextOpenMode(QIODevice::OpenMode mode); - - /** - * Adds the variable @p name to the process' environment. - * - * This function must be called before starting the process. - * - * @param name the name of the environment variable - * @param value the new value for the environment variable - * @param overwrite if @c false and the environment variable is already - * set, the old value will be preserved - */ - void setEnv(const QString &name, const QString &value, bool overwrite = true); - - /** - * Removes the variable @p name from the process' environment. - * - * This function must be called before starting the process. - * - * @param name the name of the environment variable - */ - void unsetEnv(const QString &name); - - /** - * Empties the process' environment. - * - * Note that LD_LIBRARY_PATH/DYLD_LIBRARY_PATH is automatically added - * on *NIX. - * - * This function must be called before starting the process. - */ - void clearEnvironment(); - - /** - * Set the program and the command line arguments. - * - * This function must be called before starting the process, obviously. - * - * @param exe the program to execute - * @param args the command line arguments for the program, - * one per list element - */ - void setProgram(const QString &exe, const QStringList &args = QStringList()); - - /** - * @overload - * - * @param argv the program to execute and the command line arguments - * for the program, one per list element - */ - void setProgram(const QStringList &argv); - - /** - * Append an element to the command line argument list for this process. - * - * If no executable is set yet, it will be set instead. - * - * For example, doing an "ls -l /usr/local/bin" can be achieved by: - * \code - * KProcess p; - * p << "ls" << "-l" << "/usr/local/bin"; - * ... - * \endcode - * - * This function must be called before starting the process, obviously. - * - * @param arg the argument to add - * @return a reference to this KProcess - */ - KProcess &operator<<(const QString& arg); - - /** - * @overload - * - * @param args the arguments to add - * @return a reference to this KProcess - */ - KProcess &operator<<(const QStringList& args); - - /** - * Clear the program and command line argument list. - */ - void clearProgram(); - - /** - * Set a command to execute through a shell (a POSIX sh on *NIX - * and cmd.exe on Windows). - * - * Using this for anything but user-supplied commands is usually a bad - * idea, as the command's syntax depends on the platform. - * Redirections including pipes, etc. are better handled by the - * respective functions provided by QProcess. - * - * If KProcess determines that the command does not really need a - * shell, it will trasparently execute it without one for performance - * reasons. - * - * This function must be called before starting the process, obviously. - * - * @param cmd the command to execute through a shell. - * The caller must make sure that all filenames etc. are properly - * quoted when passed as argument. Failure to do so often results in - * serious security holes. See KShell::quoteArg(). - */ - void setShellCommand(const QString &cmd); - - /** - * Obtain the currently set program and arguments. - * - * @return a list, the first element being the program, the remaining ones - * being command line arguments to the program. - */ - QStringList program() const; - - /** - * Start the process. - * - * @see QProcess::start(const QString &, const QStringList &, OpenMode) - */ - void start(); - - /** - * Start the process, wait for it to finish, and return the exit code. - * - * This method is roughly equivalent to the sequence: - * <code> - * start(); - * waitForFinished(msecs); - * return exitCode(); - * </code> - * - * Unlike the other execute() variants this method is not static, - * so the process can be parametrized properly and talked to. - * - * @param msecs time to wait for process to exit before killing it - * @return -2 if the process could not be started, -1 if it crashed, - * otherwise its exit code - */ - int execute(int msecs = -1); - - /** - * @overload - * - * @param exe the program to execute - * @param args the command line arguments for the program, - * one per list element - * @param msecs time to wait for process to exit before killing it - * @return -2 if the process could not be started, -1 if it crashed, - * otherwise its exit code - */ - static int execute(const QString &exe, const QStringList &args = QStringList(), int msecs = -1); - - /** - * @overload - * - * @param argv the program to execute and the command line arguments - * for the program, one per list element - * @param msecs time to wait for process to exit before killing it - * @return -2 if the process could not be started, -1 if it crashed, - * otherwise its exit code - */ - static int execute(const QStringList &argv, int msecs = -1); - - /** - * Start the process and detach from it. See QProcess::startDetached() - * for details. - * - * Unlike the other startDetached() variants this method is not static, - * so the process can be parametrized properly. - * @note Currently, only the setProgram()/setShellCommand() and - * setWorkingDirectory() parametrizations are supported. - * - * The KProcess object may be re-used immediately after calling this - * function. - * - * @return the PID of the started process or 0 on error - */ - int startDetached(); - - /** - * @overload - * - * @param exe the program to start - * @param args the command line arguments for the program, - * one per list element - * @return the PID of the started process or 0 on error - */ - static int startDetached(const QString &exe, const QStringList &args = QStringList()); - - /** - * @overload - * - * @param argv the program to start and the command line arguments - * for the program, one per list element - * @return the PID of the started process or 0 on error - */ - static int startDetached(const QStringList &argv); - - /** - * Obtain the process' ID as known to the system. - * - * Unlike with QProcess::pid(), this is a real PID also on Windows. - * - * This function can be called only while the process is running. - * It cannot be applied to detached processes. - * - * @return the process ID - */ - int pid() const; - -protected: - /** - * @internal - */ - KProcess(KProcessPrivate *d, QObject *parent); - - /** - * @internal - */ - KProcessPrivate * const d_ptr; - -private: - // hide those - using QProcess::setReadChannelMode; - using QProcess::readChannelMode; - using QProcess::setProcessChannelMode; - using QProcess::processChannelMode; - - Q_PRIVATE_SLOT(d_func(), void _k_forwardStdout()) - Q_PRIVATE_SLOT(d_func(), void _k_forwardStderr()) -}; - -#include "kprocess_p.h" - -#endif -
deleted file mode 100644 --- a/gui/src/kprocess_p.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef KPROCESS_P_H -#define KPROCESS_P_H -class KProcess; -class KProcessPrivate; - -#include "kprocess.h" -class KProcessPrivate { - Q_DECLARE_PUBLIC(KProcess) -protected: - KProcessPrivate() : - openMode(QIODevice::ReadWrite) - { - } - void writeAll(const QByteArray &buf, int fd); - void forwardStd(KProcess::ProcessChannel good, int fd); - void _k_forwardStdout(); - void _k_forwardStderr(); - - QString prog; - QStringList args; - KProcess::OutputChannelMode outputChannelMode; - QIODevice::OpenMode openMode; - - KProcess *q_ptr; -}; - - -#endif
deleted file mode 100644 --- a/gui/src/kpty.cpp +++ /dev/null @@ -1,710 +0,0 @@ -/* - - This file is part of the KDE libraries - Copyright (C) 2002 Waldo Bastian <bastian@kde.org> - Copyright (C) 2002-2003,2007-2008 Oswald Buddenhagen <ossi@kde.org> - Copyright (C) 2010 KDE e.V. <kde-ev-board@kde.org> - Author Adriaan de Groot <groot@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include "kpty_p.h" - -#ifdef __sgi -#define __svr4__ -#endif - -#ifdef __osf__ -#define _OSF_SOURCE -#include <float.h> -#endif - -#ifdef _AIX -#define _ALL_SOURCE -#endif - -// __USE_XOPEN isn't defined by default in ICC -// (needed for ptsname(), grantpt() and unlockpt()) -#ifdef __INTEL_COMPILER -# ifndef __USE_XOPEN -# define __USE_XOPEN -# endif -#endif - -#include <sys/types.h> -#include <sys/ioctl.h> -#include <sys/time.h> -#include <sys/resource.h> -#include <sys/stat.h> -#include <sys/param.h> - -#include <errno.h> -#include <fcntl.h> -#include <time.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <grp.h> - -#if defined(HAVE_PTY_H) -# include <pty.h> -#endif - -#ifdef HAVE_LIBUTIL_H -# include <libutil.h> -#elif defined(HAVE_UTIL_H) -# include <util.h> -#endif - -#define HAVE_UTMPX -#define _UTMPX_COMPAT - -#ifdef HAVE_UTEMPTER -extern "C" { -# include <utempter.h> -} -#else -# include <utmp.h> -# ifdef HAVE_UTMPX -# include <utmpx.h> -# endif -# if !defined(_PATH_UTMPX) && defined(_UTMPX_FILE) -# define _PATH_UTMPX _UTMPX_FILE -# endif -# if !defined(_PATH_WTMPX) && defined(_WTMPX_FILE) -# define _PATH_WTMPX _WTMPX_FILE -# endif -#endif - -/* for HP-UX (some versions) the extern C is needed, and for other - platforms it doesn't hurt */ -extern "C" { -#include <termios.h> -#if defined(HAVE_TERMIO_H) -# include <termio.h> // struct winsize on some systems -#endif -} - -#if defined (_HPUX_SOURCE) -# define _TERMIOS_INCLUDED -# include <bsdtty.h> -#endif - -#ifdef HAVE_SYS_STROPTS_H -# include <sys/stropts.h> // Defines I_PUSH -# define _NEW_TTY_CTRL -#endif - -#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) || defined (__DragonFly__) -# define _tcgetattr(fd, ttmode) ioctl(fd, TIOCGETA, (char *)ttmode) -#else -# if defined(_HPUX_SOURCE) || defined(__Lynx__) || defined (__CYGWIN__) || defined(__sun) -# define _tcgetattr(fd, ttmode) tcgetattr(fd, ttmode) -# else -# define _tcgetattr(fd, ttmode) ioctl(fd, TCGETS, (char *)ttmode) -# endif -#endif - -#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) || defined (__DragonFly__) -# define _tcsetattr(fd, ttmode) ioctl(fd, TIOCSETA, (char *)ttmode) -#else -# if defined(_HPUX_SOURCE) || defined(__CYGWIN__) || defined(__sun) -# define _tcsetattr(fd, ttmode) tcsetattr(fd, TCSANOW, ttmode) -# else -# define _tcsetattr(fd, ttmode) ioctl(fd, TCSETS, (char *)ttmode) -# endif -#endif - -#include <QtCore/Q_PID> - -#define TTY_GROUP "tty" - -#ifndef PATH_MAX -# ifdef MAXPATHLEN -# define PATH_MAX MAXPATHLEN -# else -# define PATH_MAX 1024 -# endif -#endif - -/////////////////////// -// private functions // -/////////////////////// - -////////////////// -// private data // -////////////////// - -KPtyPrivate::KPtyPrivate(KPty* parent) : - masterFd(-1), slaveFd(-1), ownMaster(true), q_ptr(parent) -{ -} - -KPtyPrivate::~KPtyPrivate() -{ -} - -#ifndef HAVE_OPENPTY -bool KPtyPrivate::chownpty(bool grant) -{ - return !QProcess::execute(KStandardDirs::findExe("kgrantpty"), - QStringList() << (grant?"--grant":"--revoke") << QString::number(masterFd)); -} -#endif - -///////////////////////////// -// public member functions // -///////////////////////////// - -KPty::KPty() : - d_ptr(new KPtyPrivate(this)) -{ -} - -KPty::KPty(KPtyPrivate *d) : - d_ptr(d) -{ - d_ptr->q_ptr = this; -} - -KPty::~KPty() -{ - close(); - delete d_ptr; -} - -bool KPty::open() -{ - Q_D(KPty); - - if (d->masterFd >= 0) - return true; - - d->ownMaster = true; - - QByteArray ptyName; - - // Find a master pty that we can open //////////////////////////////// - - // Because not all the pty animals are created equal, they want to - // be opened by several different methods. - - // We try, as we know them, one by one. - -#ifdef HAVE_OPENPTY - - char ptsn[PATH_MAX]; - if (::openpty( &d->masterFd, &d->slaveFd, ptsn, 0, 0)) - { - d->masterFd = -1; - d->slaveFd = -1; - //kWarning(175) << "Can't open a pseudo teletype"; - return false; - } - d->ttyName = ptsn; - -#else - -#ifdef HAVE__GETPTY // irix - - char *ptsn = _getpty(&d->masterFd, O_RDWR|O_NOCTTY, S_IRUSR|S_IWUSR, 0); - if (ptsn) { - d->ttyName = ptsn; - goto grantedpt; - } - -#elif defined(HAVE_PTSNAME) || defined(TIOCGPTN) - -#ifdef HAVE_POSIX_OPENPT - d->masterFd = ::posix_openpt(O_RDWR|O_NOCTTY); -#elif defined(HAVE_GETPT) - d->masterFd = ::getpt(); -#elif defined(PTM_DEVICE) - //d->masterFd = KDE_open(PTM_DEVICE, O_RDWR|O_NOCTTY); -d->masterFd = ::open(PTM_DEVICE, O_RDWR|O_NOCTTY); -#else -# error No method to open a PTY master detected. -#endif - if (d->masterFd >= 0) - { -#ifdef HAVE_PTSNAME - char *ptsn = ptsname(d->masterFd); - if (ptsn) { - d->ttyName = ptsn; -#else - int ptyno; - if (!ioctl(d->masterFd, TIOCGPTN, &ptyno)) { - char buf[32]; - sprintf(buf, "/dev/pts/%d", ptyno); - d->ttyName = buf; -#endif -#ifdef HAVE_GRANTPT - if (!grantpt(d->masterFd)) - goto grantedpt; -#else - goto gotpty; -#endif - } - ::close(d->masterFd); - d->masterFd = -1; - } -#endif // HAVE_PTSNAME || TIOCGPTN - - // Linux device names, FIXME: Trouble on other systems? - for (const char* s3 = "pqrstuvwxyzabcde"; *s3; s3++) - { - for (const char* s4 = "0123456789abcdef"; *s4; s4++) - { - ptyName = QString().sprintf("/dev/pty%c%c", *s3, *s4).toAscii(); - d->ttyName = QString().sprintf("/dev/tty%c%c", *s3, *s4).toAscii(); - - d->masterFd = ::open(ptyName.data(), O_RDWR); - if (d->masterFd >= 0) - { -#ifdef Q_OS_SOLARIS - /* Need to check the process group of the pty. - * If it exists, then the slave pty is in use, - * and we need to get another one. - */ - int pgrp_rtn; - if (ioctl(d->masterFd, TIOCGPGRP, &pgrp_rtn) == 0 || errno != EIO) { - ::close(d->masterFd); - d->masterFd = -1; - continue; - } -#endif /* Q_OS_SOLARIS */ - if (!access(d->ttyName.data(),R_OK|W_OK)) // checks availability based on permission bits - { - if (!geteuid()) - { - struct group* p = getgrnam(TTY_GROUP); - if (!p) - p = getgrnam("wheel"); - gid_t gid = p ? p->gr_gid : getgid (); - - chown(d->ttyName.data(), getuid(), gid); - chmod(d->ttyName.data(), S_IRUSR|S_IWUSR|S_IWGRP); - } - goto gotpty; - } - ::close(d->masterFd); - d->masterFd = -1; - } - } - } - - //kWarning(175) << "Can't open a pseudo teletype"; - return false; - - gotpty: - KDE_struct_stat st; - if (KDE_stat(d->ttyName.data(), &st)) - return false; // this just cannot happen ... *cough* Yeah right, I just - // had it happen when pty #349 was allocated. I guess - // there was some sort of leak? I only had a few open. - if (((st.st_uid != getuid()) || - (st.st_mode & (S_IRGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH))) && - !d->chownpty(true)) - { - - /*kWarning(175) - << "chownpty failed for device " << ptyName << "::" << d->ttyName - << "\nThis means the communication can be eavesdropped." << endl; -*/ -} - - grantedpt: - -#ifdef HAVE_REVOKE - revoke(d->ttyName.data()); -#endif - -#ifdef HAVE_UNLOCKPT - unlockpt(d->masterFd); -#elif defined(TIOCSPTLCK) - int flag = 0; - ioctl(d->masterFd, TIOCSPTLCK, &flag); -#endif - - d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY); - if (d->slaveFd < 0) - { - //kWarning(175) << "Can't open slave pseudo teletype"; - ::close(d->masterFd); - d->masterFd = -1; - return false; - } - -#if (defined(__svr4__) || defined(__sgi__) || defined(Q_OS_SOLARIS)) - // Solaris uses STREAMS for terminal handling. It is possible - // for the pty handling modules to be left off the stream; in that - // case push them on. ioctl(fd, I_FIND, ...) is documented to return - // 1 if the module is on the stream already. - { - static const char *pt = "ptem"; - static const char *ld = "ldterm"; - if (ioctl(d->slaveFd, I_FIND, pt) == 0) - ioctl(d->slaveFd, I_PUSH, pt); - if (ioctl(d->slaveFd, I_FIND, ld) == 0) - ioctl(d->slaveFd, I_PUSH, ld); - } -#endif - -#endif /* HAVE_OPENPTY */ - - fcntl(d->masterFd, F_SETFD, FD_CLOEXEC); - fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC); - - return true; -} - -bool KPty::open(int fd) -{ -#if !defined(HAVE_PTSNAME) && !defined(TIOCGPTN) - //kWarning(175) << "Unsupported attempt to open pty with fd" << fd; - return false; -#else - Q_D(KPty); - - if (d->masterFd >= 0) { - //kWarning(175) << "Attempting to open an already open pty"; - return false; - } - - d->ownMaster = false; - -# ifdef HAVE_PTSNAME - char *ptsn = ptsname(fd); - if (ptsn) { - d->ttyName = ptsn; -# else - int ptyno; - if (!ioctl(fd, TIOCGPTN, &ptyno)) { - char buf[32]; - sprintf(buf, "/dev/pts/%d", ptyno); - d->ttyName = buf; -# endif - } else { - //kWarning(175) << "Failed to determine pty slave device for fd" << fd; - return false; - } - - d->masterFd = fd; - if (!openSlave()) { - d->masterFd = -1; - return false; - } - - return true; -#endif -} - -void KPty::closeSlave() -{ - Q_D(KPty); - - if (d->slaveFd < 0) - return; - ::close(d->slaveFd); - d->slaveFd = -1; -} - -bool KPty::openSlave() -{ - Q_D(KPty); - - if (d->slaveFd >= 0) - return true; - if (d->masterFd < 0) { - //kWarning(175) << "Attempting to open pty slave while master is closed"; - return false; - } - d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY); - if (d->slaveFd < 0) { - //kWarning(175) << "Can't open slave pseudo teletype"; - return false; - } - fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC); - return true; -} - -void KPty::close() -{ - Q_D(KPty); - - if (d->masterFd < 0) - return; - closeSlave(); - if (d->ownMaster) { -#ifndef HAVE_OPENPTY - // don't bother resetting unix98 pty, it will go away after closing master anyway. - if (memcmp(d->ttyName.data(), "/dev/pts/", 9)) { - if (!geteuid()) { - struct stat st; - if (!stat(d->ttyName.data(), &st)) { - chown(d->ttyName.data(), 0, st.st_gid == getgid() ? 0 : -1); - chmod(d->ttyName.data(), S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); - } - } else { - fcntl(d->masterFd, F_SETFD, 0); - d->chownpty(false); - } - } -#endif - ::close(d->masterFd); - } - d->masterFd = -1; -} - -void KPty::setCTty() -{ - Q_D(KPty); - - // Setup job control ////////////////////////////////// - - // Become session leader, process group leader, - // and get rid of the old controlling terminal. - setsid(); - - // make our slave pty the new controlling terminal. -#ifdef TIOCSCTTY - ioctl(d->slaveFd, TIOCSCTTY, 0); -#else - // __svr4__ hack: the first tty opened after setsid() becomes controlling tty - ::close(open(d->ttyName, O_WRONLY, 0)); -#endif - - // make our new process group the foreground group on the pty - int pgrp = getpid(); -#if defined(_POSIX_VERSION) || defined(__svr4__) - tcsetpgrp(d->slaveFd, pgrp); -#elif defined(TIOCSPGRP) - ioctl(d->slaveFd, TIOCSPGRP, (char *)&pgrp); -#endif -} - -void KPty::login(const char *user, const char *remotehost) -{ -#ifdef HAVE_UTEMPTER - Q_D(KPty); - - addToUtmp(d->ttyName, remotehost, d->masterFd); - Q_UNUSED(user); -#else -# ifdef HAVE_UTMPX - struct utmpx l_struct; -# else - struct utmp l_struct; -# endif - memset(&l_struct, 0, sizeof(l_struct)); - // note: strncpy without terminators _is_ correct here. man 4 utmp - - if (user) - strncpy(l_struct.ut_name, user, sizeof(l_struct.ut_name)); - - if (remotehost) { - strncpy(l_struct.ut_host, remotehost, sizeof(l_struct.ut_host)); -# ifdef HAVE_STRUCT_UTMP_UT_SYSLEN - l_struct.ut_syslen = qMin(strlen(remotehost), sizeof(l_struct.ut_host)); -# endif - } - -# ifndef __GLIBC__ - Q_D(KPty); - const char *str_ptr = d->ttyName.data(); - if (!memcmp(str_ptr, "/dev/", 5)) - str_ptr += 5; - strncpy(l_struct.ut_line, str_ptr, sizeof(l_struct.ut_line)); -# ifdef HAVE_STRUCT_UTMP_UT_ID - strncpy(l_struct.ut_id, - str_ptr + strlen(str_ptr) - sizeof(l_struct.ut_id), - sizeof(l_struct.ut_id)); -# endif -# endif - -# ifdef HAVE_UTMPX - //gettimeofday(&l_struct.ut_tv, 0); - gettimeofday((struct timeval *)&l_struct.ut_tv, 0); -# else - l_struct.ut_time = time(0); -# endif - -# ifdef HAVE_LOGIN -# ifdef HAVE_LOGINX - ::loginx(&l_struct); -# else - ::login(&l_struct); -# endif -# else -# ifdef HAVE_STRUCT_UTMP_UT_TYPE - l_struct.ut_type = USER_PROCESS; -# endif -# ifdef HAVE_STRUCT_UTMP_UT_PID - l_struct.ut_pid = getpid(); -# ifdef HAVE_STRUCT_UTMP_UT_SESSION - l_struct.ut_session = getsid(0); -# endif -# endif -# ifdef HAVE_UTMPX - utmpxname(_PATH_UTMPX); - setutxent(); - pututxline(&l_struct); - endutxent(); - //updwtmpx(_PATH_WTMPX, &l_struct); -# else - utmpname(_PATH_UTMP); - setutent(); - pututline(&l_struct); - endutent(); - updwtmp(_PATH_WTMP, &l_struct); -# endif -# endif -#endif -} - -void KPty::logout() -{ -#ifdef HAVE_UTEMPTER - Q_D(KPty); - - removeLineFromUtmp(d->ttyName, d->masterFd); -#else - Q_D(KPty); - - const char *str_ptr = d->ttyName.data(); - if (!memcmp(str_ptr, "/dev/", 5)) - str_ptr += 5; -# ifdef __GLIBC__ - else { - const char *sl_ptr = strrchr(str_ptr, '/'); - if (sl_ptr) - str_ptr = sl_ptr + 1; - } -# endif -# ifdef HAVE_LOGIN -# ifdef HAVE_LOGINX - ::logoutx(str_ptr, 0, DEAD_PROCESS); -# else - ::logout(str_ptr); -# endif -# else -# ifdef HAVE_UTMPX - struct utmpx l_struct, *ut; -# else - struct utmp l_struct, *ut; -# endif - memset(&l_struct, 0, sizeof(l_struct)); - - strncpy(l_struct.ut_line, str_ptr, sizeof(l_struct.ut_line)); - -# ifdef HAVE_UTMPX - utmpxname(_PATH_UTMPX); - setutxent(); - if ((ut = getutxline(&l_struct))) { -# else - utmpname(_PATH_UTMP); - setutent(); - if ((ut = getutline(&l_struct))) { -# endif - memset(ut->ut_name, 0, sizeof(*ut->ut_name)); - memset(ut->ut_host, 0, sizeof(*ut->ut_host)); -# ifdef HAVE_STRUCT_UTMP_UT_SYSLEN - ut->ut_syslen = 0; -# endif -# ifdef HAVE_STRUCT_UTMP_UT_TYPE - ut->ut_type = DEAD_PROCESS; -# endif -# ifdef HAVE_UTMPX - //gettimeofday(&(ut->ut_tv), 0); - gettimeofday((struct timeval *)&(ut->ut_tv), 0); - pututxline(ut); - } - endutxent(); -# else - ut->ut_time = time(0); - pututline(ut); - } - endutent(); -# endif -# endif -#endif -} - -bool KPty::tcGetAttr(struct ::termios *ttmode) const -{ - Q_D(const KPty); - -#ifdef Q_OS_SOLARIS - if (_tcgetattr(d->slaveFd, ttmode) == 0) return true; -#endif - return _tcgetattr(d->masterFd, ttmode) == 0; -} - -bool KPty::tcSetAttr(struct ::termios *ttmode) -{ - Q_D(KPty); - -#ifdef Q_OS_SOLARIS - if (_tcsetattr(d->slaveFd, ttmode) == 0) return true; -#endif - return _tcsetattr(d->masterFd, ttmode) == 0; -} - -bool KPty::setWinSize(int lines, int columns) -{ - Q_D(KPty); - - struct winsize winSize; - memset(&winSize, 0, sizeof(winSize)); - winSize.ws_row = (unsigned short)lines; - winSize.ws_col = (unsigned short)columns; - return ioctl(d->masterFd, TIOCSWINSZ, (char *)&winSize) == 0; -} - -bool KPty::setEcho(bool echo) -{ - struct ::termios ttmode; - if (!tcGetAttr(&ttmode)) - return false; - if (!echo) - ttmode.c_lflag &= ~ECHO; - else - ttmode.c_lflag |= ECHO; - return tcSetAttr(&ttmode); -} - -const char *KPty::ttyName() const -{ - Q_D(const KPty); - - return d->ttyName.data(); -} - -int KPty::masterFd() const -{ - Q_D(const KPty); - - return d->masterFd; -} - -int KPty::slaveFd() const -{ - Q_D(const KPty); - - return d->slaveFd; -}
deleted file mode 100644 --- a/gui/src/kpty.h +++ /dev/null @@ -1,204 +0,0 @@ -/* This file is part of the KDE libraries - - Copyright (C) 2003,2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef kpty_h -#define kpty_h -#include <QtCore/qglobal.h> - -struct KPtyPrivate; -struct termios; - -/** - * Provides primitives for opening & closing a pseudo TTY pair, assigning the - * controlling TTY, utmp registration and setting various terminal attributes. - */ -class KPty { - Q_DECLARE_PRIVATE(KPty) - -public: - - /** - * Constructor - */ - KPty(); - - /** - * Destructor: - * - * If the pty is still open, it will be closed. Note, however, that - * an utmp registration is @em not undone. - */ - ~KPty(); - - /** - * Create a pty master/slave pair. - * - * @return true if a pty pair was successfully opened - */ - bool open(); - - /** - * Open using an existing pty master. - * - * @param fd an open pty master file descriptor. - * The ownership of the fd remains with the caller; - * it will not be automatically closed at any point. - * @return true if a pty pair was successfully opened - */ - bool open(int fd); - - /** - * Close the pty master/slave pair. - */ - void close(); - - /** - * Close the pty slave descriptor. - * - * When creating the pty, KPty also opens the slave and keeps it open. - * Consequently the master will never receive an EOF notification. - * Usually this is the desired behavior, as a closed pty slave can be - * reopened any time - unlike a pipe or socket. However, in some cases - * pipe-alike behavior might be desired. - * - * After this function was called, slaveFd() and setCTty() cannot be - * used. - */ - void closeSlave(); - - /** - * Open the pty slave descriptor. - * - * This undoes the effect of closeSlave(). - * - * @return true if the pty slave was successfully opened - */ - bool openSlave(); - - /** - * Creates a new session and process group and makes this pty the - * controlling tty. - */ - void setCTty(); - - /** - * Creates an utmp entry for the tty. - * This function must be called after calling setCTty and - * making this pty the stdin. - * @param user the user to be logged on - * @param remotehost the host from which the login is coming. This is - * @em not the local host. For remote logins it should be the hostname - * of the client. For local logins from inside an X session it should - * be the name of the X display. Otherwise it should be empty. - */ - void login(const char *user = 0, const char *remotehost = 0); - - /** - * Removes the utmp entry for this tty. - */ - void logout(); - - /** - * Wrapper around tcgetattr(3). - * - * This function can be used only while the PTY is open. - * You will need an #include <termios.h> to do anything useful - * with it. - * - * @param ttmode a pointer to a termios structure. - * Note: when declaring ttmode, @c struct @c ::termios must be used - - * without the '::' some version of HP-UX thinks, this declares - * the struct in your class, in your method. - * @return @c true on success, false otherwise - */ - bool tcGetAttr(struct ::termios *ttmode) const; - - /** - * Wrapper around tcsetattr(3) with mode TCSANOW. - * - * This function can be used only while the PTY is open. - * - * @param ttmode a pointer to a termios structure. - * @return @c true on success, false otherwise. Note that success means - * that @em at @em least @em one attribute could be set. - */ - bool tcSetAttr(struct ::termios *ttmode); - - /** - * Change the logical (screen) size of the pty. - * The default is 24 lines by 80 columns. - * - * This function can be used only while the PTY is open. - * - * @param lines the number of rows - * @param columns the number of columns - * @return @c true on success, false otherwise - */ - bool setWinSize(int lines, int columns); - - /** - * Set whether the pty should echo input. - * - * Echo is on by default. - * If the output of automatically fed (non-interactive) PTY clients - * needs to be parsed, disabling echo often makes it much simpler. - * - * This function can be used only while the PTY is open. - * - * @param echo true if input should be echoed. - * @return @c true on success, false otherwise - */ - bool setEcho(bool echo); - - /** - * @return the name of the slave pty device. - * - * This function should be called only while the pty is open. - */ - const char *ttyName() const; - - /** - * @return the file descriptor of the master pty - * - * This function should be called only while the pty is open. - */ - int masterFd() const; - - /** - * @return the file descriptor of the slave pty - * - * This function should be called only while the pty slave is open. - */ - int slaveFd() const; - -protected: - /** - * @internal - */ - KPty(KPtyPrivate *d); - - /** - * @internal - */ - KPtyPrivate * const d_ptr; -}; - -#endif -
deleted file mode 100644 --- a/gui/src/kpty_export.h +++ /dev/null @@ -1,46 +0,0 @@ -/* This file is part of the KDE project - Copyright (C) 2007 David Faure <faure@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef KPTY_EXPORT_H -#define KPTY_EXPORT_H - -/* needed for KDE_EXPORT and KDE_IMPORT macros */ -//#include <kdemacros.h> -#include <QtCore/qglobal.h> -#define KDE_EXPORT -#define KDE_IMPORT - -#ifndef KPTY_EXPORT -# if defined(KDELIBS_STATIC_LIBS) - /* No export/import for static libraries */ -# define KPTY_EXPORT -# elif defined(MAKE_KDECORE_LIB) - /* We are building this library */ -# define KPTY_EXPORT KDE_EXPORT -# else - /* We are using this library */ -# define KPTY_EXPORT KDE_IMPORT -# endif -#endif - -# ifndef KPTY_EXPORT_DEPRECATED -# define KPTY_EXPORT_DEPRECATED KDE_DEPRECATED KPTY_EXPORT -# endif - -#endif
deleted file mode 100644 --- a/gui/src/kpty_p.h +++ /dev/null @@ -1,58 +0,0 @@ -/* This file is part of the KDE libraries - - Copyright (C) 2003,2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef kpty_p_h -#define kpty_p_h - -#include "kpty.h" - -#if defined(Q_OS_MAC) -#define HAVE_UTIL_H -#define HAVE_UTMPX -#define _UTMPX_COMPAT -#define HAVE_PTSNAME -#define HAVE_SYS_TIME_H -#else -#define HAVE_PTY_H -#endif - -#define HAVE_OPENPTY - -#include <QtCore/QByteArray> - -struct KPtyPrivate { - Q_DECLARE_PUBLIC(KPty) - - KPtyPrivate(KPty* parent); - virtual ~KPtyPrivate(); -#ifndef HAVE_OPENPTY - bool chownpty(bool grant); -#endif - - int masterFd; - int slaveFd; - bool ownMaster:1; - - QByteArray ttyName; - - KPty *q_ptr; -}; - -#endif
deleted file mode 100644 --- a/gui/src/kptydevice.cpp +++ /dev/null @@ -1,413 +0,0 @@ -/* - - This file is part of the KDE libraries - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - Copyright (C) 2010 KDE e.V. <kde-ev-board@kde.org> - Author Adriaan de Groot <groot@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#include "kptydevice.h" -#include "kpty_p.h" -#define i18n - -#include <QtCore/QSocketNotifier> - -#include <unistd.h> -#include <errno.h> -#include <signal.h> -#include <termios.h> -#include <fcntl.h> -#include <sys/ioctl.h> -#ifdef HAVE_SYS_FILIO_H -# include <sys/filio.h> -#endif -#ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -#endif - -#if defined(Q_OS_FREEBSD) || defined(Q_OS_MAC) - // "the other end's output queue size" - kinda braindead, huh? -# define PTY_BYTES_AVAILABLE TIOCOUTQ -#elif defined(TIOCINQ) - // "our end's input queue size" -# define PTY_BYTES_AVAILABLE TIOCINQ -#else - // likewise. more generic ioctl (theoretically) -# define PTY_BYTES_AVAILABLE FIONREAD -#endif - -////////////////// -// private data // -////////////////// - -// Lifted from Qt. I don't think they would mind. ;) -// Re-lift again from Qt whenever a proper replacement for pthread_once appears -static void qt_ignore_sigpipe() -{ - static QBasicAtomicInt atom = Q_BASIC_ATOMIC_INITIALIZER(0); - if (atom.testAndSetRelaxed(0, 1)) { - struct sigaction noaction; - memset(&noaction, 0, sizeof(noaction)); - noaction.sa_handler = SIG_IGN; - sigaction(SIGPIPE, &noaction, 0); - } -} - -#define NO_INTR(ret,func) do { ret = func; } while (ret < 0 && errno == EINTR) - -bool KPtyDevicePrivate::_k_canRead() -{ - Q_Q(KPtyDevice); - qint64 readBytes = 0; - -#ifdef Q_OS_IRIX // this should use a config define, but how to check it? - size_t available; -#else - int available; -#endif - if (!::ioctl(q->masterFd(), PTY_BYTES_AVAILABLE, (char *) &available)) { -#ifdef Q_OS_SOLARIS - // A Pty is a STREAMS module, and those can be activated - // with 0 bytes available. This happens either when ^C is - // pressed, or when an application does an explicit write(a,b,0) - // which happens in experiments fairly often. When 0 bytes are - // available, you must read those 0 bytes to clear the STREAMS - // module, but we don't want to hit the !readBytes case further down. - if (!available) { - char c; - // Read the 0-byte STREAMS message - NO_INTR(readBytes, read(q->masterFd(), &c, 0)); - // Should return 0 bytes read; -1 is error - if (readBytes < 0) { - readNotifier->setEnabled(false); - emit q->readEof(); - return false; - } - return true; - } -#endif - - char *ptr = readBuffer.reserve(available); -#ifdef Q_OS_SOLARIS - // Even if available > 0, it is possible for read() - // to return 0 on Solaris, due to 0-byte writes in the stream. - // Ignore them and keep reading until we hit *some* data. - // In Solaris it is possible to have 15 bytes available - // and to (say) get 0, 0, 6, 0 and 9 bytes in subsequent reads. - // Because the stream is set to O_NONBLOCK in finishOpen(), - // an EOF read will return -1. - readBytes = 0; - while (!readBytes) -#endif - // Useless block braces except in Solaris - { - NO_INTR(readBytes, read(q->masterFd(), ptr, available)); - } - if (readBytes < 0) { - readBuffer.unreserve(available); - q->setErrorString(i18n("Error reading from PTY")); - return false; - } - readBuffer.unreserve(available - readBytes); // *should* be a no-op - } - - if (!readBytes) { - readNotifier->setEnabled(false); - emit q->readEof(); - return false; - } else { - if (!emittedReadyRead) { - emittedReadyRead = true; - emit q->readyRead(); - emittedReadyRead = false; - } - return true; - } -} - -bool KPtyDevicePrivate::_k_canWrite() -{ - Q_Q(KPtyDevice); - - writeNotifier->setEnabled(false); - if (writeBuffer.isEmpty()) - return false; - - qt_ignore_sigpipe(); - int wroteBytes; - NO_INTR(wroteBytes, - write(q->masterFd(), - writeBuffer.readPointer(), writeBuffer.readSize())); - if (wroteBytes < 0) { - q->setErrorString(i18n("Error writing to PTY")); - return false; - } - writeBuffer.free(wroteBytes); - - if (!emittedBytesWritten) { - emittedBytesWritten = true; - emit q->bytesWritten(wroteBytes); - emittedBytesWritten = false; - } - - if (!writeBuffer.isEmpty()) - writeNotifier->setEnabled(true); - return true; -} - -#ifndef timeradd -// Lifted from GLIBC -# define timeradd(a, b, result) \ - do { \ - (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \ - (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \ - if ((result)->tv_usec >= 1000000) { \ - ++(result)->tv_sec; \ - (result)->tv_usec -= 1000000; \ - } \ - } while (0) -# define timersub(a, b, result) \ - do { \ - (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ - (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ - if ((result)->tv_usec < 0) { \ - --(result)->tv_sec; \ - (result)->tv_usec += 1000000; \ - } \ - } while (0) -#endif - -bool KPtyDevicePrivate::doWait(int msecs, bool reading) -{ - Q_Q(KPtyDevice); -#ifndef __linux__ - struct timeval etv; -#endif - struct timeval tv, *tvp; - - if (msecs < 0) - tvp = 0; - else { - tv.tv_sec = msecs / 1000; - tv.tv_usec = (msecs % 1000) * 1000; -#ifndef __linux__ - gettimeofday(&etv, 0); - timeradd(&tv, &etv, &etv); -#endif - tvp = &tv; - } - - while (reading ? readNotifier->isEnabled() : !writeBuffer.isEmpty()) { - fd_set rfds; - fd_set wfds; - - FD_ZERO(&rfds); - FD_ZERO(&wfds); - - if (readNotifier->isEnabled()) - FD_SET(q->masterFd(), &rfds); - if (!writeBuffer.isEmpty()) - FD_SET(q->masterFd(), &wfds); - -#ifndef __linux__ - if (tvp) { - gettimeofday(&tv, 0); - timersub(&etv, &tv, &tv); - if (tv.tv_sec < 0) - tv.tv_sec = tv.tv_usec = 0; - } -#endif - - switch (select(q->masterFd() + 1, &rfds, &wfds, 0, tvp)) { - case -1: - if (errno == EINTR) - break; - return false; - case 0: - q->setErrorString(i18n("PTY operation timed out")); - return false; - default: - if (FD_ISSET(q->masterFd(), &rfds)) { - bool canRead = _k_canRead(); - if (reading && canRead) - return true; - } - if (FD_ISSET(q->masterFd(), &wfds)) { - bool canWrite = _k_canWrite(); - if (!reading) - return canWrite; - } - break; - } - } - return false; -} - -void KPtyDevicePrivate::finishOpen(QIODevice::OpenMode mode) -{ - Q_Q(KPtyDevice); - - q->QIODevice::open(mode); - fcntl(q->masterFd(), F_SETFL, O_NONBLOCK); - readBuffer.clear(); - readNotifier = new QSocketNotifier(q->masterFd(), QSocketNotifier::Read, q); - writeNotifier = new QSocketNotifier(q->masterFd(), QSocketNotifier::Write, q); - QObject::connect(readNotifier, SIGNAL(activated(int)), q, SLOT(_k_canRead())); - QObject::connect(writeNotifier, SIGNAL(activated(int)), q, SLOT(_k_canWrite())); - readNotifier->setEnabled(true); -} - -///////////////////////////// -// public member functions // -///////////////////////////// - -KPtyDevice::KPtyDevice(QObject *parent) : - QIODevice(parent), - KPty(new KPtyDevicePrivate(this)) -{ -} - -KPtyDevice::~KPtyDevice() -{ - close(); -} - -bool KPtyDevice::open(OpenMode mode) -{ - Q_D(KPtyDevice); - - if (masterFd() >= 0) - return true; - - if (!KPty::open()) { - setErrorString(i18n("Error opening PTY")); - return false; - } - - d->finishOpen(mode); - - return true; -} - -bool KPtyDevice::open(int fd, OpenMode mode) -{ - Q_D(KPtyDevice); - - if (!KPty::open(fd)) { - setErrorString(i18n("Error opening PTY")); - return false; - } - - d->finishOpen(mode); - - return true; -} - -void KPtyDevice::close() -{ - Q_D(KPtyDevice); - - if (masterFd() < 0) - return; - - delete d->readNotifier; - delete d->writeNotifier; - - QIODevice::close(); - - KPty::close(); -} - -bool KPtyDevice::isSequential() const -{ - return true; -} - -bool KPtyDevice::canReadLine() const -{ - Q_D(const KPtyDevice); - return QIODevice::canReadLine() || d->readBuffer.canReadLine(); -} - -bool KPtyDevice::atEnd() const -{ - Q_D(const KPtyDevice); - return QIODevice::atEnd() && d->readBuffer.isEmpty(); -} - -qint64 KPtyDevice::bytesAvailable() const -{ - Q_D(const KPtyDevice); - return QIODevice::bytesAvailable() + d->readBuffer.size(); -} - -qint64 KPtyDevice::bytesToWrite() const -{ - Q_D(const KPtyDevice); - return d->writeBuffer.size(); -} - -bool KPtyDevice::waitForReadyRead(int msecs) -{ - Q_D(KPtyDevice); - return d->doWait(msecs, true); -} - -bool KPtyDevice::waitForBytesWritten(int msecs) -{ - Q_D(KPtyDevice); - return d->doWait(msecs, false); -} - -void KPtyDevice::setSuspended(bool suspended) -{ - Q_D(KPtyDevice); - d->readNotifier->setEnabled(!suspended); -} - -bool KPtyDevice::isSuspended() const -{ - Q_D(const KPtyDevice); - return !d->readNotifier->isEnabled(); -} - -// protected -qint64 KPtyDevice::readData(char *data, qint64 maxlen) -{ - Q_D(KPtyDevice); - return d->readBuffer.read(data, (int)qMin<qint64>(maxlen, KMAXINT)); -} - -// protected -qint64 KPtyDevice::readLineData(char *data, qint64 maxlen) -{ - Q_D(KPtyDevice); - return d->readBuffer.readLine(data, (int)qMin<qint64>(maxlen, KMAXINT)); -} - -// protected -qint64 KPtyDevice::writeData(const char *data, qint64 len) -{ - Q_D(KPtyDevice); - Q_ASSERT(len <= KMAXINT); - - d->writeBuffer.write(data, len); - d->writeNotifier->setEnabled(true); - return len; -} -
deleted file mode 100644 --- a/gui/src/kptydevice.h +++ /dev/null @@ -1,353 +0,0 @@ -/* This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef kptydev_h -#define kptydev_h - -struct KPtyPrivate; -struct KPtyDevicePrivate; - -#include "kpty.h" -#include "kpty_p.h" -#include <QtCore/QIODevice> -#include <QSocketNotifier> - -#define Q_DECLARE_PRIVATE_MI(Class, SuperClass) \ - inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(SuperClass::d_ptr); } \ - inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(SuperClass::d_ptr); } \ - friend class Class##Private; - -/** - * Encapsulates KPty into a QIODevice, so it can be used with Q*Stream, etc. - */ -class KPtyDevice : public QIODevice, public KPty { //krazy:exclude=dpointer (via macro) - Q_OBJECT - Q_DECLARE_PRIVATE_MI(KPtyDevice, KPty) - -public: - - /** - * Constructor - */ - KPtyDevice(QObject *parent = 0); - - /** - * Destructor: - * - * If the pty is still open, it will be closed. Note, however, that - * an utmp registration is @em not undone. - */ - virtual ~KPtyDevice(); - - /** - * Create a pty master/slave pair. - * - * @return true if a pty pair was successfully opened - */ - virtual bool open(OpenMode mode = ReadWrite | Unbuffered); - - /** - * Open using an existing pty master. The ownership of the fd - * remains with the caller, i.e., close() will not close the fd. - * - * This is useful if you wish to attach a secondary "controller" to an - * existing pty device such as a terminal widget. - * Note that you will need to use setSuspended() on both devices to - * control which one gets the incoming data from the pty. - * - * @param fd an open pty master file descriptor. - * @param mode the device mode to open the pty with. - * @return true if a pty pair was successfully opened - */ - bool open(int fd, OpenMode mode = ReadWrite | Unbuffered); - - /** - * Close the pty master/slave pair. - */ - virtual void close(); - - /** - * Sets whether the KPtyDevice monitors the pty for incoming data. - * - * When the KPtyDevice is suspended, it will no longer attempt to buffer - * data that becomes available from the pty and it will not emit any - * signals. - * - * Do not use on closed ptys. - * After a call to open(), the pty is not suspended. If you need to - * ensure that no data is read, call this function before the main loop - * is entered again (i.e., immediately after opening the pty). - */ - void setSuspended(bool suspended); - - /** - * Returns true if the KPtyDevice is not monitoring the pty for incoming - * data. - * - * Do not use on closed ptys. - * - * See setSuspended() - */ - bool isSuspended() const; - - /** - * @return always true - */ - virtual bool isSequential() const; - - /** - * @reimp - */ - bool canReadLine() const; - - /** - * @reimp - */ - bool atEnd() const; - - /** - * @reimp - */ - qint64 bytesAvailable() const; - - /** - * @reimp - */ - qint64 bytesToWrite() const; - - bool waitForBytesWritten(int msecs = -1); - bool waitForReadyRead(int msecs = -1); - - -Q_SIGNALS: - /** - * Emitted when EOF is read from the PTY. - * - * Data may still remain in the buffers. - */ - void readEof(); - -protected: - virtual qint64 readData(char *data, qint64 maxSize); - virtual qint64 readLineData(char *data, qint64 maxSize); - virtual qint64 writeData(const char *data, qint64 maxSize); - -private: - Q_PRIVATE_SLOT(d_func(), bool _k_canRead()) - Q_PRIVATE_SLOT(d_func(), bool _k_canWrite()) -}; - -#define KMAXINT ((int)(~0U >> 1)) - -///////////////////////////////////////////////////// -// Helper. Remove when QRingBuffer becomes public. // -///////////////////////////////////////////////////// - -#include <QtCore/qbytearray.h> -#include <QtCore/qlinkedlist.h> - -#define CHUNKSIZE 4096 - -class KRingBuffer -{ -public: - KRingBuffer() - { - clear(); - } - - void clear() - { - buffers.clear(); - QByteArray tmp; - tmp.resize(CHUNKSIZE); - buffers << tmp; - head = tail = 0; - totalSize = 0; - } - - inline bool isEmpty() const - { - return buffers.count() == 1 && !tail; - } - - inline int size() const - { - return totalSize; - } - - inline int readSize() const - { - return (buffers.count() == 1 ? tail : buffers.first().size()) - head; - } - - inline const char *readPointer() const - { - Q_ASSERT(totalSize > 0); - return buffers.first().constData() + head; - } - - void free(int bytes) - { - totalSize -= bytes; - Q_ASSERT(totalSize >= 0); - - forever { - int nbs = readSize(); - - if (bytes < nbs) { - head += bytes; - if (head == tail && buffers.count() == 1) { - buffers.first().resize(CHUNKSIZE); - head = tail = 0; - } - break; - } - - bytes -= nbs; - if (buffers.count() == 1) { - buffers.first().resize(CHUNKSIZE); - head = tail = 0; - break; - } - - buffers.removeFirst(); - head = 0; - } - } - - char *reserve(int bytes) - { - totalSize += bytes; - - char *ptr; - if (tail + bytes <= buffers.last().size()) { - ptr = buffers.last().data() + tail; - tail += bytes; - } else { - buffers.last().resize(tail); - QByteArray tmp; - tmp.resize(qMax(CHUNKSIZE, bytes)); - ptr = tmp.data(); - buffers << tmp; - tail = bytes; - } - return ptr; - } - - // release a trailing part of the last reservation - inline void unreserve(int bytes) - { - totalSize -= bytes; - tail -= bytes; - } - - inline void write(const char *data, int len) - { - memcpy(reserve(len), data, len); - } - - // Find the first occurrence of c and return the index after it. - // If c is not found until maxLength, maxLength is returned, provided - // it is smaller than the buffer size. Otherwise -1 is returned. - int indexAfter(char c, int maxLength = KMAXINT) const - { - int index = 0; - int start = head; - QLinkedList<QByteArray>::ConstIterator it = buffers.begin(); - forever { - if (!maxLength) - return index; - if (index == size()) - return -1; - const QByteArray &buf = *it; - ++it; - int len = qMin((it == buffers.end() ? tail : buf.size()) - start, - maxLength); - const char *ptr = buf.data() + start; - if (const char *rptr = (const char *)memchr(ptr, c, len)) - return index + (rptr - ptr) + 1; - index += len; - maxLength -= len; - start = 0; - } - } - - inline int lineSize(int maxLength = KMAXINT) const - { - return indexAfter('\n', maxLength); - } - - inline bool canReadLine() const - { - return lineSize() != -1; - } - - int read(char *data, int maxLength) - { - int bytesToRead = qMin(size(), maxLength); - int readSoFar = 0; - while (readSoFar < bytesToRead) { - const char *ptr = readPointer(); - int bs = qMin(bytesToRead - readSoFar, readSize()); - memcpy(data + readSoFar, ptr, bs); - readSoFar += bs; - free(bs); - } - return readSoFar; - } - - int readLine(char *data, int maxLength) - { - return read(data, lineSize(qMin(maxLength, size()))); - } - -private: - QLinkedList<QByteArray> buffers; - int head, tail; - int totalSize; -}; - -struct KPtyDevicePrivate : public KPtyPrivate { - Q_DECLARE_PUBLIC(KPtyDevice) - - KPtyDevicePrivate(KPty* parent) : - KPtyPrivate(parent), - emittedReadyRead(false), emittedBytesWritten(false), - readNotifier(0), writeNotifier(0) - { - } - - bool _k_canRead(); - bool _k_canWrite(); - - bool doWait(int msecs, bool reading); - void finishOpen(QIODevice::OpenMode mode); - - bool emittedReadyRead; - bool emittedBytesWritten; - QSocketNotifier *readNotifier; - QSocketNotifier *writeNotifier; - KRingBuffer readBuffer; - KRingBuffer writeBuffer; -}; - -#endif -
deleted file mode 100644 --- a/gui/src/kptyprocess.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - - This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ -#include "kptyprocess.h" -#include "kprocess.h" - -#include "kptydevice.h" - -#include <stdlib.h> -#include <unistd.h> - -////////////////// -// private data // -////////////////// - -KPtyProcess::KPtyProcess(QObject *parent) : - KProcess(new KPtyProcessPrivate, parent) -{ - Q_D(KPtyProcess); - - d->pty = new KPtyDevice(this); - d->pty->open(); - connect(this, SIGNAL(stateChanged(QProcess::ProcessState)), - SLOT(_k_onStateChanged(QProcess::ProcessState))); -} - -KPtyProcess::KPtyProcess(int ptyMasterFd, QObject *parent) : - KProcess(new KPtyProcessPrivate, parent) -{ - Q_D(KPtyProcess); - - d->pty = new KPtyDevice(this); - d->pty->open(ptyMasterFd); - connect(this, SIGNAL(stateChanged(QProcess::ProcessState)), - SLOT(_k_onStateChanged(QProcess::ProcessState))); -} - -KPtyProcess::~KPtyProcess() -{ - Q_D(KPtyProcess); - - if (state() != QProcess::NotRunning && d->addUtmp) { - d->pty->logout(); - disconnect(SIGNAL(stateChanged(QProcess::ProcessState)), - this, SLOT(_k_onStateChanged(QProcess::ProcessState))); - } - delete d->pty; -} - -void KPtyProcess::setPtyChannels(PtyChannels channels) -{ - Q_D(KPtyProcess); - - d->ptyChannels = channels; -} - -KPtyProcess::PtyChannels KPtyProcess::ptyChannels() const -{ - Q_D(const KPtyProcess); - - return d->ptyChannels; -} - -void KPtyProcess::setUseUtmp(bool value) -{ - Q_D(KPtyProcess); - - d->addUtmp = value; -} - -bool KPtyProcess::isUseUtmp() const -{ - Q_D(const KPtyProcess); - - return d->addUtmp; -} - -KPtyDevice *KPtyProcess::pty() const -{ - Q_D(const KPtyProcess); - - return d->pty; -} - -void KPtyProcess::setupChildProcess() -{ - Q_D(KPtyProcess); - - d->pty->setCTty(); - if (d->addUtmp) - d->pty->login(getenv("USER"), getenv("DISPLAY")); - //d->pty->login(KUser(KUser::UseRealUserID).loginName().toLocal8Bit().data(), qgetenv("DISPLAY")); - if (d->ptyChannels & StdinChannel) - dup2(d->pty->slaveFd(), 0); - if (d->ptyChannels & StdoutChannel) - dup2(d->pty->slaveFd(), 1); - if (d->ptyChannels & StderrChannel) - dup2(d->pty->slaveFd(), 2); - - KProcess::setupChildProcess(); -}
deleted file mode 100644 --- a/gui/src/kptyprocess.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - This file is part of the KDE libraries - - Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public License - along with this library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifndef KPTYPROCESS_H -#define KPTYPROCESS_H - -#include "kprocess.h" -#include "kprocess_p.h" -#include "kptydevice.h" - -class KPtyDevice; -class KPtyProcess; -struct KPtyProcessPrivate; - -/** - * This class extends KProcess by support for PTYs (pseudo TTYs). - * - * The PTY is opened as soon as the class is instantiated. Verify that - * it was opened successfully by checking that pty()->masterFd() is not -1. - * - * The PTY is always made the process' controlling TTY. - * Utmp registration and connecting the stdio handles to the PTY are optional. - * - * No attempt to integrate with QProcess' waitFor*() functions was made, - * for it is impossible. Note that execute() does not work with the PTY, too. - * Use the PTY device's waitFor*() functions or use it asynchronously. - * - * @author Oswald Buddenhagen <ossi@kde.org> - */ -class KPtyProcess : public KProcess -{ - Q_OBJECT - Q_DECLARE_PRIVATE(KPtyProcess) - -public: - enum PtyChannelFlag { - NoChannels = 0, /**< The PTY is not connected to any channel. */ - StdinChannel = 1, /**< Connect PTY to stdin. */ - StdoutChannel = 2, /**< Connect PTY to stdout. */ - StderrChannel = 4, /**< Connect PTY to stderr. */ - AllOutputChannels = 6, /**< Connect PTY to all output channels. */ - AllChannels = 7 /**< Connect PTY to all channels. */ - }; - - Q_DECLARE_FLAGS(PtyChannels, PtyChannelFlag) - - /** - * Constructor - */ - explicit KPtyProcess(QObject *parent = 0); - - /** - * Construct a process using an open pty master. - * - * @param ptyMasterFd an open pty master file descriptor. - * The process does not take ownership of the descriptor; - * it will not be automatically closed at any point. - */ - KPtyProcess(int ptyMasterFd, QObject *parent = 0); - - /** - * Destructor - */ - virtual ~KPtyProcess(); - - /** - * Set to which channels the PTY should be assigned. - * - * This function must be called before starting the process. - * - * @param channels the output channel handling mode - */ - void setPtyChannels(PtyChannels channels); - - /** - * Query to which channels the PTY is assigned. - * - * @return the output channel handling mode - */ - PtyChannels ptyChannels() const; - - /** - * Set whether to register the process as a TTY login in utmp. - * - * Utmp is disabled by default. - * It should enabled for interactively fed processes, like terminal - * emulations. - * - * This function must be called before starting the process. - * - * @param value whether to register in utmp. - */ - void setUseUtmp(bool value); - - /** - * Get whether to register the process as a TTY login in utmp. - * - * @return whether to register in utmp - */ - bool isUseUtmp() const; - - /** - * Get the PTY device of this process. - * - * @return the PTY device - */ - KPtyDevice *pty() const; - -protected: - /** - * @reimp - */ - virtual void setupChildProcess(); - -private: - Q_PRIVATE_SLOT(d_func(), void _k_onStateChanged(QProcess::ProcessState)) -}; - -struct KPtyProcessPrivate : KProcessPrivate { - KPtyProcessPrivate() : - ptyChannels(KPtyProcess::NoChannels), - addUtmp(false) - { - } - - void _k_onStateChanged(QProcess::ProcessState newState) - { - if (newState == QProcess::NotRunning && addUtmp) - pty->logout(); - } - - KPtyDevice *pty; - KPtyProcess::PtyChannels ptyChannels; - bool addUtmp : 1; -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(KPtyProcess::PtyChannels) - -#endif