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:
parent
892e32ec86
commit
db2f3e7394
19
ChangeLog
19
ChangeLog
|
@ -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).
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
13
src/debug.h
13
src/debug.h
|
@ -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
|
||||
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue