diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index a278e5e4b..d69a3b5a6 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -76,6 +76,10 @@ AppDisplayItem.prototype = { // Returns a preview icon for the item. _createPreviewIcon : function() { return this._appInfo.create_icon_texture(GenericDisplay.PREVIEW_ICON_SIZE); + }, + + shellWorkspaceLaunch: function() { + this.launch(); } }; @@ -540,21 +544,12 @@ WellDisplayItem.prototype = { this.appInfo.launch(); }, - // Draggable interface - FIXME deduplicate with GenericDisplay - getDragActor: function(stageX, stageY) { - this.dragActor = this.appInfo.create_icon_texture(APP_ICON_SIZE); + shellWorkspaceLaunch : function() { + this.launch(); + }, - // If the user dragged from the icon itself, then position - // the dragActor over the original icon. Otherwise center it - // around the pointer - let [iconX, iconY] = this._icon.get_transformed_position(); - let [iconWidth, iconHeight] = this._icon.get_transformed_size(); - if (stageX > iconX && stageX <= iconX + iconWidth && - stageY > iconY && stageY <= iconY + iconHeight) - this.dragActor.set_position(iconX, iconY); - else - this.dragActor.set_position(stageX - this.dragActor.width / 2, stageY - this.dragActor.height / 2); - return this.dragActor; + getDragActor: function(stageX, stageY) { + return this.appInfo.create_icon_texture(APP_ICON_SIZE); }, // Returns the original icon that is being used as a source for the cloned texture diff --git a/js/ui/dnd.js b/js/ui/dnd.js index 2eb5f789e..87cb5d8e9 100644 --- a/js/ui/dnd.js +++ b/js/ui/dnd.js @@ -82,10 +82,21 @@ _Draggable.prototype = { // Drag actor does not always have to be the same as actor. For example drag actor // can be an image that's part of the actor. So to perform "snap back" correctly we need // to know what was the drag actor source. - if (this.actor._delegate.getDragActorSource) + if (this.actor._delegate.getDragActorSource) { this._dragActorSource = this.actor._delegate.getDragActorSource(); - else + // If the user dragged from the source, then position + // the dragActor over it. Otherwise, center it + // around the pointer + let [sourceX, sourceY] = this._dragActorSource.get_transformed_position(); + let [sourceWidth, sourceHeight] = this._dragActorSource.get_transformed_size(); + if (stageX > sourceX && stageX <= sourceX + sourceWidth && + stageY > sourceY && stageY <= sourceY + sourceHeight) + this._dragActor.set_position(sourceX, sourceY); + else + this._dragActor.set_position(stageX - this._dragActor.width / 2, stageY - this._dragActor.height / 2); + } else { this._dragActorSource = this.actor; + } this._dragOrigParent = undefined; this._ungrabActor(actor); this._grabActor(this._dragActor); diff --git a/js/ui/docDisplay.js b/js/ui/docDisplay.js index 8dd133966..605d7f8c9 100644 --- a/js/ui/docDisplay.js +++ b/js/ui/docDisplay.js @@ -83,9 +83,15 @@ DocDisplayItem.prototype = { } }, + //// Drag and Drop //// + + shellWorkspaceLaunch: function() { + this.launch(); + }, + //// Private Methods //// - // Updates the last visited time displayed in the description text for the item. + // Updates the last visited time displayed in the description text for the item. _resetTimeDisplay: function(currentSecs) { let lastSecs = this._docInfo.timestamp; let timeDelta = currentSecs - lastSecs; diff --git a/js/ui/genericDisplay.js b/js/ui/genericDisplay.js index 6f1347791..b874bc941 100644 --- a/js/ui/genericDisplay.js +++ b/js/ui/genericDisplay.js @@ -126,8 +126,6 @@ GenericDisplayItem.prototype = { // It is used for updating the description text inside the details actor when // the description text for the item is updated. this._detailsDescriptions = []; - - this.dragActor = null; }, //// Draggable object interface //// @@ -135,21 +133,9 @@ GenericDisplayItem.prototype = { // Returns a cloned texture of the item's icon to represent the item as it // is being dragged. getDragActor: function(stageX, stageY) { - this.dragActor = this._createIcon(); - - // If the user dragged from the icon itself, then position - // the dragActor over the original icon. Otherwise center it - // around the pointer - let [iconX, iconY] = this._icon.get_transformed_position(); - let [iconWidth, iconHeight] = this._icon.get_transformed_size(); - if (stageX > iconX && stageX <= iconX + iconWidth && - stageY > iconY && stageY <= iconY + iconHeight) - this.dragActor.set_position(iconX, iconY); - else - this.dragActor.set_position(stageX - this.dragActor.width / 2, stageY - this.dragActor.height / 2); - return this.dragActor; + return this._createIcon(); }, - + // Returns the item icon, a separate copy of which is used to // represent the item as it is being dragged. This is used to // determine a snap-back location for the drag icon if it does diff --git a/js/ui/workspaces.js b/js/ui/workspaces.js index 39e2cd48f..7fa0bb1ac 100644 --- a/js/ui/workspaces.js +++ b/js/ui/workspaces.js @@ -11,9 +11,7 @@ const Pango = imports.gi.Pango; const Shell = imports.gi.Shell; const Signals = imports.signals; -const AppDisplay = imports.ui.appDisplay; const DND = imports.ui.dnd; -const GenericDisplay = imports.ui.genericDisplay; const Main = imports.ui.main; const Overview = imports.ui.overview; const Panel = imports.ui.panel; @@ -855,9 +853,9 @@ Workspace.prototype = { false, // don't create workspace time); return true; - } else if (source instanceof GenericDisplay.GenericDisplayItem || source instanceof AppDisplay.WellDisplayItem) { + } else if (source.shellWorkspaceLaunch) { this._metaWorkspace.activate(time); - source.launch(); + source.shellWorkspaceLaunch(); return true; }