home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume12 / r4.sun.patch / part01 next >
Internet Message Format  |  1991-05-06  |  39KB

  1. Path: uunet!olivea!oliveb!veritas!amdcad!sun!exodus!uunet.UU.NET
  2. From: slcpi!viktor@uunet.UU.NET (Viktor Dukhovni)
  3. Newsgroups: comp.sources.x
  4. Subject: v12i080: X server patch for sun4's, Part01/01
  5. Message-ID: <12871@exodus.Eng.Sun.COM>
  6. Date: 6 May 91 05:08:30 GMT
  7. Sender: news@exodus.Eng.Sun.COM
  8. Lines: 1183
  9. Approved: argv@sun.com
  10.  
  11. Submitted-by: slcpi!viktor@uunet.UU.NET (Viktor Dukhovni)
  12. Posting-number: Volume 12, Issue 80
  13. Archive-name: r4.sun.patch/part01
  14.  
  15. [ moderator's note: don't just blindly apply this -- read it first! ]
  16.  
  17.     I had posted this in response to a question on comp.unix.internals,
  18. it has been pointed out to me that:
  19.  
  20. 1)    The patch for "mivaltree.c" was broken and unnecessary.  (so
  21. I am excluding it now)
  22.  
  23. 2)    I should post to a group where the patch is likely to at least be
  24. archived.
  25.  
  26.     Also in rushing out a response to the original question
  27. I ommitted the README file from the code by:
  28.     Robert Viduya           robert@shangri-la.gatech.edu
  29. on which the NumLock and Audio support are based.
  30.  
  31.     The iconization unser SunView is mine,  and I changed Robert's
  32. code for greater reuse of code between CapsLock and NumLock,  and to allow
  33. a per user bell file whose name is obtained from the environment.
  34.     Also the #ifdef macros were changed to test for presense of
  35. functionality rather than release level (which defines the available 
  36. functionality in sun.cf)  The patch for sun.cf is not strictly
  37. limited to the above functions,  season to taste!
  38.  
  39.     Here is the origina README:  (patch below)
  40. =================================
  41. The files in this package are my changes to the X.V11R4 Sun server (upto
  42. patch 11).  They implement two things: support for the numeric keypad on
  43. type 4 keyboards and support for the audio device on the SS1 for use as
  44. a bell.  The two changes are don't rely on each other and with minor
  45. modifications to the source, either may be removed.  All changes in the
  46. source files are #ifdef'ed.
  47.  
  48. The numeric keypad support should work under either SunOS 4.0 and 4.1, but
  49. I've only tested it under 4.1.  The only difference between the two OS
  50. releases (as far as the code is concerned) is that under 4.1, the Num Lock
  51. led on the keyboard turns on and off as appropriate.  NumLock support is
  52. implemented by grabbing the numlock key and using it to toggle a numlock
  53. flag.  This means that X clients won't ever see the numlock key being hit
  54. (real minor loss, imho).  Whenever a key on the numeric keypad is hit, the
  55. flag is queried and if clear, they are passed through to the normal key
  56. processing unmolested.  If the numlock flag is set, they are remapped to
  57. a new set of scan codes that aren't used by the keyboard.  The mapping
  58. is as follows:
  59.  
  60. Key        Numlock off                     Numlock on
  61.  
  62. =,R4        0x2d=NoSymbol,R4                0x80=KP_Equal,R4
  63. /,R5        0x2e=NoSymbol,R5                0x81=KP_Divide,R5
  64. *,R6        0x2f=NoSymbol,R6                0x82=KP_Multiply,R6
  65. .,Del        0x32=Delete,NoSymbol            0x83=KP_Decimal,NoSymbol
  66. 7,Home,R7    0x44=Home,R7                    0x84=KP_7,R7
  67. 8,Up,R8        0x45=Up,R8                      0x85=KP_8,R8
  68. 9,PgUp,R9    0x46=Prior,R9                   0x86=KP_9,R9
  69. -        0x47=NoSymbol,NoSymbol        0x87=KP_Subtract,NoSymbol
  70. Enter        0x5a=NoSymbol,NoSymbol          0x88=KP_Enter,NoSymbol
  71. 4,Left,R10    0x5b=Left,R10                   0x89=KP_4,R10
  72. 5,R11        0x5c=NoSymbol,R11               0x8a=KP_5,R11
  73. 6,Right,R12    0x5c=Right,R12                  0x8b=KP_6,R12
  74. 0,Ins        0x5e=Insert,NoSymbol            0x8c=KP_0,NoSymbol
  75. 1,End,R13    0x70=End,R13                    0x8d=KP_1,R13
  76. 2,Down,R14    0x71=Down,R14                   0x8e=KP_2,R14
  77. 3,PgDn,R15    0x72=Next,R15                   0x8f=KP_3,R15
  78. +        0x7d=NoSymbol,NoSymbol          0x90=KP_Add,NoSymbol
  79.  
  80. Here's the rational.  The Sun server maps two symbols onto each key, but
  81. the numeric keypad has at most three symbols per key.  If numlock is
  82. set, then a key's primary symbol is the one at the very top of the key
  83. (the numeric one).  If numlock is clear, then a key's primary symbol is
  84. the one below that (the cursor movement one).  In any case, the key's
  85. secondary symbol is always the one on the front of the key (the R1-R15
  86. ones).
  87.  
  88. Of course, if the mapping isn't satisfactory to a given user, he can use
  89. xmodmap to remap the scan codes to something he likes while still having
  90. the advantage of using the numlock key to toggle the keypad.
  91.  
  92. The second change, that of using /dev/audio for replacing the keyboard
  93. bell, isn't implemented as cleanly as I like mainly because X itself
  94. provides fairly minimal control of the bell.  X allows the user to
  95. adjust the volume, pitch and duration of the bell.  Mac's, as a point of
  96. comparison, allow users to replace the bell sound with any digitized
  97. sound they desire, leading to all sorts of weird bells like toilet
  98. flushes and PeeWee Herman screams.  Although I didn't want anything
  99. weird like that, I did want a nice bell sound with a sharp attack and a
  100. ringing decay.  So I kludged in a way for me to do that.  The code was
  101. written explicitely for SunOS 4.1 (it uses /usr/lib/libaudio.a that can
  102. be made by stuff in /usr/demo/SOUND).  I can pretty much guarantee that
  103. it won't work under 4.0 without changes.  The code expects a file called
  104. $(LIBDIR)/serverbell.au to exist and must contain the sound the user
  105. wants for the bell (on my system, I leave the file world-writable so I
  106. can replace the sound anytime I want to).  This file is stat'ed
  107. everytime a request to ring the bell comes in and if the time stamp has
  108. been changed, is closed and re-opened so that a user can replace the
  109. sound on the fly.  If any error occurs, like not being able to access
  110. the audio device or the sound file or the sound file not being correctly
  111. structured, then the code will fallback to ringing the normal bell on
  112. the keyboard.
  113.  
  114. Using the xset command, the user can adjust the base volume of the played
  115. sound file.  I say base volume because the XBell Xlib function has a
  116. volume parameter that is applied to the base volume to produce the final
  117. volume.  Adjusting the base volume is probably desired because some X
  118. applications (like emacs) call XBell with a parameter of 100%.
  119.  
  120. Also using the xset command, the user can set the pitch to either a zero
  121. or non-zero value.  Setting it to a non-zero value (default is 400 when
  122. the server starts up) makes the server use /dev/audio for a bell (if it
  123. can).  Setting it to zero forces the server to use the normal bell on
  124. the keyboard.  The server will leave /dev/audio open if the pitch is
  125. non-zero.  Since /dev/audio is an exclusive access device, this has the
  126. effect of preventing any other use of the it.  Setting the pitch to zero
  127. allows the user to tell the server to close the device, presumably
  128. because the user wants to do something else with it.  Setting the pitch
  129. has no effect whatsoever on the sound played.
  130.  
  131. The xset command's third bell parameter is duration which has no effect
  132. on the sound played (unlike the keyboard bell where duration specifies
  133. how long the bell is on).  Whenever an XBell request comes in, the sound
  134. file is played from beginning to end.  This avoids "choppy" sounds that
  135. occur when the duration specified is shorter than the sound file.
  136. Fortunately, the sound file is played in parallel to code execution in
  137. the server (as a result of the fact that the server leaves the audio
  138. device open all the time) so the server can keep running while the sound
  139. file plays to completion.
  140.  
  141. Anyway, the changes are in four files which need to be copied to their
  142. appropriate locations in the X source tree.  They are:
  143.  
  144.     sun.cf        belongs in    ./config/sun.cf
  145.     sunKeyMap.c    belongs in    ./server/ddx/sun/sunKeyMap.c
  146.     sunKbd.c    belongs in    ./server/ddx/sun/sunKbd.c
  147.     Imakefile    belongs in    ./server/Imakefile
  148.  
  149. You might want to diff them with their original files before copying
  150. them.
  151.  
  152.             robert
  153.  
  154. --
  155. Robert Viduya                       robert@shangri-la.gatech.edu
  156. Office of Computing Services
  157. Georgia Institute of Technology                     (404) 894-6296
  158. Atlanta, Georgia    30332-0275
  159. ==================================
  160.  
  161. *** /tmp/,RCSt1a01935    Wed Apr 24 22:11:45 1991
  162. --- ./server/ddx/sun/sunKbd.c    Tue Oct 23 14:15:44 1990
  163. ***************
  164. *** 48,53 ****
  165. --- 48,57 ----
  166.   
  167.   
  168.   #define NEED_EVENTS
  169. + #ifdef SUN_AUDIO_FILE
  170. + #include <multimedia/libaudio.h>
  171. + #include <multimedia/audio_device.h>
  172. + #endif
  173.   #include "sun.h"
  174.   #include <stdio.h>
  175.   #include "Xproto.h"
  176. ***************
  177. *** 55,61 ****
  178.   #include "inputstr.h"
  179.   
  180.   typedef struct {
  181. !     int              trans;              /* Original translation form */
  182.   } SunKbPrivRec, *SunKbPrivPtr;
  183.   
  184.   extern CARD8 *sunModMap[];
  185. --- 59,71 ----
  186.   #include "inputstr.h"
  187.   
  188.   typedef struct {
  189. !     int        trans;        /* Original translation form */
  190. ! #ifdef SUN_AUDIO_FILE
  191. !     int        audio_fd;    /* /dev/audio fd */
  192. !     int        sound_fd;    /* fd of sound file */
  193. !     struct stat    sound_stat;    /* stat info of sound file */
  194. !     Bool    using_audio;    /* true if using /dev/audio else normal bell */
  195. ! #endif
  196.   } SunKbPrivRec, *SunKbPrivPtr;
  197.   
  198.   extern CARD8 *sunModMap[];
  199. ***************
  200. *** 93,98 ****
  201. --- 103,169 ----
  202.       &sysKbCtrl,            /* Initial full duration = .25 sec. */
  203.   };
  204.   
  205. + /* XXX:  Must be a clean way of not hardwiring these! */
  206. + #define KB_SUN4_CODE_MASK    0x7F
  207. + #define KB_SUN4_MAX_CODE    0x7F
  208. + #define KB_SUN4_NUM_LOCK_KCODE    (0x61+MIN_KEYCODE)
  209. + #define KB_SUN4_CAPS_LOCK_KCODE    (0x76+MIN_KEYCODE)
  210. + #ifdef SUN_NUMLOCK
  211. + /*
  212. +  * The following table is the list of scancodes for keys affected by
  213. +  * the numlock switch.  The order MUST match the order of simulated
  214. +  * numlock keys defined at the end of the keymap in sunKeyMap.c
  215. +  */
  216. + static char        numlock_keys[] = {
  217. +     0x2d, 0x2e, 0x2f, 0x32, 0x44, 0x45, 0x46, 0x47, 0x5a,
  218. +     0x5b, 0x5c, 0x5d, 0x5e, 0x70, 0x71, 0x72, 0x7d, 0x00
  219. + };
  220. + #endif
  221. + #ifdef SUN_LED_SUPPORT
  222. + /*
  223. +  * set_kbd_led
  224. +  */
  225. + static void
  226. + set_kbd_led (pKeyboard, flag, mask)
  227. + DevicePtr    pKeyboard;
  228. + Bool        flag;
  229. + long        mask;
  230. + {
  231. +     KbPrivPtr        kbp = (KbPrivPtr) pKeyboard->devicePrivate;
  232. +     int         kbdOpenedHere;
  233. +     char        led;
  234. +     bool        old;
  235. +     kbdOpenedHere = ( kbp->fd < 0 );
  236. +     if ( kbdOpenedHere ) {
  237. +     kbp->fd = open("/dev/kbd", O_RDWR, 0);
  238. +     if (kbp->fd < 0) {
  239. +         ErrorF("set_numlock_flag: can't open keyboard");
  240. +         return;
  241. +     }
  242. +     }    
  243. +  
  244. +     (void) ioctl (kbp->fd, KIOCGLED, &led);
  245. +     old = ((led & mask) == mask);
  246. +     if (flag != old) {
  247. +     if (flag)
  248. +         led |= mask;
  249. +     else
  250. +         led &= ~mask;
  251. +     (void) ioctl (kbp->fd, KIOCSLED, &led);
  252. +     }
  253. +     if ( kbdOpenedHere ) {
  254. +     (void) close(kbp->fd);
  255. +     kbp->fd = -1;
  256. +     }
  257. + }
  258. + #endif
  259.   /*-
  260.    *-----------------------------------------------------------------------
  261.    * sunKbdProc --
  262. ***************
  263. *** 167,173 ****
  264.                           perror( "ioctl KIOCGETKEY" );
  265.               FatalError("Can't KIOCGETKEY on fd %d\n", kbdFd);
  266.                       }
  267. !                     if (key.kio_entry != HOLE)
  268.                           sysKbPriv.type = KB_SUN4;
  269.                   }
  270.   #endif
  271. --- 238,244 ----
  272.                           perror( "ioctl KIOCGETKEY" );
  273.               FatalError("Can't KIOCGETKEY on fd %d\n", kbdFd);
  274.                       }
  275. !                     if ( ((long)key.kio_entry) != HOLE)
  276.                           sysKbPriv.type = KB_SUN4;
  277.                   }
  278.   #endif
  279. ***************
  280. *** 208,213 ****
  281. --- 279,292 ----
  282.           sunKeySyms[sysKbPriv.type].maxKeyCode += offset;
  283.           sysKbPriv.offset = offset;
  284.           }
  285. + #ifdef SUN_LED_SUPPORT
  286. +         if (sysKbPriv.type == KB_SUN4)
  287. +         set_kbd_led (pKeyboard, FALSE, ~0L);
  288. + #endif
  289. + #ifdef SUN_AUDIO_FILE
  290. +         sunKbPriv.audio_fd = sunKbPriv.sound_fd = -1;
  291. +         sunKbPriv.using_audio = FALSE;
  292. + #endif
  293.           InitKeyboardDeviceStruct(
  294.               pKeyboard,
  295.               &(sunKeySyms[sysKbPriv.type]),
  296. ***************
  297. *** 229,234 ****
  298. --- 308,314 ----
  299.            * when DEVICE_CLOSE was executed.
  300.            * Translation is set/reset upon receipt of
  301.            * KBD_USE/KBD_DONE input events (sunIo.c)
  302. +          * Or When Meta-L2 suspends the server.
  303.            */
  304.           if (deviceOffKbdState != TR_UNDEFINED) {
  305.               if (sunChangeKbdTranslation(pKeyboard,
  306. ***************
  307. *** 235,240 ****
  308. --- 315,333 ----
  309.                   deviceOffKbdState == TR_UNTRANS_EVENT) < 0) {
  310.               FatalError("Can't set (SW) keyboard translation\n");
  311.               }
  312. + #ifdef SUN_LED_SUPPORT
  313. +             if (sysKbPriv.type == KB_SUN4) {
  314. +             set_kbd_led (pKeyboard, FALSE, ~0L) ;
  315. +             /* Set LEDs to match Logical state */
  316. +             if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down,
  317. +                     KB_SUN4_NUM_LOCK_KCODE))
  318. +                 set_kbd_led (pKeyboard, TRUE, LED_NUM_LOCK) ;
  319. +             if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down, 
  320. +                     KB_SUN4_CAPS_LOCK_KCODE))
  321. +                 set_kbd_led (pKeyboard, TRUE, LED_CAPS_LOCK) ;
  322. +             }
  323. + #endif
  324.           }
  325.           AddEnabledDevice(windowFd);
  326.   #endif SUN_WINDOWS
  327. ***************
  328. *** 254,259 ****
  329. --- 347,354 ----
  330.           AddEnabledDevice(kbdFd);
  331.           }
  332.           pKeyboard->on = TRUE;
  333. +         /* Enable Processing in sunWakeupHandler */
  334. +         autoRepeatReady = 1;
  335.           break;
  336.   
  337.       case DEVICE_CLOSE:
  338. ***************
  339. *** 326,335 ****
  340.       int              loudness;        /* Percentage of full volume */
  341.       DevicePtr      pKeyboard;        /* Keyboard to ring */
  342.   {
  343. !     KbPrivPtr      pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
  344. !     int            kbdCmd;           /* Command to give keyboard */
  345. !     int           kbdOpenedHere; 
  346. !  
  347.       if (loudness == 0) {
  348.        return;
  349.       }
  350. --- 421,516 ----
  351.       int              loudness;        /* Percentage of full volume */
  352.       DevicePtr      pKeyboard;        /* Keyboard to ring */
  353.   {
  354. !     KbPrivPtr        pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
  355. !     SunKbPrivPtr    psPriv = (SunKbPrivPtr) pPriv->devPrivate;
  356. !     int            kbdCmd;           /* Command to give keyboard */
  357. !     int            kbdOpenedHere; 
  358. ! #ifdef SUN_AUDIO_FILE
  359. ! #define savecopy(dst,src) \
  360. !     ((dst=(src)), dst = (dst ? strcpy(malloc(strlen(dst)+1),dst) : NULL))
  361. !     extern char *    getenv() ;
  362. !     static Audio_hdr    dev_hdr, sound_hdr;
  363. !     double        gain;
  364. !     struct stat        st;
  365. !     char        buf[1024];
  366. !     int            nr;
  367. !     static char *    audio_file = NULL;
  368. !     if (psPriv->using_audio) {
  369. !     /* open the /dev/audio device */
  370. !     if (psPriv->audio_fd < 0) {
  371. !         if ((psPriv->audio_fd = open ("/dev/audio",
  372. !                       O_WRONLY | O_NDELAY)) < 0) {
  373. !         if (errno != EBUSY)    /* hard error, don't retry later */
  374. !             psPriv->using_audio = FALSE;    
  375. !         goto use_kybd_bell;
  376. !         }
  377. !     }
  378. !     if (audio_get_play_config(psPriv->audio_fd,&dev_hdr) != AUDIO_SUCCESS) {
  379. !         /* not an audio device */
  380. !         (void) close (psPriv->audio_fd);
  381. !         psPriv->audio_fd = -1;
  382. !         psPriv->using_audio = FALSE;
  383. !         goto use_kybd_bell;
  384. !     }
  385. !     /* open the sound file */
  386. !     if (psPriv->sound_fd < 0) {
  387. ! reopen_sound:
  388. !         if ( !audio_file && !savecopy(audio_file,getenv(SUN_AUDIO_FILE)) ||
  389. !              (psPriv->sound_fd = open (audio_file, O_RDONLY, 0)) < 0 ) {
  390. !         /* can't open, try again later (maybe too expensive?) */
  391. !         psPriv->sound_fd = -1;
  392. !         goto use_kybd_bell;
  393. !         }
  394. !         (void) fstat(psPriv->sound_fd, &(psPriv->sound_stat));
  395. !     }
  396. !     else {    /* stat the file to see if it may have changed */
  397. !         if (stat (audio_file, &st) == -1) {
  398. !         (void) close (psPriv->sound_fd);
  399. !         psPriv->sound_fd = -1;
  400. !         goto use_kybd_bell;
  401. !         }
  402. !         if (st.st_mtime != psPriv->sound_stat.st_mtime) {
  403. !         (void) close (psPriv->sound_fd);    /* changed, go reopen */
  404. !         goto reopen_sound;
  405. !         }
  406. !     }
  407. !     
  408. !     /* set the volume */
  409. !     gain = ((double) loudness) / 100.0;
  410. !     (void) audio_set_play_gain (psPriv->audio_fd, &gain);    /* ignore errors */
  411. !     
  412. !     /* process the audio file header */
  413. !     (void) lseek (psPriv->sound_fd, 0L, 0);
  414. !     if (audio_read_filehdr (psPriv->sound_fd, &sound_hdr, (char *) 0, 0) != AUDIO_SUCCESS)
  415. !         goto use_kybd_bell;
  416. !     if (audio_cmp_hdr (&dev_hdr, &sound_hdr) != 0) {
  417. !         if (audio_drain (psPriv->audio_fd, FALSE) != AUDIO_SUCCESS)
  418. !         goto use_kybd_bell;
  419. !         if (audio_set_play_config (psPriv->audio_fd, &sound_hdr) != AUDIO_SUCCESS)
  420. !         goto use_kybd_bell;
  421. !     }
  422. !     /* write the sound */
  423. !     while ((nr = read (psPriv->sound_fd, buf, sizeof (buf))) >= 0) {
  424. !         if (nr == 0)
  425. !         break;
  426. !         (void) write (psPriv->audio_fd, buf, nr);
  427. !     }
  428. !     return;
  429. !     }
  430. ! use_kybd_bell:
  431. ! #endif
  432.       if (loudness == 0) {
  433.        return;
  434.       }
  435. ***************
  436. *** 386,394 ****
  437.       DevicePtr      pKeyboard;        /* Keyboard to alter */
  438.       KeybdCtrl     *ctrl;
  439.   {
  440. !     KbPrivPtr      pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
  441. !     int           kbdClickCmd = ctrl->click ? KBD_CMD_CLICK : KBD_CMD_NOCLICK;
  442. !     int           kbdOpenedHere; 
  443.   
  444.       kbdOpenedHere = ( pPriv->fd < 0 );
  445.       if ( kbdOpenedHere ) {
  446. --- 567,579 ----
  447.       DevicePtr      pKeyboard;        /* Keyboard to alter */
  448.       KeybdCtrl     *ctrl;
  449.   {
  450. !     KbPrivPtr        pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
  451. !     SunKbPrivPtr    psPriv = (SunKbPrivPtr) ((KbPrivPtr)pKeyboard->devicePrivate)->devPrivate;
  452. !     int            kbdClickCmd = ctrl->click ? KBD_CMD_CLICK : KBD_CMD_NOCLICK;
  453. !     int            kbdOpenedHere;
  454. ! #ifdef SUN_AUDIO_FILE
  455. !     int            kbdBellPitch = ctrl->bell_pitch;
  456. ! #endif
  457.   
  458.       kbdOpenedHere = ( pPriv->fd < 0 );
  459.       if ( kbdOpenedHere ) {
  460. ***************
  461. *** 403,408 ****
  462. --- 588,606 ----
  463.        ErrorF("Failed to set keyclick");
  464.       goto bad;
  465.       }
  466. + #ifdef SUN_AUDIO_FILE
  467. +     if (!kbdOpenedHere && kbdBellPitch == 0) {    /* 0 pitch means release /dev/audio, use bell */
  468. +     if (psPriv->audio_fd >= 0) {
  469. +         (void) audio_drain (psPriv->audio_fd, FALSE);
  470. +         (void) close (psPriv->audio_fd);
  471. +         psPriv->audio_fd = -1;
  472. +     }
  473. +     psPriv->using_audio = FALSE;
  474. +     }
  475. +     else
  476. +     psPriv->using_audio = TRUE;
  477. + #endif
  478.    
  479.       *pPriv->ctrl = *ctrl;
  480.   
  481. ***************
  482. *** 443,449 ****
  483.       static Firm_event    evBuf[MAXEVENTS];   /* Buffer for Firm_events */
  484.   
  485.       pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
  486. !     nBytes = read (pPriv->fd, evBuf, sizeof(evBuf));
  487.   
  488.       if (nBytes < 0) {
  489.       if (errno == EWOULDBLOCK) {
  490. --- 641,650 ----
  491.       static Firm_event    evBuf[MAXEVENTS];   /* Buffer for Firm_events */
  492.   
  493.       pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
  494. !     if (pKeyboard->on)
  495. !     nBytes = read (pPriv->fd, evBuf, sizeof(evBuf));
  496. !     else
  497. !     nBytes = 0;
  498.   
  499.       if (nBytes < 0) {
  500.       if (errno == EWOULDBLOCK) {
  501. ***************
  502. *** 501,508 ****
  503.       BYTE        key;
  504.       CARD8        keyModifiers;
  505.   
  506.       if (autoRepeatKeyDown && fe->id == AUTOREPEAT_EVENTID) {
  507. -     pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
  508.       if (pPriv->ctrl->autoRepeat != AutoRepeatModeOn) {
  509.           autoRepeatKeyDown = 0;
  510.           return;
  511. --- 702,709 ----
  512.       BYTE        key;
  513.       CARD8        keyModifiers;
  514.   
  515. +     pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
  516.       if (autoRepeatKeyDown && fe->id == AUTOREPEAT_EVENTID) {
  517.       if (pPriv->ctrl->autoRepeat != AutoRepeatModeOn) {
  518.           autoRepeatKeyDown = 0;
  519.           return;
  520. ***************
  521. *** 539,545 ****
  522.       return;
  523.       }
  524.   
  525. !     key = (fe->id & 0x7F) + sysKbPriv.offset;
  526.       keyModifiers = ((DeviceIntPtr)pKeyboard)->key->modifierMap[key];
  527.       if (autoRepeatKeyDown && (keyModifiers == 0) &&
  528.       ((fe->value == VKEY_DOWN) || (key == autoRepeatEvent.u.u.detail))) {
  529. --- 740,765 ----
  530.       return;
  531.       }
  532.   
  533. ! #ifdef SUN_NUMLOCK
  534. !     if (pPriv->type == KB_SUN4) {
  535. !     char    *cp, *index ();
  536. !     key = fe->id & KB_SUN4_CODE_MASK;
  537. !     if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down, 
  538. !         KB_SUN4_NUM_LOCK_KCODE) &&
  539. !         (cp = index (numlock_keys, key)) != NULL)
  540. !         fe->id = KB_SUN4_MAX_CODE + 1 + (cp - numlock_keys);
  541. !     else
  542. !         fe->id &= KB_SUN4_CODE_MASK;
  543. !     }
  544. !     else
  545. !     fe->id &= KB_SUN4_CODE_MASK;
  546. !     key = fe->id + sysKbPriv.offset;
  547. ! #else
  548. !     key = (fe->id & KB_SUN4_CODE_MASK) + sysKbPriv.offset;
  549. ! #endif
  550.       keyModifiers = ((DeviceIntPtr)pKeyboard)->key->modifierMap[key];
  551.       if (autoRepeatKeyDown && (keyModifiers == 0) &&
  552.       ((fe->value == VKEY_DOWN) || (key == autoRepeatEvent.u.u.detail))) {
  553. ***************
  554. *** 558,568 ****
  555.       xE.u.u.type = ((fe->value == VKEY_UP) ? KeyRelease : KeyPress);
  556.       xE.u.u.detail = key;
  557.   
  558. !     if (keyModifiers & LockMask) {
  559. !     if (xE.u.u.type == KeyRelease)
  560. !         return; /* this assumes autorepeat is not desired */
  561. !     if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down, key))
  562. !         xE.u.u.type = KeyRelease;
  563.       }
  564.   
  565.       if ((xE.u.u.type == KeyPress) && (keyModifiers == 0)) {
  566. --- 778,807 ----
  567.       xE.u.u.type = ((fe->value == VKEY_UP) ? KeyRelease : KeyPress);
  568.       xE.u.u.detail = key;
  569.   
  570. ! #ifndef SUN_NUMLOCK
  571. !     if (keyModifiers & LockMask)
  572. ! #else
  573. !     if (keyModifiers & LockMask ||
  574. !     pPriv->type == KB_SUN4 && key == KB_SUN4_NUM_LOCK_KCODE)
  575. ! #endif
  576. !     {
  577. ! #ifdef SUN_LED_SUPPORT
  578. !     int ledmask = (keyModifiers & LockMask) ? LED_CAPS_LOCK : LED_NUM_LOCK;
  579. ! #endif
  580. !     if (xE.u.u.type == KeyRelease ||
  581. !         BitIsOn(((DeviceIntPtr)pKeyboard)->key->down, key)) {
  582. !         if ( xE.u.u.type == KeyRelease )
  583. !         return;
  584. !         else
  585. !         xE.u.u.type = KeyRelease;
  586. ! #ifdef SUN_LED_SUPPORT
  587. !         if ( pPriv->type == KB_SUN4 )
  588. !             set_kbd_led(pKeyboard, FALSE, ledmask) ;
  589. !     } else {
  590. !         if ( pPriv->type == KB_SUN4 )
  591. !         set_kbd_led (pKeyboard, TRUE, ledmask);
  592. ! #endif
  593. !     }
  594.       }
  595.   
  596.       if ((xE.u.u.type == KeyPress) && (keyModifiers == 0)) {
  597. ***************
  598. *** 621,626 ****
  599. --- 860,866 ----
  600.       int        kbdOpenedHere;
  601.   
  602.       static struct timeval lastChngKbdTransTv;
  603. +     static int firsttime = 1;
  604.       struct timeval tv;
  605.       struct timeval lastChngKbdDeltaTv;
  606.       int lastChngKbdDelta;
  607. ***************
  608. *** 629,639 ****
  609.        * Workaround for SS1 serial driver kernel bug when KIOCTRANS ioctl()s
  610.        * occur too closely together in time.
  611.        */
  612.       gettimeofday(&tv, (struct timezone *) NULL);
  613. !     tvminus(lastChngKbdDeltaTv, tv, lastChngKbdTransTv);
  614. !     lastChngKbdDelta = TVTOMILLI(lastChngKbdDeltaTv);
  615.       if (lastChngKbdDelta < 750) {
  616.       struct timeval wait;
  617.   
  618.       /*
  619.            * We need to guarantee at least 750 milliseconds between
  620. --- 869,890 ----
  621.        * Workaround for SS1 serial driver kernel bug when KIOCTRANS ioctl()s
  622.        * occur too closely together in time.
  623.        */
  624. +     /*
  625. +      * Is this still needed ???  What OS Versions???
  626. +      */
  627. + #ifdef KIOCTRANS_HACK
  628.       gettimeofday(&tv, (struct timezone *) NULL);
  629. !     if (firsttime) {
  630. !     lastChngKbdTransTv = tv;
  631. !     lastChngKbdDelta   = 0;
  632. !     firsttime = 0;
  633. !     } else {
  634. !     tvminus(lastChngKbdDeltaTv, tv, lastChngKbdTransTv);
  635. !     lastChngKbdDelta = TVTOMILLI(lastChngKbdDeltaTv);
  636. !     }
  637.       if (lastChngKbdDelta < 750) {
  638.       struct timeval wait;
  639. +     int    mask = sigmask(SIGIO);       
  640.   
  641.       /*
  642.            * We need to guarantee at least 750 milliseconds between
  643. ***************
  644. *** 641,650 ****
  645.        */
  646.       wait.tv_sec = 0;
  647.       wait.tv_usec = (750L - lastChngKbdDelta) * 1000L;
  648. !         (void) select(0, (int *)0, (int *)0, (int *)0, &wait);
  649.           gettimeofday(&tv, (struct timezone *) NULL);
  650.       }
  651.       lastChngKbdTransTv = tv;
  652.       
  653.   
  654.       pPriv = (KbPrivPtr)pKeyboard->devicePrivate;
  655. --- 892,905 ----
  656.        */
  657.       wait.tv_sec = 0;
  658.       wait.tv_usec = (750L - lastChngKbdDelta) * 1000L;
  659. !     mask = sigblock(mask) ;
  660. !         (void) select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &wait);
  661. !     (void) sigsetmask(mask) ;
  662.           gettimeofday(&tv, (struct timezone *) NULL);
  663.       }
  664.       lastChngKbdTransTv = tv;
  665. + #endif
  666.       
  667.   
  668.       pPriv = (KbPrivPtr)pKeyboard->devicePrivate;
  669. ***************
  670. *** 792,802 ****
  671. --- 1047,1078 ----
  672.       register struct inputevent *se;
  673.   {   
  674.       Firm_event    fe;
  675. +     int        loc;
  676. +     static    Meta_On, Meta_hold;
  677.   
  678.       fe.time = event_time(se);
  679.       fe.id = event_id(se);
  680.       fe.value = (event_is_up(se) ? VKEY_UP : VKEY_DOWN);
  681.   
  682. +     if (fe.id > 0) {
  683. +     loc = (fe.id - 1) * sunKeySyms[sysKbPriv.type].mapWidth;
  684. +     if( sunKeySyms[sysKbPriv.type].map[loc] == XK_Meta_L ||
  685. +        sunKeySyms[sysKbPriv.type].map[loc] == XK_Meta_R ) /* Meta */
  686. +     {
  687. +         Meta_hold = fe.id;
  688. +         Meta_On = (fe.value == VKEY_DOWN);
  689. +     }
  690. +     if( sunKeySyms[sysKbPriv.type].map[loc] == XK_L2 ) /* L2 */
  691. +     {
  692. +         if( fe.value == VKEY_DOWN && Meta_On )
  693. +         {
  694. +             stopme();
  695. +             fe.id = Meta_hold;
  696. +             fe.value = VKEY_UP;
  697. +         }
  698. +     }
  699. +     }
  700.       sunKbdProcessEvent (pKeyboard, &fe);
  701.   }
  702.   #endif SUN_WINDOWS
  703. *** /tmp/,RCSt1a01938    Wed Apr 24 22:11:46 1991
  704. --- ./server/ddx/sun/sun.h    Tue Oct 23 14:14:59 1990
  705. ***************
  706. *** 248,259 ****
  707.   extern struct timeval autoRepeatDeltaTv;
  708.   
  709.   #define tvminus(tv, tv1, tv2)    /* tv = tv1 - tv2 */ \
  710. -         if ((tv1).tv_usec < (tv2).tv_usec) { \
  711. -             (tv1).tv_usec += 1000000; \
  712. -             (tv1).tv_sec -= 1; \
  713. -         } \
  714.           (tv).tv_usec = (tv1).tv_usec - (tv2).tv_usec; \
  715. !         (tv).tv_sec = (tv1).tv_sec - (tv2).tv_sec;
  716.   
  717.   #define tvplus(tv, tv1, tv2)    /* tv = tv1 + tv2 */ \
  718.           (tv).tv_sec = (tv1).tv_sec + (tv2).tv_sec; \
  719. --- 248,259 ----
  720.   extern struct timeval autoRepeatDeltaTv;
  721.   
  722.   #define tvminus(tv, tv1, tv2)    /* tv = tv1 - tv2 */ \
  723.           (tv).tv_usec = (tv1).tv_usec - (tv2).tv_usec; \
  724. !         (tv).tv_sec = (tv1).tv_sec - (tv2).tv_sec; \
  725. !         if ((tv).tv_usec < 0) { \
  726. !             (tv).tv_usec += 1000000; \
  727. !             (tv).tv_sec -= 1; \
  728. !         }
  729.   
  730.   #define tvplus(tv, tv1, tv2)    /* tv = tv1 + tv2 */ \
  731.           (tv).tv_sec = (tv1).tv_sec + (tv2).tv_sec; \
  732. *** /tmp/,RCSt1a01941    Wed Apr 24 22:11:47 1991
  733. --- ./server/ddx/sun/sunKeyMap.c    Tue Oct 23 14:16:28 1990
  734. ***************
  735. *** 350,356 ****
  736.           XK_F7,          NoSymbol,               /* 0x10 */
  737.           XK_F8,          NoSymbol,               /* 0x11 */
  738.           XK_F9,          NoSymbol,               /* 0x12 */
  739. !     XK_Alt_L,    NoSymbol,        /* 0x13 */
  740.           NoSymbol,       NoSymbol,               /* 0x14 */
  741.           XK_R1,          XK_Pause,               /* 0x15 */
  742.           XK_R2,          NoSymbol,               /* 0x16 */
  743. --- 350,356 ----
  744.           XK_F7,          NoSymbol,               /* 0x10 */
  745.           XK_F8,          NoSymbol,               /* 0x11 */
  746.           XK_F9,          NoSymbol,               /* 0x12 */
  747. !         XK_Alt_L,       NoSymbol,               /* 0x13 */
  748.           NoSymbol,       NoSymbol,               /* 0x14 */
  749.           XK_R1,          XK_Pause,               /* 0x15 */
  750.           XK_R2,          NoSymbol,               /* 0x16 */
  751. ***************
  752. *** 376,384 ****
  753.           XK_quoteleft,   XK_asciitilde,          /* 0x2a */
  754.           XK_BackSpace,   NoSymbol,               /* 0x2b */
  755.           NoSymbol,       NoSymbol,               /* 0x2c */
  756. !         XK_R4,          XK_KP_Equal,        /* 0x2d */
  757. !         XK_R5,          XK_KP_Divide,        /* 0x2e */
  758. !         XK_R6,          XK_KP_Multiply,        /* 0x2f */
  759.           NoSymbol,       NoSymbol,               /* 0x30 */
  760.           XK_L5,          NoSymbol,               /* 0x31 */
  761.           XK_Delete,      XK_KP_Decimal,          /* 0x32 */
  762. --- 376,384 ----
  763.           XK_quoteleft,   XK_asciitilde,          /* 0x2a */
  764.           XK_BackSpace,   NoSymbol,               /* 0x2b */
  765.           NoSymbol,       NoSymbol,               /* 0x2c */
  766. !         XK_R4,          XK_KP_Equal,            /* 0x2d */
  767. !         XK_R5,          XK_KP_Divide,           /* 0x2e */
  768. !         XK_R6,          XK_KP_Multiply,         /* 0x2f */
  769.           NoSymbol,       NoSymbol,               /* 0x30 */
  770.           XK_L5,          NoSymbol,               /* 0x31 */
  771.           XK_Delete,      XK_KP_Decimal,          /* 0x32 */
  772. ***************
  773. *** 425,431 ****
  774.           XK_Left,        XK_KP_4,                /* 0x5b */
  775.           XK_R11,         XK_KP_5,                /* 0x5c */
  776.           XK_Right,       XK_KP_6,                /* 0x5d */
  777. !         XK_Insert,       XK_KP_0,                /* 0x5e */
  778.           XK_L9,          NoSymbol,               /* 0x5f */
  779.           NoSymbol,       NoSymbol,               /* 0x60 */
  780.           XK_L10,         NoSymbol,               /* 0x61 */
  781. --- 425,431 ----
  782.           XK_Left,        XK_KP_4,                /* 0x5b */
  783.           XK_R11,         XK_KP_5,                /* 0x5c */
  784.           XK_Right,       XK_KP_6,                /* 0x5d */
  785. !         XK_Insert,      XK_KP_0,                /* 0x5e */
  786.           XK_L9,          NoSymbol,               /* 0x5f */
  787.           NoSymbol,       NoSymbol,               /* 0x60 */
  788.           XK_L10,         NoSymbol,               /* 0x61 */
  789. ***************
  790. *** 459,464 ****
  791. --- 459,486 ----
  792.           XK_KP_Add,      XK_KP_Add,              /* 0x7d */
  793.           NoSymbol,       NoSymbol,               /* 0x7e */
  794.           NoSymbol,       NoSymbol,               /* 0x7f */
  795. + #ifdef SUN_NUMLOCK
  796. +         /* these entries are faked scan codes for keys that are affected
  797. +          * by the numlock key.  The order must match the table in sunKbd.c
  798. +          */
  799. +         XK_KP_Equal,    XK_R4,                  /* 0x2d => 0x80 */
  800. +         XK_KP_Divide,   XK_R5,                  /* 0x2e => 0x81 */
  801. +         XK_KP_Multiply, XK_R6,                  /* 0x2f => 0x82 */
  802. +         XK_KP_Decimal,  NoSymbol,               /* 0x32 => 0x83 */
  803. +         XK_KP_7,        XK_R7,                  /* 0x44 => 0x84 */
  804. +         XK_KP_8,        XK_R8,                  /* 0x45 => 0x85 */
  805. +         XK_KP_9,        XK_R9,                  /* 0x46 => 0x86 */
  806. +         XK_KP_Subtract, NoSymbol,               /* 0x47 => 0x87 */
  807. +         XK_KP_Enter,    NoSymbol,               /* 0x5a => 0x88 */
  808. +         XK_KP_4,        XK_R10,                 /* 0x5b => 0x89 */
  809. +         XK_KP_5,        XK_R11,                 /* 0x5c => 0x8a */
  810. +         XK_KP_6,        XK_R12,                 /* 0x5d => 0x8b */
  811. +         XK_KP_0,        NoSymbol,               /* 0x5e => 0x8c */
  812. +         XK_KP_1,        XK_R13,                 /* 0x70 => 0x8d */
  813. +         XK_KP_2,        XK_R14,                 /* 0x71 => 0x8e */
  814. +         XK_KP_3,        XK_R15,                 /* 0x72 => 0x8f */
  815. +         XK_KP_Add,      NoSymbol,               /* 0x7d => 0x90 */
  816. + #endif
  817.   };
  818.   
  819.   
  820. ***************
  821. *** 473,479 ****
  822. --- 495,505 ----
  823.   #endif
  824.       Sun2Map,        1,    0x7a,    2,
  825.       Sun3Map,        1,    0x7a,    2,
  826. + #ifdef SUN_NUMLOCK
  827. +     Sun4Map,        1,    0x90,    2,
  828. + #else
  829.       Sun4Map,        1,    0x7d,    2,
  830. + #endif
  831.   };
  832.   
  833.   #define    cT    (ControlMask)
  834. *** /tmp/,RCSt1a01944    Wed Apr 24 22:11:48 1991
  835. --- ./server/ddx/sun/sunInit.c    Tue Oct 23 14:15:36 1990
  836. ***************
  837. *** 689,691 ****
  838. --- 689,786 ----
  839.   
  840.       return (fd);
  841.   }
  842. + /*
  843. +  * stopme - stop window for suntools
  844. +  */
  845. + #ifdef    SUN_WINDOWS
  846. + #include    "validate.h"
  847. + #include    "windowstr.h"
  848. + #include    "dix.h"
  849. + extern WindowPtr *WindowTable;
  850. + stopme()
  851. + {
  852. +     DevicePtr    pKbd;
  853. +     int        i;
  854. +     void    ExposeEveryone();
  855. +     if( !sunUseSunWindows())
  856. +     return;
  857. +     /*
  858. +      * on our way out -- shut down keyboard and mouse
  859. +      * and remove the window
  860. +      */
  861. +     pKbd = LookupKeyboardDevice();
  862. +     sunKbdProc(pKbd,  DEVICE_OFF);
  863. +     sunMouseProc(pKbd, DEVICE_OFF);
  864. +     win_remove(windowFd);
  865. +     sunNonBlockConsoleOff((char *)0) ;
  866. +     kill(0, SIGSTOP);
  867. +     /*
  868. +      * we're back, restore the window, and turn on the
  869. +      * keyboard and mouse
  870. +      * reset nonblocking mode on stderr.
  871. +      */
  872. +     i = fcntl(2, F_GETFL, 0);
  873. +     if (i >= 0)
  874. +         i = fcntl(2, F_SETFL, i | FNDELAY);
  875. +     if (i < 0) {
  876. +         perror("fcntl");
  877. +         ErrorF("InitOutput: can't put stderr in non-block mode\n");
  878. +     }
  879. +     win_insert(windowFd);
  880. +     sunMouseProc(pKbd, DEVICE_ON);
  881. +     sunKbdProc(pKbd, DEVICE_ON);
  882. +     /*
  883. +      * refresh all screens
  884. +      */
  885. +     for( i = 0; i < screenInfo.numScreens; )
  886. +         ExposeEveryone(WindowTable[i++]);
  887. + }
  888. + /*
  889. +  * Cause a repaint of area slightly larger than window 
  890. +  * by covering with temp window, and destroying the latter.  
  891. +  * Shamelessly copied from the TileScreenSaver() code in dix/window.c
  892. +  */
  893. + static void
  894. + ExposeEveryone(pWin)
  895. +     WindowPtr pWin;
  896. + {
  897. +     int       result;
  898. +     XID       attributes[2];
  899. +     Mask      mask = CWBackPixmap|CWOverrideRedirect;
  900. +     WindowPtr tempWin;        
  901. +     ScreenPtr pScreen = pWin->drawable.pScreen ;
  902. +     Window    wid     = pWin->drawable.id;
  903. +     
  904. + #define FUDGE 32
  905. +     attributes[0] = None;
  906. +     attributes[1] = xTrue;
  907. +     tempWin = 
  908. +      CreateWindow(FakeClientID(0), pWin,
  909. +           (short)-FUDGE, (short)-FUDGE,
  910. +           (unsigned short)(pScreen->width + FUDGE),
  911. +           (unsigned short)(pScreen->height + FUDGE),
  912. +           0, InputOutput, mask, attributes, 0, serverClient,
  913. +           wVisual(pWin), &result);
  914. +     if (!tempWin)
  915. +     return;
  916. +     if (!AddResource(tempWin->drawable.id, RT_WINDOW, (pointer)tempWin))
  917. +     return;
  918. +     MapWindow(tempWin, serverClient);
  919. +     FreeResource(tempWin->drawable.id,RT_NONE) ;
  920. +     DeleteWindow(tempWin,serverClient) ;
  921. + }
  922. + #endif    SUN_WINDOWS
  923. *** /tmp/,RCSt1a01947    Wed Apr 24 22:11:48 1991
  924. --- ./server/Imakefile    Mon Sep 24 15:15:44 1990
  925. ***************
  926. *** 230,235 ****
  927. --- 230,238 ----
  928.   #if defined(UseSunWindowsInServer) && UseSunWindowsInServer
  929.   SUNWINDOWSLIBS = -lsunwindow -lpixrect
  930.   #endif
  931. + #if defined(UseSunAudioInServer) && UseSunAudioInServer
  932. + SUNAUDIOLIBS = -laudio
  933. + #endif
  934.   #define need_dix
  935.   #define need_ddx_snf
  936.   #define need_ddx_mi
  937. ***************
  938. *** 240,246 ****
  939.   SUNDIRS = dix ddx/snf ddx/mi ddx/mfb ddx/cfb ddx/sun os/4.2bsd
  940.   SUNOBJS = ddx/sun/sunInit.o $(FONTUTIL)
  941.   SUNLIBS = $(SUN) $(CFB) $(DIX) $(BSD) $(SNF) $(MFB) $(MI) $(EXTENSIONS)
  942. ! SUNSYSLIBS = $(SYSLIBS) $(SUNWINDOWSLIBS)
  943.   XsunDIRS = $(SUNDIRS)
  944.   
  945.   ServerTarget(Xsun,$(EXTDIR) $(FONTUTILDIR) $(SUNDIRS),$(SUNOBJS),$(SUNLIBS),$(SUNSYSLIBS))
  946. --- 243,249 ----
  947.   SUNDIRS = dix ddx/snf ddx/mi ddx/mfb ddx/cfb ddx/sun os/4.2bsd
  948.   SUNOBJS = ddx/sun/sunInit.o $(FONTUTIL)
  949.   SUNLIBS = $(SUN) $(CFB) $(DIX) $(BSD) $(SNF) $(MFB) $(MI) $(EXTENSIONS)
  950. ! SUNSYSLIBS = $(SUNAUDIOLIBS) $(SYSLIBS) $(SUNWINDOWSLIBS)
  951.   XsunDIRS = $(SUNDIRS)
  952.   
  953.   ServerTarget(Xsun,$(EXTDIR) $(FONTUTILDIR) $(SUNDIRS),$(SUNOBJS),$(SUNLIBS),$(SUNSYSLIBS))
  954. *** /tmp/,RCSt1a01950    Wed Apr 24 22:11:49 1991
  955. --- ./clients/xinit/Imakefile    Mon Oct  1 17:18:13 1990
  956. ***************
  957. *** 1,4 ****
  958. --- 1,8 ----
  959. + #ifdef SunArchitecture
  960. +         DEFINES = SunWindowsDefines ConnectionFlags -DBINDIR=\"$(BINDIR)\"
  961. + #else
  962.           DEFINES = ConnectionFlags -DBINDIR=\"$(BINDIR)\"
  963. + #endif
  964.           DEPLIBS = $(DEPXMULIB) $(DEPXLIB)
  965.   LOCAL_LIBRARIES = $(XMULIB) $(XLIB)
  966.             SRCS1 = xinit.c 
  967. *** /tmp/,RCSt1a01953    Wed Apr 24 22:11:49 1991
  968. --- ./clients/xinit/xinit.c    Sun Oct  7 03:31:52 1990
  969. ***************
  970. *** 141,146 ****
  971. --- 141,150 ----
  972.       return;
  973.   }
  974.   
  975. + #ifdef sun
  976. + static char    *under_sunview;
  977. + #endif
  978.   main(argc, argv)
  979.   int argc;
  980.   register char **argv;
  981. ***************
  982. *** 175,181 ****
  983.            * that means SunWindows isn't running, so we should pass 
  984.            * the -C flag to xterm so that it sets up a console.
  985.            */
  986. !         if ( getenv("WINDOW_PARENT") == NULL )
  987.               *cptr++ = "-C";
  988.   #endif /* sun */
  989.       } else {
  990. --- 179,185 ----
  991.            * that means SunWindows isn't running, so we should pass 
  992.            * the -C flag to xterm so that it sets up a console.
  993.            */
  994. !         if ( (under_sunview=getenv("WINDOW_PARENT")) == NULL )
  995.               *cptr++ = "-C";
  996.   #endif /* sun */
  997.       } else {
  998. ***************
  999. *** 290,298 ****
  1000.       signal(SIGUSR1, sigUsr1);
  1001.       if ((serverpid = startServer(server)) > 0
  1002.        && (clientpid = startClient(client)) > 0) {
  1003. !         pid = -1;
  1004. !         while (pid != clientpid && pid != serverpid)
  1005.               pid = wait(NULL);
  1006.       }
  1007.       signal(SIGQUIT, SIG_IGN);
  1008.       signal(SIGINT, SIG_IGN);
  1009. --- 294,315 ----
  1010.       signal(SIGUSR1, sigUsr1);
  1011.       if ((serverpid = startServer(server)) > 0
  1012.        && (clientpid = startClient(client)) > 0) {
  1013. ! #ifndef SUN_WINDOWS
  1014. !         for (pid = -1;  pid != clientpid && pid != serverpid;)
  1015.               pid = wait(NULL);
  1016. + #else
  1017. +         for(pid=-1; pid != clientpid && pid != serverpid;) 
  1018. +         {
  1019. +             pid = wait3(&status, WUNTRACED, NULL) ;
  1020. +             if ( under_sunview && pid == serverpid )
  1021. +                 if (WIFSTOPPED(status)) {
  1022. +                     (void)sigblock(SIGCHLD) ;
  1023. +                     (void)kill(0,SIGSTOP) ;
  1024. +                     (void)kill(serverpid,SIGCONT) ;
  1025. +                     pid = -1;
  1026. +                 }
  1027. +         }
  1028. + #endif
  1029.       }
  1030.       signal(SIGQUIT, SIG_IGN);
  1031.       signal(SIGINT, SIG_IGN);
  1032. *** /tmp/,RCSt1a01956    Wed Apr 24 22:11:50 1991
  1033. --- ./config/sun.cf    Mon Oct 15 21:42:41 1990
  1034. ***************
  1035. *** 10,18 ****
  1036.   #define OSMinorVersion    1
  1037.   #define HasSaberC      NO        /* for machines that have it */
  1038.   #define HasNdbm          YES
  1039. ! #define XsunServer       Xsun
  1040.   
  1041. ! #define HasGcc           NO      /* VERY USEFUL for server on Sun3 */
  1042.   
  1043.   #define SystemV           NO
  1044.   #define HasPutenv YES
  1045. --- 10,24 ----
  1046.   #define OSMinorVersion    1
  1047.   #define HasSaberC      NO        /* for machines that have it */
  1048.   #define HasNdbm          YES
  1049. ! #define XsunServer      Xsun
  1050. ! #define ManPath          /usr/local/man
  1051. ! #define ManSuffix      1
  1052.   
  1053. ! #ifdef sparc
  1054. ! #define HasGcc NO
  1055. ! #else
  1056. ! #define HasGcc YES     /* VERY USEFUL for server on Sun3 */
  1057. ! #endif
  1058.   
  1059.   #define SystemV           NO
  1060.   #define HasPutenv YES
  1061. ***************
  1062. *** 42,47 ****
  1063. --- 48,54 ----
  1064.   
  1065.   /* you may find one or both of these options useful on your system */
  1066.   /* #define DefaultCCOptions -f68881 -pipe */
  1067. + #define DefaultCCOptions -pipe
  1068.   
  1069.   #define LibraryCCOptions /* don't want special floating point */
  1070.   #define LibraryDefines  /**/
  1071. ***************
  1072. *** 53,59 ****
  1073. --- 60,70 ----
  1074.   
  1075.   #if OSMajorVersion == 3 && OSMinorVersion <= 2
  1076.   #define OptimizedCDebugFlags /* as nothing */
  1077. + #else
  1078. + #ifdef SparcArchitecture
  1079. + #define OptimizedCDebugFlags    -O4
  1080.   #endif
  1081. + #endif
  1082.   
  1083.   #define UseSunWindowsInServer    YES    /* link in SunWindows support? */
  1084.   
  1085. ***************
  1086. *** 63,68 ****
  1087. --- 74,106 ----
  1088.   #define SunWindowsDefines /* as nothing */
  1089.   #endif
  1090.   
  1091. + #define UseSunAudioInServer    YES
  1092. + #define UseSunNumlock        YES    /* enable numlock support on type4 kbds? */
  1093. + #if UseSunNumlock
  1094. + #if OSMajorVersion >= 4 && OSMinorVersion >= 1
  1095. + #define SunNumlockDefines    -DSUN_NUMLOCK -DSUN_LED_SUPPORT
  1096. + #else
  1097. + #define SunNumlockDefines    -DSUN_NUMLOCK
  1098. + #endif
  1099. + #else
  1100. + #define SunNumlockDefines    /* as nothing */
  1101. + #endif
  1102. + #if UseSunAudioInServer
  1103. + #if OSMajorVersion >= 4 && OSMinorVersion >= 1
  1104. + #define UseSunAudioInServer    YES    /* use /dev/audio for bell? */
  1105. + #else
  1106. + #define UseSunAudioInServer    NO
  1107. + #endif
  1108. + #endif
  1109. + #if UseSunAudioInServer
  1110. + #define SunAudioDefines -DSUN_AUDIO_FILE=\"XSUNBELLFILE\"
  1111. + #else
  1112. + #define SunAudioDefines    /* as nothing */
  1113. + #endif
  1114.   /* define this as you like for server compilation */
  1115.   #if OSMajorVersion >= 4 || defined(SparcArchitecture)
  1116.   #define AllocateLocalDefines -DINCLUDE_ALLOCA_H
  1117. ***************
  1118. *** 70,78 ****
  1119.   #define AllocateLocalDefines /**/
  1120.   #endif
  1121.   
  1122. ! #define ExtensionDefines -DSHAPE -DMITSHM -DMULTIBUFFER -DMITMISC
  1123.   
  1124. ! #define ServerDefines -DXDMCP SunWindowsDefines ExtensionDefines AllocateLocalDefines
  1125.   
  1126.   #if OSMajorVersion >= 4 && OSMinorVersion >= 0
  1127.   #define SetTtyGroup YES
  1128. --- 108,116 ----
  1129.   #define AllocateLocalDefines /**/
  1130.   #endif
  1131.   
  1132. ! #define ExtensionDefines -DMULTIBUFFER
  1133.   
  1134. ! #define ServerDefines -DXDMCP SunNumlockDefines SunWindowsDefines SunAudioDefines ExtensionDefines AllocateLocalDefines
  1135.   
  1136.   #if OSMajorVersion >= 4 && OSMinorVersion >= 0
  1137.   #define SetTtyGroup YES
  1138. --
  1139.         Viktor Dukhovni <viktor@shearson.com>       : ARPA
  1140.                 <...!uunet!shearson.com!viktor>     : UUCP
  1141.         388 Greenwich St., 11th floor, NY, NY 10013 : US-Post
  1142.                 +1-(212)-464-3793                   : VOICE
  1143.  
  1144. --
  1145. Dan Heller
  1146. O'Reilly && Associates       Z-Code Software    Comp-sources-x:
  1147. Senior Writer                President          comp-sources.x@uunet.uu.net
  1148. argv@ora.com                 argv@zipcode.com
  1149.