Changeset 9813 for trunk/src


Ignore:
Timestamp:
Feb 16, 2003, 7:29:05 PM (23 years ago)
Author:
sandervl
Message:

Special handling of AltGr key. Must send Ctrl key messages like Windows

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/pmkbdhk/pmkbdhk.cpp

    r7864 r9813  
    1 /* $Id: pmkbdhk.cpp,v 1.3 2002-02-11 13:45:33 sandervl Exp $ */
     1/* $Id: pmkbdhk.cpp,v 1.4 2003-02-16 18:29:05 sandervl Exp $ */
    22/*
    33 * OS/2 native Presentation Manager hooks
     
    473473            case PMSCAN_PRINT:
    474474            case PMSCAN_ALTLEFT:
    475             case PMSCAN_ALTRIGHT:
    476475            case PMSCAN_SCROLLLOCK:
    477476            case PMSCAN_ENTER:
     
    487486           
    488487              break;
     488
     489        //
     490        // AltGr needs special handling
     491        //
     492        // AltGr -> WM_KEYDOWN (VK_CONTROL), WM_KEYDOWN (VK_MENU)
     493        //          WM_SYSKEYUP (VK_CONTROL)
     494        //          WM_KEYUP (VK_MENU)
     495        //
     496        // Ctrl+AltGr -> WM_KEYDOWN (VK_CONTROL), WM_KEYUP (VK_CONTROL)
     497        //               WM_KEYDOWN (VK_CONTROL)
     498        //               WM_KEYDOWN (VK_MENU)
     499        //               WM_KEYUP (VK_MENU)
     500        //               WM_KEYUP (VK_CONTROL)
     501        //
     502        // AltGr+Ctrl -> WM_KEYDOWN (VK_CONTROL), WM_KEYDOWN (VK_MENU)
     503        //               WM_KEYDOWN (VK_CONTROL)
     504        //               WM_SYSKEYUP (VK_CONTROL)
     505        //               WM_SYSKEYUP (VK_CONTROL)
     506        //               WM_KEYUP (VK_MENU)
     507        //
     508        // AltGr down -> if Ctrl down, send WM_KEYUP (VK_CONTROL)
     509        //               endif
     510        //               Send WM_KEYDOWN (VK_CONTROL)
     511        //               Send WM_KEYDOWN (VK_MENU)
     512        // AltGr up ->   if !(Ctrl down before AltGr was pressed || Ctrl up)
     513        //                   Send WM_SYSKEYUP (VK_CONTROL)
     514        //               endif
     515        //               Send WM_KEYDOWN (VK_MENU)
     516        //
     517        // NOTE: Ctrl = Ctrl-Left; AltGr doesn't care about the right Ctrl key
     518        //
     519          case PMSCAN_ALTRIGHT:
     520          {
     521              QMSG   msg = *pqmsg;
     522              ULONG  ctrlstate;
     523              ULONG  flags;
     524              ULONG  mp1, mp2;
     525
     526              flags = SHORT1FROMMP(pqmsg->mp1);
     527
     528              pqmsg->msg = WM_CHAR_SPECIAL;
     529
     530              if(flags & KC_KEYUP)
     531              {//AltGr up
     532                  ctrlstate  = WinGetPhysKeyState(HWND_DESKTOP, PMSCAN_CTRLLEFT);
     533                  if(!(ctrlstate & 0x8000))
     534                  {//ctrl is up, translate this message to Ctrl key up
     535                      mp1  = (PMSCAN_CTRLLEFT << 24);   //scancode
     536                      mp1 |= (1 << 16);                 //repeat count
     537                      mp1 |= (KC_ALT | KC_KEYUP | KC_VIRTUALKEY | KC_SCANCODE);
     538                      mp2  = (VK_CTRL << 16);           //virtual keycode
     539                      pqmsg->msg = WM_CHAR_SPECIAL_ALTGRCONTROL;
     540                      pqmsg->mp1 = (MPARAM)mp1;
     541                      pqmsg->mp2 = (MPARAM)mp2;
     542
     543                      //and finally, post the AltGr WM_CHAR message           
     544                      WinPostMsg(msg.hwnd, WM_CHAR_SPECIAL, msg.mp1, msg.mp2);
     545                  }
     546                  //else do nothing
     547              }
     548              else
     549              {//AltGr down
     550                  ctrlstate  = WinGetPhysKeyState(HWND_DESKTOP, PMSCAN_CTRLLEFT);
     551                  if(ctrlstate & 0x8000)
     552                  {//ctrl is down, translate this message to Ctrl key up
     553                      mp1  = (PMSCAN_CTRLLEFT << 24);   //scancode
     554                      mp1 |= (1 << 16);                 //repeat count
     555                      mp1 |= (KC_KEYUP | KC_VIRTUALKEY | KC_SCANCODE);
     556                      mp2  = (VK_CTRL << 16);           //virtual keycode
     557                      pqmsg->msg = WM_CHAR_SPECIAL_ALTGRCONTROL;
     558                      pqmsg->mp1 = (MPARAM)mp1;
     559                      pqmsg->mp2 = (MPARAM)mp2;
     560                  }
     561                  //send left control key down message
     562                  mp1  = (PMSCAN_CTRLLEFT << 24);       //scancode
     563                  mp1 |= (1 << 16);                     //repeat count
     564                  mp1 |= (KC_CTRL | KC_VIRTUALKEY | KC_SCANCODE);
     565                  mp2  = (VK_CTRL << 16);               //virtual keycode
     566
     567                  if(ctrlstate & 0x8000)
     568                  {//ctrl is down, must post this message
     569                      WinPostMsg(msg.hwnd, WM_CHAR_SPECIAL_ALTGRCONTROL, (MPARAM)mp1, (MPARAM)mp2);
     570                  }
     571                  else
     572                  {//translate this message into control key down
     573                      pqmsg->msg = WM_CHAR_SPECIAL_ALTGRCONTROL;
     574                      pqmsg->mp1 = (MPARAM)mp1;
     575                      pqmsg->mp2 = (MPARAM)mp2;
     576                  }
     577                  //and finally, post the AltGr WM_CHAR message           
     578                  WinPostMsg(msg.hwnd, WM_CHAR_SPECIAL, msg.mp1, msg.mp2);
     579              }
     580              break;
     581          }
     582
    489583          }
    490584        }
Note: See TracChangeset for help on using the changeset viewer.