Exemple #1
0
bool DEV_EventConsumer::processEvent(GHOST_IEvent *event)
{
	GHOST_TEventDataPtr eventData = ((GHOST_IEvent*)event)->getData();
	switch (event->getType()) {
		case GHOST_kEventButtonDown:
		{
			HandleButtonEvent(eventData, true);
			break;
		}

		case GHOST_kEventButtonUp:
		{
			HandleButtonEvent(eventData, false);
			break;
		}

		case GHOST_kEventWheel:
		{
			HandleWheelEvent(eventData);
			break;
		}

		case GHOST_kEventCursorMove:
		{
			HandleCursorEvent(eventData, event->getWindow());
			break;
		}

		case GHOST_kEventKeyDown:
		{
			HandleKeyEvent(eventData, true);
			break;
		}
		case GHOST_kEventKeyUp:
		{
			HandleKeyEvent(eventData, false);
			break;
		}
		case GHOST_kEventWindowSize:
		case GHOST_kEventWindowClose:
		case GHOST_kEventQuit:
		{
			HandleWindowEvent(event->getType());
			break;
		}
		default:
			break;
	}

	return true;
}
Exemple #2
0
EXTERNC
int getch() {
	BOOL rv;
	DWORD n;
	INPUT_RECORD buf;

	if (thData.ungetCount > 0) {
		thData.ungetCount--;
		return thData.ungetBuf[thData.ungetCount];
	};

	if (thData.charCount > 0) {
		thData.charCount--;
		if (thData.charCount & 1 && thData.charFlag) return 0;
		else return thData.charValue;
	};

	while (true) {
		rv = ReadConsoleInput(thData.input, &buf, 1, &n);
		if (rv == false) continue;
		if (buf.EventType != KEY_EVENT) continue;
		if (buf.Event.KeyEvent.bKeyDown == false) continue;
		if (HandleKeyEvent(&buf)) break;
	};

	thData.charCount--;
	if (thData.charCount & 1 && thData.charFlag) return 0;
	else return thData.charValue;
};
Exemple #3
0
void PaletteWindow::HandleEvents(sf::RenderWindow& window)
{
    // Handle all events.
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
        {
            // Ignore -- we only close if the main map editor closes.
        }
        else if (event.type == sf::Event::MouseButtonPressed)
        {
            // Selecting something, figure out which.
            bool swappedTerrain = false;
            for (int i = 0; i < (int)TerrainType::COUNT; i++)
            {
                if (terrainRectangles[(TerrainType)i].getGlobalBounds().contains(sf::Vector2f((float)event.mouseButton.x, (float)event.mouseButton.y)))
                {
                    std::cout << "Switching to terrain type " << GetTerrainName((TerrainType)i) << std::endl;
                    terrainRectangles[selectedTerrain].setOutlineThickness(0);
                    terrainRectangles[(TerrainType)i].setOutlineThickness(1.0f);

                    selectedTerrain = (TerrainType)i;
                    swappedTerrain = true;
                    break;
                }
            }

            if (!swappedTerrain)
            {
                // Determine if we instead swapped tools.
                for (int i = 0; i < (int)Tool::COUNT_TOOL; i++)
                {
                    if (toolRectangles[(Tool)i].getGlobalBounds().contains(sf::Vector2f((float)event.mouseButton.x, (float)event.mouseButton.y)))
                    {
                        std::cout << "Switching to tool " << GetToolName((Tool)i) << std::endl;

                        toolRectangles[selectedTool].setOutlineThickness(0);
                        toolRectangles[(Tool)i].setOutlineThickness(1.0f);

                        selectedTool = (Tool)i;
                        break;
                    }
                }
            }
        }
        else if (event.type == sf::Event::KeyPressed)
        {
            HandleKeyEvent(event);
        }
    }
}
Exemple #4
0
void plKeyboardDevice::HandleWindowActivate(bool bActive, HWND hWnd)
{
    if (bActive)
    {
        // Refresh the caps lock state
        HandleKeyEvent(KEYDOWN, KEY_CAPSLOCK, nil, false);
    }
    else
    {
        ReleaseAllKeys(); // send key-up events for everything since we're losing focus
    }

}
Exemple #5
0
void StringBrowser::Handle (Event& e) {
    if (e.eventType == KeyEvent) {
        HandleKeyEvent(e);

    } else {
        boolean done = false;

        do {
            switch (e.eventType) {
            case DownEvent:
                done = HandleDownEvent(e);
                break;

            case KeyEvent:
                done = HandleKeyEvent(e);
                break;
            }
            if (!done) {
                Read(e);
            }
        } while (!done);
    }
}
Exemple #6
0
void Arti3DApp::HandleEvent(const SDL_Event& event, Arti3DApp *pApp)
{
	switch (event.type)
	{
	case SDL_QUIT:
		pApp->m_bRunning = false;
		break;
	case SDL_KEYDOWN:
		HandleKeyEvent(event, pApp);
		break;
	default:
		break;
	}
}
void
MIR_HandleInput(MirSurface* surface, MirEvent const* ev, void* context)
{
    SDL_Window* window = (SDL_Window*)context;
    switch (ev->type) {
    case (mir_event_type_key):
        HandleKeyEvent(ev->key, window);
        break;
    case (mir_event_type_motion):
        HandleMotionEvent(ev->motion, window);
        break;
    default:
        break;
    }
}
// OnKey handles system keys by first interpreting some Ctrl+Key combinations
// in a special way and passing the rest of them to the movie.
void    FxPlayerTiny::OnKey(UInt keyCode, bool downFlag)
{
    if (!pMovie) return;

    bool    ctrl = ControlKeyDown;

    if (keyCode == VK_CONTROL)
    {
        ControlKeyDown = downFlag;
        return;
    }

    if (keyCode == VK_MENU && downFlag)
        ControlKeyDown = false; // to enable Ctrl-Alt-... combinations to work

    if (ctrl && downFlag)
    {
        switch(keyCode)
        {
/*
        case 'W':
            Wireframe = !Wireframe;
            break;

        case 'A':
            AAEnabled = ! AAEnabled;
            {
                UInt32 rendererFlags = pRenderConfig->GetRenderFlags() &
                                       ~GFxRenderConfig::RF_EdgeAA;
                if (AAEnabled)
                    rendererFlags |= GFxRenderConfig::RF_EdgeAA;
                pRenderConfig->SetRenderFlags(rendererFlags);
            }
            break;

        case 'P':
            Paused = !Paused;
            break;
*/
        }
    }

    else if (!ctrl)
    {        
        HandleKeyEvent(keyCode, downFlag);
    }
}
Exemple #9
0
EXTERNC
int kbhit() {
	BOOL rv;
	DWORD n;
	INPUT_RECORD buf;

	if (thData.ungetCount > 0) return 1;
	if (thData.charCount > 0) return 1;

	rv = PeekConsoleInput(thData.input, &buf, 1, &n);
	if (!rv) return 0;
	if (n == 0) return 0;
	rv = ReadConsoleInput(thData.input, &buf, 1, &n);
	if (rv == false) return 0;
	if (buf.EventType != KEY_EVENT) return 0;
	if (buf.Event.KeyEvent.bKeyDown == false) return 0;
	return HandleKeyEvent(&buf) ? 1 : 0;
};
Exemple #10
0
static void
HandleInput(MirInputEvent const* input_event, SDL_Window* window)
{
    switch (MIR_mir_input_event_get_type(input_event)) {
        case (mir_input_event_type_key):
            HandleKeyEvent(MIR_mir_input_event_get_keyboard_event(input_event), window);
            break;
        case (mir_input_event_type_pointer):
            HandleMouseEvent(MIR_mir_input_event_get_pointer_event(input_event), window);
            break;
        case (mir_input_event_type_touch):
            HandleTouchEvent(MIR_mir_input_event_get_touch_event(input_event),
                             MIR_mir_input_event_get_device_id(input_event),
                             window);
            break;
        default:
            break;
    }
}
Exemple #11
0
void Widget::HandleEvent( const sf::Event& event ) {
	if( !IsGloballyVisible() ) {
		return;
	}

	// Ignore the event if widget is insensitive
	if ( GetState() == INSENSITIVE ) {
		return;
	}

	// Ignore the event if another widget is active.
	if( !IsActiveWidget() && !IsActiveWidget( PtrConst() ) ) {
		return;
	}

	// Ignore the event if another widget is modal.
	if( HasModal() && !IsModal() ) {
		return;
	}

	// Set widget active in context.
	Context::Get().SetActiveWidget( shared_from_this() );

	Container::Ptr parent( m_parent.lock() );

	switch( event.type ) {
		case sf::Event::MouseMoved:
			// Check if pointer inside of widget's allocation.
			if( GetAllocation().contains( static_cast<float>( event.mouseMove.x ), static_cast<float>( event.mouseMove.y ) ) ) {
				// Check for enter event.
				if( !IsMouseInWidget() ) {
					// Flip the mouse_in bit.
					m_bitfield ^= static_cast<unsigned char>( 0x10 );

					GetSignals().Emit( OnMouseEnter );
					HandleMouseEnter( event.mouseMove.x, event.mouseMove.y );
				}

				GetSignals().Emit( OnMouseMove );
			}
			else if( IsMouseInWidget() ) { // Check for leave event.
				// Flip the mouse_in bit.
				m_bitfield ^= static_cast<unsigned char>( 0x10 );

				GetSignals().Emit( OnMouseLeave );
				HandleMouseLeave( event.mouseMove.x, event.mouseMove.y );
			}

			HandleMouseMoveEvent( event.mouseMove.x, event.mouseMove.y );
			break;

		case sf::Event::MouseButtonPressed:
			if( ( ( m_bitfield & static_cast<unsigned char>( 0xe0 ) ) == static_cast<unsigned char>( 0xe0 ) ) && IsMouseInWidget() ) {
				// Clear the mouse_button_down bits to 0s.
				m_bitfield &= static_cast<unsigned char>( 0x1f );

				// Set the mouse_button_down bits.
				m_bitfield |= static_cast<unsigned char>( event.mouseButton.button << 5 );
			}

			HandleMouseButtonEvent( event.mouseButton.button, true, event.mouseButton.x, event.mouseButton.y );

			if( IsMouseInWidget() ) {
				if( event.mouseButton.button == sf::Mouse::Left ) {
					GetSignals().Emit( OnMouseLeftPress );
				}
				else if( event.mouseButton.button == sf::Mouse::Right ) {
					GetSignals().Emit( OnMouseRightPress );
				}
			}

			break;

		case sf::Event::MouseButtonReleased:
			// Only process as a click when mouse button has been pressed inside the widget before.
			if( ( ( m_bitfield & 0xe0 ) >> 5 ) == event.mouseButton.button ) {
				// Set the mouse_button_down bits to 111 (none).
				m_bitfield |= static_cast<unsigned char>( 0xe0 );

				// When released inside the widget, the event can be considered a click.
				if( IsMouseInWidget() ) {
					HandleMouseClick( event.mouseButton.button, event.mouseButton.x, event.mouseButton.y );

					if( event.mouseButton.button == sf::Mouse::Left ) {
						GetSignals().Emit( OnLeftClick );
					}
					else if( event.mouseButton.button == sf::Mouse::Right ) {
						GetSignals().Emit( OnRightClick );
					}
				}
			}

			HandleMouseButtonEvent( event.mouseButton.button, false, event.mouseButton.x, event.mouseButton.y );

			if( IsMouseInWidget() ) {
				if( event.mouseButton.button == sf::Mouse::Left ) {
					GetSignals().Emit( OnMouseLeftRelease );
				}
				else if( event.mouseButton.button == sf::Mouse::Right ) {
					GetSignals().Emit( OnMouseRightRelease );
				}
			}

			break;

		case sf::Event::KeyPressed:
			if( HasFocus() ) {
				// TODO: Delegate event too when widget's not active?
				HandleKeyEvent( event.key.code, true );
				GetSignals().Emit( OnKeyPress );
			}

			break;

		case sf::Event::KeyReleased:
			if( HasFocus() ) {
				// TODO: Delegate event too when widget's not active?
				HandleKeyEvent( event.key.code, false );
				GetSignals().Emit( OnKeyRelease );
			}
			break;

		case sf::Event::TextEntered:
			if( HasFocus() ) {
				// TODO: Delegate event too when widget's not active?
				HandleTextEvent( event.text.unicode );
				GetSignals().Emit( OnText );
			}
			break;

		default:
			break;
	}
}
void StreamThread(void *args) {
	HWND hWnd = ((ArgList *)args)->hWnd;
	SOCKET clientSocket = ((ArgList *)args)->socket;
	static MouseEvent event, prevevent;
	int button;

	int timeout = 5*1000; //ms
	setsockopt(clientSocket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(timeout));

	MouseEvent versionEvent = {htonl(EVENT_VERSION), htonl(kVersionWindowsCurrent), 0, 0};
	send(clientSocket, (const char *)&versionEvent, sizeof(versionEvent), 0);

	while (TRUE) {
		int recvsize = recv(clientSocket, (char *)&event, sizeof(event), 0);
		if (recvsize == sizeof(event)) {
			event.type = ntohl(event.type);
			event.value = ntohl(event.value);
			event.tv_sec = ntohl(event.tv_sec);
			event.tv_nsec = ntohl(event.tv_nsec);

			switch (event.type) {
			case EVENT_MOUSE_DELTA_X:
				break;
			case EVENT_MOUSE_DELTA_Y:
				if (prevevent.type == EVENT_MOUSE_DELTA_X)
					mouse_event(MOUSEEVENTF_MOVE, prevevent.value, event.value, 0, 0);
				break;
			case EVENT_MOUSE_DELTA_W:
				mouse_event( MOUSEEVENTF_HWHEEL, 0, 0, event.value, 0 );
				break;
			case EVENT_MOUSE_DELTA_Z:
				mouse_event( MOUSEEVENTF_WHEEL, 0, 0, -event.value, 0 );
				break;
			case EVENT_MOUSE_DOWN:
				button = MouseNumber(event.value);
				if (button < 0 || kNumButtons <= button)
					button = 0;
				mouse_event(flagButtonDown[button], 0, 0, dataXButton[button], 0 );
				break;
			case EVENT_MOUSE_UP:
				button = MouseNumber(event.value);
				if (button < 0 || kNumButtons <= button)
					button = 0;
				mouse_event(flagButtonUp[button], 0, 0, dataXButton[button], 0 );
				break;
			case EVENT_KEY_DOWN:
				HandleKeyEvent(event);
				break;
			case EVENT_KEY_UP:
				HandleKeyEvent(event);
				break;
			case EVENT_ASCII:
				SimulateKeyWithUnichar(event);
				break;
			default:
				break;
			}
			prevevent = event;

			//sending a ACK packet for the winsock 200ms problem
			MouseEvent nullEvent = {htonl(EVENT_NULL), 0, 0, 0};
			send(clientSocket, (const char *)&nullEvent, sizeof(nullEvent), 0);
		} else if (recvsize == 0) {
			connectionStatus = statusNotConnected;
			break;
		} else if (recvsize == SOCKET_ERROR) {
			int errorno = WSAGetLastError();
			if (errorno == WSAETIMEDOUT) {
				// sending a keep-alive packet
				MouseEvent nullEvent = {htonl(EVENT_NULL), 0, 0, 0};
				send(clientSocket, (const char *)&nullEvent, sizeof(nullEvent), 0);
			} else {
				connectionStatus = errorno;
				break;
			}
		}
	}

	RepaintWindow(hWnd);
	Shell_NotifyIcon(NIM_MODIFY, &trayIcon[trayIconNotConnected]);
	EnableMenuItem(GetMenu(hWnd), IDM_DISCONNECT, MF_BYCOMMAND | MF_GRAYED);

	shutdown(clientSocket, SD_BOTH);
	closesocket(clientSocket);

	_endthread();
	return;
}
void EventLoop(void)
{
  while (1)
  {
    if (PendingEvent())		/* got event */
    {
      Event event;

      while (NextValidEvent(&event))
      {
  	switch (event.type)
  	{
  	  case EVENT_BUTTONPRESS:
  	  case EVENT_BUTTONRELEASE:
  	    HandleButtonEvent((ButtonEvent *) &event);
  	    break;
  
  	  case EVENT_MOTIONNOTIFY:
  	    HandleMotionEvent((MotionEvent *) &event);
  	    break;
  
  	  case EVENT_KEYPRESS:
  	  case EVENT_KEYRELEASE:
  	    HandleKeyEvent((KeyEvent *) &event);
  	    break;
  
  	  default:
  	    HandleOtherEvents(&event);
  	    break;
  	}
      }
    }
    else
    {
      /* when playing, display a special mouse pointer inside the playfield */
      if (game_status == GAME_MODE_PLAYING && !tape.pausing)
      {
	if (!playfield_cursor_set && cursor_inside_playfield &&
	    DelayReached(&playfield_cursor_delay, 1000))
	{
	  SetMouseCursor(CURSOR_PLAYFIELD);
	  playfield_cursor_set = TRUE;
	}
      }
      else if (playfield_cursor_set)
      {
	SetMouseCursor(CURSOR_DEFAULT);
	playfield_cursor_set = FALSE;
      }

      HandleNoEvent();
    }

    /* don't use all CPU time when idle; the main loop while playing
       has its own synchronization and is CPU friendly, too */

    if (game_status == GAME_MODE_PLAYING)
    {
      HandleGameActions();
    }
    else
    {
      SyncDisplay();
      if (!PendingEvent())	/* delay only if no pending events */
	Delay(10);
    }

    /* refresh window contents from drawing buffer, if needed */
    BackToFront();

    if (game_status == GAME_MODE_QUIT)
      return;
  }
}
/* 
 * function : DiversionFormHandleEvent
 *
 * Handles all events directed at the form.
 *
 * Returns true if the event is handled
 */
