Merge branch 'master' of git+ssh://dev.laptop.org/git/sugar

This commit is contained in:
Sayamindu Dasgupta 2007-11-27 21:57:32 +05:30
commit 0225360178
11 changed files with 234 additions and 47 deletions

3
NEWS
View File

@ -1,3 +1,6 @@
* #4941: Add menu entry with dialog to show About this XO (erikos)
* #5089: show frame shortly when adding object to clipboard (erikos)
* #5097: Fix pasting text between activities through the clipboard. (tomeu)
* #4660: Use improved PS API which streamlines ShareActivity process (smcv) * #4660: Use improved PS API which streamlines ShareActivity process (smcv)
0.70.1 0.70.1

View File

@ -504,12 +504,16 @@ class Activity(Window, gtk.Container):
self.save() self.save()
elif pspec.name == 'max-participants': elif pspec.name == 'max-participants':
self._max_participants = value self._max_participants = value
else:
Window.do_set_property(self, pspec, value)
def do_get_property(self, pspec): def do_get_property(self, pspec):
if pspec.name == 'active': if pspec.name == 'active':
return self._active return self._active
elif pspec.name == 'max-participants': elif pspec.name == 'max-participants':
return self._max_participants return self._max_participants
else:
return Window.do_get_property(self, pspec)
def get_id(self): def get_id(self):
"""Returns the activity id of the current instance of your activity. """Returns the activity id of the current instance of your activity.

View File

@ -474,7 +474,7 @@ class Palette(gtk.Window):
if self._group_id: if self._group_id:
group = palettegroup.get_group(self._group_id) group = palettegroup.get_group(self._group_id)
if group and group.is_up(): if group and group.is_up():
self._set_state(group.get_state()) self._set_state(self.PRIMARY)
immediate = True immediate = True
group.popdown() group.popdown()
@ -686,12 +686,19 @@ class WidgetInvoker(Invoker):
widget.connect('leave-notify-event', self._leave_notify_event_cb) widget.connect('leave-notify-event', self._leave_notify_event_cb)
def get_rect(self): def get_rect(self):
x, y = self._widget.window.get_origin()
allocation = self._widget.get_allocation() allocation = self._widget.get_allocation()
if self._widget.window is not None:
x, y = self._widget.window.get_origin()
else:
logging.warning(
"Trying to position palette with invoker that's not realized.")
x = 0
y = 0
if self._widget.flags() & gtk.NO_WINDOW: if self._widget.flags() & gtk.NO_WINDOW:
x += allocation.x x += allocation.x
y += allocation.y y += allocation.y
width = allocation.width width = allocation.width
height = allocation.height height = allocation.height

View File

