Introduction
Introduction Statistics Contact Development Disclaimer Help
Make command handling much more extensible. - sam - An updated version of the s…
git clone git://vernunftzentrum.de/sam.git
Log
Files
Refs
LICENSE
---
commit d7decab5435ea7d2ad95a1c413a15a11c68df625
parent fae7a1407b0bb5b9104a5541307df3210c4c7fef
Author: Rob King <[email protected]>
Date: Thu, 11 Aug 2016 22:17:44 -0500
Make command handling much more extensible.
Diffstat:
README.rst | 8 +++++++-
commands.h.def | 39 +++++++++++++++++++++++++++++++
config.h | 2 ++
config.h.def | 2 ++
config.mk.def | 15 +++++++++++++++
include/commands.h | 7 ++++++-
libXg/gwin.c | 134 ++++++++-----------------------
samterm/main.c | 6 +++---
8 files changed, 107 insertions(+), 106 deletions(-)
---
diff --git a/README.rst b/README.rst
@@ -21,7 +21,13 @@ Installation
Basic Installation
-------------------
-Installation is fairly simple: edit `config.mk` and `config.h` and then run ma…
+Installation and configuration is fairly simple:
+
+- Copy `config.mk.def` to `config.mk` and modify as needed.
+- Copy `config.h.def` to `config.h` and modify as needed.
+- Copy `commands.h.def` to `commands.h` and modify as needed.
+- Run `make clean all`
+- Run `make install` or, if needed, `sudo make install`
The `sam` command runs sam.
The `B` command adds a new file to a running instance of sam, or starts sam if…
diff --git a/commands.h.def b/commands.h.def
@@ -0,0 +1,39 @@
+{COMMANDMASK, XK_e, Kcommand, Clineup},
+{COMMANDMASK, XK_x, Kcommand, Clinedown},
+{COMMANDMASK, XK_d, Kcommand, Ccharright},
+{COMMANDMASK, XK_s, Kcommand, Ccharleft},
+{COMMANDMASK, XK_u, Kcommand, Cdelbol},
+{COMMANDMASK, XK_w, Kcommand, Cdelword},
+{COMMANDMASK, XK_k, Kcommand, Cjump},
+
+{0, XK_Up, Kcommand, Cscrollup},
+{0, XK_Prior, Kcommand, Cscrollup},
+{0, XK_Left, Kcommand, Cscrollup},
+{0, XK_Down, Kcommand, Cscrolldown},
+{0, XK_Next, Kcommand, Cscrolldown},
+{0, XK_Right, Kcommand, Cscrolldown},
+
+{0, XK_Escape, Kcommand, Cescape},
+{0, XK_BackSpace, Kcommand, Cdel},
+{0, XK_Delete, Kcommand, Cdel},
+
+{0, XK_Return, Kraw, '\n'},
+{0, XK_KP_Enter, Kraw, '\n'},
+{0, XK_Linefeed, Kraw, '\r'},
+{0, XK_Tab, Kraw, '\t'},
+{0, XK_KP_0, Kraw, '0'},
+{0, XK_KP_1, Kraw, '1'},
+{0, XK_KP_2, Kraw, '2'},
+{0, XK_KP_3, Kraw, '3'},
+{0, XK_KP_4, Kraw, '4'},
+{0, XK_KP_5, Kraw, '5'},
+{0, XK_KP_6, Kraw, '6'},
+{0, XK_KP_7, Kraw, '7'},
+{0, XK_KP_8, Kraw, '8'},
+{0, XK_KP_9, Kraw, '9'},
+{0, XK_KP_Divide, Kraw, '/'},
+{0, XK_KP_Multiply, Kraw, '*'},
+{0, XK_KP_Subtract, Kraw, '-'},
+{0, XK_KP_Add, Kraw, '+'},
+{0, XK_KP_Decimal, Kraw, '.'},
+{0, XK_hyphen, Kraw, '-'},
diff --git a/config.h b/config.h
@@ -19,6 +19,8 @@
#define CHARLEFT 0x13 /* Ctrl-S */
#define CHARRIGHT 0x04 /* Ctrl-D */
#define COMMANDKEY 0x0B /* Ctrl-K */
+#define DELWORD 0x17 /* Ctrl-W */
+#define DELBOL 0x15 /* Ctrl-U */
/* The remote shell to use for remote connections. */
#define RXPATH "/usr/bin/ssh"
diff --git a/config.h.def b/config.h.def
@@ -19,6 +19,8 @@
#define CHARLEFT 0x13 /* Ctrl-S */
#define CHARRIGHT 0x04 /* Ctrl-D */
#define COMMANDKEY 0x0B /* Ctrl-K */
+#define DELWORD 0x17 /* Ctrl-W */
+#define DELBOL 0x15 /* Ctrl-U */
/* The remote shell to use for remote connections. */
#define RXPATH "/usr/bin/ssh"
diff --git a/config.mk.def b/config.mk.def
@@ -0,0 +1,15 @@
+# config.mk - makefile configuration for sam
+# copyright 2015 Rob King <[email protected]>
+
+# DESTDIR is the root of the installation tree
+DESTDIR?=/usr/local
+
+# BINDIR is the directory where binaries go
+BINDIR?=$(DESTDIR)/bin
+
+# MANDIR is where manual pages go
+MANDIR?=$(DESTDIR)/share/man/man1
+
+# FREETYPEINC should name the directory of your freetype2 includes.
+FREETYPEINC?=/usr/include/freetype2
+
diff --git a/include/commands.h b/include/commands.h
@@ -5,10 +5,12 @@ enum{
Knone,
Kraw,
Kcomposed,
- Kcommand
+ Kcommand,
+ Kend
};
enum{
+ Cnone,
Cescape,
Cscrolldown,
Cscrollup,
@@ -20,6 +22,9 @@ enum{
Cdelword,
Cdelbol,
Cdel,
+ Csnarf,
+ Ccut,
+ Cpaste,
Cmax
}; /* virtual command keystrokes */
diff --git a/libXg/gwin.c b/libXg/gwin.c
@@ -166,6 +166,20 @@ Mappingaction(Widget w, XEvent *e, String *p, Cardinal *np)
for (c = 0; c < composing; c++) \
(*f)(compose[c], 0)
+typedef struct Keymapping Keymapping;
+struct Keymapping{
+ int mask;
+ int sym;
+ int kind;
+ int result;
+};
+
+#define COMMANDMASK ControlMask
+Keymapping keymappings[] ={
+ #include "../commands.h"
+ {0, 0, Kend, 0}
+};
+
static void
Keyaction(Widget w, XEvent *e, String *p, Cardinal *np)
{
@@ -186,8 +200,22 @@ Keyaction(Widget w, XEvent *e, String *p, Cardinal *np)
*/
if(e->xany.type != KeyPress)
return;
- XtTranslateKeycode(e->xany.display, (KeyCode)e->xkey.keycode,
- e->xkey.state, &md, &k);
+
+ XtTranslateKeycode(e->xany.display, (KeyCode)e->xkey.keycode, e->xkey.…
+
+ /* Check to see if it's a specially-handled key first. */
+ Keymapping *m = keymappings;
+ while (m->kind != Kend){
+ if (e->xkey.state == m->mask && k == m->sym){
+ f = ((GwinWidget)w)->gwin.gotchar;
+ if(f)
+ (*f)(m->result, m->kind);
+ return;
+ }
+
+ m++;
+ }
+
/*
* The following song and dance is so we can have our chosen
* modifier key behave like a compose key, i.e, press and release
@@ -208,84 +236,15 @@ Keyaction(Widget w, XEvent *e, String *p, Cardinal *np)
}
return;
}
+
/* Handle Multi_key separately, since it isn't a modifier */
if(k == XK_Multi_key) {
composing = -1;
return;
}
- if(k == NoSymbol)
- return;
-
- if (k & 0xFF00){
- switch(k){
- case XK_Escape:
- kind = Kcommand;
- k = Cescape;
- break;
-
- case XK_BackSpace:
- case XK_Delete:
- kind = Kcommand;
- k = Cdel;
- break;
-
- case XK_Tab:
- case XK_KP_0:
- case XK_KP_1:
- case XK_KP_2:
- case XK_KP_3:
- case XK_KP_4:
- case XK_KP_5:
- case XK_KP_6:
- case XK_KP_7:
- case XK_KP_8:
- case XK_KP_9:
- case XK_KP_Divide:
- case XK_KP_Multiply:
- case XK_KP_Subtract:
- case XK_KP_Add:
- case XK_KP_Decimal:
- k &= 0x7F;
- break;
-
- case XK_Linefeed:
- k = '\r';
- break;
-
- case XK_KP_Enter:
- case XK_Return:
- k = '\n';
- break;
-
- case XK_Up:
- case XK_Prior:
- case XK_Left:
- kind = Kcommand;
- k = Cscrollup;
- break;
-
- case XK_Right:
- case XK_Next:
- case XK_Down:
- kind = Kcommand;
- k = Cscrolldown;
- break;
-
- default:
- return; /* not ISO-1 or tty control */
- }
- }
- /* Compensate for servers that call a minus a hyphen */
- if (k == XK_hyphen)
- k = XK_minus;
-
- /* Do control mapping ourselves if translator doesn't */
- if ((e->xkey.state & ControlMask) && !(md & ControlMask))
- k &= 0x9f;
-
- if(k == NoSymbol)
- return;
+ if(k == NoSymbol || k > 0xff00)
+ return;
/* Check to see if we are in a composition sequence */
if (!((GwinWidget)w)->gwin.compose && (e->xkey.state & Mod1Mask)
@@ -329,33 +288,6 @@ Keyaction(Widget w, XEvent *e, String *p, Cardinal *np)
if (composing >= -1)
return;
- switch (c){
- case LINEUP:
- kind = Kcommand;
- c = Clineup;
- break;
-
- case LINEDOWN:
- kind = Kcommand;
- c = Clinedown;
- break;
-
- case CHARLEFT:
- kind = Kcommand;
- c = Ccharleft;
- break;
-
- case CHARRIGHT:
- kind = Kcommand;
- c = Ccharright;
- break;
-
- case COMMANDKEY:
- kind = Kcommand;
- c = Cjump;
- break;
- }
-
f = ((GwinWidget)w)->gwin.gotchar;
if(f)
(*f)(c, kind);
diff --git a/samterm/main.c b/samterm/main.c
@@ -680,7 +680,7 @@ typedef long (*Commandfunc)(Flayer *, long, Text *);
typedef struct CommandEntry CommandEntry;
struct CommandEntry{
Commandfunc f;
- int lock;
+ int unlocked;
};
CommandEntry commands[Cmax] ={
@@ -760,8 +760,8 @@ type(Flayer *l, int res) /* what a bloody mess this …
}
if (k.k == Kcommand){
- CommandEntry *e = &commands[k.k];
- if (e->lock == 0 || !lock)
+ CommandEntry *e = &commands[k.c];
+ if (!e->unlocked || !lock)
a = e->f(l, a, t);
}
You are viewing proxied material from vernunftzentrum.de. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.