C: Trapping two mouse buttons at the same time

From FSDeveloper Wiki
Jump to: navigation, search

Detecting multiple mouse actions isn’t quite as easy as it would appear. The natural thing would be to do this:

 if((mouse_flags & MOUSE_LEFTSINGLE)&&(mouse_flags & MOUSE_RIGHTSINGLE))

but the value of mouse_flags is a reflection of action, not state. One answer is to use variables to detect the mouse button actions.

 // Add these to a global variable file
 bool bBtnLeft=false;
 bool bBtnRight=false;
 bool bBtnMid=false;
 int iBtnStatus=0;
// Inside the mouse callback
BOOL FSAPI myMouse_mcb( PPIXPOINT relative_point, FLAGS32 mouse_flags )
{
  static int initbtn = 0; // Used to detect which button is pressed first
 
  if (mouse_flags & MOUSE_LEFTSINGLE)
  {
    bBtnLeft = true;
    if (!initbtn)initbtn = 1;	// First button pressed - left
  }
  else if (mouse_flags & MOUSE_LEFTRELEASE)bBtnLeft = false;
 
  if (mouse_flags & MOUSE_RIGHTSINGLE)
  {
    bBtnRight = true;
    if (!initbtn)initbtn = 2;	// First button pressed - right
  }
  else if (mouse_flags & MOUSE_RIGHTRELEASE)bBtnRight = false;
 
  // Button down status
  if (bBtnLeft == false && bBtnRight == false)iBtnStatus = 0, initbtn = 0;  // Neither
  if (bBtnLeft == true && bBtnRight == false)iBtnStatus = 1;                // Left
  if (bBtnLeft == false && bBtnRight == true)iBtnStatus = 2;                // Right
  if (bBtnLeft == true && bBtnRight == true)iBtnStatus = 3;                 // Both
 
  // Action code here
  // Mouse buttons released
  if(!iBtnStatus)
  {
  }
  else
  // Left mouse button only
  if(iBtnStatus==1)
  {
  }
  else
  // Right mouse button only
  if(iBtnStatus==2)
  {
  }
  else
  // Both mouse buttons pressed
  if (iBtnStatus==3)
  {
    if(initbtn==1)	// Left mouse button was pressed first
    {
    }
    if(initbtn==2)	// Right mouse button was pressed first
    {
    }		
  }
}