diff --git a/shell/view/Shell.py b/shell/view/Shell.py index 4637499e..0bb59bfb 100644 --- a/shell/view/Shell.py +++ b/shell/view/Shell.py @@ -127,6 +127,7 @@ class Shell(gobject.GObject): self._frame.notify_key_release() def __window_opened_cb(self, screen, window): + logging.debug('Shell.__window_opened_cb') if window.get_window_type() == wnck.WINDOW_NORMAL: try: activity_host = ActivityHost(self.get_model(), window) @@ -140,6 +141,7 @@ class Shell(gobject.GObject): self.emit('activity-opened', activity_host) def __active_window_changed_cb(self, screen): + logging.debug('Shell.__active_window_changed_cb') window = screen.get_active_window() if not window or window.get_window_type() != wnck.WINDOW_NORMAL: return @@ -154,6 +156,7 @@ class Shell(gobject.GObject): self._set_current_activity(activity_host) def __window_closed_cb(self, screen, window): + logging.debug('Shell.__window_closed_cb') if window.get_window_type() != wnck.WINDOW_NORMAL: return @@ -204,6 +207,7 @@ class Shell(gobject.GObject): logging.error('Cannot start activity.') def start_activity(self, activity_type): + logging.debug('Shell.start_activity') activity = ActivityFactory.create(activity_type) activity.execute('test', []) return activity diff --git a/shell/view/frame/Frame.py b/shell/view/frame/Frame.py index f2c6312b..1fd62a95 100644 --- a/shell/view/frame/Frame.py +++ b/shell/view/frame/Frame.py @@ -78,6 +78,10 @@ class EventFrame(gobject.GObject): invisible.connect('motion-notify-event', self._motion_notify_cb) invisible.connect('enter-notify-event', self._enter_notify_cb) invisible.connect('leave-notify-event', self._leave_notify_cb) + + invisible.drag_dest_set(0, [], 0) + invisible.connect('drag_motion', self._drag_motion_cb) + invisible.connect('drag_leave', self._drag_leave_cb) invisible.realize() invisible.window.set_events(gtk.gdk.POINTER_MOTION_MASK | @@ -89,9 +93,17 @@ class EventFrame(gobject.GObject): def _enter_notify_cb(self, widget, event): self._notify_enter(event.x, event.y) + logging.debug('EventFrame._enter_notify_cb ' + str(self._hover)) def _motion_notify_cb(self, widget, event): self._notify_enter(event.x, event.y) + logging.debug('EventFrame._motion_notify_cb ' + str(self._hover)) + + def _drag_motion_cb(self, widget, drag_context, x, y, timestamp): + drag_context.drag_status(0, timestamp); + self._notify_enter(x, y) + logging.debug('EventFrame._drag_motion_cb ' + str(self._hover)) + return True def _notify_enter(self, x, y): screen_w = gtk.gdk.screen_width() @@ -110,6 +122,15 @@ class EventFrame(gobject.GObject): self.emit('enter-edge') def _leave_notify_cb(self, widget, event): + self._notify_leave() + logging.debug('EventFrame._leave_notify_cb ' + str(self._hover)) + + def _drag_leave_cb(self, widget, drag_context, timestamp): + self._notify_leave() + logging.debug('EventFrame._drag_leave_cb ' + str(self._hover)) + return True + + def _notify_leave(self): self._hover = EventFrame.HOVER_NONE if self._active: self.emit('leave') @@ -220,8 +241,12 @@ class Frame: def _create_clipboard_panel(self, grid, x, y, width, height): [x, y, width, height] = grid.rectangle(x, y, width, height) - panel = ClipboardPanelWindow(x, y, width, height) + panel = ClipboardPanelWindow(self, x, y, width, height) + self._connect_to_panel(panel) + panel.connect('drag-motion', self._drag_motion_cb) + panel.connect('drag-leave', self._drag_leave_cb) + self._windows.append(panel) return panel @@ -253,12 +278,26 @@ class Frame: def _enter_notify_cb(self, window, event): self._timeline.goto('slide_in', True) - + logging.debug('Frame._enter_notify_cb ' + str(self._mode)) + + def _drag_motion_cb(self, window, context, x, y, time): + self._timeline.goto('slide_in', True) + logging.debug('Frame._drag_motion_cb ' + str(self._mode)) + return True + + def _drag_leave_cb(self, window, drag_context, timestamp): + self._leave_notify() + logging.debug('Frame._drag_leave_cb ' + str(self._mode)) + def _leave_notify_cb(self, window, event): # FIXME for some reason every click cause also a leave-notify if event.state == gtk.gdk.BUTTON1_MASK: return + self._leave_notify() + logging.debug('Frame._leave_notify_cb ' + str(self._mode)) + + def _leave_notify(self): if self._active_menus == 0 and \ (self._mode == Frame.HIDE_ON_LEAVE or \ self._mode == Frame.AUTOMATIC): @@ -267,15 +306,18 @@ class Frame: def _enter_edge_cb(self, event_frame): self._mode = Frame.HIDE_ON_LEAVE self._timeline.play(None, 'slide_in') - + logging.debug('Frame._enter_edge_cb ' + str(self._mode)) + def _enter_corner_cb(self, event_frame): self._mode = Frame.HIDE_ON_LEAVE self._timeline.play('slide_in', 'slide_in') - + logging.debug('Frame._enter_corner_cb ' + str(self._mode)) + def _event_frame_leave_cb(self, event_frame): if self._mode != Frame.STICKY: self._timeline.goto('slide_out', True) - + logging.debug('Frame._event_frame_leave_cb ' + str(self._mode)) + def show_and_hide(self, seconds): self._mode = Frame.AUTOMATIC self._timeline.play() diff --git a/shell/view/frame/clipboardbox.py b/shell/view/frame/clipboardbox.py index 0a5a8849..7059214c 100644 --- a/shell/view/frame/clipboardbox.py +++ b/shell/view/frame/clipboardbox.py @@ -32,6 +32,9 @@ class _ContextMap: self._context_map[context] = [object_id, data_types_left] return object_id + + def has_context(self, context): + return context in self._context_map class ClipboardBox(hippo.CanvasBox): @@ -91,10 +94,12 @@ class ClipboardBox(hippo.CanvasBox): logging.debug('ClipboardBox: ' + object_id + ' state was changed.') def drag_motion_cb(self, widget, context, x, y, time): + logging.debug('ClipboardBox._drag_motion_cb') context.drag_status(gtk.gdk.ACTION_COPY, time) return True def drag_drop_cb(self, widget, context, x, y, time): + logging.debug('ClipboardBox._drag_drop_cb') object_id = util.unique_id() self._context_map.add_context(context, object_id, len(context.targets)) @@ -115,7 +120,11 @@ class ClipboardBox(hippo.CanvasBox): object_id = self._context_map.get_object_id(context) self._add_selection(object_id, selection) else: - logging.warn('ClipboardBox: empty selection for target ' + selection.target) + logging.warn('ClipboardBox: empty selection for target ' + selection.target) + + # If it's the last target to be processed, finish the dnd transaction + if not self._context_map.has_context(context): + context.finish(True, False, time) def drag_data_get_cb(self, widget, context, selection, targetType, eventTime): logging.debug("drag_data_get_cb: requested target " + selection.target) diff --git a/shell/view/frame/clipboardpanelwindow.py b/shell/view/frame/clipboardpanelwindow.py index 7ad801c7..d46bf6a8 100644 --- a/shell/view/frame/clipboardpanelwindow.py +++ b/shell/view/frame/clipboardpanelwindow.py @@ -8,9 +8,11 @@ from sugar.clipboard import clipboardservice from sugar import util class ClipboardPanelWindow(PanelWindow): - def __init__(self, x, y, width, height): + def __init__(self, frame, x, y, width, height): PanelWindow.__init__(self, x, y, width, height) + self._frame = frame + # Listening for new clipboard objects clipboard = gtk.Clipboard() clipboard.connect("owner-change", self._owner_change_cb) @@ -51,6 +53,8 @@ class ClipboardPanelWindow(PanelWindow): selection = clipboard.wait_for_contents(target) if selection: self._add_selection(key, selection) + + self._frame.show_and_hide(0) def _add_selection(self, key, selection): if selection.data: