Add busy property to ShellApp

Using a separate property to show when the application is busy rather
than cramming it into the state property makes the code clearer. In most
places we only care if an app is running or not, not whether it is
actually busy.

https://bugzilla.gnome.org/show_bug.cgi?id=736492
This commit is contained in:
Phillip Wood 2014-09-16 11:08:19 +01:00
parent e00bfcc2cf
commit 546ae00854
4 changed files with 40 additions and 13 deletions

View File

@ -181,6 +181,7 @@ const AppMenuButton = new Lang.Class({
this._targetApp = null; this._targetApp = null;
this._appMenuNotifyId = 0; this._appMenuNotifyId = 0;
this._actionGroupNotifyId = 0; this._actionGroupNotifyId = 0;
this._busyNotifyId = 0;
let bin = new St.Bin({ name: 'appMenu' }); let bin = new St.Bin({ name: 'appMenu' });
bin.connect('style-changed', Lang.bind(this, this._onStyleChanged)); bin.connect('style-changed', Lang.bind(this, this._onStyleChanged));
@ -457,12 +458,17 @@ const AppMenuButton = new Lang.Class({
this._targetApp.disconnect(this._actionGroupNotifyId); this._targetApp.disconnect(this._actionGroupNotifyId);
this._actionGroupNotifyId = 0; this._actionGroupNotifyId = 0;
} }
if (this._busyNotifyId) {
this._targetApp.disconnect(this._busyNotifyId);
this._busyNotifyId = 0;
}
this._targetApp = targetApp; this._targetApp = targetApp;
if (this._targetApp) { if (this._targetApp) {
this._appMenuNotifyId = this._targetApp.connect('notify::menu', Lang.bind(this, this._sync)); this._appMenuNotifyId = this._targetApp.connect('notify::menu', Lang.bind(this, this._sync));
this._actionGroupNotifyId = this._targetApp.connect('notify::action-group', Lang.bind(this, this._sync)); this._actionGroupNotifyId = this._targetApp.connect('notify::action-group', Lang.bind(this, this._sync));
this._busyNotifyId = this._targetApp.connect('notify::busy', Lang.bind(this, this._sync));
this._label.setText(this._targetApp.get_name()); this._label.setText(this._targetApp.get_name());
this.actor.set_accessible_name(this._targetApp.get_name()); this.actor.set_accessible_name(this._targetApp.get_name());
} }
@ -476,7 +482,7 @@ const AppMenuButton = new Lang.Class({
let isBusy = (this._targetApp != null && let isBusy = (this._targetApp != null &&
(this._targetApp.get_state() == Shell.AppState.STARTING || (this._targetApp.get_state() == Shell.AppState.STARTING ||
this._targetApp.get_state() == Shell.AppState.BUSY)); this._targetApp.get_busy()));
if (isBusy) if (isBusy)
this.startAnimation(); this.startAnimation();
else else

View File

@ -335,7 +335,6 @@ _shell_app_system_notify_app_state_changed (ShellAppSystem *self,
switch (state) switch (state)
{ {
case SHELL_APP_STATE_RUNNING: case SHELL_APP_STATE_RUNNING:
case SHELL_APP_STATE_BUSY:
g_hash_table_insert (self->priv->running_apps, g_object_ref (app), NULL); g_hash_table_insert (self->priv->running_apps, g_object_ref (app), NULL);
break; break;
case SHELL_APP_STATE_STARTING: case SHELL_APP_STATE_STARTING:

View File

@ -92,6 +92,7 @@ struct _ShellApp
enum { enum {
PROP_0, PROP_0,
PROP_STATE, PROP_STATE,
PROP_BUSY,
PROP_ID, PROP_ID,
PROP_DBUS_ID, PROP_DBUS_ID,
PROP_ACTION_GROUP, PROP_ACTION_GROUP,
@ -123,6 +124,9 @@ shell_app_get_property (GObject *gobject,
case PROP_STATE: case PROP_STATE:
g_value_set_enum (value, app->state); g_value_set_enum (value, app->state);
break; break;
case PROP_BUSY:
g_value_set_boolean (value, shell_app_get_busy (app));
break;
case PROP_ID: case PROP_ID:
g_value_set_string (value, shell_app_get_id (app)); g_value_set_string (value, shell_app_get_id (app));
break; break;
@ -678,7 +682,6 @@ shell_app_activate_full (ShellApp *app,
case SHELL_APP_STATE_STARTING: case SHELL_APP_STATE_STARTING:
break; break;
case SHELL_APP_STATE_RUNNING: case SHELL_APP_STATE_RUNNING:
case SHELL_APP_STATE_BUSY:
shell_app_activate_window (app, NULL, timestamp); shell_app_activate_window (app, NULL, timestamp);
break; break;
} }
@ -1060,22 +1063,27 @@ shell_app_on_ws_switch (MetaScreen *screen,
g_signal_emit (app, shell_app_signals[WINDOWS_CHANGED], 0); g_signal_emit (app, shell_app_signals[WINDOWS_CHANGED], 0);
} }
gboolean
shell_app_get_busy (ShellApp *app)
{
if (app->running_state != NULL &&
app->running_state->application_proxy != NULL &&
shell_org_gtk_application_get_busy (app->running_state->application_proxy))
return TRUE;
return FALSE;
}
static void static void
busy_changed_cb (GObject *object, busy_changed_cb (GObject *object,
GParamSpec *pspec, GParamSpec *pspec,
gpointer user_data) gpointer user_data)
{ {
ShellOrgGtkApplication *proxy;
ShellApp *app = user_data; ShellApp *app = user_data;
g_assert (SHELL_IS_ORG_GTK_APPLICATION (object));
g_assert (SHELL_IS_APP (app)); g_assert (SHELL_IS_APP (app));
proxy = SHELL_ORG_GTK_APPLICATION (object); g_object_notify (G_OBJECT (app), "busy");
if (shell_org_gtk_application_get_busy (proxy))
shell_app_state_transition (app, SHELL_APP_STATE_BUSY);
else
shell_app_state_transition (app, SHELL_APP_STATE_RUNNING);
} }
static void static void
@ -1097,7 +1105,7 @@ get_application_proxy (GObject *source,
G_CALLBACK (busy_changed_cb), G_CALLBACK (busy_changed_cb),
app); app);
if (shell_org_gtk_application_get_busy (proxy)) if (shell_org_gtk_application_get_busy (proxy))
shell_app_state_transition (app, SHELL_APP_STATE_BUSY); g_object_notify (G_OBJECT (app), "busy");
} }
if (app->running_state != NULL) if (app->running_state != NULL)
@ -1577,6 +1585,19 @@ shell_app_class_init(ShellAppClass *klass)
SHELL_APP_STATE_STOPPED, SHELL_APP_STATE_STOPPED,
G_PARAM_READABLE)); G_PARAM_READABLE));
/**
* ShellApp:busy:
*
* Whether the application has marked itself as busy.
*/
g_object_class_install_property (gobject_class,
PROP_BUSY,
g_param_spec_boolean ("busy",
"Busy",
"Busy state",
FALSE,
G_PARAM_READABLE));
/** /**
* ShellApp:id: * ShellApp:id:
* *

View File

@ -30,8 +30,7 @@ struct _ShellAppClass
typedef enum { typedef enum {
SHELL_APP_STATE_STOPPED, SHELL_APP_STATE_STOPPED,
SHELL_APP_STATE_STARTING, SHELL_APP_STATE_STARTING,
SHELL_APP_STATE_RUNNING, SHELL_APP_STATE_RUNNING
SHELL_APP_STATE_BUSY
} ShellAppState; } ShellAppState;
GType shell_app_get_type (void) G_GNUC_CONST; GType shell_app_get_type (void) G_GNUC_CONST;
@ -87,6 +86,8 @@ int shell_app_compare (ShellApp *app, ShellApp *other);
void shell_app_update_window_actions (ShellApp *app, MetaWindow *window); void shell_app_update_window_actions (ShellApp *app, MetaWindow *window);
void shell_app_update_app_menu (ShellApp *app, MetaWindow *window); void shell_app_update_app_menu (ShellApp *app, MetaWindow *window);
gboolean shell_app_get_busy (ShellApp *app);
G_END_DECLS G_END_DECLS
#endif /* __SHELL_APP_H__ */ #endif /* __SHELL_APP_H__ */