alot of renaming...
[k8sterm.git] / src / tcmdline.c
blob1ddb3e72f01f9a1aabfca1312e239ff9a29353b6
1 ////////////////////////////////////////////////////////////////////////////////
2 static void tcmdlinedirty (K8Term *term, K8TCmdLine *cmdline) {
3 if (term != NULL) {
4 k8t_tmDirtyMark(term, term->row-term->topline-1, 2);
5 k8t_tmWantRedraw(term, 1);
10 static void tcmdlinefixofs (K8Term *term, K8TCmdLine *cmdline) {
11 int ofs, len;
13 len = k8t_UTF8strlen(cmdline->cmdline);
14 ofs = len-(term->col-1);
15 if (ofs < 0) ofs = 0;
16 for (cmdline->cmdofs = 0; ofs > 0; --ofs) cmdline->cmdofs += k8t_UTF8Size(cmdline->cmdline+cmdline->cmdofs);
17 tcmdlinedirty(term, cmdline);
21 static void tcmdlinehide (K8Term *term, K8TCmdLine *cmdline) {
22 cmdline->cmdMode = K8T_CMDMODE_NONE;
23 cmdline->cmdcurtabc = NULL;
24 tcmdlinedirty(term, cmdline);
28 // utf-8
29 static void tcmdlinemsg (K8Term *term, K8TCmdLine *cmdline, const char *msg) {
30 if (msg != NULL) {
31 int ofs = 0;
33 cmdline->cmdMode = K8T_CMDMODE_MESSAGE;
34 cmdline->cmdofs = 0;
35 cmdline->cmdtabpos = -1;
36 cmdline->cmdcurtabc = NULL;
38 while (*msg) {
39 int len = k8t_UTF8Size(msg);
41 if (len < 1 || ofs+len >= sizeof(cmdline->cmdline)-1) break;
42 memcpy(cmdline->cmdline+ofs, msg, len);
43 ofs += len;
44 msg += len;
47 cmdline->cmdline[ofs] = 0;
48 tcmdlinedirty(term, cmdline);
53 static __attribute__((format(printf,3,4))) void tcmdlinemsgf (K8Term *term, K8TCmdLine *cmdline, const char *fmt, ...) {
54 char buf[128];
55 char *xbuf = buf;
56 int size = sizeof(buf)-1;
57 va_list ap;
59 for (;;) {
60 int n;
61 char *t;
63 va_start(ap, fmt);
64 n = vsnprintf(xbuf, size, fmt, ap);
65 va_end(ap);
66 if (n > -1 && n < size) break;
67 if (n > -1) size = n+1; else size += 4096;
68 if (xbuf == buf) xbuf = NULL;
69 if ((t = realloc(xbuf, size)) == NULL) { if (xbuf) free(xbuf); return; }
70 xbuf = t;
72 tcmdlinemsg(term, cmdline, xbuf);
73 if (xbuf != buf) free(xbuf);
77 static void tcmdlineinitex (K8Term *term, K8TCmdLine *cmdline, const char *msg) {
78 cmdline->cmdMode = K8T_CMDMODE_INPUT;
79 cmdline->cmdofs = 0;
80 cmdline->cmdline[0] = 0;
81 cmdline->cmdc[0] = 0;
82 cmdline->cmdcl = 0;
83 cmdline->cmdtabpos = -1;
84 cmdline->cmdcurtabc = NULL;
85 cmdline->cmdreslen = 0;
86 cmdline->cmdexecfn = NULL;
87 if (msg != NULL && msg[0]) {
88 strcpy(cmdline->cmdline, msg);
89 cmdline->cmdreslen = strlen(cmdline->cmdline);
91 tcmdlinefixofs(term, cmdline);
95 static void tcmdlineinit (K8Term *term, K8TCmdLine *cmdline) {
96 tcmdlineinitex(term, cmdline, NULL);
100 static void tcmdlinechoplast (K8Term *term, K8TCmdLine *cmdline) {
101 if (cmdline->cmdcl != 0) {
102 cmdline->cmdcl = 0;
103 } else {
104 if (strlen(cmdline->cmdline) > cmdline->cmdreslen) k8t_UTF8ChopLast(cmdline->cmdline);
106 tcmdlinefixofs(term, cmdline);
110 // utf-8
111 static void tcmdaddchar (K8Term *term, K8TCmdLine *cmdline, const char *s) {
112 int len = k8t_UTF8Size(s);
114 if (len > 0) {
115 int slen = strlen(cmdline->cmdline);
117 if (slen+len < sizeof(cmdline->cmdline)) {
118 memcpy(cmdline->cmdline+slen, s, len);
119 cmdline->cmdline[slen+len] = 0;
120 tcmdlinefixofs(term, cmdline);
126 static void tcmdput (K8Term *term, K8TCmdLine *cmdline, const char *s, int len) {
127 while (len-- > 0) {
128 int ok;
130 cmdline->cmdc[cmdline->cmdcl++] = *s++;
131 cmdline->cmdc[cmdline->cmdcl] = 0;
133 if ((ok = k8t_UTF8IsFull(cmdline->cmdc, cmdline->cmdcl)) != 0 || cmdline->cmdcl == UTF_SIZ) {
134 if (ok) tcmdaddchar(term, cmdline, cmdline->cmdc);
135 cmdline->cmdcl = 0;
141 ////////////////////////////////////////////////////////////////////////////////
142 // return !0 if event was eaten
143 static int tcmdlProcessKeys (K8Term *term, K8TCmdLine *cmdline, KeySym ksym, const char *ksbuf, int ksbuflen, XKeyEvent *e) {
144 int mode = cmdline->cmdMode;
146 switch (ksym) {
147 case XK_Return:
148 tcmdlinehide(term, cmdline);
149 if (cmdline->cmdexecfn != NULL) cmdline->cmdexecfn(term, cmdline, 0);
150 else if (mode == K8T_CMDMODE_INPUT) executeCommands(cmdline->cmdline);
151 break;
152 case XK_BackSpace:
153 if (mode == K8T_CMDMODE_INPUT) {
154 tcmdlinechoplast(term, cmdline);
155 cmdline->cmdtabpos = -1;
156 cmdline->cmdcurtabc = NULL;
157 } else {
158 tcmdlinehide(term, cmdline);
159 if (cmdline->cmdexecfn != NULL) cmdline->cmdexecfn(term, cmdline, 1);
161 break;
162 case XK_Escape:
163 tcmdlinehide(term, cmdline);
164 if (cmdline->cmdexecfn != NULL) cmdline->cmdexecfn(term, cmdline, 1);
165 break;
166 case XK_Tab:
167 if (mode == K8T_CMDMODE_INPUT && cmdline->cmdline[0] && cmdline->cmdcl == 0 && cmdline->cmdexecfn == NULL) {
168 const char *cpl;
170 if (cmdline->cmdtabpos < 0) {
171 cmdline->cmdtabpos = 0;
172 while (cmdline->cmdline[cmdline->cmdtabpos] && isalnum(cmdline->cmdline[cmdline->cmdtabpos])) ++cmdline->cmdtabpos;
173 if (cmdline->cmdline[cmdline->cmdtabpos]) {
174 cmdline->cmdtabpos = -1;
175 break;
177 cmdline->cmdcurtabc = NULL;
179 cpl = findCommandCompletion(cmdline->cmdline, cmdline->cmdtabpos, cmdline->cmdcurtabc);
180 if (cpl == NULL && cmdline->cmdcurtabc != NULL) cpl = findCommandCompletion(cmdline->cmdline, cmdline->cmdtabpos, NULL);
181 cmdline->cmdcurtabc = cpl;
182 if (cpl != NULL) { strcpy(cmdline->cmdline, cpl); tcmdaddchar(term, cmdline, " "); }
183 tcmdlinefixofs(term, cmdline);
184 } else if (mode != K8T_CMDMODE_INPUT) {
185 tcmdlinehide(term, cmdline);
186 if (cmdline->cmdexecfn != NULL) cmdline->cmdexecfn(term, cmdline, 1);
188 break;
189 case XK_space:
190 if (mode != K8T_CMDMODE_INPUT) {
191 tcmdlinehide(term, cmdline);
192 break;
194 // fallthru
195 default:
196 if (mode == K8T_CMDMODE_INPUT) {
197 if (ksbuflen > 0 && (unsigned char)ksbuf[0] >= 32) {
198 tcmdput(term, cmdline, ksbuf, ksbuflen);
199 cmdline->cmdtabpos = -1;
200 cmdline->cmdcurtabc = NULL;
203 break;
206 return 1; // eat any event