3 * Keith Bostic. All rights reserved.
5 * See the LICENSE file for redistribution information.
11 static const char sccsid
[] = "$Id: v_event.c,v 8.14 1997/04/12 17:19:22 bostic Exp $ (Berkeley) $Date: 1997/04/12 17:19:22 $";
14 #include <sys/types.h>
15 #include <sys/queue.h>
18 #include <bitstring.h>
27 #include "../common/common.h"
28 #include "../ipc/ip.h"
43 * We want to scroll the screen, without changing the cursor position.
44 * So, we fill the screen map and then flush it to the screen. Then,
45 * set the VIP_S_REFRESH flag so the main vi loop doesn't update the
46 * screen. When the next real command happens, the refresh code will
47 * notice that the screen map is way wrong and fix it.
50 * There may be a serious performance problem here -- we're doing no
51 * optimization whatsoever, which means that we're copying the entire
52 * screen out to the X11 screen code on each change.
54 if (vs_sm_fill(sp
, vp
->ev
.e_lno
, P_TOP
))
56 for (smp
= HMAP
; smp
<= TMAP
; ++smp
) {
58 if (vs_line(sp
, smp
, NULL
, NULL
))
62 F_SET(VIP(sp
), VIP_S_REFRESH
);
64 return (sp
->gp
->scr_refresh(sp
, 0));
78 ex_cinit(sp
, &cmd
, C_EDIT
, 0, OOBLNO
, OOBLNO
, 0);
79 argv_exp0(sp
, &cmd
, vp
->ev
.e_csp
, vp
->ev
.e_len
);
80 return (v_exec_ex(sp
, vp
, &cmd
));
85 * Set an option value.
93 return (api_opts_set(sp
,
94 vp
->ev
.e_str1
, vp
->ev
.e_str2
, vp
->ev
.e_val1
, vp
->ev
.e_val1
));
99 * Edit in a split screen.
108 ex_cinit(sp
, &cmd
, C_EDIT
, 0, OOBLNO
, OOBLNO
, 0);
109 F_SET(&cmd
, E_NEWSCREEN
);
110 argv_exp0(sp
, &cmd
, vp
->ev
.e_csp
, vp
->ev
.e_len
);
111 return (v_exec_ex(sp
, vp
, &cmd
));
128 ex_cinit(sp
, &cmd
, C_TAG
, 0, OOBLNO
, OOBLNO
, 0);
129 argv_exp0(sp
, &cmd
, VIP(sp
)->keyw
, strlen(VIP(sp
)->keyw
));
130 return (v_exec_ex(sp
, vp
, &cmd
));
135 * Tag on the supplied string.
144 ex_cinit(sp
, &cmd
, C_TAG
, 0, OOBLNO
, OOBLNO
, 0);
145 argv_exp0(sp
, &cmd
, vp
->ev
.e_csp
, vp
->ev
.e_len
);
146 return (v_exec_ex(sp
, vp
, &cmd
));
151 * Tag in a split screen.
163 ex_cinit(sp
, &cmd
, C_TAG
, 0, OOBLNO
, OOBLNO
, 0);
164 F_SET(&cmd
, E_NEWSCREEN
);
165 argv_exp0(sp
, &cmd
, VIP(sp
)->keyw
, strlen(VIP(sp
)->keyw
));
166 return (v_exec_ex(sp
, vp
, &cmd
));
180 ex_cinit(sp
, &cmd
, C_QUIT
, 0, OOBLNO
, OOBLNO
, 0);
181 return (v_exec_ex(sp
, vp
, &cmd
));
186 * Repaint selected lines from the screen.
188 * PUBLIC: int v_erepaint __P((SCR *, EVENT *));
197 for (; evp
->e_flno
<= evp
->e_tlno
; ++evp
->e_flno
) {
198 smp
= HMAP
+ evp
->e_flno
- 1;
200 if (vs_line(sp
, smp
, NULL
, NULL
))
218 smp
= HMAP
+ evp
->e_lno
;
225 vip
->sel
.lno
= smp
->lno
;
227 vs_colpos(sp
, smp
->lno
, evp
->e_cno
+ (smp
->soff
- 1) * sp
->cols
);
243 smp
= HMAP
+ evp
->e_lno
;
250 vip
->sel
.lno
= smp
->lno
;
252 vs_colpos(sp
, smp
->lno
, evp
->e_cno
+ (smp
->soff
- 1) * sp
->cols
);
258 * Write and quit command.
267 ex_cinit(sp
, &cmd
, C_WQ
, 0, OOBLNO
, OOBLNO
, 0);
270 if (db_last(sp
, &cmd
.addr2
.lno
))
272 return (v_exec_ex(sp
, vp
, &cmd
));
286 ex_cinit(sp
, &cmd
, C_WRITE
, 0, OOBLNO
, OOBLNO
, 0);
289 if (db_last(sp
, &cmd
.addr2
.lno
))
291 return (v_exec_ex(sp
, vp
, &cmd
));
305 ex_cinit(sp
, &cmd
, C_WRITE
, 0, OOBLNO
, OOBLNO
, 0);
306 argv_exp0(sp
, &cmd
, vp
->ev
.e_csp
, vp
->ev
.e_len
);
309 if (db_last(sp
, &cmd
.addr2
.lno
))
311 return (v_exec_ex(sp
, vp
, &cmd
));
316 * Find the event associated with a fucntion.
318 * PUBLIC: int v_event __P((SCR *, VICMD *));
325 /* This array maps events to vi command functions. */
326 static VIKEYS
const vievents
[] = {
327 #define V_C_SETTOP 0 /* VI_C_SETTOP */
329 #define V_EDIT 1 /* VI_EDIT */
331 #define V_EDITOPT 2 /* VI_EDITOPT */
333 #define V_EDITSPLIT 3 /* VI_EDITSPLIT */
335 #define V_EMARK 4 /* VI_MOUSE_MOVE */
336 {v_emark
, V_ABS_L
|V_MOVE
},
337 #define V_QUIT 5 /* VI_QUIT */
339 #define V_SEARCH 6 /* VI_SEARCH */
340 {v_esearch
, V_ABS_L
|V_MOVE
},
341 #define V_TAG 7 /* VI_TAG */
343 #define V_TAGAS 8 /* VI_TAGAS */
345 #define V_TAGSPLIT 9 /* VI_TAGSPLIT */
347 #define V_WQ 10 /* VI_WQ */
349 #define V_WRITE 11 /* VI_WRITE */
351 #define V_WRITEAS 12 /* VI_WRITEAS */
355 switch (vp
->ev
.e_ipcom
) {
357 vp
->kp
= &vikeys
['0'];
360 vp
->kp
= &vikeys
['G'];
363 vp
->kp
= &vikeys
['x'];
367 vp
->count
= vp
->ev
.e_lno
;
368 vp
->kp
= &vikeys
['\012'];
371 vp
->kp
= &vikeys
['$'];
374 vp
->kp
= &vikeys
['i'];
377 vp
->kp
= &vikeys
['\010'];
381 vp
->count
= vp
->ev
.e_lno
;
382 vp
->kp
= &vikeys
['\006'];
386 vp
->count
= vp
->ev
.e_lno
;
387 vp
->kp
= &vikeys
['\002'];
390 vp
->kp
= &vikeys
['\040'];
393 vp
->kp
= &vievents
[V_SEARCH
];
396 vp
->kp
= &vievents
[V_C_SETTOP
];
401 vp
->kp
= &vikeys
['G'];
405 vp
->count
= vp
->ev
.e_lno
;
406 vp
->kp
= &vikeys
['\020'];
409 vp
->kp
= &vievents
[V_EDIT
];
412 vp
->kp
= &vievents
[V_EDITOPT
];
415 vp
->kp
= &vievents
[V_EDITSPLIT
];
418 vp
->kp
= &vievents
[V_EMARK
];
421 v_sel_end(sp
, &vp
->ev
);
422 /* XXX RETURN IGNORE */
425 v_sel_start(sp
, &vp
->ev
);
426 /* XXX RETURN IGNORE */
429 vp
->kp
= &vievents
[V_QUIT
];
432 vp
->kp
= &vievents
[V_TAG
];
435 vp
->kp
= &vievents
[V_TAGAS
];
438 vp
->kp
= &vievents
[V_TAGSPLIT
];
441 vp
->kp
= &vikeys
['u'];
444 vp
->kp
= &vievents
[V_WQ
];
447 vp
->kp
= &vievents
[V_WRITE
];
450 vp
->kp
= &vievents
[V_WRITEAS
];