Ignore:
Timestamp:
Dec 27, 1999, 3:41:43 PM (26 years ago)
Author:
sandervl
Message:

Lots of message fixes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/oslibmsg.cpp

    r2200 r2208  
    1 /* $Id: oslibmsg.cpp,v 1.15 1999-12-24 18:39:10 sandervl Exp $ */
     1/* $Id: oslibmsg.cpp,v 1.16 1999-12-27 14:41:41 sandervl Exp $ */
    22/*
    33 * Window message translation functions for OS/2
     
    1313 *       (i.e. menu WM_COMMAND messages)
    1414 *
    15  * TODO: Filter translation isn't correct for posted messages
     15 * TODO: Filter translation isn't correct! (for posted messages or messages that don't have
     16 *       a PM version.
    1617 *
    1718 */
     
    4344} MSGTRANSTAB, *PMSGTRANSTAB;
    4445
     46//NOTE: Must be ordered by win32 message id!!
    4547MSGTRANSTAB MsgTransTab[] = {
    4648   WM_NULL,          WINWM_NULL,
    4749   WM_CREATE,        WINWM_CREATE,
    4850   WM_DESTROY,       WINWM_DESTROY,
    49    WM_TIMER,         WINWM_TIMER,
     51   WM_MOVE,          WINWM_MOVE,            //TODO: Sent directly
     52   WM_SIZE,          WINWM_SIZE,            //TODO: Sent directly
     53   WM_ACTIVATE,      WINWM_ACTIVATE,
     54   WM_SETFOCUS,      WINWM_SETFOCUS,
     55   WM_SETFOCUS,      WINWM_KILLFOCUS,
     56   WM_ENABLE,        WINWM_ENABLE,
     57   WM_PAINT,         WINWM_PAINT,
    5058   WM_CLOSE,         WINWM_CLOSE,
    5159   WM_QUIT,          WINWM_QUIT,
    52 
    53    WM_ENABLE,        WINWM_ENABLE,
    5460   WM_SHOW,          WINWM_SHOWWINDOW,
    55    WM_MOVE,          WINWM_MOVE,
    56    WM_SIZE,          WINWM_SIZE,
    57    //
     61
    5862   WM_HITTEST,       WINWM_NCHITTEST,
    59    //
    60    WM_ACTIVATE,      WINWM_ACTIVATE,
    61    WM_SETFOCUS,      WINWM_SETFOCUS,
    62    //
     63
     64   //TODO: Needs better translation!
     65   WM_CHAR,          WINWM_KEYDOWN,
     66   WM_CHAR,          WINWM_KEYUP,
     67   WM_CHAR,          WINWM_CHAR,
     68   WM_CHAR,          WINWM_DEADCHAR,
     69   WM_CHAR,          WINWM_SYSKEYDOWN,
     70   WM_CHAR,          WINWM_SYSKEYUP,
     71   WM_CHAR,          WINWM_SYSCHAR,
     72   WM_CHAR,          WINWM_SYSDEADCHAR,
     73   WM_CHAR,          WINWM_KEYLAST,
     74
    6375   WM_COMMAND,       WINWM_COMMAND,
    6476   WM_SYSCOMMAND,    WINWM_SYSCOMMAND,
    6577   //
    66    WM_PAINT,         WINWM_PAINT,
    6778   WM_TIMER,         WINWM_TIMER,
    68    //
    69    WM_CLOSE,         WINWM_CLOSE,
    70    WM_QUIT,          WINWM_QUIT,
    71    //
    72    WM_CONTROL,       WINWM_COMMAND,
     79   WM_INITMENU,      WINWM_INITMENU,
    7380   //
    7481   WM_MOUSEMOVE,     WINWM_MOUSEMOVE,
     
    8289   WM_BUTTON3UP,     WINWM_MBUTTONUP,
    8390   WM_BUTTON3DBLCLK, WINWM_MBUTTONDBLCLK,
    84    0x020a, 0x020a,   // WM_???,             WM_???
    85    WM_CHAR,          WINWM_CHAR,
    86 
    87    //TODO: Needs better translation!
    88    WM_CHAR,          WINWM_KEYDOWN,
    89    WM_CHAR,          WINWM_KEYUP,
    90    WM_CHAR,          WINWM_SYSKEYDOWN,
    91    WM_CHAR,          WINWM_SYSKEYUP,
    92    WM_CHAR,          WINWM_KEYLAST
     91
     92   999999999,        999999999,
    9393};
    9494#define MAX_MSGTRANSTAB (sizeof(MsgTransTab)/sizeof(MsgTransTab[0]))
     
    119119}
    120120//******************************************************************************
    121 //TODO!!!
    122 //Signal that the incoming messages in pmwindow need to be translated
    123 //(i.e. PM WM_CHAR when translated generates WM_CHAR messages, otherwise
    124 // WM_KEYUP/DOWN (etc))
    125 //******************************************************************************
    126 ULONG TranslateWinMsg(ULONG msg)
     121//TODO: NOT COMPLETE nor 100% CORRECT!!!
     122//If both the minimum & maximum message are unknown, the result can be wrong (max > min)!
     123//******************************************************************************
     124ULONG TranslateWinMsg(ULONG msg, BOOL fMinFilter)
    127125{
    128126 POSTMSG_PACKET *packet;
    129127
    130   if(msg >= WINWM_USER)
    131     return WIN32APP_POSTMSG;
    132 
    133   for(int i=0;i<MAX_MSGTRANSTAB;i++)
    134   {
    135     if(MsgTransTab[i].msgWin32 == msg)
     128    if(msg == 0)
     129        return 0;
     130
     131    if(msg >= WINWM_USER)
     132        return WIN32APP_POSTMSG;
     133
     134    for(int i=0;i<MAX_MSGTRANSTAB;i++)
    136135    {
    137       return MsgTransTab[i].msgOS2;
     136        if(fMinFilter && MsgTransTab[i].msgWin32 >= msg) {
     137            return MsgTransTab[i].msgOS2;
     138        }
     139        else
     140        if(!fMinFilter && MsgTransTab[i].msgWin32 >= msg) {
     141            if(MsgTransTab[i].msgWin32 == msg)
     142                    return MsgTransTab[i].msgOS2;
     143            else    return MsgTransTab[i-1].msgOS2;
     144        }
    138145    }
    139   }
    140 
    141   return 0;
     146
     147    return 0;
    142148}
    143149//******************************************************************************
     
    197203
    198204  if(thdb->fTranslated && (!hwnd || hwnd == thdb->msgWCHAR.hwnd)) {
     205        if(uMsgFilterMin) {
     206            if(thdb->msgWCHAR.message < uMsgFilterMin)
     207                goto continuegetmsg;
     208        }
     209        if(uMsgFilterMax) {
     210            if(thdb->msgWCHAR.message > uMsgFilterMax)
     211                goto continuegetmsg;
     212        }
    199213        thdb->fTranslated = FALSE;
    200214        memcpy(pMsg, &thdb->msgWCHAR, sizeof(MSG));
     
    203217        return TRUE;
    204218  }
     219
     220continuegetmsg:
    205221  if(hwnd) {
    206222        do {
    207             WinWaitMsg(thdb->hab, TranslateWinMsg(uMsgFilterMin), TranslateWinMsg(uMsgFilterMax));
     223            WinWaitMsg(thdb->hab, TranslateWinMsg(uMsgFilterMin, TRUE), TranslateWinMsg(uMsgFilterMax, FALSE));
    208224            rc = OSLibWinPeekMsg(pMsg, hwnd, uMsgFilterMin, uMsgFilterMax, PM_REMOVE_W, isUnicode);
    209225        }
     
    214230    do {
    215231        eaten = FALSE;
    216         rc = WinGetMsg(thdb->hab, MsgThreadPtr, TranslateWinMsg(uMsgFilterMin), TranslateWinMsg(uMsgFilterMax), 0);
     232        rc = WinGetMsg(thdb->hab, MsgThreadPtr, TranslateWinMsg(uMsgFilterMin, TRUE), TranslateWinMsg(uMsgFilterMax, FALSE), 0);
    217233        if (MsgThreadPtr->msg == WM_TIMER)
    218234            eaten = TIMER_HandleTimer (MsgThreadPtr);
     
    238254
    239255  if(thdb->fTranslated && (!hwnd || hwnd == thdb->msgWCHAR.hwnd)) {
    240         if(fRemove == PM_REMOVE_W) {
     256        if(uMsgFilterMin) {
     257            if(thdb->msgWCHAR.message < uMsgFilterMin)
     258                goto continuepeekmsg;
     259        }
     260        if(uMsgFilterMax) {
     261            if(thdb->msgWCHAR.message > uMsgFilterMax)
     262                goto continuepeekmsg;
     263        }
     264
     265        if(fRemove & PM_REMOVE_W) {
    241266            thdb->fTranslated = FALSE;
    242267            MsgThreadPtr->msg  = 0;
     
    246271        return TRUE;
    247272  }
    248 
     273continuepeekmsg:
    249274  do {
    250275        eaten = FALSE;
    251         rc = WinPeekMsg(thdb->hab, &os2msg, Win32BaseWindow::OS2ToWin32Handle(hwnd), TranslateWinMsg(uMsgFilterMin),
    252                         TranslateWinMsg(uMsgFilterMax), (fRemove == PM_REMOVE_W) ? PM_REMOVE : PM_NOREMOVE);
    253 
    254         if (rc && fRemove == PM_REMOVE_W && os2msg.msg == WM_TIMER)
     276        rc = WinPeekMsg(thdb->hab, &os2msg, Win32BaseWindow::OS2ToWin32Handle(hwnd), TranslateWinMsg(uMsgFilterMin, TRUE),
     277                        TranslateWinMsg(uMsgFilterMax, FALSE), (fRemove & PM_REMOVE_W) ? PM_REMOVE : PM_NOREMOVE);
     278
     279        if (rc && (fRemove & PM_REMOVE_W) && os2msg.msg == WM_TIMER) {
    255280            eaten = TIMER_HandleTimer(&os2msg);
     281        }
    256282  }
    257283  while (eaten && rc);
     284
     285  if(rc == FALSE) {
     286    return FALSE;
     287  }
    258288
    259289  OS2ToWinMsgTranslate((PVOID)thdb, &os2msg, pMsg, isUnicode);
    260290  //TODO: This is not safe! There's no guarantee this message will be dispatched and it might overwrite a previous message
    261   if(fRemove == PM_REMOVE_W) {
     291  if(fRemove & PM_REMOVE_W) {
    262292        memcpy(MsgThreadPtr, &os2msg, sizeof(QMSG));
    263293  }
Note: See TracChangeset for help on using the changeset viewer.