mirror of
https://github.com/KDE/konsole.git
synced 2026-06-11 23:45:09 -04:00
182 lines
5.7 KiB
C++
182 lines
5.7 KiB
C++
/*
|
|
* 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())
|
|
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() || selectionIndex)
|
|
return;
|
|
|
|
int startLine;
|
|
int startColumn;
|
|
int endLine;
|
|
int endColumn;
|
|
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())
|
|
return 0;
|
|
|
|
int startLine;
|
|
int startColumn;
|
|
int endLine;
|
|
int endColumn;
|
|
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())
|
|
return QString();
|
|
|
|
return display->screenWindow()->screen()->text(0, display->_usedColumns * display->_usedLines, true);
|
|
}
|
|
|
|
void TerminalDisplayAccessible::addSelection(int startOffset, int endOffset)
|
|
{
|
|
if (!display()->screenWindow())
|
|
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() || selectionIndex)
|
|
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())
|
|
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()) {
|
|
return QString();
|
|
}
|
|
|
|
return display()->screenWindow()->screen()->text(startOffset, endOffset, true);
|
|
}
|
|
|
|
TerminalDisplay* TerminalDisplayAccessible::display() const
|
|
{
|
|
return static_cast<TerminalDisplay*>(widget());
|
|
}
|