home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume16 / nethack31 / patch1j / patches01s next >
Text File  |  1993-03-05  |  54KB  |  1,983 lines

  1. *** /tmp/da09374    Thu Feb 25 10:29:06 1993
  2. --- sys/mac/maccurs.c    Sun Feb 21 16:06:06 1993
  3. ***************
  4. *** 91,96 ****
  5. --- 91,99 ----
  6.   }
  7.   
  8.   
  9. + #if 0
  10. + /* Now we use click_to_cmd() instead. */
  11.   int
  12.   clickSector ( int x , int y , int toX , int toY )
  13.   {
  14. ***************
  15. *** 155,161 ****
  16.       }
  17.   }
  18.   
  19.   
  20.   
  21.   Boolean
  22. --- 158,164 ----
  23.       }
  24.   }
  25.   
  26. ! #endif
  27.   
  28.   
  29.   Boolean
  30. *** /tmp/da09398    Thu Feb 25 10:29:12 1993
  31. --- sys/mac/macmain.c    Thu Feb 11 12:12:23 1993
  32. ***************
  33. *** 114,120 ****
  34.           boolean remember_wiz_mode = wizard;
  35.   #endif
  36.   #ifdef NEWS
  37. !         if(flags.news) display_file(NEWS, FALSE);
  38.   #endif
  39.           pline("Restoring save file...");
  40.           mark_synch();    /* flush output */
  41. --- 114,123 ----
  42.           boolean remember_wiz_mode = wizard;
  43.   #endif
  44.   #ifdef NEWS
  45. !         if(flags.news) {
  46. !             display_file(NEWS, FALSE);
  47. !             flags.news = FALSE;    /* in case dorecover() fails */
  48. !         }
  49.   #endif
  50.           pline("Restoring save file...");
  51.           mark_synch();    /* flush output */
  52. ***************
  53. *** 174,185 ****
  54.       attemptingto("proceed");
  55.   #if defined(MAC_MPW32) && !defined(MODEL_FAR)
  56.       UnloadAllSegments();                        /* Do this before naming residents */
  57. !     IsResident( (Ptr) display_nhwindow );        /* Sample resident segments */
  58.       IsResident( (Ptr) rhack );
  59.       IsResident( (Ptr) engr_at );
  60.       IsResident( (Ptr) movemon );
  61.       IsResident( (Ptr) attacktype ) ;
  62.       IsResident( (Ptr) mac_get_nh_event ) ;
  63.   #endif
  64.       moveloop();
  65.       /*NOTREACHED*/
  66. --- 177,197 ----
  67.       attemptingto("proceed");
  68.   #if defined(MAC_MPW32) && !defined(MODEL_FAR)
  69.       UnloadAllSegments();                        /* Do this before naming residents */
  70. !     IsResident( (Ptr) um_dist );                /* Sample resident segments */
  71. !     IsResident( (Ptr) flush_screen );
  72.       IsResident( (Ptr) rhack );
  73. +     IsResident( (Ptr) remove_cadavers );
  74. +     IsResident( (Ptr) dog_move );
  75. +     IsResident( (Ptr) gethungry );
  76.       IsResident( (Ptr) engr_at );
  77. +     IsResident( (Ptr) domove );
  78. +     IsResident( (Ptr) carried );
  79.       IsResident( (Ptr) movemon );
  80.       IsResident( (Ptr) attacktype ) ;
  81.       IsResident( (Ptr) mac_get_nh_event ) ;
  82. +     IsResident( (Ptr) dosounds ) ;
  83. +     IsResident( (Ptr) t_at ) ;
  84. +     IsResident( (Ptr) nh_timeout ) ;
  85.   #endif
  86.       moveloop();
  87.       /*NOTREACHED*/
  88. ***************
  89. *** 434,441 ****
  90.   #define    kUnLoaded 0x3F3C                /* if unloaded then a LoadSeg trap */
  91.                                           /* Note: probably incorrect for -model far! */
  92.   
  93. ! /* #define TRACKSEGS /* Utility to print a trace of segment load frequencies. Add
  94. !    a call to ListGUnloads into terminate() in end.c to use it */
  95.   
  96.   #ifdef TRACKSEGS
  97.   
  98. --- 446,452 ----
  99.   #define    kUnLoaded 0x3F3C                /* if unloaded then a LoadSeg trap */
  100.                                           /* Note: probably incorrect for -model far! */
  101.   
  102. ! /* #define TRACKSEGS /* Utility to print a trace of segment load frequencies. */
  103.   
  104.   #ifdef TRACKSEGS
  105.   
  106. ***************
  107. *** 447,453 ****
  108.     int i;
  109.     FILE *f;
  110.     
  111. !   f = fopen("unloads","r+");
  112.     fprintf(f,"%d calls to UnloadAllSegments\n\n",gUnloads[0]);
  113.     for (i=1; i<=pMaxSegNum; i++) {
  114.        fprintf(f,"Unloaded %10s, segment %2d, %6d times\n",gSegNames[i],i,gUnloads[i]);
  115. --- 458,464 ----
  116.     int i;
  117.     FILE *f;
  118.     
  119. !   f = fopen("unloads","w");
  120.     fprintf(f,"%d calls to UnloadAllSegments\n\n",gUnloads[0]);
  121.     for (i=1; i<=pMaxSegNum; i++) {
  122.        fprintf(f,"Unloaded %10s, segment %2d, %6d times\n",gSegNames[i],i,gUnloads[i]);
  123. ***************
  124. *** 504,509 ****
  125. --- 515,521 ----
  126.       SetResLoad(false);    
  127.   
  128.       #ifdef TRACKSEGS
  129. +     atexit(&ListGUnloads);
  130.       gUnloads[0]=0;
  131.       #endif
  132.       for (i=1; i<=pMaxSegNum; i++) {
  133. *** /tmp/da09414    Thu Feb 25 10:29:17 1993
  134. --- sys/mac/mactopl.c    Thu Feb 18 17:37:56 1993
  135. ***************
  136. *** 7,13 ****
  137.   #include <OSUtils.h>
  138.   #include <Packages.h>
  139.   
  140. - // int NDECL(mac_doprev_message);
  141.   // char FDECL(yn_function,(const char *, const char *, CHAR_P));
  142.   
  143.   int FDECL ( try_key_queue , ( char * ) ) ;
  144. --- 7,12 ----
  145. ***************
  146. *** 25,59 ****
  147.   extern winid inSelect ;
  148.   extern short frame_corner ;
  149.   
  150. - int
  151. - mac_doprev_message(void)
  152. - {
  153. -     NhWindow * aWin = & theWindows [ WIN_MESSAGE ] ;
  154. -     char * start , * stop ;
  155.   
  156. -     if ( ! WIN_MESSAGE )
  157. -         return 0 ;
  158. -     stop = * aWin -> windowText ;
  159. -     start = * aWin -> windowText + aWin -> textBase - 2 ;
  160. -     while ( start > stop && * start != 10 && * start != 13 )
  161. -         start -- ;
  162. -     if ( start <= stop )
  163. -         aWin -> textBase = 0L ;
  164. -     else
  165. -         aWin -> textBase = start - stop + 1 ;
  166. -     if ( aWin -> textBase > aWin -> windowTextLen )
  167. -         aWin -> textBase = aWin -> windowTextLen ;
  168. -     display_nhwindow ( WIN_MESSAGE , FALSE ) ;
  169. -     InvalRect ( & ( aWin -> theWindow -> portRect ) ) ;
  170. -     return 0 ;
  171. - }
  172.   char
  173.   queued_resp(char *resp)
  174.   {
  175. --- 24,30 ----
  176. ***************
  177. *** 414,420 ****
  178.           topl_set_resp(resp, def);
  179.   
  180.           do {
  181. !             c = nhgetch();
  182.               if (c && resp && !strchr(resp, c)) {
  183.                   nhbell();
  184.                   c = '\0';
  185. --- 385,391 ----
  186.           topl_set_resp(resp, def);
  187.   
  188.           do {
  189. !             c = readchar();
  190.               if (c && resp && !strchr(resp, c)) {
  191.                   nhbell();
  192.                   c = '\0';
  193. *** /tmp/da09430    Thu Feb 25 18:16:50 1993
  194. --- sys/mac/macwin.c    Thu Feb 25 18:07:54 1993
  195. ***************
  196. *** 79,85 ****
  197. --- 79,100 ----
  198.   
  199.   Boolean gClickedToMove = 0 ; /* For ObscureCursor */
  200.   
  201. + static unsigned long gNextClickRepeat = 0xffffffff ;
  202.   
  203. + static Point clicked_pos ;    /* For nh_poskey */
  204. + static int clicked_mod ;
  205. + static Boolean cursor_locked = false ;
  206. + void
  207. + lock_mouse_cursor(Boolean new_cursor_locked)
  208. + {
  209. +     cursor_locked = new_cursor_locked;
  210. +     if (new_cursor_locked)
  211. +         PostEvent(osEvt, mouseMovedMessage<<24);
  212. + }
  213.   /*
  214.    * Add key to input queue, force means replace last if full
  215.    */
  216. ***************
  217. *** 115,120 ****
  218. --- 130,140 ----
  219.   MacFlags macFlags ;
  220.   
  221.   /*
  222. +  * The screen layouts on the small 512x342 screen need special cares.
  223. +  */
  224. + Boolean small_screen;
  225. + /*
  226.    * Async flag for keeping track of scrollbars...
  227.    * Used by InvalScrollBar ( )
  228.    */
  229. ***************
  230. *** 121,129 ****
  231.   static NhWindow * asyDSC = (NhWindow *) NULL ;
  232.   
  233.   /*
  234. !  * The font to be used in the text window
  235.    */
  236. ! short text_wind_font = geneva;
  237.   
  238.   /*
  239.    * Whether to adjust the height of a text window according to its contents
  240. --- 141,150 ----
  241.   static NhWindow * asyDSC = (NhWindow *) NULL ;
  242.   
  243.   /*
  244. !  * The font to be used in the text window, will be set to geneva after
  245. !  * we create the base window
  246.    */
  247. ! short text_wind_font = monaco;
  248.   
  249.   /*
  250.    * Whether to adjust the height of a text window according to its contents
  251. ***************
  252. *** 136,146 ****
  253.   MenuHandle appleMenu ;
  254.   MenuHandle fileMenu ;
  255.   MenuHandle editMenu ;
  256. ! MenuHandle extendMenu ;
  257. ! MenuHandle miscMenu ;
  258. ! MenuHandle helpMenu ;
  259. ! MenuHandle commandsMenu ;
  260.   MenuHandle thingsMenu ;
  261.   
  262.   #define NHW_BASE 0
  263.   winid BASE_WINDOW ; // Was: , WIN_MAP , WIN_MESSAGE , WIN_INVEN , WIN_STATUS ;
  264. --- 157,168 ----
  265.   MenuHandle appleMenu ;
  266.   MenuHandle fileMenu ;
  267.   MenuHandle editMenu ;
  268. ! MenuHandle actionMenu ;
  269. ! MenuHandle inventoryMenu ;
  270.   MenuHandle thingsMenu ;
  271. + MenuHandle extendedMenu ;
  272. + MenuHandle infoMenu ;
  273. + MenuHandle helpMenu ;
  274.   
  275.   #define NHW_BASE 0
  276.   winid BASE_WINDOW ; // Was: , WIN_MAP , WIN_MESSAGE , WIN_INVEN , WIN_STATUS ;
  277. ***************
  278. *** 271,277 ****
  279.       InitSegMgmt( itworked );    /* itworked is always in the main segment */
  280.       
  281.       attemptingto("start up");
  282. !     
  283.       if ( Gestalt ( gestaltOSAttr , & l ) ) {
  284.           macFlags . processes = 0 ;
  285.           macFlags . tempMem = 0 ;
  286. --- 293,299 ----
  287.       InitSegMgmt( itworked );    /* itworked is always in the main segment */
  288.       
  289.       attemptingto("start up");
  290.       if ( Gestalt ( gestaltOSAttr , & l ) ) {
  291.           macFlags . processes = 0 ;
  292.           macFlags . tempMem = 0 ;
  293. ***************
  294. *** 324,330 ****
  295.   }
  296.   
  297.   
  298. ! #define MAX_HEIGHT 200
  299.   #define MIN_HEIGHT 50
  300.   #define MIN_WIDTH 300
  301.   
  302. --- 346,352 ----
  303.   }
  304.   
  305.   
  306. ! #define MAX_HEIGHT 100
  307.   #define MIN_HEIGHT 50
  308.   #define MIN_WIDTH 300
  309.   
  310. ***************
  311. *** 355,361 ****
  312.       width = nhWin -> charWidth * NUM_COLS ;
  313.   
  314.       if ( ! RetrievePosition ( kMapWindow , & top , & left ) ) {
  315. !         top = GetMBarHeight ( ) * 2 ;
  316.           left = ( screenArea . right - width ) / 2 ;
  317.       }
  318.   
  319. --- 377,383 ----
  320.       width = nhWin -> charWidth * NUM_COLS ;
  321.   
  322.       if ( ! RetrievePosition ( kMapWindow , & top , & left ) ) {
  323. !         top = GetMBarHeight ( ) + ( small_screen ? 2 : 20 ) ;
  324.           left = ( screenArea . right - width ) / 2 ;
  325.       }
  326.   
  327. ***************
  328. *** 389,400 ****
  329.       theWindow = nhWin -> theWindow ;
  330.   
  331.       if ( ! RetrievePosition ( kMessageWindow , & top , & left ) ) {
  332. !         top = statTop + statHeight + 20 ;
  333.           left = statLeft ;
  334.       }
  335.   
  336.       if ( ! RetrieveSize ( kMessageWindow , top , left , & height , & width ) ) {
  337. !         height = screenArea . bottom - top - 2 ;
  338.           if ( height > MAX_HEIGHT ) {
  339.               height = MAX_HEIGHT ;
  340.           } else if ( height < MIN_HEIGHT ) {
  341. --- 411,424 ----
  342.       theWindow = nhWin -> theWindow ;
  343.   
  344.       if ( ! RetrievePosition ( kMessageWindow , & top , & left ) ) {
  345. !         top = statTop + statHeight ;
  346. !         if ( ! small_screen )
  347. !             top += 20 ;
  348.           left = statLeft ;
  349.       }
  350.   
  351.       if ( ! RetrieveSize ( kMessageWindow , top , left , & height , & width ) ) {
  352. !         height = screenArea . bottom - top - ( small_screen ? 2-SBARHEIGHT : 2 ) ;
  353.           if ( height > MAX_HEIGHT ) {
  354.               height = MAX_HEIGHT ;
  355.           } else if ( height < MIN_HEIGHT ) {
  356. ***************
  357. *** 410,419 ****
  358.       mesgWidth = width ;
  359.   
  360.   /* Move these windows */
  361. -     MoveWindow ( theWindows [ WIN_STATUS ] . theWindow , statLeft , statTop , 1 ) ;
  362. -     SizeWindow ( theWindows [ WIN_STATUS ] . theWindow , statWidth , statHeight , 1 ) ;
  363.       MoveWindow ( theWindows [ WIN_MESSAGE ] . theWindow , mesgLeft , mesgTop , 1 ) ;
  364.       SizeWindow ( theWindows [ WIN_MESSAGE ] . theWindow , mesgWidth , mesgHeight , 1 ) ;
  365.       MoveWindow ( theWindows [ WIN_MAP ] . theWindow , mainLeft , mainTop , 1 ) ;
  366.       SizeWindow ( theWindows [ WIN_MAP ] . theWindow , mainWidth , mainHeight , 1 ) ;
  367.   
  368. --- 434,443 ----
  369.       mesgWidth = width ;
  370.   
  371.   /* Move these windows */
  372.       MoveWindow ( theWindows [ WIN_MESSAGE ] . theWindow , mesgLeft , mesgTop , 1 ) ;
  373.       SizeWindow ( theWindows [ WIN_MESSAGE ] . theWindow , mesgWidth , mesgHeight , 1 ) ;
  374. +     MoveWindow ( theWindows [ WIN_STATUS ] . theWindow , statLeft , statTop , 1 ) ;
  375. +     SizeWindow ( theWindows [ WIN_STATUS ] . theWindow , statWidth , statHeight , 1 ) ;
  376.       MoveWindow ( theWindows [ WIN_MAP ] . theWindow , mainLeft , mainTop , 1 ) ;
  377.       SizeWindow ( theWindows [ WIN_MAP ] . theWindow , mainWidth , mainHeight , 1 ) ;
  378.   
  379. ***************
  380. *** 437,443 ****
  381.                       } else {
  382.                           if ( ! RetrievePosition ( kTextWindow , & top , & left ) ) {
  383.                               top = GetMBarHeight ( ) * 2 ;
  384. !                             left = screenArea . right - 3 ;
  385.                           }
  386.                           top += ( numText * GetMBarHeight ( ) ) ;
  387.                           while ( top > screenArea . bottom - MIN_HEIGHT ) {
  388. --- 461,468 ----
  389.                       } else {
  390.                           if ( ! RetrievePosition ( kTextWindow , & top , & left ) ) {
  391.                               top = GetMBarHeight ( ) * 2 ;
  392. !                             left = screenArea . right - 3 - ( theWindow -> portRect . right -
  393. !                                                               theWindow -> portRect . left ) ;
  394.                           }
  395.                           top += ( numText * GetMBarHeight ( ) ) ;
  396.                           while ( top > screenArea . bottom - MIN_HEIGHT ) {
  397. ***************
  398. *** 445,452 ****
  399.                               left -= 20 ;
  400.                           }
  401.                           numText ++ ;
  402. !                         MoveWindow ( theWindow , left - ( theWindow -> portRect . right -
  403. !                             theWindow -> portRect . left ) , top , 1 ) ;
  404.                       }
  405.                   }
  406.               }
  407. --- 470,476 ----
  408.                               left -= 20 ;
  409.                           }
  410.                           numText ++ ;
  411. !                         MoveWindow ( theWindow , left , top , 1 ) ;
  412.                       }
  413.                   }
  414.               }
  415. ***************
  416. *** 498,504 ****
  417.       ( ( WindowPeek ) aWin -> theWindow ) -> windowKind = WIN_BASE_KIND
  418.           + type ;
  419.       aWin -> windowTextLen = 0L ;
  420. -     aWin -> textBase = 0L ;
  421.       aWin -> clear = 0 ; /* Yes, we need to inval the area on a clear */
  422.       aWin -> scrollBar = (ControlHandle) NULL ;
  423.       switch ( type ) {
  424. --- 522,527 ----
  425. ***************
  426. *** 530,535 ****
  427. --- 553,560 ----
  428.               aWin -> theWindow = (WindowPtr) NULL ;
  429.               return WIN_ERR ;
  430.           }
  431. +         aWin -> windowTextLen = 0L ;
  432. +         aWin -> lin = 0 ;
  433.           break ;
  434.       }
  435.   
  436. ***************
  437. *** 600,606 ****
  438.           siz . bottom - siz . top , FALSE ) ;
  439.       MoveWindow ( aWin -> theWindow , siz . left , siz . top , FALSE ) ;
  440.   
  441. !     if ( type == NHW_MENU || type == NHW_TEXT ) {
  442.           Rect r = siz ;
  443.           Boolean bool ;
  444.           OffsetRect ( & r , - r . left , - r . top ) ;
  445. --- 625,631 ----
  446.           siz . bottom - siz . top , FALSE ) ;
  447.       MoveWindow ( aWin -> theWindow , siz . left , siz . top , FALSE ) ;
  448.   
  449. !     if ( type == NHW_MENU || type == NHW_TEXT || type == NHW_MESSAGE ) {
  450.           Rect r = siz ;
  451.           Boolean bool ;
  452.           OffsetRect ( & r , - r . left , - r . top ) ;
  453. ***************
  454. *** 619,624 ****
  455. --- 644,660 ----
  456.   }
  457.   
  458.   
  459. + static MenuHandle
  460. + mustGetMHandle(int menu_id)
  461. + {
  462. +     MenuHandle menu = GetMHandle(menu_id);
  463. +     if (menu == nil) {
  464. +         comment("Cannot find the menu.", menu_id);
  465. +         ExitToShell();
  466. +     }
  467. +     return menu;
  468. + }
  469.   void
  470.   InitRes ( void )
  471.   {
  472. ***************
  473. *** 628,650 ****
  474.       mustwork(ResError());
  475.       SetMenuBar ( mBar ) ;
  476.       
  477. !     appleMenu = GetMHandle ( 128 ) ;
  478. !     mustwork(ResError());
  479.       AppendMenu ( appleMenu , ( ConstStr255Param ) "\002(-" ) ;
  480.       AddResMenu ( appleMenu , 'DRVR' ) ;
  481.   
  482. !     fileMenu = GetMHandle ( 129 ) ;
  483. !     mustwork(ResError());
  484. !     editMenu = GetMHandle ( 130 ) ;
  485. !     mustwork(ResError());
  486. !     extendMenu = GetMHandle ( 131 ) ;
  487. !     mustwork(ResError());
  488. !     miscMenu = GetMHandle ( 132 ) ;
  489. !     mustwork(ResError());
  490. !     commandsMenu = GetMHandle ( 133 ) ;
  491. !     mustwork ( ResError ( ) ) ;
  492. !     thingsMenu = GetMHandle ( 134 ) ;
  493. !     mustwork ( ResError ( ) ) ;
  494.   
  495.       if ( macFlags . help ) {
  496.           if ( HMGetHelpMenuHandle ( & helpMenu ) ) {
  497. --- 664,680 ----
  498.       mustwork(ResError());
  499.       SetMenuBar ( mBar ) ;
  500.       
  501. !     appleMenu = mustGetMHandle ( 128 ) ;
  502.       AppendMenu ( appleMenu , ( ConstStr255Param ) "\002(-" ) ;
  503.       AddResMenu ( appleMenu , 'DRVR' ) ;
  504.   
  505. !     fileMenu = mustGetMHandle ( 129 ) ;
  506. !     editMenu = mustGetMHandle ( 130 ) ;
  507. !     actionMenu = mustGetMHandle ( 131 ) ;
  508. !     inventoryMenu = mustGetMHandle ( 132 ) ;
  509. !     thingsMenu = mustGetMHandle ( 133 ) ;
  510. !     extendedMenu = mustGetMHandle ( 134 ) ;
  511. !     infoMenu = mustGetMHandle ( 135 ) ;
  512.   
  513.       if ( macFlags . help ) {
  514.           if ( HMGetHelpMenuHandle ( & helpMenu ) ) {
  515. ***************
  516. *** 667,672 ****
  517. --- 697,706 ----
  518.   {
  519.       int i ;
  520.   
  521. +     Rect scr = (*GetGrayRgn())->rgnBBox;
  522. +     small_screen = scr.bottom - scr.top <=    9*40 ||
  523. +                    scr.bottom - scr.top <= 12*40 && flags.large_font;
  524.       InitRes ( ) ;
  525.   
  526.       theWindows = ( NhWindow * ) NewPtr ( NUM_MACWINDOWS *
  527. ***************
  528. *** 688,698 ****
  529.       putstr(BASE_WINDOW, 0,
  530.         "         By Stichting Mathematisch Centrum and M. Stephenson.");
  531.       putstr(BASE_WINDOW, 0, "         See license for details.");
  532. !     putstr(BASE_WINDOW, 0, "  ");
  533.       display_nhwindow(BASE_WINDOW, FALSE);
  534.   
  535.       flags . window_inited = 1 ;
  536.       DimMenuBar ( ) ;
  537.   }
  538.   
  539.   
  540. --- 722,733 ----
  541.       putstr(BASE_WINDOW, 0,
  542.         "         By Stichting Mathematisch Centrum and M. Stephenson.");
  543.       putstr(BASE_WINDOW, 0, "         See license for details.");
  544. !     putstr(BASE_WINDOW, 0, "");
  545.       display_nhwindow(BASE_WINDOW, FALSE);
  546.   
  547.       flags . window_inited = 1 ;
  548.       DimMenuBar ( ) ;
  549. +     normal_font ( ) ;
  550.   }
  551.   
  552.   
  553. ***************
  554. *** 720,726 ****
  555.       Rect r2 = theWindow -> portRect ;
  556.       Rect r = r2 ;
  557.       Boolean vis ;
  558. !     short val ;
  559.   
  560.       if ( ! aWin -> scrollBar ) {
  561.           return ;
  562. --- 755,761 ----
  563.       Rect r2 = theWindow -> portRect ;
  564.       Rect r = r2 ;
  565.       Boolean vis ;
  566. !     short val , lin ;
  567.   
  568.       if ( ! aWin -> scrollBar ) {
  569.           return ;
  570. ***************
  571. *** 730,738 ****
  572.       r2 . bottom -= SBARHEIGHT ;
  573.       r2 . right += 1 ;
  574.       r2 . top -= 1 ;
  575. !     MoveControl ( aWin -> scrollBar , r2 . left , r2 . top ) ;
  576. !     SizeControl ( aWin -> scrollBar , r2 . right - r2 . left ,
  577. !         r2 . bottom - r2 . top ) ;
  578.       vis = ( r2 . bottom > r2 . top + 50 ) ;
  579.       if ( vis && ! ( * aWin -> scrollBar ) -> contrlVis ) {
  580.           ShowControl ( aWin -> scrollBar ) ;
  581. --- 765,777 ----
  582.       r2 . bottom -= SBARHEIGHT ;
  583.       r2 . right += 1 ;
  584.       r2 . top -= 1 ;
  585. !     if ( ( * aWin -> scrollBar ) -> contrlRect . top  != r2 . top ||
  586. !          ( * aWin -> scrollBar ) -> contrlRect . left != r2 . left )
  587. !         MoveControl ( aWin -> scrollBar , r2 . left , r2 . top ) ;
  588. !     if ( ( * aWin -> scrollBar ) -> contrlRect . bottom != r2 . bottom ||
  589. !          ( * aWin -> scrollBar ) -> contrlRect . right  != r2 . right )
  590. !         SizeControl ( aWin -> scrollBar , r2 . right  - r2 . left ,
  591. !                                           r2 . bottom - r2 . top ) ;
  592.       vis = ( r2 . bottom > r2 . top + 50 ) ;
  593.       if ( vis && ! ( * aWin -> scrollBar ) -> contrlVis ) {
  594.           ShowControl ( aWin -> scrollBar ) ;
  595. ***************
  596. *** 739,747 ****
  597.       } else if ( ! vis && ( * aWin -> scrollBar ) -> contrlVis ) {
  598.           HideControl ( aWin -> scrollBar ) ;
  599.       }
  600. !     if ( aWin -> lin ) {
  601. !         short max = aWin -> lin - ( r . bottom - r . top ) / aWin ->
  602.               charHeight ;
  603.           if ( max < 0 ) max = 0 ;
  604.           SetCtlMax ( aWin -> scrollBar , max ) ;
  605.           if ( max ) HiliteControl ( aWin -> scrollBar , 0 ) ;
  606. --- 778,794 ----
  607.       } else if ( ! vis && ( * aWin -> scrollBar ) -> contrlVis ) {
  608.           HideControl ( aWin -> scrollBar ) ;
  609.       }
  610. !     lin = aWin -> lin;
  611. !     if ( aWin == theWindows + WIN_MESSAGE ) {
  612. !         short min ;
  613. !         r . bottom -= SBARHEIGHT + 1 ;
  614. !         min = aWin -> save_lin + ( r . bottom - r . top ) / aWin ->
  615.               charHeight ;
  616. +         if ( lin < min )
  617. +             lin = min ;
  618. +     }
  619. +     if ( lin ) {
  620. +         short max = lin - ( r . bottom - r . top ) / aWin -> charHeight ;
  621.           if ( max < 0 ) max = 0 ;
  622.           SetCtlMax ( aWin -> scrollBar , max ) ;
  623.           if ( max ) HiliteControl ( aWin -> scrollBar , 0 ) ;
  624. ***************
  625. *** 775,780 ****
  626. --- 822,828 ----
  627.   mac_clear_nhwindow ( winid win )
  628.   {
  629.       long l ;
  630. +     Rect r ;
  631.       register char * start , * stop ;
  632.       WindowPtr theWindow ;
  633.       NhWindow * aWin = & theWindows [ win ] ;
  634. ***************
  635. *** 791,797 ****
  636.           return ;
  637.       }
  638.       SetPort ( theWindow ) ;
  639. !     InvalRect ( & ( theWindow -> portRect ) ) ;
  640.       switch ( ( ( WindowPeek ) theWindow ) -> windowKind - WIN_BASE_KIND ) {
  641.       case NHW_MAP :
  642.           stop = ( char * ) ( ( MapData * ) ( * aWin -> windowText ) )
  643. --- 839,850 ----
  644.           return ;
  645.       }
  646.       SetPort ( theWindow ) ;
  647. !     r = theWindow -> portRect ;
  648. !     if ( aWin -> scrollBar )
  649. !         r . right -= SBARWIDTH + 1 ;
  650. !     if ( aWin == theWindows + WIN_MESSAGE )
  651. !         r . bottom -= SBARHEIGHT + 1 ;
  652. !     InvalRect ( & r ) ;
  653.       switch ( ( ( WindowPeek ) theWindow ) -> windowKind - WIN_BASE_KIND ) {
  654.       case NHW_MAP :
  655.           stop = ( char * ) ( ( MapData * ) ( * aWin -> windowText ) )
  656. ***************
  657. *** 806,836 ****
  658.           while ( start > stop ) * -- start = CHAR_BLANK ;
  659.           break ;
  660.       case NHW_MESSAGE :
  661. !         l = GetHandleSize ( aWin -> windowText ) ;
  662. !         if ( l > TEXT_BLOCK * 2 ) {
  663. !             BlockMove ( * aWin -> windowText + TEXT_BLOCK ,
  664. !                 * aWin -> windowText , l - TEXT_BLOCK ) ;
  665. !             SetHandleSize ( aWin -> windowText , l - TEXT_BLOCK ) ;
  666. !             aWin -> windowTextLen -= TEXT_BLOCK ;
  667. !             if ( aWin -> windowTextLen < 0 ) {
  668. !                 aWin -> windowTextLen = 0 ;
  669. !             }
  670.           }
  671. ! #if 1
  672. !         aWin->textBase = aWin->windowTextLen;
  673. ! #else
  674. !         stop = * aWin -> windowText ;
  675. !         start = stop + aWin -> windowTextLen - 1 ;
  676. !         while ( -- start > stop ) {
  677. !             if ( * start == CHAR_CR || * start == CHAR_LF )
  678. !                 break ;
  679.           }
  680. !         if ( start > stop ) {
  681. !             aWin -> textBase = start - stop + 1 ;
  682. !         } else {
  683. !             aWin -> textBase = 0L ;
  684.           }
  685. - #endif
  686.           break ;
  687.       default :
  688.           SetHandleSize ( aWin -> windowText , TEXT_BLOCK ) ;
  689. --- 859,882 ----
  690.           while ( start > stop ) * -- start = CHAR_BLANK ;
  691.           break ;
  692.       case NHW_MESSAGE :
  693. !         l = 0;
  694. !         while (aWin->lin > flags.msg_history) {
  695. !             const char cr = CHAR_CR;
  696. !             l = Munger(aWin->windowText, l, &cr, 1, nil, 0) + 1;
  697. !             --aWin->lin;
  698.           }
  699. !         if (l) {
  700. !             aWin->windowTextLen -= l;
  701. !             BlockMove(*aWin->windowText + l, *aWin->windowText, aWin->windowTextLen);
  702.           }
  703. !         aWin->last_more_lin = aWin->lin;
  704. !         aWin->save_lin        = aWin->lin;
  705. !         aWin->scrollPos = aWin->lin ? aWin->lin - 1 : 0;
  706. !         if (aWin->scrollBar) {
  707. !             SetCtlMax  (aWin->scrollBar, aWin->lin);
  708. !             SetCtlValue(aWin->scrollBar, aWin->scrollPos);
  709. !             InvalScrollBar(aWin);
  710.           }
  711.           break ;
  712.       default :
  713.           SetHandleSize ( aWin -> windowText , TEXT_BLOCK ) ;
  714. ***************
  715. *** 838,844 ****
  716.           aWin -> lin = 0 ;
  717.           aWin -> wid = 0 ;
  718.           aWin -> scrollPos = 0 ;
  719. -         aWin -> textBase = 0L ;
  720.           if ( aWin -> scrollBar ) {
  721.               SetCtlMax ( aWin -> scrollBar , 0 ) ;
  722.               InvalScrollBar ( aWin ) ;
  723. --- 884,889 ----
  724. ***************
  725. *** 853,859 ****
  726.   
  727.   Boolean
  728.   ClosingWindowChar(const int c) {
  729. !     return  c == CHAR_ESC || c == CHAR_BLANK || c == CHAR_LF || c == CHAR_CR ;
  730.   }
  731.   
  732.   
  733. --- 898,905 ----
  734.   
  735.   Boolean
  736.   ClosingWindowChar(const int c) {
  737. !     return  c == CHAR_ESC || c == CHAR_BLANK || c == CHAR_LF || c == CHAR_CR ||
  738. !             c == 'q' ;
  739.   }
  740.   
  741.   
  742. ***************
  743. *** 884,889 ****
  744. --- 930,938 ----
  745.   {
  746.       if (!top_line || in_topl_mode())
  747.           Debugger();
  748. +     putstr(WIN_MESSAGE, ATR_BOLD, query);
  749.       (*top_line)->viewRect.left = 0;
  750.   
  751.       topl_query_len = strlen(query);
  752. ***************
  753. *** 893,899 ****
  754.       TECalText(top_line);
  755.   
  756.       display_nhwindow(WIN_MESSAGE, FALSE);
  757. -     putstr(WIN_MESSAGE, ATR_BOLD, query);
  758.   }
  759.   
  760.   
  761. --- 942,947 ----
  762. ***************
  763. *** 902,912 ****
  764.   {
  765.       int ans_len = (*top_line)->teLength - topl_query_len;
  766.       NhWindow *aWin = theWindows + WIN_MESSAGE;
  767. -     char tmp[3] = "  ";
  768.   
  769.       if (!in_topl_mode())
  770.           Debugger();
  771. -     (*top_line)->viewRect.left += 10000;
  772.   
  773.       BlockMove(*(*top_line)->hText + topl_query_len, answer, ans_len);
  774.       answer[ans_len] = '\0';
  775. --- 950,958 ----
  776. ***************
  777. *** 916,926 ****
  778.           -- aWin -> windowTextLen ;
  779.           -- aWin -> lin ;
  780.       }
  781. !     if (strlen(answer) <= 1) {
  782. !         if (answer[0]) tmp[0] = answer[0];
  783. !         putstr(WIN_MESSAGE, ATR_BOLD, tmp);
  784. !     } else
  785. !         putstr(WIN_MESSAGE, ATR_BOLD, answer);
  786.   }
  787.   
  788.   /*
  789. --- 962,970 ----
  790.           -- aWin -> windowTextLen ;
  791.           -- aWin -> lin ;
  792.       }
  793. !     putstr(WIN_MESSAGE, ATR_BOLD, answer);
  794. !     (*top_line)->viewRect.left += 10000;
  795.   }
  796.   
  797.   /*
  798. ***************
  799. *** 1044,1054 ****
  800.       int r_len, r_len1;
  801.   
  802.       if (!resp) {
  803. !         static char any_str[2] = { CHAR_ANY, '\0' };
  804.           resp = any_str;
  805.           def = CHAR_ANY;
  806.       }
  807.   
  808.       r_len1 = strlen(resp);
  809.       r_len  = strlen(topl_resp);
  810.       if (r_len < r_len1)
  811. --- 1088,1099 ----
  812.       int r_len, r_len1;
  813.   
  814.       if (!resp) {
  815. !         const char any_str[2] = { CHAR_ANY, '\0' };
  816.           resp = any_str;
  817.           def = CHAR_ANY;
  818.       }
  819.   
  820. +     SetPort(theWindows[WIN_MESSAGE].theWindow);
  821.       r_len1 = strlen(resp);
  822.       r_len  = strlen(topl_resp);
  823.       if (r_len < r_len1)
  824. ***************
  825. *** 1123,1128 ****
  826. --- 1168,1206 ----
  827.   }
  828.   
  829.   
  830. + void
  831. + adjust_window_pos(NhWindow *aWin, WindowPtr theWindow, short w)
  832. + {
  833. +     const Rect scr_r   = (*GetGrayRgn())->rgnBBox,
  834. +                win_ind = { 20, 2, 3, 3 };
  835. +     const short    min_w = theWindow->portRect.right - theWindow->portRect.left,
  836. +                 max_w = scr_r.right - scr_r.left - win_ind.left - win_ind.right;
  837. +     Point pos;
  838. +     short h = aWin->lin * aWin->charHeight, max_h;
  839. +     SetPort(theWindow);
  840. +     if (!RetrieveWinPos(theWindow, &pos.v, &pos.h)) {
  841. +         pos.v = theWindow->portRect.top;
  842. +         pos.h = theWindow->portRect.left;
  843. +         LocalToGlobal(&pos);
  844. +     }
  845. +     max_h = full_screen ? scr_r.bottom - win_ind.bottom - scr_r.top - win_ind.top
  846. +                         : scr_r.bottom - win_ind.bottom - pos.v;
  847. +     if (h > max_h      ) h = max_h;
  848. +     if (h < MIN_HEIGHT) h = MIN_HEIGHT;
  849. +     if (w < min_w      ) w = min_w;
  850. +     if (w > max_w      ) w = max_w;
  851. +     SizeWindow(theWindow, w, h, true);
  852. +     if (pos.v + h + win_ind.bottom > scr_r.bottom)
  853. +         pos.v = scr_r.bottom - h - win_ind.bottom;
  854. +     if (pos.h + w + win_ind.right  > scr_r.right)
  855. +         pos.h = scr_r.right     - w - win_ind.right;
  856. +     MoveWindow(theWindow, pos.h, pos.v, false);
  857. + }
  858.   /*
  859.    * display/select/update the window.
  860.    * If f is true, this window should be "modal" - don't return
  861. ***************
  862. *** 1145,1213 ****
  863.       }
  864.   
  865.       if ( f && inSelect == WIN_ERR && ( win == BASE_WINDOW || win == WIN_MESSAGE ) ) {
  866. !         if ( win == WIN_MESSAGE )
  867.               topl_set_resp ( NULL , 0 ) ;
  868. !         /* The following piece of code prevents the "-- More --" prompt to be on a new
  869. !            line by itself.  I comment it out because the result looks ugly to me. */
  870. ! #ifdef 0
  871. !         if ( aWin -> windowTextLen > 0 &&
  872. !              ( * aWin -> windowText ) [ aWin -> windowTextLen - 1 ] == CHAR_CR ) {
  873. !             -- aWin -> windowTextLen ;
  874. !             -- aWin -> lin ;
  875.           }
  876. ! #endif
  877. !         putstr ( win , ATR_INVERSE , "-- More --" ) ;
  878.       }
  879.   
  880. !     if ( ! ( ( WindowPeek ) theWindow ) -> visible ) {
  881. !         const Rect scr_r   = (*GetGrayRgn())->rgnBBox,
  882. !                    win_ind = { 20, 2, 3, 3 };
  883. !         const Point scr_sz = { scr_r.bottom - scr_r.top, scr_r.right - scr_r.left },
  884. !                     wp_sz  = { theWindow->portRect.bottom - theWindow->portRect.top,
  885. !                                theWindow->portRect.right  - theWindow->portRect.left };
  886. !         const short max_h = scr_sz.v - win_ind.top    - win_ind.bottom,
  887. !                     max_w = scr_sz.h - win_ind.left - win_ind.right;
  888. !         const char cr = CHAR_CR;
  889.   
  890. !         long line_start = 0, line_end;
  891. !         short w = wp_sz.h,
  892. !               h = full_screen ? aWin->lin * aWin->charHeight : wp_sz.v;
  893. !         Point pos = { theWindow->portRect.top, theWindow->portRect.left };
  894. !         SetPort(theWindow);
  895. !         LocalToGlobal(&pos);
  896.   
  897. !         HLock(aWin->windowText);
  898. !         while (line_start < aWin->windowTextLen) {
  899. !             short line_w;
  900. !             line_end = Munger(aWin->windowText, line_start, &cr, 1, nil, 0);
  901. !             if (line_end < 0)
  902. !                 line_end = aWin->windowTextLen;
  903. !             line_w = TextWidth(*aWin->windowText, line_start, line_end - line_start) +
  904. !                      (SBARWIDTH + 2);
  905. !             if (w < line_w)
  906. !                 w = line_w;
  907. !             line_start = line_end + 1;
  908. !         }
  909. !         HUnlock(aWin->windowText);
  910. !         if (h > max_h) h = max_h;
  911. !         if (w > max_w) w = max_w;
  912. !         SizeWindow(theWindow, w, h, FALSE);
  913. !         if ( ! ( ( WindowPeek ) theWindow ) -> visible ) {
  914. !             short top , left ;
  915. !             if ( ! RetrieveWinPos ( theWindow , & top , & left ) ) {
  916. !                 if (pos.v + h + win_ind.bottom > scr_r.bottom)
  917. !                     pos.v = scr_r.bottom - h - win_ind.bottom;
  918. !                 if (pos.h + w + win_ind.right  > scr_r.right)
  919. !                     pos.h = scr_r.right     - w - win_ind.right;
  920. !                 top = pos . v ;
  921. !                 left = pos . h ;
  922.               }
  923. !             MoveWindow(theWindow, left, top, FALSE);
  924.           }
  925.   
  926. !         SelectWindow ( theWindow ) ;
  927.           ShowWindow ( theWindow ) ;
  928.       }
  929.   
  930. --- 1223,1266 ----
  931.       }
  932.   
  933.       if ( f && inSelect == WIN_ERR && ( win == BASE_WINDOW || win == WIN_MESSAGE ) ) {
  934. !         if ( win == WIN_MESSAGE ) {
  935.               topl_set_resp ( NULL , 0 ) ;
  936. !             if ( aWin -> windowTextLen > 0 &&
  937. !                  ( * aWin -> windowText ) [ aWin -> windowTextLen - 1 ] == CHAR_CR ) {
  938. !                 -- aWin -> windowTextLen ;
  939. !                 -- aWin -> lin ;
  940. !             }
  941.           }
  942. !         putstr ( win , flags . standout ? ATR_INVERSE : ATR_NONE , " --More--" ) ;
  943.       }
  944.   
  945. !     if ( ! ( ( WindowPeek ) theWindow ) -> visible || full_screen ) {
  946.   
  947. !         int kind = ((WindowPeek)theWindow)->windowKind - WIN_BASE_KIND;
  948. !         if (kind == NHW_TEXT || kind == NHW_MENU) {
  949. !             const char cr = CHAR_CR;
  950. !             short w = 0;
  951. !             long line_start = 0;
  952. !             HLock(aWin->windowText);
  953.   
  954. !             while (line_start < aWin->windowTextLen) {
  955. !                 long line_end;
  956. !                 short line_w;
  957. !                 line_end = Munger(aWin->windowText, line_start, &cr, 1, nil, 0);
  958. !                 if (line_end < 0)
  959. !                     line_end = aWin->windowTextLen;
  960. !                 line_w = TextWidth(*aWin->windowText, line_start, line_end - line_start);
  961. !                 if (w < line_w)
  962. !                     w = line_w;
  963. !                 line_start = line_end + 1;
  964.               }
  965. !             HUnlock(aWin->windowText);
  966. !             adjust_window_pos(aWin, theWindow, w + (SBARWIDTH+2));
  967.           }
  968.   
  969. !         if ( ! small_screen || win != WIN_MESSAGE || f )
  970. !             SelectWindow ( theWindow ) ;
  971.           ShowWindow ( theWindow ) ;
  972.       }
  973.   
  974. ***************
  975. *** 1227,1233 ****
  976.   
  977.           if ( win == WIN_MESSAGE )
  978.               topl_set_resp ( "" , '\0' ) ;
  979. !         else
  980.               HideWindow ( theWindow ) ;
  981.   
  982.       } else {
  983. --- 1280,1286 ----
  984.   
  985.           if ( win == WIN_MESSAGE )
  986.               topl_set_resp ( "" , '\0' ) ;
  987. !         else if ( win != WIN_MAP && win != WIN_STATUS )
  988.               HideWindow ( theWindow ) ;
  989.   
  990.       } else {
  991. ***************
  992. *** 1325,1334 ****
  993.   void
  994.   GeneralKey ( EventRecord * theEvent , WindowPtr theWindow )
  995.   {
  996. -     int i ;
  997.       trans_num_keys ( theEvent ) ;
  998.       addToKeyQueue ( topl_resp_key ( theEvent -> message & 0xff ) , 1 ) ;
  999.   }
  1000.   
  1001. --- 1378,1384 ----
  1002. ***************
  1003. *** 1426,1431 ****
  1004. --- 1476,1483 ----
  1005.           }
  1006.           ++r_idx;
  1007.       }
  1008. +     macClickText(theEvent, theWindow);
  1009.   }
  1010.   
  1011.   
  1012. ***************
  1013. *** 1441,1472 ****
  1014.   static void
  1015.   macClickMap ( EventRecord * theEvent , WindowPtr theWindow )
  1016.   {
  1017. !     if ( ! theEvent || ! theWindow ) {
  1018. !         Debugger ( ) ;
  1019. !     }
  1020. !     {
  1021. !         NhWindow * nhw = ( NhWindow * ) GetWRefCon ( theWindow ) ;
  1022. !         Point where ;
  1023. !         short posX , posY ;
  1024. !         short sector ;
  1025. !         char theDirectionChar [ 18 ] = {
  1026. !             ' ' , 'k' , 'u' , 'l' , 'n' , 'j' , 'b' , 'h' , 'y' ,
  1027. !             'o' , 'K' , 'U' , 'L' , 'N' , 'J' , 'B' , 'H' , 'Y' ,
  1028. !         } ;
  1029.   
  1030. !         where = theEvent -> where ;
  1031. !         GlobalToLocal ( & where ) ;
  1032. !         posX = where . h / nhw -> charWidth ;
  1033. !         posY = where . v / nhw -> charHeight ;
  1034. !     /* 0 is ON, 1 is top, then clockwise */
  1035. !         sector = clickSector ( u . ux , u . uy , posX , posY ) ;
  1036. !         if ( theEvent -> modifiers & shiftKey ) {
  1037. !             sector += 9 ;
  1038. !         }
  1039. !         addToKeyQueue ( theDirectionChar [ sector ] , 0 ) ;
  1040. !         gClickedToMove = 1 ;
  1041.       }
  1042.   }
  1043.   
  1044. --- 1493,1516 ----
  1045.   static void
  1046.   macClickMap ( EventRecord * theEvent , WindowPtr theWindow )
  1047.   {
  1048. !     int shift_down = theEvent->modifiers & shiftKey;
  1049. !     NhWindow *nhw = (NhWindow *)GetWRefCon(theWindow);
  1050. !     Point where = theEvent->where;
  1051. !         GlobalToLocal(&where);
  1052. !         where.h /= nhw->charWidth;
  1053. !         where.v /= nhw->charHeight;
  1054. !     clicked_mod = shift_down ? CLICK_2 : CLICK_1;
  1055.   
  1056. !     if (strchr(topl_resp, click_to_cmd(where.h, where.v, clicked_mod)))
  1057. !         nhbell();
  1058. !     else {
  1059. !         if (cursor_locked)
  1060. !             while (WaitMouseUp())
  1061. !                 SystemTask();
  1062. !         else if (!shift_down)
  1063. !             gNextClickRepeat = TickCount() + *(short *)KeyThresh;
  1064. !         gClickedToMove = TRUE;
  1065. !         clicked_pos = where;
  1066.       }
  1067.   }
  1068.   
  1069. ***************
  1070. *** 1495,1508 ****
  1071.       SetCtlValue ( theBar , now - amtToScroll ) ;
  1072.       winToScroll -> scrollPos = now - amtToScroll ;
  1073.       r = winToScroll -> theWindow -> portRect ;
  1074. !     r . right -= 15 ;
  1075.       ScrollRect ( & r , 0 , amtToScroll * winToScroll -> charHeight , rgn ) ;
  1076.       if ( rgn ) {
  1077.           InvalRgn ( rgn ) ;
  1078. -         r . top = r . bottom - 16 ;
  1079. -         r . left = r . right ;
  1080. -         r . right += 15 ;
  1081. -         InvalRect ( & r ) ;
  1082.           BeginUpdate ( winToScroll -> theWindow ) ;
  1083.       }
  1084.       winToScroll -> updateFunc  ( & fake , winToScroll -> theWindow ) ;
  1085. --- 1539,1550 ----
  1086.       SetCtlValue ( theBar , now - amtToScroll ) ;
  1087.       winToScroll -> scrollPos = now - amtToScroll ;
  1088.       r = winToScroll -> theWindow -> portRect ;
  1089. !     r . right -= SBARWIDTH ;
  1090. !     if ( winToScroll == theWindows + WIN_MESSAGE )
  1091. !         r . bottom -= SBARHEIGHT + 1 ;
  1092.       ScrollRect ( & r , 0 , amtToScroll * winToScroll -> charHeight , rgn ) ;
  1093.       if ( rgn ) {
  1094.           InvalRgn ( rgn ) ;
  1095.           BeginUpdate ( winToScroll -> theWindow ) ;
  1096.       }
  1097.       winToScroll -> updateFunc  ( & fake , winToScroll -> theWindow ) ;
  1098. ***************
  1099. *** 1535,1548 ****
  1100.       SetCtlValue ( theBar , now + amtToScroll ) ;
  1101.       winToScroll -> scrollPos = now + amtToScroll ;
  1102.       r = winToScroll -> theWindow -> portRect ;
  1103. !     r . right -= 15 ;
  1104.       ScrollRect ( & r , 0 , - amtToScroll * winToScroll -> charHeight , rgn ) ; 
  1105.       if ( rgn ) {
  1106.           InvalRgn ( rgn ) ;
  1107. -         r . top = r . bottom - 16 ;
  1108. -         r . left = r . right ;
  1109. -         r . right += 15 ;
  1110. -         InvalRect ( & r ) ;
  1111.           BeginUpdate ( winToScroll -> theWindow ) ;
  1112.       }
  1113.       winToScroll -> updateFunc  ( & fake , winToScroll -> theWindow ) ;
  1114. --- 1577,1588 ----
  1115.       SetCtlValue ( theBar , now + amtToScroll ) ;
  1116.       winToScroll -> scrollPos = now + amtToScroll ;
  1117.       r = winToScroll -> theWindow -> portRect ;
  1118. !     r . right -= SBARWIDTH ;
  1119. !     if ( winToScroll == theWindows + WIN_MESSAGE )
  1120. !         r . bottom -= SBARHEIGHT + 1 ;
  1121.       ScrollRect ( & r , 0 , - amtToScroll * winToScroll -> charHeight , rgn ) ; 
  1122.       if ( rgn ) {
  1123.           InvalRgn ( rgn ) ;
  1124.           BeginUpdate ( winToScroll -> theWindow ) ;
  1125.       }
  1126.       winToScroll -> updateFunc  ( & fake , winToScroll -> theWindow ) ;
  1127. ***************
  1128. *** 1615,1620 ****
  1129. --- 1655,1674 ----
  1130.   }
  1131.   
  1132.   
  1133. + int
  1134. + mac_doprev_message(void)
  1135. + {
  1136. +     if (WIN_MESSAGE) {
  1137. +         display_nhwindow(WIN_MESSAGE, FALSE);
  1138. +         amtToScroll = 1;
  1139. +         winToScroll = &theWindows[WIN_MESSAGE];
  1140. +         SetPort(winToScroll->theWindow);
  1141. +         Up(winToScroll->scrollBar, inUpButton);
  1142. +     }    
  1143. +     return 0 ;
  1144. + }
  1145.   static void
  1146.   macClickMenu ( EventRecord * theEvent , WindowPtr theWindow )
  1147.   {
  1148. ***************
  1149. *** 1742,1747 ****
  1150. --- 1796,1802 ----
  1151.   
  1152.       GetClip(org_clip);
  1153.   
  1154. +     DrawControls(theWindow);
  1155.       DrawGrowIcon(theWindow);
  1156.   
  1157.       l = 0;
  1158. ***************
  1159. *** 1794,1808 ****
  1160.       /* Clip to the portrect - scrollbar/growicon *before* adjusting the rect
  1161.           to be larger than the size of the window (!) */
  1162.       RectRgn(clip, &r);
  1163.       if ( r . right < MIN_RIGHT )
  1164.           r . right = MIN_RIGHT ;
  1165.   
  1166.       if (in_topl_mode()) {
  1167.           RgnHandle topl_rgn = NewRgn();
  1168.           Rect topl_r = r;
  1169. !         for (l = aWin->windowTextLen - 1; --l >= aWin->textBase; )
  1170. !             if ((*aWin->windowText)[l] == CHAR_CR)
  1171. !                 topl_r.top += aWin->charHeight;
  1172.           l = (*top_line)->destRect.right - (*top_line)->destRect.left;
  1173.           (*top_line)->viewRect = topl_r;
  1174.           (*top_line)->destRect = topl_r;
  1175. --- 1849,1880 ----
  1176.       /* Clip to the portrect - scrollbar/growicon *before* adjusting the rect
  1177.           to be larger than the size of the window (!) */
  1178.       RectRgn(clip, &r);
  1179. +     SectRgn(clip, org_clip, clip);
  1180.       if ( r . right < MIN_RIGHT )
  1181.           r . right = MIN_RIGHT ;
  1182. +     r . top -= aWin -> scrollPos * aWin -> charHeight ;
  1183.   
  1184. + #if 0
  1185. +     /* If you enable this band of code (and disable the next band), you will get
  1186. +        fewer flickers but a slower performance while drawing the dot line. */
  1187. +     {    RgnHandle dotl_rgn = NewRgn();
  1188. +         Rect dotl;
  1189. +         dotl.left    = r.left;
  1190. +         dotl.right    = r.right;
  1191. +         dotl.bottom = r.top + aWin->save_lin * aWin->charHeight;
  1192. +         dotl.top    = dotl.bottom - 1;
  1193. +         FillRect(&dotl, &qd.gray);
  1194. +         RectRgn(dotl_rgn, &dotl);
  1195. +         DiffRgn(clip, dotl_rgn, clip);
  1196. +         DisposeRgn(dotl_rgn);
  1197. +         SetClip(clip);
  1198. +     }
  1199. + #endif
  1200.       if (in_topl_mode()) {
  1201.           RgnHandle topl_rgn = NewRgn();
  1202.           Rect topl_r = r;
  1203. !         topl_r.top += (aWin->lin - 1) * aWin->charHeight;
  1204.           l = (*top_line)->destRect.right - (*top_line)->destRect.left;
  1205.           (*top_line)->viewRect = topl_r;
  1206.           (*top_line)->destRect = topl_r;
  1207. ***************
  1208. *** 1812,1830 ****
  1209.           RectRgn(topl_rgn, &topl_r);
  1210.           DiffRgn(clip, topl_rgn, clip);
  1211.           DisposeRgn(topl_rgn);
  1212.       }
  1213.   
  1214. -     SectRgn(clip, org_clip, clip);
  1215. -     SetClip(clip);
  1216.       DisposeRgn(clip);
  1217.   
  1218.       TextFont ( aWin -> fontNum ) ;
  1219.       TextSize ( aWin -> fontSize ) ;
  1220.       HLock ( aWin -> windowText ) ;
  1221. !     TextBox ( * ( aWin -> windowText ) + aWin -> textBase , aWin ->
  1222. !         windowTextLen - aWin -> textBase , & r , teJustLeft ) ;
  1223.       HUnlock ( aWin -> windowText ) ;
  1224.   
  1225.       SetClip(org_clip);
  1226.       DisposeRgn(org_clip);
  1227.   }
  1228. --- 1884,1906 ----
  1229.           RectRgn(topl_rgn, &topl_r);
  1230.           DiffRgn(clip, topl_rgn, clip);
  1231.           DisposeRgn(topl_rgn);
  1232. +         SetClip(clip);
  1233.       }
  1234.   
  1235.       DisposeRgn(clip);
  1236.   
  1237.       TextFont ( aWin -> fontNum ) ;
  1238.       TextSize ( aWin -> fontSize ) ;
  1239.       HLock ( aWin -> windowText ) ;
  1240. !     TextBox ( * aWin -> windowText , aWin -> windowTextLen , & r , teJustLeft ) ;
  1241.       HUnlock ( aWin -> windowText ) ;
  1242.   
  1243. + #if 1
  1244. +     r.bottom = r.top + aWin->save_lin * aWin->charHeight;
  1245. +     r.top     = r.bottom - 1;
  1246. +     FillRect(&r, &qd.gray);
  1247. + #endif
  1248.       SetClip(org_clip);
  1249.       DisposeRgn(org_clip);
  1250.   }
  1251. ***************
  1252. *** 1941,1948 ****
  1253.           r . right = MIN_RIGHT ;
  1254.       r . top -= aWin -> scrollPos * aWin -> charHeight ;
  1255.       HLock ( aWin -> windowText ) ;
  1256. !     TextBox ( * ( aWin -> windowText ) + aWin -> textBase , aWin ->
  1257. !         windowTextLen - aWin -> textBase , & r , teJustLeft ) ;
  1258.       HUnlock ( aWin -> windowText ) ;
  1259.       if ( h ) {
  1260.           SetClip ( h ) ;
  1261. --- 2017,2023 ----
  1262.           r . right = MIN_RIGHT ;
  1263.       r . top -= aWin -> scrollPos * aWin -> charHeight ;
  1264.       HLock ( aWin -> windowText ) ;
  1265. !     TextBox ( * aWin -> windowText , aWin -> windowTextLen , & r , teJustLeft ) ;
  1266.       HUnlock ( aWin -> windowText ) ;
  1267.       if ( h ) {
  1268.           SetClip ( h ) ;
  1269. ***************
  1270. *** 1989,1996 ****
  1271.       r . top -= aWin -> scrollPos * aWin -> charHeight ;
  1272.       r . right -= SBARWIDTH;
  1273.       HLock ( aWin -> windowText ) ;
  1274. !     TextBox ( * ( aWin -> windowText ) + aWin -> textBase , aWin ->
  1275. !         windowTextLen - aWin -> textBase , & r , teJustLeft ) ;
  1276.       HUnlock ( aWin -> windowText ) ;
  1277.       draw_growicon_vert_only(theWindow);
  1278.       if ( h ) {
  1279. --- 2064,2070 ----
  1280.       r . top -= aWin -> scrollPos * aWin -> charHeight ;
  1281.       r . right -= SBARWIDTH;
  1282.       HLock ( aWin -> windowText ) ;
  1283. !     TextBox ( * aWin -> windowText , aWin -> windowTextLen , & r , teJustLeft ) ;
  1284.       HUnlock ( aWin -> windowText ) ;
  1285.       draw_growicon_vert_only(theWindow);
  1286.       if ( h ) {
  1287. ***************
  1288. *** 2037,2042 ****
  1289. --- 2111,2117 ----
  1290.   macCursorMap ( EventRecord * theEvent , WindowPtr theWindow , RgnHandle mouseRgn )
  1291.   {
  1292.       Point where ;
  1293. +     char * dir_bas , * dir ;
  1294.       CursHandle ch ;
  1295.       GrafPtr gp ;
  1296.       NhWindow * nhw = ( NhWindow * ) GetWRefCon ( theWindow ) ;
  1297. ***************
  1298. *** 2047,2059 ****
  1299.   
  1300.       where = theEvent -> where ;
  1301.       GlobalToLocal ( & where ) ;
  1302. !     ch = GetCursor ( 512 + clickSector ( u . ux , u . uy , where . h / nhw -> charWidth ,
  1303. !         where . v / nhw -> charHeight ) ) ;
  1304.       if ( ch ) {
  1305.   
  1306.           HLock ( ( Handle ) ch ) ;
  1307.           SetCursor ( * ch ) ;
  1308. !         ReleaseResource ( ( Handle ) ch ) ;
  1309.   
  1310.       } else {
  1311.   
  1312. --- 2122,2142 ----
  1313.   
  1314.       where = theEvent -> where ;
  1315.       GlobalToLocal ( & where ) ;
  1316. !     if ( cursor_locked )
  1317. !         dir = NULL ;
  1318. !     else {
  1319. !         dir_bas = flags . num_pad ? ndir : sdir ;
  1320. !         dir = strchr ( dir_bas , click_to_cmd ( where . h / nhw -> charWidth ,
  1321. !                                                 where . v / nhw -> charHeight ,
  1322. !                                                 CLICK_1 ) ) ;
  1323. !     }
  1324. !     ch = GetCursor ( dir ? dir - dir_bas + 513 : 512 ) ;
  1325.       if ( ch ) {
  1326.   
  1327.           HLock ( ( Handle ) ch ) ;
  1328.           SetCursor ( * ch ) ;
  1329. !         HUnlock ( ( Handle ) ch ) ;
  1330.   
  1331.       } else {
  1332.   
  1333. ***************
  1334. *** 2226,2231 ****
  1335. --- 2309,2316 ----
  1336.               InitCursor ( ) ;
  1337.               SetRect ( & r , 80 , 2 * aWin -> charHeight + 1 , r . right ,
  1338.                   r . bottom ) ;
  1339. +             if ( aWin == theWindows + WIN_MESSAGE )
  1340. +                 r . top += SBARHEIGHT + 1 ;
  1341.               l = GrowWindow ( theWindow , theEvent -> where , & r ) ;
  1342.               SizeWindow ( theWindow , l & 0xffff , l >> 16 , FALSE ) ;
  1343.               SaveWindowSize ( theWindow ) ;
  1344. ***************
  1345. *** 2347,2372 ****
  1346.               }
  1347.               FlushEvents ( keyDownMask , 0 ) ;
  1348.           }
  1349. -         /*
  1350. -          * This somewhat elaborate hack is needed to make the menu
  1351. -          * commands work right. They're also needed for fast typists.
  1352. -          */
  1353. -         if ( keyQueue [ 0 ] && in_topl_mode() ) {
  1354. -             int i ;
  1355. -             theEvent -> what = keyDown ;
  1356. -             theEvent -> modifiers = 0 ;
  1357. -             theEvent -> message = keyQueue [ 0 ] ;
  1358. - /* extract from key queue */
  1359. -             for ( i = 0 ; i < QUEUE_LEN - 1 ; i ++ ) {
  1360. -                 keyQueue [ i ] = keyQueue [ i + 1 ] ;
  1361. -             }
  1362. -             keyQueue [ i ] = 0 ;
  1363. -             SetPort ( theWindows [ WIN_MESSAGE ] . theWindow ) ;
  1364. -             theWindows [ WIN_MESSAGE ] . keyFunc ( theEvent ,
  1365. -                 theWindows [ WIN_MESSAGE ] . theWindow ) ;
  1366. -         }
  1367.           break ;
  1368.       }
  1369.   }
  1370. --- 2432,2437 ----
  1371. ***************
  1372. *** 2380,2389 ****
  1373.       DisableItem ( appleMenu , 0 ) ;
  1374.       DisableItem ( fileMenu , 0 ) ;
  1375.       DisableItem ( editMenu , 0 ) ;
  1376. !     DisableItem ( extendMenu , 0 ) ;
  1377. !     DisableItem ( miscMenu , 0 ) ;
  1378. !     DisableItem ( commandsMenu , 0 ) ;
  1379.       DisableItem ( thingsMenu , 0 ) ;
  1380.       DrawMenuBar ( ) ;
  1381.   }
  1382.   
  1383. --- 2445,2455 ----
  1384.       DisableItem ( appleMenu , 0 ) ;
  1385.       DisableItem ( fileMenu , 0 ) ;
  1386.       DisableItem ( editMenu , 0 ) ;
  1387. !     DisableItem ( actionMenu , 0 ) ;
  1388. !     DisableItem ( inventoryMenu , 0 ) ;
  1389.       DisableItem ( thingsMenu , 0 ) ;
  1390. +     DisableItem ( extendedMenu , 0 ) ;
  1391. +     DisableItem ( infoMenu , 0 ) ;
  1392.       DrawMenuBar ( ) ;
  1393.   }
  1394.   
  1395. ***************
  1396. *** 2394,2403 ****
  1397.       EnableItem ( appleMenu , 0 ) ;
  1398.       EnableItem ( fileMenu , 0 ) ;
  1399.       EnableItem ( editMenu , 0 ) ;
  1400. !     EnableItem ( extendMenu , 0 ) ;
  1401. !     EnableItem ( miscMenu , 0 ) ;
  1402. !     EnableItem ( commandsMenu , 0 ) ;
  1403.       EnableItem ( thingsMenu , 0 ) ;
  1404.       DrawMenuBar ( ) ;
  1405.   }
  1406.   
  1407. --- 2460,2470 ----
  1408.       EnableItem ( appleMenu , 0 ) ;
  1409.       EnableItem ( fileMenu , 0 ) ;
  1410.       EnableItem ( editMenu , 0 ) ;
  1411. !     EnableItem ( actionMenu , 0 ) ;
  1412. !     EnableItem ( inventoryMenu , 0 ) ;
  1413.       EnableItem ( thingsMenu , 0 ) ;
  1414. +     EnableItem ( extendedMenu , 0 ) ;
  1415. +     EnableItem ( infoMenu , 0 ) ;
  1416.       DrawMenuBar ( ) ;
  1417.   }
  1418.   
  1419. ***************
  1420. *** 2408,2422 ****
  1421.   {
  1422.       EventRecord anEvent ;
  1423.   
  1424. !     if ( ( inSelect != WIN_ERR || ! flags . window_inited || in_topl_mode() ) &&
  1425. !         ! mBarDimmed ) {
  1426. !         DimMenuBar ( ) ;
  1427. !         mBarDimmed = 1 ;
  1428. !     } else if ( inSelect == WIN_ERR && flags . window_inited && mBarDimmed &&
  1429. !                 ! in_topl_mode() ) {
  1430. !         UndimMenuBar ( ) ;
  1431. !         mBarDimmed = 0 ;
  1432. !     }
  1433.       /*
  1434.        * We want to take care of keys in the buffer as fast as
  1435.        * possible
  1436. --- 2475,2489 ----
  1437.   {
  1438.       EventRecord anEvent ;
  1439.   
  1440. !     if ( ( inSelect == WIN_ERR && flags . window_inited && ! in_topl_mode ( ) )
  1441. !          == mBarDimmed )
  1442. !         if ( mBarDimmed ) {
  1443. !             UndimMenuBar ( ) ;
  1444. !             mBarDimmed = 0 ;
  1445. !         } else {
  1446. !             DimMenuBar ( ) ;
  1447. !             mBarDimmed = 1 ;
  1448. !         }
  1449.       /*
  1450.        * We want to take care of keys in the buffer as fast as
  1451.        * possible
  1452. ***************
  1453. *** 2447,2459 ****
  1454.   {
  1455.       int ch ;
  1456.       register int i ;
  1457.   
  1458.       wait_synch ( ) ;
  1459.   
  1460. !     if ( flags . window_inited && ! theWindows [ WIN_MAP ] . cursorDrawn &&
  1461. !         theWindows [ WIN_MAP ] . theWindow ) {
  1462. !         SetPort ( theWindows [ WIN_MAP ] . theWindow ) ;
  1463. !         DrawMapCursor ( & theWindows [ WIN_MAP ] ) ;
  1464.       }
  1465.   
  1466.       if ( ! keyQueue [ 0 ] ) {
  1467. --- 2514,2532 ----
  1468.   {
  1469.       int ch ;
  1470.       register int i ;
  1471. +     NhWindow * nhw = flags . window_inited ? theWindows + WIN_MAP : nil ;
  1472.   
  1473. +     if ( theWindows ) {
  1474. +         NhWindow * aWin = theWindows + WIN_MESSAGE ;
  1475. +         if ( aWin )
  1476. +             aWin -> last_more_lin = aWin -> lin ;
  1477. +     }
  1478.       wait_synch ( ) ;
  1479.   
  1480. !     if ( nhw && ! nhw -> cursorDrawn && nhw -> theWindow ) {
  1481. !         SetPort ( nhw -> theWindow ) ;
  1482. !         DrawMapCursor ( nhw ) ;
  1483.       }
  1484.   
  1485.       if ( ! keyQueue [ 0 ] ) {
  1486. ***************
  1487. *** 2461,2469 ****
  1488.           static char warn = 0 ;
  1489.   
  1490.           PurgeSpace ( & total , & contig ) ;
  1491. !         if ( contig < 64000L || total < 256000L ) {
  1492.               if ( ! warn ) {
  1493. !                 DebugStr ( ( ConstStr255Param ) "\014Low Memory !" ) ;
  1494.                   warn = 1 ;
  1495.               }
  1496.           } else {
  1497. --- 2534,2542 ----
  1498.           static char warn = 0 ;
  1499.   
  1500.           PurgeSpace ( & total , & contig ) ;
  1501. !         if ( contig < 25000L || total < 50000L ) {
  1502.               if ( ! warn ) {
  1503. !                 pline ( "Low Memory!" ) ;
  1504.                   warn = 1 ;
  1505.               }
  1506.           } else {
  1507. ***************
  1508. *** 2473,2481 ****
  1509.   
  1510.       do {
  1511.           doDawdle = ( in_topl_mode() ? GetCaretTime ( ) : 120L ) ;
  1512.           get_nh_event ( ) ;
  1513.           ch = keyQueue [ 0 ] ;
  1514. !     } while ( ! ch ) ;
  1515.   
  1516.       if ( ! gClickedToMove ) {
  1517.           ObscureCursor ( ) ;
  1518. --- 2546,2573 ----
  1519.   
  1520.       do {
  1521.           doDawdle = ( in_topl_mode() ? GetCaretTime ( ) : 120L ) ;
  1522. +         if ( nhw ) {
  1523. +             SetPort ( nhw -> theWindow ) ;
  1524. +             if ( WaitMouseUp ( ) ) {
  1525. +                 unsigned long tick = TickCount ( ) ;
  1526. +                 if ( tick >= gNextClickRepeat ) {
  1527. +                     Point where ;
  1528. +                     GetMouse ( & where ) ;
  1529. +                     SetPt ( & clicked_pos , where . h / nhw -> charWidth ,
  1530. +                                             where . v / nhw -> charHeight ) ;
  1531. +                     gClickedToMove = TRUE ;
  1532. +                     gNextClickRepeat = tick + * ( short * ) KeyRepThresh ;
  1533. +                 }
  1534. +                 if ( doDawdle > * ( short * ) KeyRepThresh )
  1535. +                     doDawdle = * ( short * ) KeyRepThresh ;
  1536. +             } else
  1537. +                 gNextClickRepeat = 0xffffffff ;
  1538. +         }
  1539.           get_nh_event ( ) ;
  1540.           ch = keyQueue [ 0 ] ;
  1541. !     } while ( ! ch && ! gClickedToMove ) ;
  1542.   
  1543.       if ( ! gClickedToMove ) {
  1544.           ObscureCursor ( ) ;
  1545. ***************
  1546. *** 2536,2548 ****
  1547.       /* Here and in mac_raw_print_bold I assume that once theWindows got
  1548.          allocated by mac_init_nhwindows we can safely do putstr on BASE_WINDOW,
  1549.          even after mac_exit_nhwindows is called or flags.window_inited is reset
  1550. !        to zero.  Is this assumption correct? */
  1551.       if ( theWindows ) {
  1552.   
  1553.           ShowWindow ( theWindows [ BASE_WINDOW ] . theWindow ) ;
  1554.           SelectWindow ( theWindows [ BASE_WINDOW ] . theWindow ) ;
  1555.   
  1556. !         putstr ( BASE_WINDOW , 0 , str ) ;
  1557.   
  1558.       } else
  1559.           showerror ( str , NULL ) ;
  1560. --- 2628,2644 ----
  1561.       /* Here and in mac_raw_print_bold I assume that once theWindows got
  1562.          allocated by mac_init_nhwindows we can safely do putstr on BASE_WINDOW,
  1563.          even after mac_exit_nhwindows is called or flags.window_inited is reset
  1564. !        to zero.  Is this assumption correct?
  1565. !        Also add a space or a bullet before each line to indicate the bold face
  1566. !        before we really implement the text attributes */
  1567.       if ( theWindows ) {
  1568. +         char lstr [ 200 ] = " " ;
  1569. +         strcat ( lstr , str ) ;
  1570.   
  1571.           ShowWindow ( theWindows [ BASE_WINDOW ] . theWindow ) ;
  1572.           SelectWindow ( theWindows [ BASE_WINDOW ] . theWindow ) ;
  1573.   
  1574. !         putstr ( BASE_WINDOW , 0 , lstr ) ;
  1575.   
  1576.       } else
  1577.           showerror ( str , NULL ) ;
  1578. ***************
  1579. *** 2553,2563 ****
  1580.   mac_raw_print_bold ( const char * str )
  1581.   {
  1582.       if ( theWindows ) {
  1583.   
  1584.           ShowWindow ( theWindows [ BASE_WINDOW ] . theWindow ) ;
  1585.           SelectWindow ( theWindows [ BASE_WINDOW ] . theWindow ) ;
  1586.   
  1587. !         putstr ( BASE_WINDOW , ATR_BOLD , str ) ;
  1588.   
  1589.       } else {
  1590.           nhbell ( ) ;
  1591. --- 2649,2661 ----
  1592.   mac_raw_print_bold ( const char * str )
  1593.   {
  1594.       if ( theWindows ) {
  1595. +         char lstr [ 200 ] = "\xA5"/*bullet*/ ;
  1596. +         strcat ( lstr , str ) ;
  1597.   
  1598.           ShowWindow ( theWindows [ BASE_WINDOW ] . theWindow ) ;
  1599.           SelectWindow ( theWindows [ BASE_WINDOW ] . theWindow ) ;
  1600.   
  1601. !         putstr ( BASE_WINDOW , ATR_BOLD , lstr ) ;
  1602.   
  1603.       } else {
  1604.           nhbell ( ) ;
  1605. ***************
  1606. *** 2596,2602 ****
  1607.       Rect r ;
  1608.   
  1609.       if ( in_putstr > 3 ) {
  1610. !         DebugStr ( ( ConstStr255Param ) "\012Recursion!" ) ;
  1611.           return ;
  1612.       }
  1613.       if ( win < 0 || win >= NUM_MACWINDOWS ) {
  1614. --- 2694,2700 ----
  1615.       Rect r ;
  1616.   
  1617.       if ( in_putstr > 3 ) {
  1618. !         DebugStr ( ( ConstStr255Param ) "\pRecursion!" ) ;
  1619.           return ;
  1620.       }
  1621.       if ( win < 0 || win >= NUM_MACWINDOWS ) {
  1622. ***************
  1623. *** 2612,2642 ****
  1624.       in_putstr ++ ;
  1625.       kind = ( ( WindowPeek ) ( aWin -> theWindow ) ) -> windowKind -
  1626.           WIN_BASE_KIND ;
  1627.   
  1628.       if ( kind == NHW_MAP || kind == NHW_STATUS ) {
  1629. !         short    h = ( NUM_COLS - aWin->cursor.h - strlen(str) );
  1630. !         /*
  1631. !          * The "dungeon" window
  1632. !          * putsym will call curs, so no updates necessary.
  1633. !          */
  1634. !         while ( * str ) {
  1635. !             putsym ( win , aWin -> cursor . h , aWin -> cursor . v , * str ) ;
  1636. !             curs ( win , aWin -> cursor . h + 1 , aWin -> cursor . v ) ;
  1637. !             str ++ ;
  1638. !         }
  1639. !         h = (h < 0) ? 0 : h;
  1640. !         while( h-- ) {
  1641. !             putsym ( win , aWin -> cursor . h , aWin -> cursor . v , CHAR_BLANK ) ;
  1642. !             curs ( win , aWin -> cursor . h + 1 , aWin -> cursor . v ) ;
  1643. !         }
  1644.       } else {
  1645.           char * sr , * ds ;
  1646.           /*
  1647.            * A "default" text window - uses TextBox
  1648.            * We just add the text, without attributes for now
  1649.            */
  1650.           len = GetHandleSize ( aWin -> windowText ) ;
  1651. -         slen = strlen ( str ) ;
  1652.           while ( aWin -> windowTextLen + slen + 1 > len ) {
  1653.               len = ( len > 2048 ) ? ( len + 2048 ) : ( len * 2 ) ;
  1654.               SetHandleSize ( aWin -> windowText , len ) ;
  1655. --- 2710,2753 ----
  1656.       in_putstr ++ ;
  1657.       kind = ( ( WindowPeek ) ( aWin -> theWindow ) ) -> windowKind -
  1658.           WIN_BASE_KIND ;
  1659. +     slen = strlen ( str ) ;
  1660.   
  1661.       if ( kind == NHW_MAP || kind == NHW_STATUS ) {
  1662. !         char *row;
  1663. !         r.right     = aWin->theWindow->portRect.right;
  1664. !         r.left     = aWin->charWidth    * aWin->cursor.h;
  1665. !         r.bottom = aWin->charHeight *(aWin->cursor.v + 1);
  1666. !         r.top     = r.bottom - aWin->charHeight;
  1667. !         EraseRect(&r);
  1668. !         MoveTo(r.left, r.bottom - aWin->leading);
  1669. !         DrawText(str, 0, slen);
  1670. !         if (slen > NUM_COLS - aWin->cursor.h)
  1671. !             slen = NUM_COLS - aWin->cursor.h;
  1672. !         row = &((MapData *)*aWin->windowText)->map[aWin->cursor.v][aWin->cursor.h];
  1673. !         strncpy(row, str, slen);
  1674. !         memset(row + slen, CHAR_BLANK, NUM_COLS - slen - aWin->cursor.h);
  1675. !         curs(win, NUM_COLS, aWin->cursor.v);
  1676.       } else {
  1677.           char * sr , * ds ;
  1678. +         r = aWin->theWindow->portRect;
  1679. +         if (win && win == WIN_MESSAGE) {
  1680. +             r.right  -= SBARWIDTH  + 1;
  1681. +             r.bottom -= SBARHEIGHT + 1;
  1682. +             if ( aWin->last_more_lin < aWin->scrollPos )
  1683. +                 aWin->last_more_lin = aWin->scrollPos;
  1684. +             if ( flags.page_wait && aWin->last_more_lin <=
  1685. +                  aWin->lin - (r.bottom - r.top) / aWin->charHeight )
  1686. +                 display_nhwindow(win, TRUE);
  1687. +         }
  1688.           /*
  1689.            * A "default" text window - uses TextBox
  1690.            * We just add the text, without attributes for now
  1691.            */
  1692.           len = GetHandleSize ( aWin -> windowText ) ;
  1693.           while ( aWin -> windowTextLen + slen + 1 > len ) {
  1694.               len = ( len > 2048 ) ? ( len + 2048 ) : ( len * 2 ) ;
  1695.               SetHandleSize ( aWin -> windowText , len ) ;
  1696. ***************
  1697. *** 2643,2649 ****
  1698.               if ( MemError ( ) ) {
  1699.                   error ( "SetHandleSize (putstr)" ) ;
  1700.                   aWin -> windowTextLen = 0L ;
  1701. !                 aWin -> textBase = 0 ;
  1702.                   aWin -> lin = 0 ;
  1703.               }
  1704.           }
  1705. --- 2754,2760 ----
  1706.               if ( MemError ( ) ) {
  1707.                   error ( "SetHandleSize (putstr)" ) ;
  1708.                   aWin -> windowTextLen = 0L ;
  1709. !                 aWin -> save_lin = 0 ;
  1710.                   aWin -> lin = 0 ;
  1711.               }
  1712.           }
  1713. ***************
  1714. *** 2662,2701 ****
  1715.               sr ++ ;
  1716.               ds ++ ;
  1717.           }
  1718. !         if ( slen > 1 ) {
  1719. !             ( * ( aWin -> windowText ) ) [ len + slen ] = CHAR_CR ;
  1720. !             aWin -> windowTextLen += slen + 1 ;
  1721. !             aWin -> lin ++ ;
  1722. !         } else {
  1723. !             aWin -> windowTextLen += slen ;
  1724. !         }
  1725.       
  1726.           SetPort ( aWin -> theWindow ) ;
  1727. -         r = aWin -> theWindow -> portRect ;
  1728. -         if ( win && win == WIN_MESSAGE ) {
  1729. -             r . bottom -= SBARHEIGHT + 1 ;
  1730. -         }
  1731.           InvalRect ( & r ) ;
  1732.           aWin -> clear = 0 ;
  1733.           if ( kind == NHW_MESSAGE ) {
  1734. !             char * ptr , * stop ;
  1735. !             long oldBase = aWin -> textBase ;
  1736. !             short lines = ( r . bottom - r . top ) / aWin -> charHeight - 1 ;
  1737. !             stop = * aWin -> windowText ;
  1738. !             ptr = stop + aWin -> windowTextLen - 1 ;
  1739. !             while ( lines >= 0 && -- ptr > stop ) {
  1740. !                 if ( * ptr == CHAR_CR || * ptr == CHAR_LF )
  1741. !                     lines -- ;
  1742.               }
  1743. -             if ( ptr <= stop ) {
  1744. -                 aWin -> textBase = 0L ;
  1745. -             } else {
  1746. -                 aWin -> textBase = ptr - stop + 1 ;
  1747. -             }
  1748. -             if ( oldBase > aWin -> textBase ) {
  1749. -                 aWin -> textBase = oldBase ;
  1750. -             }
  1751.           }
  1752.           if ( aWin -> scrollBar ) {
  1753.               InvalScrollBar ( aWin ) ;
  1754. --- 2773,2793 ----
  1755.               sr ++ ;
  1756.               ds ++ ;
  1757.           }
  1758. !         ( * ( aWin -> windowText ) ) [ len + slen ] = CHAR_CR ;
  1759. !         aWin -> windowTextLen += slen + 1 ;
  1760. !         aWin -> lin ++ ;
  1761.       
  1762.           SetPort ( aWin -> theWindow ) ;
  1763.           InvalRect ( & r ) ;
  1764.           aWin -> clear = 0 ;
  1765.           if ( kind == NHW_MESSAGE ) {
  1766. !             short min = aWin->lin - (r.bottom - r.top) / aWin->charHeight;
  1767. !             if (aWin->scrollPos < min) {
  1768. !                 aWin->scrollPos = min;
  1769. !                 SetCtlMax  (aWin->scrollBar, aWin->lin);
  1770. !                 SetCtlValue(aWin->scrollBar, min);
  1771.               }
  1772.           }
  1773.           if ( aWin -> scrollBar ) {
  1774.               InvalScrollBar ( aWin ) ;
  1775. ***************
  1776. *** 2751,2760 ****
  1777. --- 2843,2856 ----
  1778.               break ;
  1779.           }
  1780.       } else {
  1781. + #if 1
  1782. +         Debugger ( ) ;
  1783. + #else
  1784.           char ss [ 2 ] ;
  1785.           ss [ 0 ] = sym ;
  1786.           ss [ 1 ] = 0 ;
  1787.           putstr ( win , 0 , ss ) ;
  1788. + #endif
  1789.       }
  1790.   }
  1791.   
  1792. ***************
  1793. *** 2881,2890 ****
  1794.   int
  1795.   mac_nh_poskey ( int * a , int * b , int * c )
  1796.   {
  1797. !     if ( ! a || ! b || ! c ) {
  1798. !         Debugger ( ) ;
  1799. !     }
  1800. !     return nhgetch ( ) ;
  1801.   }
  1802.   
  1803.   
  1804. --- 2977,2987 ----
  1805.   int
  1806.   mac_nh_poskey ( int * a , int * b , int * c )
  1807.   {
  1808. !     int ch = nhgetch();
  1809. !     *a = clicked_pos.h;
  1810. !     *b = clicked_pos.v;
  1811. !     *c = clicked_mod;
  1812. !     return ch;
  1813.   }
  1814.   
  1815.   
  1816. ***************
  1817. *** 2891,2902 ****
  1818.   void
  1819.   mac_start_menu ( winid win )
  1820.   {
  1821. !     NhWindow * aWin = & theWindows [ win ] ;
  1822. !     HideWindow ( aWin -> theWindow ) ;
  1823. !     SetHandleSize ( aWin -> windowText , TEXT_BLOCK ) ;
  1824. !     aWin -> wid = 0 ;
  1825. !     aWin -> lin = 0 ;
  1826.       clear_nhwindow ( win ) ;
  1827.   }
  1828.   
  1829. --- 2988,2994 ----
  1830.   void
  1831.   mac_start_menu ( winid win )
  1832.   {
  1833. !     HideWindow ( theWindows [ win ] . theWindow ) ;
  1834.       clear_nhwindow ( win ) ;
  1835.   }
  1836.   
  1837. ***************
  1838. *** 2956,2982 ****
  1839.   char
  1840.   mac_select_menu ( winid win )
  1841.   {
  1842. -     short w , h ;
  1843.       int c , l ;
  1844. -     WindowPtr theWin = theWindows [ win ] . theWindow ;
  1845.       NhWindow * aWin = & theWindows [ win ] ;
  1846.   
  1847.       inSelect = win ;
  1848.   
  1849.       SetPort ( theWin ) ;
  1850. !     if ( aWin -> wid && aWin -> lin ) {
  1851. !         w = aWin -> wid + 16 ;
  1852. !         h = aWin -> lin * aWin -> charHeight ;
  1853. !         if ( w > 450 ) {
  1854. !             w = 450 ;
  1855. !         }
  1856. !         if ( h > 300 ) {
  1857. !             h = 300 ;
  1858. !         }
  1859. !         SizeWindow ( theWin , w , h , TRUE ) ;
  1860. !         if ( aWin -> scrollBar ) {
  1861. !             InvalScrollBar ( aWin ) ;
  1862. !         }
  1863.       }
  1864.       SelectWindow ( theWin ) ;
  1865.       ShowWindow ( theWin ) ;
  1866. --- 3048,3063 ----
  1867.   char
  1868.   mac_select_menu ( winid win )
  1869.   {
  1870.       int c , l ;
  1871.       NhWindow * aWin = & theWindows [ win ] ;
  1872. +     WindowPtr theWin = aWin -> theWindow ;
  1873.   
  1874.       inSelect = win ;
  1875.   
  1876. +     adjust_window_pos ( aWin , theWin , aWin -> wid + ( SBARWIDTH + 2 ) ) ;
  1877.       SetPort ( theWin ) ;
  1878. !     if ( aWin -> scrollBar ) {
  1879. !         InvalScrollBar ( aWin ) ;
  1880.       }
  1881.       SelectWindow ( theWin ) ;
  1882.       ShowWindow ( theWin ) ;
  1883. ***************
  1884. *** 2983,2989 ****
  1885.       InvalRect ( & ( theWin -> portRect ) ) ;
  1886.   
  1887.       do {
  1888. !         while ( ! ( c =  nhgetch ( ) ) ) ;
  1889.           for ( l = 0 ; l < aWin -> lin ; l ++ ) {
  1890.               if ( aWin -> itemChars [ l ] == c )
  1891.                   goto done ;
  1892. --- 3064,3070 ----
  1893.       InvalRect ( & ( theWin -> portRect ) ) ;
  1894.   
  1895.       do {
  1896. !         c = nhgetch ( ) ;
  1897.           for ( l = 0 ; l < aWin -> lin ; l ++ ) {
  1898.               if ( aWin -> itemChars [ l ] == c )
  1899.                   goto done ;
  1900. ***************
  1901. *** 3185,3191 ****
  1902.       DialogPtr        characterDialog;
  1903.       short            itemHit, lastItemSelected, type;
  1904.       Rect            box;
  1905. !     
  1906.       characterDialog = GetNewDialog(132, (Ptr) NULL, (WindowPtr) -1);
  1907.       
  1908.       /*
  1909. --- 3266,3287 ----
  1910.       DialogPtr        characterDialog;
  1911.       short            itemHit, lastItemSelected, type;
  1912.       Rect            box;
  1913. !     char pc;
  1914. !     if ((pc = highc(pl_character[0])) != 0) {
  1915. !         char pbuf[QBUFSZ];
  1916. !         EventRecord update_evt;
  1917. !         if(index(pl_classes, pc) != (char*) 0) {
  1918. !             pl_character[0] = pc;
  1919. !             return;
  1920. !         }
  1921. !         putstr(WIN_MESSAGE, 0, "");
  1922. !         Sprintf(pbuf, "Unknown role: %c", pc);
  1923. !         putstr(WIN_MESSAGE, 0, pbuf);
  1924. !         while (CheckUpdate(&update_evt))
  1925. !             HandleUpdate(&update_evt);
  1926. !     }
  1927.       characterDialog = GetNewDialog(132, (Ptr) NULL, (WindowPtr) -1);
  1928.       
  1929.       /*
  1930.  
  1931.