We're getting awfully close....

SVN revision: 4738
This commit is contained in:
Michael Jennings 2001-05-08 05:17:36 +00:00
parent 7f40cf6a9e
commit 07bae6a264
12 changed files with 83 additions and 48 deletions

View File

@ -11,9 +11,9 @@ libEterm_la_SOURCES = actions.c actions.h buttons.c buttons.h command.c
events.c events.h feature.h font.c font.h grkelot.c \
grkelot.h icon.h menus.c menus.h misc.c misc.h netdisp.c \
options.c options.h pixmap.c pixmap.h profile.h screen.c \
screen.h scrollbar.c scrollbar.h startup.c startup.h \
system.c system.h term.c term.h timer.c timer.h utmp.c \
windows.c windows.h
screen.h script.c script.h scrollbar.c scrollbar.h \
startup.c startup.h system.c system.h term.c term.h \
timer.c timer.h utmp.c windows.c windows.h
EXTRA_libEterm_la_SOURCES = $(MMX_SRCS)
libEterm_la_LDFLAGS = -release $(VERSION)

View File

@ -38,6 +38,7 @@ static const char cvs_ident[] = "$Id$";
#include "options.h"
#include "pixmap.h"
#include "screen.h"
#include "script.h"
#include "scrollbar.h"
#include "term.h"
#include "windows.h"
@ -63,9 +64,9 @@ action_handle_echo(event_t *ev, action_t *action) {
}
unsigned char
action_handle_function(event_t *ev, action_t *action) {
REQUIRE_RVAL(action->param.string != NULL, 0);
/* To be continued.... :-) */
action_handle_script(event_t *ev, action_t *action) {
REQUIRE_RVAL(action->param.script != NULL, 0);
script_parse(action->param.script);
return 1;
ev = NULL;
}
@ -165,7 +166,7 @@ action_add(unsigned short mod, unsigned char button, KeySym keysym, action_type_
action->next = action_list;
action_list = action;
} else {
if (action->type == ACTION_STRING || action->type == ACTION_ECHO || action->type == ACTION_FUNCTION) {
if (action->type == ACTION_STRING || action->type == ACTION_ECHO || action->type == ACTION_SCRIPT) {
if (action->param.string) {
FREE(action->param.string);
}
@ -188,11 +189,10 @@ action_add(unsigned short mod, unsigned char button, KeySym keysym, action_type_
strcpy(action->param.string, (char *) param);
parse_escaped_string(action->param.string);
break;
case ACTION_FUNCTION:
action->handler = (action_handler_t) action_handle_function;
action->param.string = (char *) MALLOC(strlen((char *) param) + 2);
strcpy(action->param.string, (char *) param);
parse_escaped_string(action->param.string);
case ACTION_SCRIPT:
action->handler = (action_handler_t) action_handle_script;
action->param.script = (char *) MALLOC(strlen((char *) param) + 2);
strcpy(action->param.script, (char *) param);
break;
case ACTION_MENU:
action->handler = (action_handler_t) action_handle_menu;

View File

@ -35,7 +35,7 @@ typedef enum {
ACTION_NONE = 0,
ACTION_STRING,
ACTION_ECHO,
ACTION_FUNCTION,
ACTION_SCRIPT,
ACTION_MENU
} action_type_t;
@ -70,6 +70,7 @@ struct action_struct {
action_handler_t handler;
union {
char *string;
char *script;
menu_t *menu;
} param;
struct action_struct *next;
@ -83,7 +84,7 @@ _XFUNCPROTOBEGIN
extern unsigned char action_handle_string(event_t *ev, action_t *action);
extern unsigned char action_handle_echo(event_t *ev, action_t *action);
extern unsigned char action_handle_function(event_t *ev, action_t *action);
extern unsigned char action_handle_script(event_t *ev, action_t *action);
extern unsigned char action_handle_menu(event_t *ev, action_t *action);
extern action_t *action_find_match(unsigned short mod, unsigned char button, KeySym keysym);
extern unsigned char action_dispatch(event_t *ev, KeySym keysym);

View File

@ -40,6 +40,7 @@ static const char cvs_ident[] = "$Id$";
#include "options.h"
#include "pixmap.h"
#include "screen.h"
#include "script.h"
#include "term.h"
#include "windows.h"
@ -654,6 +655,10 @@ button_set_action(button_t *button, action_type_t type, char *action)
strcpy(button->action.string, action);
parse_escaped_string(button->action.string);
break;
case ACTION_SCRIPT:
button->action.script = (char *) MALLOC(strlen(action) + 2);
strcpy(button->action.script, action);
break;
default:
break;
}
@ -736,8 +741,9 @@ button_check_action(buttonbar_t *bbar, button_t *button, unsigned char press, Ti
tt_write((unsigned char *) button->action.string, strlen(button->action.string));
}
break;
case ACTION_FUNCTION:
case ACTION_SCRIPT:
if (!press) {
script_parse((char *) button->action.script);
}
break;
default:

View File

@ -62,6 +62,7 @@ typedef struct button_struct {
action_type_t type;
union {
menu_t *menu;
char *script;
char *string;
} action;
char *text;

View File

@ -1043,7 +1043,8 @@ handle_child_signal(int sig)
/* If the child that exited is the command we spawned, or if the
child exited before fork() returned in the parent, it must be
our immediate child that exited. We exit gracefully. */
if (pid == cmd_pid && cmd_pid != -1) {
if ((pid == cmd_pid && cmd_pid != -1)
|| (pid == -1 && errno == ECHILD && cmd_pid != -1)) {
if (Options & Opt_pause) {
paused = 1;
return;

View File

@ -57,6 +57,8 @@
# define D_BBAR(x) DPRINTF2(x)
# define DEBUG_TIMER 2
# define D_TIMER(x) DPRINTF2(x)
# define DEBUG_SCRIPT 2
# define D_SCRIPT(x) DPRINTF2(x)
# define DEBUG_MENU 3
# define D_MENU(x) DPRINTF3(x)

View File

@ -267,13 +267,8 @@ inline void *memmove(void *, const void *, size_t);
#define APL_NAME "Eterm"
/* COLORTERM, TERM environment variables */
#ifdef MULTI_CHARSET
# define TERMENV "kterm"
# define COLORTERMENV "Eterm"
#else
# define TERMENV "xterm"
# define COLORTERMENV "Eterm"
#endif
#define TERMENV "Eterm"
#define COLORTERMENV "Eterm"
#ifdef NO_MOUSE_REPORT
# ifndef NO_MOUSE_REPORT_SCROLLBAR

View File

@ -1593,28 +1593,6 @@ builtin_appname(char *param)
return (STRDUP(APL_NAME "-" VERSION));
}
/* chomp() removes leading and trailing whitespace/quotes from a string */
char *
chomp(char *s)
{
register char *front, *back;
for (front = s; *front && isspace(*front); front++);
/*
if (*front == '\"') front++;
*/
for (back = s + strlen(s) - 1; *back && isspace(*back) && back > front; back--);
/*
if (*back == '\"') back--;
*/
*(++back) = 0;
if (front != s)
memmove(s, front, back - front + 1);
return (s);
}
/* shell_expand() takes care of shell variable expansion, quote conventions,
calling of built-in functions, etc. -- mej */
char *
@ -3027,6 +3005,10 @@ parse_actions(char *buff, void *state)
menu = find_menu_by_title(menu_list, str);
action_add(mod, button, keysym, ACTION_MENU, (void *) menu);
FREE(str);
} else if (!BEG_STRCASECMP(str, "script")) {
str = get_word(i+1, buff);
action_add(mod, button, keysym, ACTION_SCRIPT, (void *) str);
FREE(str);
} else {
print_error("Parse error in file %s, line %lu: Syntax error (\"to\" not found)\n", file_peek_path(), file_peek_line());
return NULL;
@ -3250,6 +3232,8 @@ parse_bbar(char *buff, void *state)
button_set_action(button, ACTION_STRING, action);
} else if (!BEG_STRCASECMP(type, "echo ")) {
button_set_action(button, ACTION_ECHO, action);
} else if (!BEG_STRCASECMP(type, "script ")) {
button_set_action(button, ACTION_SCRIPT, action);
} else {
print_error("Parse error in file %s, line %lu: Invalid button action \"%s\"\n", file_peek_path(), file_peek_line(), type);
FREE(action);

View File

@ -261,7 +261,6 @@ extern unsigned char conf_register_fstate(FILE *fp, char *path, char *outfile, u
extern unsigned char conf_register_builtin(char *name, eterm_func_ptr_t ptr);
extern unsigned char conf_register_context_state(unsigned char ctx_id);
extern void conf_free_subsystem(void);
extern char *chomp(char *);
extern char *shell_expand(char *);
extern char *conf_find_file(const char *file, const char *dir, const char *pathlist);
extern FILE *open_config_file(char *name);

View File

@ -38,11 +38,12 @@ static const char cvs_ident[] = "$Id$";
#include "options.h"
#include "pixmap.h"
#include "system.h"
#include "script.h"
#if 0
void
eterm_handle_winop(char *action)
{
#if 0
char *winid;
Window win = 0;
@ -100,10 +101,54 @@ eterm_handle_winop(char *action)
} else {
print_error("IPC Error: Unrecognized window operation \"%s\"\n", action);
}
#endif
}
#endif
void
script_parse(char *s)
{
char **token_list, **param_list;
register char *pstr;
register unsigned long i;
char *func_name, *params;
size_t len;
REQUIRE(s != NULL);
D_SCRIPT(("Parsing: \"%s\"\n", s));
token_list = split(";", s);
if (token_list == NULL) {
D_SCRIPT(("No tokens found; ignoring script.\n"));
return;
}
for (i = 0; token_list[i]; i++) {
pstr = token_list[i];
chomp(pstr);
if (!(*pstr)) {
continue;
}
if ((params = strchr(pstr, '(')) != NULL) {
if (params != pstr) {
len = params - pstr;
func_name = (char *) MALLOC(len + 1);
strncpy(func_name, pstr, len);
func_name[len] = 0;
} else {
print_error("Error in script \"%s\": Missing function name before \"%s\".\n", s, params);
return;
}
} else {
func_name = STRDUP(pstr);
}
if (func_name) {
chomp(func_name);
}
if (params) {
chomp(params);
}
D_SCRIPT(("Calling function %s with parameters: %s\n", NONULL(func_name), NONULL(params)));
}
}

View File

@ -37,6 +37,7 @@
/************ Function Prototypes ************/
_XFUNCPROTOBEGIN
extern void script_parse(char *);
_XFUNCPROTOEND