diff --git a/lib/sugar/activity/activity.py b/lib/sugar/activity/activity.py index a632fb83..3dc5f301 100644 --- a/lib/sugar/activity/activity.py +++ b/lib/sugar/activity/activity.py @@ -128,6 +128,7 @@ class ActivityToolbar(gtk.Toolbar): self._activity.copy() def __stop_clicked_cb(self, button): + self._activity.take_screenshot() self._activity.close() def __jobject_updated_cb(self, jobject): @@ -461,6 +462,9 @@ class Activity(Window, gtk.Container): else: return {} + def take_screenshot(self): + self._preview = self._get_preview() + def save(self): """Request that the activity is saved to the Journal.""" @@ -594,8 +598,6 @@ class Activity(Window, gtk.Container): self._pservice.share_activity(self, private=private) def close(self): - self._preview = self._get_preview() - self.save() if self._shared_activity: diff --git a/lib/sugar/activity/activityservice.py b/lib/sugar/activity/activityservice.py index b2f7e150..c884fcb7 100644 --- a/lib/sugar/activity/activityservice.py +++ b/lib/sugar/activity/activityservice.py @@ -64,3 +64,7 @@ class ActivityService(dbus.service.Object): def Invite(self, buddy_key): self._activity.invite(buddy_key) + @dbus.service.method(_ACTIVITY_INTERFACE) + def TakeScreenshot(self): + self._activity.take_screenshot() + diff --git a/shell/kbdconfig b/shell/kbdconfig index cab49061..03c288aa 100644 --- a/shell/kbdconfig +++ b/shell/kbdconfig @@ -1,9 +1,3 @@ # This is the sugar keyboard configuration for matchbox -### Window operation short cuts - -n=next -p=prev -escape=close -Q=close return=fullscreen diff --git a/shell/model/homemodel.py b/shell/model/homemodel.py index 1a27645a..fb8cc568 100644 --- a/shell/model/homemodel.py +++ b/shell/model/homemodel.py @@ -70,6 +70,20 @@ class HomeModel(gobject.GObject): screen.connect('active-window-changed', self._active_window_changed_cb) + def get_previous_activity(self): + i = self._activities.index(self._pending_activity) + if i > 0: + return self._activities[i - 1] + else: + return None + + def get_next_activity(self): + i = self._activities.index(self._pending_activity) + if i < len(self._activities) - 1: + return self._activities[i + 1] + else: + return None + def get_pending_activity(self): """Returns the activity that would be seen in the Activity zoom level diff --git a/shell/view/ActivityHost.py b/shell/view/ActivityHost.py index c6c08539..43323727 100644 --- a/shell/view/ActivityHost.py +++ b/shell/view/ActivityHost.py @@ -72,6 +72,10 @@ class ActivityHost: else: logging.error('Invite failed, activity service not ') + def toggle_fullscreen(self): + fullscreen = not self._window.is_fullscreen() + self._window.set_fullscreen(fullscreen) + def present(self): # wnck.Window.activate() expects a timestamp, but we don't # always have one, and libwnck will complain if we pass "0", diff --git a/shell/view/Shell.py b/shell/view/Shell.py index 26d39a61..20cf5bc1 100644 --- a/shell/view/Shell.py +++ b/shell/view/Shell.py @@ -160,10 +160,20 @@ class Shell(gobject.GObject): self._activities_starting.add(activity_type) activityfactory.create(activity_type) + def take_activity_screenshot(self): + home_model = self._model.get_home() + service = home_model.get_active_activity().get_service() + service.TakeScreenshot() + def set_zoom_level(self, level): - if level == self._model.get_zoom_level(): + old_level = self._model.get_zoom_level() + if level == old_level: return + if old_level == ShellModel.ZOOM_ACTIVITY and \ + not self.get_frame().visible: + self.take_activity_screenshot() + if level == ShellModel.ZOOM_ACTIVITY: if self._pending_host is not None: self._pending_host.present() @@ -173,6 +183,29 @@ class Shell(gobject.GObject): self._screen.toggle_showing_desktop(True) self._home_window.set_zoom_level(level) + def toggle_activity_fullscreen(self): + if self._model.get_zoom_level() == ShellModel.ZOOM_ACTIVITY: + self.get_current_activity().toggle_fullscreen() + + def activate_previous_activity(self): + home_model = self._model.get_home() + activity = home_model.get_previous_activity() + if activity: + self.take_activity_screenshot() + activity.get_window().activate(1) + + def activate_next_activity(self): + home_model = self._model.get_home() + activity = home_model.get_next_activity() + if activity: + self.take_activity_screenshot() + activity.get_window().activate(1) + + def close_current_activity(self): + self.take_activity_screenshot() + if self._model.get_zoom_level() == ShellModel.ZOOM_ACTIVITY: + self.get_current_activity().close() + def get_current_activity(self): return self._current_host diff --git a/shell/view/keyhandler.py b/shell/view/keyhandler.py index 6a8fb9b5..007bf2dd 100644 --- a/shell/view/keyhandler.py +++ b/shell/view/keyhandler.py @@ -32,29 +32,34 @@ _BRIGHTNESS_MAX = 15 _VOLUME_MAX = 100 _actions_table = { - 'F1' : 'zoom_mesh', - 'F2' : 'zoom_friends', - 'F3' : 'zoom_home', - 'F4' : 'zoom_activity', - 'F9' : 'brightness_down', - 'F10' : 'brightness_up', - 'F9' : 'brightness_min', - 'F10' : 'brightness_max', - 'F11' : 'volume_down', - 'F12' : 'volume_up', - 'F11' : 'volume_min', - 'F12' : 'volume_max', - '1' : 'screenshot', - 'equal' : 'console', - '0' : 'console', - 'f' : 'frame', - '0x93' : 'frame', - 'o' : 'overlay', - '0xE0' : 'overlay', - '0xEB' : 'rotate', - 'r' : 'rotate', - 'Tab' : 'home', - 'q' : 'quit_emulator', + 'F1' : 'zoom_mesh', + 'F2' : 'zoom_friends', + 'F3' : 'zoom_home', + 'F4' : 'zoom_activity', + 'F9' : 'brightness_down', + 'F10' : 'brightness_up', + 'F9' : 'brightness_min', + 'F10' : 'brightness_max', + 'F11' : 'volume_down', + 'F12' : 'volume_up', + 'F11' : 'volume_min', + 'F12' : 'volume_max', + '1' : 'screenshot', + 'equal' : 'console', + '0' : 'console', + 'f' : 'frame', + '0x93' : 'frame', + 'o' : 'overlay', + '0xE0' : 'overlay', + '0xEB' : 'rotate', + 'r' : 'rotate', + 'q' : 'quit_emulator', + 'tab' : 'next_window', + 'n' : 'next_window', + 'tab' : 'previous_window', + 'p' : 'previous_window', + 'escape' : 'close_window', + 'q' : 'close_window' } class KeyHandler(object): @@ -103,6 +108,15 @@ class KeyHandler(object): else: hw_manager.set_display_mode(hardwaremanager.COLOR_MODE) + def handle_previous_window(self): + self._shell.activate_previous_activity() + + def handle_next_window(self): + self._shell.activate_next_activity() + + def handle_close_window(self): + self._shell.close_current_activity() + def handle_zoom_mesh(self): self._shell.set_zoom_level(ShellModel.ZOOM_MESH) @@ -166,10 +180,6 @@ class KeyHandler(object): pid = int(os.environ['SUGAR_EMULATOR_PID']) os.kill(pid, signal.SIGTERM) - def handle_home(self): - # FIXME: finish alt+tab support - pass - def _key_pressed_cb(self, grabber, keycode, state): key = grabber.get_key(keycode, state) logging.debug('_key_pressed_cb: %i %i %s' % (keycode, state, key))