Attach/DetachShell are now private. Added a new TermView constructor

which only specifies the rows and columns, view size is automatically 
calculated, and used it in TermWindow. Added a TermView::SetTitle() 
method, thus TermParse doesn't call Window() anymore. Some cleanups, 
scrollbar was off by one.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21808 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stefano Ceccherini 2007-08-03 09:59:30 +00:00
parent efd2184922
commit 2b87a97ac6
8 changed files with 189 additions and 150 deletions

View File

@ -232,14 +232,18 @@ Shell::Signal(int signal)
status_t
Shell::GetAttr(struct termios &attr)
{
return tcgetattr(fFd, &attr);
if (tcgetattr(fFd, &attr) < 0)
return errno;
return B_OK;
}
status_t
Shell::SetAttr(struct termios &attr)
{
return tcsetattr(fFd, TCSANOW, &attr);
if (tcsetattr(fFd, TCSANOW, &attr) < 0)
return errno;
return B_OK;
}
@ -378,13 +382,6 @@ Shell::_Spawn(int row, int col, const char *command, const char *encoding)
exit(1);
}
struct termios tio;
/* get tty termios (not necessary).
* TODO: so why are we doing it ?
*/
tcgetattr(slave, &tio);
/* set signal default */
signal(SIGCHLD, SIG_DFL);
signal(SIGHUP, SIG_DFL);
@ -393,6 +390,12 @@ Shell::_Spawn(int row, int col, const char *command, const char *encoding)
signal(SIGINT, SIG_DFL);
signal(SIGTTOU, SIG_DFL);
struct termios tio;
/* get tty termios (not necessary).
* TODO: so why are we doing it ?
*/
tcgetattr(slave, &tio);
/*
* Set Terminal interface.
*/

View File

@ -37,8 +37,8 @@ public:
status_t GetAttr(struct termios &attr);
status_t SetAttr(struct termios &attr);
int FD() const;
int FD() const;
virtual void ViewAttached(TermView *view);
virtual void ViewDetached();

View File

