home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / art2 / src.lzh / SCRLWIN.C < prev    next >
C/C++ Source or Header  |  1995-06-17  |  31KB  |  1,022 lines

  1. /*
  2.     スクロールウィンドウ型の実現部
  3. */
  4.  
  5. #define    MODULE_SCRLWIN
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <winb.h>
  11. #include <te.h>
  12. #include <fntb.h>
  13. #include <gui.h>
  14. #include <mos.h>
  15. #include "newmsg.h"
  16. #include "scrlwin.h"
  17.  
  18. int     MJ_SCRLWIN = -1;
  19.  
  20. /* WINDOW型の定数 */
  21.  
  22.     #define CLOSEWX        12
  23.     #define CLOSEWY     12
  24.     #define RESIZEWX    16
  25.     #define RESIZEWY    16
  26.  
  27.     #define TITLEHIGHT    (CLOSEWY + 2)
  28.  
  29.     #define FFONTSIZE    12
  30.     #define HFONTSIZE    (FFONTSIZE/2)
  31.  
  32.     extern int    MC_checkMoveFrame40(int, FRAME *) ;
  33.  
  34. /* SCRLWIN型の定数 */
  35.  
  36.     #define    TitleHeight        16
  37.     #define    SbarWidth        16
  38.     #define    EraseboxSize    12
  39.  
  40.   /* 部品の新規生成 (id=メタクラス部品の ID) */
  41.     #define    CREATE(id)            MMI_SendMessage((id), MM_NEW, 0)
  42.     #define    OBJPTR(objId)            TL_getObjectPtr(objId)
  43.     #define    OBJHYP(objId)            (*(HYPER *)TL_getObjectPtr(objId)->data)
  44.     #define    OBJDATA(type,objId)        (*(type *)TL_getObjectPtr(objId)->data)
  45.  
  46. /*--------------------------------------------------------*/
  47. /*        ウィンドウ上の各部品の位置・大きさを計算        */
  48. /*--------------------------------------------------------*/
  49.  
  50.     static void getframe_user(FRAME *back, FRAME *org)
  51.     {
  52.         org->lupx = 1;
  53.         org->lupy = 1 + TitleHeight;
  54.       /* 大きさ */
  55.         org->rdwx = (back->rdwx - back->lupx + 1) - (SbarWidth + 1);
  56.         org->rdwy = (back->rdwy - back->lupy + 1) - (SbarWidth + TitleHeight);
  57.     }
  58.  
  59.     static void GetFrame_TitleBar(FRAME *back, FRAME *titleFr)
  60.     {
  61.         titleFr->lupx = back->lupx + 1;
  62.         titleFr->lupy = back->lupy + 1;
  63.         titleFr->rdwx = back->rdwx - 1;
  64.         titleFr->rdwy = back->lupy + 1 + TitleHeight - 1;
  65.     }
  66.  
  67.     static void GetFrame_ScrlBarVert(FRAME *back, FRAME *scrlFr)
  68.     {
  69.         scrlFr->lupx = back->rdwx + 1 - SbarWidth;
  70.         scrlFr->lupy = back->lupy + 1 + TitleHeight - 1;
  71.         scrlFr->rdwx = back->rdwx;
  72.         scrlFr->rdwy = back->rdwy + 1 - SbarWidth;
  73.     }
  74.  
  75.     static void GetFrame_ScrlBarHori(FRAME *back, FRAME *scrlFr)
  76.     {
  77.         scrlFr->lupx = back->lupx;
  78.         scrlFr->lupy = back->rdwy + 1 - SbarWidth;
  79.         scrlFr->rdwx = back->rdwx + 1 - SbarWidth;
  80.         scrlFr->rdwy = back->rdwy;
  81.     }
  82.  
  83.     static void GetFrame_TitleMsg(FRAME *back, FRAME *msgFr)
  84.     {
  85.         msgFr->lupx = back->lupx + TitleHeight + 6;
  86.         msgFr->lupy = back->lupy + 1;
  87.         msgFr->rdwx = back->rdwx - 1;
  88.         msgFr->rdwy = back->lupy + 1 + TitleHeight - 1;
  89.     }
  90.  
  91.     static void getframe_resize(FRAME *back, FRAME *resizeFr)
  92.     {
  93.         resizeFr->lupx = back->rdwx-16+1;
  94.         resizeFr->lupy = back->rdwy-16+1;
  95.         resizeFr->rdwx = back->rdwx;
  96.         resizeFr->rdwy = back->rdwy;
  97.     }
  98.  
  99.     static void GetFrame_EraseBox(FRAME *back, FRAME *ersboxFr)
  100.     {
  101.         ersboxFr->lupx = back->lupx + 1 + 2;
  102.         ersboxFr->lupy = back->lupy + 1 + 2;
  103.         ersboxFr->rdwx = ersboxFr->lupx + EraseboxSize - 1;
  104.         ersboxFr->rdwy = ersboxFr->lupy + EraseboxSize - 1;
  105.     }
  106.  
  107. /*--------------------------------------------------------*/
  108. /*        イレーズボタン、スクロールバーの実行関数        */
  109. /*--------------------------------------------------------*/
  110.  
  111.     static int eraseboxFunc(int idObj)
  112.     {
  113.         int idWin;
  114.         idWin = OBJPTR(idObj)->base;
  115.         if (idWin >= 0)
  116.         {
  117.             MMI_SendMessage(idWin, MM_ERASE, 0) ;
  118.             MMI_SendMessage(idWin, MM_DETACH, 0) ;
  119.         }
  120.         else
  121.             printf("Warn(<imagewin>eraseboxFunc): 親が見つかりません\n");
  122.         return NOERR;
  123.     }
  124.  
  125.     static int sbarFunc(int idObj,int idMsg,int nArg,EVENT *pev,int trig)
  126.     {
  127.         int nWin;
  128.         int (*ufunc)();
  129.         nWin = OBJPTR(idObj)->base;
  130.         if (nWin >= 0)
  131.         {
  132.             SCRLWIN *pWinData = &OBJDATA(SCRLWIN, nWin);
  133.             int nMsg;
  134.             ufunc = pWinData->ufunc;
  135.             if (idObj == pWinData->idScrlBarHori)
  136.                 nMsg = MM_HSCROLL;
  137.             else
  138.                 nMsg = MM_VSCROLL;
  139.             if (ufunc != 0)
  140.                 (*ufunc)(nWin, nMsg, nArg, pev, trig);
  141.         }
  142.         else
  143.             printf("Warn(<imagewin>sbarFunc): 親が見つかりません\n");
  144.         return NOERR;
  145.     }
  146.  
  147. /*--------------------------------------------------------*/
  148. /*         (local) ウィンドウの呼び出し関数の起動         */
  149. /*--------------------------------------------------------*/
  150.  
  151.   /* ウィンドウの呼び出し関数の起動 */
  152.  
  153.     static int ExecCallback(int idObj, int idMsg, int nArg,
  154.                             EVENT *pEv, int trigger)
  155.     {
  156.         SCRLWIN *pWin ;
  157.         int    ret = ILLIGAL_FUNCTION ;
  158.         pWin = &OBJDATA(SCRLWIN, idObj);
  159.         if (pWin->ufunc != 0)
  160.         {
  161.             /*    トリガ情報を作成する    */
  162.             if (nArg < 0)
  163.             {
  164.                 trigger = 0 ;
  165.                 if (pEv != NULL)
  166.                 {
  167.                     if (pEv->what == EVMESSAGE)  trigger |= MS_EVMSGL40 ;
  168.                     if (pEv->what == EVTIMER)    trigger |= MS_EVTIMERL40 ;
  169.                     if (pEv->what == EVKEY)      trigger |= MS_EVKEYONL40 ;
  170.                     if (pEv->what == EVMOSMOVE)  trigger |= MS_EVMOVEL40 ;
  171.                     if (pEv->what == EVMOSDRAG)  trigger |= MS_EVDRAGL40 ;
  172.                 }
  173.                 nArg = 2 ;
  174.             }
  175.             ret = (*(pWin->ufunc))(idObj, idMsg, nArg, pEv, trigger ) ;
  176.         }
  177.         return ret ;
  178.     }
  179.  
  180.   /* ユーザー領域内での、ウィンドウの呼び出し関数の起動 */
  181.  
  182.     static int WinUser_ExecCallback(int idWin, int idMsg, int nArg,
  183.                                     EVENT *pEv, int flgTrigger)
  184.     {
  185.         int    ret = ILLIGAL_FUNCTION ;
  186.         SCRLWIN    *pWin ;
  187.         pWin = (SCRLWIN *)(TL_getObjectPtr(idWin)->data) ;
  188.         if (pWin->org.rdwx && pWin->org.rdwy)
  189.         {
  190.             FRAME frUser ;
  191.             WINCLIP    *pWinClip ;
  192.             WINCTRL    *pWinCtrl ;
  193.           /* ユーザ領域の可視範囲と現在のクリップ領域の AND を求める */
  194.             frUser.lupx = pWin->fr.lupx + pWin->org.lupx ;
  195.             frUser.lupy = pWin->fr.lupy + pWin->org.lupy ;
  196.             frUser.rdwx = frUser.lupx + pWin->org.rdwx - 1 ;
  197.             frUser.rdwy = frUser.lupy + pWin->org.rdwy - 1 ;
  198.             pWinClip = WIN_getClipMemory(&frUser, NULL) ;
  199.             pWinClip = WIN_clipWindow( idWin, pWinClip, FALSE ) ;
  200.             MMI_GetControl(&pWinCtrl) ; /* 現在のクリップとの and をとる */
  201.             pWinClip = WIN_andClip(pWinClip, pWinCtrl->clip);
  202.           /* 求めたクリップ領域が空でないなら、
  203.              ユーザー領域内でウィンドウの呼び出し関数を起動 */
  204.             if (pWinClip != NULL)
  205.             {
  206.                 WINCLIP    *pWinClipStack, *pVisibleStack ;
  207.                 POINT    ptUserOrig, ptOriginStack ;
  208.               /* 表示枠を設定する */
  209.                 WIN_pushVisible(WIN_copyClip(pWinClip), &pVisibleStack) ;
  210.                 WIN_pushClip(pWinClip, &pWinClipStack) ;
  211.               /* ユーザ描画領域の左上に描画原点を設定 */
  212.                 MMI_GetOrigin(&ptUserOrig) ;
  213.                 AddPt((Point *)&ptUserOrig, (Point *)&(pWin->fr)) ;
  214.                 AddPt((Point *)&ptUserOrig, (Point *)&(pWin->org)) ;
  215.                 MG_PushOrigin(&ptUserOrig, &ptOriginStack) ;
  216.               /* 呼び出し関数を起動 */
  217.                 ret = ExecCallback(idWin, idMsg, nArg, pEv, flgTrigger) ;
  218.               /* 描画原点、クリップ領域、ビジブル領域を復帰 */
  219.                 MG_PopOrigin(&ptOriginStack) ;
  220.                 WIN_popClip(pWinClipStack) ;
  221.                 WIN_popVisible(pVisibleStack) ;
  222.             }
  223.         }
  224.         return ret ;
  225.     }
  226.  
  227.   /* イベントの起こった座標がユーザ領域内なら、呼び出し関数を起動 */
  228.  
  229.     static int WinUser_CheckExecCallback(int idWin, int idMsg, EVENT *pEv)
  230.     {
  231.         SCRLWIN *pWin ;
  232.         FRAME    frUser ;
  233.         pWin = (SCRLWIN *)(TL_getObjectPtr(idWin)->data) ;
  234.         if (pWin->org.rdwx && pWin->org.rdwy)
  235.         {
  236.             frUser.lupx = pWin->fr.lupx + pWin->org.lupx ;
  237.             frUser.lupy = pWin->fr.lupy + pWin->org.lupy ;
  238.             frUser.rdwx = frUser.lupx + pWin->org.rdwx - 1 ;
  239.             frUser.rdwy = frUser.lupy + pWin->org.rdwy - 1 ;
  240.             if (PtInRect((Rect *)&frUser, (Point *)&(pEv->info)))
  241.                 return WinUser_ExecCallback(idWin, idMsg, UNUSED, pEv, 0) ;
  242.         }
  243.         return OUTSIDE ;
  244.     }
  245.  
  246. /*---------------------------------------------------------*/
  247. /*   (local) 兄弟ウィンドウのアクティブ化/非アクティブ化  */
  248. /*---------------------------------------------------------*/
  249.  
  250.   /* ウィンドウのアクティブ/非アクティブの設定 */
  251.  
  252.     static void SetWinActiveness(int idWin, int bActive)
  253.     {
  254.         OBJECT    *pObj ;
  255.         SCRLWIN    *pWin ;
  256.         WINCLIP    *pWinClip;
  257.         pWin = (SCRLWIN *)((pObj = TL_getObjectPtr(idWin))->data) ;
  258.         if (bActive)
  259.         {
  260.             pObj->flag |= MS_ACTOBJ ;
  261.             OBJDATA(DBUTTONL40, pWin->idTitleBar).clr.back = 0;
  262.         }
  263.         else
  264.         {
  265.             pObj->flag &= (~MS_ACTOBJ) ;
  266.             OBJDATA(DBUTTONL40, pWin->idTitleBar).clr.back = 7;
  267.         }
  268.         if (pObj->flag & MS_DSP)
  269.         {
  270.             MG_mosDisp(2) ;
  271.             WIN_beginUpDateObj(pWin->idTitleBar, &pWinClip);
  272.             MMI_SendMessage(pWin->idTitleBar, MM_SHOW, 0);
  273.             MMI_SendMessage(pWin->idTitleMsg, MM_SHOW, 0);
  274.             MMI_SendMessage(pWin->idEraseBox, MM_SHOW, 0);
  275.             WIN_endUpDateObj(pWinClip);
  276.             MG_mosDisp(3) ;
  277.         }
  278.     }
  279.  
  280.   /* 指定されたウィンドウ以外を非アクティブにする */
  281.  
  282.     static void SetBrotherWins_NoActive(int idWin)
  283.     {
  284.         int        idObj1, idObj2 ;
  285.         for (idObj1 = idWin ;
  286.              (idObj2 = TL_getObjectPtr(idObj1)->llevel) != idWin ;
  287.              idObj1 = idObj2 )
  288.         {
  289.             if (MTL_isMetaClass(idObj2, MJ_SCRLWIN))
  290.                 if (MTL_checkFlagObj(idObj2, (MS_ACTOBJ|MS_DSP)) ==
  291.                                                 (MS_ACTOBJ|MS_DSP))
  292.                 {
  293.                     SetWinActiveness(idObj2, FALSE) ;
  294.                     ExecCallback(idObj2, MM_SLEEP, UNUSED, NULL, 0) ;
  295.                 }
  296.         }
  297.     }
  298.  
  299.   /* 指定されたウィンドウを非アクティブにする */
  300.  
  301.     static int SetWin_NoActive(int idObj)
  302.       /* ウィンドウの呼び出し関数を呼ぶ前に呼び出すこと */
  303.       /* 返り値・次にアクティブにするべきウィンドウの ID */
  304.     {
  305.         int    idObj1, idObj2 ;
  306.         OBJECT    *pObj ;
  307.         pObj = TL_getObjectPtr(idObj) ;
  308.         if (pObj->flag & MS_ACTOBJ)
  309.         {
  310.             if (TL_checkMmiModeFlag(MS_WINMOVE) == 0)
  311.             {
  312.                 pObj->flag &= (~MS_ACTOBJ) ;
  313.                 for (idObj1 = idObj;
  314.                      (idObj2 = TL_getObjectPtr(idObj1)->rlevel) != idObj;
  315.                      idObj1 = idObj2)
  316.                 {
  317.                     if (MTL_isMetaClass(idObj2, MJ_SCRLWIN))
  318.                         if (MTL_checkFlagObj(idObj2, MS_DSP))
  319.                             return idObj2;
  320.                 }
  321.             }
  322.         }
  323.         return -1;
  324.     }
  325.  
  326. /*--------------------------------------------------------*/
  327. /*                    ウィンドウの生成                    */
  328. /*--------------------------------------------------------*/
  329.  
  330.     int    SCRLWIN_NEW_func(int mobj, int idMsg, int nArg)
  331.     {
  332.             static DBUTTONL40 data_TitleBar =
  333.                 { MS_DSPONLYL40,{0,0,0,0},{0,7,0}, MS_FRAMEL40 | MS_UFRAMEL40,
  334.                   0,  0 };
  335.             static MSGL40 data_TitleMsg =
  336.                 { MS_LEFTL40| MS_DSPONLYL40, {0,0,0,0}, {0,0,15},
  337.                   MS_NONEL40, "", 1, 12,12, MS_NONEL40, 0, 0 } ;
  338.             static DBUTTONL40 data_EraseBox =
  339.                 { MS_BTLEFTL40 | MS_EVMOSOFFL40 | MS_EVKEYONL40,
  340.                   {0,0,0,0},{0,7,0}, MS_PANELL40,
  341.                   eraseboxFunc,  0 };
  342.             static SCRLL40 data_ScrlBarVert =
  343.                 { MS_BTLEFTL40| MS_REPEATL40| MS_EVMOSONL40,
  344.                   {0,0,0,0}, {0,7,7}, MS_FRAMEL40|MS_PANELL40,
  345.                   sbarFunc,  0,0,100,10,1, IUPARROW, IDOWNARROW };
  346.             static SCRLL40 data_ScrlBarHori =
  347.                 { MS_BTLEFTL40| MS_REPEATL40| MS_EVMOSONL40| MS_HORIL40,
  348.                   {0,0,0,0}, {0,7,7}, MS_FRAMEL40|MS_PANELL40,
  349.                   sbarFunc,  0,0,100,10,1, ILEFTARROW, IRIGHTARROW };
  350.         int            id, idScrlWin;
  351.         SCRLWIN        *pScrlWin;
  352.         DBUTTONL40    *pDBUTTONL40;
  353.         SCRLL40        *pSCRLL40;
  354.         MSGL40        *pMSGL40;
  355.         extern int ML_NewHyper(int, int, int);
  356.         if ((idScrlWin = ML_NewHyper(mobj, idMsg, nArg)) < 0)
  357.             return idScrlWin;
  358.         pScrlWin = &OBJDATA(SCRLWIN, idScrlWin);
  359.         #define WIN (*pScrlWin)
  360.       /* ユーザー領域の設定 */
  361.         getframe_user(&WIN.fr, &WIN.org);
  362.       /* 部品生成・アタッチのためのマクロ定義 */
  363.         #define CREATE_AND_ATTACH(NAME, TYPE)                \
  364.           {    if ((id = CREATE(MJ_##TYPE)) < 0)                \
  365.                 return id;                                    \
  366.             p##TYPE = & OBJDATA(TYPE, id);                    \
  367.             *p##TYPE = data_##NAME;                            \
  368.             GetFrame_##NAME(&WIN.fr, &p##TYPE->fr);            \
  369.             MMI_SendMessage(id, MM_ATTACH, 1, idScrlWin);    \
  370.             WIN.id##NAME = id; }
  371.       /* 各部品の生成・アタッチ */
  372.         CREATE_AND_ATTACH(TitleBar, DBUTTONL40)
  373.         CREATE_AND_ATTACH(TitleMsg, MSGL40)
  374.         CREATE_AND_ATTACH(EraseBox, DBUTTONL40)
  375.         CREATE_AND_ATTACH(ScrlBarVert, SCRLL40)
  376.         CREATE_AND_ATTACH(ScrlBarHori, SCRLL40)
  377.       /* おわり */
  378.         #undef WIN
  379.         return idScrlWin;
  380.     }
  381.  
  382. /*--------------------------------------------------------*/
  383. /*                   ウィンドウのERASE                    */
  384. /*--------------------------------------------------------*/
  385.  
  386.         /* 処理内容は WINDOWL40 型と同じだが、
  387.            呼び出し関数内で自身を DESTROY してもよいようにした */
  388.  
  389.     static int SCRLWIN_ERASE_func(int idObj, int idMsg, int nArg)
  390.     {
  391.         int    ret ;
  392.         int    wakeId ;
  393.         ret = MMI_SuperSendMessage(MJ_DIALOGL40, idObj, idMsg, nArg) ;
  394.         if (TL_checkMmiModeFlag(MS_WINMOVE) == 0)
  395.           /* ウィンドウの移動/リサイズによって消去したのでなければ */
  396.         {
  397.             wakeId = SetWin_NoActive(idObj);
  398.             ExecCallback(idObj, MM_ERASE, UNUSED, NULL, 0) ;
  399.             if (wakeId >= 0)
  400.             {
  401.                 SetWinActiveness(wakeId, TRUE);
  402.                 ExecCallback(wakeId, MM_WAKE, UNUSED, NULL, 0) ;
  403.             }
  404.         }
  405.         return ret ;
  406.     }
  407.  
  408. /*--------------------------------------------------------*/
  409. /*               ウィンドウの WAKE / SLEEP                */
  410. /*--------------------------------------------------------*/
  411.       
  412.         static void SetWinWakeness(int idWin, int flag)
  413.         {
  414.             OBJECT    *pWinObj ;
  415.             SCRLWIN    *pWin ;
  416.             int        wakeId ;
  417.             int        base ;
  418.             WINCLIP    *pwclps ;
  419.             WINCLIP    *pwclpd ;
  420.             pWin = (SCRLWIN *)((pWinObj = TL_getObjectPtr(idWin))->data) ;
  421.             wakeId = UNUSED ;
  422.             if (flag)
  423.             {
  424.                 if ((pWinObj->flag & MS_ACTOBJ) == 0)
  425.                 {
  426.                     wakeId = idWin;
  427.                     SetBrotherWins_NoActive(wakeId) ;
  428.                     SetWinActiveness(wakeId, TRUE) ;
  429.                 }
  430.             }
  431.             else
  432.             {
  433.                 if (pWinObj->flag & MS_ACTOBJ)
  434.                 {
  435.                     wakeId = SetWin_NoActive(idWin) ;
  436.                     SetWinActiveness(idWin, FALSE) ;
  437.                     ExecCallback(idWin, MM_SLEEP, UNUSED, NULL, 0) ;
  438.                 }
  439.             }
  440.           /* ライズ前の表示範囲を求める */
  441.             pwclps = WIN_getClipMemory(&(pWin->fr), NULL) ;
  442.             pwclpd = WIN_copyClip(pwclps) ;
  443.             pwclps = WIN_clipWindow(idWin, pwclps, FALSE) ;
  444.           /* ウィンドウをライズ(最前面に移動)する */
  445.             base = pWinObj->base ;
  446.             MMI_SendMessage(idWin, MM_DETACH, 0) ;
  447.             MMI_SendMessage(idWin, MM_ATTACH, 2, base, (flag) ? -1 : 0) ;
  448.           /* ライズ後の表示範囲から、再表示の必要のある領域を得る */
  449.             pwclpd = WIN_clipWindow(idWin, pwclpd, FALSE) ;
  450.           /* 再描画 */
  451.             MMI_SendMessage(idWin, MM_UPDATE, 1, (flag) ?
  452.                                 (pwclpd = WIN_removeClip(pwclpd, pwclps)) :
  453.                                     (pwclps = WIN_removeClip(pwclps, pwclpd)));
  454.           /* クリップ領域を開放 */
  455.             WIN_freeClipMemory(pwclpd) ;
  456.             WIN_freeClipMemory(pwclps) ;
  457.           /* 呼び出し関数を起動 */
  458.             if (wakeId > 0)
  459.                 ExecCallback(wakeId, MM_WAKE, UNUSED, NULL, 0) ;
  460.         }
  461.  
  462.     static int SCRLWIN_WAKE_func(int idObj)
  463.     {
  464.         SetWinWakeness(idObj, TRUE);
  465.         return NOERR;
  466.     }
  467.     
  468.     static int SCRLWIN_SLEEP_func(int idObj)
  469.     {
  470.         SetWinWakeness(idObj, FALSE);
  471.         return NOERR;
  472.     }
  473.  
  474. /*--------------------------------------------------------*/
  475. /*           マウスがクリックされた場合 (MOSON)           */
  476. /*--------------------------------------------------------*/
  477.  
  478.     /* リサイズ処理 */
  479.  
  480.         static int resize(int idScrlWin,  EVENT *pev)
  481.             /* リサイズ処理が行われたなら 1 を返す */
  482.         {
  483.             SCRLWIN *pScrlWin;
  484.             HYPER    hypWin;
  485.             WINCLIP    *pWinClip ;
  486.           /* 各種情報を取得 */
  487.             pScrlWin = &OBJDATA(SCRLWIN, idScrlWin);
  488.             hypWin = *((HYPER *)pScrlWin);
  489.             MG_SizeBoxL40( &hypWin, TRUE ) ; /* ウインドウの内枠を求める */
  490.           /* ウィンドウにリサイズボックスがないなら何もせず終了 */
  491.             if ((pScrlWin->atr & MS_RESIZEL40) == 0)
  492.                 return 0;
  493.           /* リサイズボックスの描画のためのハイパ構造体を作成 */
  494.             static HYPER hypResize =
  495.                 { MS_NONEL40,{0},{0}, MS_PANELL40| MS_FRAMEL40| MS_INVERTL40 };
  496.             hypResize.clr = pScrlWin->clr ;
  497.           /* リサイズボックスの表示範囲を求める */
  498.             int nFrWid;
  499.             nFrWid = (pScrlWin->atrm & MS_FRAMEL40) ? 1 : 0 ;
  500.             #define WIN_FR    hypWin.fr
  501.             hypResize.fr.lupx = WIN_FR.rdwx - RESIZEWX + 1 + nFrWid ;
  502.             hypResize.fr.lupy = WIN_FR.rdwy - RESIZEWY + 1 + nFrWid ;
  503.             hypResize.fr.rdwx = WIN_FR.rdwx + nFrWid ;
  504.             hypResize.fr.rdwy = WIN_FR.rdwy + nFrWid ;
  505.             #undef WIN_FR
  506.           /* リサイズボックスの中でないならなにもせず終了 */
  507.             if (PtInRect((Rect *)&(hypResize.fr), (Point *)&(pev->info)) == 0)
  508.                 return 0;
  509.           /* リサイズボックスの押下状態を描画 */
  510.             #define DRAW_RESIZEBTN(bPush)                            \
  511.               {    MG_mosDisp(2) ;                                        \
  512.                 WIN_beginUpDateObj(idScrlWin, &pWinClip) ;            \
  513.                 MG_DspBoxL40((HYPER *)&hypResize, TRUE, bPush) ;    \
  514.                 WIN_endUpDateObj(pWinClip) ;                        \
  515.                 MG_mosDisp(3) ; }
  516.             DRAW_RESIZEBTN(TRUE);
  517.           /* ウィンドウ枠をXOR で表示しながらリサイズ入力 */
  518.             FRAME frOrig;
  519.             FRAME frResult;
  520.             frResult = frOrig = pScrlWin->fr ;
  521.             MG_ReSizeFrame(&frResult, pev, FRIGHTDOWN, &(pScrlWin->size)) ;
  522.           /* リサイズボックスの非押下状態を描画 */
  523.             DRAW_RESIZEBTN(FALSE);
  524.           /* サイズが変わっていなかったら、なにもせず正常終了 */
  525.             if (MC_checkMoveFrame40(idScrlWin, &frResult) == 0)
  526.                 return 1;
  527.           /* 再描画の準備 */
  528.             char *pSave ;
  529.             TL_setWinMoveFlag() ;  /* SHOW時の V.E.を無効にする */
  530.             if ((pSave = pScrlWin->save) != NULL)
  531.                 MMI_SendMessage(idScrlWin, MM_ERASE, 0) ;
  532.           /* ウィンドウの大きさを再設定 */
  533.             MMI_SendMessage(idScrlWin, MM_SETFRAME, 1, &frResult);
  534.           /* 再描画のためのクリップ領域を設定 */
  535.             FRAME    saveFr ;
  536.             saveFr = pScrlWin->fr ;
  537.             UnionRect((Rect *)&frOrig, (Rect *)&frResult) ;
  538.             pScrlWin->fr = frOrig ;
  539.             WIN_beginUpDateObj(idScrlWin, &pWinClip) ;
  540.             pScrlWin->fr = saveFr ;
  541.           /* 再描画 */
  542.             ExecCallback(idScrlWin, MM_UPDATE, UNUSED, pev, 0) ;
  543.             if (pSave == NULL)
  544.             {
  545.               WINCTRL *pctrl ;
  546.               MMI_GetControl(&pctrl) ;
  547.               MMI_SendMessage(idScrlWin,MM_UPDATE,1,pctrl->clip) ;
  548.             }
  549.           /* 再描画の終了 */
  550.             WIN_endUpDateObj(pWinClip) ;
  551.             if (pSave)
  552.                 MMI_SendMessage(idScrlWin, MM_SHOW, 0) ;
  553.             TL_resetWinMoveFlag() ;
  554.             return 1;
  555.         }
  556.  
  557.     int    SCRLWIN_MOSON_func(int idScrlWin, int idMsg, int nArg, EVENT *pev)
  558.     {
  559.         int ret ;
  560.         register OBJECT    *pObj ;
  561.         register SCRLWIN *pScrlWin ;
  562.         pScrlWin = (SCRLWIN *)((pObj = TL_getObjectPtr(idScrlWin))->data) ;
  563.         if (((pScrlWin->atr &(MS_BTLEFTL40|MS_BTRIGHTL40)) & 
  564.                 ((pev->shift) << 22)) == 0)
  565.             return NOERR ;
  566.         if (pObj->flag & MS_ACTOBJ)
  567.           /* WAKE 状態のウィンドウの場合 */
  568.         {
  569.             if (resize(idScrlWin, pev))
  570.                 return NOERR;    /* リサイズ処理が正常終了した */
  571.             if (WinUser_CheckExecCallback(idScrlWin, idMsg, pev) < NOERR)
  572.             {
  573.               /* ユーザ領域外なので、ダイアログクラスとして移動チェック */
  574.                 TL_setWinMoveFlag() ;    /* SHOW時の V.E.無効化 */
  575.                 POINT orgDisp ;
  576.                 orgDisp = *(POINT *)&(pScrlWin->fr) ;
  577.                 ret = MMI_SuperSendMessage(MJ_DIALOGL40, 
  578.                                            idScrlWin, idMsg, nArg, pev) ;
  579.               /* 移動したなら、MOVE 処理 */
  580.                 if (*(int *)&(pScrlWin->fr) != *(int *)&(orgDisp))
  581.                     ExecCallback(idScrlWin, MM_MOVE, UNUSED, NULL, 0) ;
  582.                 TL_resetWinMoveFlag() ;
  583.                 return ret ;
  584.             }
  585.         }
  586.         else
  587.           /* SLEEP状態のウィンドウの場合 */
  588.         {
  589.             register int    mosTime ;
  590.             EVENT    *pnev ;
  591.             mosTime = MOS_getTime() ;
  592.           /* アクティブなウインドウを設定し画面の上に持ってくる. */
  593.             MMI_SendMessage(idScrlWin, MM_WAKE, 0) ;
  594.           /* ディレイ */
  595.             do
  596.             {
  597.                 MMI_iosense() ;
  598.                 if (MMI_SnsEvnt(EVALL, &pnev) == 0)
  599.                 {
  600.                     if ((pnev->what != EVMOSUP)||
  601.                             (((pnev->shift & (SRIGHTBTN|SLEFTBTN)) &
  602.                                 (pev->shift & (SRIGHTBTN|SLEFTBTN))) == 0))
  603.                         break ;
  604.                     return NOERR ;
  605.                 }
  606.             } while ((MOS_getTime() - mosTime) <= REPEAT_TIME2) ;
  607.           /* イベントの再実行はしない */
  608.             // MMI_ExecEvnt(pev) ;
  609.         }
  610.         return NOERR ;
  611.     }
  612.  
  613. /*--------------------------------------------------------*/
  614. /*              ウィンドウの属性の設定・取得              */
  615. /*--------------------------------------------------------*/
  616.  
  617.     int    SCRLWIN_SETHYPER_func(int idObj, int idMsg, int nArg, HYPER *hyp)
  618.     {
  619.         SCRLWIN *data;
  620.         data = &OBJDATA(SCRLWIN, idObj);
  621.         OBJHYP(idObj) = *hyp;
  622.         getframe_user(&hyp->fr, &data->org);
  623.         GetFrame_TitleBar(&hyp->fr, &OBJHYP(data->idTitleBar).fr);
  624.         GetFrame_TitleMsg(&hyp->fr, &OBJHYP(data->idTitleMsg).fr);
  625.         GetFrame_EraseBox(&hyp->fr, &OBJHYP(data->idEraseBox).fr);
  626.         GetFrame_ScrlBarVert(&hyp->fr, &OBJHYP(data->idScrlBarVert).fr);
  627.         GetFrame_ScrlBarHori(&hyp->fr, &OBJHYP(data->idScrlBarHori).fr);
  628.         return NOERR ;
  629.     }
  630.  
  631.     static int SCRLWIN_SETUSER_func(kobj, messId, argc, org, size)
  632.     int        kobj ;
  633.     int        messId ;
  634.     int        argc ;
  635.     FRAME    *org ;
  636.     FRAME    *size ;
  637.     {
  638.         register WINDOWL40    *pwin ;
  639.  
  640.         pwin = (WINDOWL40 *)(TL_getObjectPtr(kobj)->data) ;
  641.  
  642.         pwin->org = *org ;
  643.         pwin->size = *size ;
  644.  
  645.         return NOERR ;
  646.     }
  647.  
  648.     static int SCRLWIN_GETUSER_func(kobj, messId, argc, org, size)
  649.     int        kobj ;
  650.     int        messId ;
  651.     int        argc ;
  652.     FRAME    *org ;
  653.     FRAME    *size ;
  654.     {
  655.         register WINDOWL40    *pwin ;
  656.  
  657.         pwin = (WINDOWL40 *)(TL_getObjectPtr(kobj)->data) ;
  658.  
  659.         *org = pwin->org ;
  660.         *size = pwin->size ;
  661.  
  662.         return NOERR ;
  663.     }
  664.  
  665.     int    SCRLWIN_SETEXEC_func(int idObj, int idMsg,int nArg, int (*f)())
  666.     {
  667.         OBJDATA(SCRLWIN, idObj).ufunc = f;
  668.         return NOERR;
  669.     }
  670.  
  671.     int    SCRLWIN_SETATR_func(int idObj, int idMsg, int nArg, int atr)
  672.     {
  673.         ((HYPER*)(TL_getObjectPtr(idObj)->data))->atr = atr;
  674.         return NOERR;
  675.     }
  676.  
  677.     int    SCRLWIN_GETATR_func(int idObj, int idMsg, int nArg, int *atr)
  678.     {
  679.         *atr = ((HYPER*)(TL_getObjectPtr(idObj)->data))->atr;
  680.         return NOERR;
  681.     }
  682.  
  683.     int    SCRLWIN_SETFRAME_func(int idObj, int idMsg, int nArg, FRAME *fr)
  684.     {
  685.         HYPER hyp;
  686.         MMI_SendMessage(idObj, MM_GETHYPER, 1, &hyp);
  687.         hyp.fr = *fr;
  688.         MMI_SendMessage(idObj, MM_SETHYPER, 1, &hyp);
  689.         return NOERR;
  690.     }
  691.     
  692.     int    SCRLWIN_GETFRAME_func(int idObj, int idMsg, int nArg, FRAME *fr)
  693.     {
  694.         HYPER hyp;
  695.         MMI_SendMessage(idObj, MM_GETHYPER, 1, &hyp);
  696.         *fr = hyp.fr;
  697.         return NOERR;
  698.     }
  699.  
  700.     int SCRLWIN_dummy_func()
  701.     {
  702.         return NOERR;
  703.     }
  704.  
  705.     int SCRLWIN_SETMSG_func(int kobj, int messId, int argc, char *string)
  706.     {
  707.         int id;
  708.         id = OBJDATA(SCRLWIN, kobj).idTitleMsg;
  709.         MMI_SendMessage(id, messId, argc, string);
  710.         return NOERR ;
  711.     }
  712.  
  713. /*--------------------------------------------------------*/
  714. /*             スクロールバーの設定・状態取得             */
  715. /*--------------------------------------------------------*/
  716.  
  717.     int SCRLWIN_SETHSCROLL_func(int idObj, int idMsg, int nArg,
  718.             int bRedraw,int nPos,int nMin,int nMax,int nLen,int nPageSkip)
  719.         /*
  720.             nArg:
  721.                 1    (bRedraw のみ)    再描画だけを行う場合
  722.                 2    (nPos まで)        位置の設定だけ
  723.                 4    (nMax まで)        範囲の設定
  724.                 6                    全部設定
  725.         */
  726.     {
  727.         int    nPos2, nMin2, nMax2, nLen2, nPageSkip2;
  728.         int idSbar;
  729.         idSbar = OBJDATA(SCRLWIN, idObj).idScrlBarHori;
  730.         MMI_SendMessage(idSbar, MM_GETSCROLL, 5,
  731.                         &nPos2, &nMin2, &nMax2, &nLen2, &nPageSkip2);
  732.         if (nArg >= 2)    nPos2 = nPos;
  733.         if (nArg >= 3)    nMin2 = nMin;
  734.         if (nArg >= 4)    nMax2 = nMax;
  735.         if (nArg >= 5)    nLen2 = nLen;
  736.         if (nArg >= 6)    nPageSkip2 = nPageSkip;
  737.         MMI_SendMessage(idSbar, MM_SETSCROLL, 5,
  738.                         nPos2, nMin2, nMax2, nLen2, nPageSkip2);
  739.         if (bRedraw)
  740.             MMI_SendMessage(idSbar, MM_SHOW, 0);
  741.         return NOERR;
  742.     }
  743.  
  744.     int SCRLWIN_SETVSCROLL_func(int idObj, int idMsg, int nArg,
  745.             int bRedraw,int nPos,int nMin,int nMax,int nLen,int nPageSkip)
  746.     {
  747.         int    nPos2, nMin2, nMax2, nLen2, nPageSkip2;
  748.         int idSbar;
  749.         idSbar = OBJDATA(SCRLWIN, idObj).idScrlBarVert;
  750.         MMI_SendMessage(idSbar, MM_GETSCROLL, 5,
  751.                         &nPos2, &nMin2, &nMax2, &nLen2, &nPageSkip2);
  752.         if (nArg >= 2)    nPos2 = nPos;
  753.         if (nArg >= 3)    nMin2 = nMin;
  754.         if (nArg >= 4)    nMax2 = nMax;
  755.         if (nArg >= 5)    nLen2 = nLen;
  756.         if (nArg >= 6)    nPageSkip2 = nPageSkip;
  757.         MMI_SendMessage(idSbar, MM_SETSCROLL, 5,
  758.                         nPos2, nMin2, nMax2, nLen2, nPageSkip2);
  759.         if (bRedraw)
  760.             MMI_SendMessage(idSbar, MM_SHOW, 0);
  761.         return NOERR;
  762.     }
  763.  
  764.     int SCRLWIN_GETHSCROLL_func(int idObj, int idMsg, int nArg,
  765.             int *pnPos, int *pnMin, int *pnMax, int *pnLen, int *pnPageSkip)
  766.     {
  767.         int nPos2, nMin2, nMax2, nLen2, nPageSkip2;
  768.         int idSbar;
  769.         idSbar = OBJDATA(SCRLWIN, idObj).idScrlBarHori;
  770.         MMI_SendMessage(idSbar, MM_GETSCROLL, 5,
  771.                         &nPos2,&nMin2,&nMax2,&nLen2,&nPageSkip2);
  772.         if (nArg >= 1 && pnPos != NULL)
  773.             *pnPos = nPos2;
  774.         if (nArg >= 2 && pnMin != NULL)
  775.             *pnMin = nMin2;
  776.         if (nArg >= 3 && pnMax != NULL)
  777.             *pnMax = nMax2;
  778.         if (nArg >= 4 && pnLen != NULL)
  779.             *pnLen = nLen2;
  780.         if (nArg >= 5 && pnPageSkip != NULL)
  781.             *pnPageSkip = nPageSkip2;
  782.         return NOERR;
  783.     }
  784.  
  785.     int SCRLWIN_GETVSCROLL_func(int idObj, int idMsg, int nArg,
  786.             int *pnPos, int *pnMin, int *pnMax, int *pnLen, int *pnPageSkip)
  787.     {
  788.         int nPos2, nMin2, nMax2, nLen2, nPageSkip2;
  789.         int idSbar;
  790.         idSbar = OBJDATA(SCRLWIN, idObj).idScrlBarVert;
  791.         MMI_SendMessage(idSbar, MM_GETSCROLL, 5,
  792.                         &nPos2,&nMin2,&nMax2,&nLen2,&nPageSkip2);
  793.         if (nArg >= 1 && pnPos != NULL)
  794.             *pnPos = nPos2;
  795.         if (nArg >= 2 && pnMin != NULL)
  796.             *pnMin = nMin2;
  797.         if (nArg >= 3 && pnMax != NULL)
  798.             *pnMax = nMax2;
  799.         if (nArg >= 4 && pnLen != NULL)
  800.             *pnLen = nLen2;
  801.         if (nArg >= 5 && pnPageSkip != NULL)
  802.             *pnPageSkip = nPageSkip2;
  803.         return NOERR;
  804.     }
  805.  
  806.     int SCRLWIN_SETHSCROLLRANGE_func(int idObj, int idMsg, int nArg,
  807.         int dispLen, int containLen, int bRedraw)
  808.     {
  809.         int nPos, nMin, nMax, nLen, nPageSkip;
  810.         MMI_SendMessage(idObj, MM_GETHSCROLL, 5,
  811.                         &nPos, &nMin, &nMax, &nLen, &nPageSkip);
  812.         nPos -= nMin;
  813.         nMin = dispLen-1;
  814.         nMax = (dispLen > containLen ? dispLen-1 : containLen-1);
  815.         nLen = dispLen;
  816.         nPos = _min(nMin + nPos, nMax);
  817.         MMI_SendMessage(idObj, MM_SETHSCROLL, 6, bRedraw,
  818.                         nPos, nMin, nMax, nLen, nPageSkip);
  819.         return NOERR;
  820.     }
  821.  
  822.     int SCRLWIN_SETVSCROLLRANGE_func(int idObj, int idMsg, int nArg,
  823.         int dispLen, int containLen, int bRedraw)
  824.     {
  825.         int nPos, nMin, nMax, nLen, nPageSkip;
  826.         MMI_SendMessage(idObj, MM_GETVSCROLL, 5,
  827.                         &nPos, &nMin, &nMax, &nLen, &nPageSkip);
  828.         nPos -= nMin;
  829.         nMin = dispLen-1;
  830.         nMax = (dispLen > containLen ? dispLen-1 : containLen-1);
  831.         nLen = dispLen;
  832.         nPos = _min(nMin + nPos, nMax);
  833.         MMI_SendMessage(idObj, MM_SETVSCROLL, 6, bRedraw,
  834.                         nPos, nMin, nMax, nLen, nPageSkip);
  835.         return NOERR;
  836.     }
  837.  
  838. /*--------------------------------------------------------*/
  839. /*              ウィンドウ上かどうかを調べる              */
  840. /*--------------------------------------------------------*/
  841.  
  842.     static int SCRLWIN_ONWIN_func(int idWin, int idMsg, int nArg, EVENT *pEv)
  843.     {
  844.         OBJECT *pWinObj ;
  845.         HYPER  hyp ;
  846.         pWinObj = TL_getObjectPtr(idWin) ;
  847.       /* 選択不能な部品は検索できない     */
  848.         if ((pWinObj->flag & MS_UNSELECT)||
  849.                 (((SCRLWIN *)(pWinObj->data))->atr & MS_INACTIVEL40))
  850.             return OBJECT_NOT_FOUND ;
  851.       /* アクティブになっているものはスレーブ検索をする */
  852.         if (pWinObj->flag & MS_ACTOBJ)
  853.             return MMI_SuperSendMessage(MJ_HYPER, idWin, idMsg, nArg, pEv) ;
  854.       /* オブジェクト内ならばIDを返す */
  855.         hyp = *((HYPER *)(pWinObj->data)) ;
  856.         MG_SizeBoxL40(&hyp, ENABLE) ;
  857.         if (MMI_CheckInsideFrame(&(hyp.fr), (POINT *)(&(pEv->info))) < NOERR)
  858.             return OUTSIDE ;
  859.         return idWin ;
  860.     }
  861.  
  862. /*--------------------------------------------------------*/
  863. /*                  ウィンドウの UPDATE                   */
  864. /*--------------------------------------------------------*/
  865.  
  866.     int SCRLWIN_UPDATE_func(int idObj, int idMsg, int nArg,
  867.                              WINCLIP *pWinclip, int arg2)
  868.     {
  869.         if (nArg == 0)
  870.         {
  871.             WINCLIP *pWinclip2;
  872.             FRAME frWin, frUser;
  873.             frWin = OBJDATA(SCRLWIN, idObj).fr;
  874.             getframe_user(&frWin, &frUser);
  875.             frUser.lupx += frWin.lupx;
  876.             frUser.lupy += frWin.lupy;
  877.             frUser.rdwx = frUser.lupx + frUser.rdwx - 1;
  878.             frUser.rdwy = frUser.lupy + frUser.rdwy - 1;
  879.             pWinclip2 = WIN_getClipMemory(&frUser, NULL);
  880.             MMI_SuperSendMessage(MJ_WINDOWL40, idObj, idMsg, 1, pWinclip2);
  881.             WIN_freeClipMemory(pWinclip2);
  882.         }
  883.         else
  884.         {
  885.             MMI_SuperSendMessage(MJ_WINDOWL40, idObj, idMsg, nArg,
  886.                                  pWinclip, arg2);
  887.         }
  888.         return NOERR;
  889.     }
  890.  
  891. /*--------------------------------------------------------*/
  892. /*                   任意のデータの登録                   */
  893. /*--------------------------------------------------------*/
  894.  
  895.     int    SCRLWIN_SETDATA_func(int idObj, int idMsg, int nArg, void *data)
  896.     {
  897.         OBJDATA(SCRLWIN, idObj).data = data;
  898.         return NOERR;
  899.     }
  900.     
  901.     int    SCRLWIN_GETDATA_func(int idObj, int idMsg, int nArg, void **data)
  902.     {
  903.         *data = OBJDATA(SCRLWIN, idObj).data;
  904.         return NOERR;
  905.     }
  906.  
  907. /*--------------------------------------------------------*/
  908. /*                     クラスの初期化                     */
  909. /*--------------------------------------------------------*/
  910.  
  911.     #define    METHODNUM    26
  912.  
  913.     int    (*SCRLWINmethods[METHODNUM])() = {
  914.         SCRLWIN_NEW_func,
  915.         SCRLWIN_SETHYPER_func,
  916.         SCRLWIN_SETUSER_func,
  917.         SCRLWIN_GETUSER_func,
  918.         SCRLWIN_ERASE_func,
  919.         SCRLWIN_WAKE_func,
  920.         SCRLWIN_SLEEP_func,
  921.         SCRLWIN_MOSON_func,
  922.         SCRLWIN_SETEXEC_func,
  923.         SCRLWIN_SETATR_func,
  924.         SCRLWIN_GETATR_func,
  925.         SCRLWIN_SETFRAME_func,
  926.         SCRLWIN_GETFRAME_func,
  927.         SCRLWIN_SETMSG_func,
  928.         SCRLWIN_dummy_func,
  929.         SCRLWIN_dummy_func,
  930.         SCRLWIN_SETHSCROLL_func,
  931.         SCRLWIN_SETVSCROLL_func,
  932.         SCRLWIN_GETHSCROLL_func,
  933.         SCRLWIN_GETVSCROLL_func,
  934.         SCRLWIN_SETHSCROLLRANGE_func,
  935.         SCRLWIN_SETVSCROLLRANGE_func,
  936.         SCRLWIN_ONWIN_func,
  937.         SCRLWIN_SETDATA_func,
  938.         SCRLWIN_GETDATA_func,
  939.         SCRLWIN_UPDATE_func
  940.     };
  941.  
  942.     char    *SCRLWINmsgs[METHODNUM] = {
  943.         MT_NEW,
  944.         MT_SETHYPER,
  945.         MT_SETUSER,
  946.         MT_GETUSER,
  947.         MT_ERASE,
  948.         MT_WAKE,
  949.         MT_SLEEP,
  950.         MT_MOUSEON,
  951.         MT_SETEXEC,
  952.         MT_SETATR,
  953.         MT_GETATR,
  954.         MT_SETFRAME,
  955.         MT_GETFRAME,
  956.         MT_SETMSG,
  957.         MT_HSCROLL,
  958.         MT_VSCROLL,
  959.         MT_SETHSCROLL,
  960.         MT_SETVSCROLL,
  961.         MT_GETHSCROLL,
  962.         MT_GETVSCROLL,
  963.         MT_SETHSCROLLRANGE,
  964.         MT_SETVSCROLLRANGE,
  965.         MT_ONPARTS,
  966.         MT_SETDATA,
  967.         MT_GETDATA,
  968.         MT_UPDATE
  969.     };
  970.  
  971. int MMI_initScrollWindow()
  972. {
  973.     MJ_SCRLWIN = MMI_AddType(MJ_WINDOWL40, METHODNUM, sizeof(SCRLWIN), 
  974.                               SCRLWINmethods, SCRLWINmsgs);
  975.     if (MJ_SCRLWIN < NOERR)
  976.         return MJ_SCRLWIN;
  977.  
  978.     MM_SETUSER = TL_teachHash(MT_SETUSER) ;
  979.     MM_GETUSER = TL_teachHash(MT_GETUSER) ;
  980.     MM_SETEXEC = TL_teachHash(MT_SETEXEC) ;
  981.     MM_SETMSG  = TL_teachHash(MT_SETMSG) ;
  982.  
  983.     MM_SETATR = TL_teachHash(MT_SETATR);
  984.     MM_GETATR = TL_teachHash(MT_GETATR);
  985.     MM_SETFRAME = TL_teachHash(MT_SETFRAME);
  986.     MM_GETFRAME = TL_teachHash(MT_GETFRAME);
  987.     MM_VSCROLL = TL_teachHash(MT_VSCROLL);
  988.     MM_HSCROLL = TL_teachHash(MT_HSCROLL);
  989.     MM_SETHSCROLL = TL_teachHash(MT_SETHSCROLL);
  990.     MM_SETVSCROLL = TL_teachHash(MT_SETVSCROLL);
  991.     MM_GETHSCROLL = TL_teachHash(MT_GETHSCROLL);
  992.     MM_GETVSCROLL = TL_teachHash(MT_GETVSCROLL);
  993.     MM_SETHSCROLLRANGE = TL_teachHash(MT_SETHSCROLLRANGE);
  994.     MM_SETVSCROLLRANGE = TL_teachHash(MT_SETVSCROLLRANGE);
  995.     MM_SETDATA = TL_teachHash(MT_SETDATA);
  996.     MM_GETDATA = TL_teachHash(MT_GETDATA);
  997.  
  998.     SCRLWIN *skel;
  999.     skel = (SCRLWIN *) ( TL_getObjectPtr(MJ_SCRLWIN)->data );
  1000.     skel->atr = MS_BTLEFTL40 | MS_EVMOSONL40 | MS_RESIZEL40;
  1001.     skel->fr.lupx = 0;
  1002.     skel->fr.lupy = 0;
  1003.     skel->fr.rdwx = 127;
  1004.     skel->fr.rdwy = 95;
  1005.     skel->clr.fr = 0;
  1006.     skel->clr.back = 7;
  1007.     skel->clr.ch = 0;
  1008.     skel->atrm = MS_FRAMEL40 | MS_BFRAMEL40;
  1009.     skel->save = NULL;
  1010.     skel->ve = 0;
  1011.     skel->se = 0;
  1012.     static FRAME org = { 0,0,0,0 };
  1013.     skel->org = org;
  1014.     static FRAME size = { 0,0,9999,9999 };
  1015.     skel->size = size;
  1016.     skel->ufunc = 0;
  1017.     skel->tmsg = NULL;
  1018.     return NOERR;
  1019. }
  1020.  
  1021. /* [end] */
  1022.