Boolean DiversionFormHandleEvent(EventPtr event)
{
	Boolean handled = false;
	char *alphaInput;

	switch (PFEventGetType(event)) 
	{
	case frmOpenEvent:
		DiversionFormInit();
		GUIFormResize(false, false);
		UpdateDisplay();

		handled = true;
		break;
			
	case winDisplayChangedEvent:

		if (GUIFormResize(false, false)) UpdateDisplay();
		handled = true;
		break;
		

	case evtGPSFix:
	case evtGPSFixLost:
	case evtGPSPositionUpdate:
	case nilEvent:

		/*
		 * turn scanning on/off according to state of GPS
		 *
		 */

		if (GPSState) {

			if ( (scanState != disabled && GPS.sat.fixType < 2) ||
				(scanState == disabled && GPS.sat.fixType > 1)) {

				ResetScan();
				if (!GUIMenuIsDisplayed()) UpdateDisplay();

			} else if (GUIFieldIsDirty(DvSearchStr)) {
				
				LOGTAG("Dirty field");
				GUIFieldClean(DvSearchStr);

				ResetScan();
				if (!GUIMenuIsDisplayed()) UpdateDisplay();

			} else if (scanState != disabled) {

				/*
				 * update the display if the scan is completed or while
				 * we're still searching
				 *
				 */

//				if (ScanForWaypoints(PFTicksPerSecond()*3/4,true) || newProxList == &proxList)

				(void)ScanForWaypoints(PFTicksPerSecond()*3/4,true);
				if (!GUIMenuIsDisplayed()) UpdateDisplay();

			}

		} else {

			/*
			 * if (FpIsBlank(FlightPlan)) {
			 *
			 * GUIObjectHide( MapPanToWaypointButton);
			 *
			 * }
			 *
			 * No GPS on, we're using our reference position
			 *
			 */

			if (ScanForWaypoints(PFTicksPerSecond()*3/4,true) || newProxList == &proxList)

				if (!GUIMenuIsDisplayed()) UpdateDisplay();


		}

		handled = true;
		break;

	case keyDownEvent:
		handled = HandleKeyEvent(event);
		break;

	case menuEvent:
		
		switch (PFEventGetMenuID(event)) {

		case MnDivertEmergency:
			GUIFormGoto(MapForm);
			handled = true;
			break;

		case MnInformation:

			if (selectedWaypointID != UNSELECTED) {

				/*
				 * waypoint is locked here, but will be unlocked by
				 * the WPInfoDialog
				 *
				 */

				WPInfoSetWaypointInfo(selectedWaypointID);
				GUIFormPopup(WPInfoDialog);

			}

			handled = true;
			break;

		}

		break;

	case ctlSelectEvent:
		handled = HandleCtlSelectEvent(event);
		break;

	case sclEnterEvent:
	case sclRepeatEvent:
	case sclExitEvent:
		handled = true;
		break;

	case penDownEvent:
		if (PFScreenPointInRectangle(PFEventGetX(event)*2, PFEventGetY(event)*2,
					&proxDisplayArea)) {
			handled = HandleProxSelectEvent(event);
		} 
		break;

	case fldEnterEvent:
		AlphaPadDialogInit(GUIFieldGetText(DvSearchStr));
		GUIFormPopup(AlphaPadDialog);
		handled = true;
		break;
		
	case evtAlphaInput:
		alphaInput = AlphaPadGetInput();
		GUIFieldSetText(DvSearchStr, alphaInput, true);
		PFMemFree(alphaInput);

		ResetScan();
		UpdateDisplay();
		handled = true;
		break;

	case frmCloseEvent:
		DiversionFormDeInit();
		handled = false;
		break;

	case evtWaypointInfoReq:
		
		/*
		 * this is sent by the command popup dialog
		 *
		 */


	default:
		break;
	}	
	return handled;
}
Exemple #15
0
void Widget::HandleEvent( const sf::Event& event ) {
	if( !IsGloballyVisible() ) {
		return;
	}

	// Ignore the event if widget is insensitive
	if ( GetState() == State::INSENSITIVE ) {
		return;
	}

	// Ignore the event if another widget is active.
	if( !IsActiveWidget() && !IsActiveWidget( PtrConst() ) ) {
		return;
	}

	// Ignore the event if another widget is modal.
	if( HasModal() && !IsModal() ) {
		return;
	}

	// Set widget active in context.
	Context::Get().SetActiveWidget( shared_from_this() );

	auto parent = m_parent.lock();

	auto emit_leave = false;
	auto emit_enter = false;
	auto emit_move = false;
	auto emit_left_click = false;
	auto emit_right_click = false;

	try {
		switch( event.type ) {
			case sf::Event::MouseLeft:
				if( IsMouseInWidget() ) {
					SetMouseInWidget( false );

					HandleMouseLeave( std::numeric_limits<int>::min(), std::numeric_limits<int>::min() );

					emit_leave = true;
				}

				HandleMouseMoveEvent( std::numeric_limits<int>::min(), std::numeric_limits<int>::min() );

				SetMouseButtonDown();
				HandleMouseButtonEvent( sf::Mouse::Left, false, std::numeric_limits<int>::min(), std::numeric_limits<int>::min() );
				HandleMouseButtonEvent( sf::Mouse::Right, false, std::numeric_limits<int>::min(), std::numeric_limits<int>::min() );

				if( emit_leave ) {
					GetSignals().Emit( OnMouseLeave );
				}

				break;

			case sf::Event::MouseMoved:
				// Check if pointer inside of widget's allocation.
				if( GetAllocation().contains( static_cast<float>( event.mouseMove.x ), static_cast<float>( event.mouseMove.y ) ) ) {
					// Check for enter event.
					if( !IsMouseInWidget() ) {
						SetMouseInWidget( true );

						emit_enter = true;

						HandleMouseEnter( event.mouseMove.x, event.mouseMove.y );
					}

					emit_move = true;
				}
				else if( IsMouseInWidget() ) { // Check for leave event.
					SetMouseInWidget( false );

					emit_leave = true;

					HandleMouseLeave( event.mouseMove.x, event.mouseMove.y );
				}

				HandleMouseMoveEvent( event.mouseMove.x, event.mouseMove.y );

				if( emit_move ) {
					if( emit_enter ) {
						GetSignals().Emit( OnMouseEnter );
					}

					GetSignals().Emit( OnMouseMove );
				}
				else if( emit_leave ) {
					GetSignals().Emit( OnMouseLeave );
				}

				break;

			case sf::Event::MouseButtonPressed:
				if( !IsMouseButtonDown() && IsMouseInWidget() ) {
					SetMouseButtonDown( event.mouseButton.button );
				}

				HandleMouseButtonEvent( event.mouseButton.button, true, event.mouseButton.x, event.mouseButton.y );

				if( IsMouseInWidget() ) {
					if( event.mouseButton.button == sf::Mouse::Left ) {
						GetSignals().Emit( OnMouseLeftPress );
					}
					else if( event.mouseButton.button == sf::Mouse::Right ) {
						GetSignals().Emit( OnMouseRightPress );
					}
				}

				break;

			case sf::Event::MouseButtonReleased:
				// Only process as a click when mouse button has been pressed inside the widget before.
				if( IsMouseButtonDown( event.mouseButton.button ) ) {
					SetMouseButtonDown();

					// When released inside the widget, the event can be considered a click.
					if( IsMouseInWidget() ) {
						HandleMouseClick( event.mouseButton.button, event.mouseButton.x, event.mouseButton.y );

						if( event.mouseButton.button == sf::Mouse::Left ) {
							emit_left_click = true;
						}
						else if( event.mouseButton.button == sf::Mouse::Right ) {
							emit_right_click = true;
						}
					}
				}

				HandleMouseButtonEvent( event.mouseButton.button, false, event.mouseButton.x, event.mouseButton.y );

				if( emit_left_click ) {
					GetSignals().Emit( OnLeftClick );
				}
				else if( emit_right_click ) {
					GetSignals().Emit( OnRightClick );
				}

				if( IsMouseInWidget() ) {
					if( event.mouseButton.button == sf::Mouse::Left ) {
						GetSignals().Emit( OnMouseLeftRelease );
					}
					else if( event.mouseButton.button == sf::Mouse::Right ) {
						GetSignals().Emit( OnMouseRightRelease );
					}
				}

				break;

			case sf::Event::KeyPressed:
				if( HasFocus() ) {
					// TODO: Delegate event too when widget's not active?
					HandleKeyEvent( event.key.code, true );
					GetSignals().Emit( OnKeyPress );
				}

				break;

			case sf::Event::KeyReleased:
				if( HasFocus() ) {
					// TODO: Delegate event too when widget's not active?
					HandleKeyEvent( event.key.code, false );
					GetSignals().Emit( OnKeyRelease );
				}
				break;

			case sf::Event::TextEntered:
				if( HasFocus() ) {
					// TODO: Delegate event too when widget's not active?
					HandleTextEvent( event.text.unicode );
					GetSignals().Emit( OnText );
				}
				break;

			default:
				break;
		}
	}
	catch( ... ) {
		SetState( State::NORMAL );
		throw;
	}
}
Exemple #16
0
void Widget::HandleEvent( const sf::Event& event ) {
	if( !IsVisible() ) {
		return;
	}

	// Set widget active in context.
	Context::Get().SetActiveWidget( shared_from_this() );

	Container::Ptr parent( m_parent.lock() );

	switch( event.Type ) {
		case sf::Event::MouseMoved:
			// Check if pointer inside of widget's allocation.
			if( GetAllocation().Contains( static_cast<float>( event.MouseMove.X ), static_cast<float>( event.MouseMove.Y ) ) ) {
				// Check for enter event.
				if( m_mouse_in == false ) {
					m_mouse_in = true;
					OnMouseEnter();
					HandleMouseEnter( event.MouseMove.X, event.MouseMove.Y );
				}

				OnMouseMove();
			}
			else if( m_mouse_in == true ) { // Check for leave event.
				m_mouse_in = false;
				OnMouseLeave();
				HandleMouseLeave( event.MouseMove.X, event.MouseMove.Y );
			}

			HandleMouseMoveEvent( event.MouseMove.X, event.MouseMove.Y );
			break;

		case sf::Event::MouseButtonPressed:
			// If a mouse button has already been pressed for this widget, drop further
			// presses. This maybe needs changing, but up to now, I can't think of any
			// cases where it would be useful to have such a functionality.
			if( m_mouse_button_down == -1 ) {
				if( m_mouse_in ) {
					m_mouse_button_down = event.MouseButton.Button;

					HandleMouseButtonEvent( event.MouseButton.Button, true, event.MouseButton.X, event.MouseButton.Y );
					OnMouseButtonPress();
				}
			}

			break;

		case sf::Event::MouseButtonReleased:
			// Only process when mouse button has been clicked inside the widget before.
			if( m_mouse_button_down == event.MouseButton.Button ) {
				m_mouse_button_down = -1;

				// When released inside the widget, the event can be considered a click.
				if( m_mouse_in ) {
					HandleMouseClick( event.MouseButton.Button, event.MouseButton.X, event.MouseButton.Y );
				}

				OnMouseButtonRelease();
			}

			HandleMouseButtonEvent( event.MouseButton.Button, false, event.MouseButton.X, event.MouseButton.Y );
			break;

		case sf::Event::KeyPressed:
			if( GetState() == Active ) {
				// TODO: Delegate event too when widget's not active?
				HandleKeyEvent( event.Key.Code, true );
				OnKeyPress();
			}

			break;

		case sf::Event::KeyReleased:
			if( GetState() == Active ) {
				// TODO: Delegate event too when widget's not active?
				HandleKeyEvent( event.Key.Code, false );
				OnKeyRelease();
			}
			break;

		case sf::Event::TextEntered:
			if( GetState() == Active ) {
				// TODO: Delegate event too when widget's not active?
				HandleTextEvent( event.Text.Unicode );
				OnText();
			}
			break;

		default:
			break;
	}
}
bool
StreamReaderWin::ReadInput(size_t& nRead, InputData& in) {
    DWORD NRead = 0;
    in.SetModifier(InputData::kModNone);
    char C;
    if (fIsConsole) {
        INPUT_RECORD buf;
        if (!::ReadConsoleInput(fIn, &buf, 1, &NRead)) {
            HandleError("reading console input");
            return false;
        }

        switch (buf.EventType) {
        case KEY_EVENT:
        {
            if (!buf.Event.KeyEvent.bKeyDown) return false;

            WORD Key = buf.Event.KeyEvent.wVirtualKeyCode;
            if (buf.Event.KeyEvent.dwControlKeyState
                    & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) {
                if (buf.Event.KeyEvent.dwControlKeyState
                        & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) {
                    // special "Alt Gr" case (equivalent to Ctrl+Alt)...
                    in.SetModifier(InputData::kModNone);
                }
                else {
                    in.SetModifier(InputData::kModCtrl);
                }
            }
            if ((Key >= 0x30 && Key <= 0x5A /*0-Z*/)
                    || (Key >= VK_NUMPAD0 && Key <= VK_DIVIDE)
                    || (Key >= VK_OEM_1 && Key <= VK_OEM_102)
                    || Key == VK_SPACE) {
                C = buf.Event.KeyEvent.uChar.AsciiChar;
                if (buf.Event.KeyEvent.dwControlKeyState
                        & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) {
                    // C is already 1..
                }
            } else {
                switch (Key) {
                case VK_BACK:
                    in.SetExtended(InputData::kEIBackSpace);
                    break;
                case VK_TAB:
                    in.SetExtended(InputData::kEITab);
                    break;
                case VK_RETURN:
                    in.SetExtended(InputData::kEIEnter);
                    break;
                case VK_ESCAPE:
                    in.SetExtended(InputData::kEIEsc);
                    break;
                case VK_PRIOR:
                    in.SetExtended(InputData::kEIPgUp);
                    break;
                case VK_NEXT:
                    in.SetExtended(InputData::kEIPgDown);
                    break;
                case VK_END:
                    in.SetExtended(InputData::kEIEnd);
                    break;
                case VK_HOME:
                    in.SetExtended(InputData::kEIHome);
                    break;
                case VK_LEFT:
                    in.SetExtended(InputData::kEILeft);
                    break;
                case VK_UP:
                    in.SetExtended(InputData::kEIUp);
                    break;
                case VK_RIGHT:
                    in.SetExtended(InputData::kEIRight);
                    break;
                case VK_DOWN:
                    in.SetExtended(InputData::kEIDown);
                    break;
                case VK_INSERT:
                    in.SetExtended(InputData::kEIIns);
                    break;
                case VK_DELETE:
                    in.SetExtended(InputData::kEIDel);
                    break;
                case VK_F1:
                    in.SetExtended(InputData::kEIF1);
                    break;
                case VK_F2:
                    in.SetExtended(InputData::kEIF2);
                    break;
                case VK_F3:
                    in.SetExtended(InputData::kEIF3);
                    break;
                case VK_F4:
                    in.SetExtended(InputData::kEIF4);
                    break;
                case VK_F5:
                    in.SetExtended(InputData::kEIF5);
                    break;
                case VK_F6:
                    in.SetExtended(InputData::kEIF6);
                    break;
                case VK_F7:
                    in.SetExtended(InputData::kEIF7);
                    break;
                case VK_F8:
                    in.SetExtended(InputData::kEIF8);
                    break;
                case VK_F9:
                    in.SetExtended(InputData::kEIF9);
                    break;
                case VK_F10:
                    in.SetExtended(InputData::kEIF10);
                    break;
                case VK_F11:
                    in.SetExtended(InputData::kEIF11);
                    break;
                case VK_F12:
                    in.SetExtended(InputData::kEIF12);
                    break;
                default:
                    in.SetExtended(InputData::kEIUninitialized);
                    return false;
                }
                return true;
            }
            break;
        }
        case WINDOW_BUFFER_SIZE_EVENT:
            in.SetExtended(InputData::kEIResizeEvent);
            ++nRead;
            return true;
            break;
        default:
            return false;
        }
    } else {
        if (!::ReadFile(fIn, &C, 1, &NRead, NULL)) {
            HandleError("reading file input");
            return false;
        }
    }
    HandleKeyEvent(C, in);
    ++nRead;
    return true;
}