diff --git a/lib/src/sugar-key-grabber.c b/lib/src/sugar-key-grabber.c index ee428cb6..b086ba07 100644 --- a/lib/src/sugar-key-grabber.c +++ b/lib/src/sugar-key-grabber.c @@ -103,11 +103,27 @@ get_key_from_event(SugarKeyGrabber *grabber, XEvent *xev) keycode = xev->xkey.keycode; state = xev->xkey.state; + if(grabber->last_key_pressed == keycode) { + grabber->last_key_pressed = 0; + } + if(grabber->last_key_pressed_modifier == state) { + grabber->last_key_pressed_modifier = 0; + } + for (l = grabber->keys; l != NULL; l = l->next) { Key *keyinfo = (Key *)l->data; - if (keyinfo->keycode == keycode && - (state & USED_MODS) == keyinfo->state) { - return g_strdup(keyinfo->key); + if (keyinfo->keycode == keycode) { + if (xev->type == KeyPress && + (state & USED_MODS) == keyinfo->state) { + + return g_strdup(keyinfo->key); + } else if (xev->type == KeyRelease) { + if(!grabber->last_key_pressed && + !grabber->last_key_pressed_modifier) { + + return g_strdup(keyinfo->key); + } + } } } @@ -139,6 +155,9 @@ filter_events(GdkXEvent *xevent, GdkEvent *event, gpointer data) key = get_key_from_event(grabber, xevent); if (key) { + grabber->last_key_pressed = xev->xkey.keycode; + grabber->last_key_pressed_modifier = xev->xkey.state; + g_signal_emit (grabber, signals[KEY_PRESSED], 0, key); g_free(key); @@ -161,6 +180,8 @@ sugar_key_grabber_init(SugarKeyGrabber *grabber) screen = gdk_screen_get_default(); grabber->root = gdk_screen_get_root_window(screen); grabber->keys = NULL; + grabber->last_key_pressed = 0; + grabber->last_key_pressed_modifier = 0; gdk_window_add_filter(grabber->root, filter_events, grabber); } diff --git a/lib/src/sugar-key-grabber.h b/lib/src/sugar-key-grabber.h index 720a9310..e45c329b 100644 --- a/lib/src/sugar-key-grabber.h +++ b/lib/src/sugar-key-grabber.h @@ -39,6 +39,8 @@ struct _SugarKeyGrabber { GdkWindow *root; GList *keys; + guint last_key_pressed; + guint last_key_pressed_modifier; }; struct _SugarKeyGrabberClass { diff --git a/services/presence2/server_plugin.py b/services/presence2/server_plugin.py index bd15bcd5..3c0986c2 100644 --- a/services/presence2/server_plugin.py +++ b/services/presence2/server_plugin.py @@ -358,9 +358,6 @@ class ServerPlugin(gobject.GObject): except dbus.DBusException, e: if str(e).startswith("org.freedesktop.DBus.Error.NoReply"): raise InvalidBuddyError("couldn't get properties") - except KeyError, e: - if str(e) == "'%s'" % CONN_INTERFACE_BUDDY_INFO: - raise InvalidBuddyError("server doesn't support BuddyInfo interface") if not props.has_key('color'): raise InvalidBuddyError("no color") diff --git a/shell/data/Makefile.am b/shell/data/Makefile.am index 1f0f9c05..2709c921 100644 --- a/shell/data/Makefile.am +++ b/shell/data/Makefile.am @@ -1,4 +1,7 @@ confdir = $(pkgdatadir) conf_DATA = kbdconfig -EXTRA_DIST = $(conf_DATA) +imagedir = $(pkgdatadir) +image_DATA = default-picture.png + +EXTRA_DIST = $(conf_DATA) $(image_DATA) diff --git a/shell/data/default-picture.png b/shell/data/default-picture.png new file mode 100644 index 00000000..e26b9b01 Binary files /dev/null and b/shell/data/default-picture.png differ diff --git a/shell/hardware/nmclient.py b/shell/hardware/nmclient.py index 8f542150..54f67624 100644 --- a/shell/hardware/nmclient.py +++ b/shell/hardware/nmclient.py @@ -300,7 +300,6 @@ class Device(gobject.GObject): # Make sure the old one doesn't get a stuck state if self._active_network: - self._active_network.disconnect(self._ssid_sid) self._active_network.set_state(NETWORK_STATE_NOTCONNECTED) self._active_network = network diff --git a/shell/hardware/nminfo.py b/shell/hardware/nminfo.py index f512a8b8..2b59f91b 100644 --- a/shell/hardware/nminfo.py +++ b/shell/hardware/nminfo.py @@ -434,9 +434,8 @@ class NMInfo(object): is closed. """ if canceled: - e = CanceledKeyRequestError("Request was canceled.") # key dialog dialog was canceled; send the error back to NM - async_err_cb(e) + async_err_cb(CanceledKeyRequestError()) return if not key or not auth_alg: diff --git a/shell/hardware/wepkeydialog.py b/shell/hardware/wepkeydialog.py index 13c7908b..e4d11745 100644 --- a/shell/hardware/wepkeydialog.py +++ b/shell/hardware/wepkeydialog.py @@ -23,7 +23,7 @@ IW_AUTH_ALG_SHARED_KEY = 0x00000002 class WEPKeyDialog(gtk.Dialog): def __init__(self, net, async_cb, async_err_cb): - gtk.Dialog.__init__(self) + gtk.Dialog.__init__(self, flags=gtk.DIALOG_MODAL) self.set_title("Wireless Key Required") self._net = net @@ -48,6 +48,8 @@ class WEPKeyDialog(gtk.Dialog): self.set_default_response(gtk.RESPONSE_OK) self._update_response_sensitivity() + self._entry.grab_focus() + def get_key(self): return self._entry.get_text() diff --git a/shell/intro/intro.py b/shell/intro/intro.py index 83c88da8..55aa1354 100644 --- a/shell/intro/intro.py +++ b/shell/intro/intro.py @@ -63,6 +63,7 @@ class IntroFallbackVideo(gtk.EventBox): self._image = gtk.Image() self._image.set_from_stock(gtk.STOCK_OPEN, -1) self.add(self._image) + self._image.show() self.connect('button-press-event', self._button_press_event_cb) def play(self): @@ -80,12 +81,15 @@ class IntroFallbackVideo(gtk.EventBox): resp = chooser.run() if resp == gtk.RESPONSE_ACCEPT: fname = chooser.get_filename() - pixbuf = gtk.gdk.pixbuf_new_from_file(fname) - self.emit('pixbuf', pixbuf) + self.load_image(fname) chooser.hide() chooser.destroy() return True + def load_image(self, path): + pixbuf = gtk.gdk.pixbuf_new_from_file(path) + self.emit('pixbuf', pixbuf) + class VideoBox(hippo.CanvasBox, hippo.CanvasItem): __gtype_name__ = "SugarVideoBox" @@ -138,6 +142,10 @@ class VideoBox(hippo.CanvasBox, hippo.CanvasItem): self._img_widget = hippo.CanvasWidget() self._img_widget.props.widget = self._img + if not has_webcam: + path = os.path.join(env.get_data_dir(),'default-picture.png') + self._video.load_image(path) + def _clear_image_cb(self, widget, event): del self._pixbuf self._pixbuf = None diff --git a/shell/model/devices/devicesmodel.py b/shell/model/devices/devicesmodel.py index df5e6fa0..735b063c 100644 --- a/shell/model/devices/devicesmodel.py +++ b/shell/model/devices/devicesmodel.py @@ -21,7 +21,7 @@ class DevicesModel(gobject.GObject): gobject.GObject.__init__(self) self._devices = {} - self.add_device(battery.Device()) + #self.add_device(battery.Device()) self._observe_network_manager() diff --git a/sugar-emulator b/sugar-emulator index f951649a..e83c20a4 100755 --- a/sugar-emulator +++ b/sugar-emulator @@ -39,7 +39,7 @@ from sugar.emulator import Emulator import _sugar if len(sys.argv) == 1: - program = 'sugar-shell' + program = 'shell/sugar-shell' else: program = sys.argv[1] @@ -58,7 +58,7 @@ emulator = Emulator(width, height, fullscreen, dpi) emulator.start() if sourcedir: - program = os.path.join(os.path.join(sourcedir, 'shell'), program) + program = os.path.join(sourcedir, program) os.execlp('dbus-launch', 'dbus-launch', '--exit-with-session', program, sourcedir) else: os.execlp('dbus-launch', 'dbus-launch', '--exit-with-session', program) diff --git a/tests/data/stock-close.svg b/tests/data/stock-close.svg deleted file mode 100644 index 0354c634..00000000 --- a/tests/data/stock-close.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - -]> - - - - - diff --git a/tests/test-button.py b/tests/test-button.py index e452811c..0f3ded26 100755 --- a/tests/test-button.py +++ b/tests/test-button.py @@ -29,10 +29,6 @@ from sugar.graphics.entry import Entry def _button_activated_cb(button): print "_button_activated_cb" -import os -theme = gtk.icon_theme_get_default() -theme.prepend_search_path(os.path.join(os.path.dirname(__file__), 'data')) - window = gtk.Window() window.connect("destroy", lambda w: gtk.main_quit()) window.show() diff --git a/tests/test-entry.py b/tests/test-entry.py index d83c07d0..80f0e234 100755 --- a/tests/test-entry.py +++ b/tests/test-entry.py @@ -30,10 +30,6 @@ def _entry_button_activated_cb(entry, action_id): print "_entry_button_activated_cb: " + str(action_id) entry.props.text = '' -import os -theme = gtk.icon_theme_get_default() -theme.prepend_search_path(os.path.join(os.path.dirname(__file__), 'data')) - window = gtk.Window() window.connect("destroy", lambda w: gtk.main_quit()) window.show() diff --git a/tests/test-label.py b/tests/test-label.py index 2a238a26..6e7b6b28 100755 --- a/tests/test-label.py +++ b/tests/test-label.py @@ -22,10 +22,6 @@ from sugar.graphics.toolbar import Toolbar from sugar.graphics.label import Label from sugar.graphics.iconbutton import IconButton -import os -theme = gtk.icon_theme_get_default() -theme.prepend_search_path(os.path.join(os.path.dirname(__file__), 'data')) - BUTTON_DELETE = 1 window = gtk.Window() diff --git a/tests/test-option-menu.py b/tests/test-option-menu.py index f320afcc..79748390 100755 --- a/tests/test-option-menu.py +++ b/tests/test-option-menu.py @@ -30,10 +30,6 @@ from sugar.graphics.iconbutton import IconButton def _option_menu_changed_cb(option_menu): print '_option_menu_activated_cb: %i' % option_menu.props.value -import os -theme = gtk.icon_theme_get_default() -theme.prepend_search_path(os.path.join(os.path.dirname(__file__), 'data')) - window = gtk.Window() window.connect("destroy", lambda w: gtk.main_quit()) window.show() diff --git a/tools/build-snapshot.sh b/tools/build-snapshot.sh index 717caeec..8d46550a 100755 --- a/tools/build-snapshot.sh +++ b/tools/build-snapshot.sh @@ -1,6 +1,6 @@ VERSION=0.63 DATE=`date +%Y%m%d` -RELEASE=2.44 +RELEASE=2.47 TARBALL=sugar-$VERSION-$RELEASE.${DATE}git.tar.bz2 rm sugar-$VERSION.tar.bz2