Diff for /np2/win9x/menu.cpp between versions 1.27 and 1.28

version 1.27, 2007/10/26 14:38:34 version 1.28, 2007/10/26 22:48:28
Line 10 Line 10
   
 #define MFCHECK(a) ((a)?MF_CHECKED:MF_UNCHECKED)  #define MFCHECK(a) ((a)?MF_CHECKED:MF_UNCHECKED)
   
 typedef struct {  static BOOL searchchildmenu(HMENU hMenu, UINT uID,
         UINT16  id;                                                                                                  HMENU *phmenuRet, UINT *puPos)
         UINT16  str;  
 } MENUITEMS;  
   
   
 // これってAPIあるのか?  
 void menu_addmenubar(HMENU popup, HMENU menubar) {  
   
         UINT                    cnt;  
         UINT                    pos;  
         UINT                    i;  
         MENUITEMINFO    mii;  
         TCHAR                   str[128];  
         HMENU                   hSubMenu;  
   
         cnt = GetMenuItemCount(menubar);  
         pos = 0;  
         for (i=0; i<cnt; i++) {  
                 ZeroMemory(&mii, sizeof(mii));  
                 mii.cbSize = sizeof(mii);  
                 mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID | MIIM_SUBMENU |  
                                                                                                                                         MIIM_DATA;  
                 mii.dwTypeData = str;  
                 mii.cch = NELEMENTS(str);  
                 if (GetMenuItemInfo(menubar, i, TRUE, &mii)) {  
                         if (mii.hSubMenu) {  
                                 hSubMenu = CreatePopupMenu();  
                                 menu_addmenubar(hSubMenu, mii.hSubMenu);  
                                 mii.hSubMenu = hSubMenu;  
                         }  
                         InsertMenuItem(popup, pos, TRUE, &mii);  
                         pos++;  
                 }  
         }  
 }  
   
 static void insertresmenu(HMENU menu, UINT pos, UINT flag,  
                                                                                                         UINT32 item, UINT str) {  
   
         TCHAR   tmp[128];  
   
         if (LoadString(hInst, str, tmp, NELEMENTS(tmp))) {  
                 InsertMenu(menu, pos, flag, item, tmp);  
         }  
 }  
   
 static void insertresmenus(HMENU menu, UINT pos,  
                                                                         const MENUITEMS *item, UINT items) {  
   
 const MENUITEMS *iterm;  
   
         iterm = item + items;  
         while(item < iterm) {  
                 if (item->id) {  
                         insertresmenu(menu, pos, MF_BYPOSITION | MF_STRING,  
                                                                                                         item->id, item->str);  
                 }  
                 else {  
                         InsertMenu(menu, pos, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);  
                 }  
                 item++;  
                 pos++;  
         }  
 }  
   
 static BOOL searchchildmenu(HMENU hMenu, UINT uID, HMENU *phmenuRet, UINT *puPos)  
 {  {
         UINT                    nCount;          UINT                    nCount;
         UINT                    i;          UINT                    i;
Line 102  static BOOL searchchildmenu(HMENU hMenu, Line 37  static BOOL searchchildmenu(HMENU hMenu,
                                 }                                  }
                                 return TRUE;                                  return TRUE;
                         }                          }
                         else if ((mii.hSubMenu) && (searchchildmenu(mii.hSubMenu, uID, phmenuRet, puPos)))                          else if ((mii.hSubMenu) &&
                                           (searchchildmenu(mii.hSubMenu, uID, phmenuRet, puPos)))
                         {                          {
                                 return TRUE;                                  return TRUE;
                         }                          }
