AppWell: If an application is running, activate an existing window

Instead of relaunching, pick the first window and activate
This commit is contained in:
Colin Walters 2009-07-04 17:13:13 -04:00
parent 70c51beeeb
commit 92e9bc85a1
3 changed files with 41 additions and 9 deletions

View File

@ -467,8 +467,7 @@ WellDisplayItem.prototype = {
})); }));
this.actor._delegate = this; this.actor._delegate = this;
this.actor.connect('button-release-event', Lang.bind(this, function (b, e) { this.actor.connect('button-release-event', Lang.bind(this, function (b, e) {
this.launch(); this._handleActivate();
this.emit('activated');
})); }));
let draggable = DND.makeDraggable(this.actor); let draggable = DND.makeDraggable(this.actor);
@ -480,7 +479,7 @@ WellDisplayItem.prototype = {
this.actor.append(iconBox, Big.BoxPackFlags.NONE); this.actor.append(iconBox, Big.BoxPackFlags.NONE);
let count = Shell.AppMonitor.get_default().get_window_count(appInfo.appId); this._windows = Shell.AppMonitor.get_default().get_windows_for_app(appInfo.appId)
let nameBox = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL, let nameBox = new Big.Box({ orientation: Big.BoxOrientation.VERTICAL,
x_align: Big.BoxAlignment.CENTER }); x_align: Big.BoxAlignment.CENTER });
@ -492,7 +491,7 @@ WellDisplayItem.prototype = {
line_wrap_mode: Pango.WrapMode.WORD_CHAR, line_wrap_mode: Pango.WrapMode.WORD_CHAR,
text: appInfo.name }); text: appInfo.name });
nameBox.append(this._name, Big.BoxPackFlags.EXPAND); nameBox.append(this._name, Big.BoxPackFlags.EXPAND);
if (count > 0) { if (this._windows.length > 0) {
let runningBox = new Big.Box({ /* border_color: GenericDisplay.ITEM_DISPLAY_NAME_COLOR, let runningBox = new Big.Box({ /* border_color: GenericDisplay.ITEM_DISPLAY_NAME_COLOR,
border: 1, border: 1,
padding: 1 */ }); padding: 1 */ });
@ -503,6 +502,16 @@ WellDisplayItem.prototype = {
} }
}, },
_handleActivate: function () {
if (this._windows.length == 0)
this.launch();
else {
let first = this._windows[0];
first.activate(Clutter.get_current_event_time());
}
this.emit('activated');
},
// Opens an application represented by this display item. // Opens an application represented by this display item.
launch : function() { launch : function() {
this.appInfo.launch(); this.appInfo.launch();

View File

@ -377,11 +377,34 @@ load_initial_windows (ShellAppMonitor *monitor)
} }
} }
guint /**
shell_app_monitor_get_window_count (ShellAppMonitor *self, * shell_app_monitor_get_windows_for_app:
const char *appid) * @self:
* @appid: Find windows for this id
*
* Returns: (transfer container) (element-type MetaWindow): List of #MetaWindow corresponding to appid
*/
GSList *
shell_app_monitor_get_windows_for_app (ShellAppMonitor *self,
const char *appid)
{ {
return GPOINTER_TO_UINT (g_hash_table_lookup (self->running_appids, appid)); GHashTableIter iter;
gpointer key, value;
GSList *ret = NULL;
g_hash_table_iter_init (&iter, self->window_to_appid);
while (g_hash_table_iter_next (&iter, &key, &value))
{
MetaWindow *window = key;
const char *id = value;
if (strcmp (id, appid) != 0)
continue;
ret = g_slist_prepend (ret, window);
}
return ret;
} }
static void static void

View File

@ -44,7 +44,7 @@ GSList *shell_app_monitor_get_most_used_apps (ShellAppMonitor *monitor,
int activity, int activity,
gint number); gint number);
guint shell_app_monitor_get_window_count (ShellAppMonitor *monitor, const char *appid); GSList *shell_app_monitor_get_windows_for_app (ShellAppMonitor *monitor, const char *appid);
/* Get whatever's running right now */ /* Get whatever's running right now */
GList *shell_app_monitor_get_running_app_ids (ShellAppMonitor *monitor); GList *shell_app_monitor_get_running_app_ids (ShellAppMonitor *monitor);