You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
6.1 KiB
194 lines
6.1 KiB
/* |
|
* This file is part of Konsole, a terminal emulator for KDE. |
|
* |
|
* Copyright 2012 Frederik Gladhorn <gladhorn@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. |
|
*/ |
|
|
|
#include "TerminalDisplayAccessible.h" |
|
#include "SessionController.h" |
|
#include <klocalizedstring.h> |
|
|
|
using namespace Konsole; |
|
|
|
TerminalDisplayAccessible::TerminalDisplayAccessible(TerminalDisplay *display) : |
|
QAccessibleWidget(display, QAccessible::Terminal, display->sessionController()->userTitle()) |
|
{ |
|
} |
|
|
|
QString TerminalDisplayAccessible::text(QAccessible::Text t) const |
|
{ |
|
if (t == QAccessible::Value) { |
|
return visibleText(); |
|
} |
|
return QAccessibleWidget::text(t); |
|
} |
|
|
|
int TerminalDisplayAccessible::characterCount() const |
|
{ |
|
return display()->_usedLines * display()->_usedColumns; |
|
} |
|
|
|
int TerminalDisplayAccessible::cursorPosition() const |
|
{ |
|
if (display()->screenWindow() == nullptr) { |
|
return 0; |
|
} |
|
|
|
int offset = display()->_usedColumns * display()->screenWindow()->screen()->getCursorY(); |
|
return offset + display()->screenWindow()->screen()->getCursorX(); |
|
} |
|
|
|
void TerminalDisplayAccessible::selection(int selectionIndex, int *startOffset, |
|
int *endOffset) const |
|
{ |
|
*startOffset = 0; |
|
*endOffset = 0; |
|
if ((display()->screenWindow() == nullptr) || (selectionIndex != 0)) { |
|
return; |
|
} |
|
|
|
int startLine = 0; |
|
int startColumn = 0; |
|
int endLine = 0; |
|
int endColumn = 0; |
|
display()->screenWindow()->getSelectionStart(startColumn, startLine); |
|
display()->screenWindow()->getSelectionEnd(endColumn, endLine); |
|
if ((startLine == endLine) && (startColumn == endColumn)) { |
|
return; |
|
} |
|
*startOffset = positionToOffset(startColumn, startLine); |
|
*endOffset = positionToOffset(endColumn, endLine); |
|
} |
|
|
|
int TerminalDisplayAccessible::selectionCount() const |
|
{ |
|
if (display()->screenWindow() == nullptr) { |
|
return 0; |
|
} |
|
|
|
int startLine = 0; |
|
int startColumn = 0; |
|
int endLine = 0; |
|
int endColumn = 0; |
|
display()->screenWindow()->getSelectionStart(startColumn, startLine); |
|
display()->screenWindow()->getSelectionEnd(endColumn, endLine); |
|
return ((startLine == endLine) && (startColumn == endColumn)) ? 0 : 1; |
|
} |
|
|
|
QString TerminalDisplayAccessible::visibleText() const |
|
{ |
|
// This function should be const to allow calling it from const interface functions. |
|
TerminalDisplay *display = const_cast<TerminalDisplayAccessible *>(this)->display(); |
|
if (display->screenWindow() == nullptr) { |
|
return QString(); |
|
} |
|
|
|
return display->screenWindow()->screen()->text(0, display->_usedColumns * display->_usedLines, Screen::PreserveLineBreaks); |
|
} |
|
|
|
void TerminalDisplayAccessible::addSelection(int startOffset, int endOffset) |
|
{ |
|
if (display()->screenWindow() == nullptr) { |
|
return; |
|
} |
|
display()->screenWindow()->setSelectionStart(columnForOffset(startOffset), |
|
lineForOffset(startOffset), false); |
|
display()->screenWindow()->setSelectionEnd(columnForOffset(endOffset), |
|
lineForOffset(endOffset)); |
|
} |
|
|
|
QString TerminalDisplayAccessible::attributes(int offset, int *startOffset, int *endOffset) const |
|
{ |
|
// FIXME: this function should return css like attributes |
|
// as defined in the web ARIA standard |
|
Q_UNUSED(offset) |
|
*startOffset = 0; |
|
*endOffset = characterCount(); |
|
return QString(); |
|
} |
|
|
|
QRect TerminalDisplayAccessible::characterRect(int offset) const |
|
{ |
|
int row = offset / display()->_usedColumns; |
|
int col = offset - row * display()->_usedColumns; |
|
QPoint position = QPoint(col * display()->fontWidth(), row * display()->fontHeight()); |
|
return QRect(position, QSize(display()->fontWidth(), display()->fontHeight())); |
|
} |
|
|
|
int TerminalDisplayAccessible::offsetAtPoint(const QPoint &point) const |
|
{ |
|
// FIXME return the offset into the text from the given point |
|
Q_UNUSED(point) |
|
return 0; |
|
} |
|
|
|
void TerminalDisplayAccessible::removeSelection(int selectionIndex) |
|
{ |
|
if ((display()->screenWindow() == nullptr) || (selectionIndex != 0)) { |
|
return; |
|
} |
|
display()->screenWindow()->clearSelection(); |
|
} |
|
|
|
void TerminalDisplayAccessible::scrollToSubstring(int startIndex, int endIndex) |
|
{ |
|
// FIXME: make sure the string between startIndex and endIndex is visible |
|
Q_UNUSED(startIndex) |
|
Q_UNUSED(endIndex) |
|
} |
|
|
|
void TerminalDisplayAccessible::setCursorPosition(int position) |
|
{ |
|
if (display()->screenWindow() == nullptr) { |
|
return; |
|
} |
|
|
|
display()->screenWindow()->screen()->setCursorYX(lineForOffset(position), |
|
columnForOffset(position)); |
|
} |
|
|
|
void *TerminalDisplayAccessible::interface_cast(QAccessible::InterfaceType type) |
|
{ |
|
if (type == QAccessible::TextInterface) { |
|
return static_cast<QAccessibleTextInterface *>(this); |
|
} |
|
|
|
return QAccessibleWidget::interface_cast(type); |
|
} |
|
|
|
void TerminalDisplayAccessible::setSelection(int selectionIndex, int startOffset, int endOffset) |
|
{ |
|
if (selectionIndex != 0) { |
|
return; |
|
} |
|
addSelection(startOffset, endOffset); |
|
} |
|
|
|
QString TerminalDisplayAccessible::text(int startOffset, int endOffset) const |
|
{ |
|
if (display()->screenWindow() == nullptr) { |
|
return QString(); |
|
} |
|
|
|
return display()->screenWindow()->screen()->text(startOffset, endOffset, Screen::PreserveLineBreaks); |
|
} |
|
|
|
TerminalDisplay *TerminalDisplayAccessible::display() const |
|
{ |
|
return qobject_cast<TerminalDisplay *>(widget()); |
|
}
|
|
|