@ -20,7 +20,7 @@ SmartTabView::SmartTabView(BRect frame, const char *name, button_width width,
{
// See BTabView::_InitObject() to see why we are doing this
ContainerView()->MoveBy(-3, -TabHeight() - 3);
ContainerView()->ResizeBy(9, TabHeight() + 9);
ContainerView()->ResizeBy(10, TabHeight() + 9);
}

View File

@ -19,7 +19,6 @@
#include <Beep.h>
#include <Message.h>
#include <Window.h>
//////////////////////////////////////////////////////////////////////////////
@ -851,7 +850,7 @@ TermParse::EscParse()
switch (mode_char) {
case '0':
case '2':
fView->Window()->SetTitle(string);
fView->SetTitle(string);
break;
case '1':
break;

View File

@ -19,7 +19,6 @@
#include "TermConst.h"
#include "VTkeymap.h"
#include <Application.h>
#include <Alert.h>
#include <Beep.h>
#include <Clipboard.h>
@ -107,12 +106,31 @@ const unsigned char M_ADD_CURSOR[] = {
#define ROWS_DEFAULT 25
#define COLUMNS_DEFAULT 80
static property_info sPropList[] = {
{ "encoding",
{B_GET_PROPERTY, 0},
{B_DIRECT_SPECIFIER, 0},
"get terminal encoding"},
{ "encoding",
{B_SET_PROPERTY, 0},
{B_DIRECT_SPECIFIER, 0},
"set terminal encoding"},
{ "tty",
{B_GET_PROPERTY, 0},
{B_DIRECT_SPECIFIER, 0},
"get tty name."},
{ 0 }
};
const static uint32 kUpdateSigWinch = 'Rwin';
const static rgb_color kBlackColor = { 0, 0, 0, 255 };
const static rgb_color kWhiteColor = { 255, 255, 255, 255 };
TermView::TermView(BRect frame, const char *command, int32 historySize)
: BView(frame, "termview", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS | B_PULSE_NEEDED),
fShell(NULL),
@ -161,6 +179,55 @@ TermView::TermView(BRect frame, const char *command, int32 historySize)
}
TermView::TermView(int rows, int columns, const char *command, int32 historySize)
: BView(BRect(0, 0, 0, 0), "termview", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS | B_PULSE_NEEDED),
fShell(NULL),
fFontWidth(0),
fFontHeight(0),
fFontAscent(0),
fUpdateFlag(false),
fInsertModeFlag(MODE_OVER),
fScrollUpCount(0),
fScrollBarRange(0),
fFrameResized(false),
fLastCursorTime(0),
fCursorDrawFlag(CURON),
fCursorStatus(CURON),
fCursorBlinkingFlag(CURON),
fCursorRedrawFlag(CURON),
fCursorHeight(0),
fCurPos(0, 0),
fCurStack(0, 0),
fBufferStartPos(-1),
fTermRows(rows),
fTermColumns(columns),
fEncoding(M_UTF8),
fTop(0),
fTextBuffer(NULL),
fScrollBar(NULL),
fTextForeColor(kBlackColor),
fTextBackColor(kWhiteColor),
fCursorForeColor(kWhiteColor),
fCursorBackColor(kBlackColor),
fSelectForeColor(kWhiteColor),
fSelectBackColor(kBlackColor),
fScrTop(0),
fScrBot(fTermRows - 1),
fScrBufSize(historySize),
fScrRegionSet(0),
fPreviousMousePoint(0, 0),
fSelStart(-1, -1),
fSelEnd(-1, -1),
fMouseTracking(false),
fMouseThread(-1),
fQuitting(false),
fIMflag(false)
{
_InitObject(command);
SetTermSize(fTermRows, fTermColumns, true);
}
TermView::TermView(BMessage *archive)
:
BView(archive),
@ -235,11 +302,12 @@ TermView::_InitObject(const char *command)
return B_NO_MEMORY;
status_t status = fShell->Open(fTermRows, fTermColumns,
command, longname2shortname(id2longname(fEncoding)));
command, longname2shortname(id2longname(fEncoding)));
if (status < B_OK)
return status;
status = AttachShell(fShell);
status = _AttachShell(fShell);
if (status < B_OK)
return status;
@ -254,7 +322,7 @@ TermView::_InitObject(const char *command)
TermView::~TermView()
{
DetachShell();
_DetachShell();
delete fTextBuffer;
delete fShell;
@ -302,27 +370,6 @@ TermView::GetPreferredSize(float *width, float *height)
}
status_t
TermView::AttachShell(Shell *shell)
{
if (shell == NULL)
return B_BAD_VALUE;
fShell = shell;
fShell->ViewAttached(this);
return B_OK;
}
void
TermView::DetachShell()
{
fShell->ViewDetached();
fShell = NULL;
}
const char *
TermView::TerminalName() const
{
@ -467,6 +514,16 @@ TermView::SetScrollBar(BScrollBar *scrollBar)
}
void
TermView::SetTitle(const char *title)
{
// TODO: Do something different in case we're a replicant,
// or in case we are inside a BTabView ?
if (Window())
Window()->SetTitle(title);
}
//! Print one character
void
TermView::PutChar(uchar *string, ushort attr, int width)
@ -949,6 +1006,27 @@ TermView::ScrollAtCursor()
}
status_t
TermView::_AttachShell(Shell *shell)
{
if (shell == NULL)
return B_BAD_VALUE;
fShell = shell;
fShell->ViewAttached(this);
return B_OK;
}
void
TermView::_DetachShell()
{
fShell->ViewDetached();
fShell = NULL;
}
status_t
TermView::_InitMouseThread()
{
@ -1007,9 +1085,9 @@ TermView::_MouseTracking()
}
if (tmppos > stpos && tmppos < edpos)
be_app->SetCursor(M_ADD_CURSOR);
SetViewCursor(M_ADD_CURSOR);
else
be_app->SetCursor(B_HAND_CURSOR);
SetViewCursor(B_HAND_CURSOR);
}
}
snooze(50 * 1000);
@ -1442,13 +1520,18 @@ TermView::WindowActivated(bool active)
void
TermView::KeyDown(const char *bytes, int32 numBytes)
{
int32 key, mod;
Looper()->CurrentMessage()->FindInt32("modifiers", &mod);
Looper()->CurrentMessage()->FindInt32("key", &key);
if (fIMflag)
return;
int32 key, mod, rawChar;
BMessage *currentMessage = Looper()->CurrentMessage();
if (currentMessage == NULL)
return;
currentMessage->FindInt32("modifiers", &mod);
currentMessage->FindInt32("key", &key);
currentMessage->FindInt32("raw_char", &rawChar);
// If bytes[0] equal intr character,
// send signal to shell process group.
struct termios tio;
@ -1458,6 +1541,8 @@ TermView::KeyDown(const char *bytes, int32 numBytes)
fShell->Signal(SIGINT);
}
printf("rawKey: %c\n", (char)rawChar);
// Terminal filters RET, ENTER, F1...F12, and ARROW key code.
// TODO: Cleanup
if (numBytes == 1) {
@ -1594,7 +1679,7 @@ TermView::FrameResized(float width, float height)
{
const int cols = ((int)width + 1) / fFontWidth;
const int rows = ((int)height + 1) / fFontHeight;
int offset = 0;
if (rows < fCurPos.y + 1) {
@ -1673,13 +1758,14 @@ TermView::MessageReceived(BMessage *msg)
_DoSelectAll();
break;
case B_SET_PROPERTY: {
case B_SET_PROPERTY:
{
int32 i;
int32 encodingID;
BMessage spe;
msg->GetCurrentSpecifier(&i, &spe);
if (!strcmp("encoding", spe.FindString("property", i))){
msg->FindInt32 ("data", &encodingID);
BMessage specifier;
msg->GetCurrentSpecifier(&i, &specifier);
if (!strcmp("encoding", specifier.FindString("property", i))){
msg->FindInt32 ("data", &encodingID);
SetEncoding(encodingID);
msg->SendReply(B_REPLY);
} else {
@ -1688,16 +1774,16 @@ TermView::MessageReceived(BMessage *msg)
break;
}
case B_GET_PROPERTY: {
case B_GET_PROPERTY:
{
int32 i;
BMessage spe;
msg->GetCurrentSpecifier(&i, &spe);
if (!strcmp("encoding", spe.FindString("property", i))){
BMessage specifier;
msg->GetCurrentSpecifier(&i, &specifier);
if (!strcmp("encoding", specifier.FindString("property", i))){
BMessage reply(B_REPLY);
reply.AddInt32("result", Encoding());
msg->SendReply(&reply);
}
else if (!strcmp("tty", spe.FindString("property", i))) {
} else if (!strcmp("tty", specifier.FindString("property", i))) {
BMessage reply(B_REPLY);
reply.AddString("result", TerminalName());
msg->SendReply(&reply);
@ -1748,40 +1834,23 @@ TermView::MessageReceived(BMessage *msg)
status_t
TermView::GetSupportedSuites(BMessage *message)
{
static property_info propList[] = {
{ "encoding",
{B_GET_PROPERTY, 0},
{B_DIRECT_SPECIFIER, 0},
"get muterminal encoding"},
{ "encoding",
{B_SET_PROPERTY, 0},
{B_DIRECT_SPECIFIER, 0},
"set muterminal encoding"},
{ "tty",
{B_GET_PROPERTY, 0},
{B_DIRECT_SPECIFIER, 0},
"get tty_name."},
{ 0 }
};
message->AddString("suites", "suite/vnd.naan-termview");
BPropertyInfo propInfo(propList);
BPropertyInfo propInfo(sPropList);
message->AddString("suites", "suite/vnd.naan-termview");
message->AddFlat("messages", &propInfo);
return BView::GetSupportedSuites(message);
}
BHandler*
TermView::ResolveSpecifier(BMessage *msg, int32 index, BMessage *specifier,
int32 form, const char *property)
TermView::ResolveSpecifier(BMessage *message, int32 index, BMessage *specifier,
int32 what, const char *property)
{
if (((strcmp(property, "encode") == 0)
&& ((msg->what == B_SET_PROPERTY) || (msg->what == B_GET_PROPERTY)))
|| ((strcmp(property, "tty") == 0) && (msg->what == B_GET_PROPERTY)))
return this;
return BView::ResolveSpecifier(msg, index, specifier, form, property);
BHandler *target = this;
BPropertyInfo propInfo(sPropList);
if (propInfo.FindMatch(message, index, specifier, what, property) < B_OK)
target = BView::ResolveSpecifier(message, index, specifier, what, property);
return target;
}
@ -2058,14 +2127,13 @@ TermView::MouseMoved(BPoint where, uint32 transit, const BMessage *message)
void
TermView::_Select(CurPos start, CurPos end)
{
uchar buf[4];
ushort attr;
if (start.x < 0)
start.x = 0;
if (end.x >= fTermColumns)
end.x = fTermColumns - 1;
uchar buf[4];
ushort attr;
if (fTextBuffer->GetChar(start.y, start.x, buf, &attr) == IN_STRING) {
start.x--;
if (start.x < 0)
@ -2090,10 +2158,6 @@ TermView::_Select(CurPos start, CurPos end)
void
TermView::_AddSelectRegion(CurPos pos)
{
uchar buf[4];
ushort attr;
CurPos start, end, inPos;
if (!_HasSelection())
return;
@ -2107,14 +2171,17 @@ TermView::_AddSelectRegion(CurPos pos)
if (pos.y < 0)
pos.y = 0;
uchar buf[4];
ushort attr;
if (fTextBuffer->GetChar(pos.y, pos.x, buf, &attr) == IN_STRING) {
pos.x++;
if (pos.x >= fTermColumns)
pos.x = fTermColumns - 1;
}
start = fSelStart;
end = fSelEnd;
CurPos start = fSelStart;
CurPos end = fSelEnd;
CurPos inPos;
// Mouse point is same as selected line.
if (pos.y == fSelStart.y && pos.y == fSelEnd.y) {
@ -2169,11 +2236,7 @@ TermView::_AddSelectRegion(CurPos pos)
void
TermView::_ResizeSelectRegion(CurPos pos)
{
CurPos inPos;
uchar buf[4];
ushort attr;
inPos = fSelEnd;
CurPos inPos = fSelEnd;
// error check, and if mouse point to a plase full width character,
// select point decliment.
@ -2185,8 +2248,9 @@ TermView::_ResizeSelectRegion(CurPos pos)
if (pos.y < 0)
pos.y = 0;
if (fTextBuffer->GetChar(pos.y, pos.x, buf, &attr) == IN_STRING) {
uchar buf[4];
ushort attr;
if (fTextBuffer->GetChar(pos.y, pos.x, buf, &attr) == IN_STRING) {
pos.x++;
if (pos == inPos)
@ -2206,15 +2270,13 @@ TermView::_ResizeSelectRegion(CurPos pos)
void
TermView::_DeSelect(void)
{
CurPos start, end;
if (!_HasSelection())
return;
fTextBuffer->DeSelect();
start = fSelStart;
end = fSelEnd;
CurPos start = fSelStart;
CurPos end = fSelEnd;
fSelStart.Set(-1, -1);
fSelEnd.Set(-1, -1);
@ -2241,19 +2303,13 @@ TermView::_SelectWord(BPoint where, int mod)
fTextBuffer->Select(start, end);
if (mod & B_SHIFT_KEY) {
if (flag) {
if (start < fSelStart)
_AddSelectRegion(start);
else if (end > fSelEnd)
_AddSelectRegion(end);
_AddSelectRegion(end);
} else
_AddSelectRegion(pos);
} else {
_DeSelect();
if (flag)
@ -2441,6 +2497,7 @@ TermView::Find(const BString &str, bool forwardSearch, bool matchCase, bool matc
return true;
}
//! Get the selected text and copy to str
void
TermView::GetSelection(BString &str)

View File

@ -33,22 +33,21 @@ class TermBuffer;
class TermView : public BView {
public:
TermView(BRect frame, const char *command = NULL, int32 historySize = 1000);
TermView(int rows, int columns, const char *command = NULL, int32 historySize = 1000);
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);
status_t AttachShell(Shell *shell);
void DetachShell();
const char *TerminalName() const;
void SetTermFont(const BFont *halfFont, const BFont *fullFont);
void GetFontSize(int *width, int *height);
BRect SetTermSize(int rows, int cols, bool flag);
BRect SetTermSize(int rows, int cols, bool resize);
void SetTextColor(rgb_color fore, rgb_color back);
void SetSelectColor(rgb_color fore, rgb_color back);
void SetCursorColor(rgb_color fore, rgb_color back);
@ -60,6 +59,8 @@ public:
void SetScrollBar(BScrollBar *scrbar);
BScrollBar *ScrollBar() const { return fScrollBar; };
void SetTitle(const char *title);
// Output Charactor
void PutChar(uchar *string, ushort attr, int width);
void PutCR(void);
@ -135,6 +136,9 @@ private:
status_t _InitObject(const char *command);
status_t _InitMouseThread(void);
status_t _AttachShell(Shell *shell);
void _DetachShell();
void _AboutRequested();
void _DrawLines(int , int, ushort, uchar *, int, int, int, BView *);

View File

@ -33,8 +33,6 @@
#include <ScrollBar.h>
#include <ScrollView.h>
#include <String.h>
#include <TextControl.h>
#include <WindowScreen.h>
#include <stdio.h>
#include <string.h>
@ -60,9 +58,7 @@ TermWindow::TermWindow(BRect frame, const char* title, const char *command)
fEditmenu(NULL),
fEncodingmenu(NULL),
fHelpmenu(NULL),
fFontMenu(NULL),
fWindowSizeMenu(NULL),
fNewFontMenu(NULL),
fPrintSettings(NULL),
fPrefWindow(NULL),
fFindPanel(NULL),
@ -181,28 +177,11 @@ TermWindow::_SetupMenu()
fWindowSizeMenu->AddItem(new BMenuItem("132x25", new BMessage(ONETHREETWOTWENTYFIVE)));
fWindowSizeMenu->AddItem(new BMenuItem("Fullscreen", new BMessage(FULLSCREEN), B_ENTER));
// Considering we have this in the preferences window, this menu is not
// needed and should not be shown if we are to not confuse the user
/* fNewFontMenu = new BMenu("Font");
fNewFontMenu->SetRadioMode(true);
int32 numFamilies1 = count_font_families();
for ( int32 i = 0; i < numFamilies1; i++ ) {
font_family family;
uint32 flags;
if ( get_font_family(i, &family, &flags) == B_OK ) {
fNewFontMenu->AddItem(item = new BMenuItem(family, new BMessage(MSG_FONT_CHANGED)));
// if (0 ==i) item->SetMarked(true);
}
}
fNewFontMenu->FindItem (PrefHandler::Default()->getString(PREF_HALF_FONT_FAMILY))->SetMarked(true);
*/
fEncodingmenu = new BMenu("Font Encoding");
fEncodingmenu->SetRadioMode(true);
MakeEncodingMenu(fEncodingmenu, true);
fHelpmenu->AddItem(fWindowSizeMenu);
fHelpmenu->AddItem(fEncodingmenu);
// fHelpmenu->AddItem(fNewFontMenu);
fHelpmenu->AddSeparatorItem();
fHelpmenu->AddItem(new BMenuItem("Preferences" B_UTF8_ELLIPSIS, new BMessage(MENU_PREF_OPEN)));
fHelpmenu->AddSeparatorItem();
@ -427,7 +406,6 @@ TermWindow::MessageReceived(BMessage *message)
break;
}
case MSG_FONT_CHANGED: {
PrefHandler::Default()->setString (PREF_HALF_FONT_FAMILY, fNewFontMenu->FindMarked()->Label());
PostMessage(MSG_HALF_FONT_CHANGED);
break;
}
@ -473,6 +451,9 @@ TermWindow::WindowActivated(bool activated)
bool
TermWindow::QuitRequested()
{
// TODO: Intercept the B_QUIT_REQUESTED message
// sent by the TermView, and only close one tab if there
// are multiple ones ? Or handle the case inside TermView itself ?
be_app->PostMessage(B_QUIT_REQUESTED);
return true;
}
@ -577,7 +558,9 @@ TermWindow::_NewTab(const char *command)
fullFont.SetSpacing(B_FIXED_SPACING);
// Make Terminal text view.
TermView *view = new TermView(BRect(0, 0, 10, 10), command);
TermView *view = new TermView(PrefHandler::Default()->getInt32(PREF_ROWS),
PrefHandler::Default()->getInt32(PREF_COLS),
command);
BScrollView *scrollView = new BScrollView("scrollView", view, B_FOLLOW_ALL,
B_WILL_DRAW|B_FRAME_EVENTS, false, true);
@ -592,10 +575,6 @@ TermWindow::_NewTab(const char *command)
_SetTermColors();
BRect rect = view->SetTermSize(PrefHandler::Default()->getInt32(PREF_ROWS),
PrefHandler::Default()->getInt32(PREF_COLS), false);
// If it's the first time we're called, setup the window
if (fTabView->CountTabs() == 1) {
int width, height;
@ -603,12 +582,11 @@ TermWindow::_NewTab(const char *command)
SetSizeLimits(MIN_COLS * width, MAX_COLS * width,
MIN_COLS * height, MAX_COLS * height);
// Add offset to baseview.
rect.InsetBy(-kViewOffset, -kViewOffset);
float fWidth, fHeight;
view->GetPreferredSize(&fWidth, &fHeight);
// Resize Window
ResizeTo(rect.Width()+ B_V_SCROLL_BAR_WIDTH,
rect.Height() + fMenubar->Bounds().Height());
ResizeTo(fWidth + B_V_SCROLL_BAR_WIDTH, fHeight + fMenubar->Bounds().Height());
// TODO: If I don't do this, the view won't show up.
// Bug in BTabView or in my code ?

View File

@ -69,9 +69,7 @@ private:
*fEditmenu,
*fEncodingmenu,
*fHelpmenu,
*fFontMenu,
*fWindowSizeMenu,
*fNewFontMenu;
*fWindowSizeMenu;
BMessage *fPrintSettings;
PrefWindow *fPrefWindow;