Introduction
Introduction Statistics Contact Development Disclaimer Help
st-keyboard_select-0.8.2.diff - sites - public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log
Files
Refs
---
st-keyboard_select-0.8.2.diff (9969B)
---
1 From 45cadc1ce5d8d9dd3493c2e9979e8958d87e8bc5 Mon Sep 17 00:00:00 2001
2 From: Bartosz Sosna <[email protected]>
3 Date: Sat, 4 May 2019 00:28:24 +0200
4 Subject: [PATCH] Adjust patch to version st-0.8.2
5
6 ---
7 config.def.h | 1 +
8 st.c | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++
9 st.h | 1 +
10 win.h | 3 +
11 x.c | 15 ++++
12 5 files changed, 242 insertions(+)
13
14 diff --git a/config.def.h b/config.def.h
15 index 482901e..c1e9cce 100644
16 --- a/config.def.h
17 +++ b/config.def.h
18 @@ -178,6 +178,7 @@ static Shortcut shortcuts[] = {
19 { TERMMOD, XK_Y, selpaste, {.i = …
20 { ShiftMask, XK_Insert, selpaste, {.i = …
21 { TERMMOD, XK_Num_Lock, numlock, {.i = …
22 + { TERMMOD, XK_Escape, keyboard_select,{ 0 } },
23 };
24
25 /*
26 diff --git a/st.c b/st.c
27 index ede7ae6..c2116b2 100644
28 --- a/st.c
29 +++ b/st.c
30 @@ -16,6 +16,8 @@
31 #include <termios.h>
32 #include <unistd.h>
33 #include <wchar.h>
34 +#include <X11/keysym.h>
35 +#include <X11/X.h>
36
37 #include "st.h"
38 #include "win.h"
39 @@ -2464,6 +2466,9 @@ tresize(int col, int row)
40 int *bp;
41 TCursor c;
42
43 + if ( row < term.row || col < term.col )
44 + toggle_winmode(trt_kbdselect(XK_Escape, NULL, 0));
45 +
46 if (col < 1 || row < 1) {
47 fprintf(stderr,
48 "tresize: error resizing to %dx%d\n", col, row);
49 @@ -2586,3 +2591,220 @@ redraw(void)
50 tfulldirt();
51 draw();
52 }
53 +
54 +void set_notifmode(int type, KeySym ksym) {
55 + static char *lib[] = { " MOVE ", " SEL "};
56 + static Glyph *g, *deb, *fin;
57 + static int col, bot;
58 +
59 + if ( ksym == -1 ) {
60 + free(g);
61 + col = term.col, bot = term.bot;
62 + g = xmalloc(col * sizeof(Glyph));
63 + memcpy(g, term.line[bot], col * sizeof(Glyph));
64 +
65 + }
66 + else if ( ksym == -2 )
67 + memcpy(term.line[bot], g, col * sizeof(Glyph));
68 +
69 + if ( type < 2 ) {
70 + char *z = lib[type];
71 + for (deb = &term.line[bot][col - 6], fin = &term.line[bot][col]…
72 + deb->mode = ATTR_REVERSE,
73 + deb->u = *z,
74 + deb->fg = defaultfg, deb->bg = defaultbg;
75 + }
76 + else if ( type < 5 )
77 + memcpy(term.line[bot], g, col * sizeof(Glyph));
78 + else {
79 + for (deb = &term.line[bot][0], fin = &term.line[bot][col]; deb …
80 + deb->mode = ATTR_REVERSE,
81 + deb->u = ' ',
82 + deb->fg = defaultfg, deb->bg = defaultbg;
83 + term.line[bot][0].u = ksym;
84 + }
85 +
86 + term.dirty[bot] = 1;
87 + drawregion(0, bot, col, bot + 1);
88 +}
89 +
90 +void select_or_drawcursor(int selectsearch_mode, int type) {
91 + int done = 0;
92 +
93 + if ( selectsearch_mode & 1 ) {
94 + selextend(term.c.x, term.c.y, type, done);
95 + xsetsel(getsel());
96 + }
97 + else
98 + xdrawcursor(term.c.x, term.c.y, term.line[term.c.y][term.c.x],
99 + term.ocx, term.ocy, term.line[term.ocy][term.ocx]);
100 +}
101 +
102 +void search(int selectsearch_mode, Rune *target, int ptarget, int incr,…
103 + Rune *r;
104 + int i, bound = (term.col * cu->y + cu->x) * (incr > 0) + incr;
105 +
106 + for (i = term.col * term.c.y + term.c.x + incr; i != bound; i += in…
107 + for (r = target; r - target < ptarget; r++) {
108 + if ( *r == term.line[(i + r - target) / term.col][(i + r - …
109 + if ( r - target == ptarget - 1 ) break;
110 + } else {
111 + r = NULL;
112 + break;
113 + }
114 + }
115 + if ( r != NULL ) break;
116 + }
117 +
118 + if ( i != bound ) {
119 + term.c.y = i / term.col, term.c.x = i % term.col;
120 + select_or_drawcursor(selectsearch_mode, type);
121 + }
122 +}
123 +
124 +int trt_kbdselect(KeySym ksym, char *buf, int len) {
125 + static TCursor cu;
126 + static Rune target[64];
127 + static int type = 1, ptarget, in_use;
128 + static int sens, quant;
129 + static char selectsearch_mode;
130 + int i, bound, *xy;
131 +
132 +
133 + if ( selectsearch_mode & 2 ) {
134 + if ( ksym == XK_Return ) {
135 + selectsearch_mode ^= 2;
136 + set_notifmode(selectsearch_mode, -2);
137 + if ( ksym == XK_Escape ) ptarget = 0;
138 + return 0;
139 + }
140 + else if ( ksym == XK_BackSpace ) {
141 + if ( !ptarget ) return 0;
142 + term.line[term.bot][ptarget--].u = ' ';
143 + }
144 + else if ( len < 1 ) {
145 + return 0;
146 + }
147 + else if ( ptarget == term.col || ksym == XK_Escape ) {
148 + return 0;
149 + }
150 + else {
151 + utf8decode(buf, &target[ptarget++], len);
152 + term.line[term.bot][ptarget].u = target[ptarget - 1];
153 + }
154 +
155 + if ( ksym != XK_BackSpace )
156 + search(selectsearch_mode, &target[0], ptarget, sens, type, …
157 +
158 + term.dirty[term.bot] = 1;
159 + drawregion(0, term.bot, term.col, term.bot + 1);
160 + return 0;
161 + }
162 +
163 + switch ( ksym ) {
164 + case -1 :
165 + in_use = 1;
166 + cu.x = term.c.x, cu.y = term.c.y;
167 + set_notifmode(0, ksym);
168 + return MODE_KBDSELECT;
169 + case XK_s :
170 + if ( selectsearch_mode & 1 )
171 + selclear();
172 + else
173 + selstart(term.c.x, term.c.y, 0);
174 + set_notifmode(selectsearch_mode ^= 1, ksym);
175 + break;
176 + case XK_t :
177 + selextend(term.c.x, term.c.y, type ^= 3, i = 0); /* 2 fois */
178 + selextend(term.c.x, term.c.y, type, i = 0);
179 + break;
180 + case XK_slash :
181 + case XK_KP_Divide :
182 + case XK_question :
183 + ksym &= XK_question; /* Divide to slash */
184 + sens = (ksym == XK_slash) ? -1 : 1;
185 + ptarget = 0;
186 + set_notifmode(15, ksym);
187 + selectsearch_mode ^= 2;
188 + break;
189 + case XK_Escape :
190 + if ( !in_use ) break;
191 + selclear();
192 + case XK_Return :
193 + set_notifmode(4, ksym);
194 + term.c.x = cu.x, term.c.y = cu.y;
195 + select_or_drawcursor(selectsearch_mode = 0, type);
196 + in_use = quant = 0;
197 + return MODE_KBDSELECT;
198 + case XK_n :
199 + case XK_N :
200 + if ( ptarget )
201 + search(selectsearch_mode, &target[0], ptarget, (ksym == XK_…
202 + break;
203 + case XK_BackSpace :
204 + term.c.x = 0;
205 + select_or_drawcursor(selectsearch_mode, type);
206 + break;
207 + case XK_dollar :
208 + term.c.x = term.col - 1;
209 + select_or_drawcursor(selectsearch_mode, type);
210 + break;
211 + case XK_Home :
212 + term.c.x = 0, term.c.y = 0;
213 + select_or_drawcursor(selectsearch_mode, type);
214 + break;
215 + case XK_End :
216 + term.c.x = cu.x, term.c.y = cu.y;
217 + select_or_drawcursor(selectsearch_mode, type);
218 + break;
219 + case XK_Page_Up :
220 + case XK_Page_Down :
221 + term.c.y = (ksym == XK_Prior ) ? 0 : cu.y;
222 + select_or_drawcursor(selectsearch_mode, type);
223 + break;
224 + case XK_exclam :
225 + term.c.x = term.col >> 1;
226 + select_or_drawcursor(selectsearch_mode, type);
227 + break;
228 + case XK_asterisk :
229 + case XK_KP_Multiply :
230 + term.c.x = term.col >> 1;
231 + case XK_underscore :
232 + term.c.y = cu.y >> 1;
233 + select_or_drawcursor(selectsearch_mode, type);
234 + break;
235 + default :
236 + if ( ksym >= XK_0 && ksym <= XK_9 ) { /* 0-9 keyb…
237 + quant = (quant * 10) + (ksym ^ XK_0);
238 + return 0;
239 + }
240 + else if ( ksym >= XK_KP_0 && ksym <= XK_KP_9 ) { /* 0-9 nump…
241 + quant = (quant * 10) + (ksym ^ XK_KP_0);
242 + return 0;
243 + }
244 + else if ( ksym == XK_k || ksym == XK_h )
245 + i = ksym & 1;
246 + else if ( ksym == XK_l || ksym == XK_j )
247 + i = ((ksym & 6) | 4) >> 1;
248 + else if ( (XK_Home & ksym) != XK_Home || (i = (ksym ^ XK_Home) …
249 + break;
250 +
251 + xy = (i & 1) ? &term.c.y : &term.c.x;
252 + sens = (i & 2) ? 1 : -1;
253 + bound = (i >> 1 ^ 1) ? 0 : (i ^ 3) ? term.col - 1 : term.bot;
254 +
255 + if ( quant == 0 )
256 + quant++;
257 +
258 + if ( *xy == bound && ((sens < 0 && bound == 0) || (sens > 0 && …
259 + break;
260 +
261 + *xy += quant * sens;
262 + if ( *xy < 0 || ( bound > 0 && *xy > bound) )
263 + *xy = bound;
264 +
265 + select_or_drawcursor(selectsearch_mode, type);
266 + }
267 + quant = 0;
268 + return 0;
269 +}
270 diff --git a/st.h b/st.h
271 index 4da3051..22125e4 100644
272 --- a/st.h
273 +++ b/st.h
274 @@ -109,6 +109,7 @@ size_t utf8encode(Rune, char *);
275 void *xmalloc(size_t);
276 void *xrealloc(void *, size_t);
277 char *xstrdup(char *);
278 +int trt_kbdselect(KeySym, char *, int);
279
280 /* config.h globals */
281 extern char *utmp;
282 diff --git a/win.h b/win.h
283 index a6ef1b9..a240783 100644
284 --- a/win.h
285 +++ b/win.h
286 @@ -21,6 +21,7 @@ enum win_mode {
287 MODE_NUMLOCK = 1 << 17,
288 MODE_MOUSE = MODE_MOUSEBTN|MODE_MOUSEMOTION|MODE_MOUSEX10\
289 |MODE_MOUSEMANY,
290 + MODE_KBDSELECT = 1 << 18,
291 };
292
293 void xbell(void);
294 @@ -36,4 +37,6 @@ void xsetmode(int, unsigned int);
295 void xsetpointermotion(int);
296 void xsetsel(char *);
297 int xstartdraw(void);
298 +void toggle_winmode(int);
299 +void keyboard_select(const Arg *);
300 void xximspot(int, int);
301 diff --git a/x.c b/x.c
302 index 5828a3b..5221641 100644
303 --- a/x.c
304 +++ b/x.c
305 @@ -1731,6 +1731,13 @@ kpress(XEvent *ev)
306 return;
307
308 len = XmbLookupString(xw.xic, e, buf, sizeof buf, &ksym, &statu…
309 + if ( IS_SET(MODE_KBDSELECT) ) {
310 + if ( match(XK_NO_MOD, e->state) ||
311 + (XK_Shift_L | XK_Shift_R) & e->state )
312 + win.mode ^= trt_kbdselect(ksym, buf, len);
313 + return;
314 + }
315 +
316 /* 1. shortcuts */
317 for (bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) {
318 if (ksym == bp->keysym && match(bp->mod, e->state)) {
319 @@ -1914,6 +1921,14 @@ usage(void)
320 " [stty_args ...]\n", argv0, argv0);
321 }
322
323 +void toggle_winmode(int flag) {
324 + win.mode ^= flag;
325 +}
326 +
327 +void keyboard_select(const Arg *dummy) {
328 + win.mode ^= trt_kbdselect(-1, NULL, 0);
329 +}
330 +
331 int
332 main(int argc, char *argv[])
333 {
334 --
335 2.17.1
336
You are viewing proxied material from suckless.org. 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.