Line 111  static BOOL searchchildmenu(HMENU hMenu, Line 47  static BOOL searchchildmenu(HMENU hMenu,
         return FALSE;          return FALSE;
 }  }
   
 static BOOL searchsubmenu(HMENU hMenu, HMENU hmenuTarget, HMENU *phmenuRet, UINT *puPos)  static BOOL searchsubmenu(HMENU hMenu, HMENU hmenuTarget,
                                                                                                   HMENU *phmenuRet, UINT *puPos)
 {  {
         UINT                    nCount;          UINT                    nCount;
         UINT                    i;          UINT                    i;
Line 146  static BOOL searchsubmenu(HMENU hMenu, H Line 83  static BOOL searchsubmenu(HMENU hMenu, H
         return FALSE;          return FALSE;
 }  }
   
   // これってAPIあるのか?
   static UINT addmenu(HMENU hMenu, UINT uPos, HMENU hmenuAdd, BOOL bSeparator)
   {
           UINT                    uCount;
           UINT                    uAdded;
           UINT                    i;
           MENUITEMINFO    mii;
           TCHAR                   szString[128];
           HMENU                   hmenuSub;
   
           uCount = GetMenuItemCount(hmenuAdd);
           uAdded = 0;
           for (i=0; i<uCount; i++)
           {
                   ZeroMemory(&mii, sizeof(mii));
                   mii.cbSize = sizeof(mii);
                   mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID | MIIM_SUBMENU |
                                                                                                                                           MIIM_DATA;
                   mii.dwTypeData = szString;
                   mii.cch = NELEMENTS(szString);
                   if (GetMenuItemInfo(hmenuAdd, i, TRUE, &mii))
                   {
                           if (mii.hSubMenu)
                           {
                                   hmenuSub = CreatePopupMenu();
                                   (void)addmenu(hmenuSub, 0, mii.hSubMenu, FALSE);
                                   mii.hSubMenu = hmenuSub;
                           }
                           if (bSeparator)
                           {
                                   bSeparator = FALSE;
                                   InsertMenu(hMenu, uPos + uAdded, MF_SEPARATOR, 0, NULL);
                                   uAdded++;
                           }
                           InsertMenuItem(hMenu, uPos + uAdded, TRUE, &mii);
                           uAdded++;
                   }
           }
           return uAdded;
   }
   
   static UINT addmenures(HMENU hMenu, UINT uPos, UINT uID, BOOL bSeparator)
   {
           UINT    uCount;
           HMENU   hmenuAdd;
   
           uCount = 0;
           hmenuAdd = LoadMenu(hInst, MAKEINTRESOURCE(uID));
           if (hmenuAdd)
           {
                   uCount = addmenu(hMenu, uPos, hmenuAdd, bSeparator);
                   DestroyMenu(hmenuAdd);
           }
           return uCount;
   }
   
   static UINT addmenubyid(HMENU hMenu, UINT uByID, UINT uID)
   {
           UINT    uCount;
           HMENU   hmenuSub;
           UINT    uSubPos;
   
           uCount = 0;
           if (searchchildmenu(hMenu, uByID, &hmenuSub, &uSubPos))
           {
                   uCount = addmenures(hmenuSub, uSubPos + 1, uID, FALSE);
           }
           return uCount;
   }
   
   
   static void insertresmenu(HMENU hMenu, UINT uPosition, UINT uFlags,
                                                                                                   UINT_PTR uIDNewItem, UINT uID)
   {
           TCHAR   szString[128];
   
           if (LoadString(hInst, uID, szString, NELEMENTS(szString))) 
           {
                   InsertMenu(hMenu, uPosition, uFlags, uIDNewItem, szString);
           }
   }
   
   void menu_addmenubar(HMENU popup, HMENU menubar)
   {
           (void)addmenu(popup, 0, menubar, FALSE);
   }
   
   
 // ----  // ----
   
 static const MENUITEMS smenuitem[] = {  void sysmenu_initialize(void)
                         {IDM_TOOLWIN,           IDS_TOOLWIN},  {
           HMENU   hMenu;
           UINT    uPos;
   
           hMenu = GetSystemMenu(hWndMain, FALSE);
           uPos = 0;
   
 #if defined(SUPPORT_KEYDISP)  #if defined(SUPPORT_KEYDISP)
                         {IDM_KEYDISP,           IDS_KEYDISP},          uPos += addmenures(hMenu, uPos, IDR_SYSKEYDISP, FALSE);
 #endif  #endif
 #if defined(SUPPORT_SOFTKBD)  #if defined(SUPPORT_SOFTKBD)
                         {IDM_SOFTKBD,           IDS_SOFTKBD},          uPos += addmenures(hMenu, uPos, IDR_SYSSOFTKBD, FALSE);
 #endif  #endif
                         {0,                                     0},  
                         {IDM_SCREENCENTER,      IDS_SCREENCENTER},  
                         {IDM_SNAPENABLE,        IDS_SNAPENABLE},  
                         {IDM_BACKGROUND,        IDS_BACKGROUND},  
                         {IDM_BGSOUND,           IDS_BGSOUND},  
                         {0,                                     0},  
                         {IDM_SCRNMUL4,          IDS_SCRNMUL4},  
                         {IDM_SCRNMUL6,          IDS_SCRNMUL6},  
                         {IDM_SCRNMUL8,          IDS_SCRNMUL8},  
                         {IDM_SCRNMUL10,         IDS_SCRNMUL10},  
                         {IDM_SCRNMUL12,         IDS_SCRNMUL12},  
                         {IDM_SCRNMUL16,         IDS_SCRNMUL16},  
                         {0,                                     0}};  
   
 static const MENUITEMS smenuitem2[] = {          uPos += addmenures(hMenu, uPos, IDR_SYS, FALSE);
           if (np2oscfg.I286SAVE)
           {
 #if defined(CPUCORE_IA32) && defined(SUPPORT_MEMDBG32)  #if defined(CPUCORE_IA32) && defined(SUPPORT_MEMDBG32)
                         {IDM_MEMDBG32,          IDS_MEMDBG32},                  uPos += addmenures(hMenu, uPos, IDR_SYSDEBUG32, FALSE);
 #endif  #endif
                         {IDM_MEMORYDUMP,        IDS_MEMORYDUMP},                  uPos += addmenures(hMenu, uPos, IDR_SYSDEBUG, FALSE);
                         {IDM_DEBUGUTY,          IDS_DEBUGUTY},  
                         {0,                                     0}};  
   
   
 void sysmenu_initialize(void) {  
   
         HMENU   hMenu;  
   
         hMenu = GetSystemMenu(hWndMain, FALSE);  
         insertresmenus(hMenu, 0, smenuitem, NELEMENTS(smenuitem));  
         if (np2oscfg.I286SAVE) {  
                 insertresmenus(hMenu, 0, smenuitem2, NELEMENTS(smenuitem2));  
         }          }
 }  }
   
Line 257  void sysmenu_setscrnmul(UINT8 value) { Line 264  void sysmenu_setscrnmul(UINT8 value) {
   
 // ----  // ----
   
 typedef struct {  void xmenu_initialize(void)
         UINT16          title;  {
         UINT16          items;  
         MENUITEMS       item[1];  
 } SUBMITEMS;  
   
 typedef struct {  
         UINT16          title;  
         UINT16          items;  
         MENUITEMS       item[3];  
 } SUBMITEM3;  
   
 static const SUBMITEM3 fddmenu[4] = {  
                 {IDS_FDD1, 3,  
                         {{IDM_FDD1OPEN, IDS_OPEN}, {0, 0}, {IDM_FDD1EJECT, IDS_EJECT}}},  
                 {IDS_FDD2, 3,  
                         {{IDM_FDD2OPEN, IDS_OPEN}, {0, 0}, {IDM_FDD2EJECT, IDS_EJECT}}},  
                 {IDS_FDD3, 3,  
                         {{IDM_FDD3OPEN, IDS_OPEN}, {0, 0}, {IDM_FDD3EJECT, IDS_EJECT}}},  
                 {IDS_FDD4, 3,  
                         {{IDM_FDD4OPEN, IDS_OPEN}, {0, 0}, {IDM_FDD4EJECT, IDS_EJECT}}}};  
   
 #if defined(SUPPORT_IDEIO)  
 static const SUBMITEM3 side[3] = {  
                 {IDS_IDE0, 3,  
                         {{IDM_IDE0OPEN, IDS_OPEN}, {0, 0}, {IDM_IDE0EJECT, IDS_REMOVE}}},  
                 {IDS_IDE1, 3,  
                         {{IDM_IDE1OPEN, IDS_OPEN}, {0, 0}, {IDM_IDE1EJECT, IDS_REMOVE}}},  
                 {IDS_IDE2, 3,  
                         {{IDM_IDE2OPEN, IDS_OPEN}, {0, 0}, {IDM_IDE2EJECT, IDS_EJECT}}}};  
 #else  
 static const SUBMITEM3 ssasi[2] = {  
                 {IDS_SASI1, 3,  
                         {{IDM_IDE0OPEN, IDS_OPEN}, {0, 0}, {IDM_IDE0EJECT, IDS_REMOVE}}},  
                 {IDS_SASI2, 3,  
                         {{IDM_IDE1OPEN, IDS_OPEN}, {0, 0}, {IDM_IDE1EJECT, IDS_REMOVE}}}};  
 #endif  
   
 #if defined(SUPPORT_SCSI)  
 static const SUBMITEM3 sscsi[4] = {  
         {IDS_SCSI0, 3,  
                 {{IDM_SCSI0OPEN, IDS_OPEN}, {0, 0}, {IDM_SCSI0EJECT, IDS_REMOVE}}},  
         {IDS_SCSI1, 3,  
                 {{IDM_SCSI1OPEN, IDS_OPEN}, {0, 0}, {IDM_SCSI1EJECT, IDS_REMOVE}}},  
         {IDS_SCSI2, 3,  
                 {{IDM_SCSI2OPEN, IDS_OPEN}, {0, 0}, {IDM_SCSI2EJECT, IDS_REMOVE}}},  
         {IDS_SCSI3, 3,  
                 {{IDM_SCSI3OPEN, IDS_OPEN}, {0, 0}, {IDM_SCSI3EJECT, IDS_REMOVE}}}};  
 #endif  
   
   
 static void insdiskmenu(HMENU hMenu, UINT pos, const void *item) {  
   
         HMENU           hSubMenu;  
 const SUBMITEMS *smi;  
   
         hSubMenu = CreatePopupMenu();  
         smi = (SUBMITEMS *)item;  
         insertresmenus(hSubMenu, 0, smi->item, smi->items);  
         insertresmenu(hMenu, pos, MF_BYPOSITION | MF_POPUP,  
                                                                                         (UINT)hSubMenu, smi->title);  
 }  
   
   
 #if defined(SUPPORT_STATSAVE)  
 static const TCHAR xmenu_stat[] = _T("S&tat");  
 static const TCHAR xmenu_statsave[] = _T("Save %u");  
 static const TCHAR xmenu_statload[] = _T("Load %u");  
   
 static void addstatsavemenu(HMENU hMenu, UINT pos) {  
   
         HMENU   hSubMenu;  
         UINT    i;  
         TCHAR   buf[16];  
   
         hSubMenu = CreatePopupMenu();  
         for (i=0; i<SUPPORT_STATSAVE; i++) {  
                 wsprintf(buf, xmenu_statsave, i);  
                 AppendMenu(hSubMenu, MF_STRING, IDM_FLAGSAVE + i, buf);  
         }  
         AppendMenu(hSubMenu, MF_MENUBARBREAK, 0, NULL);  
         for (i=0; i<SUPPORT_STATSAVE; i++) {  
                 wsprintf(buf, xmenu_statload, i);  
                 AppendMenu(hSubMenu, MF_STRING, IDM_FLAGLOAD + i, buf);  
         }  
         InsertMenu(hMenu, pos, MF_BYPOSITION | MF_POPUP,  
                                                                                         (UINT32)hSubMenu, xmenu_stat);  
 }  
 #endif  
   
 void xmenu_initialize(void) {  
   
         HMENU   hMenu;          HMENU   hMenu;
         HMENU   hSubMenu;          UINT    uPos;
         UINT    subpos;          HMENU   hmenuSub;
         UINT    i;          UINT    i;
           UINT    uSubPos;
   
         hMenu = np2class_gethmenu(hWndMain);          hMenu = np2class_gethmenu(hWndMain);
         if (np2oscfg.I286SAVE) {  
                 hSubMenu = GetSubMenu(hMenu, 3);  
                 insertresmenu(hSubMenu, 10, MF_BYPOSITION | MF_STRING,  
                                                                                                 IDM_CPUSAVE, IDS_CPUSAVE);  
         }  
   
 #if defined(SUPPORT_PX)          uPos = 1;
         hSubMenu = GetSubMenu(hMenu, 2);  #if defined(SUPPORT_STATSAVE)
         hSubMenu = GetSubMenu(hSubMenu, 1);          if (np2oscfg.statsave)
         insertresmenu(hSubMenu, 14, MF_BYPOSITION | MF_STRING,          {
                                                                                                 IDM_PX1, IDS_PX1);                  uPos += addmenures(hMenu, uPos, IDR_STAT, FALSE);
         insertresmenu(hSubMenu, 15, MF_BYPOSITION | MF_STRING,          }
                                                                                                 IDM_PX2, IDS_PX2);  
 #endif  #endif
   
 #if defined(SUPPORT_WAVEREC)          for (i=0; i<4; i++)
         hSubMenu = GetSubMenu(hMenu, 3);          {
         insertresmenu(hSubMenu, 2, MF_BYPOSITION | MF_STRING,                  if (np2cfg.fddequip & (1 << i))
                                                                                                 IDM_WAVEREC, IDS_WAVEREC);                  {
 #endif                          uPos += addmenures(hMenu, uPos, IDR_FDD1MENU + i, FALSE);
                   }
           }
   
         hSubMenu = CreatePopupMenu();          hmenuSub = CreatePopupMenu();
         subpos = 0;          if (hmenuSub)
           {
                   uSubPos = 0;
 #if defined(SUPPORT_IDEIO)  #if defined(SUPPORT_IDEIO)
         for (i=0; i<NELEMENTS(side); i++) {                  uSubPos += addmenures(hmenuSub, uSubPos, IDR_IDEMENU, FALSE);
                 insdiskmenu(hSubMenu, subpos++, side + i);  
         }  
 #else  #else
         for (i=0; i<NELEMENTS(ssasi); i++) {                  uSubPos += addmenures(hmenuSub, uSubPos, IDR_SASIMENU, FALSE);
                 insdiskmenu(hSubMenu, subpos++, ssasi + i);  
         }  
 #endif  #endif
 #if defined(SUPPORT_SCSI)  #if defined(SUPPORT_SCSI)
         AppendMenu(hSubMenu, MF_SEPARATOR, 0, NULL);                  uSubPos += addmenures(hmenuSub, uSubPos, IDR_SCSIMENU, TRUE);
         subpos++;  #endif
         for (i=0; i<NELEMENTS(sscsi); i++) {                  insertresmenu(hMenu, uPos, MF_BYPOSITION | MF_POPUP,
                 insdiskmenu(hSubMenu, subpos++, sscsi + i);                                                                                                  (UINT_PTR)hmenuSub, IDS_HDD);
         }          }
   
   #if defined(SUPPORT_PX)
           (void)addmenubyid(hMenu, IDM_SPARKBOARD, IDR_PXMENU);
 #endif  #endif
         insertresmenu(hMenu, 1, MF_BYPOSITION | MF_POPUP,  
                                                                                                 (UINT32)hSubMenu, IDS_HDD);  
   
         for (i=4; i>0;) {  #if defined(SUPPORT_WAVEREC)
                 i--;          (void)addmenubyid(hMenu, IDM_S98LOGGING, IDR_WAVEREC);
                 if (np2cfg.fddequip & (1 << i)) {  #endif
                         insdiskmenu(hMenu, 1, fddmenu + i);  
                 }  
         }  
   
 #if defined(SUPPORT_STATSAVE)          if (np2oscfg.I286SAVE)
         if (np2oscfg.statsave) {          {
                 addstatsavemenu(hMenu, 1);                  (void)addmenubyid(hMenu, IDM_SSTP, IDR_CPUSAVE);
         }          }
 #endif  
 }  }
   
 void xmenu_disablewindow(void) {  void xmenu_disablewindow(void) {

Removed from v.1.27  
changed lines
  Added in v.1.28


RetroPC.NET-CVS <cvs@retropc.net>