|
|
1.1 root 1: #ifndef lint
2: static char *rcsid = "$Header: initial.c,v 10.6 86/12/17 20:34:22 swick Exp $";
3: #endif lint
4: #ifdef sun
5: /*
6: * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided
7: * for unrestricted use provided that this legend is included on all tape
8: * media and as a part of the software program in whole or part. Users
9: * may copy or modify these drivers without charge, but are not authorized
10: * to license or distribute them to anyone else except as part of a product or
11: * program developed by the user.
12: *
13: * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND
14: * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A
15: * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE
16: * PRACTICE.
17: *
18: * The Sun X Drivers are provided with no support and without any obligation
19: * on the part of Sun Microsystems, Inc. to assist in their use, correction,
20: * modification or enhancement.
21: *
22: * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
23: * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X
24: * DRIVERS OR ANY PART THEREOF.
25: *
26: * In no event will Sun Microsystems, Inc. be liable for any lost revenue
27: * or profits or other special, indirect and consequential damages, even if
28: * Sun has been advised of the possibility of such damages.
29: *
30: * Sun Microsystems, Inc.
31: * 2550 Garcia Avenue
32: * Mountain View, California 94043
33: */
34:
35: #ifndef lint
36: static char sccsid[] = "@(#)initial.c 1.2 86/08/26 Copyright 1986 Sun Micro";
37: #endif
38:
39: /*-
40: * Copyright 1985, Massachusetts Institute of Technology
41: * Copyright (c) 1986 by Sun Microsystems, Inc.
42: */
43:
44: /* initial.c Routines to open & close display
45: *
46: * OpenDisplay Open it
47: * InitDisplay Download it
48: * DisplayDead Check if dead
49: * Allocate_space Allocate some temporary storage
50: *
51: */
52:
53: /*
54: * ToDo:
55: * Look in environment/defaults for programs to start
56: */
57:
58:
59: #include <stdio.h>
60: #include <fcntl.h>
61: #include <errno.h>
62: #include <sys/time.h>
63: #include <sys/ioctl.h>
64: #include <sys/signal.h>
65: #include <sun/fbio.h>
66: #include "Xsun.h"
67: #include <pixrect/pixrect_hs.h>
68: #include <sunwindow/rect.h>
69: #include <sunwindow/rectlist.h>
70: #include <sunwindow/pixwin.h>
71: #include <sunwindow/win_screen.h>
72: #include <sunwindow/win_struct.h>
73: #include <sunwindow/win_input.h>
74: #include <sundev/kbd.h>
75: #include <sundev/kbio.h>
76:
77: extern int InputReader();
78:
79: struct pixwin *Display;
80: struct pixrect *PixRect;
81: u_char InvPix[256];
82:
83: short Sun_From_X_Op[] = {
84: PIX_CLR, /* GXclear */
85: PIX_SRC&PIX_DST, /* GXand */
86: PIX_SRC&PIX_NOT(PIX_DST), /* GXandReverse */
87: PIX_SRC, /* GXcopy */
88: PIX_NOT(PIX_SRC)&PIX_DST, /* GXandInverted */
89: PIX_DST, /* GXnoop */
90: PIX_SRC^PIX_DST, /* GXxor */
91: PIX_SRC|PIX_DST, /* GXor */
92: PIX_NOT(PIX_SRC)&PIX_NOT(PIX_DST), /* GXnor */
93: PIX_NOT(PIX_SRC)^PIX_DST, /* GXequiv */
94: PIX_NOT(PIX_DST), /* GXinvert */
95: PIX_SRC|PIX_NOT(PIX_DST), /* GXorReverse */
96: PIX_NOT(PIX_SRC), /* GXcopyInverted */
97: PIX_NOT(PIX_SRC)|PIX_DST, /* GXorInverted */
98: PIX_NOT(PIX_SRC)|PIX_NOT(PIX_DST), /* GXnand */
99: PIX_SET, /* GXset */
100: };
101:
102: int vsdev = -1;
103: extern int errno;
104: DEVICE *CurrentDevice;
105:
106: #define PARENT "WINDOW_GFX"
107: /* Open the display */
108: static char *parent;
109:
110: #ifdef RAW_KBD
111: struct kiockey sunkeymap[128*5];
112: #endif
113:
114: /*ARGSUSED*/
115: OpenDisplay (devname)
116: char *devname;
117: {
118: struct screen sc;
119: extern char *getenv();
120:
121: signal (SIGWINCH, SIG_IGN);
122: parent = getenv(PARENT);
123: bzero((caddr_t) & sc, sizeof sc);
124: if (*devname != '/')
125: devname = "/dev/fb";
126: strncpy(sc.scr_fbname, devname, SCR_NAMESIZE);
127: if (parent) {
128: /* Running under "overview" */
129: int pfd;
130:
131: if ((pfd = open(parent, 2, 0)) < 0) {
132: fprintf(stderr, "Can't open parent %s\n", parent);
133: return (-1);
134: }
135: vsdev = win_getnewwindow();
136: win_setlink(vsdev, WL_PARENT, win_fdtonumber(pfd));
137: win_insert(vsdev);
138: close(pfd);
139: }
140: else {
141: /* Running alone */
142: vsdev = win_screennew(&sc);
143: }
144: return (vsdev);
145: }
146:
147: /* Do sun specific initialization */
148: #ifdef notdef
149: static int pid;
150: #define XTERM "xterm"
151: static char *args[] = {
152: XTERM,
153: "=80x24+30+30",
154: "-C",
155: "-n",
156: "console",
157: 0,
158: };
159:
160: #include <sys/wait.h>
161:
162: static SigChildHandler()
163: {
164: register int dead;
165: union wait status;
166:
167: while ((dead = wait3(&status, WNOHANG, NULL)) > 0) {
168: if (dead == pid) {
169: exit(0);
170: }
171: }
172: }
173:
174: static StartShell()
175: {
176: signal(SIGCHLD, SigChildHandler);
177: if ((pid = fork()) == 0) {
178: {
179: register int i = getdtablesize();
180:
181: while (--i >= 0) {
182: close(i);
183: }
184: }
185: open("/dev/null", 2, 0);
186: dup(0);
187: dup(0);
188: {
189: /* Copy the environment for Setenv */
190: extern char **environ;
191: register int i = 0;
192: char **envnew;
193:
194: while (environ[i] != NULL)
195: i++;
196:
197: envnew = (char **) malloc(sizeof(char *) * (i + 1));
198: for (; i >= 0; i--)
199: envnew[i] = environ[i];
200: environ = envnew;
201: }
202: {
203: #define HOSTNAMESIZE 128
204: char DisplayName[HOSTNAMESIZE];
205:
206: gethostname(DisplayName, HOSTNAMESIZE);
207: strcat(DisplayName, ":0");
208: Setenv("DISPLAY=", DisplayName);
209: #undef HOSTNAMESIZE
210: }
211: execvp(XTERM, args);
212: _exit(1);
213: }
214: }
215: #endif
216:
217: InitDisplay (info)
218: register DEVICE *info;
219: {
220: register int i;
221: static vsCursor vsc;
222: static vsBox vsm;
223: static vsEventQueue vsq = {
224: NULL,
225: 0,
226: 0,
227: 0,
228: };
229: struct screen sc;
230:
231: win_screenget(vsdev, &sc);
232: info->height = sc.scr_rect.r_height;
233: info->width = sc.scr_rect.r_width;
234: if (parent) {
235: /* running under "overview" */
236: win_setrect(vsdev, &sc.scr_rect);
237: }
238: {
239: struct fbtype fbt;
240: int fd = open(sc.scr_fbname, O_RDWR, 0);
241:
242: if (fd < 0 || ioctl(fd, FBIOGTYPE, &fbt) < 0) {
243: if (fd < 0)
244: fprintf(stderr, "Can't open fb %s\n", sc.scr_fbname);
245: else
246: fprintf(stderr, "Can't FBIOGTYPE on %s\n", sc.scr_fbname);
247: return (-1);
248: }
249: close(fd);
250: info->id = fbt.fb_type + SUN_BASE;
251: info->planes = fbt.fb_depth;
252: info->entries = fbt.fb_cmsize;
253: }
254: Display = pw_open(vsdev);
255: PixRect = Display->pw_pixrect;
256: pw_reversevideo(Display,0,1);
257: {
258: struct inputmask im;
259: struct kiockey kk;
260: int kbfd, i = 0;
261:
262: if ((kbfd = open("/dev/kbd", O_RDWR, 0)) >= 0) {
263: #ifdef RAW_KBD
264: struct kiockey ok;
265:
266: for (i = 0; i < 0200; ++i) {
267: ok.kio_station =
268: kk.kio_station = kk.kio_entry = i;
269:
270: ok.kio_tablemask = kk.kio_tablemask = 0;
271: ioctl(kbfd, KIOCGETKEY, &ok);
272: sunkeymap[i] = ok;
273: /*
274: * If I am a shift key then remap past what
275: * kbd.c knows about so no mapping is done
276: * Only shift keys can be used the with UPMASK
277: * due to assumptions in sun's kernel
278: */
279: if ((ok.kio_entry & 0xf0) == SHIFTKEYS) {
280: switch (ok.kio_entry) {
281: default:
282: case SHIFTKEYS+CAPSLOCK:
283: kk.kio_entry = SHIFTKEYS+10;
284: break;
285: case SHIFTKEYS+SHIFTLOCK:
286: kk.kio_entry = SHIFTKEYS+13;
287: break;
288: case SHIFTKEYS+LEFTSHIFT:
289: kk.kio_entry = SHIFTKEYS+11;
290: break;
291: case SHIFTKEYS+RIGHTSHIFT:
292: kk.kio_entry = SHIFTKEYS+14;
293: break;
294: case SHIFTKEYS+LEFTCTRL:
295: kk.kio_entry = SHIFTKEYS+12;
296: break;
297: case SHIFTKEYS+RIGHTCTRL:
298: kk.kio_entry = SHIFTKEYS+15;
299: break;
300: }
301: } else if (ok.kio_entry == BUCKYBITS+METABIT)
302: kk.kio_entry = SHIFTKEYS+09;
303: else if (ok.kio_entry == BUCKYBITS+SYSTEMBIT)
304: kk.kio_entry = ok.kio_entry;
305: ioctl(kbfd, KIOCSETKEY, &kk);
306:
307: ok.kio_tablemask = kk.kio_tablemask = CTRLMASK;
308: ioctl(kbfd, KIOCGETKEY, &ok);
309: sunkeymap[i+00200] = ok;
310:
311: ok.kio_tablemask = kk.kio_tablemask = CAPSMASK;
312: ioctl(kbfd, KIOCGETKEY, &ok);
313: sunkeymap[i+00400] = ok;
314:
315: ok.kio_tablemask = kk.kio_tablemask = SHIFTMASK;
316: ioctl(kbfd, KIOCGETKEY, &ok);
317: sunkeymap[i+00600] = ok;
318:
319: ok.kio_tablemask = kk.kio_tablemask = UPMASK;
320: ioctl(kbfd, KIOCGETKEY, &ok);
321: sunkeymap[i+01000] = ok;
322: if ((kk.kio_entry & 0xf0) == SHIFTKEYS)
323: ioctl(kbfd, KIOCSETKEY, &kk);
324: }
325: #else
326: kk.kio_tablemask = 0;
327: kk.kio_entry = ~(SHIFTKEYS+CAPSLOCK);
328: do {
329: kk.kio_station = i++;
330: ioctl(kbfd, KIOCGETKEY, &kk);
331: } while ( i < 128 && kk.kio_entry != SHIFTKEYS+CAPSLOCK);
332: if (kk.kio_entry == SHIFTKEYS+CAPSLOCK) {
333: kk.kio_tablemask = UPMASK;
334: ioctl(kbfd, KIOCSETKEY, &kk);
335: kk.kio_tablemask = CTRLMASK;
336: ioctl(kbfd, KIOCSETKEY, &kk);
337: kk.kio_tablemask = CAPSMASK;
338: ioctl(kbfd, KIOCSETKEY, &kk);
339: kk.kio_tablemask = SHIFTMASK;
340: ioctl(kbfd, KIOCSETKEY, &kk);
341: }
342: #endif
343: close(kbfd);
344: }
345: input_imnull(&im);
346: im.im_flags = IM_ASCII | IM_META | IM_NEGEVENT;
347: win_setinputcodebit(&im, LOC_MOVE);
348: win_setinputcodebit(&im, MS_LEFT);
349: win_setinputcodebit(&im, MS_MIDDLE);
350: win_setinputcodebit(&im, MS_RIGHT);
351: #ifdef RAW_KBD
352: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+9);
353: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+10);
354: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+11);
355: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+12);
356: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+13);
357: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+14);
358: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+15);
359: #else
360: win_setinputcodebit(&im, SHIFT_CAPSLOCK);
361: #endif
362: win_setinputmask(vsdev, &im, NULL, WIN_NULLLINK);
363: }
364: if (fcntl(vsdev, F_SETFL, O_NDELAY) < 0)
365: return (-1);
366: {
367: /* Following struct cannot be included from win_cursor.h */
368: struct cursor {
369: short cur_xhot, cur_yhot; /* offset of mouse position from shape*/
370: int cur_function; /* relationship of shape to screen */
371: struct pixrect *cur_shape; /* memory image to use */
372: int flags; /* various options */
373:
374: short horiz_hair_thickness; /* horizontal crosshair height */
375: int horiz_hair_op; /* drawing op */
376: int horiz_hair_color; /* color */
377: short horiz_hair_length; /* width */
378: short horiz_hair_gap; /* gap */
379:
380: short vert_hair_thickness; /* vertical crosshair width */
381: int vert_hair_op; /* drawing op */
382: int vert_hair_color; /* color */
383: short vert_hair_length; /* height */
384: short vert_hair_gap; /* gap */
385: } cs;
386: static struct pixrect pr;
387:
388: cs.cur_xhot = cs.cur_yhot = cs.cur_function = 0;
389: cs.flags = 0;
390: cs.cur_shape = ≺
391: pr.pr_size.x = pr.pr_size.y = 0;
392: win_setcursor(vsdev, &cs);
393: win_setmouseposition(vsdev, info->width >> 1, info->height >> 1);
394: }
395: info->mouse = &vsc;
396: info->mbox = &vsm;
397: info->queue = &vsq;
398: Define_input_handler(InputReader);
399: SetUpInvPix();
400: CurrentDevice = info;
401: #ifdef notdef
402: StartShell();
403: #endif
404: return (0);
405: }
406:
407: /* Check if display is dead */
408:
409: DisplayDead ()
410: {
411: #ifdef RAW_KBD
412: int i;
413: int kbfd = open("/dev/kbd", O_RDWR, 0);
414: for (i = 0; i < 0200; ++i) {
415: ioctl(kbfd, KIOCSETKEY, &sunkeymap[i]);
416: if ((sunkeymap[i].kio_entry & 0xf0) == SHIFTKEYS)
417: ioctl(kbfd, KIOCSETKEY, &sunkeymap[i+01000]);
418: else if (sunkeymap[i].kio_entry == BUCKYBITS+METABIT)
419: ioctl(kbfd, KIOCSETKEY, &sunkeymap[i+01000]);
420: }
421: close(kbfd);
422: #endif
423: return(0);
424: }
425:
426: /* the presumption here is that only one Allocate_space call is made/request */
427:
428: #define ABUFSIZE 3072
429: static char ABuffer[3072]; /* random size buffer for allocate space */
430: caddr_t AllocateSpace (size)
431: register int size;
432: {
433: if (size < ABUFSIZE) return(ABuffer);
434: errno = ENOMEM;
435: return (NULL);
436: }
437:
438: /* XXX - should be static data */
439: SetUpInvPix()
440: {
441: register int i;
442:
443: for (i = 255; i >= 0; i--) {
444: register int j = 1, k = 128, l = 8;
445:
446: while (l--) {
447: if ((i & j) != 0)
448: InvPix[i] |= k;
449: j <<= 1;
450: k >>= 1;
451: }
452: }
453: }
454:
455: #ifdef notdef
456: Setenv (var, value)
457: /*
458: sets the value of var to be arg in the Unix 4.2 BSD environment env.
459: Var should end with '='.
460: (bindings are of the form "var=value")
461: This procedure assumes the memory for the first level of environ
462: was allocated using malloc.
463: */
464: register char *var, *value;
465: {
466: extern char **environ;
467: register int index = 0;
468:
469: while (environ[index] != NULL) {
470: if (strncmp(environ[index], var, strlen(var)) == 0) {
471: /* found it */
472: environ[index] = (char *) malloc(strlen(var) + strlen(value));
473: strcpy(environ[index], var);
474: strcat(environ[index], value);
475: return;
476: }
477: index++;
478: }
479:
480: if ((environ = (char **) realloc(environ, sizeof(char *) *
481: (index + 2))) == NULL) {
482: fprintf(stderr, "Setenv: malloc out of memory\n");
483: exit(1);
484: }
485:
486: environ[index] = (char *) malloc(strlen(var) + strlen(value));
487: strcpy(environ[index], var);
488: strcat(environ[index], value);
489: environ[++index] = NULL;
490: }
491: #endif
492: #endif sun
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.