@ -15,12 +15,73 @@
# Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA. # Boston, MA 02111-1307, USA.
import gobject
import gtk import gtk
import logging
from sugar.graphics.icon import Icon
class UnfullscreenButton(gtk.Window):
class Window(gtk.Window):
def __init__(self): def __init__(self):
gtk.Window.__init__(self) gtk.Window.__init__(self)
self.set_decorated(False)
self.set_resizable(False)
self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
self.set_border_width(0)
self.props.accept_focus = False
#Setup estimate of width, height
w, h = gtk.icon_size_lookup(gtk.ICON_SIZE_LARGE_TOOLBAR)
self._width = w
self._height = h
self.connect('size-request', self._size_request_cb)
screen = self.get_screen()
screen.connect('size-changed', self._screen_size_changed_cb)
self._button = gtk.Button()
self._button.set_relief(gtk.RELIEF_NONE)
self._icon = Icon(icon_name='view-return',
icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR)
self._icon.show()
self._button.add(self._icon)
self._button.show()
self.add(self._button)
def connect_button_press(self, cb):
self._button.connect('button-press-event', cb)
def _reposition(self):
x = gtk.gdk.screen_width() - self._width
self.move(x, 0)
def _size_request_cb(self, widget, req):
self._width = req.width
self._height = req.height
self._reposition()
def _screen_size_changed_cb(self, screen):
self._reposition()
class Window(gtk.Window):
__gproperties__ = {
'enable-fullscreen-mode': (bool, None, None, True,
gobject.PARAM_READWRITE),
}
def __init__(self, **args):
self._enable_fullscreen_mode = True
gtk.Window.__init__(self, **args)
self.connect('realize', self.__window_realize_cb) self.connect('realize', self.__window_realize_cb)
self.connect('window-state-event', self.__window_state_event_cb) self.connect('window-state-event', self.__window_state_event_cb)
self.connect('key-press-event', self.__key_press_cb) self.connect('key-press-event', self.__key_press_cb)
@ -42,6 +103,24 @@ class Window(gtk.Window):
self.add(self._vbox) self.add(self._vbox)
self._vbox.show() self._vbox.show()
self._is_fullscreen = False
self._unfullscreen_button = UnfullscreenButton()
self._unfullscreen_button.set_transient_for(self)
self._unfullscreen_button.connect_button_press(
self.__unfullscreen_button_pressed)
def do_get_property(self, prop):
if prop.name == 'enable-fullscreen-mode':
return self._enable_fullscreen_mode
else:
return gtk.Window.do_get_property(self, prop)
def do_set_property(self, prop, val):
if prop.name == 'enable-fullscreen-mode':
self._enable_fullscreen_mode = val
else:
gtk.Window.do_set_property(self, prop, val)
def set_canvas(self, canvas): def set_canvas(self, canvas):
if self.canvas: if self.canvas:
self._event_box.remove(self.canvas) self._event_box.remove(self.canvas)
@ -102,20 +181,40 @@ class Window(gtk.Window):
window.window.set_group(group.window) window.window.set_group(group.window)
def __window_state_event_cb(self, window, event): def __window_state_event_cb(self, window, event):
if not (event.changed_mask & gtk.gdk.WINDOW_STATE_FULLSCREEN):
return False
if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN: if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
if self.toolbox is not None: if self.toolbox is not None:
self.toolbox.hide() self.toolbox.hide()
if self.tray is not None: if self.tray is not None:
self.tray.hide() self.tray.hide()
elif event.new_window_state == 0:
self._is_fullscreen = True
if self.props.enable_fullscreen_mode:
self._unfullscreen_button.show()
else:
if self.toolbox is not None: if self.toolbox is not None:
self.toolbox.show() self.toolbox.show()
if self.tray is not None: if self.tray is not None:
self.tray.show() self.tray.show()
self._is_fullscreen = False
if self.props.enable_fullscreen_mode:
self._unfullscreen_button.hide()
def __key_press_cb(self, widget, event): def __key_press_cb(self, widget, event):
key = gtk.gdk.keyval_name(event.keyval)
if event.state & gtk.gdk.MOD1_MASK: if event.state & gtk.gdk.MOD1_MASK:
if gtk.gdk.keyval_name(event.keyval) == 'space': if key == 'space':
self.tray.props.visible = not self.tray.props.visible self.tray.props.visible = not self.tray.props.visible
return True return True
elif key == 'Escape' and self._is_fullscreen and \
self.props.enable_fullscreen_mode:
self.unfullscreen()
return True
return False return False
def __unfullscreen_button_pressed(self, widget, event):
self.unfullscreen()

View File

@ -198,7 +198,7 @@ class Shell(gobject.GObject):
new_level = model.props.zoom_level new_level = model.props.zoom_level
if new_level == ShellModel.ZOOM_HOME: if new_level == ShellModel.ZOOM_HOME:
self._frame.show(Frame.MODE_HOME) self._frame.show(Frame.MODE_NON_INTERACTIVE)
if self._zoom_level == ShellModel.ZOOM_HOME: if self._zoom_level == ShellModel.ZOOM_HOME:
self._frame.hide() self._frame.hide()

View File

@ -44,6 +44,8 @@ class ClipboardIcon(RadioToolButton):
self._preview = None self._preview = None
self._activity = None self._activity = None
self.owns_clipboard = False self.owns_clipboard = False
self.props.sensitive = False
self.props.active = False
self._icon = Icon() self._icon = Icon()
self._icon.props.xo_color = profile.get_color() self._icon.props.xo_color = profile.get_color()
@ -80,6 +82,10 @@ class ClipboardIcon(RadioToolButton):
def _put_in_clipboard(self): def _put_in_clipboard(self):
logging.debug('ClipboardIcon._put_in_clipboard') logging.debug('ClipboardIcon._put_in_clipboard')
if self._percent < 100:
raise ValueError('Object is not complete, cannot be put into the clipboard.')
targets = self._get_targets() targets = self._get_targets()
if targets: if targets:
clipboard = gtk.Clipboard() clipboard = gtk.Clipboard()
@ -125,14 +131,19 @@ class ClipboardIcon(RadioToolButton):
self.child.drag_source_set_icon_name(self._icon.props.icon_name) self.child.drag_source_set_icon_name(self._icon.props.icon_name)
self._name = name self._name = name
self._percent = percent
self._preview = preview self._preview = preview
self._activity = activity self._activity = activity
self.palette.set_state(name, percent, preview, activity, self.palette.set_state(name, percent, preview, activity,
self._is_bundle(obj['FORMATS'])) self._is_bundle(obj['FORMATS']))
if self.props.active: old_percent = self._percent
self._put_in_clipboard() self._percent = percent
if self._percent == 100:
self.props.sensitive = True
# Clipboard object became complete. Make it the active one.
if old_percent < 100 and self._percent == 100:
self.props.active = True
def _notify_active_cb(self, widget, pspec): def _notify_active_cb(self, widget, pspec):
if self.props.active: if self.props.active:

