home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / nethack-3.1 / sys / mac / maccurs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-26  |  5.3 KB  |  306 lines

  1. /*    SCCS Id: @(#)maccurs.c    3.1    93/01/24          */
  2. /* Copyright (c) Jon W{tte, 1992.                  */
  3. /* NetHack may be freely redistributed.  See license for details. */
  4.  
  5. #include "hack.h"
  6.  
  7. #include <Folders.h>
  8. #include <Windows.h>
  9. #include <ToolUtils.h>
  10. #include <Resources.h>
  11. #include <Memory.h>
  12. #include <Files.h>
  13.  
  14. #define DIV_FACTOR 3
  15.  
  16. static Boolean winFileInit = 0 ;
  17. static unsigned char winFileName [ 32 ] ;
  18. static long winFileDir ;
  19. static short winFileVol ;
  20. static Handle winFileContents = NULL ;
  21.  
  22. typedef struct WinPosSave {
  23.     short            validPos ;
  24.     short            validSize ;
  25.     short            top ;
  26.     short            left ;
  27.     short            height ;
  28.     short            width ;
  29. } WinPosSave ;
  30.  
  31. static WinPosSave savePos [ kLastWindowKind + 1 ] ;
  32. static WinPosSave usePos [ kLastWindowKind + 1 ] ;
  33.  
  34.  
  35.  
  36. static void
  37. InitWinFile ( void )
  38. {
  39.     StringHandle sh ;
  40.     long len ;
  41.     short ref = 0 ;
  42.  
  43.     if ( winFileInit ) {
  44.         return ;
  45.     }
  46. /* We trust the glue. If there's an error, store in game dir. */
  47.     if ( FindFolder ( kOnSystemDisk , kPreferencesFolderType , kCreateFolder ,
  48.         & winFileVol , & winFileDir ) ) {
  49.         winFileVol = 0 ;
  50.         winFileDir = 0 ;
  51.     }
  52.     sh = GetString ( 128 ) ;
  53.     if ( sh && * sh ) {
  54.         BlockMove ( * sh , winFileName , * * sh + 1 ) ;
  55.         ReleaseResource ( sh ) ;
  56.     } else {
  57.         BlockMove ( "\PNetHack Windows" , winFileName , 16 ) ;
  58.     }
  59.     if ( HOpen ( winFileVol , winFileDir , winFileName , fsRdPerm , & ref ) ) {
  60.         return ;
  61.     }
  62.     len = sizeof ( savePos ) ;
  63.     if ( ! FSRead ( ref , & len , savePos ) ) {
  64.         winFileInit = 1 ;
  65.     }
  66.     BlockMove ( savePos , usePos , sizeof ( savePos ) ) ;
  67.     FSClose ( ref ) ;
  68. }
  69.  
  70.  
  71. static void
  72. FlushWinFile ( void )
  73. {
  74.     short ref ;
  75.     long len ;
  76.  
  77.     if ( ! winFileInit ) {
  78.         if ( ! winFileName [ 0 ] ) {
  79.             return ;
  80.         }
  81.         HCreate ( winFileVol , winFileDir , winFileName , MAC_CREATOR , PREF_TYPE ) ;
  82.         HCreateResFile ( winFileVol , winFileDir , winFileName ) ;
  83.     }
  84.     if ( HOpen ( winFileVol , winFileDir , winFileName , fsWrPerm , & ref ) ) {
  85.         return ;
  86.     }
  87.     winFileInit = 1 ;
  88.     len = sizeof ( savePos ) ;
  89.     ( void ) FSWrite ( ref , & len , savePos ) ; /* Don't care about error */
  90.     FSClose ( ref ) ;
  91. }
  92.  
  93.  
  94. int
  95. clickSector ( int x , int y , int toX , int toY )
  96. {
  97.     Boolean isDown = 0 ;
  98.     Boolean isLeft = 0 ;
  99.     Boolean inHoriz = 0 ;
  100.     Boolean inVert = 0 ;
  101.  
  102.     if ( toX == x && toY == y ) {
  103.  
  104.         return 0 ; /* On the same spot */
  105.     }
  106.  
  107.     if ( abs ( toY - y ) <= abs ( toX - x ) / DIV_FACTOR ) {
  108.  
  109.         inHoriz = 1 ;
  110.     }
  111.     if ( abs ( toX - x ) <= abs ( toY - y ) / DIV_FACTOR ) {
  112.  
  113.         inVert = 1 ;
  114.     }
  115.     if ( toY > y ) {
  116.  
  117.         isDown = 1 ;
  118.     }
  119.     if ( toX < x ) {
  120.  
  121.         isLeft = 1 ;
  122.     }
  123.  
  124.     if ( inHoriz ) {
  125.  
  126.         if ( isLeft ) {
  127.  
  128.             return 7 ;
  129.         }
  130.         return 3 ;
  131.     }
  132.     if ( inVert ) {
  133.  
  134.         if ( isDown ) {
  135.  
  136.             return 5 ;
  137.         }
  138.         return 1 ;
  139.     }
  140.     if ( isDown ) {
  141.  
  142.         if ( isLeft ) {
  143.  
  144.             return 6 ;
  145.         }
  146.         return 4 ;
  147.  
  148.     } else {
  149.  
  150.         if ( isLeft ) {
  151.  
  152.             return 8 ;
  153.         }
  154.         return 2 ;
  155.     }
  156. }
  157.  
  158.  
  159.  
  160.  
  161. Boolean
  162. RetrievePosition ( short kind , short * top , short * left )
  163. {
  164.     Point p ;
  165.  
  166.     InitWinFile ( ) ;
  167.     if ( kind < 0 || kind > kLastWindowKind ) {
  168.         return 0 ;
  169.     }
  170.     if ( ! usePos [ kind ] . validPos ) {
  171.         return 0 ;
  172.     }
  173.     * top = usePos [ kind ] . top ;
  174.     * left = usePos [ kind ] . left ;
  175.     p . h = * left ;
  176.     p . v = * top ;
  177.     return PtInRgn ( p , GetGrayRgn ( ) ) ;
  178. }
  179.  
  180.  
  181. Boolean
  182. RetrieveSize ( short kind , short top , short left , short * height , short * width )
  183. {
  184.     Point p ;
  185.  
  186.     InitWinFile ( ) ;
  187.     if ( kind < 0 || kind > kLastWindowKind ) {
  188.         return 0 ;
  189.     }
  190.     if ( ! usePos [ kind ] . validSize ) {
  191.         return 0 ;
  192.     }
  193.     * width = usePos [ kind ] . width ;
  194.     * height = usePos [ kind ] . height ;
  195.     p . h = left + * width ;
  196.     p . v = top + * height ;
  197.     return PtInRgn ( p , GetGrayRgn ( ) ) ;
  198. }
  199.  
  200.  
  201. void
  202. SavePosition ( short kind , short top , short left )
  203. {
  204.     InitWinFile ( ) ;
  205.     if ( kind < 0 || kind > kLastWindowKind ) {
  206.         return ;
  207.     }
  208.     savePos [ kind ] . validPos = 1 ;
  209.     savePos [ kind ] . top = top ;
  210.     savePos [ kind ] . left = left ;
  211.     FlushWinFile ( ) ;
  212. }
  213.  
  214.  
  215. void
  216. SaveSize ( short kind , short height , short width )
  217. {
  218.     InitWinFile ( ) ;
  219.     if ( kind < 0 || kind > kLastWindowKind ) {
  220.         return ;
  221.     }
  222.     savePos [ kind ] . validSize = 1 ;
  223.     savePos [ kind ] . width = width ;
  224.     savePos [ kind ] . height = height ;
  225.     FlushWinFile ( ) ;
  226. }
  227.  
  228.  
  229. static short
  230. GetWinKind ( WindowPtr win )
  231. {
  232.     short kind ;
  233.     NhWindow * nhw = GetWRefCon ( win ) ;
  234.  
  235.     if ( ! nhw || ( ( ( long ) nhw ) & 1 ) || nhw -> theWindow != win ) {
  236.         return -1 ;
  237.     }
  238.     kind = nhw -> kind ;
  239.     if ( kind < 0 || kind > NHW_TEXT ) {
  240.         return -1 ;
  241.     }
  242.     switch ( kind ) {
  243.     case NHW_MAP :
  244.         kind = kMapWindow ;
  245.         break ;
  246.     case NHW_STATUS :
  247.         kind = kStatusWindow ;
  248.         break ;
  249.     case NHW_MESSAGE :
  250.         kind = kMessageWindow ;
  251.         break ;
  252.     case NHW_MENU :
  253.         kind = kMenuWindow ;
  254.         break ;
  255.     default :
  256.         kind = kTextWindow ;
  257.         break ;
  258.     }
  259.  
  260.     return kind ;
  261. }
  262.  
  263.  
  264. Boolean
  265. RetrieveWinPos ( WindowPtr win , short * top , short * left )
  266. {
  267.     short kind ;
  268.  
  269.     kind = GetWinKind ( win ) ;
  270.     if ( kind < 0 || kind > kLastWindowKind ) {
  271.         return 0 ;
  272.     }
  273.     return RetrievePosition ( kind , top , left ) ;
  274. }
  275.  
  276.  
  277. void
  278. SaveWindowPos ( WindowPtr win )
  279. {
  280.     short kind ;
  281.     GrafPtr gp ;
  282.     Point p = { 0 , 0 } ;
  283.  
  284.     kind = GetWinKind ( win ) ;
  285.     if ( kind < 0 || kind > kLastWindowKind ) {
  286.         return ;
  287.     }
  288.     GetPort ( & gp ) ;
  289.     SetPort ( win ) ;
  290.     LocalToGlobal ( & p ) ;
  291.     SetPort ( gp ) ;
  292.     SavePosition ( kind , p . v , p . h ) ;
  293. }
  294.  
  295.  
  296. void
  297. SaveWindowSize ( WindowPtr win )
  298. {
  299.     short kind , width , height ;
  300.  
  301.     kind = GetWinKind ( win ) ;
  302.     width = win -> portRect . right - win -> portRect . left ;
  303.     height = win -> portRect . bottom - win -> portRect . top ;
  304.     SaveSize ( kind , height , width ) ;
  305. }
  306.