From: simon Date: Wed, 16 Oct 2002 14:32:06 +0000 (+0000) Subject: Implement reading of X resources, and -name to change the name under X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/commitdiff_plain/faec60ed7e3ba7a6b0972672bea7322625a63915 Implement reading of X resources, and -name to change the name under which to look them up. git-svn-id: svn://svn.tartarus.org/sgt/putty@2084 cda61777-01e9-0310-a592-d414129be87e --- diff --git a/unix/pterm.c b/unix/pterm.c index 13206cdc..1262782a 100644 --- a/unix/pterm.c +++ b/unix/pterm.c @@ -1581,36 +1581,47 @@ char *get_x_display(void) return gdk_get_display(); } -int main(int argc, char **argv) +char *app_name = "pterm"; + +int do_cmdline(int argc, char **argv, int do_everything) { - extern int pty_master_fd; /* declared in pty.c */ - extern char **pty_argv; /* declared in pty.c */ - extern void pty_pre_init(void); /* declared in pty.c */ int err = 0; + extern char **pty_argv; /* declared in pty.c */ - pty_pre_init(); - - gtk_init(&argc, &argv); - - do_defaults(NULL, &cfg); - + /* + * Macros to make argument handling easier. + */ +#define EXPECTS_ARG do { \ + if (--argc <= 0) { \ + err = 1; \ + fprintf(stderr, "pterm: %s expects an argument\n", p); \ + } else \ + val = *++argv; \ +} while (0) +#define SECOND_PASS_ONLY do { \ + if (!do_everything) continue; \ +} while (0) + + char *val; while (--argc > 0) { char *p = *++argv; if (!strcmp(p, "-fn")) { - if (--argc > 0) { - strncpy(cfg.font, *++argv, sizeof(cfg.font)); - cfg.font[sizeof(cfg.font)-1] = '\0'; - } else - err = 1, fprintf(stderr, "pterm: -fn expects an argument\n"); - } - if (!strcmp(p, "-fb")) { - if (--argc > 0) { - strncpy(cfg.boldfont, *++argv, sizeof(cfg.boldfont)); - cfg.boldfont[sizeof(cfg.boldfont)-1] = '\0'; - } else - err = 1, fprintf(stderr, "pterm: -fb expects an argument\n"); - } - if (!strcmp(p, "-e")) { + EXPECTS_ARG; + SECOND_PASS_ONLY; + strncpy(cfg.font, val, sizeof(cfg.font)); + cfg.font[sizeof(cfg.font)-1] = '\0'; + + } else if (!strcmp(p, "-fb")) { + EXPECTS_ARG; + SECOND_PASS_ONLY; + strncpy(cfg.boldfont, val, sizeof(cfg.boldfont)); + cfg.boldfont[sizeof(cfg.boldfont)-1] = '\0'; + + } else if (!strcmp(p, "-e")) { + /* This option swallows all further arguments. */ + if (!do_everything) + break; + if (--argc > 0) { int i; pty_argv = smalloc((argc+1) * sizeof(char *)); @@ -1621,39 +1632,64 @@ int main(int argc, char **argv) break; /* finished command-line processing */ } else err = 1, fprintf(stderr, "pterm: -e expects an argument\n"); - } - if (!strcmp(p, "-T")) { - if (--argc > 0) { - strncpy(cfg.wintitle, *++argv, sizeof(cfg.wintitle)); - cfg.wintitle[sizeof(cfg.wintitle)-1] = '\0'; - } else - err = 1, fprintf(stderr, "pterm: -T expects an argument\n"); - } - if (!strcmp(p, "-log")) { - if (--argc > 0) { - strncpy(cfg.logfilename, *++argv, sizeof(cfg.logfilename)); - cfg.logfilename[sizeof(cfg.logfilename)-1] = '\0'; - cfg.logtype = LGTYP_DEBUG; - } else - err = 1, fprintf(stderr, "pterm: -log expects an argument\n"); - } - if (!strcmp(p, "-hide")) { + + } else if (!strcmp(p, "-T")) { + EXPECTS_ARG; + SECOND_PASS_ONLY; + strncpy(cfg.wintitle, val, sizeof(cfg.wintitle)); + cfg.wintitle[sizeof(cfg.wintitle)-1] = '\0'; + + } else if (!strcmp(p, "-log")) { + EXPECTS_ARG; + SECOND_PASS_ONLY; + strncpy(cfg.logfilename, val, sizeof(cfg.logfilename)); + cfg.logfilename[sizeof(cfg.logfilename)-1] = '\0'; + cfg.logtype = LGTYP_DEBUG; + + } else if (!strcmp(p, "-hide")) { + SECOND_PASS_ONLY; cfg.hide_mouseptr = 1; - } - if (!strcmp(p, "-ut-")) { + + } else if (!strcmp(p, "-ut-")) { + SECOND_PASS_ONLY; cfg.stamp_utmp = 0; - } - if (!strcmp(p, "-ls-")) { + + } else if (!strcmp(p, "-ls-")) { + SECOND_PASS_ONLY; cfg.login_shell = 0; - } - if (!strcmp(p, "-nethack")) { + + } else if (!strcmp(p, "-nethack")) { + SECOND_PASS_ONLY; cfg.nethack_keypad = 1; - } - if (!strcmp(p, "-sb-")) { + + } else if (!strcmp(p, "-sb-")) { + SECOND_PASS_ONLY; cfg.scrollbar = 0; + + } else if (!strcmp(p, "-name")) { + EXPECTS_ARG; + app_name = val; } } + return err; +} + +int main(int argc, char **argv) +{ + extern int pty_master_fd; /* declared in pty.c */ + extern void pty_pre_init(void); /* declared in pty.c */ + + pty_pre_init(); + + gtk_init(&argc, &argv); + + if (do_cmdline(argc, argv, 0)) /* pre-defaults pass to get -class */ + exit(1); + do_defaults(NULL, &cfg); + if (do_cmdline(argc, argv, 1)) /* post-defaults, do everything */ + exit(1); + inst->fonts[0] = gdk_font_load(cfg.font); if (!inst->fonts[0]) { fprintf(stderr, "pterm: unable to load font \"%s\"\n", cfg.font); diff --git a/unix/unix.h b/unix/unix.h index 4885cc50..e1754254 100644 --- a/unix/unix.h +++ b/unix/unix.h @@ -41,6 +41,9 @@ void init_ucs(void); char *get_x_display(void); int font_dimension(int which); /* 0 for width, 1 for height */ +/* Things uxstore.c needs from pterm.c */ +char *app_name; /* for doing resource lookups */ + #define DEFAULT_CODEPAGE 0 /* FIXME: no idea how to do this */ #endif diff --git a/unix/uxstore.c b/unix/uxstore.c index 76e19c10..c4ba9dd5 100644 --- a/unix/uxstore.c +++ b/unix/uxstore.c @@ -5,10 +5,18 @@ #include #include +#include +#include +#include #include "putty.h" #include "storage.h" -/* FIXME. For the moment, we do nothing at all here. */ +/* + * For the moment, the only existing Unix utility is pterm and that + * has no GUI configuration at all, so our write routines need do + * nothing. Eventually I suppose these will read and write an rc + * file somewhere or other. + */ void *open_settings_w(char *sessionname) { @@ -27,19 +35,46 @@ void close_settings_w(void *handle) { } +/* + * Reading settings, for the moment, is done by retrieving X + * resources from the X display. When we introduce disk files, I + * think what will happen is that the X resources will override + * PuTTY's inbuilt defaults, but that the disk files will then + * override those. This isn't optimal, but it's the best I can + * immediately work out. + */ + +static Display *display; + void *open_settings_r(char *sessionname) { - return NULL; + static int thing_to_return_an_arbitrary_non_null_pointer_to; + display = GDK_DISPLAY(); + if (!display) + return NULL; + else + return &thing_to_return_an_arbitrary_non_null_pointer_to; } char *read_setting_s(void *handle, char *key, char *buffer, int buflen) { - return NULL; + char *val = XGetDefault(display, app_name, key); + if (!val) + return NULL; + else { + strncpy(buffer, val, buflen); + buffer[buflen-1] = '\0'; + return buffer; + } } int read_setting_i(void *handle, char *key, int defvalue) { - return defvalue; + char *val = XGetDefault(display, app_name, key); + if (!val) + return defvalue; + else + return atoi(val); } void close_settings_r(void *handle)