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