DUMB: support tex fonts
7.2
+TODO: alsamixer/wild resize => secondary leaks into primary scrollback?
- bugfix: urxvt (not urxvtd) did not correctly handle multiple
environments necessary, which resulted in segfaults within
getenv (reproducable: urxvt -fn 9x15, open a menu once,
#endif /* LASTLOG_SUPPORT */
/* ------------------------------------------------------------------------- */
+#else
+void
+rxvt_ptytty_unix::login (int cmd_pid, bool login_shell, const char *hostname)
+{
+}
#endif /* UTMP_SUPPORT */
/*----------------------------------------------------------------------*/
bool
-rxvt_term::init (int argc, const char *const *argv)
+rxvt_term::init (int argc, const char *const *argv, stringvec *envv)
{
+ this->envv = envv;
+
SET_R (this);
set_locale ("");
set_environ (envv); // few things in X do not call setlocale :(
bool get ();
void put ();
+ void login (int cmd_pid, bool login_shell, const char *hostname);
+
#if UTMP_SUPPORT
int utmp_pos;
int cmd_pid;
char ut_id[5];
#endif
- void login (int cmd_pid, bool login_shell, const char *hostname);
void logout ();
#endif
};
#include "../config.h"
#include "rxvt.h"
+#include <cstdlib>
+#include <cstring>
+
int
main (int argc, const char *const *argv)
try
{
rxvt_init ();
+ stringvec *envv = new stringvec;
+
+ for (char **var = environ; *var; var++)
+ envv->push_back (strdup (*var));
+
+ envv->push_back (0);
+
rxvt_term *t = new rxvt_term;
- if (!t->init (argc, argv))
+ if (!t->init (argc, argv, envv))
return EXIT_FAILURE;
io_manager::loop ();
wchar_t * rxvt_mbstowcs (const char *str, int len = -1);
char * rxvt_wcstoutf8 (const wchar_t *str, int len = -1);
wchar_t * rxvt_utf8towcs (const char *str, int len = -1);
+char * rxvt_strdup_cpp (const char *str);
#define rxvt_strdup(s) ((s) ? strdup(s) : 0)
}
virtual bool get () = 0;
-#if UTMP_SUPPORT
virtual void login (int cmd_pid, bool login_shell, const char *hostname) = 0;
-#endif
void close_tty ();
bool make_controlling_tty ();
void destroy ();
void emergency_cleanup ();
- bool init (int argc, const char *const *argv);
+ bool init (int argc, const char *const *argv, stringvec *envv);
+
+ bool init (stringvec *argv, stringvec *envv)
+ {
+ this->argv = argv;
+ return init (argv->size (), argv->begin (), envv);
+ }
+
bool init_vars ();
bool pty_fill ();
if (!strcmp (tok, "END"))
break;
else if (!strcmp (tok, "ENV") && recv (tok))
- envv->push_back (tok.get ());
+ envv->push_back (strdup (tok));
else if (!strcmp (tok, "CWD") && recv (tok))
{
if (chdir (tok))
(char *)tok, strerror (errno));
}
else if (!strcmp (tok, "ARG") && recv (tok))
- argv->push_back (tok.get ());
+ argv->push_back (strdup (tok));
else
return err ("protocol error: unexpected NEW token");
}
term->log_hook = &log_cb;
term->getfd_hook = &getfd_cb;
- term->argv = argv;
- term->envv = envv;
bool success;
try
{
- success = term->init (argv->size (), argv->begin ());
+ success = term->init (argv, envv);
}
catch (const class rxvt_failure_exception &e)
{
rxvt_term *term = new rxvt_term;
- term->argv = new stringvec;
- term->envv = new stringvec;
+ stringvec *argv = new stringvec;
+ stringvec *envv = new stringvec;
for (int i = 1; i < items; i++)
- term->argv->push_back (strdup (SvPVbyte_nolen (ST (i))));
+ argv->push_back (strdup (SvPVbyte_nolen (ST (i))));
- AV *envv = (AV *)SvRV (ST (0));
- for (int i = AvFILL (envv) + 1; i--; )
- term->envv->push_back (strdup (SvPVbyte_nolen (*av_fetch (envv, i, 1))));
+ AV *env = (AV *)SvRV (ST (0));
+ for (int i = AvFILL (env) + 1; i--; )
+ envv->push_back (strdup (SvPVbyte_nolen (*av_fetch (env, i, 1))));
- term->envv->push_back (0);
+ envv->push_back (0);
bool success;
try
{
- success = term->init (term->argv->size (), term->argv->begin ());
+ success = term->init (argv, envv);
}
catch (const class rxvt_failure_exception &e)
{
#ifndef RXVT_UTIL_H
#define RXVT_UTIL_H
+#include <cstdlib>
#include <cstring>
#define PP_CONCAT_(a, b) a ## b
~stringvec ()
{
for (char **c = begin (); c != end (); c++)
- delete [] *c;
+ free (*c);
}
};