From 78dbdecb87090e544c376577405e5bebb1a14486 Mon Sep 17 00:00:00 2001
From: Tomeu Vizoso <tomeu@sugarlabs.org>
Date: Mon, 24 Aug 2009 11:18:16 +0200
Subject: [PATCH] Start new activity instance when Alt key is hold pressed #1129
---
bin/sugar-session | 9 +++++----
src/jarabe/desktop/favoritesview.py | 17 +++++++++++++++--
src/jarabe/desktop/homebox.py | 2 ++
src/jarabe/desktop/homewindow.py | 9 +++++++++
src/jarabe/view/keyhandler.py | 28 +++++++++++++++++++++++++++-
5 files changed, 58 insertions(+), 7 deletions(-)
diff --git a/bin/sugar-session b/bin/sugar-session
index 1ce40a3..2d9bb98 100644
a
|
b
|
gettext.bindtextdomain('sugar', config.locale_path) |
45 | 45 | gettext.bindtextdomain('sugar-toolkit', config.locale_path) |
46 | 46 | gettext.textdomain('sugar') |
47 | 47 | |
48 | | from jarabe.desktop.homewindow import HomeWindow |
| 48 | from jarabe.desktop import homewindow |
49 | 49 | from jarabe.model import sound |
50 | 50 | from jarabe.view import launcher |
51 | 51 | from jarabe import intro |
… |
… |
def setup_journal_cb(): |
117 | 117 | from jarabe.journal import journalactivity |
118 | 118 | journalactivity.start() |
119 | 119 | |
120 | | def show_software_updates_cb(home_window): |
| 120 | def show_software_updates_cb(): |
121 | 121 | logging.debug('STARTUP: show_software_updates_cb') |
122 | 122 | if os.path.isfile(os.path.expanduser('~/.sugar-update')): |
| 123 | home_window = homewindow.get_instance() |
123 | 124 | home_window.get_home_box().show_software_updates_alert() |
124 | 125 | |
125 | 126 | def setup_notification_service_cb(): |
… |
… |
def main(): |
157 | 158 | |
158 | 159 | launcher.setup() |
159 | 160 | |
160 | | home_window = HomeWindow() |
| 161 | home_window = homewindow.get_instance() |
161 | 162 | home_window.show() |
162 | 163 | |
163 | 164 | gobject.idle_add(unfreeze_dcon_cb) |
… |
… |
def main(): |
166 | 167 | gobject.idle_add(setup_journal_cb) |
167 | 168 | gobject.idle_add(setup_notification_service_cb) |
168 | 169 | gobject.idle_add(setup_file_transfer_cb) |
169 | | gobject.idle_add(show_software_updates_cb, home_window) |
| 170 | gobject.idle_add(show_software_updates_cb) |
170 | 171 | |
171 | 172 | try: |
172 | 173 | gtk.main() |
diff --git a/src/jarabe/desktop/favoritesview.py b/src/jarabe/desktop/favoritesview.py
index 6ca8732..67e1d4a 100644
a
|
b
|
class FavoritesView(hippo.Canvas): |
92 | 92 | self._layout = None |
93 | 93 | self._alert = None |
94 | 94 | self._datastore_listener = DatastoreListener() |
| 95 | self._resume_mode = True |
95 | 96 | |
96 | 97 | # More DND stuff |
97 | 98 | self.add_events(gtk.gdk.BUTTON_PRESS_MASK | |
… |
… |
class FavoritesView(hippo.Canvas): |
130 | 131 | return |
131 | 132 | icon = ActivityIcon(activity_info, self._datastore_listener) |
132 | 133 | icon.props.size = style.STANDARD_ICON_SIZE |
| 134 | icon.set_resume_mode(self._resume_mode) |
133 | 135 | self._box.insert_sorted(icon, 0, self._layout.compare_activities) |
134 | 136 | self._layout.append(icon) |
135 | 137 | |
… |
… |
class FavoritesView(hippo.Canvas): |
335 | 337 | def __register_alert_response_cb(self, alert, response_id): |
336 | 338 | self.remove_alert() |
337 | 339 | |
| 340 | def set_resume_mode(self, resume_mode): |
| 341 | self._resume_mode = resume_mode |
| 342 | for icon in self._box.get_children(): |
| 343 | if hasattr(icon, 'set_resume_mode'): |
| 344 | icon.set_resume_mode(self._resume_mode) |
| 345 | |
338 | 346 | DS_DBUS_SERVICE = 'org.laptop.sugar.DataStore' |
339 | 347 | DS_DBUS_INTERFACE = 'org.laptop.sugar.DataStore' |
340 | 348 | DS_DBUS_PATH = '/org/laptop/sugar/DataStore' |
… |
… |
class ActivityIcon(CanvasIcon): |
400 | 408 | self._activity_info = activity_info |
401 | 409 | self._journal_entries = [] |
402 | 410 | self._hovering = False |
| 411 | self._resume_mode = True |
403 | 412 | |
404 | 413 | self.connect('hovering-changed', self.__hovering_changed_event_cb) |
405 | 414 | self.connect('button-release-event', self.__button_release_event_cb) |
… |
… |
class ActivityIcon(CanvasIcon): |
446 | 455 | |
447 | 456 | def _update(self): |
448 | 457 | self.palette = None |
449 | | if not self._journal_entries: |
| 458 | if not self._resume_mode or not self._journal_entries: |
450 | 459 | self.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg() |
451 | 460 | self.props.fill_color = style.COLOR_TRANSPARENT.get_svg() |
452 | 461 | else: |
… |
… |
class ActivityIcon(CanvasIcon): |
506 | 515 | |
507 | 516 | def _activate(self): |
508 | 517 | self.palette.popdown(immediate=True) |
509 | | if self._journal_entries: |
| 518 | if self._resume_mode and self._journal_entries: |
510 | 519 | entry = self._journal_entries[0] |
511 | 520 | |
512 | 521 | shell_model = shell.get_model() |
… |
… |
class ActivityIcon(CanvasIcon): |
548 | 557 | return registry.get_bundle_position(self.bundle_id, self.version) |
549 | 558 | fixed_position = property(_get_fixed_position, None) |
550 | 559 | |
| 560 | def set_resume_mode(self, resume_mode): |
| 561 | self._resume_mode = resume_mode |
| 562 | self._update() |
| 563 | |
551 | 564 | class FavoritePalette(ActivityPalette): |
552 | 565 | __gtype_name__ = 'SugarFavoritePalette' |
553 | 566 | |
diff --git a/src/jarabe/desktop/homebox.py b/src/jarabe/desktop/homebox.py
index 88da9d2..707c26a 100644
a
|
b
|
class HomeBox(gtk.VBox): |
141 | 141 | def focus_search_entry(self): |
142 | 142 | self._toolbar.search_entry.grab_focus() |
143 | 143 | |
| 144 | def set_resume_mode(self, resume_mode): |
| 145 | self._favorites_view.set_resume_mode(resume_mode) |
144 | 146 | |
145 | 147 | class HomeToolbar(gtk.Toolbar): |
146 | 148 | __gtype_name__ = 'SugarHomeToolbar' |
diff --git a/src/jarabe/desktop/homewindow.py b/src/jarabe/desktop/homewindow.py
index bbb0db1..6212970 100644
a
|
b
|
class HomeWindow(gtk.Window): |
141 | 141 | |
142 | 142 | def get_home_box(self): |
143 | 143 | return self._home_box |
| 144 | |
| 145 | _instance = None |
| 146 | |
| 147 | def get_instance(): |
| 148 | global _instance |
| 149 | if not _instance: |
| 150 | _instance = HomeWindow() |
| 151 | return _instance |
| 152 | |
diff --git a/src/jarabe/view/keyhandler.py b/src/jarabe/view/keyhandler.py
index 0505c52..c985cb5 100644
a
|
b
|
from jarabe.view.tabbinghandler import TabbingHandler |
35 | 35 | from jarabe.model.shell import ShellModel |
36 | 36 | from jarabe import config |
37 | 37 | from jarabe.journal import journalactivity |
| 38 | from jarabe.desktop import homewindow |
38 | 39 | |
39 | 40 | _VOLUME_STEP = sound.VOLUME_STEP |
40 | 41 | _VOLUME_MAX = 100 |
… |
… |
_actions_table = { |
63 | 64 | 'XF86Search' : 'open_search', |
64 | 65 | '<alt><shift>o' : 'open_search', |
65 | 66 | '<alt><shift>s' : 'say_text', |
| 67 | 'Alt_L' : 'disable_resume_mode', |
| 68 | 'Alt_R' : 'disable_resume_mode', |
66 | 69 | } |
67 | 70 | |
68 | 71 | SPEECH_DBUS_SERVICE = 'org.laptop.Speech' |
… |
… |
class KeyHandler(object): |
198 | 201 | def handle_open_search(self, event_time): |
199 | 202 | journalactivity.get_journal().focus_search() |
200 | 203 | |
| 204 | def handle_disable_resume_mode(self, event_time): |
| 205 | # TODO: KeyHandler should be a singleton and interested parties |
| 206 | # would listen to it. That way it wouldn't need to reference half |
| 207 | # of the shell classes. |
| 208 | home_box = homewindow.get_instance().get_home_box() |
| 209 | home_box.set_resume_mode(False) |
| 210 | |
201 | 211 | def _key_pressed_cb(self, grabber, keycode, state, event_time): |
202 | 212 | key = grabber.get_key(keycode, state) |
203 | 213 | logging.debug('_key_pressed_cb: %i %i %s' % (keycode, state, key)) |
204 | | if key: |
| 214 | if key is not None: |
205 | 215 | self._key_pressed = key |
206 | 216 | self._keycode_pressed = keycode |
207 | 217 | self._keystate_pressed = state |
… |
… |
class KeyHandler(object): |
232 | 242 | |
233 | 243 | return False |
234 | 244 | |
| 245 | def _is_resume_mode_keycode(self, keycode): |
| 246 | """See if the physical key pressed matches one of the keys that modify |
| 247 | the resume mode of the favorites view. |
| 248 | """ |
| 249 | keymap = gtk.gdk.keymap_get_default() |
| 250 | entries = keymap.get_entries_for_keycode(keycode) |
| 251 | for entry in entries: |
| 252 | if gtk.gdk.keyval_name(entry[0]) in ['Alt_L', 'Alt_R']: |
| 253 | return True |
| 254 | return False |
| 255 | |
235 | 256 | def _key_released_cb(self, grabber, keycode, state, event_time): |
| 257 | logging.debug('_key_released_cb: %i %i' % (keycode, state)) |
| 258 | if self._is_resume_mode_keycode(keycode): |
| 259 | home_box = homewindow.get_instance().get_home_box() |
| 260 | home_box.set_resume_mode(True) |
| 261 | |
236 | 262 | if self._tabbing_handler.is_tabbing(): |
237 | 263 | # We stop tabbing and switch to the new window as soon as the |
238 | 264 | # modifier key is raised again. |