diff options
author | Santiago Collazo <scollazo@activitycentral.com> | 2012-12-18 05:40:25 (GMT) |
---|---|---|
committer | Santiago Collazo <scollazo@activitycentral.com> | 2012-12-18 05:40:25 (GMT) |
commit | 1f109e2d847d91a8677bb943ddcbe253fef8c4ba (patch) | |
tree | fec6ca056b27aff729612c7a6d6dc2048b3e4f8b | |
parent | 68abdada052fb1d7b8fc1da62764d957001cca7d (diff) | |
parent | 0c908891fbfa8c16e4aac66809da5fa4b0c7195f (diff) |
Merge remote-tracking branch 'ajay/0.97.7-as-base' into devel
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | extensions/deviceicon/network.py | 2 | ||||
-rw-r--r-- | src/jarabe/desktop/grid.py | 2 | ||||
-rw-r--r-- | src/jarabe/desktop/meshbox.py | 29 | ||||
-rw-r--r-- | src/jarabe/journal/detailview.py | 4 | ||||
-rw-r--r-- | src/jarabe/journal/expandedentry.py | 5 | ||||
-rw-r--r-- | src/jarabe/journal/keepicon.py | 34 | ||||
-rw-r--r-- | src/jarabe/journal/listview.py | 14 | ||||
-rw-r--r-- | src/jarabe/model/filetransfer.py | 67 | ||||
-rw-r--r-- | src/jarabe/view/tabbinghandler.py | 51 |
10 files changed, 144 insertions, 68 deletions
diff --git a/configure.ac b/configure.ac index 0c19373..97fcf0f 100644 --- a/configure.ac +++ b/configure.ac @@ -1,11 +1,11 @@ -AC_INIT([Sugar],[0.98.1],[],[sugar]) +AC_INIT([Sugar],[0.98.2],[],[sugar]) AC_PREREQ([2.59]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([configure.ac]) -SUCROSE_VERSION="0.98.1" +SUCROSE_VERSION="0.98.2" AC_SUBST(SUCROSE_VERSION) AM_INIT_AUTOMAKE([1.9 foreign dist-bzip2 no-dist-gzip]) diff --git a/extensions/deviceicon/network.py b/extensions/deviceicon/network.py index a6bd213..14bb048 100644 --- a/extensions/deviceicon/network.py +++ b/extensions/deviceicon/network.py @@ -905,7 +905,7 @@ class GsmDeviceView(TrayIcon): gsm_state = _GSM_STATE_NOT_READY elif (state >= network.NM_DEVICE_STATE_PREPARE) and \ - (state <= network.NM_DEVICE_STATE_IP_CONFIG): + (state < network.NM_DEVICE_STATE_ACTIVATED): gsm_state = _GSM_STATE_CONNECTING elif state == network.NM_DEVICE_STATE_FAILED: diff --git a/src/jarabe/desktop/grid.py b/src/jarabe/desktop/grid.py index 9d6d820..83404e2 100644 --- a/src/jarabe/desktop/grid.py +++ b/src/jarabe/desktop/grid.py @@ -201,9 +201,9 @@ class Grid(SugarExt.Grid): intersects_, intersection = Gdk.rectangle_intersect( child_rect, self._child_rects[c]) if c != child and intersection.width > 0: + collision_found = True if (c not in self._locked_children and c not in self._collisions): - collision_found = True self._collisions.append(c) if collision_found: diff --git a/src/jarabe/desktop/meshbox.py b/src/jarabe/desktop/meshbox.py index 9029f7a..5ad9c94 100644 --- a/src/jarabe/desktop/meshbox.py +++ b/src/jarabe/desktop/meshbox.py @@ -30,7 +30,8 @@ from sugar3.graphics.icon import Icon from sugar3.graphics.icon import CanvasIcon from sugar3.graphics import style from sugar3.graphics.palette import Palette -from sugar3.graphics.menuitem import MenuItem +from sugar3.graphics.palettemenu import PaletteMenuBox +from sugar3.graphics.palettemenu import PaletteMenuItem from jarabe.model import neighborhood from jarabe.model.buddy import get_owner_instance @@ -61,9 +62,9 @@ class _ActivityIcon(CanvasIcon): size=style.STANDARD_ICON_SIZE): CanvasIcon.__init__(self, file_name=file_name, xo_color=xo_color, pixel_size=size) + self._model = model - self.connect('button-release-event', - self.__button_release_event_cb) + self.palette_invoker.props.toggle_palette = True def create_palette(self): primary_text = GLib.markup_escape_text(self._model.bundle.get_name()) @@ -79,23 +80,27 @@ class _ActivityIcon(CanvasIcon): private = self._model.props.private joined = get_owner_instance() in self._model.props.buddies + menu_box = PaletteMenuBox() + if joined: - item = MenuItem(_('Resume'), 'activity-start') + item = PaletteMenuItem(_('Resume')) + icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='activity-start') + item.set_image(icon) item.connect('activate', self.__palette_item_clicked_cb) - item.show() - palette.menu.append(item) + menu_box.append_item(item) elif not private: - item = MenuItem(_('Join'), 'activity-start') + item = PaletteMenuItem(_('Join')) + icon = Icon(icon_size=Gtk.IconSize.MENU, icon_name='activity-start') + item.set_image(icon) item.connect('activate', self.__palette_item_clicked_cb) - item.show() - palette.menu.append(item) + menu_box.append_item(item) + + palette.set_content(menu_box) + menu_box.show_all() self.connect_to_palette_pop_events(palette) return palette - def __button_release_event_cb(self, widget, event): - self.props.palette.popup(immediate=True, state=Palette.SECONDARY) - def __palette_item_clicked_cb(self, item): bundle = self._model.get_bundle() misc.launch(bundle, activity_id=self._model.activity_id, diff --git a/src/jarabe/journal/detailview.py b/src/jarabe/journal/detailview.py index c7748ed..ade8718 100644 --- a/src/jarabe/journal/detailview.py +++ b/src/jarabe/journal/detailview.py @@ -99,7 +99,9 @@ class BackBar(Gtk.EventBox): self.add(hbox) if Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL: - hbox.reverse() + # Reverse hbox children. + for child in hbox.get_children(): + hbox.reorder_child(child, 0) self.connect('enter-notify-event', self.__enter_notify_event_cb) self.connect('leave-notify-event', self.__leave_notify_event_cb) diff --git a/src/jarabe/journal/expandedentry.py b/src/jarabe/journal/expandedentry.py index 16d1988..835881d 100644 --- a/src/jarabe/journal/expandedentry.py +++ b/src/jarabe/journal/expandedentry.py @@ -47,6 +47,7 @@ class Separator(Gtk.VBox): class BuddyList(Gtk.Alignment): def __init__(self, buddies): Gtk.Alignment.__init__(self) + self.set(0, 0, 0, 0) hbox = Gtk.HBox() for buddy in buddies: @@ -105,7 +106,9 @@ class ExpandedEntry(Gtk.EventBox): header.pack_start(self._date, False, False, style.DEFAULT_SPACING) if Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL: - header.reverse() + # Reverse header children. + for child in header.get_children(): + header.reorder_child(child, 0) # First body column self._preview_box = Gtk.Frame() diff --git a/src/jarabe/journal/keepicon.py b/src/jarabe/journal/keepicon.py index 9c7b7d5..cfc227f 100644 --- a/src/jarabe/journal/keepicon.py +++ b/src/jarabe/journal/keepicon.py @@ -16,7 +16,6 @@ from gi.repository import Gtk from gi.repository import GConf -import logging from sugar3.graphics.icon import Icon from sugar3.graphics import style @@ -26,6 +25,8 @@ from jarabe.journal import model class KeepIcon(Gtk.ToggleButton): + __gtype_name__ = 'SugarKeepIcon' + def __init__(self): Gtk.ToggleButton.__init__(self) self.set_relief(Gtk.ReliefStyle.NONE) @@ -37,16 +38,36 @@ class KeepIcon(Gtk.ToggleButton): self.connect('toggled', self.__toggled_cb) self.connect('leave-notify-event', self.__leave_notify_event_cb) self.connect('enter-notify-event', self.__enter_notify_event_cb) + self.connect('button-press-event', self.__button_press_event_cb) + self.connect('button-release-event', self.__button_release_event_cb) + + client = GConf.Client.get_default() + self._xo_color = XoColor(client.get_string( + '/desktop/sugar/user/color')) + + def do_get_preferred_width(self): + return 0, style.GRID_CELL_SIZE + + def do_get_preferred_height(self): + return 0, style.GRID_CELL_SIZE + + def __button_press_event_cb(self, widget, event): + # We need to use a custom CSS class because in togglebuttons + # the 'active' class doesn't only match the button press, they + # can be left in the active state. + style_context = self.get_style_context() + style_context.add_class('toggle-press') + + def __button_release_event_cb(self, widget, event): + style_context = self.get_style_context() + style_context.remove_class('toggle-press') def __toggled_cb(self, widget): if model.is_current_mount_point_for_remote_share(model.DETAIL_VIEW): return if self.get_active(): - client = GConf.Client.get_default() - color = XoColor(client.get_string('/desktop/sugar/user/color')) - self._icon.props.xo_color = color - logging.debug('KEEPICON: setting xo_color') + self._icon.props.xo_color = self._xo_color else: self._icon.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg() self._icon.props.fill_color = style.COLOR_TRANSPARENT.get_svg() @@ -56,11 +77,12 @@ class KeepIcon(Gtk.ToggleButton): return if not self.get_active(): - self._icon.props.fill_color = style.COLOR_BUTTON_GREY.get_svg() + self._icon.props.xo_color = self._xo_color def __leave_notify_event_cb(self, icon, event): if model.is_current_mount_point_for_remote_share(model.DETAIL_VIEW): return if not self.get_active(): + self._icon.props.stroke_color = style.COLOR_BUTTON_GREY.get_svg() self._icon.props.fill_color = style.COLOR_TRANSPARENT.get_svg() diff --git a/src/jarabe/journal/listview.py b/src/jarabe/journal/listview.py index eade19b..5a14c4c 100644 --- a/src/jarabe/journal/listview.py +++ b/src/jarabe/journal/listview.py @@ -193,13 +193,15 @@ class BaseListView(Gtk.Bin): ListModel.COLUMN_TITLE) self.tree_view.append_column(self._title_column) - buddies_column = Gtk.TreeViewColumn() - buddies_column.props.sizing = Gtk.TreeViewColumnSizing.FIXED - self.tree_view.append_column(buddies_column) for column_index in [ListModel.COLUMN_BUDDY_1, ListModel.COLUMN_BUDDY_2, ListModel.COLUMN_BUDDY_3]: + + buddies_column = Gtk.TreeViewColumn() + buddies_column.props.sizing = Gtk.TreeViewColumnSizing.FIXED + self.tree_view.append_column(buddies_column) + cell_icon = CellRendererBuddy(self.tree_view, column_index=column_index) buddies_column.pack_start(cell_icon, True) @@ -264,6 +266,12 @@ class BaseListView(Gtk.Bin): if buddy is None: cell.props.visible = False return + # FIXME workaround for pygobject bug, see + # https://bugzilla.gnome.org/show_bug.cgi?id=689277 + # + # add_attribute with 'buddy' attribute in the cell should take + # care of setting it. + cell.props.buddy = buddy progress = tree_model[tree_iter][ListModel.COLUMN_PROGRESS] cell.props.visible = progress >= 100 diff --git a/src/jarabe/model/filetransfer.py b/src/jarabe/model/filetransfer.py index 820df74..f121ec2 100644 --- a/src/jarabe/model/filetransfer.py +++ b/src/jarabe/model/filetransfer.py @@ -20,6 +20,7 @@ import socket from gi.repository import GObject from gi.repository import Gio +from gi.repository import GLib import dbus from telepathy.interfaces import CONNECTION_INTERFACE_REQUESTS, CHANNEL from telepathy.constants import CONNECTION_HANDLE_TYPE_CONTACT, \ @@ -73,30 +74,37 @@ class StreamSplicer(GObject.GObject): self._pending_buffers = [] def start(self): - self._input_stream.read_async(self._CHUNK_SIZE, self.__read_async_cb, - GObject.PRIORITY_LOW) - - def __read_async_cb(self, input_stream, result): - data = input_stream.read_finish(result) - - if not data: - logging.debug('closing input stream') - self._input_stream.close() + self._input_stream.read_bytes_async( + self._CHUNK_SIZE, GLib.PRIORITY_LOW, + None, self.__read_async_cb, None) + + def __read_async_cb(self, input_stream, result, user_data): + data = input_stream.read_bytes_finish(result) + + if data is None: + # TODO: an error occured. Report something + logging.error('An error occured in the file transfer.') + elif data.get_size() == 0: + # We read the file completely + logging.debug('Closing input stream. Reading finished.') + self._input_stream.close(None) else: + logging.debug('Data received (bytes): %s', data.get_size()) self._pending_buffers.append(data) - self._input_stream.read_async(self._CHUNK_SIZE, - self.__read_async_cb, - GObject.PRIORITY_LOW) + self._input_stream.read_bytes_async( + self._CHUNK_SIZE, GLib.PRIORITY_LOW, + None, self.__read_async_cb, None) self._write_next_buffer() def __write_async_cb(self, output_stream, result, user_data): - count_ = output_stream.write_finish(result) + size = output_stream.write_bytes_finish(result) + logging.debug('Size written (bytes): %s', size) if not self._pending_buffers and \ not self._output_stream.has_pending() and \ not self._input_stream.has_pending(): - logging.debug('closing output stream') - output_stream.close() + logging.debug('Closing output stream. Writing finished.') + output_stream.close(None) self.emit('finished') else: self._write_next_buffer() @@ -104,11 +112,9 @@ class StreamSplicer(GObject.GObject): def _write_next_buffer(self): if self._pending_buffers and not self._output_stream.has_pending(): data = self._pending_buffers.pop(0) - # TODO: we pass the buffer as user_data because of - # http://bugzilla.gnome.org/show_bug.cgi?id=564102 - self._output_stream.write_async(data, self.__write_async_cb, - GObject.PRIORITY_LOW, - user_data=data) + self._output_stream.write_bytes_async( + data, GLib.PRIORITY_LOW, None, + self.__write_async_cb, None) class BaseFileTransfer(GObject.GObject): @@ -215,11 +221,12 @@ class IncomingFileTransfer(BaseFileTransfer): # close the fd when it goes out of scope self._socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self._socket.connect(self._socket_address) - input_stream = Gio.unix.InputStream(self._socket.fileno(), True) + input_stream = Gio.UnixInputStream.new(self._socket.fileno(), True) - destination_file = Gio.File(self.destination_path) + destination_file = Gio.File.new_for_path(self.destination_path) if self.initial_offset == 0: - output_stream = destination_file.create() + output_stream = destination_file.create( + Gio.FileCreateFlags.PRIVATE, None) else: output_stream = destination_file.append_to() @@ -277,10 +284,11 @@ class OutgoingFileTransfer(BaseFileTransfer): # closes the fd when it goes out of scope self._socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self._socket.connect(self._socket_address) - output_stream = Gio.unix.OutputStream(self._socket.fileno(), True) + output_stream = Gio.UnixOutputStream.new( + self._socket.fileno(), True) logging.debug('opening %s for reading', self._file_name) - input_stream = Gio.File(self._file_name).read() + input_stream = Gio.File.new_for_path(self._file_name).read(None) if self.initial_offset > 0: input_stream.skip(self.initial_offset) @@ -356,9 +364,12 @@ def file_transfer_available(): if __name__ == '__main__': import tempfile - test_file_name = '/home/tomeu/isos/Soas2-200904031934.iso' - test_input_stream = Gio.File(test_file_name).read() - test_output_stream = Gio.File(tempfile.mkstemp()[1]).append_to() + test_file_name = '/home/humitos/test.py' + test_temp_file = tempfile.mkstemp()[1] + print test_temp_file + test_input_stream = Gio.File.new_for_path(test_file_name).read(None) + test_output_stream = Gio.File.new_for_path(test_temp_file)\ + .append_to(Gio.FileCreateFlags.PRIVATE, None) # TODO: Use splice_async when it gets implemented splicer = StreamSplicer(test_input_stream, test_output_stream) diff --git a/src/jarabe/view/tabbinghandler.py b/src/jarabe/view/tabbinghandler.py index 0d42c3f..66dd7ca 100644 --- a/src/jarabe/view/tabbinghandler.py +++ b/src/jarabe/view/tabbinghandler.py @@ -32,30 +32,55 @@ class TabbingHandler(object): self._tabbing = False self._modifier = modifier self._timeout = None - - def _start_tabbing(self): + self._keyboard = None + self._mouse = None + + display = Gdk.Display.get_default() + device_manager = display.get_device_manager() + devices = device_manager.list_devices(Gdk.DeviceType.MASTER) + for device in devices: + if device.get_source() == Gdk.InputSource.KEYBOARD: + self._keyboard = device + if device.get_source() == Gdk.InputSource.MOUSE: + self._mouse = device + + def _start_tabbing(self, event_time): if not self._tabbing: logging.debug('Grabing the input.') screen = Gdk.Screen.get_default() window = screen.get_root_window() - keyboard_grab_result = Gdk.keyboard_grab(window, False) - pointer_grab_result = Gdk.pointer_grab(window) + + keyboard_grab_result = self._keyboard.grab(window, + Gdk.GrabOwnership.WINDOW, + False, + Gdk.EventMask.KEY_PRESS_MASK | + Gdk.EventMask.KEY_RELEASE_MASK, + None, + event_time) + + mouse_grab_result = self._mouse.grab(window, + Gdk.GrabOwnership.WINDOW, + False, + Gdk.EventMask.BUTTON_PRESS_MASK | + Gdk.EventMask.BUTTON_RELEASE_MASK, + None, + event_time) self._tabbing = (keyboard_grab_result == Gdk.GrabStatus.SUCCESS and - pointer_grab_result == Gdk.GrabStatus.SUCCESS) + mouse_grab_result == Gdk.GrabStatus.SUCCESS) # Now test that the modifier is still active to prevent race # conditions. We also test if one of the grabs failed. - mask = window.get_pointer()[2] + mask = window.get_device_position(self._mouse)[3] if not self._tabbing or not (mask & self._modifier): logging.debug('Releasing grabs again.') # ungrab keyboard/pointer if the grab was successfull. if keyboard_grab_result == Gdk.GrabStatus.SUCCESS: - Gdk.keyboard_ungrab() - if pointer_grab_result == Gdk.GrabStatus.SUCCESS: - Gdk.pointer_ungrab() + self._keyboard.ungrab(event_time) + if mouse_grab_result == Gdk.GrabStatus.SUCCESS: + self._mouse.ungrab(event_time) self._tabbing = False else: @@ -85,7 +110,7 @@ class TabbingHandler(object): def next_activity(self, event_time): if not self._tabbing: first_switch = True - self._start_tabbing() + self._start_tabbing(event_time) else: first_switch = False @@ -108,7 +133,7 @@ class TabbingHandler(object): def previous_activity(self, event_time): if not self._tabbing: first_switch = True - self._start_tabbing() + self._start_tabbing(event_time) else: first_switch = False @@ -134,8 +159,8 @@ class TabbingHandler(object): next_activity.get_window().activate(event_time) def stop(self, event_time): - Gdk.keyboard_ungrab() - Gdk.pointer_ungrab() + self._keyboard.ungrab(event_time) + self._mouse.ungrab(event_time) self._tabbing = False self._frame.hide() |