home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / tetujin / src.lzh / TETUJIN.C < prev    next >
Text File  |  1995-01-02  |  11KB  |  425 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <file_dlg.h>
  9. #include <egb.h>
  10. #include <mos.h>
  11. #include <snd.h>
  12. #include <guidbg.h>
  13. #include "tetujin.h"
  14.  
  15.  
  16. char    *guiEgbPtr ;            /*    EGB のワークアドレス    */
  17.  
  18. /*    アラートメッセージ                        */
  19. static char    *alertStrMem[] = 
  20.                 {"画像処理の鉄人達:\nメモリが不足しています", "確認"};
  21.  
  22. /*    checkMemFunc関数/alertMemFunc関数の追い越し禁止フラグ    */
  23. static int        checkMemFlag = 0x00 ;
  24.  
  25. /****************************************************************/
  26. /*    メモリ不足時のアラート関数(イベント登録関数)                */
  27. /****************************************************************/
  28. void alertMemFunc()
  29. {
  30.     /*    メモリ不足のアラート表示    */
  31.     MMI_CallMessage(MMI_GetApliId(), GM_ALERT, 
  32.                         AM_ALERT1 | AM_ALERTB0E,(int)alertStrMem) ;
  33.  
  34.     /* checkMemFunc関数/alertMemFunc関数の追い越し禁止解除    */
  35.     checkMemFlag &= 0xef ;
  36. }
  37.  
  38. /****************************************************************/
  39. /*    メモリ開放関数                                                */
  40. /****************************************************************/
  41. int checkMemFunc(useMem)
  42. int    useMem ;
  43. {
  44.     int        ret ;
  45.  
  46.     /*    メモリチェック                    */
  47.     if(TL_checkMemory(1) * 4096 >= useMem)
  48.         return NOERR ;        /*    メモリがあれば正常復帰        */
  49.  
  50.     do
  51.     {
  52.         /*    メモリ開放処理                */
  53.         ret = MMI_CallMessage(MMI_GetApliId(), GM_PURGE, 0, 0) ;
  54.  
  55.         /*    メモリチェック                */
  56.         if(TL_checkMemory(1) * 4096 >= useMem)
  57.             break ;
  58.     } while(ret == NOERR) ;
  59.  
  60.     return    ret ;
  61. }
  62.  
  63.  
  64. /****************************************************************/
  65. /*    Townsシェル呼び出し関数                                        */
  66. /****************************************************************/
  67. int userFunc(aplId, messId, info, data)
  68. int        aplId ;
  69. int        messId ;
  70. int        info ;
  71. int        data ;
  72. {
  73.     extern int wakeSet() ;
  74.     extern int sleepSet() ;
  75.     extern int quitFunc2() ;
  76.  
  77.     register int    ret ;
  78.     int                sw ;
  79.     POOLDATA        *ptr ;
  80.  
  81.     ret = ILLEGAL_FUNCTION ;
  82.  
  83.     switch (messId)
  84.     {
  85.         case    GM_WAKE :
  86.         {
  87.             EVENT    ev ;
  88.  
  89.             /*    checkMemFunc関数の追い越し禁止判定            */
  90.             if(checkMemFlag & 0x01)
  91.                 break ;
  92.  
  93.             /*    動作メモリのチェック                        */
  94.             /*    checkMemFunc関数の追い越し禁止        */
  95.             checkMemFlag |= 0x01 ;
  96.             if(checkMemFunc(MinMem) != NOERR)
  97.             {
  98.                 /*    alertMemFunc関数の追い越し禁止    */
  99.                 checkMemFlag |= 0x10 ;
  100.                 /*    メモリ不足の場合はアラート処理関数をイベント登録する    */
  101.                 MMI_FlushEvnt() ;
  102.                 ev.what = EVEXEC ;
  103.                 ev.shift = 0 ;
  104.                 ev.info = (int)alertMemFunc ;
  105.                 MMI_SetEvnt(&ev) ;
  106.                 break ;
  107.             }
  108.  
  109.             wakeSet() ;
  110.             break ;
  111.         }
  112.  
  113.         case    GM_SLEEP :
  114.         {
  115.             /* alertMemFunc関数がイベント登録されてなければ、checkMemFunc関数
  116.                 の追い越し禁止解除                                            */
  117.             if((checkMemFlag & 0x10) == 0x00)
  118.                 checkMemFlag &= 0xfe ;
  119.  
  120.             sleepSet() ;
  121.             break ;
  122.         }
  123.  
  124.         case    GM_QUIT :
  125.         {
  126.             ret = quitFunc2() ;
  127.             break ;
  128.         }
  129.  
  130.     }
  131.     return ret ;
  132.  
  133. }
  134.  
  135. void main()
  136. {
  137.     extern int APL_init() ;
  138.     extern int startSet() ;
  139.  
  140.     MMICTRL ctrl ;
  141.     int kobj ;
  142.  
  143.     /*    初期化処理    */
  144.  
  145.     ctrl.page0=SCREEN32K;
  146.     ctrl.page1=SCREENUNUSED;
  147.     ctrl.writePage=0;
  148.     ctrl.displayPage=1;
  149.     ctrl.priority=0;
  150.     ctrl.mode=SCREENAVAILABLE;
  151.     ctrl.width=SCREENEXPAND;
  152.  
  153.     ctrl.size=0;
  154.     ctrl.ptr=NULL;
  155.  
  156.     ctrl.asize=0;
  157.     ctrl.aptr=NULL;
  158.  
  159.     ctrl.move.lupx=-16384;
  160.     ctrl.move.lupy=    20;
  161.     ctrl.move.rdwx= 16383;
  162.     ctrl.move.rdwy= 16383;
  163.  
  164.     ctrl.white = 15 ;
  165.     ctrl.black = 8 ;        /* GUIの表示色を変更(黒)     */
  166.     ctrl.gray = 7 ;            /*      〃          (灰色)   */
  167.     ctrl.xor = 15 ;            /*      〃          (反転色) */
  168.  
  169.     /*    二重起動のチェック        */
  170.     if((kobj = MMI_CallMessage(MMI_GetApliId(),
  171.                                     GM_QUERYID, QM_KIND, 1)) > NOERR)
  172.     {
  173.         /*    同一ファイル名のアプリが既に存在する場合は
  174.             自アプリを終了する                    */
  175.         MMI_CallMessage(MMI_GetApliId(), GM_SWITCH, FALSE, kobj) ;
  176.  
  177.     }
  178.     /*    初期化処理                */
  179.     else if (MMI_Open( &ctrl ) == NOERR)
  180.     {
  181.         /*    初期化に成功すればメインループに入る.    */
  182.         if (APL_init() == NOERR)
  183.         {
  184.             /*    動作メモリのチェック    */
  185.             /*    checkMemFunc関数の追い越し禁止    */
  186.             checkMemFlag |= 0x01 ;
  187.             if(checkMemFunc(MinMem) != NOERR)
  188.             {
  189.                 /*    alertMemFunc関数の追い越し禁止    */
  190.                 checkMemFlag |= 0x10 ;
  191.                 alertMemFunc();            /*    メモリ不足のアラート表示    */
  192.             }
  193.             /*    checkMemFunc関数の追い越し禁止解除    */
  194.             checkMemFlag &= 0xfe ;
  195.  
  196.             FDG_SaveCurDir() ;        /*    カレントディレクトリ保存    */
  197.             FDG_InitFileDlg() ;        /*    ファイルダイアログ初期化    */
  198.  
  199.             if( startSet() == NOERR )
  200.                 MMI_ExecSystem() ;        /*    メインのイベントループ        */
  201.  
  202.             FDG_FreeFileDlg() ;        /*    ファイルダイアログ終了処理    */
  203.             FDG_RecovCurDir() ;        /*    カレントディレクトリ復元    */
  204.  
  205.             MMI_SendMessage(MMI_GetSleepObj(), MM_SLEEP, 0) ;
  206.             MMI_SetWakeObj(UNUSED);
  207.         }
  208.         /*    終了処理                */
  209.         MMI_Close() ;
  210.     }
  211.  
  212. }
  213.  
  214.  
  215.  
  216. int APL_init()
  217. {
  218.     extern MMIINIT    initDataIGRABOU ;
  219.     extern MMIINIT    initDataIGRDSK ;
  220.     extern MMIINIT    initDataIGRERR ;
  221.     extern MMIINIT    initDataIGRWIN ;
  222.     extern MMIINIT    initDataIGRFILE ;
  223.     extern MMIINIT    initDataIGRSET ;
  224.  
  225.     extern GRAPHWIN    window[] ;
  226.     extern int windowId ;
  227.     extern int vscrollId ;
  228.     extern int hscrollId ;
  229.  
  230.     extern int        mItemId[] ;
  231.  
  232.     register int    ret ;
  233.     int i ;
  234.  
  235.     /*    EGB ワークアドレスの取得.    */
  236.     guiEgbPtr = MMI_GetEgbPtr() ;
  237.  
  238.     /*    ハイパ型部品の初期化            */
  239.     if ((ret = MMI_initHyper()) < 0)
  240.         return ret ;
  241.     /*    リストメニュー型部品の初期化    */
  242.     if ((ret = MMI_initListMenuL40()) < 0)
  243.         return ret ;
  244.     /*    ダイアログ型部品の初期化        */
  245.     if ((ret = MMI_initDialogL40()) < 0)
  246.         return ret ;
  247.     /*    アラート型部品の初期化            */
  248.     if ((ret = MMI_initAlertL40()) < 0)
  249.         return ret ;
  250.     /*    ウインドウ型部品の初期化        */
  251.     if ((ret = MMI_initWindowL40()) < 0)
  252.         return ret ;
  253.     /*    メッセージ型部品の初期化        */
  254.     if ((ret = MMI_initMessageL40()) < 0)
  255.         return ret ;
  256.     /*    メニュー型部品の初期化            */
  257.     if ((ret = MMI_initMenuL40()) < 0)
  258.         return ret ;
  259.     /*    ボタン型部品の初期化            */
  260.     if ((ret = MMI_initButtonL40()) < 0)
  261.         return ret ;
  262.     /*    ドロウボタン型部品の初期化        */
  263.     if ((ret = MMI_initDrawButtonL40()) < 0)
  264.         return ret ;
  265.     /*    アイコンボタン型部品の初期化    */
  266.     if ((ret = MMI_initIconL40()) < 0)
  267.         return ret ;
  268.     /*    トグルアイコン型部品の初期化    */
  269.     if ((ret = MMI_initToggleIconL40()) < 0)
  270.         return ret ;
  271.     /*    メニューアイテム型部品の初期化    */
  272.     if ((ret = MMI_initMenuItemL40()) < 0)
  273.         return ret ;
  274.     /*    スクロール型部品の初期化        */
  275.     if ((ret = MMI_initScrollBarL40()) < 0)
  276.         return ret ;
  277.     /*    テキスト型部品の初期化            */
  278.     if ((ret = MMI_initTextL40()) < 0)
  279.         return ret ;
  280.     /*    数値入力型部品の初期化            */
  281.     if ((ret = MMI_initNumBoxL40()) < 0)
  282.         return ret ;
  283.  
  284.     /*    パレット変更 */
  285.     setPalette() ;
  286.  
  287.     /*    背景データの初期化                        */
  288.  
  289.     /*    データの登録        */
  290.     if ((ret = MMI_Init(&initDataIGRABOU)) < 0)
  291.         return ret ;
  292.  
  293.     if ((ret = MMI_Init(&initDataIGRDSK)) < 0)
  294.         return ret ;
  295.  
  296.     if ((ret = MMI_Init(&initDataIGRERR)) < 0)
  297.         return ret ;
  298.  
  299.     if ((ret = MMI_Init(&initDataIGRWIN)) < 0)
  300.         return ret ;
  301.  
  302.     if ((ret = MMI_Init(&initDataIGRFILE)) < 0)
  303.         return ret ;
  304.  
  305.     if ((ret = MMI_Init(&initDataIGRSET)) < 0)
  306.         return ret ;
  307.  
  308.     /* 解像度にあわせてボタンの位置を変更 */
  309.  
  310.     extern int    quitIconId ;
  311.     extern int    outIconId ;
  312.     extern int    boundWidth ;
  313.  
  314.     WINCTRL *pctrl ;
  315.     HYPER hyp ;
  316.  
  317.     MMI_GetControl( &pctrl ) ;
  318.     boundWidth = pctrl->bound.rdwx + 1 ;
  319.     MMI_SendMessage( quitIconId, MM_GETHYPER, 1, &hyp ) ;
  320.     hyp.fr.lupx = pctrl->bound.rdwx - 28 ;
  321.     hyp.fr.lupy = 0 ;
  322.     hyp.fr.rdwx = pctrl->bound.rdwx -  9 ;
  323.     hyp.fr.rdwy = 19 ;
  324.     MMI_SendMessage( quitIconId, MM_MOVE, 1, &(hyp.fr) ) ;
  325.  
  326.     MMI_SendMessage( outIconId, MM_GETHYPER, 1, &hyp ) ;
  327.     hyp.fr.lupx = pctrl->bound.rdwx - 59 ;
  328.     hyp.fr.lupy = 0 ;
  329.     hyp.fr.rdwx = pctrl->bound.rdwx - 40 ;
  330.     hyp.fr.rdwy = 19 ;
  331.     MMI_SendMessage( outIconId, MM_MOVE, 1, &(hyp.fr) ) ;
  332.  
  333.     /* 解像度にあわせて基準になるウインドウの位置を変更 */
  334.  
  335.     HYPER    winhyp ;
  336.     HYPER    vschyp ;
  337.     HYPER    hschyp ;
  338.     FRAME    org ;
  339.     FRAME    size ;
  340.  
  341.     MMI_SendMessage( windowId , MM_GETHYPER , 1 , &winhyp );
  342.     MMI_SendMessage( vscrollId , MM_GETHYPER , 1 , &vschyp );
  343.     MMI_SendMessage( hscrollId , MM_GETHYPER , 1 , &hschyp );
  344.     MMI_SendMessage( windowId , MM_GETUSER , 2 , &org , &size );
  345.  
  346.     winhyp.fr.rdwx = winhyp.fr.rdwx + boundWidth - 512 ;
  347.     org.rdwx = org.rdwx             + boundWidth - 512 ;
  348.     size.rdwx = size.rdwx           + boundWidth - 512 ;
  349.  
  350.     vschyp.fr.lupx = vschyp.fr.lupx + boundWidth - 512 ;
  351.     vschyp.fr.rdwx = vschyp.fr.rdwx + boundWidth - 512 ;
  352.     hschyp.fr.rdwx = hschyp.fr.rdwx + boundWidth - 512 ;
  353.  
  354.     MMI_SendMessage( windowId , MM_SETHYPER , 1 , &winhyp ) ;
  355.     MMI_SendMessage( vscrollId , MM_SETHYPER , 1 , &vschyp ) ;
  356.     MMI_SendMessage( hscrollId , MM_SETHYPER , 1 , &hschyp ) ;
  357.     MMI_SendMessage( windowId , MM_SETUSER , 2 , &org , &size ) ;
  358.  
  359.  
  360.     /*    ウィンドウの影の存在から実態を生成する                */
  361.     for( i = 0 ; i < WINCOUNT ; i++ )
  362.     {
  363.         /*    ウィンドウ,テキスト,スクロールバーを生成する    */
  364.         window[i].windowId = -(MMI_SendMessage( windowId , MM_NEW , 0)) ;
  365.         window[i].vscrollId = MMI_SendMessage( vscrollId , MM_NEW , 0);
  366.         window[i].hscrollId = MMI_SendMessage( hscrollId , MM_NEW , 0);
  367.         window[i].buf16m = NULL ;
  368.         window[i].bufAlpha = NULL ;
  369.         window[i].buf32k = NULL ;
  370.         window[i].loadPath[0] = 0 ;
  371.         window[i].savePath[0] = 0 ;
  372.     }
  373.  
  374.     /*    タスクリストとサイドワークメニューを登録する    */
  375.     MMI_SetUpPrgMenu( mItemId[0], 2 ) ;
  376.     MMI_SetUpSDKMenu( mItemId[0], 4 ) ;
  377.  
  378.     /*    呼び出し関数を登録する    */
  379.     MMI_SendMessage(MMI_GetBaseObj(), MM_SETEXEC, 1, userFunc) ;
  380.  
  381.     /*    アプリケーション名を登録する    */
  382.     MMI_CallMessage(MMI_GetApliId(), GM_TITLE, (int)"画像処理の鉄人達", 0) ;
  383.  
  384.     /*    背景を表示する                            */
  385.     MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;
  386.  
  387.     return NOERR ;
  388. }
  389.  
  390. /*    32kモード専用パレット設定 */
  391. static int    setPalette()
  392. {
  393.     int temp ;
  394.     unsigned int *table ;
  395.  
  396.     table = MG_getColorTable( 2 ) ;    /* mode 0:16色, 1:256色 2:32768色 */
  397.  
  398.     void     set1Pal( int n, int b, int r, int g )
  399.     {
  400.         temp = (b * 2) + ((r * 2) << 5) + ((g * 2) << 10) ;
  401.         table[ n ] = temp + ( temp << 16 ) ;
  402.     }
  403.  
  404. /*    16色のパレットだと思って設定すればよい */
  405.     set1Pal( 0, 0, 0, 0 ) ;
  406.     set1Pal( 1, 4, 4, 8 ) ;
  407.     set1Pal( 2, 4, 12, 6 ) ;
  408.     set1Pal( 3, 5, 5, 5 ) ;        // ( 3, 10, 15, 12 )
  409.     set1Pal( 4, 9, 9, 9 ) ;
  410.     set1Pal( 5, 7, 0, 12 ) ;
  411.     set1Pal( 6, 12, 12, 12 ) ;
  412.     set1Pal( 7, 8, 8, 8 ) ;        // ( 7, 7, 7, 7 )
  413.     set1Pal( 8, 1, 1, 1 ) ;
  414.     set1Pal( 9, 8, 10, 12 ) ;    /* file selector */
  415.     set1Pal( 10, 0, 13, 0 ) ;
  416.     set1Pal( 11, 10, 0, 0 ) ;
  417.     set1Pal( 12, 0, 0, 15 ) ;
  418.     set1Pal( 13, 15, 0, 15 ) ;
  419.     set1Pal( 14, 0, 15, 13 ) ;
  420.     set1Pal( 15, 15, 15, 15 ) ;
  421.  
  422.     return NOERR ;
  423. }
  424.  
  425.