Mon Jul 3 12:17:53 PDT 2000 Michael Jennings <mej@eterm.org>

Marius Gedminas <mgedmin@takas.lt> reported a couple of issues back
	when he was on his bug-spotting binge that I didn't have time to fix
	just then.  Well, now I've fixed them.  ~/.Eterm/user.cfg will now
	be found if there isn't a theme-specific one; this allows you to have
	a single user.cfg which specifies some options you want all your
	Eterms to have.

	Along those same lines, the action code now searches for duplicate
	bindings and changes the existing one rather than adding a new one
	to the end of the list.  This allows bindings in user.cfg to override
	those in theme.cfg (as they should).  Also, bindings are added in
	reverse order, so newer ones (like in user.cfg) take precedence over
	older ones (like in theme.cfg) if there is a conflict (e.g., if your
	theme.cfg binds "anymod button2" and user.cfg binds "ctrl button2,"
	user.cfg wins).


SVN revision: 2901
This commit is contained in:
Michael Jennings 2000-07-03 19:08:41 +00:00
parent 892e32ec86
commit db2f3e7394
9 changed files with 96 additions and 27 deletions

View File

@ -3724,3 +3724,22 @@ Wed Jun 28 14:14:53 PDT 2000 Michael Jennings <mej@eterm.org>
screwed. Fixed now.
-------------------------------------------------------------------------------
Mon Jul 3 12:17:53 PDT 2000 Michael Jennings <mej@eterm.org>
Marius Gedminas <mgedmin@takas.lt> reported a couple of issues back
when he was on his bug-spotting binge that I didn't have time to fix
just then. Well, now I've fixed them. ~/.Eterm/user.cfg will now
be found if there isn't a theme-specific one; this allows you to have
a single user.cfg which specifies some options you want all your
Eterms to have.
Along those same lines, the action code now searches for duplicate
bindings and changes the existing one rather than adding a new one
to the end of the list. This allows bindings in user.cfg to override
those in theme.cfg (as they should). Also, bindings are added in
reverse order, so newer ones (like in user.cfg) take precedence over
older ones (like in theme.cfg) if there is a conflict (e.g., if your
theme.cfg binds "anymod button2" and user.cfg binds "ctrl button2,"
user.cfg wins).
-------------------------------------------------------------------------------

View File

