From cdbb53b4bf6c7cb641777b5e7561a62df3e23b5f Mon Sep 17 00:00:00 2001 From: Michael Jennings Date: Fri, 1 Sep 2000 05:46:04 +0000 Subject: [PATCH] Thu Aug 31 23:02:10 PDT 2000 Michael Jennings Still more big changes. Working on adding pixmap and GC tracking to libmej using the existing allocation tracking routines. SVN revision: 3291 --- ChangeLog | 6 ++ acconfig.h | 1 + configure.in | 143 ++++++++++++++++++++------------------ libmej/Makefile.am | 2 +- libmej/libmej.h | 54 ++++++++++----- libmej/mem.c | 169 ++++++++++++++++++++++++++++++++++----------- src/Makefile.am | 8 ++- src/buttons.c | 2 +- src/command.c | 17 +++-- src/draw.c | 12 ++-- src/gdb.scr | 2 + src/menus.c | 6 +- src/misc.c | 20 ------ src/misc.h | 2 - src/pixmap.c | 129 +++++++++++++--------------------- src/pixmap.h | 41 +++++------ src/scrollbar.c | 10 +-- src/term.c | 4 +- src/windows.c | 2 +- utils/Makefile.am | 4 +- 20 files changed, 351 insertions(+), 283 deletions(-) create mode 100644 src/gdb.scr diff --git a/ChangeLog b/ChangeLog index 5ac2d00..c9f8d07 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3846,3 +3846,9 @@ Thu Aug 31 11:22:30 PDT 2000 Michael Jennings Crap. That was not supposed to be committed. ------------------------------------------------------------------------------- +Thu Aug 31 23:02:10 PDT 2000 Michael Jennings + + Still more big changes. Working on adding pixmap and GC tracking to + libmej using the existing allocation tracking routines. + +------------------------------------------------------------------------------- diff --git a/acconfig.h b/acconfig.h index 130fd33..d7ce8e0 100644 --- a/acconfig.h +++ b/acconfig.h @@ -280,6 +280,7 @@ #undef NO_STACK_TRACE #undef DBX #undef GDB +#undef GDB_CMD_FILE #undef PSTACK /* *BSD utmp stuff */ diff --git a/configure.in b/configure.in index 6d9466c..f1ce45e 100644 --- a/configure.in +++ b/configure.in @@ -117,11 +117,19 @@ AC_C_CONST AC_C_INLINE AC_PATH_XTRA -if test "$ac_cv_lib_socket_connect" = "yes" ; then - SUBLIBS="-lsocket" +if test ! -z "$X_CFLAGS"; then + if test -z "$CPPFLAGS"; then + CPPFLAGS="$X_CFLAGS" + else + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + fi fi -if test "$ac_cv_lib_nsl_gethostbyname" = "yes" ; then - SUBLIBS="$SUBLIBS -lnsl" +if test ! -z "$X_LIBS"; then + if test -z "$LDFLAGS"; then + LDFLAGS="$X_LIBS" + else + LDFLAGS="$LDFLAGS $X_LIBS" + fi fi dnl# Checks for header files. @@ -146,20 +154,12 @@ seteuid memmove putenv strsep setresuid setresgid \ memmem usleep snprintf strcasestr strcasechr \ strcasepbrk strrev) dps_snprintf_oflow() -AC_CHECK_LIB(m, pow, LIBS="$LIBS -lm", , $SUBLIBS) +AC_CHECK_LIB(m, pow) -dnl# Check for the need for -lutil on BSD systems -AC_CHECK_FUNC(login, - AC_DEFINE(HAVE_LOGIN) -, AC_CHECK_LIB(util, login, LIBS="$LIBS -lutil" ; - AC_DEFINE(HAVE_LOGIN) -)) -AC_CHECK_FUNC(logout, - AC_DEFINE(HAVE_LOGOUT) -, AC_CHECK_LIB(util, logout, LIBS="$LIBS -lutil" ; - AC_DEFINE(HAVE_LOGOUT) -)) -AC_CHECK_FUNC(getpwuid, , AC_CHECK_LIB(sun, getpwuid, LIBS="$LIBS -lsun")) +dnl# Portability checks for various functions +AC_SEARCH_LIBS(login, bsd ucb util) +AC_SEARCH_LIBS(logout, util) +AC_SEARCH_LIBS(getpwuid, sun) dnl# dnl# Utility stuff @@ -237,6 +237,37 @@ AC_ARG_WITH(pty-group, fi ) +dnl# +dnl# X LIBRARIES +dnl# +AC_CHECK_LIB(X11, XOpenDisplay, , [ +echo "ERROR: You need libX11 to build Eterm. Verify that you have libX11.a or"; +echo " libX11.so installed and that it is located in the X libraries"; +echo " directory shown above. If it is in a different directory, try using"; +echo " the --x-libraries parameter to configure."; + AC_MSG_ERROR([Fatal: libX11 not found.])]) +AC_CHECK_LIB(Xext, XextAddDisplay, , [ +echo "ERROR: You need libXext to build Eterm. Verify that you have libXext.a or"; +echo " libXext.so installed and that it is located in the X libraries"; +echo " directory shown above. If it is in a different directory, try using"; +echo " the --x-libraries parameter to configure."; + AC_MSG_ERROR([Fatal: libXext not found.])]) + +AC_CHECK_LIB(Xext, XShapeQueryExtension, AC_DEFINE(HAVE_X_SHAPE_EXT)) + +# check if we need X_LOCALE definition +AC_CHECK_LIB(X11, _Xsetlocale, , AC_DEFINE(NO_XLOCALE)) + +# For multibyte selection handling +if test "$MULTICHAR_ENCODING" != "none"; then + AC_CHECK_LIB(Xmu, XmuInternAtom) +fi + +# check X11R6 for XIM +if test "$XIM" = "TRUE"; then + AC_CHECK_LIB(X11, XRegisterIMInstantiateCallback, AC_DEFINE(USE_X11R6_XIM)) +fi + dnl# dnl# FEATURES dnl# @@ -283,7 +314,7 @@ AC_ARG_WITH(imlib, if test "$withval" != "no"; then AC_MSG_RESULT(yes) if test "$withval" != "yes"; then - CFLAGS="$CFLAGS -I${withval}/include" + CPPFLAGS="$CPPFLAGS -I${withval}/include" LDFLAGS="$LDFLAGS -L${withval}/lib" fi USE_IMLIB=1 @@ -299,10 +330,11 @@ AC_ARG_WITH(imlib, USE_IMLIB=1 ) if test $USE_IMLIB -eq 1 ; then - AC_CHECK_LIB(dl, dlopen, GRLIBS="-ldl", , $SUBLIBS $X_LIBS $GRLIBS) - AC_CHECK_LIB(ttf, TT_Init_FreeType, GRLIBS="-lttf $GRLIBS", , $SUBLIBS $X_LIBS $GRLIBS) + AC_CHECK_LIB(dl, dlopen, GRLIBS="-ldl", , $GRLIBS) + AC_CHECK_LIB(ttf, TT_Init_FreeType, GRLIBS="-lttf $GRLIBS", , $GRLIBS) AC_CHECK_LIB(Imlib2, imlib_create_image, GRLIBS="-lImlib2 $GRLIBS" + AC_DEFINE(HAVE_LIBIMLIB2) AC_DEFINE(PIXMAP_SUPPORT) AC_DEFINE(BACKING_STORE) , @@ -310,7 +342,7 @@ if test $USE_IMLIB -eq 1 ; then AC_WARN(*** or could not be linked. Eterm should still work, but it will ***) AC_WARN(*** not be very happy. Check config.log for more detailed ***) AC_WARN(*** information on why my attempt to link with Imlib2 failed. ***) - , $SUBLIBS $X_LIBS $GRLIBS) + , $GRLIBS) fi @@ -357,10 +389,7 @@ AC_ARG_ENABLE(utmp, UTMP=1 ) if test $UTMP -eq 1; then - AC_CHECK_LIB(utempter, addToUtmp, - AC_DEFINE(HAVE_UTEMPTER) - LIBS="$LIBS -lutempter" - ) + AC_CHECK_LIB(utempter, addToUtmp) fi AC_MSG_CHECKING(for backspace key configuration) AC_ARG_WITH(backspace, @@ -602,43 +631,12 @@ dnl# ;; dnl# esac dnl# , AC_MSG_RESULT(none)) dnl# if test "$THREADS_LIB" = "posix"; then -dnl# AC_CHECK_LIB(pthread, pthread_create, CFLAGS="$CFLAGS -D_REENTRANT" ; THREADLIBS="-lpthread" +dnl# AC_CHECK_LIB(pthread, pthread_create, CPPFLAGS="$CPPFLAGS -D_REENTRANT" ; THREADLIBS="-lpthread" dnl# AC_DEFINE(USE_POSIX_THREADS) dnl# AC_DEFINE(MUTEX_SYNCH) dnl# , , -D_REENTRANT -L/usr/lib -L/lib -L/usr/local/lib) dnl# fi -dnl# -dnl# X LIBRARIES -dnl# -AC_CHECK_LIB(X11, XOpenDisplay, X_LIBS="$X_LIBS -lX11", [ -echo "ERROR: You need libX11 to build Eterm. Verify that you have libX11.a or"; -echo " libX11.so installed and that it is located in the X libraries"; -echo " directory shown above. If it is in a different directory, try using"; -echo " the --x-libraries parameter to configure."; - AC_MSG_ERROR([Fatal: libX11 not found.])], $X_LIBS $SUBLIBS) -AC_CHECK_LIB(Xext, XextAddDisplay, X_LIBS="-lXext $X_LIBS", [ -echo "ERROR: You need libXext to build Eterm. Verify that you have libXext.a or"; -echo " libXext.so installed and that it is located in the X libraries"; -echo " directory shown above. If it is in a different directory, try using"; -echo " the --x-libraries parameter to configure."; - AC_MSG_ERROR([Fatal: libXext not found.])], $X_LIBS $SUBLIBS) - -AC_CHECK_LIB(Xext, XShapeQueryExtension, AC_DEFINE(HAVE_X_SHAPE_EXT), , $X_LIBS $SUBLIBS) - -# check if we need X_LOCALE definition -AC_CHECK_LIB(X11, _Xsetlocale, , AC_DEFINE(NO_XLOCALE), $X_LIBS $SUBLIBS) - -# For multibyte selection handling -if test "$MULTICHAR_ENCODING" != "none"; then - AC_CHECK_LIB(Xmu, XmuInternAtom, X_LIBS="-lXmu $X_LIBS", , $X_LIBS $SUBLIBS) -fi - -# check X11R6 for XIM -if test "$XIM" = "TRUE"; then - AC_CHECK_LIB(X11, XRegisterIMInstantiateCallback, AC_DEFINE(USE_X11R6_XIM), , $X_LIBS $SUBLIBS) -fi - AC_PREFIX(Eterm) AC_PREFIX(gcc) if test "$prefix" = "NONE"; then @@ -709,18 +707,27 @@ if test "X$PKGDATADIR" = "X" ; then fi export PKGDATADIR AC_DEFINE_UNQUOTED(PKGDATADIR, "$PKGDATADIR") +if test "$GDB" != "no"; then + GDB_CMD_FILE="$PKGDATADIR/gdb.scr" + AC_DEFINE_UNQUOTED(GDB_CMD_FILE, "$GDB_CMD_FILE") +else + GDB_CMD_FILE="" +fi +AC_SUBST(GDB_CMD_FILE) +CPPFLAGS=`eval eval eval eval eval echo "-I$includedir -I$prefix/include $CPPFLAGS"` +CPPFLAGS=`echo $CPPFLAGS | tr ' ' '\n' | uniq | tr '\n' ' '` CFLAGS=${CFLAGS--O} -LDFLAGS=${LDFLAGS--O} +LDFLAGS=`eval eval eval eval eval echo "-L$libdir -L$prefix/lib ${LDFLAGS--O}"` +LDFLAGS=`echo $LDFLAGS | tr ' ' '\n' | uniq | tr '\n' ' '` +LIBS="$GRLIBS $X_PRE_LIBS $LIBS $X_EXTRA_LIBS" -CPPFLAGS="$CPPFLAGS" AC_SUBST(CC) AC_SUBST(CFLAGS) AC_SUBST(CPPFLAGS) AC_SUBST(LDFLAGS) AC_SUBST(LIBS) AC_SUBST(THREADLIBS) -AC_SUBST(GRLIBS) basedir=. @@ -733,6 +740,8 @@ AC_OUTPUT(Makefile bg/Makefile doc/Makefile utils/Makefile libmej/Makefile BINDIR=`eval eval eval eval echo ${bindir}` export BINDIR bindir prefix exec_prefix datadir PACKAGE +# The awk-fu below replaces @VAR@ in theme config files with the corresponding +# environment variables, kinda like AC_OUTPUT above. changequote(%&, &%)dnl %& for i in utils/kEsetroot themes/Eterm/theme.cfg themes/auto/theme.cfg themes/cEterm/theme.cfg \ @@ -758,19 +767,17 @@ if test -z "$GRLIBS"; then mv doc/Makefile.new doc/Makefile fi -test $USE_IMLIB = 0 && GRLIBS="*** WARNING: Pixmap support disabled! ***" - echo " $PACKAGE $VERSION Configuration: -------------- - Source code location: ${srcdir} - Compiler: ${CC} ${CFLAGS} - Host System Type: ${host} - Graphics libraries: ${GRLIBS} - X libraries/paths: ${X_LIBS} - Install path: ${prefix} + Source code location: $srcdir + Host System Type: $host + Preprocessor: $CC $CPPFLAGS + Compiler: $CC $CFLAGS + Linker: $CC $LDFLAGS $LIBS + Install path: $prefix See src/feature.h for further configuration information. diff --git a/libmej/Makefile.am b/libmej/Makefile.am index b22848c..8963f73 100644 --- a/libmej/Makefile.am +++ b/libmej/Makefile.am @@ -5,6 +5,6 @@ include_HEADERS = libmej.h libmej_la_SOURCES = debug.c mem.c msgs.c strings.c snprintf.c libmej.h -INCLUDES = -I. -I.. -I$(includedir) -I$(prefix)/include +LIBS = -lm libmej_la_LDFLAGS = -release $(VERSION) diff --git a/libmej/libmej.h b/libmej/libmej.h index 21087b3..4c17102 100644 --- a/libmej/libmej.h +++ b/libmej/libmej.h @@ -61,6 +61,13 @@ # include #endif +#include +#include +#include +#ifdef HAVE_LIBIMLIB2 +# include +#endif + /******************************* GENERIC GOOP *********************************/ #ifndef TRUE # define TRUE ((unsigned char)(1)) @@ -193,27 +200,40 @@ typedef struct ptr_struct { size_t size; } ptr_t; typedef struct memrec_struct { - unsigned char init; unsigned long cnt; ptr_t *ptrs; } memrec_t; #if (DEBUG >= DEBUG_MEM) -# define MALLOC(sz) libmej_malloc(__FILE__, __LINE__, (sz)) -# define CALLOC(type,n) libmej_calloc(__FILE__, __LINE__, (n), (sizeof(type))) -# define REALLOC(mem,sz) libmej_realloc(#mem, __FILE__, __LINE__, (mem), (sz)) -# define FREE(ptr) do { libmej_free(#ptr, __FILE__, __LINE__, (ptr)); (ptr) = NULL; } while (0) -# define STRDUP(s) libmej_strdup(#s, __FILE__, __LINE__, (s)) +# define MALLOC(sz) libmej_malloc(__FILE__, __LINE__, (sz)) +# define CALLOC(type,n) libmej_calloc(__FILE__, __LINE__, (n), (sizeof(type))) +# define REALLOC(mem,sz) libmej_realloc(#mem, __FILE__, __LINE__, (mem), (sz)) +# define FREE(ptr) do { libmej_free(#ptr, __FILE__, __LINE__, (ptr)); (ptr) = NULL; } while (0) +# define STRDUP(s) libmej_strdup(#s, __FILE__, __LINE__, (s)) +# define MALLOC_DUMP() libmej_dump_mem_tables() +# define X_CREATE_PIXMAP(d, win, w, h, depth) libmej_x_create_pixmap(__FILE__, __LINE__, (d), (win), (w), (h), (depth)) +# define X_FREE_PIXMAP(d, p) libmej_x_free_pixmap(#p, __FILE__, __LINE__, (d), (p)) +# define PIXMAP_DUMP() libmej_dump_pixmap_tables() +# define X_CREATE_GC(d, win, f, gcv) libmej_x_create_gc(__FILE__, __LINE__, (d), (win), (f), (gcv)) +# define X_FREE_GC(d, gc) libmej_x_free_gc(#gc, __FILE__, __LINE__, (d), (gc)) +# define GC_DUMP() libmej_dump_gc_tables() # define MALLOC_MOD 25 # define REALLOC_MOD 25 # define CALLOC_MOD 25 # define FREE_MOD 25 #else -# define MALLOC(sz) malloc(sz) -# define CALLOC(type,n) calloc((n),(sizeof(type))) -# define REALLOC(mem,sz) ((sz) ? ((mem) ? (realloc((mem), (sz))) : (malloc(sz))) : ((mem) ? (free(mem), NULL) : (NULL))) -# define FREE(ptr) do { free(ptr); (ptr) = NULL; } while (0) -# define STRDUP(s) strdup(s) +# define MALLOC(sz) malloc(sz) +# define CALLOC(type,n) calloc((n),(sizeof(type))) +# define REALLOC(mem,sz) ((sz) ? ((mem) ? (realloc((mem), (sz))) : (malloc(sz))) : ((mem) ? (free(mem), NULL) : (NULL))) +# define FREE(ptr) do { free(ptr); (ptr) = NULL; } while (0) +# define STRDUP(s) strdup(s) +# define MALLOC_DUMP() NOP +# define X_CREATE_PIXMAP(d, win, w, h, depth) XCreatePixmap((d), (win), (w), (h), (depth)) +# define X_FREE_PIXMAP(d, p) XFreePixmap((d), (p)) +# define PIXMAP_DUMP() NOP +# define X_CREATE_GC(d, win, f, gcv) XCreateGC((d), (win), (f), (gcv)) +# define X_FREE_GC(d, gc) XFreeGC((d), (gc)) +# define GC_DUMP() NOP #endif /* Fast memset() macro contributed by vendu */ @@ -289,16 +309,18 @@ extern unsigned int DEBUG_LEVEL; /* mem.c */ extern void memrec_init(void); -extern void memrec_add_var(void *, size_t); -extern void memrec_rem_var(const char *, const char *, unsigned long, void *); -extern void memrec_chg_var(const char *, const char *, unsigned long, void *, void *, size_t); -extern void memrec_dump(void); extern void *libmej_malloc(const char *, unsigned long, size_t); extern void *libmej_realloc(const char *, const char *, unsigned long, void *, size_t); extern void *libmej_calloc(const char *, unsigned long, size_t, size_t); extern void libmej_free(const char *, const char *, unsigned long, void *); extern char *libmej_strdup(const char *, const char *, unsigned long, const char *); -extern void libmej_handle_sigsegv(int); +extern void libmej_dump_mem_tables(void); +extern Pixmap libmej_x_create_pixmap(const char *, unsigned long, Display *, Drawable, unsigned int, unsigned int, unsigned int); +extern void libmej_x_free_pixmap(const char *, const char *, unsigned long, Display *, Pixmap); +extern void libmej_dump_pixmap_tables(void); +extern GC libmej_x_create_gc(const char *, unsigned long, Display *, Drawable, unsigned long, XGCValues *); +extern void libmej_x_free_gc(const char *, const char *, unsigned long, Display *, GC); +extern void libmej_dump_gc_tables(void); /* strings.c */ extern char *left_str(const char *, unsigned long); diff --git a/libmej/mem.c b/libmej/mem.c index 8be1fe4..c986110 100644 --- a/libmej/mem.c +++ b/libmej/mem.c @@ -30,6 +30,11 @@ static const char cvs_ident[] = "$Id$"; #include "libmej.h" +static void memrec_add_var(memrec_t *, void *, size_t); +static void memrec_rem_var(memrec_t *, const char *, const char *, unsigned long, void *); +static void memrec_chg_var(memrec_t *, const char *, const char *, unsigned long, void *, void *, size_t); +static void memrec_dump(memrec_t *); + /* * These're added for a pretty obvious reason -- they're implemented towards * The beginning of each one's respective function. (The ones with capitalized @@ -42,40 +47,43 @@ static int realloc_count = 0; static int free_count = 0; #endif -static memrec_t memrec; +static memrec_t malloc_rec, pixmap_rec, gc_rec; void memrec_init(void) { - D_MEM(("Constructing memrec\n")); - memrec.ptrs = (ptr_t *) malloc(sizeof(ptr_t)); - memrec.init = 1; + D_MEM(("Constructing memory allocation records\n")); + malloc_rec.ptrs = (ptr_t *) malloc(sizeof(ptr_t)); + pixmap_rec.ptrs = (ptr_t *) malloc(sizeof(ptr_t)); + gc_rec.ptrs = (ptr_t *) malloc(sizeof(ptr_t)); } -void -memrec_add_var(void *ptr, size_t size) +static void +memrec_add_var(memrec_t *memrec, void *ptr, size_t size) { register ptr_t *p; - memrec.cnt++; - if ((memrec.ptrs = (ptr_t *) realloc(memrec.ptrs, sizeof(ptr_t) * memrec.cnt)) == NULL) { + ASSERT(memrec != NULL); + memrec->cnt++; + if ((memrec->ptrs = (ptr_t *) realloc(memrec->ptrs, sizeof(ptr_t) * memrec->cnt)) == NULL) { D_MEM(("Unable to reallocate pointer list -- %s\n", strerror(errno))); } D_MEM(("Adding variable of size %lu at %8p\n", size, ptr)); - p = memrec.ptrs + memrec.cnt - 1; + p = memrec->ptrs + memrec->cnt - 1; p->ptr = ptr; p->size = size; } -void -memrec_rem_var(const char *var, const char *filename, unsigned long line, void *ptr) +static void +memrec_rem_var(memrec_t *memrec, const char *var, const char *filename, unsigned long line, void *ptr) { register ptr_t *p = NULL; register unsigned long i; - for (i = 0; i < memrec.cnt; i++) { - if (memrec.ptrs[i].ptr == ptr) { - p = memrec.ptrs + i; + ASSERT(memrec != NULL); + for (i = 0; i < memrec->cnt; i++) { + if (memrec->ptrs[i].ptr == ptr) { + p = memrec->ptrs + i; break; } } @@ -83,25 +91,26 @@ memrec_rem_var(const char *var, const char *filename, unsigned long line, void * D_MEM(("ERROR: File %s, line %d attempted to free variable %s (%8p) which was not allocated with MALLOC/REALLOC\n", filename, line, var, ptr)); return; } - memrec.cnt--; + memrec->cnt--; D_MEM(("Removing variable of size %lu at %8p\n", p->size, p->ptr)); - memmove(p, p + 1, sizeof(ptr_t) * (memrec.cnt - i)); - memrec.ptrs = (ptr_t *) realloc(memrec.ptrs, sizeof(ptr_t) * memrec.cnt); + memmove(p, p + 1, sizeof(ptr_t) * (memrec->cnt - i)); + memrec->ptrs = (ptr_t *) realloc(memrec->ptrs, sizeof(ptr_t) * memrec->cnt); } -void -memrec_chg_var(const char *var, const char *filename, unsigned long line, void *oldp, void *newp, size_t size) +static void +memrec_chg_var(memrec_t *memrec, const char *var, const char *filename, unsigned long line, void *oldp, void *newp, size_t size) { register ptr_t *p = NULL; register unsigned long i; - for (i = 0; i < memrec.cnt; i++) { - if (memrec.ptrs[i].ptr == oldp) { - p = memrec.ptrs + i; + ASSERT(memrec != NULL); + for (i = 0; i < memrec->cnt; i++) { + if (memrec->ptrs[i].ptr == oldp) { + p = memrec->ptrs + i; break; } } - if (i == memrec.cnt) { + if (i == memrec->cnt) { D_MEM(("ERROR: File %s, line %d attempted to realloc variable %s (%8p) which was not allocated with MALLOC/REALLOC\n", filename, line, var, oldp)); return; } @@ -110,27 +119,28 @@ memrec_chg_var(const char *var, const char *filename, unsigned long line, void * p->size = size; } -void -memrec_dump(void) +static void +memrec_dump(memrec_t *memrec) { register ptr_t *p; unsigned long i, j, k, l, total = 0; unsigned long len; unsigned char buff[9]; - fprintf(LIBMEJ_DEBUG_FD, "DUMP :: %lu pointers stored.\n", memrec.cnt); + ASSERT(memrec != NULL); + fprintf(LIBMEJ_DEBUG_FD, "DUMP :: %lu pointers stored.\n", memrec->cnt); fprintf(LIBMEJ_DEBUG_FD, "DUMP :: Pointer | Address | Size | Offset | 00 01 02 03 04 05 06 07 | ASCII \n"); fprintf(LIBMEJ_DEBUG_FD, "DUMP :: ---------+----------+--------+---------+-------------------------+---------\n"); fflush(LIBMEJ_DEBUG_FD); - len = sizeof(ptr_t) * memrec.cnt; + len = sizeof(ptr_t) * memrec->cnt; memset(buff, 0, sizeof(buff)); - /* First, dump the contents of the memrec.ptrs[] array. */ - for (p = memrec.ptrs, j = 0; j < len; p++, j += 8) { - fprintf(LIBMEJ_DEBUG_FD, "DUMP :: %07lu | %8p | %06lu | %07x | ", (unsigned long) 0, memrec.ptrs, (unsigned long) (sizeof(ptr_t) * memrec.cnt), (unsigned int) j); + /* First, dump the contents of the memrec->ptrs[] array. */ + for (p = memrec->ptrs, j = 0; j < len; p++, j += 8) { + fprintf(LIBMEJ_DEBUG_FD, "DUMP :: %07lu | %8p | %06lu | %07x | ", (unsigned long) 0, memrec->ptrs, (unsigned long) (sizeof(ptr_t) * memrec->cnt), (unsigned int) j); /* l is the number of characters we're going to output */ l = ((len - j < 8) ? (len - j) : (8)); - /* Copy l bytes (up to 8) from memrec.ptrs[] (p) to buffer */ + /* Copy l bytes (up to 8) from memrec->ptrs[] (p) to buffer */ memcpy(buff, p + j, l); for (k = 0; k < l; k++) { fprintf(LIBMEJ_DEBUG_FD, "%02x ", buff[k]); @@ -146,7 +156,7 @@ memrec_dump(void) } /* Now print out each pointer and its contents. */ - for (p = memrec.ptrs, i = 0; i < memrec.cnt; p++, i++) { + for (p = memrec->ptrs, i = 0; i < memrec->cnt; p++, i++) { /* Add this pointer's size to our total */ total += p->size; for (j = 0; j < p->size; j += 8) { @@ -172,6 +182,7 @@ memrec_dump(void) fflush(LIBMEJ_DEBUG_FD); } +/******************** MEMORY ALLOCATION INTERFACE ********************/ void * libmej_malloc(const char *filename, unsigned long line, size_t size) { @@ -189,7 +200,7 @@ libmej_malloc(const char *filename, unsigned long line, size_t size) temp = (void *) malloc(size); ASSERT_RVAL(temp != NULL, NULL); if (DEBUG_LEVEL >= DEBUG_MEM) { - memrec_add_var(temp, size); + memrec_add_var(&malloc_rec, temp, size); } return (temp); } @@ -213,7 +224,7 @@ libmej_realloc(const char *var, const char *filename, unsigned long line, void * temp = (void *) realloc(ptr, size); ASSERT_RVAL(temp != NULL, ptr); if (DEBUG_LEVEL >= DEBUG_MEM) { - memrec_chg_var(var, filename, line, ptr, temp, size); + memrec_chg_var(&malloc_rec, var, filename, line, ptr, temp, size); } } return (temp); @@ -235,7 +246,7 @@ libmej_calloc(const char *filename, unsigned long line, size_t count, size_t siz temp = (void *) calloc(count, size); ASSERT_RVAL(temp != NULL, NULL); if (DEBUG_LEVEL >= DEBUG_MEM) { - memrec_add_var(temp, size * count); + memrec_add_var(&malloc_rec, temp, size * count); } return (temp); } @@ -253,7 +264,7 @@ libmej_free(const char *var, const char *filename, unsigned long line, void *ptr D_MEM(("libmej_free() called for variable %s (%8p) at %s:%lu\n", var, ptr, filename, line)); if (ptr) { if (DEBUG_LEVEL >= DEBUG_MEM) { - memrec_rem_var(var, filename, line, ptr); + memrec_rem_var(&malloc_rec, var, filename, line, ptr); } free(ptr); } else { @@ -276,11 +287,85 @@ libmej_strdup(const char *var, const char *filename, unsigned long line, const c } void -libmej_handle_sigsegv(int sig) +libmej_dump_mem_tables(void) { -#if DEBUG >= DEBUG_MEM - fprintf(LIBMEJ_DEBUG_FD, "Fatal memory fault (%d)! Dumping memory table.\n", sig); - memrec_dump(); -#endif - exit(EXIT_FAILURE); + memrec_dump(&malloc_rec); +} + + + +/******************** PIXMAP ALLOCATION INTERFACE ********************/ + +Pixmap +libmej_x_create_pixmap(const char *filename, unsigned long line, Display *d, Drawable win, unsigned int w, unsigned int h, unsigned int depth) +{ + Pixmap p; + + D_MEM(("Creating %ux%u pixmap of depth %u for window 0x%08x at %s:%lu\n", w, h, depth, win, filename, line)); + + p = XCreatePixmap(d, win, w, h, depth); + ASSERT_RVAL(p != None, None); + if (DEBUG_LEVEL >= DEBUG_MEM) { + memrec_add_var(&pixmap_rec, (void *) p, w * h * (depth / 8)); + } + return (p); +} + +void +libmej_x_free_pixmap(const char *var, const char *filename, unsigned long line, Display *d, Pixmap p) +{ + D_MEM(("libmej_x_free_pixmap() called for variable %s (0x%08x) at %s:%lu\n", var, p, filename, line)); + if (p) { + if (DEBUG_LEVEL >= DEBUG_MEM) { + memrec_rem_var(&pixmap_rec, var, filename, line, (void *) p); + } + XFreePixmap(d, p); + } else { + D_MEM(("ERROR: Caught attempt to free NULL pixmap\n")); + } +} + +void +libmej_dump_pixmap_tables(void) +{ + memrec_dump(&pixmap_rec); +} + + + +/********************** GC ALLOCATION INTERFACE **********************/ + +GC +libmej_x_create_gc(const char *filename, unsigned long line, Display *d, Drawable win, unsigned long mask, XGCValues *gcv) +{ + GC gc; + + D_MEM(("Creating gc for window 0x%08x at %s:%lu\n", win, filename, line)); + + gc = XCreateGC(d, win, mask, gcv); + ASSERT_RVAL(gc != None, None); + if (DEBUG_LEVEL >= DEBUG_MEM) { + memrec_add_var(&gc_rec, (void *) gc, sizeof(XGCValues)); + } + return (gc); +} + +void +libmej_x_free_gc(const char *var, const char *filename, unsigned long line, Display *d, GC gc) +{ + D_MEM(("libmej_x_free_gc() called for variable %s (0x%08x) at %s:%lu\n", var, gc, filename, line)); + if (gc) { + if (DEBUG_LEVEL >= DEBUG_MEM) { + memrec_rem_var(&gc_rec, var, filename, line, (void *) gc); + } + XFreeGC(d, gc); + } else { + D_MEM(("ERROR: Caught attempt to free NULL GC\n")); + } +} + +void +libmej_dump_gc_tables(void) +{ + memrec_dump(&gc_rec); } diff --git a/src/Makefile.am b/src/Makefile.am index feb66f1..2931b1e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,7 @@ # $Id$ +INCLUDES = -I$(top_srcdir)/libmej + lib_LTLIBRARIES = libEterm.la bin_PROGRAMS = Eterm @@ -17,6 +19,8 @@ libEterm_la_LDFLAGS = -release $(VERSION) Eterm_SOURCES = main.c Eterm_DEPENDENCIES = libEterm.la Eterm_LDFLAGS = -rpath $(libdir):$(pkglibdir) -Eterm_LDADD = libEterm.la $(top_builddir)/libmej/libmej.la -L$(libdir) -L$(prefix)/lib $(X_LIBS) $(GRLIBS) $(LIBS) +Eterm_LDADD = libEterm.la $(top_builddir)/libmej/libmej.la -INCLUDES = -I. -I$(top_srcdir) -I$(top_srcdir)/libmej -I.. -I$(includedir) -I$(prefix)/include $(X_CFLAGS) +install-exec-hook: + $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) + test ! -z "$(GDB_CMD_FILE)" && $(INSTALL_DATA) gdb.scr $(DESTDIR)$(pkgdatadir)/ diff --git a/src/buttons.c b/src/buttons.c index 7e810ac..f238375 100644 --- a/src/buttons.c +++ b/src/buttons.c @@ -101,7 +101,7 @@ bbar_create(void) XSelectInput(Xdisplay, bbar->win, mask); XStoreName(Xdisplay, bbar->win, "Eterm Button Bar"); - bbar->gc = X_CREATE_GC(GCForeground | GCFont, &gcvalue); + bbar->gc = LIBMEJ_X_CREATE_GC(GCForeground | GCFont, &gcvalue); bbar_set_docked(bbar, BBAR_DOCKED_TOP); bbar_set_visible(bbar, 1); diff --git a/src/command.c b/src/command.c index cf8e61f..c086aa0 100644 --- a/src/command.c +++ b/src/command.c @@ -972,10 +972,10 @@ hard_exit(void) { _exit(-1); #elif defined(SIGKILL) kill(cmd_pid, SIGKILL); - raise(SIGKILL); + abort(); #else kill(cmd_pid, 9); - raise(9); + abort(); #endif } @@ -984,8 +984,8 @@ hard_exit(void) { void dump_stack_trace(void) { - char cmd[256]; + struct stat st; #ifdef NO_STACK_TRACE return; @@ -998,7 +998,10 @@ dump_stack_trace(void) U_STACK_TRACE(); return; #elif defined(GDB) - snprintf(cmd, sizeof(cmd), "/bin/echo '\n\nbacktrace' | " GDB " " APL_NAME " %d", getpid()); + if (((stat(GDB_CMD_FILE, &st)) != 0) || (!S_ISREG(st.st_mode))) { + return; + } + snprintf(cmd, sizeof(cmd), GDB " -x " GDB_CMD_FILE " " APL_NAME " %d", getpid()); #elif defined(PSTACK) snprintf(cmd, sizeof(cmd), PSTACK " %d", getpid()); #elif defined(DBX) @@ -1014,7 +1017,7 @@ dump_stack_trace(void) return; #endif signal(SIGALRM, (eterm_sighandler_t) hard_exit); - alarm(10); + alarm(3); system(cmd); } @@ -1138,7 +1141,9 @@ clean_exit(void) privileges(REVERT); #if DEBUG >= DEBUG_MEM if (DEBUG_LEVEL >= DEBUG_MEM) { - memrec_dump(); + MALLOC_DUMP(); + PIXMAP_DUMP(); + GC_DUMP(); } #endif PABLO_STOP_TRACING(); diff --git a/src/draw.c b/src/draw.c index fd0f83e..51f0e08 100644 --- a/src/draw.c +++ b/src/draw.c @@ -54,8 +54,8 @@ draw_shadow_from_colors(Drawable d, Pixel top, Pixel bottom, int x, int y, int w static GC gc_top = (GC) 0, gc_bottom = (GC) 0; if (gc_top == 0) { - gc_top = X_CREATE_GC(0, NULL); - gc_bottom = X_CREATE_GC(0, NULL); + gc_top = LIBMEJ_X_CREATE_GC(0, NULL); + gc_bottom = LIBMEJ_X_CREATE_GC(0, NULL); } XSetForeground(Xdisplay, gc_top, top); @@ -109,8 +109,8 @@ draw_arrow_from_colors(Drawable d, Pixel top, Pixel bottom, int x, int y, int w, static GC gc_top = (GC) 0, gc_bottom = (GC) 0; if (gc_top == 0) { - gc_top = X_CREATE_GC(0, NULL); - gc_bottom = X_CREATE_GC(0, NULL); + gc_top = LIBMEJ_X_CREATE_GC(0, NULL); + gc_bottom = LIBMEJ_X_CREATE_GC(0, NULL); } XSetForeground(Xdisplay, gc_top, top); @@ -230,8 +230,8 @@ bevel_pixmap(Pixmap p, int w, int h, Imlib_Border *bord, unsigned char up) MOD_PIXEL_HIGH(x, y, !up); } } - gc = X_CREATE_GC(0, NULL); + gc = LIBMEJ_X_CREATE_GC(0, NULL); XPutImage(Xdisplay, p, gc, ximg, 0, 0, 0, 0, w, h); - X_FREE_GC(gc); + LIBMEJ_X_FREE_GC(gc); XDestroyImage(ximg); } diff --git a/src/gdb.scr b/src/gdb.scr new file mode 100644 index 0000000..3b942f3 --- /dev/null +++ b/src/gdb.scr @@ -0,0 +1,2 @@ +backtrace +quit diff --git a/src/menus.c b/src/menus.c index ee03aa4..ba182c6 100644 --- a/src/menus.c +++ b/src/menus.c @@ -124,9 +124,9 @@ menu_init(void) return; } gcvalue.foreground = PixColors[menuTopShadowColor]; - topShadowGC = X_CREATE_GC(GCForeground, &gcvalue); + topShadowGC = LIBMEJ_X_CREATE_GC(GCForeground, &gcvalue); gcvalue.foreground = PixColors[menuBottomShadowColor]; - botShadowGC = X_CREATE_GC(GCForeground, &gcvalue); + botShadowGC = LIBMEJ_X_CREATE_GC(GCForeground, &gcvalue); event_register_dispatcher(menu_dispatch_event, menu_event_init_dispatcher); } @@ -450,7 +450,7 @@ menu_create(char *title) menu->swin = XCreateWindow(Xdisplay, menu->win, 0, 0, 1, 1, 0, Xdepth, InputOutput, CopyFromParent, CWOverrideRedirect | CWSaveUnder | CWBackingStore | CWBorderPixel | CWColormap, &xattr); - menu->gc = X_CREATE_GC(0, NULL); + menu->gc = LIBMEJ_X_CREATE_GC(0, NULL); menuitem_clear_current(menu); return menu; diff --git a/src/misc.c b/src/misc.c index f266eb5..cfa2dfe 100644 --- a/src/misc.c +++ b/src/misc.c @@ -226,26 +226,6 @@ parse_escaped_string(char *str) return (pnew - str); } -const char * -find_file(const char *file, const char *ext) -{ - - const char *f; - -#if defined(PIXMAP_SUPPORT) - if ((f = search_path(rs_path, file, ext)) != NULL) { - return (f); - } else if ((f = search_path(getenv(PATH_ENV), file, ext)) != NULL) { - return (f); - } else { - return (search_path(initial_dir, file, ext)); - } -#else - return ((const char *) NULL); -#endif - -} - char * safe_print_string(char *str, unsigned long len) { diff --git a/src/misc.h b/src/misc.h index cefddc6..83a56f9 100644 --- a/src/misc.h +++ b/src/misc.h @@ -40,8 +40,6 @@ extern const char *my_basename(const char *str); extern unsigned long str_leading_match(register const char *, register const char *); extern char *str_trim(char *str); extern int parse_escaped_string(char *str); -extern const char *search_path(const char *pathlist, const char *file, const char *ext); -extern const char *find_file(const char *file, const char *ext); extern char *safe_print_string(char *buff, unsigned long len); extern unsigned long add_carriage_returns(unsigned char *buff, unsigned long cnt); extern unsigned char mkdirhier(const char *); diff --git a/src/pixmap.c b/src/pixmap.c index 9317321..6a5e4ef 100644 --- a/src/pixmap.c +++ b/src/pixmap.c @@ -512,8 +512,8 @@ create_trans_pixmap(simage_t *simg, unsigned char which, Drawable d, int x, int return None; } XTranslateCoordinates(Xdisplay, d, desktop_window, x, y, &x, &y, &dummy); - p = X_CREATE_PIXMAP(width, height); - gc = X_CREATE_GC(0, NULL); + p = LIBMEJ_X_CREATE_PIXMAP(width, height); + gc = LIBMEJ_X_CREATE_GC(0, NULL); D_PIXMAP(("Created p [0x%08x] as a %hux%hu pixmap at %d, %d relative to window 0x%08x\n", p, width, height, x, y, desktop_window)); if (p != None) { if (pw < scr->width || ph < scr->height) { @@ -535,7 +535,7 @@ create_trans_pixmap(simage_t *simg, unsigned char which, Drawable d, int x, int bevel_pixmap(p, width, height, simg->iml->bevel->edges, simg->iml->bevel->up); } } - X_FREE_GC(gc); + LIBMEJ_X_FREE_GC(gc); return p; } @@ -609,10 +609,10 @@ create_viewport_pixmap(simage_t *simg, Drawable d, int x, int y, unsigned short } } if (p == None) { - p = X_CREATE_PIXMAP(width, height); + p = LIBMEJ_X_CREATE_PIXMAP(width, height); D_PIXMAP(("Created p == 0x%08x\n", p)); } - gc = X_CREATE_GC(0, NULL); + gc = LIBMEJ_X_CREATE_GC(0, NULL); XTranslateCoordinates(Xdisplay, d, desktop_window, x, y, &x, &y, &dummy); D_PIXMAP(("Translated coords are %d, %d\n", x, y)); if ((images[image_bg].current->pmap->w > 0) || (images[image_bg].current->pmap->op & OP_SCALE)) { @@ -623,7 +623,7 @@ create_viewport_pixmap(simage_t *simg, Drawable d, int x, int y, unsigned short XSetFillStyle(Xdisplay, gc, FillTiled); XFillRectangle(Xdisplay, p, gc, 0, 0, width, height); } - X_FREE_GC(gc); + LIBMEJ_X_FREE_GC(gc); return p; } @@ -668,13 +668,13 @@ paste_simage(simage_t *simg, unsigned char which, Drawable d, unsigned short x, FREE(reply); enl_ipc_sync(); if (pmap) { - gc = X_CREATE_GC(0, NULL); + gc = LIBMEJ_X_CREATE_GC(0, NULL); XSetClipMask(Xdisplay, gc, mask); XSetClipOrigin(Xdisplay, gc, x, y); XCopyArea(Xdisplay, pmap, d, gc, 0, 0, w, h, x, y); snprintf(buff, sizeof(buff), "imageclass %s free_pixmap 0x%08x", iclass, (int) pmap); enl_ipc_send(buff); - X_FREE_GC(gc); + LIBMEJ_X_FREE_GC(gc); return; } else { print_error("Enlightenment returned a null pixmap, which I can't use. Disallowing \"auto\" mode for this image.\n"); @@ -687,23 +687,23 @@ paste_simage(simage_t *simg, unsigned char which, Drawable d, unsigned short x, } else if (image_mode_is(which, MODE_TRANS) && image_mode_is(which, ALLOW_TRANS)) { Pixmap p; - gc = X_CREATE_GC(0, NULL); + gc = LIBMEJ_X_CREATE_GC(0, NULL); /* FIXME: The conditional on the next line works, but it's a hack. Worth fixing? :-) */ p = create_trans_pixmap(simg, which, ((which == image_st) ? scrollbar.sa_win : d), x, y, w, h); XCopyArea(Xdisplay, p, d, gc, 0, 0, w, h, x, y); - X_FREE_PIXMAP(p); - X_FREE_GC(gc); + LIBMEJ_X_FREE_PIXMAP(p); + LIBMEJ_X_FREE_GC(gc); } else if (image_mode_is(which, MODE_VIEWPORT) && image_mode_is(which, ALLOW_VIEWPORT)) { Pixmap p; - gc = X_CREATE_GC(0, NULL); + gc = LIBMEJ_X_CREATE_GC(0, NULL); p = create_viewport_pixmap(simg, d, x, y, w, h); if (simg->iml->bevel != NULL) { bevel_pixmap(p, w, h, simg->iml->bevel->edges, simg->iml->bevel->up); } XCopyArea(Xdisplay, p, d, gc, 0, 0, w, h, x, y); - X_FREE_PIXMAP(p); - X_FREE_GC(gc); + LIBMEJ_X_FREE_PIXMAP(p); + LIBMEJ_X_FREE_GC(gc); } } @@ -730,14 +730,14 @@ paste_simage(simage_t *simg, unsigned char which, Drawable d, unsigned short x, reset_simage(simg, RESET_ALL_SIMG); return; } - gc = X_CREATE_GC(0, NULL); + gc = LIBMEJ_X_CREATE_GC(0, NULL); if (mask) { XSetClipMask(Xdisplay, gc, mask); XSetClipOrigin(Xdisplay, gc, x, y); } XCopyArea(Xdisplay, pmap, d, gc, 0, 0, w, h, x, y); IMLIB_FREE_PIXMAP(pmap); - X_FREE_GC(gc); + LIBMEJ_X_FREE_GC(gc); } } @@ -796,9 +796,9 @@ copy_buffer_pixmap(unsigned char mode, unsigned long fill, unsigned short width, XGCValues gcvalue; ASSERT(buffer_pixmap == None); - buffer_pixmap = X_CREATE_PIXMAP(width, height); + buffer_pixmap = LIBMEJ_X_CREATE_PIXMAP(width, height); gcvalue.foreground = (Pixel) fill; - gc = X_CREATE_GC(GCForeground, &gcvalue); + gc = LIBMEJ_X_CREATE_GC(GCForeground, &gcvalue); XSetGraphicsExposures(Xdisplay, gc, False); if (mode == MODE_SOLID) { @@ -806,15 +806,15 @@ copy_buffer_pixmap(unsigned char mode, unsigned long fill, unsigned short width, simg = images[image_bg].current; if (simg->pmap->pixmap) { - X_FREE_PIXMAP(simg->pmap->pixmap); + LIBMEJ_X_FREE_PIXMAP(simg->pmap->pixmap); } - simg->pmap->pixmap = X_CREATE_PIXMAP(width, height); + simg->pmap->pixmap = LIBMEJ_X_CREATE_PIXMAP(width, height); XFillRectangle(Xdisplay, simg->pmap->pixmap, gc, 0, 0, width, height); XCopyArea(Xdisplay, simg->pmap->pixmap, buffer_pixmap, gc, 0, 0, width, height, 0, 0); } else { XCopyArea(Xdisplay, (Pixmap) fill, buffer_pixmap, gc, 0, 0, width, height, 0, 0); } - X_FREE_GC(gc); + LIBMEJ_X_FREE_GC(gc); } void @@ -852,11 +852,11 @@ render_simage(simage_t * simg, Window win, unsigned short width, unsigned short return; gcvalue.foreground = gcvalue.background = PixColors[bgColor]; - gc = X_CREATE_GC(GCForeground | GCBackground, &gcvalue); + gc = LIBMEJ_X_CREATE_GC(GCForeground | GCBackground, &gcvalue); pixmap = simg->pmap->pixmap; /* Save this for later */ if ((which == image_bg) && (buffer_pixmap != None)) { - X_FREE_PIXMAP(buffer_pixmap); + LIBMEJ_X_FREE_PIXMAP(buffer_pixmap); buffer_pixmap = None; } @@ -898,9 +898,9 @@ render_simage(simage_t * simg, Window win, unsigned short width, unsigned short XSetClipOrigin(Xdisplay, gc, 0, 0); } if (simg->pmap->pixmap) { - X_FREE_PIXMAP(simg->pmap->pixmap); + LIBMEJ_X_FREE_PIXMAP(simg->pmap->pixmap); } - simg->pmap->pixmap = X_CREATE_PIXMAP(width, height); + simg->pmap->pixmap = LIBMEJ_X_CREATE_PIXMAP(width, height); XCopyArea(Xdisplay, pmap, simg->pmap->pixmap, gc, 0, 0, width, height, 0, 0); XSetWindowBackgroundPixmap(Xdisplay, win, simg->pmap->pixmap); snprintf(buff, sizeof(buff), "imageclass %s free_pixmap 0x%08x", iclass, (int) pmap); @@ -914,7 +914,7 @@ render_simage(simage_t * simg, Window win, unsigned short width, unsigned short } else { snprintf(buff, sizeof(buff), "imageclass %s apply 0x%x %s", iclass, (int) win, state); enl_ipc_send(buff); - X_FREE_GC(gc); + LIBMEJ_X_FREE_GC(gc); return; } } @@ -924,7 +924,7 @@ render_simage(simage_t * simg, Window win, unsigned short width, unsigned short # ifdef PIXMAP_OFFSET if (image_mode_is(which, MODE_TRANS) && image_mode_is(which, ALLOW_TRANS)) { if (simg->pmap->pixmap != None) { - X_FREE_PIXMAP(simg->pmap->pixmap); + LIBMEJ_X_FREE_PIXMAP(simg->pmap->pixmap); } simg->pmap->pixmap = create_trans_pixmap(simg, which, win, 0, 0, width, height); if (simg->pmap->pixmap != None) { @@ -944,7 +944,7 @@ render_simage(simage_t * simg, Window win, unsigned short width, unsigned short p = create_viewport_pixmap(simg, win, 0, 0, width, height); if (p && (p != simg->pmap->pixmap)) { if (simg->pmap->pixmap != None) { - X_FREE_PIXMAP(simg->pmap->pixmap); + LIBMEJ_X_FREE_PIXMAP(simg->pmap->pixmap); } simg->pmap->pixmap = p; } @@ -1038,7 +1038,7 @@ render_simage(simage_t * simg, Window win, unsigned short width, unsigned short single = ((xscaled < width || yscaled < height) && !(simg->pmap->op & OP_TILE)) ? 1 : 0; pixmap = simg->pmap->pixmap; - simg->pmap->pixmap = X_CREATE_PIXMAP(width, height); + simg->pmap->pixmap = LIBMEJ_X_CREATE_PIXMAP(width, height); if (single) { XFillRectangle(Xdisplay, simg->pmap->pixmap, gc, 0, 0, width, height); } @@ -1053,7 +1053,7 @@ render_simage(simage_t * simg, Window win, unsigned short width, unsigned short IMLIB_FREE_PIXMAP(pixmap); } else if (renderop & RENDER_FORCE_PIXMAP) { pixmap = simg->pmap->pixmap; - simg->pmap->pixmap = X_CREATE_PIXMAP(width, height); + simg->pmap->pixmap = LIBMEJ_X_CREATE_PIXMAP(width, height); XCopyArea(Xdisplay, pixmap, simg->pmap->pixmap, gc, 0, 0, width, height, 0, 0); IMLIB_FREE_PIXMAP(pixmap); } @@ -1089,9 +1089,9 @@ render_simage(simage_t * simg, Window win, unsigned short width, unsigned short } else { if ((renderop & RENDER_FORCE_PIXMAP) || (simg->iml->bevel != NULL)) { if (simg->pmap->pixmap) { - X_FREE_PIXMAP(simg->pmap->pixmap); + LIBMEJ_X_FREE_PIXMAP(simg->pmap->pixmap); } - simg->pmap->pixmap = X_CREATE_PIXMAP(width, height); + simg->pmap->pixmap = LIBMEJ_X_CREATE_PIXMAP(width, height); XSetForeground(Xdisplay, gc, ((which == image_bg) ? (PixColors[bgColor]) : (simg->bg))); XFillRectangle(Xdisplay, simg->pmap->pixmap, gc, 0, 0, width, height); if (simg->iml->bevel != NULL && simg->iml->bevel->edges != NULL) { @@ -1106,13 +1106,13 @@ render_simage(simage_t * simg, Window win, unsigned short width, unsigned short } } XClearWindow(Xdisplay, win); - X_FREE_GC(gc); + LIBMEJ_X_FREE_GC(gc); return; } #ifdef PIXMAP_SUPPORT const char * -search_path(const char *pathlist, const char *file, const char *ext) +search_path(const char *pathlist, const char *file) { static char name[PATH_MAX]; char *p; @@ -1123,12 +1123,9 @@ search_path(const char *pathlist, const char *file, const char *ext) if (!pathlist || !file) { /* If either one is NULL, there really isn't much point in going on.... */ return ((const char *) NULL); } - if (!ext) { - ext = ""; - } getcwd(name, PATH_MAX); len = strlen(name); - D_OPTIONS(("search_path(\"%s\", \"%s\", \"%s\") called from \"%s\".\n", pathlist, file, ext, name)); + D_OPTIONS(("search_path(\"%s\", \"%s\") called from \"%s\".\n", pathlist, file, name)); if (len < PATH_MAX - 1) { strcat(name, "/"); strncat(name, file, PATH_MAX - len - 1); @@ -1148,18 +1145,8 @@ search_path(const char *pathlist, const char *file, const char *ext) p = strchr(file, '\0'); len = (p - file); - /* check about adding a trailing extension */ - if (ext != NULL) { - - char *dot; - - dot = strrchr(p, '.'); - path = strrchr(p, '/'); - if (dot != NULL || (path != NULL && dot <= path)) - ext = NULL; - } /* leave room for an extra '/' and trailing '\0' */ - maxpath = sizeof(name) - (len + (ext ? strlen(ext) : 0) + 2); + maxpath = sizeof(name) - (len + 2); if (maxpath <= 0) return NULL; @@ -1173,15 +1160,6 @@ search_path(const char *pathlist, const char *file, const char *ext) if (!S_ISDIR(fst.st_mode)) return name; } - if (ext) { - strcat(name, ext); - D_OPTIONS(("Checking for file \"%s\"\n", name)); - if (!access(name, R_OK)) { - stat(name, &fst); - if (!S_ISDIR(fst.st_mode)) - return name; - } - } for (path = pathlist; path != NULL && *path != '\0'; path = p) { int n; @@ -1208,15 +1186,6 @@ search_path(const char *pathlist, const char *file, const char *ext) if (!S_ISDIR(fst.st_mode)) return name; } - if (ext) { - strcat(name, ext); - D_OPTIONS(("Checking for file \"%s\"\n", name)); - if (!access(name, R_OK)) { - stat(name, &fst); - if (!S_ISDIR(fst.st_mode)) - return name; - } - } } } D_OPTIONS(("File \"%s\" not found in path.\n", file)); @@ -1244,8 +1213,8 @@ load_image(const char *file, simage_t *simg) if (geom != NULL) { set_pixmap_scale(geom, simg->pmap); } - if ((f = search_path(rs_path, file, PIXMAP_EXT)) == NULL) { - f = search_path(getenv(PATH_ENV), file, PIXMAP_EXT); + if ((f = search_path(rs_path, file)) == NULL) { + f = search_path(getenv(PATH_ENV), file); } if (f != NULL) { im = imlib_load_image_immediately(f); @@ -1850,7 +1819,7 @@ get_desktop_pixmap(void) } if (color_pixmap != None) { D_PIXMAP(("Removing old solid color pixmap 0x%08x.\n", color_pixmap)); - X_FREE_PIXMAP(color_pixmap); + LIBMEJ_X_FREE_PIXMAP(color_pixmap); color_pixmap = None; } if (prop != None) { @@ -1875,19 +1844,19 @@ get_desktop_pixmap(void) Screen *scr = ScreenOfDisplay(Xdisplay, Xscreen); gcvalue.foreground = gcvalue.background = PixColors[bgColor]; - gc = X_CREATE_GC(GCForeground | GCBackground, &gcvalue); + gc = LIBMEJ_X_CREATE_GC(GCForeground | GCBackground, &gcvalue); XGetGeometry(Xdisplay, p, &w, &px, &py, &pw, &ph, &pb, &pd); D_PIXMAP(("XGetGeometry() returned w = 0x%08x, pw == %u, ph == %u\n", w, pw, ph)); if (pw < (unsigned int) scr->width || ph < (unsigned int) scr->height) { - desktop_pixmap = X_CREATE_PIXMAP(pw, ph); + desktop_pixmap = LIBMEJ_X_CREATE_PIXMAP(pw, ph); XCopyArea(Xdisplay, p, desktop_pixmap, gc, 0, 0, pw, ph, 0, 0); colormod_trans(desktop_pixmap, images[image_bg].current->iml, gc, pw, ph); } else { - desktop_pixmap = X_CREATE_PIXMAP(scr->width, scr->height); + desktop_pixmap = LIBMEJ_X_CREATE_PIXMAP(scr->width, scr->height); XCopyArea(Xdisplay, p, desktop_pixmap, gc, 0, 0, scr->width, scr->height, 0, 0); colormod_trans(desktop_pixmap, images[image_bg].current->iml, gc, scr->width, scr->height); } - X_FREE_GC(gc); + LIBMEJ_X_FREE_GC(gc); desktop_pixmap_is_mine = 1; D_PIXMAP(("Returning 0x%08x\n", (unsigned int) desktop_pixmap)); return (desktop_pixmap); @@ -1913,12 +1882,12 @@ get_desktop_pixmap(void) D_PIXMAP((" Found solid color 0x%08x\n", pix)); gcvalue.foreground = pix; gcvalue.background = pix; - gc = X_CREATE_GC(GCForeground | GCBackground, &gcvalue); + gc = LIBMEJ_X_CREATE_GC(GCForeground | GCBackground, &gcvalue); - color_pixmap = X_CREATE_PIXMAP(16, 16); + color_pixmap = LIBMEJ_X_CREATE_PIXMAP(16, 16); XFillRectangle(Xdisplay, color_pixmap, gc, 0, 0, 16, 16); D_PIXMAP(("Created solid color pixmap 0x%08x for desktop_pixmap.\n", color_pixmap)); - X_FREE_GC(gc); + LIBMEJ_X_FREE_GC(gc); return (desktop_pixmap = color_pixmap); } } @@ -1933,7 +1902,7 @@ free_desktop_pixmap(void) { if (desktop_pixmap_is_mine && desktop_pixmap != None) { - X_FREE_PIXMAP(desktop_pixmap); + LIBMEJ_X_FREE_PIXMAP(desktop_pixmap); desktop_pixmap_is_mine = 0; } desktop_pixmap = None; @@ -1990,8 +1959,8 @@ set_icon_pixmap(char *filename, XWMHints * pwm_hints) } if (filename && *filename) { - if ((icon_path = search_path(rs_path, filename, NULL)) == NULL) - icon_path = search_path(getenv(PATH_ENV), filename, NULL); + if ((icon_path = search_path(rs_path, filename)) == NULL) + icon_path = search_path(getenv(PATH_ENV), filename); if (icon_path != NULL) { XIconSize *icon_sizes; diff --git a/src/pixmap.h b/src/pixmap.h index 8f2f7f1..7a49d86 100644 --- a/src/pixmap.h +++ b/src/pixmap.h @@ -44,17 +44,17 @@ typedef void *Imlib_Color_Modifier; # define background_is_viewport() (images[image_bg].mode & MODE_VIEWPORT) # define background_is_auto() (images[image_bg].mode & MODE_AUTO) # define background_is_pixmap() (background_is_image() || (images[image_bg].mode & (MODE_TRANS | MODE_VIEWPORT | MODE_AUTO))) -# define delete_simage(simg) do { \ - imlib_free_pixmap_and_mask((simg)->pmap->pixmap); \ - imlib_context_set_image((simg)->iml->im); \ - imlib_free_image_and_decache(); \ - (simg)->pmap->pixmap = None; (simg)->iml->im = NULL; \ - } while (0) -# define CONVERT_SHADE(s) (0xff - (((s) * 0xff) / 100)) -# define CONVERT_TINT_RED(t) (((t) & 0xff0000) >> 16) -# define CONVERT_TINT_GREEN(t) (((t) & 0x00ff00) >> 8) -# define CONVERT_TINT_BLUE(t) ((t) & 0x0000ff) -# define IMLIB_FREE_PIXMAP(p) do {D_PIXMAP(("libmej_freeing pixmap: imlib_free_pixmap_and_mask(0x%08x)\n", (p))); imlib_free_pixmap_and_mask(p);} while (0) +# define delete_simage(simg) do { \ + imlib_free_pixmap_and_mask((simg)->pmap->pixmap); \ + imlib_context_set_image((simg)->iml->im); \ + imlib_free_image_and_decache(); \ + (simg)->pmap->pixmap = None; (simg)->iml->im = NULL; \ + } while (0) +# define CONVERT_SHADE(s) (0xff - (((s) * 0xff) / 100)) +# define CONVERT_TINT_RED(t) (((t) & 0xff0000) >> 16) +# define CONVERT_TINT_GREEN(t) (((t) & 0x00ff00) >> 8) +# define CONVERT_TINT_BLUE(t) ((t) & 0x0000ff) +# define IMLIB_FREE_PIXMAP(p) do {D_PIXMAP(("Freeing pixmap: imlib_free_pixmap_and_mask(0x%08x)\n", (p))); imlib_free_pixmap_and_mask(p);} while (0) #else # define background_is_image() (0) # define background_is_trans() (0) @@ -65,19 +65,10 @@ typedef void *Imlib_Color_Modifier; # define delete_simage(simg) NOP # define IMLIB_FREE_PIXMAP(p) NOP #endif -#ifdef __GNUC__ -# define X_CREATE_PIXMAP(w, h) __extension__ ({Pixmap __my_tmp_pmap = XCreatePixmap(Xdisplay, (TermWin.parent ? TermWin.parent : Xroot), (w), (h), Xdepth); \ - D_PIXMAP(("Created pixmap 0x%08x (width %d, height %d)\n", (__my_tmp_pmap), (w), (h))); \ - (__my_tmp_pmap);}) -# define X_CREATE_GC(flags, gcv) __extension__ ({GC __my_tmp_gc = XCreateGC(Xdisplay, (TermWin.parent ? TermWin.parent : Xroot), (flags), (gcv)); \ - D_PIXMAP(("Created GC 0x%08x\n", (__my_tmp_gc))); (__my_tmp_gc);}) -#else -# define X_CREATE_PIXMAP(w, h) (XCreatePixmap(Xdisplay, TermWin.parent, (w), (h), Xdepth)) -# define X_CREATE_GC(flags, gcv) (XCreateGC(Xdisplay, TermWin.parent, (flags), (gcv))) -#endif -#define X_FREE_PIXMAP(p) do {D_PIXMAP(("libmej_freeing pixmap: XFreePixmap(Xdisplay, 0x%08x)\n", (p))); XFreePixmap(Xdisplay, (p));} while (0) -#define X_FREE_GC(gc) do {D_PIXMAP(("libmej_freeing GC: XFreeGC(Xdisplay, 0x%08x)\n", (gc))); XFreeGC(Xdisplay, (gc));} while (0) -#define PIXMAP_EXT NULL +#define LIBMEJ_X_CREATE_PIXMAP(w, h) X_CREATE_PIXMAP(Xdisplay, (TermWin.parent ? TermWin.parent : Xroot), (w), (h), Xdepth) +#define LIBMEJ_X_FREE_PIXMAP(p) X_FREE_PIXMAP(Xdisplay, (p)) +#define LIBMEJ_X_CREATE_GC(f, gcv) X_CREATE_GC(Xdisplay, (TermWin.parent ? TermWin.parent : Xroot), (f), (gcv)) +#define LIBMEJ_X_FREE_GC(gc) X_FREE_GC(Xdisplay, (gc)) #define GEOM_LEN 19 @@ -244,7 +235,7 @@ extern void redraw_images_by_mode(unsigned char); #endif extern void render_simage(simage_t *, Window, unsigned short, unsigned short, unsigned char, renderop_t); #ifdef PIXMAP_SUPPORT -extern const char *search_path(const char *, const char *, const char *); +extern const char *search_path(const char *, const char *); extern unsigned char load_image(const char *, simage_t *); extern void update_cmod(colormod_t *); extern void update_cmod_tables(imlib_t *); diff --git a/src/scrollbar.c b/src/scrollbar.c index b50cd76..3336776 100644 --- a/src/scrollbar.c +++ b/src/scrollbar.c @@ -885,19 +885,19 @@ scrollbar_drawing_init(void) { gcvalue.fill_style = FillOpaqueStippled; gcvalue.foreground = PixColors[fgColor]; gcvalue.background = PixColors[bgColor]; - gc_stipple = X_CREATE_GC(GCForeground | GCBackground | GCFillStyle | GCStipple, &gcvalue); + gc_stipple = LIBMEJ_X_CREATE_GC(GCForeground | GCBackground | GCFillStyle | GCStipple, &gcvalue); gcvalue.foreground = PixColors[borderColor]; - gc_border = X_CREATE_GC(GCForeground, &gcvalue); + gc_border = LIBMEJ_X_CREATE_GC(GCForeground, &gcvalue); } #endif /* XTERM_SCROLLBAR */ #if defined(MOTIF_SCROLLBAR) || defined(NEXT_SCROLLBAR) gcvalue.foreground = images[image_sb].norm->bg; - gc_scrollbar = X_CREATE_GC(GCForeground, &gcvalue); + gc_scrollbar = LIBMEJ_X_CREATE_GC(GCForeground, &gcvalue); gcvalue.foreground = PixColors[topShadowColor]; - gc_top = X_CREATE_GC(GCForeground, &gcvalue); + gc_top = LIBMEJ_X_CREATE_GC(GCForeground, &gcvalue); gcvalue.foreground = PixColors[bottomShadowColor]; - gc_bottom = X_CREATE_GC(GCForeground, &gcvalue); + gc_bottom = LIBMEJ_X_CREATE_GC(GCForeground, &gcvalue); #endif /* MOTIF_SCROLLBAR || NEXT_SCROLLBAR */ } diff --git a/src/term.c b/src/term.c index d43e92e..91f2399 100644 --- a/src/term.c +++ b/src/term.c @@ -1869,7 +1869,7 @@ xterm_seq(int op, const char *str) if (image_mode_is(which, MODE_TRANS) && (desktop_pixmap != None)) { free_desktop_pixmap(); } else if (image_mode_is(which, MODE_VIEWPORT) && (viewport_pixmap != None)) { - X_FREE_PIXMAP(viewport_pixmap); + LIBMEJ_X_FREE_PIXMAP(viewport_pixmap); viewport_pixmap = None; /* Force the re-read */ } # endif @@ -1885,7 +1885,7 @@ xterm_seq(int op, const char *str) if (image_mode_is(which, MODE_TRANS) && (desktop_pixmap != None)) { free_desktop_pixmap(); } else if (image_mode_is(which, MODE_VIEWPORT) && (viewport_pixmap != None)) { - X_FREE_PIXMAP(viewport_pixmap); + LIBMEJ_X_FREE_PIXMAP(viewport_pixmap); viewport_pixmap = None; /* Force the re-read */ } # endif diff --git a/src/windows.c b/src/windows.c index d480cfa..2f2126a 100644 --- a/src/windows.c +++ b/src/windows.c @@ -463,7 +463,7 @@ Create_Windows(int argc, char *argv[]) gcvalue.foreground = PixColors[fgColor]; gcvalue.background = PixColors[bgColor]; gcvalue.graphics_exposures = 0; - TermWin.gc = X_CREATE_GC(GCForeground | GCBackground | GCFont | GCGraphicsExposures, &gcvalue); + TermWin.gc = LIBMEJ_X_CREATE_GC(GCForeground | GCBackground | GCFont | GCGraphicsExposures, &gcvalue); } if (Options & Opt_noCursor) { diff --git a/utils/Makefile.am b/utils/Makefile.am index 0400905..a1a5c44 100644 --- a/utils/Makefile.am +++ b/utils/Makefile.am @@ -1,13 +1,11 @@ # $Id$ -INCLUDES = -I. -I../libmej -I.. -I$(includedir) -I$(prefix)/include $(X_CFLAGS) - bin_PROGRAMS = Esetroot Etbg Ettable bin_SCRIPTS = Etcolors Etwinop Etsearch kEsetroot Esetroot_SOURCES = Esetroot.c Esetroot_LDFLAGS = -rpath $(libdir):$(pkglibdir) -Esetroot_LDADD = -L$(DIST_ROOT)/libmej -L$(libdir) -L$(prefix)/lib $(LIBS) $(GRLIBS) $(X_LIBS) +Esetroot_LDADD = -L$(DIST_ROOT)/libmej Etbg_SOURCES = Etbg.c Ettable_SOURCES = Ettable.c