Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSantiago Collazo <scollazo@activitycentral.com>2012-12-18 05:40:25 (GMT)
committer Santiago Collazo <scollazo@activitycentral.com>2012-12-18 05:40:25 (GMT)
commit1f109e2d847d91a8677bb943ddcbe253fef8c4ba (patch)
treefec6ca056b27aff729612c7a6d6dc2048b3e4f8b
parent68abdada052fb1d7b8fc1da62764d957001cca7d (diff)
parent0c908891fbfa8c16e4aac66809da5fa4b0c7195f (diff)
Merge remote-tracking branch 'ajay/0.97.7-as-base' into devel
-rw-r--r--configure.ac4
-rw-r--r--extensions/deviceicon/network.py2
-rw-r--r--src/jarabe/desktop/grid.py2
-rw-r--r--src/jarabe/desktop/meshbox.py29
-rw-r--r--src/jarabe/journal/detailview.py4
-rw-r--r--src/jarabe/journal/expandedentry.py5
-rw-r--r--src/jarabe/journal/keepicon.py34
-rw-r--r--src/jarabe/journal/listview.py14
-rw-r--r--src/jarabe/model/filetransfer.py67
-rw-r--r--src/jarabe/view/tabbinghandler.py51
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()