@ -52,7 +52,7 @@ typedef struct memrec_struct {
#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)))
# 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)
#endif

View File

@ -69,6 +69,14 @@ action_handle_echo(event_t *ev, action_t *action) {
ev = NULL;
}
unsigned char
action_handle_function(event_t *ev, action_t *action) {
REQUIRE_RVAL(action->param.string != NULL, 0);
/* To be continued.... :-) */
return 1;
ev = NULL;
}
unsigned char
action_handle_menu(event_t *ev, action_t *action) {
REQUIRE_RVAL(action->param.menu != NULL, 0);
@ -76,6 +84,22 @@ action_handle_menu(event_t *ev, action_t *action) {
return 1;
}
action_t *
action_find_match(unsigned short mod, unsigned char button, KeySym keysym) {
action_t *action;
D_ACTIONS(("mod == 0x%08x, button == %d, keysym == 0x%08x\n", mod, button, keysym));
for (action = action_list; action; action = action->next) {
D_ACTIONS(("Checking action. mod == 0x%08x, button == %d, keysym == 0x%08x\n", action->mod, action->button, action->keysym));
if ((action->mod == mod) && (action->button == button) && (action->keysym == keysym)) {
D_ACTIONS(("Match found at %8p\n", action));
return action;
}
}
return NULL;
}
unsigned char
action_dispatch(event_t *ev, KeySym keysym) {
@ -141,14 +165,18 @@ action_dispatch(event_t *ev, KeySym keysym) {
void
action_add(unsigned short mod, unsigned char button, KeySym keysym, action_type_t type, void *param) {
static action_t *action;
action_t *action;
if (!action_list) {
action_list = (action_t *) MALLOC(sizeof(action_t));
action = action_list;
if (!action_list || (action = action_find_match(mod, button, keysym)) == NULL) {
action = (action_t *) MALLOC(sizeof(action_t));
action->next = action_list;
action_list = action;
} else {
action->next = (action_t *) MALLOC(sizeof(action_t));
action = action->next;
if (action->type == ACTION_STRING || action->type == ACTION_ECHO || action->type == ACTION_FUNCTION) {
if (action->param.string) {
FREE(action->param.string);
}
}
}
action->mod = mod;
action->button = button;
@ -167,6 +195,12 @@ 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);
break;
case ACTION_MENU:
action->handler = (action_handler_t) action_handle_menu;
action->param.menu = (menu_t *) param;
@ -174,7 +208,6 @@ action_add(unsigned short mod, unsigned char button, KeySym keysym, action_type_
default:
break;
}
action->next = NULL;
D_ACTIONS(("Added action. mod == 0x%08x, button == %d, keysym == 0x%08x\n", action->mod, action->button, action->keysym));
}

View File

@ -35,6 +35,7 @@ typedef enum {
ACTION_NONE = 0,
ACTION_STRING,
ACTION_ECHO,
ACTION_FUNCTION,
ACTION_MENU
} action_type_t;
@ -82,7 +83,9 @@ _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_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);
extern void action_add(unsigned short mod, unsigned char button, KeySym keysym, action_type_t type, void *param);

View File

@ -172,15 +172,16 @@ extern unsigned int debug_level;
# define DEBUG_COLORS 3
# define D_COLORS(x) DPRINTF3(x)
# define DEBUG_MALLOC 4
# define D_MALLOC(x) DPRINTF4(x)
# define DEBUG_ACTIONS 4
# define D_ACTIONS(x) DPRINTF4(x)
# define DEBUG_PROFILE 4
# define D_PROFILE(x) DPRINTF4(x)
# define DEBUG_VT 5
# define D_VT(x) DPRINTF5(x)
# define DEBUG_MALLOC 5
# define D_MALLOC(x) DPRINTF5(x)
# define DEBUG_PROFILE 5
# define D_PROFILE(x) DPRINTF5(x)
# define DEBUG_VT 6
# define D_VT(x) DPRINTF6(x)
# define DEBUG_X 9

View File

@ -3365,6 +3365,7 @@ open_config_file(char *name)
if (fp != NULL) {
fgets(buff, 256, fp);
if (BEG_STRCASECMP(buff, "<" PACKAGE "-")) {
print_warning("%s exists but does not contain the proper magic string (<" PACKAGE "-" VERSION ">)\n", name);
fclose(fp);
fp = NULL;
} else {
@ -3524,7 +3525,7 @@ conf_parse(char *conf_name, const char *dir, const char *path) {
}
char *
conf_parse_theme(char *theme, char *conf_name, unsigned char fallback)
conf_parse_theme(char **theme, char *conf_name, unsigned char fallback)
{
static char path[CONFIG_BUFF];
char *ret = NULL;
@ -3541,16 +3542,22 @@ conf_parse_theme(char *theme, char *conf_name, unsigned char fallback)
}
shell_expand(path);
}
if (!theme || (ret = conf_parse(conf_name, rs_theme, path)) == NULL) {
if (fallback) {
RESET_AND_ASSIGN(rs_theme, StrDup(PACKAGE));
if ((ret = conf_parse(conf_name, rs_theme, path)) == NULL) {
RESET_AND_ASSIGN(rs_theme, NULL);
ret = conf_parse(conf_name, rs_theme, path);
}
if (fallback & PARSE_TRY_USER_THEME) {
if (theme && *theme && (ret = conf_parse(conf_name, *theme, path)) != NULL) {
return ret;
}
}
return ret;
if (fallback & PARSE_TRY_DEFAULT_THEME) {
RESET_AND_ASSIGN(*theme, StrDup(PACKAGE));
if ((ret = conf_parse(conf_name, *theme, path)) != NULL) {
return ret;
}
}
if (fallback & PARSE_TRY_NO_THEME) {
RESET_AND_ASSIGN(*theme, NULL);
return (conf_parse(conf_name, *theme, path));
}
return NULL;
}
static void *

View File

@ -38,6 +38,11 @@
#define CONF_BEGIN_CHAR ((char) 1)
#define CONF_END_CHAR ((char) 2)
#define PARSE_TRY_USER_THEME ((unsigned char) 0x01)
#define PARSE_TRY_DEFAULT_THEME ((unsigned char) 0x02)
#define PARSE_TRY_NO_THEME ((unsigned char) 0x04)
#define PARSE_TRY_ALL ((unsigned char) 0x07)
#define OPT_BOOLEAN 0x0001
#define OPT_INTEGER 0x0002
#define OPT_STRING 0x0004
@ -257,7 +262,7 @@ 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);
extern char *conf_parse(char *conf_name, const char *dir, const char *path);
extern char *conf_parse_theme(char *theme, char *conf_name, unsigned char fallback);
extern char *conf_parse_theme(char **theme, char *conf_name, unsigned char fallback);
extern void init_defaults(void);
extern void post_parse(void);
unsigned char save_config(char *, unsigned char);

View File

@ -141,7 +141,7 @@ eterm_bootstrap(int argc, char *argv[])
/* Initialize the parser */
conf_init_subsystem();
if ((theme_dir = conf_parse_theme(rs_theme, THEME_CFG, 1)) != NULL) {
if ((theme_dir = conf_parse_theme(&rs_theme, THEME_CFG, PARSE_TRY_ALL)) != NULL) {
char *tmp;
D_OPTIONS(("conf_parse_theme() returned \"%s\"\n", theme_dir));
@ -149,7 +149,8 @@ eterm_bootstrap(int argc, char *argv[])
sprintf(tmp, "ETERM_THEME_ROOT=%s", theme_dir);
putenv(tmp);
}
if ((user_dir = conf_parse_theme(rs_theme, (rs_config_file ? rs_config_file : USER_CFG), 0)) != NULL) {
if ((user_dir = conf_parse_theme(&rs_theme, (rs_config_file ? rs_config_file : USER_CFG),
(PARSE_TRY_USER_THEME | PARSE_TRY_NO_THEME))) != NULL) {
char *tmp;
D_OPTIONS(("conf_parse_theme() returned \"%s\"\n", user_dir));

View File

@ -42,7 +42,7 @@ static const char cvs_ident[] = "$Id$";
#include "misc.h"
#include "system.h"
static sighandler_t old_handler = (sighandler_t) NULL;
/*static sighandler_t old_handler = (sighandler_t) NULL;*/
int
wait_for_chld(int system_pid)