View File

@ -62,7 +62,6 @@ class ClipboardBox(hippo.CanvasBox):
hippo.CanvasBox.__init__(self) hippo.CanvasBox.__init__(self)
self._icons = {} self._icons = {}
self._context_map = _ContextMap() self._context_map = _ContextMap()
self._selected_icon = None
self._tray = VTray() self._tray = VTray()
self.append(hippo.CanvasWidget(widget=self._tray), hippo.PACK_EXPAND) self.append(hippo.CanvasWidget(widget=self._tray), hippo.PACK_EXPAND)
@ -109,17 +108,10 @@ class ClipboardBox(hippo.CanvasBox):
icon = ClipboardIcon(object_id, name, group) icon = ClipboardIcon(object_id, name, group)
self._tray.add_item(icon, 0) self._tray.add_item(icon, 0)
icon.show() icon.show()
self._set_icon_selected(icon)
self._icons[object_id] = icon self._icons[object_id] = icon
logging.debug('ClipboardBox: ' + object_id + ' was added.') logging.debug('ClipboardBox: ' + object_id + ' was added.')
def _set_icon_selected(self, icon):
logging.debug('_set_icon_selected')
icon.props.active = True
self._selected_icon = icon
def _object_deleted_cb(self, cb_service, object_id): def _object_deleted_cb(self, cb_service, object_id):
icon = self._icons[object_id] icon = self._icons[object_id]
self._tray.remove_item(icon) self._tray.remove_item(icon)

View File

@ -59,14 +59,20 @@ class ClipboardPanelWindow(FrameWindow):
targets = clipboard.wait_for_targets() targets = clipboard.wait_for_targets()
for target in targets: for target in targets:
if target not in ('TIMESTAMP', 'TARGETS', 'MULTIPLE', 'SAVE_TARGETS'): if target not in ('TIMESTAMP', 'TARGETS', 'MULTIPLE', 'SAVE_TARGETS'):
logging.debug('Asking for target %s.' % target)
selection = clipboard.wait_for_contents(target) selection = clipboard.wait_for_contents(target)
if selection: if not selection:
logging.warning('no data for selection target %s.' % target)
continue
self._add_selection(key, selection) self._add_selection(key, selection)
cb_service.set_object_percent(key, percent=100) cb_service.set_object_percent(key, percent=100)
def _add_selection(self, key, selection): def _add_selection(self, key, selection):
if selection.data: if not selection.data:
logging.warning('no data for selection target %s.' % selection.type)
return
logging.debug('adding type ' + selection.type + '.') logging.debug('adding type ' + selection.type + '.')
cb_service = clipboardservice.get_instance() cb_service = clipboardservice.get_instance()

View File

@ -85,7 +85,7 @@ class _KeyListener(object):
class Frame(object): class Frame(object):
MODE_MOUSE = 0 MODE_MOUSE = 0
MODE_KEYBOARD = 1 MODE_KEYBOARD = 1
MODE_HOME = 2 MODE_NON_INTERACTIVE = 2
def __init__(self, shell): def __init__(self, shell):
self.mode = None self.mode = None
@ -239,7 +239,7 @@ class Frame(object):
def _clipboard_object_added_cb(self, cb_service, object_id, name): def _clipboard_object_added_cb(self, cb_service, object_id, name):
if not self.visible: if not self.visible:
self.show() self.show(self.MODE_NON_INTERACTIVE)
gobject.timeout_add(2000, lambda: self.hide()) gobject.timeout_add(2000, lambda: self.hide())
def _enter_notify_cb(self, window, event): def _enter_notify_cb(self, window, event):

View File

