repo: rxvt-unicode-sixel action: commit revision: path_from: revision_from: 0a9ceda52396ed9451bc103e1bf840381b3ac40a: path_to: revision_to:
commit 0a9ceda52396ed9451bc103e1bf840381b3ac40a Author: Marc LehmannDate: Sun Jan 8 07:55:36 2006 +0000 *** empty log message *** diff --git a/Changes b/Changes
--- a/Changes
+++ b/Changes
@@ -10,6 +10,7 @@ WISH: just for fun, do shade and tint with XRender.
WISH: support tex fonts
TODO: document transient_for, vt and the grab etc. functionality
+TODO: add warning about perl interpreter and setuid/setgid
- perl: implement additional hook: line_update, add_lines.
- perl: urxvt::line now can set via ->t and ->r.
@@ -18,6 +19,9 @@ TODO: document transient_for, vt and the grab etc. functionality
- perl: much increased functionality, better overlays, popup support
and much much more.
- perl: anyevent support.
+ - free the resource database: this plugs a massive memory hole. as a
+ side effect, it also gets rid of XGetDefault calls.
+ - free one of the cursors, fixes a small memory leaks.
6.3 Wed Jan 4 22:37:10 CET 2006
- SECURITY FIX: on systems using openpty, permissions were
diff --git a/src/command.C b/src/command.C
--- a/src/command.C
+++ b/src/command.C
@@ -989,13 +989,15 @@ rxvt_term::flush ()
{
l = &ROW (row++);
- if (!(l->f & LINE_FILTERED))
+ if (l->f & LINE_FILTERED)
+ row++;
+ else
{
// line not filtered, mark it as filtered
l->f |= LINE_FILTERED;
while (l->is_longer ())
{
- l = &ROW (row++);
+ l = &ROW (++row);
l->f |= LINE_FILTERED;
}
diff --git a/src/main.C b/src/main.C
--- a/src/main.C +++ b/src/main.C @@ -276,6 +276,9 @@ rxvt_term::~rxvt_term () #if OFF_FOCUS_FADING delete pix_colors_unfocused; #endif +#if USE_XGETDEFAULT + XrmDestroyDatabase (xrmdatabase); +#endif displays.put (display); @@ -615,6 +618,10 @@ rxvt_init () old_xerror_handler = XSetErrorHandler ((XErrorHandler) rxvt_xerror_handler); // TODO: handle this with exceptions and tolerate the memory loss XSetIOErrorHandler (rxvt_xioerror_handler); + +#ifdef USE_XGETDEFAULT + XrmInitialize (); +#endif } /* ------------------------------------------------------------------------- * diff --git a/src/rxvt.h b/src/rxvt.h
--- a/src/rxvt.h
+++ b/src/rxvt.h
@@ -979,6 +979,9 @@ struct rxvt_term : zero_initialized, rxvt_vars {
#if ENABLE_PERL
rxvt_perl_term perl;
#endif
+#if USE_XGETDEFAULT
+ XrmDatabase xrmdatabase;
+#endif
struct mbstate mbstate; // current input multibyte state
diff --git a/src/rxvttoolkit.C b/src/rxvttoolkit.C
--- a/src/rxvttoolkit.C
+++ b/src/rxvttoolkit.C
@@ -229,6 +229,9 @@ bool rxvt_display::init ()
rxvt_display::~rxvt_display ()
{
+#ifdef POINTER_BLANK
+ XFreeCursor (display, blank_cursor);
+#endif
x_ev.stop ();
#ifdef USE_XIM
xims.clear ();
diff --git a/src/xdefaults.C b/src/xdefaults.C
--- a/src/xdefaults.C
+++ b/src/xdefaults.C
@@ -406,7 +406,7 @@ static const char optionsstring[] = "options: "
"NoResources"
#else
# if defined(USE_XGETDEFAULT)
- "XGetDefaults"
+ "XGetDefault"
# else
".Xdefaults"
# endif
@@ -882,6 +882,20 @@ rxvt_term::get_xdefaults (FILE *stream, const char *name)
# endif /* ! USE_XGETDEFAULT */
#endif /* NO_RESOURCES */
+#ifdef USE_XGETDEFAULT
+char *get_res (XrmDatabase database, const char *program, const char *option)
+{
+ char resource[512];
+ char *type;
+ XrmValue result;
+
+ snprintf (resource, sizeof (resource), "%s.%s", program, option);
+ XrmGetResource (database, resource, resource, &type, &result);
+
+ return result.addr;
+}
+#endif
+
/*{{{ read the resources files */
/*
* using XGetDefault () or the hand-rolled replacement
@@ -915,13 +929,11 @@ rxvt_term::extract_resources ()
*/
int entry;
-# ifdef XrmEnumOneLevel
char *displayResource, *xe;
XrmName name_prefix[3];
XrmClass class_prefix[3];
XrmDatabase database, rdb1;
- XrmInitialize ();
database = NULL;
// for ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20
@@ -992,8 +1004,7 @@ rxvt_term::extract_resources ()
}
}
- XrmSetDatabase (disp, database);
-# endif
+ xrmdatabase = database;
/*
* Query resources for options that affect us
@@ -1007,14 +1018,14 @@ rxvt_term::extract_resources ()
if (kw == NULL || rs[optList[entry].doff] != NULL)
continue; /* previously set */
- p = XGetDefault (disp, rs[Rs_name], kw);
- p0 = XGetDefault (disp, "!INVALIDPROGRAMMENAMEDONTMATCH!", kw);
+ p = get_res (database, rs[Rs_name], kw);
+ p0 = get_res (database, "!INVALIDPROGRAMMENAMEDONTMATCH!", kw);
if (p == NULL || (p0 && strcmp (p, p0) == 0))
{
- p = XGetDefault (disp, RESCLASS, kw);
+ p = get_res (database, RESCLASS, kw);
#ifdef RESFALLBACK
if (p == NULL || (p0 && strcmp (p, p0) == 0))
- p = XGetDefault (disp, RESFALLBACK, kw);
+ p = get_res (database, RESFALLBACK, kw);
#endif
}
@@ -1051,7 +1062,7 @@ rxvt_term::extract_resources ()
class_prefix[1] = XrmStringToName ("Keysym");
class_prefix[2] = NULLQUARK;
/* XXX: Need to check sizeof (rxvt_t) == sizeof (XPointer) */
- XrmEnumerateDatabase (XrmGetDatabase (disp), name_prefix, class_prefix,
+ XrmEnumerateDatabase (database, name_prefix, class_prefix,
XrmEnumOneLevel, rxvt_define_key, NULL);
# ifdef RESFALLBACK
name_prefix[0] = XrmStringToName (RESFALLBACK);
@@ -1059,7 +1070,7 @@ rxvt_term::extract_resources ()
class_prefix[0] = XrmStringToName (RESFALLBACK);
class_prefix[1] = XrmStringToName ("Keysym");
/* XXX: Need to check sizeof (rxvt_t) == sizeof (XPointer) */
- XrmEnumerateDatabase (XrmGetDatabase (disp), name_prefix, class_prefix,
+ XrmEnumerateDatabase (database, name_prefix, class_prefix,
XrmEnumOneLevel, rxvt_define_key, NULL);
# endif
# endif
-----END OF PAGE-----