[gnome-shell/overlay-design02] Update for review of d5a80d306359fc4526b9284c3f9170149e2200c1
- From: Colin Walters <walters src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnome-shell/overlay-design02] Update for review of d5a80d306359fc4526b9284c3f9170149e2200c1
- Date: Wed, 1 Jul 2009 14:39:06 +0000 (UTC)
commit 8293f3423af9699efa6f2e89230a8bea6bbba2c8
Author: Colin Walters <walters verbum org>
Date: Tue Jun 30 14:21:23 2009 -0400
Update for review of d5a80d306359fc4526b9284c3f9170149e2200c1
src/shell-app-monitor.c | 79 ++++++++++++++++++++++++++++------------------
src/shell-global.c | 13 +++++++-
src/shell-global.h | 2 +
3 files changed, 62 insertions(+), 32 deletions(-)
---
diff --git a/src/shell-app-monitor.c b/src/shell-app-monitor.c
index 8728c21..aed794a 100644
--- a/src/shell-app-monitor.c
+++ b/src/shell-app-monitor.c
@@ -15,7 +15,6 @@
#include "shell-app-monitor.h"
#include "shell-app-system.h"
#include "shell-global.h"
-#include "shell-wm.h"
#include "display.h"
#include "window.h"
@@ -97,10 +96,10 @@ struct _ShellAppMonitor
gboolean currently_idle;
gboolean enable_monitoring;
- /* <char *,guint> */
+ /* <char * appid, guint window_count> */
GHashTable *running_appids;
- /* <MetaWindow *, char *> */
+ /* <MetaWindow * window, char * appid> */
GHashTable *window_to_appid;
GHashTable *apps_by_wm_class; /* Seen apps by wm_class */
@@ -240,6 +239,13 @@ get_wmclass_for_window (MetaWindow *window)
return g_strdup (wm_class);
}
+/**
+ * get_cleaned_wmclass_for_window:
+ *
+ * A "cleaned" wmclass is the WM_CLASS property of a window,
+ * after some transformations to turn it into a form
+ * somewhat more resilient to changes, such as lowercasing.
+ */
static char *
get_cleaned_wmclass_for_window (MetaWindow *window)
{
@@ -256,11 +262,18 @@ get_cleaned_wmclass_for_window (MetaWindow *window)
cleaned_wmclass = g_utf8_strdown (wmclass, -1);
g_free (wmclass);
/* This handles "Fedora Eclipse", probably others */
- wmclass = g_strdup (g_strdelimit (cleaned_wmclass, " ", '-'));
+ g_strdelimit (cleaned_wmclass, " ", '-');
+ wmclass = g_strdup (cleaned_wmclass);
g_free (cleaned_wmclass);
return wmclass;
}
+/**
+ * get_appid_for_window:
+ *
+ * Returns a desktop file ID for an application, or %NULL if
+ * we're unable to determine one.
+ */
static char *
get_appid_for_window (MetaWindow *window)
{
@@ -289,7 +302,7 @@ track_window (ShellAppMonitor *self,
MetaWindow *window)
{
char *appid;
- guint refcount;
+ guint window_count;
appid = get_appid_for_window (window);
if (!appid)
@@ -297,11 +310,11 @@ track_window (ShellAppMonitor *self,
g_hash_table_insert (self->window_to_appid, window, appid);
- refcount = GPOINTER_TO_UINT (g_hash_table_lookup (self->running_appids, appid));
+ window_count = GPOINTER_TO_UINT (g_hash_table_lookup (self->running_appids, appid));
- refcount += 1;
- g_hash_table_insert (self->running_appids, appid, GUINT_TO_POINTER (refcount));
- if (refcount == 1)
+ window_count += 1;
+ g_hash_table_insert (self->running_appids, g_strdup (appid), GUINT_TO_POINTER (window_count));
+ if (window_count == 1)
g_signal_emit (self, signals[CHANGED], 0);
}
@@ -322,18 +335,16 @@ shell_app_monitor_on_window_removed (MetaWorkspace *workspace,
{
ShellAppMonitor *self = SHELL_APP_MONITOR (user_data);
char *appid;
- guint refcount;
+ guint window_count;
- appid = get_appid_for_window (window);
+ appid = g_hash_table_lookup (self->window_to_appid, window);
if (!appid)
return;
- g_hash_table_remove (self->window_to_appid, window);
-
- refcount = GPOINTER_TO_UINT (g_hash_table_lookup (self->running_appids, appid));
+ window_count = GPOINTER_TO_UINT (g_hash_table_lookup (self->running_appids, appid));
- refcount -= 1;
- if (refcount == 0)
+ window_count -= 1;
+ if (window_count == 0)
{
g_hash_table_remove (self->running_appids, appid);
g_free (appid);
@@ -341,21 +352,28 @@ shell_app_monitor_on_window_removed (MetaWorkspace *workspace,
}
else
{
- g_hash_table_insert (self->running_appids, appid, GUINT_TO_POINTER (refcount));
+ g_hash_table_insert (self->running_appids, appid, GUINT_TO_POINTER (window_count));
}
+ g_hash_table_remove (self->window_to_appid, window);
}
static void
load_initial_windows (ShellAppMonitor *monitor)
{
- ShellGlobal *global = shell_global_get ();
- GList *windows = shell_global_get_windows (global);
- GList *iter;
+ GList *workspaces, *iter;
+ MetaScreen *screen = shell_global_get_screen (shell_global_get ());
+ workspaces = meta_screen_get_workspaces (screen);
- for (iter = windows; iter; iter = iter->next)
+ for (iter = workspaces; iter; iter = iter->next)
{
- MetaWindow *window = iter->data;
- track_window (monitor, window);
+ MetaWorkspace *workspace = iter->data;
+ GList *windows = meta_workspace_list_windows (workspace);
+ GList *window_iter;
+
+ for (window_iter = windows; window_iter; window_iter = window_iter->next)
+ track_window (monitor, (MetaWindow*)window_iter->data);
+
+ g_list_free (windows);
}
}
@@ -380,6 +398,10 @@ shell_app_monitor_on_n_workspaces_changed (MetaScreen *screen,
{
MetaWorkspace *workspace = iter->data;
+ /* This pair of disconnect/connect is idempotent if we were
+ * already connected, while ensuring we get connected for
+ * new workspaces.
+ */
g_signal_handlers_disconnect_by_func (workspace,
shell_app_monitor_on_window_added,
self);
@@ -397,17 +419,11 @@ shell_app_monitor_on_n_workspaces_changed (MetaScreen *screen,
static void
init_window_monitoring (ShellAppMonitor *self)
{
- MetaScreen *screen;
-
- g_object_get (shell_global_get (),
- "screen", &screen,
- NULL);
+ MetaScreen *screen = shell_global_get_screen (shell_global_get ());
g_signal_connect (screen, "notify::n-workspaces",
G_CALLBACK (shell_app_monitor_on_n_workspaces_changed), self);
shell_app_monitor_on_n_workspaces_changed (screen, NULL, self);
-
- g_object_unref (screen);
}
static void
@@ -418,6 +434,7 @@ shell_app_monitor_init (ShellAppMonitor *self)
Display *xdisplay;
char *path;
char *shell_config_dir;
+
/* FIXME: should we create as many monitors as there are GdkScreens? */
display = gdk_display_get_default();
xdisplay = GDK_DISPLAY_XDISPLAY (display);
@@ -545,7 +562,7 @@ update_app_info (ShellAppMonitor *monitor)
{
char *wm_class;
ShellGlobal *global;
- GHashTable *app_active_times = NULL; /* GTime spent per activity */
+ GHashTable *app_active_times = NULL; /* last active time for an application */
MetaScreen *screen;
MetaDisplay *display;
MetaWindow *active;
diff --git a/src/shell-global.c b/src/shell-global.c
index 46d6052..a197aa2 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -101,7 +101,7 @@ shell_global_get_property(GObject *object,
g_value_set_object (value, mutter_plugin_get_overlay_group (global->plugin));
break;
case PROP_SCREEN:
- g_value_set_object (value, mutter_plugin_get_screen (global->plugin));
+ g_value_set_object (value, shell_global_get_screen (global));
break;
case PROP_SCREEN_WIDTH:
{
@@ -609,6 +609,17 @@ shell_global_set_stage_input_region (ShellGlobal *global,
}
/**
+ * shell_global_get_screen:
+ *
+ * Return value: (transfer none): The default #MetaScreen
+ */
+MetaScreen *
+shell_global_get_screen (ShellGlobal *global)
+{
+ return mutter_plugin_get_screen (global->plugin);
+}
+
+/**
* shell_global_get_windows:
*
* Gets the list of MutterWindows for the plugin's screen
diff --git a/src/shell-global.h b/src/shell-global.h
index 2192b75..0b641a5 100644
--- a/src/shell-global.h
+++ b/src/shell-global.h
@@ -48,6 +48,8 @@ ClutterActor *shell_get_event_related(ClutterEvent *event);
ShellGlobal *shell_global_get (void);
+MetaScreen *shell_global_get_screen (ShellGlobal *global);
+
void shell_global_grab_dbus_service (ShellGlobal *global);
void shell_global_start_task_panel (ShellGlobal *global);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]