* Setting the window title via "-t" now works.

* Improved error message in case the initial shell couldn't be executed.
* Disabled setting the colors via arguments, mostly because it just did quit
  the app in case there were any arguments and no /etc/rgb.txt file. This
  allows Terminal to be used by the debug_server instead of MiniTerminal.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15820 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2006-01-03 14:24:43 +00:00
parent 5b0c0d601d
commit 0d5dea62de
5 changed files with 186 additions and 211 deletions
+67 -85
View File
@@ -33,6 +33,32 @@ bool usage_requested = false;
bool geometry_requested = false; bool geometry_requested = false;
bool color_requested = false; bool color_requested = false;
struct standard_args {
char *name;
char *longname;
int priority;
int nargs;
const char *prefname;
};
struct standard_args standard_args[] = {
{ "-h", "--help", 90, 0, NULL },
{ "-p", "--preference", 80, 1, NULL },
{ "-t", "--title", 70, 1, NULL },
{ "-geom", "--geometry", 50, 1, NULL },
#if 0
{ "-fg", "--text-fore-color", 40, 1, PREF_TEXT_FORE_COLOR },
{ "-bg", "--text-back-color", 35, 1, PREF_TEXT_BACK_COLOR },
{ "-curfg", "--cursor-fore-color", 30, 1, PREF_CURSOR_FORE_COLOR },
{ "-curbg", "--cursor-back-color", 25, 1, PREF_CURSOR_BACK_COLOR },
{ "-selfg", "--select-fore-color", 20, 1, PREF_SELECT_FORE_COLOR },
{ "-selbg", "--select-back-color", 15, 1, PREF_SELECT_BACK_COLOR },
{ "-imfg", "--im-fore-color", 10, 1, PREF_IM_FORE_COLOR },
{ "-imbg", "--im-back-color", 5, 1, PREF_IM_BACK_COLOR },
{ "-imsel", "--im-select-color", 0, 1, PREF_IM_SELECT_COLOR },
#endif
};
int argmatch(char **, int, char *, char *, int, char **, int *); int argmatch(char **, int, char *, char *, int, char **, int *);
void sort_args(int, char **); void sort_args(int, char **);
int text_to_rgb(char *, rgb_color *, char *); int text_to_rgb(char *, rgb_color *, char *);
@@ -42,20 +68,22 @@ const ulong MSG_ACTIVATE_TERM = 'msat';
const ulong MSG_TERM_IS_MINIMIZE = 'mtim'; const ulong MSG_TERM_IS_MINIMIZE = 'mtim';
TermApp::TermApp(void) TermApp::TermApp()
: BApplication(TERM_SIGNATURE) : BApplication(TERM_SIGNATURE)
{ {
BList teams; BList teams;
be_roster->GetAppList(TERM_SIGNATURE, &teams); be_roster->GetAppList(TERM_SIGNATURE, &teams);
fWindowNumber = teams.CountItems(); fWindowNumber = teams.CountItems();
if(fWindowNumber == 0) if (fWindowNumber == 0) {
{
be_roster->GetAppList(R5_TERM_SIGNATURE, &teams); be_roster->GetAppList(R5_TERM_SIGNATURE, &teams);
fWindowNumber = teams.CountItems(); fWindowNumber = teams.CountItems();
} }
char title[256];
snprintf(title, sizeof(title), "Terminal %d", fWindowNumber);
fWindowTitle = title;
int i = fWindowNumber / 16; int i = fWindowNumber / 16;
int j = fWindowNumber % 16; int j = fWindowNumber % 16;
@@ -70,14 +98,14 @@ TermApp::TermApp(void)
} }
TermApp::~TermApp(void) TermApp::~TermApp()
{ {
// delete gTermPref; // delete gTermPref;
} }
void void
TermApp::ReadyToRun(void) TermApp::ReadyToRun()
{ {
// Prevent opeing window when option -h is given. // Prevent opeing window when option -h is given.
if(usage_requested) if(usage_requested)
@@ -92,7 +120,6 @@ TermApp::ReadyToRun(void)
// Get encoding name (setenv TTYPE in spawn_shell functions) // Get encoding name (setenv TTYPE in spawn_shell functions)
const etable *p = encoding_table; const etable *p = encoding_table;
while (p->name) { while (p->name) {
if (!strcmp(p->name, encoding)) { if (!strcmp(p->name, encoding)) {
encoding = p->shortname; encoding = p->shortname;
break; break;
@@ -123,10 +150,9 @@ TermApp::ReadyToRun(void)
void void
TermApp::Quit(void) TermApp::Quit()
{ {
if (!usage_requested){ if (!usage_requested){
int status; int status;
kill(-sh_pid, SIGHUP); kill(-sh_pid, SIGHUP);
@@ -134,7 +160,6 @@ TermApp::Quit(void)
} }
delete gTermPref; delete gTermPref;
BApplication::Quit(); BApplication::Quit();
} }
@@ -163,23 +188,19 @@ TermApp::AboutRequested()
void void
TermApp::MessageReceived(BMessage* msg) TermApp::MessageReceived(BMessage* msg)
{ {
switch(msg->what) switch (msg->what) {
{
case MENU_NEW_TREM: case MENU_NEW_TREM:
{
RunNewTerm(); RunNewTerm();
break; break;
}
case MENU_SWITCH_TERM: case MENU_SWITCH_TERM:
{
SwitchTerm(); SwitchTerm();
break; break;
}
case MSG_ACTIVATE_TERM: case MSG_ACTIVATE_TERM:
{
fTermWindow->TermWinActivate(); fTermWindow->TermWinActivate();
break; break;
}
case MSG_TERM_IS_MINIMIZE: case MSG_TERM_IS_MINIMIZE:
{ {
BMessage reply(B_REPLY); BMessage reply(B_REPLY);
@@ -187,46 +208,19 @@ TermApp::MessageReceived(BMessage* msg)
msg->SendReply(&reply); msg->SendReply(&reply);
break; break;
} }
default: default:
{
BApplication::MessageReceived(msg); BApplication::MessageReceived(msg);
break; break;
} }
} }
}
struct standard_args
{
char *name;
char *longname;
int priority;
int nargs;
const char *prefname;
};
struct standard_args standard_args[] =
{
{ "-h", "--help", 90, 0, NULL },
{ "-p", "--preference", 80, 1, NULL },
{ "-t", "--title", 70, 1, NULL },
{ "-geom", "--geometry", 50, 1, NULL },
{ "-fg", "--text-fore-color", 40, 1, PREF_TEXT_FORE_COLOR },
{ "-bg", "--text-back-color", 35, 1, PREF_TEXT_BACK_COLOR },
{ "-curfg", "--cursor-fore-color", 30, 1, PREF_CURSOR_FORE_COLOR },
{ "-curbg", "--cursor-back-color", 25, 1, PREF_CURSOR_BACK_COLOR },
{ "-selfg", "--select-fore-color", 20, 1, PREF_SELECT_FORE_COLOR },
{ "-selbg", "--select-back-color", 15, 1, PREF_SELECT_BACK_COLOR },
{ "-imfg", "--im-fore-color", 10, 1, PREF_IM_FORE_COLOR },
{ "-imbg", "--im-back-color", 5, 1, PREF_IM_BACK_COLOR },
{ "-imsel", "--im-select-color", 0, 1, PREF_IM_SELECT_COLOR },
};
void void
TermApp::ArgvReceived(int32 argc, char **argv) TermApp::ArgvReceived(int32 argc, char **argv)
{ {
int skip_args = 0; int skip_args = 0;
char *value = 0; char *value = 0;
rgb_color color;
if (argc < 2) if (argc < 2)
return; return;
@@ -238,7 +232,6 @@ TermApp::ArgvReceived(int32 argc, char **argv)
// Print usage // Print usage
if (argmatch(argv, argc, "-help", "--help", 3, NULL, &skip_args)) { if (argmatch(argv, argc, "-help", "--help", 3, NULL, &skip_args)) {
Usage(argv[0]); Usage(argv[0]);
usage_requested = true; usage_requested = true;
PostMessage(B_QUIT_REQUESTED); PostMessage(B_QUIT_REQUESTED);
@@ -250,17 +243,15 @@ TermApp::ArgvReceived(int32 argc, char **argv)
// Set window title // Set window title
if (argmatch(argv ,argc, "-t", "--title", 3, &value, &skip_args)) if (argmatch(argv ,argc, "-t", "--title", 3, &value, &skip_args))
strcpy(gWindowName, value); fWindowTitle = value;
// Set window geometry // Set window geometry
if (argmatch(argv, argc, "-geom", "--geometry", 4, &value, &skip_args)) { if (argmatch(argv, argc, "-geom", "--geometry", 4, &value, &skip_args)) {
int width, height, xpos, ypos; int width, height, xpos, ypos;
sscanf(value, "%dx%d+%d+%d", &width, &height, &xpos, &ypos); sscanf(value, "%dx%d+%d+%d", &width, &height, &xpos, &ypos);
if (width < 0 || height < 0 || xpos < 0 || ypos < 0 if (width < 0 || height < 0 || xpos < 0 || ypos < 0
|| width >= 256 || height >= 256 || xpos >= 2048 || ypos >= 2048) { || width >= 256 || height >= 256 || xpos >= 2048 || ypos >= 2048) {
fprintf(stderr, "%s: invalid geometry format or value.\n", argv[0]); fprintf(stderr, "%s: invalid geometry format or value.\n", argv[0]);
fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]); fprintf(stderr, "Try `%s --help' for more information.\n", argv[0]);
usage_requested = true; usage_requested = true;
@@ -273,15 +264,13 @@ TermApp::ArgvReceived(int32 argc, char **argv)
geometry_requested = true; geometry_requested = true;
} }
#if 0
// Open '/etc/rgb.txt' file // Open '/etc/rgb.txt' file
BFile inFile; BFile inFile;
status_t sts;
off_t size = 0; off_t size = 0;
sts = inFile.SetTo("/etc/rgb.txt", B_READ_ONLY); status_t status = inFile.SetTo("/etc/rgb.txt", B_READ_ONLY);
if (status != B_OK) {
if(sts != B_OK) {
fprintf(stderr, "%s: Can't open /etc/rgb.txt file.\n", argv[0]); fprintf(stderr, "%s: Can't open /etc/rgb.txt file.\n", argv[0]);
usage_requested = true; usage_requested = true;
PostMessage(B_QUIT_REQUESTED); PostMessage(B_QUIT_REQUESTED);
@@ -295,7 +284,7 @@ TermApp::ArgvReceived(int32 argc, char **argv)
for (int i = 4; i < 13; i++) { for (int i = 4; i < 13; i++) {
if (argmatch(argv, argc, standard_args[i].name, standard_args[i].longname, if (argmatch(argv, argc, standard_args[i].name, standard_args[i].longname,
9, &value, &skip_args)) { 9, &value, &skip_args)) {
rgb_color color;
if (text_to_rgb(value, &color, buffer)) if (text_to_rgb(value, &color, buffer))
gTermPref->setRGB(standard_args[i].prefname, color); gTermPref->setRGB(standard_args[i].prefname, color);
else else
@@ -304,7 +293,7 @@ TermApp::ArgvReceived(int32 argc, char **argv)
} }
delete buffer; delete buffer;
#endif
skip_args++; skip_args++;
if (skip_args < argc) { if (skip_args < argc) {
@@ -346,7 +335,7 @@ void
TermApp::RefsReceived(BMessage *message) TermApp::RefsReceived(BMessage *message)
{ {
// Works Only Launced by Double-Click file, or Drags file to App. // Works Only Launced by Double-Click file, or Drags file to App.
if(!(IsLaunching())) if (!IsLaunching())
return; return;
entry_ref ref; entry_ref ref;
@@ -372,31 +361,33 @@ TermApp::RefsReceived(BMessage *message)
// if App opened by Shell Script // if App opened by Shell Script
if (!strcmp(mimetype, "text/x-haiku-shscript")){ if (!strcmp(mimetype, "text/x-haiku-shscript")){
// Not implemented. // Not implemented.
// beep(); // beep();
return; return;
} }
} }
void void
TermApp::MakeTermWindow(BRect &frame) TermApp::MakeTermWindow(BRect &frame)
{ {
fTermWindow = new TermWindow(frame, fWindowNumber); fTermWindow = new TermWindow(frame, fWindowTitle.String());
fTermWindow->Show(); fTermWindow->Show();
} }
void void
TermApp::RunNewTerm(void) TermApp::RunNewTerm()
{ {
app_info info; app_info info;
be_app->GetAppInfo(&info); be_app->GetAppInfo(&info);
// try launching two different ways to work around possible problems // try launching two different ways to work around possible problems
if(be_roster->Launch(&(info.ref))!=B_OK) if (be_roster->Launch(&info.ref)!=B_OK)
be_roster->Launch(TERM_SIGNATURE); be_roster->Launch(TERM_SIGNATURE);
} }
void void
TermApp::ActivateTermWindow(team_id id) TermApp::ActivateTermWindow(team_id id)
{ {
@@ -408,6 +399,7 @@ TermApp::ActivateTermWindow(team_id id)
app.SendMessage(MSG_ACTIVATE_TERM); app.SendMessage(MSG_ACTIVATE_TERM);
} }
void void
TermApp::SwitchTerm() TermApp::SwitchTerm()
{ {
@@ -436,6 +428,7 @@ TermApp::SwitchTerm()
ActivateTermWindow(reinterpret_cast<team_id>(teams.ItemAt(i))); ActivateTermWindow(reinterpret_cast<team_id>(teams.ItemAt(i)));
} }
bool bool
TermApp::IsMinimize(team_id id) TermApp::IsMinimize(team_id id)
{ {
@@ -451,7 +444,6 @@ TermApp::IsMinimize(team_id id)
return true; return true;
reply.FindBool("result", &hidden); reply.FindBool("result", &hidden);
return hidden; return hidden;
} }
@@ -494,6 +486,7 @@ TermApp::Usage(char *name)
PR(" -t, --title set window title\n"); PR(" -t, --title set window title\n");
PR(" -geom, --geometry set window geometry\n"); PR(" -geom, --geometry set window geometry\n");
PR(" An example of geometry is \"80x25+100+100\"\n"); PR(" An example of geometry is \"80x25+100+100\"\n");
#if 0
PR(" -fg, --text-fore-color set window foreground color\n"); PR(" -fg, --text-fore-color set window foreground color\n");
PR(" -bg, --text-back-color set window background color\n"); PR(" -bg, --text-back-color set window background color\n");
PR(" -curfg, --cursor-fore-color set cursor foreground color\n"); PR(" -curfg, --cursor-fore-color set cursor foreground color\n");
@@ -501,6 +494,7 @@ TermApp::Usage(char *name)
PR(" -selfg, --select-fore-color set selection area foreground color\n"); PR(" -selfg, --select-fore-color set selection area foreground color\n");
PR(" -selbg, --select-back-color set selection area background color\n"); PR(" -selbg, --select-back-color set selection area background color\n");
PR(" Examples of color are \"#FF00FF\" and \"purple\"\n"); PR(" Examples of color are \"#FF00FF\" and \"purple\"\n");
#endif
PR("\n"); PR("\n");
} }
@@ -508,7 +502,6 @@ int
text_to_rgb(char *name, rgb_color *color, char *buffer) text_to_rgb(char *name, rgb_color *color, char *buffer)
{ {
if (name[0] != '#') { if (name[0] != '#') {
// Convert from /etc/rgb.txt. // Convert from /etc/rgb.txt.
BString inStr(buffer); BString inStr(buffer);
int32 point, offset = 0; int32 point, offset = 0;
@@ -522,7 +515,6 @@ text_to_rgb(char *name, rgb_color *color, char *buffer)
} while(*(buffer + point -1) != '\t'); } while(*(buffer + point -1) != '\t');
char *p = buffer + point; char *p = buffer + point;
while (*p != '\n') while (*p != '\n')
p--; p--;
p++; p++;
@@ -530,17 +522,14 @@ text_to_rgb(char *name, rgb_color *color, char *buffer)
if (sscanf(p, "%d %d %d", (int *)&color->red, (int *)&color->green, if (sscanf(p, "%d %d %d", (int *)&color->red, (int *)&color->green,
(int *)&color->blue) == EOF) (int *)&color->blue) == EOF)
return false; return false;
color->alpha = 0;
}
else
if(name[0] == '#') {
color->alpha = 0;
} else if (name[0] == '#') {
// Convert from #RRGGBB format // Convert from #RRGGBB format
sscanf(name, "#%2x%2x%2x", (int *)&color->red, (int *)&color->green, sscanf(name, "#%2x%2x%2x", (int *)&color->red, (int *)&color->green,
(int *)&color->blue); (int *)&color->blue);
color->alpha = 0; color->alpha = 0;
} } else
else
return false; return false;
return true; return true;
@@ -564,14 +553,11 @@ argmatch(char **argv, int argc, char *sstr, char *lstr,
if (arg == NULL) if (arg == NULL)
return 0; return 0;
if(strcmp(arg, sstr) == 0) if (strcmp(arg, sstr) == 0) {
{ if(valptr != NULL) {
if(valptr != NULL)
{
*valptr = argv[*skipptr+2]; *valptr = argv[*skipptr+2];
*skipptr += 2; *skipptr += 2;
} } else
else
*skipptr += 1; *skipptr += 1;
return 1; return 1;
} }
@@ -709,17 +695,14 @@ sort_args(int argc, char **argv)
// Copy the arguments, in order of decreasing priority, to NEW // Copy the arguments, in order of decreasing priority, to NEW
newargv[0] = argv[0]; newargv[0] = argv[0];
while(incoming_used < argc) while (incoming_used < argc) {
{
int best = -1; int best = -1;
int best_priority = -9999; int best_priority = -9999;
// Find the highest priority remaining option. // Find the highest priority remaining option.
// If several have equal priority, take the first of them. // If several have equal priority, take the first of them.
for(from = 1; from < argc; from++) for (from = 1; from < argc; from++) {
{ if (argv[from] != 0 && priority[from] > best_priority) {
if(argv[from] != 0 && priority[from] > best_priority)
{
best_priority = priority[from]; best_priority = priority[from];
best = from; best = from;
} }
@@ -734,8 +717,7 @@ sort_args(int argc, char **argv)
// Copy the highest priority remaining option, with its args, to NEW. // Copy the highest priority remaining option, with its args, to NEW.
// Unless it is a duplicate of the previous one // Unless it is a duplicate of the previous one
if(!(options[best] == 0 && ! strcmp(newargv[to - 1], argv[best]))) if (!(options[best] == 0 && ! strcmp(newargv[to - 1], argv[best]))) {
{
newargv[to++] = argv[best]; newargv[to++] = argv[best];
for(i = 0; i < options[best]; i++) for(i = 0; i < options[best]; i++)
newargv[to++] = argv[best + i + 1]; newargv[to++] = argv[best + i + 1];
+1
View File
@@ -73,6 +73,7 @@ private:
bool IsMinimize (team_id); bool IsMinimize (team_id);
int fRows, fCols, fXpos, fYpos; int fRows, fCols, fXpos, fYpos;
BString fWindowTitle;
int fWindowNumber; int fWindowNumber;
rgb_color fFg, fBg, fCurFg, fCurBg, fSelFg, fSelbg; rgb_color fFg, fBg, fCurFg, fCurBg, fSelFg, fSelbg;
rgb_color fImfg, fImbg, fImSel; rgb_color fImfg, fImbg, fImSel;
+3 -6
View File
@@ -50,18 +50,15 @@ extern PrefHandler *gTermPref;
//#define CHLP_FILE "file:///boot/beos/documentation/Shell%20Tools/index.html" //#define CHLP_FILE "file:///boot/beos/documentation/Shell%20Tools/index.html"
extern int gNowCoding; /* defined TermParce.cpp */ extern int gNowCoding; /* defined TermParce.cpp */
char gWindowName[256] = "Terminal";
void SetCoding(int); void SetCoding(int);
TermWindow::TermWindow(BRect frame, int32 windownumber) TermWindow::TermWindow(BRect frame, const char* title)
: BWindow(frame, "Terminal", B_DOCUMENT_WINDOW, B_CURRENT_WORKSPACE) : BWindow(frame, title, B_DOCUMENT_WINDOW, B_CURRENT_WORKSPACE)
{ {
sprintf(gWindowName, "Terminal %ld", windownumber);
InitWindow(); InitWindow();
SetTitle(gWindowName);
fPrintSettings = NULL; fPrintSettings = NULL;
fPrefWindow = NULL; fPrefWindow = NULL;
fFindPanel = NULL; fFindPanel = NULL;
+2 -3
View File
@@ -45,10 +45,9 @@ class PrefDlg2;
class FindDlg; class FindDlg;
class TermWindow : public BWindow class TermWindow : public BWindow {
{
public: public:
TermWindow (BRect frame, int32 windownumber=1); TermWindow(BRect frame, const char* title);
~TermWindow(); ~TermWindow();
void Quit (void); void Quit (void);
+5 -9
View File
@@ -56,13 +56,9 @@ extern PrefHandler *gTermPref;
#define SHELL_COMMAND "/bin/sh -login" #define SHELL_COMMAND "/bin/sh -login"
extern char **environ; extern char **environ;
// TODO: This is *definitely* not a helpful error message const char *kSpawnAlertMessage = "alert --stop " "'Cannot execute \"%s\":\n"
char spawn_alert_msg [] = \ "\t%s\n'"
"alert --stop " \ "'Use Default Shell' 'Abort'";
"'Haiku Terminal Error!!\n\
Cannot execute shell [%s].\n\
Check \"Shell\" in preferance panel.' "\
"'Exec /bin/sh' 'Abort'";
/* /*
* Set environment varriable. * Set environment varriable.
@@ -362,7 +358,7 @@ spawn_shell(int row, int col, const char *command, const char *coding)
/* /*
* setenv TERM and TTY. * setenv TERM and TTY.
*/ */
setenv("TERM", "xterm", true); setenv("TERM", "beterm", true);
setenv("TTY", tty_name, true); setenv("TTY", tty_name, true);
setenv("TTYPE", coding, true); setenv("TTYPE", coding, true);
@@ -415,7 +411,7 @@ spawn_shell(int row, int col, const char *command, const char *coding)
* Exec failed. * Exec failed.
*/ */
sleep(1); sleep(1);
sprintf(err_msg, spawn_alert_msg, com_line); sprintf(err_msg, kSpawnAlertMessage, com_line, strerror(errno));
if (system(err_msg) == 0) if (system(err_msg) == 0)
execl("/bin/sh", "/bin/sh", "-login", NULL); execl("/bin/sh", "/bin/sh", "-login", NULL);