home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / art2 / src.lzh / MAIN.C < prev    next >
C/C++ Source or Header  |  1995-06-19  |  9KB  |  324 lines

  1. /*====================================================
  2.                       ARTemis
  3.                    (version 1.3)
  4.              FM-TOWNS 用ペイントツール
  5.  
  6.                  by 松内 良介 1994
  7. ====================================================*/
  8. /*
  9.     main.c
  10.         main(), APL_init()
  11.         ・GUIライブラリ、各モジュールの初期化
  12.         ・MMI_ExecSystem() による GUIシステムの起動
  13.         ・終了時の後片付け処理
  14. */
  15. #define MODULE_MAIN
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <winb.h>
  21. #include <te.h>
  22. #include <fntb.h>
  23. #include <gui.h>
  24. #include <fmcfrb.h>
  25. #include <file_dlg.h>
  26. #include <egb.h>
  27. #include <ctype.h>
  28. #include <direct.h>
  29. #include <dos.h>
  30.  
  31. #include "art.h"
  32. #include "imagewin.h"
  33. #include "imgbtn.h"
  34. #include "pensel.h"
  35. #include "colsel.h"
  36. #include "guisub.h"
  37. #include "desktop.h"
  38.  
  39. void getExecDir(char *argv0, char *buf)
  40. // buf: _MAX_PATH バイトのバッファ
  41. {
  42.     uint nouse;
  43.     char curdir[_MAX_PATH],curdir2[_MAX_PATH];
  44.     _getcwd(curdir, _MAX_PATH);
  45.     char drive[_MAX_DRIVE],dir[_MAX_DIR],basename[_MAX_FNAME],ext[_MAX_EXT];
  46.     _splitpath(argv0,drive,dir,basename,ext);
  47.     if (drive[0] != 0)
  48.         _dos_setdrive(toupper(drive[0])-'A'+1, &nouse);
  49.     _getcwd(curdir2,_MAX_PATH);
  50.     strcat(dir,".");
  51.     _chdir(dir);
  52.     _getcwd(buf, _MAX_PATH);
  53.     _chdir(curdir2);
  54.     _dos_setdrive(toupper(curdir[0])-'A'+1, &nouse);
  55.     _chdir(curdir);
  56.     if (strlen(buf) > 3)
  57.         strcat(buf, "\\");
  58. }
  59.  
  60. char    *guiEgbPtr ;            /*    EGB のワークアドレス    */
  61. unsigned int *guiColTbl;        /*  色変換テーブルのアドレス  */
  62.  
  63. int IMGBOXproto = -1;        /* IMGBOX部品のひな型のID */
  64. int IMGBTNproto = -1;
  65.  
  66. int        imgwin_cnt;
  67.  
  68. int scrPixelSize;
  69. int paramNizimi = 50;
  70. int paramKosuri = 128;
  71. char dirExec[_MAX_PATH];
  72.  
  73. void main(int argc, char *argv[])
  74. {
  75.     getExecDir(argv[0],dirExec);
  76.     MMICTRL ctrl,ctrl2;
  77.     extern int APL_init() ;
  78.     int i;
  79.     BOOL fScr32K = FALSE;
  80.     for (i=1; i<argc; i++)
  81.     {
  82.         if (argv[i][0] == '-')
  83.         {
  84.             if (strcmp(argv[i]+1,"32k")==0 || strcmp(argv[1]+1,"32K") == 0)
  85.                 fScr32K = TRUE;
  86.         }
  87.     }
  88.  
  89.     /*    致命的エラーハンドラの登録    */
  90.     FM_SetVector() ;
  91.  
  92.     if (!fScr32K)
  93.     {
  94.         char para[12];
  95.         RESOLUTION buf[2];
  96.         DWORD(para+0)=1;
  97.         DWORD(para+4)=24;
  98.         DWORD(para+8)=0;
  99.         if (EGB_getResolutionMax(0,para,buf) != -1)
  100.             ctrl.page0 = SCREEN16M , scrPixelSize = 24;
  101.         else
  102.             ctrl.page0 = SCREEN32K , scrPixelSize = 16;
  103.     }
  104.     else
  105.         ctrl.page0 = SCREEN32K, scrPixelSize = 16;
  106.     ctrl.page1 = SCREENUNUSED ;
  107.     ctrl.writePage = 0 ;        /* 書き込みページ */
  108.     ctrl.displayPage = 1 ;        /* 表示ページフラグ */
  109.     ctrl.priority = 0 ;            /* 表示プライオリティ */
  110.  
  111.     ctrl.mode = SCREENAVAILABLE ;
  112.     ctrl.width = SCREENEXPAND ;
  113.     ctrl.size = 0 ;                /* メモリ領域の大きさ */
  114.     ctrl.ptr = NULL ;            /* メモリ領域のアドレス */
  115.     ctrl.asize = 0 ;            /* ユーザ領域の大きさ */
  116.     ctrl.aptr = NULL ;            /* ユーザ領域のアドレス */
  117.     ctrl.move.lupx = -10000;    /* 部品移動枠 */
  118.     ctrl.move.lupy = 20   ;        /* (ダイアログ移動範囲制限(y座標)) */
  119.     ctrl.move.rdwx = 10000;
  120.     ctrl.move.rdwy = 10000;
  121.     ctrl.white = 15 ;            /* 白の色番号 */
  122.     ctrl.black = 8 ;            /* 黒の色番号 */
  123.     ctrl.gray  = 7 ;            /* 灰色の色番号 */
  124.     ctrl.xor   = 6 ;            /* 反転色の色番号 */
  125.  
  126.     if (MMI_Open(&ctrl) == NOERR)
  127.     {
  128.         /*    初期化に成功すればメインループに入る.    */
  129.         if (APL_init() == NOERR)
  130.         {
  131.             FDG_SaveCurDir() ;
  132.             FDG_InitFileDlg() ;
  133.             RM_setFileDlgStyle(1);
  134.             MMI_ExecSystem() ;
  135.             FDG_FreeFileDlg();
  136.             FDG_RecovCurDir() ;
  137.         }
  138.         /* ARTemis 内の各モジュールの終了処理 */
  139.         pensel_end();
  140.         pic_close();
  141.     }
  142.  
  143.     /*    終了処理    */
  144.     MMI_Close() ;
  145.  
  146.     /*    致命的エラーハンドラの復帰    */
  147.     FM_ResetVector() ;
  148.  
  149.     /* キークリック音のOFF */
  150.     KYB_clic(1);
  151. }
  152.  
  153. int APL_init()
  154. {
  155.     extern MMIINIT    initDataABOUT ;
  156.     extern MMIINIT    initDataZALERT ;
  157.     extern MMIINIT    initDataZCOLSEL ;
  158.     extern MMIINIT    initDataZCREATE ;
  159.     extern MMIINIT    initDataZDESKTOP ;
  160.     extern MMIINIT    initDataZIMGWIN ;
  161.     extern MMIINIT    initDataZPENSEL ;
  162.     extern MMIINIT    initDataZSETUP ;
  163.     extern MMIINIT    initDataZALLSCR ;
  164.     extern int        set_icontable(void);
  165.  
  166.     register int    ret ;
  167.  
  168.     /*    EGB ワークアドレスの取得.    */
  169.     guiEgbPtr = MMI_GetEgbPtr() ;
  170.  
  171.     /*    ハイパ型部品の初期化            */
  172.     if ((ret = MMI_initHyper()) < 0)
  173.         return ret ;
  174.     /*    ダイアログ型部品の初期化        */
  175.     if ((ret = MMI_initDialogL40()) < 0)
  176.         return ret ;
  177.     /*    アラート型部品の初期化            */
  178.     if ((ret = MMI_initAlertL40()) < 0)
  179.         return ret ;
  180.     /*    ウインドウ型部品の初期化        */
  181.     if ((ret = MMI_initWindowL40()) < 0)
  182.         return ret ;
  183.     /*    メッセージ型部品の初期化        */
  184.     if ((ret = MMI_initMessageL40()) < 0)
  185.         return ret ;
  186.     /*    メニュー型部品の初期化            */
  187.     if ((ret = MMI_initMenuL40()) < 0)
  188.         return ret ;
  189.     /*    ボタン型部品の初期化            */
  190.     if ((ret = MMI_initButtonL40()) < 0)
  191.         return ret ;
  192.     /*    ドロウボタン型部品の初期化        */
  193.     if ((ret = MMI_initDrawButtonL40()) < 0)
  194.         return ret ;
  195.     /*    アイコンボタン型部品の初期化    */
  196.     if ((ret = MMI_initIconL40()) < 0)
  197.         return ret ;
  198.     /*    トグルアイコン型部品の初期化    */
  199.     if ((ret = MMI_initToggleIconL40()) < 0)
  200.         return ret ;
  201.     /*    メニューアイテム型部品の初期化    */
  202.     if ((ret = MMI_initMenuItemL40()) < 0)
  203.         return ret ;
  204.     /*    スクロール型部品の初期化        */
  205.     if ((ret = MMI_initScrollBarL40()) < 0)
  206.         return ret ;
  207.     /*    テキスト型部品の初期化            */
  208.     if ((ret = MMI_initTextL40()) < 0)
  209.         return ret ;
  210.     /*  リストメニュー型部品の初期化    */
  211.     if ((ret = MMI_initListMenuL40()) < 0)
  212.         return ret ;
  213.     /*    数値入力型部品の初期化            */
  214.     if ((ret = MMI_initNumBoxL40()) < 0)
  215.         return ret ;
  216.  
  217.     /* イメージボックス型部品の初期化 */
  218.     if ((ret = MMI_initImageBox()) < 0)
  219.         return ret;
  220.     /* イメージボタン型部品の初期化 */
  221.     if ((ret = MMI_initImageBtn()) < 0)
  222.         return ret ;
  223.  
  224.     /*    デフォルトビジュアルエフェクトの登録    */
  225.     MMI_SetUpVisualEffect() ;
  226.  
  227.     /*    背景データの初期化                        */
  228.     EGB_tmenuPalette2(guiEgbPtr) ;
  229.  
  230.     /*    データの登録        */
  231.     if ((ret = MMI_Init(&initDataABOUT)) < 0)
  232.         return ret ;
  233.     if ((ret = MMI_Init(&initDataZALERT)) < 0)
  234.         return ret ;
  235.     if ((ret = MMI_Init(&initDataZCOLSEL)) < 0)
  236.         return ret ;
  237.     if ((ret = MMI_Init(&initDataZCREATE)) < 0)
  238.         return ret ;
  239.     if ((ret = MMI_Init(&initDataZDESKTOP)) < 0)
  240.         return ret ;
  241.     if ((ret = MMI_Init(&initDataZIMGWIN)) < 0)
  242.         return ret ;
  243.     if ((ret = MMI_Init(&initDataZPENSEL)) < 0)
  244.         return ret ;
  245.     if ((ret = MMI_Init(&initDataZSETUP)) < 0)
  246.         return ret ;
  247.     if ((ret = MMI_Init(&initDataZALLSCR)) < 0)
  248.         return ret ;
  249.  
  250.     /*    SIDEWORKメニューを登録する                */
  251.     MMI_SetUpSDKMenu( idDesktopMItem_System , 2 ) ;
  252.  
  253.     /* ARTemisの各モジュールの初期化 */
  254.     if ((ret = IMGBOX_makePrototype(&IMGBOXproto)) < 0)
  255.         return ret;
  256.     if ((ret = IMGBTN_makePrototype(&IMGBTNproto)) < 0)
  257.         return ret;
  258.  
  259.     if ((ret = desktop_init()) < 0)
  260.         return ret ;
  261.     if ((ret = imagewin_init()) < 0)
  262.         return ret ;
  263.     if ((ret = pic_init()) < 0)
  264.         return ret ;
  265.     if ((ret = pensel_init()) < 0)
  266.         return ret ;
  267.     if ((ret = colsel_init()) < 0)
  268.         return ret ;
  269.  
  270.     /* カラーテーブルの設定 */
  271.     scrplt_init();
  272.  
  273.     /* アイコンテーブルの設定 */
  274.     if ((ret = set_icontable()) < 0)
  275.         return ret ;
  276.  
  277.     // 解像度に合わせて部品のサイズを調整
  278.     WINCTRL *pctrl;
  279.     MMI_GetControl(&pctrl);
  280.     FRAME fr;
  281.     RM_getFrame(idBackDialog, &fr);
  282.     fr.X2 = pctrl->bound.X2;
  283.     fr.Y2 = pctrl->bound.Y2;
  284.     RM_setFrame(idBackDialog, &fr);
  285.     RM_getFrame(idDesktopDialog, &fr);
  286.     fr.X2 = pctrl->bound.X2;
  287.     RM_setFrame(idDesktopDialog, &fr);
  288.     RM_offsetFrame(idDesktopExitIcon, pctrl->bound.X2+1 - 512, 0);
  289.     RM_offsetFrame(idDesktopHelpIcon, pctrl->bound.X2+1 - 512, 0);
  290.     RM_offsetFrame(idDesktopSkbIcon, pctrl->bound.X2+1 - 512, 0);
  291.  
  292.     /* ツールボックス、ペン選択パレットの接続 */
  293.     MMI_SendMessage( idBrushT2Hyper, MM_DETACH, 0);
  294.     {
  295.         FRAME fr,fr2;
  296.         fr = OBJHYP(idBrushTinyDlg).fr;
  297.         fr2 = OBJHYP(idBrushT2Hyper).fr;
  298.         RM_moveFrameTo(&fr2, fr.X+2, fr.Y+2);
  299.         MMI_SendMessage( idBrushT2Hyper, MM_MOVE, 1, &fr2);
  300.     }
  301.     MMI_SendMessage( idBrushT2Hyper, MM_ATTACH, 2, idBrushTinyDlg, 1);
  302.     /* ペン先選択ウィンドウの接続 */
  303.     MMI_SendMessage( idBrushTinyDlg, MM_ATTACH, 1, idDesktopToolAttachHyper );
  304.     /* 色選択ウィンドウの接続 */
  305.     MMI_SendMessage( idColSelDlg, MM_ATTACH, 1, idDesktopToolAttachHyper );
  306.  
  307.     /*    背景を表示する                            */
  308.     MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;
  309.  
  310.     double freemem = (double)(TL_checkMemory(0)*4) / 1024.0;
  311.     if (freemem < 2.0)
  312.     {
  313.         char msg[500];
  314.         sprintf(msg, 
  315.             "このマシンで現在 ARTemis が作業のために使えるメモリは"
  316.             " %3.1fメガバイトで、あまり余裕がありません。"
  317.             "できればあと %3.1fメガバイト程度のメモリを追加することを"
  318.             "おすすめします。", freemem, 3.0-freemem);
  319.         dispBigAlertMessage("メモリ不足にご注意を…", msg);
  320.     }
  321.     return NOERR ;
  322. }
  323.  
  324.