Prepare for better extended key handling. - sam - An updated version of the sam text editor.
(HTM) git clone git://vernunftzentrum.de/sam.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
(DIR) commit 35ebbbec7c409c8852a3f16fe2d401ab39fcef87
(DIR) parent 039c3a24e1e67a9535000f405d05b608fae65605
(HTM) Author: Rob King <jking@deadpixi.com>
Date: Thu, 11 Aug 2016 14:54:36 -0500
Prepare for better extended key handling.
Diffstat:
doc/B | 7 ++++++-
include/libg.h | 8 +++++++-
libXg/test.c | 237 -------------------------------
libXg/xtbinit.c | 4 ++--
samterm/main.c | 2 +-
5 files changed, 16 insertions(+), 242 deletions(-)
---
(DIR) diff --git a/doc/B b/doc/B
@@ -18,7 +18,12 @@ if [ $1 = "-r" ] ; then
echo "machine = $machine"
fi
-pipe="${HOME}/.sam.${machine}"
+if [ -n "${XDG_RUNTIME_DIR}" ] ; then
+ pipe="${XDG_RUNTIME_DIR}/.sam.${machine}"
+else if [ -n "${HOME}" ] ; then
+ pipe="${HOME}/.sam.${machine}"
+fi
+
dir=`/bin/pwd`
files=
for i in $*
(DIR) diff --git a/include/libg.h b/include/libg.h
@@ -59,10 +59,16 @@ struct Mouse
unsigned long msec;
};
+enum{
+ Kraw,
+ Kcomposed,
+ Kcommand
+};
+
struct Keystroke
{
+ int k;
int c;
- int composed;
};
struct Cursor
(DIR) diff --git a/libXg/test.c b/libXg/test.c
@@ -1,237 +0,0 @@
-/* Copyright (c) 1998 Lucent Technologies - All rights reserved. */
-#include <libc.h>
-#ifdef __STDC__
-#include <stdlib.h>
-#endif
-#include <libg.h>
-#include <stdio.h>
-
-void cont(char *);
-void putstring(char *);
-void colorinit(void);
-void printcolmap(void);
-void invertcolmap(void);
-
-unsigned char arrowset[] =
- {0x00, 0x00, 0x7F, 0xC0, 0x7F, 0x00, 0x7C, 0x00,
- 0x7E, 0x00, 0x7F, 0x00, 0x6F, 0x80, 0x67, 0xC0,
- 0x43, 0xE0, 0x41, 0xF0, 0x00, 0xF8, 0x00, 0x7C,
- 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00};
-
-char *colors[] = { "Black", "Red", "Green", "Yellow",
- "Cyan", "Magenta", "Blue", "White" };
-RGB colordefs[] = {
- { 0,0,0 }, /* black */
- {0xFFFFFFFF, 0x00000000, 0x00000000}, /* red */
- {0x00000000, 0xFFFFFFFF, 0x00000000}, /* green */
- {0xFFFFFFFF, 0xFFFFFFFF, 0x00000000}, /* yellow */
- {0x00000000, 0xFFFFFFFF, 0xFFFFFFFF}, /* cyan */
- {0xFFFFFFFF, 0x00000000, 0xFFFFFFFF}, /* magenta */
- {0x00000000, 0x00000000, 0xFFFFFFFF}, /* blue */
- {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}, /* white */
-};
-#define Ncol (sizeof(colordefs)/sizeof(colordefs[0]))
-unsigned long rgbval[Ncol];
-Bitmap *rgbbitmap[Ncol];
-
-main(int argc, char **argv)
-{
- Point p1,p2,p3;
- Mouse m;
- int r,rx,ry;
- int n, i;
- char *m3gen(int);
- static Menu menu3 = { (char **) 0, m3gen, 0 };
- char *p, buf[200];
- Bitmap *bm, *bm2;
- RGB cmap[256];
-
- xtbinit(0,0,&argc,argv,0);
- einit(Ekeyboard|Emouse);
- p1 = add(screen.r.min, Pt(15,15));
- p2 = sub(screen.r.max, Pt(15,15));
- p3 = divpt(add(p1,p2),2);
- fprintf(stderr, "segment(&screen, (%d,%d), (%d,%d), ~0, S)\n",
- p1.x,p1.y,p2.x,p2.y);
- segment(&screen, p1, p2, ~0, S);
- cont("point");
- fprintf(stderr, "point(&screen, (%d,%d), ~0, S)\n", p1.x,p1.y);
- point(&screen, p1, ~0, S);
- cont("circle");
- rx = p3.x - p1.x;
- ry = p3.y - p1.y;
- r = (rx < ry)? rx : ry;
- fprintf(stderr, "circle(&screen, (%d,%d), %d, ~0, S)\n",
- p3.x,p3.y,r);
- circle(&screen, p3, r, ~0, S);
- cont("disc");
- fprintf(stderr, "disc(&screen, (%d,%d), %d, ~0, S)\n",
- p3.x,p3.y,r);
- disc(&screen, p3, r, ~0, S);
- cont("clipped disc");
- fprintf(stderr, "clipr(&screen, ((%d,%d)(%d,%d))\n",
- p1.x+30, p1.y+5, p3.x-30, p3.y-5);
- clipr(&screen, Rect(p1.x+30, p1.y+5, p3.x-30, p3.y-5));
- fprintf(stderr, "disc(&screen, (%d,%d), %d, ~0, S)\n",
- p3.x,p3.y,r);
- disc(&screen, p3, r, ~0, S);
- clipr(&screen, screen.r);
- cont("ellipse");
- fprintf(stderr, "ellipse(&screen, (%d,%d), %d, %d, ~0, S)\n",
- p3.x,p3.y,r,r/2);
- ellipse(&screen, p3, r, r/2, ~0, S);
- cont("arc");
- fprintf(stderr, "arc(&screen, (%d,%d), (%d,%d), (%d,%d), ~0, S)\n",
- p3.x,p3.y, p3.x+r,p3.y, p3.x+r/2,p3.x-(int)(r*.866));
- arc(&screen, p3, Pt(p3.x+r,p3.y), Pt(p3.x+r/2,p3.x-(int)(r*.866)), ~0, S);
- if(screen.ldepth > 1){
- cont("color");
- colorinit();
- p3 = p1;
- rx *= 2;
- ry *= 2;
- for(i = 0; i<Ncol; i++) {
- texture(&screen, Rpt(p3,add(p3,Pt(rx,ry/Ncol))),
- rgbbitmap[i], S);
- string(&screen, add(p3,Pt(15,15)), font, colors[i], DxorS);
- p3.y += ry/Ncol;
- }
- printcolmap();
- cont("invert colmap");
- invertcolmap();
- printcolmap();
- p3 = p1;
- for(i = 0; i<Ncol; i++) {
- texture(&screen, Rpt(p3,add(p3,Pt(rx,ry/Ncol))),
- rgbbitmap[i], S);
- string(&screen, add(p3,Pt(15,15)), font, colors[i], DxorS);
- p3.y += ry/Ncol;
- }
- cont("restore colmap");
- invertcolmap();
- }
- cont("wrbitmap, border, and bitblt(S)");
- bm = balloc(Rect(0,0,16,16), 0);
- fprintf(stderr, "border (%d,%d,%d,%d), -2, F)\n",
- p1.x, p1.y, p1.x+16, p1.y+16);
- border(&screen, Rpt(p1, add(p1,Pt(16,16))), -2, F);
- wrbitmap(bm, 0, 16, arrowset);
- fprintf(stderr, "bitblt(&screen, (%d,%d), bm, (0,0,16,16), S)\n",
- p1.x,p1.y);
- bitblt(&screen, p1, bm, Rect(0,0,16,16), S);
- cont("mouse track (button 1)");
- do{
- m = emouse();
- } while(!(m.buttons&1));
- fprintf(stderr,"test tracking\n");
- while(m.buttons&1){
- point(&screen, m.xy, ~0, S);
- m = emouse();
- }
- cursorswitch(0);
- cont("menuhit (button 3)");
- do {
- do{
- m = emouse();
- } while(!(m.buttons&4));
- n = menuhit(3, &m, &menu3);
- fprintf(stderr, "button %d\n", n);
- } while (n != 0);
- cont("keyboard (end with \\n)");
- fprintf(stderr, "type something\n");
- for (p = buf; (*p = ekbd()) != '\n' && *p != '\r'; p++) {
- fprintf(stderr, "%c", *p);
- if (*p == '\b')
- p -= 2;
- if (p < buf-1)
- p = buf-1;
- p[1] = 0;
- putstring(buf);
- }
- cont("done");
- exit(0);
-}
-
-void colorinit(void) /* set up color definitions */
-{
- int i;
-
- for (i = 0; i < Ncol; i++) {
- rgbval[i] = rgbpix(&screen, colordefs[i]);
- rgbbitmap[i] = balloc(Rect(0,0,1,1), screen.ldepth);
- point(rgbbitmap[i], Pt(0,0), rgbval[i], S);
- }
-}
-
-void printcolmap(void)
-{
- int i, n;
- RGB cmap[256];
-
- rdcolmap(&screen, cmap);
- n = 1 << (1 << screen.ldepth);
- fprintf(stderr, "colormap, %d entries\n", n);
- for(i = 0; i < n; i++)
- fprintf(stderr, "%d:\t%.8x\t%.8x\t%.8x\n",
- i, cmap[i].red, cmap[i].green, cmap[i].blue);
-}
-
-void invertcolmap(void)
-{
- int i, n;
- RGB cmap[256];
-
- rdcolmap(&screen, cmap);
- n = 1 << (1 << screen.ldepth);
- for(i = 0; i < n; i++) {
- cmap[i].red = ~cmap[i].red;
- cmap[i].green = ~cmap[i].green;
- cmap[i].blue = ~cmap[i].blue;
- }
- wrcolmap(&screen, cmap);
-}
-
-void
-putstring(char *buf)
-{
- Point p;
- static int jmax = 0, l;
-
- p = add(screen.r.min, Pt(20,20));
- bitblt(&screen, p, &screen, Rect(p.x, p.y, p.x+jmax, p.y+font->height), Zero);
- string(&screen, p, font, buf, F);
- if ((l = strwidth(font, buf)) > jmax)
- jmax = l;
-}
-
-void
-cont(char *msg)
-{
- Event ev;
- Point mp;
-
- while(event(&ev) != Ekeyboard)
- continue;
- bitblt(&screen, Pt(0,0), &screen, screen.r, Zero);
- mp = add(screen.r.min, Pt(20,20));
- string(&screen, mp, font, msg, S);
- while(event(&ev) != Ekeyboard)
- continue;
- bitblt(&screen, Pt(0,0), &screen, screen.r, Zero);
-}
-
-char *
-m3gen(int n)
-{
- static char *m3[] ={ "quit", "thing1", "thing2" };
-
- if (n < 0 || n > 2)
- return 0;
- else
- return m3[n];
-}
-
-void
-ereshaped(Rectangle r)
-{
-}
(DIR) diff --git a/libXg/xtbinit.c b/libXg/xtbinit.c
@@ -284,7 +284,7 @@ gotchar(int c, int composed)
if (eb == 0)
berror("eballoc can't malloc");
k.c = c;
- k.composed = composed;
+ k.k = composed ? Kcomposed : Kraw;
memcpy(eb->buf, &k, sizeof(Keystroke));
esrc[Skeyboard].count++;
}
@@ -696,7 +696,7 @@ pushkbd(int c)
if (eb == 0)
berror("eballoc can't malloc");
k.c = c;
- k.composed = 0;
+ k.k = Kcomposed;
memcpy(eb->buf, &k, sizeof(Keystroke));
esrc[Skeyboard].count++;
}
(DIR) diff --git a/samterm/main.c b/samterm/main.c
@@ -521,7 +521,7 @@ type(Flayer *l, int res) /* what a bloody mess this is */
break;
}
}
- if (expandtabs && c == '\t' && !k.composed){
+ if (expandtabs && c == '\t' && k.k != Kcomposed){
int col = 0, nspaces = 8, off = a;
int i;
while (off > 0 && raspc(&t->rasp, off - 1) != '\n')