Add support for login shells
This commit is contained in:
parent
7a43affb07
commit
9d70d80bc8
13
src/main.c
13
src/main.c
|
@ -70,6 +70,14 @@ static int _terminal(TerminalPrefs * prefs)
|
||||||
{
|
{
|
||||||
Terminal * terminal;
|
Terminal * terminal;
|
||||||
|
|
||||||
|
/* consistency check */
|
||||||
|
if(prefs != NULL)
|
||||||
|
{
|
||||||
|
if(prefs->shell != NULL)
|
||||||
|
prefs->login = 0;
|
||||||
|
else if(prefs->login != 0)
|
||||||
|
prefs->directory = NULL;
|
||||||
|
}
|
||||||
if((terminal = terminal_new(prefs)) == NULL)
|
if((terminal = terminal_new(prefs)) == NULL)
|
||||||
return error_print(PACKAGE);
|
return error_print(PACKAGE);
|
||||||
gtk_main();
|
gtk_main();
|
||||||
|
@ -109,12 +117,15 @@ int main(int argc, char * argv[])
|
||||||
textdomain(PACKAGE);
|
textdomain(PACKAGE);
|
||||||
memset(&prefs, 0, sizeof(prefs));
|
memset(&prefs, 0, sizeof(prefs));
|
||||||
gtk_init(&argc, &argv);
|
gtk_init(&argc, &argv);
|
||||||
while((o = getopt(argc, argv, "d:")) != -1)
|
while((o = getopt(argc, argv, "d:l")) != -1)
|
||||||
switch(o)
|
switch(o)
|
||||||
{
|
{
|
||||||
case 'd':
|
case 'd':
|
||||||
prefs.directory = optarg;
|
prefs.directory = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
prefs.login = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return _usage();
|
return _usage();
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,6 +72,7 @@ struct _Terminal
|
||||||
{
|
{
|
||||||
char * shell;
|
char * shell;
|
||||||
char * directory;
|
char * directory;
|
||||||
|
unsigned int login;
|
||||||
|
|
||||||
/* internal */
|
/* internal */
|
||||||
TerminalTab * tabs;
|
TerminalTab * tabs;
|
||||||
|
@ -190,6 +191,7 @@ Terminal * terminal_new(TerminalPrefs * prefs)
|
||||||
? string_new(prefs->shell) : NULL;
|
? string_new(prefs->shell) : NULL;
|
||||||
terminal->directory = (prefs != NULL && prefs->directory != NULL)
|
terminal->directory = (prefs != NULL && prefs->directory != NULL)
|
||||||
? string_new(prefs->directory) : NULL;
|
? string_new(prefs->directory) : NULL;
|
||||||
|
terminal->login = (prefs != NULL) ? prefs->login : 0;
|
||||||
terminal->tabs = NULL;
|
terminal->tabs = NULL;
|
||||||
terminal->tabs_cnt = 0;
|
terminal->tabs_cnt = 0;
|
||||||
terminal->window = NULL;
|
terminal->window = NULL;
|
||||||
|
@ -273,7 +275,7 @@ static int _terminal_open_tab(Terminal * terminal)
|
||||||
TerminalTab * p;
|
TerminalTab * p;
|
||||||
GtkWidget * widget;
|
GtkWidget * widget;
|
||||||
char * argv[] = { BINDIR "/xterm", "xterm", "-into", NULL,
|
char * argv[] = { BINDIR "/xterm", "xterm", "-into", NULL,
|
||||||
"-class", "Terminal", NULL, NULL };
|
"-class", "Terminal", NULL, NULL, NULL };
|
||||||
char buf[32];
|
char buf[32];
|
||||||
GSpawnFlags flags = G_SPAWN_FILE_AND_ARGV_ZERO
|
GSpawnFlags flags = G_SPAWN_FILE_AND_ARGV_ZERO
|
||||||
| G_SPAWN_DO_NOT_REAP_CHILD;
|
| G_SPAWN_DO_NOT_REAP_CHILD;
|
||||||
|
@ -311,6 +313,12 @@ static int _terminal_open_tab(Terminal * terminal)
|
||||||
snprintf(buf, sizeof(buf), "%lu", gtk_socket_get_id(
|
snprintf(buf, sizeof(buf), "%lu", gtk_socket_get_id(
|
||||||
GTK_SOCKET(p->socket)));
|
GTK_SOCKET(p->socket)));
|
||||||
argv[3] = buf;
|
argv[3] = buf;
|
||||||
|
if(terminal->login)
|
||||||
|
{
|
||||||
|
argv[6] = "-ls";
|
||||||
|
argv[7] = terminal->shell;
|
||||||
|
}
|
||||||
|
else
|
||||||
argv[6] = terminal->shell;
|
argv[6] = terminal->shell;
|
||||||
if(g_spawn_async(terminal->directory, argv, NULL, flags, NULL, NULL,
|
if(g_spawn_async(terminal->directory, argv, NULL, flags, NULL, NULL,
|
||||||
&p->pid, &error) == FALSE)
|
&p->pid, &error) == FALSE)
|
||||||
|
|
|
@ -41,6 +41,7 @@ typedef struct _TerminalPrefs
|
||||||
{
|
{
|
||||||
char const * shell;
|
char const * shell;
|
||||||
char const * directory;
|
char const * directory;
|
||||||
|
unsigned int login;
|
||||||
} TerminalPrefs;
|
} TerminalPrefs;
|
||||||
|
|
||||||
typedef struct _Terminal Terminal;
|
typedef struct _Terminal Terminal;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user