Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activity.py8
-rw-r--r--physics.py46
-rw-r--r--tools.py4
3 files changed, 36 insertions, 22 deletions
diff --git a/activity.py b/activity.py
index bf6ac0f..a718257 100644
--- a/activity.py
+++ b/activity.py
@@ -44,6 +44,7 @@ class PhysicsActivity(olpcgames.PyGameActivity):
def __init__(self, handle):
super(PhysicsActivity, self).__init__(handle)
self.metadata['mime_type'] = 'application/x-physics-activity'
+ self.connect('visibility-notify-event', self._focus_event)
def get_preview(self):
"""Custom preview code to get image from pygame.
@@ -173,3 +174,10 @@ class PhysicsActivity(olpcgames.PyGameActivity):
pygame.event.post(olpcgames.eventwrap.Event(pygame.USEREVENT, action=self.radioList[button]))
+ def _focus_event(self, event, data=None):
+ """Send focus events to pygame to allow it to more gracefully idle when in the background.
+ """
+ if data.state == gtk.gdk.VISIBILITY_FULLY_OBSCURED:
+ pygame.event.post(olpcgames.eventwrap.Event(pygame.USEREVENT, action="focus_out"))
+ else:
+ pygame.event.post(olpcgames.eventwrap.Event(pygame.USEREVENT, action="focus_in"))
diff --git a/physics.py b/physics.py
index bf95a93..3dd5060 100644
--- a/physics.py
+++ b/physics.py
@@ -78,32 +78,34 @@ class PhysicsGame:
self.show_fake_cursor = True
def run(self):
+ self.in_focus = True
while True:
for event in pygame.event.get():
self.currentTool.handleEvents(event)
- # Drive motors
- if self.world.run_physics:
- for body in self.world.world.GetBodyList():
- if type(body.userData) == type({}):
- if body.userData.has_key('rollMotor'):
- diff = body.userData['rollMotor']['targetVelocity'] - body.GetAngularVelocity()
- body.ApplyTorque(body.userData['rollMotor']['strength'] * diff * body.getMassData().I)
-
- # Update & Draw World
- self.world.update()
- self.screen.fill((255, 255, 255)) # 255 for white
- self.world.draw()
-
- # Draw output from tools
- self.currentTool.draw()
-
- # Show Sugar like cursor for UI consistancy
- if self.show_fake_cursor:
- self.screen.blit(self.cursor_picture, pygame.mouse.get_pos())
-
- # Flip Display
- pygame.display.flip()
+ if self.in_focus:
+ # Drive motors
+ if self.world.run_physics:
+ for body in self.world.world.GetBodyList():
+ if type(body.userData) == type({}):
+ if body.userData.has_key('rollMotor'):
+ diff = body.userData['rollMotor']['targetVelocity'] - body.GetAngularVelocity()
+ body.ApplyTorque(body.userData['rollMotor']['strength'] * diff * body.getMassData().I)
+
+ # Update & Draw World
+ self.world.update()
+ self.screen.fill((255, 255, 255)) # 255 for white
+ self.world.draw()
+
+ # Draw output from tools
+ self.currentTool.draw()
+
+ # Show Sugar like cursor for UI consistancy
+ if self.show_fake_cursor:
+ self.screen.blit(self.cursor_picture, pygame.mouse.get_pos())
+
+ # Flip Display
+ pygame.display.flip()
# Stay under 30 FPS to help keep the rest of the platform responsive
self.clock.tick(30) # Originally 50
diff --git a/tools.py b/tools.py
index 75a3440..c3877b9 100644
--- a/tools.py
+++ b/tools.py
@@ -48,6 +48,10 @@ class Tool(object):
if event.action == "stop_start_toggle":
# Stop/start simulation
self.game.world.run_physics = not self.game.world.run_physics
+ elif event.action == "focus_in":
+ self.game.in_focus = True
+ elif event.action == "focus_out":
+ self.game.in_focus = False
elif self.game.toolList.has_key(event.action):
self.game.setTool(event.action)
elif hasattr(event,"code"):