Make the shadow bold offset configurable, after discovering that
[u/mdw/putty] / unix / pterm.c
index 1262782..a459958 100644 (file)
@@ -11,6 +11,8 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 
@@ -430,9 +432,9 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
        output[31] = '\0';
        end = strlen(output);
        if (event->state & GDK_MOD1_MASK)
-           start = 0;
+           start = end = 0;
        else
-           start = 1;
+           start = end = 1;
 
        /* Control-` is the same as Control-\ (unless gtk has a better idea) */
        if (!event->string[0] && event->keyval == '`' &&
@@ -1294,16 +1296,9 @@ void do_text_internal(Context ctx, int x, int y, char *text, int len,
                  y*inst->font_height+cfg.window_border+inst->fonts[0]->ascent,
                  text, len);
 
-    /*
-     * X fonts seem to be pretty consistent about leaving the
-     * _left_ pixel of the cell blank rather than the right. Hence
-     * I'm going to hard-code shadow bolding as displaying one
-     * pixel to the left rather than try to work out whether it
-     * should be left or right.
-     */
     if (shadow) {
        gdk_draw_text(inst->pixmap, inst->fonts[fontid], gc,
-                     x*inst->font_width+cfg.window_border - 1,
+                     x*inst->font_width+cfg.window_border + cfg.shadowboldoffset,
                      y*inst->font_height+cfg.window_border+inst->fonts[0]->ascent,
                      text, len);
     }
@@ -1602,10 +1597,16 @@ int do_cmdline(int argc, char **argv, int do_everything)
     if (!do_everything) continue; \
 } while (0)
 
+    /*
+     * TODO:
+     * 
+     * finish -geometry
+     */
+
     char *val;
     while (--argc > 0) {
        char *p = *++argv;
-       if (!strcmp(p, "-fn")) {
+       if (!strcmp(p, "-fn") || !strcmp(p, "-font")) {
            EXPECTS_ARG;
            SECOND_PASS_ONLY;
            strncpy(cfg.font, val, sizeof(cfg.font));
@@ -1617,6 +1618,54 @@ int do_cmdline(int argc, char **argv, int do_everything)
            strncpy(cfg.boldfont, val, sizeof(cfg.boldfont));
            cfg.boldfont[sizeof(cfg.boldfont)-1] = '\0';
 
+       } else if (!strcmp(p, "-geometry")) {
+           int flags, x, y, w, h;
+           EXPECTS_ARG;
+           SECOND_PASS_ONLY;
+
+           flags = XParseGeometry(val, &x, &y, &w, &h);
+           if (flags & WidthValue)
+               cfg.width = w;
+           if (flags & HeightValue)
+               cfg.height = h;
+
+           /*
+            * Apparently setting the initial window position is
+            * difficult in GTK 1.2. Not entirely sure why this
+            * should be. 2.0 has gtk_window_parse_geometry(),
+            * which would help... For the moment, though, I can't
+            * be bothered with this.
+            */
+
+       } else if (!strcmp(p, "-sl")) {
+           EXPECTS_ARG;
+           SECOND_PASS_ONLY;
+           cfg.savelines = atoi(val);
+
+       } else if (!strcmp(p, "-fg") || !strcmp(p, "-bg") ||
+                  !strcmp(p, "-bfg") || !strcmp(p, "-bbg") ||
+                  !strcmp(p, "-cfg") || !strcmp(p, "-cbg")) {
+           GdkColor col;
+
+           EXPECTS_ARG;
+           SECOND_PASS_ONLY;
+           if (!gdk_color_parse(val, &col)) {
+               err = 1;
+               fprintf(stderr, "pterm: unable to parse colour \"%s\"\n", val);
+           } else {
+               int index;
+               index = (!strcmp(p, "-fg") ? 0 :
+                        !strcmp(p, "-bg") ? 2 :
+                        !strcmp(p, "-bfg") ? 1 :
+                        !strcmp(p, "-bbg") ? 3 :
+                        !strcmp(p, "-cfg") ? 4 :
+                        !strcmp(p, "-cbg") ? 5 : -1);
+               assert(index != -1);
+               cfg.colours[index][0] = col.red / 256;
+               cfg.colours[index][1] = col.green / 256;
+               cfg.colours[index][2] = col.blue / 256;
+           }
+
        } else if (!strcmp(p, "-e")) {
            /* This option swallows all further arguments. */
            if (!do_everything)
@@ -1646,29 +1695,42 @@ int do_cmdline(int argc, char **argv, int do_everything)
            cfg.logfilename[sizeof(cfg.logfilename)-1] = '\0';
            cfg.logtype = LGTYP_DEBUG;
 
-       } else if (!strcmp(p, "-hide")) {
+       } else if (!strcmp(p, "-ut-") || !strcmp(p, "+ut")) {
            SECOND_PASS_ONLY;
-           cfg.hide_mouseptr = 1;
+           cfg.stamp_utmp = 0;
 
-       } else if (!strcmp(p, "-ut-")) {
+       } else if (!strcmp(p, "-ut")) {
            SECOND_PASS_ONLY;
            cfg.stamp_utmp = 0;
 
-       } else if (!strcmp(p, "-ls-")) {
+       } else if (!strcmp(p, "-ls-") || !strcmp(p, "+ls")) {
            SECOND_PASS_ONLY;
            cfg.login_shell = 0;
 
+       } else if (!strcmp(p, "-ls")) {
+           SECOND_PASS_ONLY;
+           cfg.login_shell = 1;
+
        } else if (!strcmp(p, "-nethack")) {
            SECOND_PASS_ONLY;
            cfg.nethack_keypad = 1;
 
-       } else if (!strcmp(p, "-sb-")) {
+       } else if (!strcmp(p, "-sb-") || !strcmp(p, "+sb")) {
+           SECOND_PASS_ONLY;
+           cfg.scrollbar = 0;
+
+       } else if (!strcmp(p, "-sb")) {
            SECOND_PASS_ONLY;
            cfg.scrollbar = 0;
 
        } else if (!strcmp(p, "-name")) {
            EXPECTS_ARG;
            app_name = val;
+
+       } else if (!strcmp(p, "-xrm")) {
+           EXPECTS_ARG;
+           provide_xrm_string(val);
+
        }
     }