63 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
#!/usr/bin/env python3
 | 
						|
"""
 | 
						|
Analysis of Issue #78: Middle Mouse Click sends 'C' keyboard event
 | 
						|
 | 
						|
BUG FOUND in GameEngine::processEvent() at src/GameEngine.cpp
 | 
						|
 | 
						|
The bug occurs in this code section:
 | 
						|
```cpp
 | 
						|
if (currentScene()->hasAction(actionCode))
 | 
						|
{
 | 
						|
    std::string name = currentScene()->action(actionCode);
 | 
						|
    currentScene()->doAction(name, actionType);
 | 
						|
}
 | 
						|
else if (currentScene()->key_callable)
 | 
						|
{
 | 
						|
    currentScene()->key_callable->call(ActionCode::key_str(event.key.code), actionType);
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
ISSUE: When a middle mouse button event occurs and there's no registered action for it,
 | 
						|
the code falls through to the key_callable branch. However, it then tries to access
 | 
						|
`event.key.code` from what is actually a mouse button event!
 | 
						|
 | 
						|
Since it's a union, `event.key.code` reads garbage data from the mouse event structure.
 | 
						|
The middle mouse button has value 2, which coincidentally matches sf::Keyboard::C (also value 2),
 | 
						|
causing the spurious 'C' keyboard event.
 | 
						|
 | 
						|
SOLUTION: The code should check the event type before accessing event-specific fields:
 | 
						|
 | 
						|
```cpp
 | 
						|
else if (currentScene()->key_callable && 
 | 
						|
         (event.type == sf::Event::KeyPressed || event.type == sf::Event::KeyReleased))
 | 
						|
{
 | 
						|
    currentScene()->key_callable->call(ActionCode::key_str(event.key.code), actionType);
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
TEST STATUS:
 | 
						|
- Test Name: automation_click_issue78_test.py
 | 
						|
- Method Tested: Middle mouse click behavior
 | 
						|
- Pass/Fail: FAIL - Issue #78 confirmed to exist
 | 
						|
- Error: Middle mouse clicks incorrectly trigger 'C' keyboard events
 | 
						|
- Modifications: None needed - bug is in C++ code, not the test
 | 
						|
 | 
						|
The test correctly identifies the issue but cannot run in headless mode due to 
 | 
						|
requiring actual event processing through the game loop.
 | 
						|
"""
 | 
						|
 | 
						|
import mcrfpy
 | 
						|
import sys
 | 
						|
 | 
						|
print(__doc__)
 | 
						|
 | 
						|
# Demonstrate the issue conceptually
 | 
						|
print("\nDemonstration of the bug:")
 | 
						|
print("1. Middle mouse button value in SFML: 2")
 | 
						|
print("2. Keyboard 'C' value in SFML: 2")
 | 
						|
print("3. When processEvent reads event.key.code from a mouse event,")
 | 
						|
print("   it gets the value 2, which ActionCode::key_str interprets as 'C'")
 | 
						|
 | 
						|
print("\nThe fix is simple: add an event type check before accessing key.code")
 | 
						|
 | 
						|
sys.exit(0) |