390 lines
11 KiB
C++
390 lines
11 KiB
C++
/*
|
|
* Copyright 2001-2013, Haiku, Inc.
|
|
* Copyright (c) 2003-4 Kian Duffy <myob@users.sourceforge.net>
|
|
* Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai.
|
|
*
|
|
* Distributed under the terms of the MIT license.
|
|
* Authors:
|
|
* Stefano Ceccherini, stefano.ceccherini@gmail.com
|
|
* Kian Duffy, myob@users.sourceforge.net
|
|
* Simon South, simon@simonsouth.net
|
|
* Ingo Weinhold, ingo_weinhold@gmx.de
|
|
* Siarzhuk Zharski, zharik@gmx.li
|
|
*/
|
|
#ifndef TERMVIEW_H
|
|
#define TERMVIEW_H
|
|
|
|
|
|
#include <Autolock.h>
|
|
#include <HashMap.h>
|
|
#include <InterfaceDefs.h>
|
|
#include <Messenger.h>
|
|
#include <ObjectList.h>
|
|
#include <String.h>
|
|
#include <View.h>
|
|
|
|
#include "TermPos.h"
|
|
#include "TermViewHighlight.h"
|
|
|
|
|
|
class ActiveProcessInfo;
|
|
class BClipboard;
|
|
class BMessageRunner;
|
|
class BScrollBar;
|
|
class BScrollView;
|
|
class BString;
|
|
class BStringView;
|
|
class BasicTerminalBuffer;
|
|
class DefaultCharClassifier;
|
|
class InlineInput;
|
|
class ResizeWindow;
|
|
class ShellInfo;
|
|
class ShellParameters;
|
|
class TermBuffer;
|
|
class TerminalBuffer;
|
|
class Shell;
|
|
|
|
|
|
class TermView : public BView, private TermViewHighlighter {
|
|
public:
|
|
class Listener;
|
|
|
|
typedef TermViewHighlighter Highlighter;
|
|
typedef TermViewHighlight Highlight;
|
|
|
|
public:
|
|
TermView(BRect frame,
|
|
const ShellParameters& shellParameters,
|
|
int32 historySize);
|
|
TermView(int rows, int columns,
|
|
const ShellParameters& shellParameters,
|
|
int32 historySize);
|
|
TermView(BMessage* archive);
|
|
~TermView();
|
|
|
|
static BArchivable* Instantiate(BMessage* data);
|
|
virtual status_t Archive(BMessage* data, bool deep = true) const;
|
|
|
|
virtual void GetPreferredSize(float* _width, float* _height);
|
|
|
|
bool IsShellBusy() const;
|
|
bool GetActiveProcessInfo(
|
|
ActiveProcessInfo& _info) const;
|
|
bool GetShellInfo(ShellInfo& _info) const;
|
|
|
|
const char* TerminalName() const;
|
|
|
|
inline TerminalBuffer* TextBuffer() const { return fTextBuffer; }
|
|
|
|
void GetTermFont(BFont* font) const;
|
|
void SetTermFont(const BFont* font);
|
|
|
|
void GetFontSize(float* width, float* height);
|
|
int Rows() const;
|
|
int Columns() const;
|
|
BRect SetTermSize(int rows, int columns,
|
|
bool notifyShell);
|
|
void SetTermSize(BRect rect,
|
|
bool notifyShell = false);
|
|
void GetTermSizeFromRect(const BRect &rect,
|
|
int *rows, int *columns);
|
|
|
|
void SetTextColor(rgb_color fore, rgb_color back);
|
|
void SetCursorColor(rgb_color fore, rgb_color back);
|
|
void SetSelectColor(rgb_color fore, rgb_color back);
|
|
void SetTermColor(uint index, rgb_color color,
|
|
bool dynamic = false);
|
|
status_t GetTermColor(uint index, rgb_color* color);
|
|
|
|
int Encoding() const;
|
|
void SetEncoding(int encoding);
|
|
|
|
void SetScrollBar(BScrollBar* scrollBar);
|
|
BScrollBar* ScrollBar() const { return fScrollBar; };
|
|
|
|
void SetKeymap(const key_map* keymap,
|
|
const char* chars);
|
|
void SetUseOptionAsMetaKey(bool enable);
|
|
|
|
void SetMouseClipboard(BClipboard *);
|
|
|
|
void MakeDebugSnapshots();
|
|
void StartStopDebugCapture();
|
|
|
|
void SwitchCursorBlinking(bool blinkingOn);
|
|
|
|
// edit functions
|
|
void Copy(BClipboard* clipboard);
|
|
void Paste(BClipboard* clipboard);
|
|
void SelectAll();
|
|
void Clear();
|
|
|
|
// Other
|
|
void GetFrameSize(float* width, float* height);
|
|
bool Find(const BString& str, bool forwardSearch,
|
|
bool matchCase, bool matchWord);
|
|
void GetSelection(BString& string);
|
|
|
|
bool CheckShellGone() const;
|
|
|
|
void InitiateDrag();
|
|
|
|
void DisableResizeView(int32 disableCount = 1);
|
|
|
|
void SetListener(Listener* listener)
|
|
{ fListener = listener; }
|
|
|
|
protected:
|
|
virtual void AttachedToWindow();
|
|
virtual void DetachedFromWindow();
|
|
virtual void Draw(BRect updateRect);
|
|
virtual void WindowActivated(bool active);
|
|
virtual void MakeFocus(bool focusState = true);
|
|
virtual void KeyDown(const char* bytes, int32 numBytes);
|
|
|
|
virtual void MouseDown(BPoint where);
|
|
virtual void MouseMoved(BPoint where, uint32 transit,
|
|
const BMessage* message);
|
|
virtual void MouseUp(BPoint where);
|
|
|
|
virtual void FrameResized(float width, float height);
|
|
virtual void MessageReceived(BMessage* message);
|
|
|
|
virtual void ScrollTo(BPoint where);
|
|
virtual void TargetedByScrollView(BScrollView *scrollView);
|
|
|
|
virtual status_t GetSupportedSuites(BMessage* message);
|
|
virtual BHandler* ResolveSpecifier(BMessage* message, int32 index,
|
|
BMessage* specifier, int32 form,
|
|
const char* property);
|
|
|
|
private:
|
|
class TextBufferSyncLocker;
|
|
friend class TextBufferSyncLocker;
|
|
|
|
class State;
|
|
class StandardBaseState;
|
|
class DefaultState;
|
|
class SelectState;
|
|
class HyperLinkState;
|
|
class HyperLinkMenuState;
|
|
|
|
friend class State;
|
|
friend class StandardBaseState;
|
|
friend class DefaultState;
|
|
friend class SelectState;
|
|
friend class HyperLinkState;
|
|
friend class HyperLinkMenuState;
|
|
|
|
typedef BObjectList<Highlight> HighlightList;
|
|
|
|
private:
|
|
// TermViewHighlighter
|
|
virtual rgb_color ForegroundColor();
|
|
virtual rgb_color BackgroundColor();
|
|
|
|
private:
|
|
// point and text offset conversion
|
|
inline int32 _LineAt(float y);
|
|
inline float _LineOffset(int32 index);
|
|
TermPos _ConvertToTerminal(const BPoint& point);
|
|
inline BPoint _ConvertFromTerminal(const TermPos& pos);
|
|
|
|
inline void _InvalidateTextRect(int32 x1, int32 y1,
|
|
int32 x2, int32 y2);
|
|
|
|
status_t _InitObject(
|
|
const ShellParameters& shellParameters);
|
|
|
|
status_t _AttachShell(Shell* shell);
|
|
void _DetachShell();
|
|
|
|
void _Activate();
|
|
void _Deactivate();
|
|
|
|
void _DrawLinePart(float x1, float y1, uint32 attr,
|
|
char* buffer, int32 width,
|
|
Highlight* highlight, bool cursor,
|
|
BView* inView);
|
|
void _DrawCursor();
|
|
void _InvalidateTextRange(TermPos start,
|
|
TermPos end);
|
|
|
|
bool _IsCursorVisible() const;
|
|
void _BlinkCursor();
|
|
void _ActivateCursor(bool invalidate);
|
|
|
|
void _DoPrint(BRect updateRect);
|
|
void _UpdateScrollBarRange();
|
|
void _SecondaryMouseButtonDropped(BMessage* message);
|
|
void _DoSecondaryMouseDropAction(BMessage* message);
|
|
void _DoFileDrop(entry_ref &ref);
|
|
|
|
void _SynchronizeWithTextBuffer(
|
|
int32 visibleDirtyTop,
|
|
int32 visibleDirtyBottom);
|
|
void _VisibleTextBufferChanged();
|
|
|
|
void _WritePTY(const char* text, int32 numBytes);
|
|
|
|
// selection
|
|
float _MouseDistanceSinceLastClick(BPoint where);
|
|
void _Select(TermPos start, TermPos end,
|
|
bool inclusive, bool setInitialSelection);
|
|
void _ExtendSelection(TermPos, bool inclusive,
|
|
bool useInitialSelection);
|
|
void _Deselect();
|
|
bool _HasSelection() const;
|
|
void _SelectWord(BPoint where, bool extend,
|
|
bool useInitialSelection);
|
|
void _SelectLine(BPoint where, bool extend,
|
|
bool useInitialSelection);
|
|
|
|
void _AddHighlight(Highlight* highlight);
|
|
void _RemoveHighlight(Highlight* highlight);
|
|
bool _ClearHighlight(Highlight* highlight);
|
|
|
|
Highlight* _CheckHighlightRegion(const TermPos& pos) const;
|
|
Highlight* _CheckHighlightRegion(int32 row,
|
|
int32 firstColumn, int32& lastColumn) const;
|
|
|
|
void _UpdateSIGWINCH();
|
|
|
|
void _ScrollTo(float y, bool scrollGfx);
|
|
void _ScrollToRange(TermPos start, TermPos end);
|
|
|
|
void _SendMouseEvent(int32 button, int32 mode,
|
|
int32 x, int32 y, bool motion);
|
|
|
|
void _DrawInlineMethodString();
|
|
void _HandleInputMethodChanged(BMessage* message);
|
|
void _HandleInputMethodLocationRequest();
|
|
void _CancelInputMethod();
|
|
|
|
void _UpdateModifiers();
|
|
|
|
void _NextState(State* state);
|
|
|
|
private:
|
|
Listener* fListener;
|
|
Shell* fShell;
|
|
|
|
BMessageRunner* fWinchRunner;
|
|
BMessageRunner* fCursorBlinkRunner;
|
|
BMessageRunner* fAutoScrollRunner;
|
|
BMessageRunner* fResizeRunner;
|
|
BStringView* fResizeView;
|
|
DefaultCharClassifier* fCharClassifier;
|
|
|
|
// Font and Width
|
|
BFont fHalfFont;
|
|
BFont fBoldFont;
|
|
float fFontWidth;
|
|
int fFontHeight;
|
|
int fFontAscent;
|
|
struct escapement_delta fEscapement;
|
|
bool fEmulateBold;
|
|
bool fAllowBold;
|
|
|
|
// frame resized flag.
|
|
bool fFrameResized;
|
|
int32 fResizeViewDisableCount;
|
|
|
|
// Cursor Blinking, draw flag.
|
|
bigtime_t fLastActivityTime;
|
|
int32 fCursorState;
|
|
int fCursorStyle;
|
|
bool fCursorBlinking;
|
|
bool fCursorHidden;
|
|
|
|
// Cursor position.
|
|
TermPos fCursor;
|
|
|
|
// Terminal rows and columns.
|
|
int fColumns;
|
|
int fRows;
|
|
|
|
int fEncoding;
|
|
bool fActive;
|
|
|
|
// Object pointer.
|
|
TerminalBuffer* fTextBuffer;
|
|
BasicTerminalBuffer* fVisibleTextBuffer;
|
|
bool fVisibleTextBufferChanged;
|
|
BScrollBar* fScrollBar;
|
|
InlineInput* fInline;
|
|
|
|
// Color and Attribute.
|
|
rgb_color fTextForeColor;
|
|
rgb_color fTextBackColor;
|
|
rgb_color fCursorForeColor;
|
|
rgb_color fCursorBackColor;
|
|
rgb_color fSelectForeColor;
|
|
rgb_color fSelectBackColor;
|
|
|
|
// Scroll Region
|
|
float fScrollOffset;
|
|
int32 fScrBufSize;
|
|
// TODO: That's the history capacity -- only needed
|
|
// until the text buffer is created.
|
|
float fAutoScrollSpeed;
|
|
|
|
// redraw management
|
|
bigtime_t fLastSyncTime;
|
|
int32 fScrolledSinceLastSync;
|
|
BMessageRunner* fSyncRunner;
|
|
bool fConsiderClockedSync;
|
|
|
|
// selection
|
|
Highlight fSelection;
|
|
TermPos fInitialSelectionStart;
|
|
TermPos fInitialSelectionEnd;
|
|
BPoint fLastClickPoint;
|
|
|
|
HighlightList fHighlights;
|
|
|
|
// keyboard
|
|
const key_map* fKeymap;
|
|
const char* fKeymapChars;
|
|
HashMap<HashKey32<int32>, const int32(*)[128]>
|
|
fKeymapTableForModifiers;
|
|
bool fUseOptionAsMetaKey;
|
|
bool fInterpretMetaKey;
|
|
bool fMetaKeySendsEscape;
|
|
|
|
// mouse
|
|
int32 fMouseButtons;
|
|
int32 fModifiers;
|
|
TermPos fPrevPos;
|
|
bool fReportX10MouseEvent;
|
|
bool fReportNormalMouseEvent;
|
|
bool fReportButtonMouseEvent;
|
|
bool fReportAnyMouseEvent;
|
|
bool fEnableExtendedMouseCoordinates;
|
|
BClipboard* fMouseClipboard;
|
|
|
|
// states
|
|
DefaultState* fDefaultState;
|
|
SelectState* fSelectState;
|
|
HyperLinkState* fHyperLinkState;
|
|
HyperLinkMenuState* fHyperLinkMenuState;
|
|
State* fActiveState;
|
|
};
|
|
|
|
|
|
class TermView::Listener {
|
|
public:
|
|
virtual ~Listener();
|
|
|
|
// all hooks called in the window thread
|
|
virtual void NotifyTermViewQuit(TermView* view,
|
|
int32 reason);
|
|
virtual void SetTermViewTitle(TermView* view,
|
|
const char* title);
|
|
virtual void PreviousTermView(TermView* view);
|
|
virtual void NextTermView(TermView* view);
|
|
};
|
|
|
|
|
|
#endif // TERMVIEW_H
|