@ -15,9 +15,10 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import os import os
import logging
import signal import signal
import math
from gettext import gettext as _ from gettext import gettext as _
import re
import gobject import gobject
import gtk import gtk
@ -26,9 +27,7 @@ import dbus
from hardware import hardwaremanager from hardware import hardwaremanager
from sugar.graphics import style from sugar.graphics import style
from sugar.graphics.xocolor import XoColor from sugar.graphics.palette import Palette
from sugar.graphics.palette import Palette, CanvasInvoker
from sugar.graphics.icon import CanvasIcon
from sugar.profile import get_profile from sugar.profile import get_profile
from sugar import env from sugar import env
@ -38,6 +37,8 @@ from view.home.MyIcon import MyIcon
from model.shellmodel import ShellModel from model.shellmodel import ShellModel
from hardware import schoolserver from hardware import schoolserver
_logger = logging.getLogger('HomeBox')
class HomeBox(hippo.CanvasBox, hippo.CanvasItem): class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
__gtype_name__ = 'SugarHomeBox' __gtype_name__ = 'SugarHomeBox'
@ -171,6 +172,11 @@ class _MyIcon(MyIcon):
palette.menu.append(item) palette.menu.append(item)
item.show() item.show()
item = gtk.MenuItem(_('About this XO'))
item.connect('activate', self._about_activate_cb)
palette.menu.append(item)
item.show()
self.set_palette(palette) self.set_palette(palette)
def _reboot_activate_cb(self, menuitem): def _reboot_activate_cb(self, menuitem):
@ -206,6 +212,65 @@ class _MyIcon(MyIcon):
if self._profile.is_registered(): if self._profile.is_registered():
self.get_palette().menu.remove(menuitem) self.get_palette().menu.remove(menuitem)
def _about_activate_cb(self, menuitem):
dialog = gtk.Dialog(_('About this XO'),
self.palette,
gtk.DIALOG_MODAL |
gtk.DIALOG_DESTROY_WITH_PARENT,
(gtk.STOCK_OK, gtk.RESPONSE_OK))
not_available = _('Not available')
build = self._read_file('/boot/olpc_build')
if build is None:
build = not_available
label_build = gtk.Label('Build: %s' % build)
label_build.set_alignment(0, 0.5)
label_build.show()
dialog.vbox.pack_start(label_build)
firmware = self._read_file('/ofw/openprom/model')
if firmware is None:
firmware = not_available
else:
firmware = re.split(" +", firmware)
if len(firmware) == 3:
firmware = firmware[1]
label_firmware = gtk.Label('Firmware: %s' % firmware)
label_firmware.set_alignment(0, 0.5)
label_firmware.show()
dialog.vbox.pack_start(label_firmware)
serial = self._read_file('/ofw/serial-number')
if serial is None:
serial = not_available
label_serial = gtk.Label('Serial Number: %s' % serial)
label_serial.set_alignment(0, 0.5)
label_serial.show()
dialog.vbox.pack_start(label_serial)
dialog.set_default_response(gtk.RESPONSE_OK)
dialog.connect('response', self._response_cb)
dialog.show()
def _read_file(self, path):
if os.access(path, os.R_OK) == 0:
_logger.error('read_file() No such file or directory: %s', path)
return None
fd = open(path, 'r')
value = fd.read()
fd.close()
if value:
value = value.strip('\n')
return value
else:
_logger.error('read_file() No information in file or directory: %s', path)
return None
def _response_cb(self, widget, response_id):
if response_id == gtk.RESPONSE_OK:
widget.destroy()
def _close_emulator(self): def _close_emulator(self):
if os.environ.has_key('SUGAR_EMULATOR_PID'): if os.environ.has_key('SUGAR_EMULATOR_PID'):
pid = int(os.environ['SUGAR_EMULATOR_PID']) pid = int(os.environ['SUGAR_EMULATOR_PID'])

View File

@ -101,7 +101,7 @@ class ActivityIcon(CanvasIcon):
palette.set_primary_text(self._activity.get_title()) palette.set_primary_text(self._activity.get_title())
resume_menu_item = MenuItem(_('Resume'), 'zoom-activity') resume_menu_item = MenuItem(_('Resume'), 'activity-start')
resume_menu_item.connect('activate', self._resume_activate_cb) resume_menu_item.connect('activate', self._resume_activate_cb)
palette.menu.append(resume_menu_item) palette.menu.append(resume_menu_item)
resume_menu_item.show() resume_menu_item.show()