1 /* keypress.c -- keyboard input support for xspringies
2 * Copyright (C) 1991,1992 Douglas M. DeCarlo
3 *
4 * This file is part of XSpringies, a mass and spring simulation system for X
5 *
6 * XSpringies is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 1, or (at your option)
9 * any later version.
10 *
11 * XSpringies is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with XSpringies; see the file COPYING. If not, write to
18 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 */
21
22 #include "defs.h"
23 #include <X11/Xlib.h>
24 #include <X11/keysym.h>
25
26 /* key_press: process a key press of key */
key_press(key,ksym,win)27 void key_press(key, ksym, win)
28 int key;
29 KeySym ksym;
30 Window win;
31 {
32 int i;
33 static char cutbuff[MAXPATH];
34
35 switch (ksym) {
36 case XK_BackSpace:
37 case XK_Delete:
38 key = K_DELETE;
39 break;
40 case XK_Return:
41 key = K_RETURN;
42 break;
43 case XK_Escape:
44 key = K_ESCAPE;
45 break;
46 }
47
48 /* Check for widget keyboard input */
49 if (key_widgets(key, win))
50 return;
51
52 if (file_op != F_NONE) {
53 int len;
54
55 len = strlen(filename);
56
57 if (ksym == XK_BackSpace || ksym == XK_Delete) {
58 if (len > 0 && cursor_pos > 0) {
59 for (i = cursor_pos-1; i < len; i++) {
60 filename[i] = filename[i+1];
61 }
62 cursor_pos--;
63 }
64 } else if (ksym == XK_Return) {
65 if (!file_command(filename, file_op))
66 file_error();
67 file_op = F_NONE;
68 } else if (ksym == XK_Escape) {
69 file_op = F_NONE;
70 } else if (ksym == XK_Left || key == '\002') {
71 /* control-b */
72 if (cursor_pos > 0)
73 cursor_pos--;
74 } else if (ksym == XK_Right || key == '\006') {
75 /* control-f */
76 if (cursor_pos < len)
77 cursor_pos++;
78 } else if (ksym == XK_Begin || ksym == XK_Home || key == '\001') {
79 /* control-a */
80 cursor_pos = 0;
81 } else if (ksym == XK_End || key == '\005') {
82 /* control-e */
83 cursor_pos = len;
84 } else if (ksym == XK_Clear || key == '\025') {
85 /* control-u */
86 filename[0] = '\0';
87 cursor_pos = 0;
88 } else if (ksym == XK_Tab) {
89 /* File complete ... */
90
91 } else if (key != '\0') {
92 switch (key) {
93 case '\004': /* control-d */
94 if (len > 0 && cursor_pos < len) {
95 for (i = cursor_pos; i < len; i++) {
96 filename[i] = filename[i+1];
97 }
98 }
99 break;
100
101 case '\013': /* control-k */
102 strcpy(cutbuff, filename + cursor_pos);
103 filename[cursor_pos] = '\0';
104 break;
105 case '\031': /* control-y */
106 {
107 int cblen = strlen(cutbuff);
108
109 if (len + cblen < MAXPATH) {
110 for (i = len; i >= cursor_pos; i--) {
111 filename[i + cblen] = filename[i];
112 }
113 for (i = 0; i < cblen; i++) {
114 filename[i + cursor_pos] = cutbuff[i];
115 }
116 cursor_pos += cblen;
117 }
118 }
119 break;
120
121 case '\024': /* control-t */
122 if (cursor_pos > 0 && len > 1) {
123 char tempc;
124 int cpos;
125
126 cpos = (cursor_pos == len) ? cursor_pos-1 : cursor_pos;
127
128 tempc = filename[cpos-1];
129 filename[cpos-1] = filename[cpos];
130 filename[cpos] = tempc;
131
132 if (cursor_pos < len)
133 cursor_pos++;
134 }
135 break;
136
137 default:
138 if (len < MAXPATH - 1 && key >= ' ') {
139 for (i = len+1; i > cursor_pos; i--) {
140 filename[i] = filename[i-1];
141 }
142 filename[cursor_pos] = key;
143 cursor_pos++;
144 }
145 }
146 }
147
148 disp_filename(FALSE);
149 return;
150 }
151
152 switch (key) {
153 case K_DELETE:
154 delete_selected();
155 review_system(TRUE);
156 break;
157 case 'Q':
158 fatal(NULL);
159 break;
160 case 0x0c:
161 /* ^L is redraw screen */
162 review_system(TRUE);
163 break;
164 default:
165 break;
166 }
167 }
168