From e8e81278322b4af68fbcb06490a6fa771f5b8f4b Mon Sep 17 00:00:00 2001 From: Michael Jennings Date: Tue, 2 Nov 1999 16:08:57 +0000 Subject: [PATCH] Tue Nov 2 16:53:56 PST 1999 Michael Jennings Several bugs fixed here, most notably a potential seg fault in Esetroot, and remembering an Eterm's size works again. Also a minor redraw speedup. And %exec() now works properly instead of just causing Eterm to crash. :-) SVN revision: 1153 --- ChangeLog | 8 ++++ src/e.c | 2 +- src/options.c | 116 ++++++++++++++++++++--------------------------- src/scrollbar.c | 14 ++++-- src/startup.c | 3 +- utils/Esetroot.c | 12 ++++- 6 files changed, 81 insertions(+), 74 deletions(-) diff --git a/ChangeLog b/ChangeLog index a0b463a..9da5b7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2721,3 +2721,11 @@ Fri Oct 29 16:43:19 PDT 1999 Michael Jennings You'll see what I'm talking about. :-) ------------------------------------------------------------------------------- +Tue Nov 2 16:53:56 PST 1999 Michael Jennings + + Several bugs fixed here, most notably a potential seg fault in + Esetroot, and remembering an Eterm's size works again. Also a minor + redraw speedup. And %exec() now works properly instead of just + causing Eterm to crash. :-) + +------------------------------------------------------------------------------- diff --git a/src/e.c b/src/e.c index d714d32..42d089a 100644 --- a/src/e.c +++ b/src/e.c @@ -54,7 +54,7 @@ static unsigned char timeout = 0; unsigned char check_for_enlightenment(void) { - static char have_e = -1; + static signed char have_e = -1; if (have_e == -1) { if (XInternAtom(Xdisplay, "ENLIGHTENMENT_COMMS", True) != None) { diff --git a/src/options.c b/src/options.c index 7d93770..6f1cfda 100644 --- a/src/options.c +++ b/src/options.c @@ -1275,9 +1275,44 @@ char * builtin_exec(char *param) { + unsigned long fsize; + char *Command, *Output = NULL, *OutFile; + FILE *fp; + D_PARSE(("builtin_exec(%s) called\n", param)); - return (param); + Command = (char *) MALLOC(CONFIG_BUFF); + OutFile = tmpnam(NULL); + if (strlen(param) + strlen(OutFile) + 8 > CONFIG_BUFF) { + print_error("Parse error in file %s, line %lu: Cannot execute command, line too long", + file_peek_path(), file_peek_line()); + return ((char *) NULL); + } + strcpy(Command, param); + strcat(Command, " >"); + strcat(Command, OutFile); + system(Command); + if ((fp = fopen(OutFile, "rb")) != NULL) { + fseek(fp, 0, SEEK_END); + fsize = ftell(fp); + rewind(fp); + if (fsize) { + Output = (char *) MALLOC(fsize + 1); + fread(Output, fsize, 1, fp); + Output[fsize] = 0; + fclose(fp); + remove(OutFile); + Output = CondenseWhitespace(Output); + } else { + print_warning("Command at line %lu of file %s returned no output.", file_peek_line(), file_peek_path()); + } + } else { + print_warning("Output file %s could not be created. (line %lu of file %s)", NONULL(OutFile), + file_peek_line(), file_peek_path()); + } + FREE(Command); + + return (Output); } char * @@ -1335,10 +1370,9 @@ shell_expand(char *s) register unsigned long j, k, l = 0; char new[CONFIG_BUFF]; unsigned char eval_escape = 1, eval_var = 1, eval_exec = 1, eval_func = 1, in_single = 0, in_double = 0; - unsigned long fsize, cnt1 = 0, cnt2 = 0; + unsigned long cnt1 = 0, cnt2 = 0; const unsigned long max = CONFIG_BUFF - 1; - char *Command, *Output, *EnvVar, *OutFile; - FILE *fp; + char *Command, *Output, *EnvVar; ASSERT_RVAL(s != NULL, (char *) NULL); @@ -1455,72 +1489,22 @@ shell_expand(char *s) Command = (char *) MALLOC(CONFIG_BUFF); l = 0; for (pbuff++; *pbuff && *pbuff != '`' && l < max; pbuff++, l++) { - switch (*pbuff) { - case '$': - D_OPTIONS(("Environment variable detected. Evaluating.\n")); - EnvVar = (char *) MALLOC(128); - switch (*(++pbuff)) { - case '{': - for (pbuff++, k = 0; *pbuff != '}' && k < 127; k++, pbuff++) - EnvVar[k] = *pbuff; - break; - case '(': - for (pbuff++, k = 0; *pbuff != ')' && k < 127; k++, pbuff++) - EnvVar[k] = *pbuff; - break; - default: - for (k = 0; (isalnum(*pbuff) || *pbuff == '_') && k < 127; k++, pbuff++) - EnvVar[k] = *pbuff; - break; - } - EnvVar[k] = 0; - if ((tmp = getenv(EnvVar))) { - strncpy(Command + l, tmp, max - l); - cnt1 = strlen(tmp) - 1; - cnt2 = max - l - 1; - l += MIN(cnt1, cnt2); - } - pbuff--; - break; - default: - Command[l] = *pbuff; - } + Command[l] = *pbuff; } ASSERT(l < CONFIG_BUFF); Command[l] = 0; - OutFile = tmpnam(NULL); - if (l + strlen(OutFile) + 8 > CONFIG_BUFF) { - print_error("Parse error in file %s, line %lu: Cannot execute command, line too long", - file_peek_path(), file_peek_line()); - return ((char *) NULL); - } - strcat(Command, " >"); - strcat(Command, OutFile); - system(Command); - if ((fp = fopen(OutFile, "rb")) != NULL) { - fseek(fp, 0, SEEK_END); - fsize = ftell(fp); - rewind(fp); - if (fsize) { - Output = (char *) MALLOC(fsize + 1); - fread(Output, fsize, 1, fp); - Output[fsize] = 0; - fclose(fp); - remove(OutFile); - Output = CondenseWhitespace(Output); - strncpy(new + j, Output, max - j); - cnt1 = strlen(Output) - 1; - cnt2 = max - j - 1; - j += MIN(cnt1, cnt2); - FREE(Output); - } else { - print_warning("Command at line %lu of file %s returned no output.", file_peek_line(), file_peek_path()); - } - } else { - print_warning("Output file %s could not be created. (line %lu of file %s)", NONULL(OutFile), - file_peek_line(), file_peek_path()); - } + Command = shell_expand(Command); + Output = builtin_exec(Command); FREE(Command); + if (Output && *Output) { + l = strlen(Output) - 1; + strncpy(new + j, Output, max - j); + cnt2 = max - j - 1; + j += MIN(l, cnt2); + FREE(Output); + } else { + j--; + } } else { new[j] = *pbuff; } diff --git a/src/scrollbar.c b/src/scrollbar.c index d3b4ce3..82c64af 100644 --- a/src/scrollbar.c +++ b/src/scrollbar.c @@ -201,6 +201,8 @@ scrollbar_init(void) Cursor cursor; long mask; + D_SCROLLBAR(("scrollbar_init(): Initializing all scrollbar elements.\n")); + Attributes.background_pixel = PixColors[scrollColor]; Attributes.border_pixel = PixColors[bgColor]; Attributes.override_redirect = TRUE; @@ -213,22 +215,26 @@ scrollbar_init(void) CWOverrideRedirect | CWBackingStore | CWBackPixel | CWBorderPixel | CWColormap, &Attributes); XDefineCursor(Xdisplay, scrollBar.win, cursor); XSelectInput(Xdisplay, scrollBar.win, mask); + D_SCROLLBAR(("scrollbar_init(): Created scrollbar window 0x%08x\n", scrollBar.win)); #ifdef PIXMAP_SCROLLBAR if (scrollbar_uparrow_is_pixmapped()) { scrollBar.up_win = XCreateWindow(Xdisplay, scrollBar.win, 0, 0, 1, 1, 0, Xdepth, InputOutput, CopyFromParent, CWOverrideRedirect | CWSaveUnder | CWBackingStore | CWColormap, &Attributes); XSelectInput(Xdisplay, scrollBar.up_win, mask); + D_SCROLLBAR(("scrollbar_init(): Created scrollbar up arrow window 0x%08x\n", scrollBar.up_win)); } if (scrollbar_downarrow_is_pixmapped()) { scrollBar.dn_win = XCreateWindow(Xdisplay, scrollBar.win, 0, 0, 1, 1, 0, Xdepth, InputOutput, CopyFromParent, CWOverrideRedirect | CWSaveUnder | CWBackingStore | CWColormap, &Attributes); XSelectInput(Xdisplay, scrollBar.dn_win, mask); + D_SCROLLBAR(("scrollbar_init(): Created scrollbar down arrow window 0x%08x\n", scrollBar.dn_win)); } if (scrollbar_anchor_is_pixmapped()) { scrollBar.sa_win = XCreateWindow(Xdisplay, scrollBar.win, 0, 0, 1, 1, 0, Xdepth, InputOutput, CopyFromParent, CWOverrideRedirect | CWSaveUnder | CWBackingStore | CWColormap, &Attributes); XSelectInput(Xdisplay, scrollBar.sa_win, mask); + D_SCROLLBAR(("scrollbar_init(): Created scrollbar anchor window 0x%08x\n", scrollBar.sa_win)); } #endif @@ -237,6 +243,7 @@ scrollbar_init(void) } else { scrollbar_set_shadow((Options & Opt_scrollBar_floating) ? 0 : SHADOW); } + D_SCROLLBAR(("scrollbar_init(): Set scrollbar shadow to %d\n", scrollbar_get_shadow())); event_register_dispatcher(scrollbar_dispatch_event, scrollbar_event_init_dispatcher); } @@ -376,9 +383,6 @@ sb_handle_expose(event_t * ev) while (XCheckTypedWindowEvent(Xdisplay, ev->xany.window, Expose, &unused_xevent)); while (XCheckTypedWindowEvent(Xdisplay, ev->xany.window, GraphicsExpose, &unused_xevent)); - if (scrollbar_win_is_scrollbar(ev->xany.window)) { - scrollbar_show(0); - } return 1; } @@ -613,6 +617,7 @@ scrollbar_mapping(unsigned char show) D_SCROLLBAR(("scrollbar_mapping(%d)\n", show)); if (show && !scrollbar_visible()) { + D_SCROLLBAR((" -> Mapping all scrollbar windows. Returning 1.\n")); scrollBar.state = 1; XMapWindow(Xdisplay, scrollBar.win); #ifdef PIXMAP_SCROLLBAR @@ -628,6 +633,7 @@ scrollbar_mapping(unsigned char show) #endif change = 1; } else if (!show && scrollbar_visible()) { + D_SCROLLBAR((" -> Unmapping all scrollbar windows. Returning 1.\n")); scrollBar.state = 0; #ifdef PIXMAP_SCROLLBAR if (scrollbar_uparrow_is_pixmapped()) { @@ -642,6 +648,8 @@ scrollbar_mapping(unsigned char show) #endif XUnmapWindow(Xdisplay, scrollBar.win); change = 1; + } else { + D_SCROLLBAR((" -> No action required. Returning 0.\n")); } return change; } diff --git a/src/startup.c b/src/startup.c index a2a8100..4a8e2e3 100644 --- a/src/startup.c +++ b/src/startup.c @@ -205,8 +205,8 @@ eterm_bootstrap(int argc, char *argv[]) Create_Windows(argc, argv); scr_reset(); /* initialize screen */ - /* add scrollBar, do it directly to avoid resize() */ scrollbar_mapping(Options & Opt_scrollBar); + scrollbar_resize(szHint.width, szHint.height); #if DEBUG >= DEBUG_X if (debug_level >= DEBUG_X) { @@ -276,7 +276,6 @@ eterm_bootstrap(int argc, char *argv[]) D_CMD(("init_command()\n")); init_command(rs_execArgs); - parent_resize(); main_loop(); diff --git a/utils/Esetroot.c b/utils/Esetroot.c index 87f8e17..f51cb29 100644 --- a/utils/Esetroot.c +++ b/utils/Esetroot.c @@ -169,9 +169,17 @@ main(int argc, char *argv[]) params.flags = PARAMS_VISUALID; params.visualid = (DefaultVisual(Xdisplay, screen))->visualid; id = Imlib_init_with_params(Xdisplay, ¶ms); - im = Imlib_load_image(id, fname); - if (debug) { + if (id == NULL) { + fprintf(stderr, "%s: Unable to initialize Imlib.\n", *argv); + exit(1); + } else if (debug) { fprintf(stderr, "%s:%d: The Imlib Data is at %8p\n", __FILE__, __LINE__, id); + } + im = Imlib_load_image(id, fname); + if (im == NULL) { + fprintf(stderr, "%s: Unable to load image file \"%s\".\n", *argv, fname); + exit(1); + } else if (debug) { fprintf(stderr, "%s:%d: The Imlib Image is at %8p\n", __FILE__, __LINE__, im); } if (scale) {