home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / smart21b.zip / SMARTAUX / SMARTMDI / ACCEL.C next >
C/C++ Source or Header  |  1994-10-19  |  4KB  |  105 lines

  1. #define INCL_WIN
  2. #include <os2.h>
  3. #include "mdi.h"
  4.  
  5. #include <malloc.h>
  6. #include <memory.h>
  7.  
  8. const static USHORT mkausMDIDocument[] =
  9. {
  10.     21, 850,
  11.     AF_CONTROL | AF_HELP,                       VK_F1,       0,
  12.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F4,       SC_CLOSE,
  13.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_ENTER,    SC_RESTORE,
  14.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_NEWLINE,  SC_RESTORE,
  15.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F5,       SC_RESTORE,
  16.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F6,       SC_NEXTFRAME,
  17.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F7,       SC_MOVE,
  18.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F8,       SC_SIZE,
  19.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F9,       SC_MINIMIZE,
  20.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F10,      SC_MAXIMIZE,
  21.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F11,      SC_HIDE,
  22.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_SPACE,    SC_SYSMENU,
  23.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_SPACE,    SC_SYSMENU,
  24.     AF_SHIFT   | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_SCRLLOCK, SC_BEGINDRAG,
  25.     AF_SHIFT   | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F24,      SC_ENDDRAG,
  26.     AF_SHIFT   | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_PRINTSCRN,SC_SELECT,
  27.     AF_SHIFT   | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_ENTER,    SC_OPEN,
  28.     AF_SHIFT   | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F10,      SC_CONTEXTMENU,
  29.     AF_SHIFT   | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F1,       SC_CONTEXTHELP,
  30.     AF_SHIFT   | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_F9,       SC_TEXTEDIT,
  31.     AF_CONTROL | AF_VIRTUALKEY | AF_SYSCOMMAND, VK_SPACE,    SC_SYSMENU
  32. };
  33.  
  34. const ACCELTABLE * const mkpatMDIDocument = (const ACCELTABLE* const) mkausMDIDocument;
  35.  
  36. ACCELTABLE *GetAccelTable ( HAB hab, HWND hwnd )
  37. {
  38.     ULONG       ulCopy;
  39.     ACCELTABLE  *pat;
  40.     HACCEL      haccel;
  41.  
  42.     haccel = WinQueryAccelTable ( hab, hwnd );
  43.     ulCopy = WinCopyAccelTable ( haccel, NULL, 0 );
  44.     pat = (ACCELTABLE*) malloc ( ulCopy );
  45.     WinCopyAccelTable ( haccel, pat, ulCopy );
  46.     return pat;
  47. }
  48.  
  49. ACCELTABLE *MergeAccelTable ( const ACCELTABLE *patOne,
  50.                               const ACCELTABLE *patTwo )
  51. {
  52.     ACCELTABLE  *patMerge;
  53.     INT         iOne, iMaxOne;
  54.     INT         iTwo, iMaxTwo, iMerge;
  55.     ACCEL       *paOne, *paTwo, *paMerge;
  56.  
  57. //  if ( patOne->codepage != patTwo->codepage )
  58. //      return NULL;
  59.  
  60.     iMaxOne = patOne->cAccel;
  61.     iMaxTwo = patTwo->cAccel;
  62.  
  63.     patMerge = malloc(sizeof *patMerge+ sizeof *paMerge*(iMaxOne+iMaxTwo-1));
  64.  
  65.     paOne   = patOne->aaccel;
  66.     paTwo   = patTwo->aaccel;
  67.     paMerge = patMerge->aaccel;
  68.  
  69.     patMerge->codepage = patOne->codepage;
  70.     patMerge->cAccel = iMaxOne + iMaxTwo;
  71.     memcpy ( paMerge, paOne, sizeof *paOne * iMaxOne );
  72.  
  73.     iMerge = iMaxOne;
  74.     for ( iTwo=0 ; iTwo<iMaxTwo ; iTwo++ )
  75.     {
  76.         SHORT   fs  = paTwo[iTwo].fs;
  77.         SHORT   key = paTwo[iTwo].key;
  78.         for ( iOne=0 ; iOne<iMaxOne ; iOne++ )
  79.         {
  80.             if ( paOne[iOne].fs == fs && paOne[iOne].key == key )
  81.                 break;
  82.         }
  83.         if ( iOne == iMaxOne )
  84.         {
  85.             paMerge[iMerge] = paTwo[iTwo];
  86.             iMerge++;
  87.         }
  88.     }
  89.     if ( patMerge->cAccel > iMerge )
  90.     patMerge = realloc(patMerge,(sizeof *patMerge)+(sizeof *paMerge)*(iMerge-1));
  91.     return patMerge;
  92. }
  93.  
  94. VOID ReplaceAccelTable ( HAB hab, HWND hwnd, ACCELTABLE *pat )
  95. {
  96.     HACCEL  haccel;
  97.     haccel = WinQueryAccelTable ( hab, hwnd );
  98.     WinDestroyAccelTable ( haccel );
  99.     if ( pat )
  100.         haccel = WinCreateAccelTable ( hab, pat );
  101.     else
  102.         haccel = 0;
  103.     WinSetAccelTable ( hab, haccel, hwnd );
  104. }
  105.