[gnome-shell] Fix ShellAppSystem's use of no_focus_window, clean up state handling
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] Fix ShellAppSystem's use of no_focus_window, clean up state handling
- Date: Wed, 9 Jun 2010 18:43:25 +0000 (UTC)
commit e4a6bf994fb5c0a2abaa91b12ffae1f534d122c1
Author: Colin Walters <walters verbum org>
Date: Mon Jun 7 16:31:30 2010 -0400
Fix ShellAppSystem's use of no_focus_window, clean up state handling
First, we were passing an incorrect timestamp to
meta_display_focus_the_no_focus_window - fix that.
The invocation of set_focus_app to the started app there couldn't
really work, because (if the above call had worked) we'd get the
X reply *after* the started app.
What we need to untangle here is the distinction that's now made in
ShellApp between _STATE_STARTING and _STATE_RUNNING. A nice way to
start doing this is to rebase ShellWindowTracker to only be concerned
with app states. Concretely, the current "has windows implies
running" logic now lives just inside shell-app.c.
Rename the app-running-changed signal to be app-state-changed. This
will ultimately be useful so that inside the panel, we can track
the last started app.
https://bugzilla.gnome.org/show_bug.cgi?id=620899
js/ui/appDisplay.js | 2 +-
js/ui/panel.js | 2 +-
src/Makefile.am | 3 +-
src/shell-app-usage.c | 10 +++---
src/shell-app.c | 4 ++-
src/shell-window-tracker.c | 64 ++++++++++++++++++++++---------------------
6 files changed, 45 insertions(+), 40 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index 471a65c..f43af8e 100644
--- a/js/ui/appDisplay.js
+++ b/js/ui/appDisplay.js
@@ -1078,7 +1078,7 @@ AppWell.prototype = {
this._appSystem.connect('installed-changed', Lang.bind(this, this._queueRedisplay));
AppFavorites.getAppFavorites().connect('changed', Lang.bind(this, this._queueRedisplay));
- this._tracker.connect('app-running-changed', Lang.bind(this, this._queueRedisplay));
+ this._tracker.connect('app-state-changed', Lang.bind(this, this._queueRedisplay));
},
_appIdListToHash: function(apps) {
diff --git a/js/ui/panel.js b/js/ui/panel.js
index aab4a03..6546e8b 100644
--- a/js/ui/panel.js
+++ b/js/ui/panel.js
@@ -697,7 +697,7 @@ AppMenuButton.prototype = {
// cases where the focused window's application changes without the focus
// changing. An example case is how we map Firefox based on the window
// title which is a dynamic property.
- tracker.connect('app-running-changed', Lang.bind(this, this._sync));
+ tracker.connect('app-state-changed', Lang.bind(this, this._sync));
this._sync();
},
diff --git a/src/Makefile.am b/src/Makefile.am
index 5ab98c3..ffc5469 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -116,7 +116,8 @@ libgnome_shell_la_SOURCES = \
non_gir_sources = \
shell-embedded-window-private.h \
- shell-global-private.h
+ shell-global-private.h \
+ shell-window-tracker-private.h
shell_recorder_sources = \
shell-recorder.c \
diff --git a/src/shell-app-usage.c b/src/shell-app-usage.c
index 2210f17..2cddffa 100644
--- a/src/shell-app-usage.c
+++ b/src/shell-app-usage.c
@@ -313,9 +313,9 @@ increment_usage_for_app (ShellAppUsage *self,
}
static void
-on_app_running_changed (ShellWindowTracker *tracker,
- ShellApp *app,
- gpointer user_data)
+on_app_state_changed (ShellWindowTracker *tracker,
+ ShellApp *app,
+ gpointer user_data)
{
ShellAppUsage *self = SHELL_APP_USAGE (user_data);
UsageData *usage;
@@ -326,7 +326,7 @@ on_app_running_changed (ShellWindowTracker *tracker,
usage = get_usage_for_app (self, app);
- running = shell_app_get_n_windows (app) > 0;
+ running = shell_app_get_state (app) == SHELL_APP_STATE_RUNNING;
usage->last_seen = get_time ();
}
@@ -389,7 +389,7 @@ shell_app_usage_init (ShellAppUsage *self)
tracker = shell_window_tracker_get_default ();
g_signal_connect (tracker, "notify::focus-app", G_CALLBACK (on_focus_app_changed), self);
- g_signal_connect (tracker, "app-running-changed", G_CALLBACK (on_app_running_changed), self);
+ g_signal_connect (tracker, "app-state-changed", G_CALLBACK (on_app_state_changed), self);
session_bus = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
self->session_proxy = dbus_g_proxy_new_for_name (session_bus, "org.gnome.SessionManager",
diff --git a/src/shell-app.c b/src/shell-app.c
index b627994..dca21a2 100644
--- a/src/shell-app.c
+++ b/src/shell-app.c
@@ -8,7 +8,7 @@
#include "shell-enum-types.h"
#include "display.h"
#include "st.h"
-#include "shell-window-tracker.h"
+#include "shell-window-tracker-private.h"
#include <string.h>
@@ -632,6 +632,8 @@ shell_app_state_transition (ShellApp *app,
state == SHELL_APP_STATE_STARTING));
app->state = state;
g_object_notify (G_OBJECT (app), "state");
+
+ _shell_window_tracker_notify_app_state_changed (shell_window_tracker_get_default (), app);
}
static void
diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c
index 4a5d3a2..e2957d9 100644
--- a/src/shell-window-tracker.c
+++ b/src/shell-window-tracker.c
@@ -13,7 +13,7 @@
#define SN_API_NOT_YET_FROZEN 1
#include <libsn/sn.h>
-#include "shell-window-tracker.h"
+#include "shell-window-tracker-private.h"
#include "shell-app-system.h"
#include "shell-app-private.h"
#include "st/st-texture-cache.h"
@@ -64,7 +64,6 @@ struct _ShellWindowTracker
{
GObject parent;
- guint idle_focus_change_id;
ShellApp *focus_app;
/* <MetaWindow * window, ShellApp *app> */
@@ -82,7 +81,7 @@ enum {
};
enum {
- APP_RUNNING_CHANGED,
+ APP_STATE_CHANGED,
STARTUP_SEQUENCE_CHANGED,
TRACKED_WINDOWS_CHANGED,
@@ -135,14 +134,14 @@ shell_window_tracker_class_init (ShellWindowTrackerClass *klass)
SHELL_TYPE_APP,
G_PARAM_READABLE));
- signals[APP_RUNNING_CHANGED] = g_signal_new ("app-running-changed",
- SHELL_TYPE_WINDOW_TRACKER,
- G_SIGNAL_RUN_LAST,
- 0,
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE, 1,
- SHELL_TYPE_APP);
+ signals[APP_STATE_CHANGED] = g_signal_new ("app-state-changed",
+ SHELL_TYPE_WINDOW_TRACKER,
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ SHELL_TYPE_APP);
signals[STARTUP_SEQUENCE_CHANGED] = g_signal_new ("startup-sequence-changed",
SHELL_TYPE_WINDOW_TRACKER,
G_SIGNAL_RUN_LAST,
@@ -516,14 +515,6 @@ track_window (ShellWindowTracker *self,
_shell_app_add_window (app, window);
- if (shell_app_get_n_windows (app) == 1)
- {
- /* key is owned by the app */
- g_hash_table_insert (self->running_apps, (char*)shell_app_get_id (app),
- app);
- g_signal_emit (self, signals[APP_RUNNING_CHANGED], 0, app);
- }
-
g_signal_emit (self, signals[TRACKED_WINDOWS_CHANGED], 0);
}
@@ -553,13 +544,6 @@ disassociate_window (ShellWindowTracker *self,
_shell_app_remove_window (app, window);
- if (shell_app_get_n_windows (app) == 0)
- {
- const char *id = shell_app_get_id (app);
- g_hash_table_remove (self->running_apps, id);
- g_signal_emit (self, signals[APP_RUNNING_CHANGED], 0, app);
- }
-
g_signal_emit (self, signals[TRACKED_WINDOWS_CHANGED], 0);
g_object_unref (app);
@@ -643,6 +627,27 @@ init_window_tracking (ShellWindowTracker *self)
shell_window_tracker_on_n_workspaces_changed (screen, NULL, self);
}
+void
+_shell_window_tracker_notify_app_state_changed (ShellWindowTracker *self,
+ ShellApp *app)
+{
+ ShellAppState state = shell_app_get_state (app);
+
+ switch (state)
+ {
+ case SHELL_APP_STATE_RUNNING:
+ /* key is owned by the app */
+ g_hash_table_insert (self->running_apps, (char*)shell_app_get_id (app), app);
+ break;
+ case SHELL_APP_STATE_STARTING:
+ break;
+ case SHELL_APP_STATE_STOPPED:
+ g_hash_table_remove (self->running_apps, shell_app_get_id (app));
+ break;
+ }
+ g_signal_emit (self, signals[APP_STATE_CHANGED], 0, app);
+}
+
static void
on_startup_sequence_changed (MetaScreen *screen,
SnStartupSequence *sequence,
@@ -665,13 +670,10 @@ on_startup_sequence_changed (MetaScreen *screen,
{
MetaScreen *screen = shell_global_get_screen (shell_global_get ());
MetaDisplay *display = meta_screen_get_display (screen);
- long tv_sec, tv_usec;
-
- sn_startup_sequence_get_initiated_time (sequence, &tv_sec, &tv_usec);
_shell_app_set_starting (app, starting);
- set_focus_app (self, app);
- meta_display_focus_the_no_focus_window (display, screen, tv_sec);
+ meta_display_focus_the_no_focus_window (display, screen,
+ sn_startup_sequence_get_timestamp (sequence));
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]