[gnome-shell] notificationDaemon: Match app based on WM_CLASS
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] notificationDaemon: Match app based on WM_CLASS
- Date: Fri, 27 Apr 2012 19:49:45 +0000 (UTC)
commit 2e8881b77cf1f054fbefb164040b538e15b29225
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Sun Apr 8 22:39:59 2012 -0300
notificationDaemon: Match app based on WM_CLASS
Most tray applets won't have an associated window in the same PID. We
need to fall back to the WM_CLASS in this case.
https://bugzilla.gnome.org/show_bug.cgi?id=673761
js/ui/notificationDaemon.js | 18 +++++++++++-
src/shell-app-system.c | 36 ++++++++++++++++++++++++
src/shell-app-system.h | 3 +-
src/shell-window-tracker.c | 64 +++---------------------------------------
4 files changed, 60 insertions(+), 61 deletions(-)
---
diff --git a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js
index f474fbe..5a20e7c 100644
--- a/js/ui/notificationDaemon.js
+++ b/js/ui/notificationDaemon.js
@@ -578,11 +578,27 @@ const Source = new Lang.Class({
return true;
},
+ _getApp: function() {
+ let app;
+
+ app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
+ if (app != null)
+ return app;
+
+ if (this.trayIcon) {
+ app = Shell.AppSystem.get_default().lookup_wmclass(this.trayIcon.wmclass);
+ if (app != null)
+ return app;
+ }
+
+ return null;
+ },
+
_setApp: function() {
if (this.app)
return;
- this.app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
+ this.app = this._getApp();
if (!this.app)
return;
diff --git a/src/shell-app-system.c b/src/shell-app-system.c
index 2528e9f..a7d1441 100644
--- a/src/shell-app-system.c
+++ b/src/shell-app-system.c
@@ -609,6 +609,42 @@ shell_app_system_lookup_heuristic_basename (ShellAppSystem *system,
}
/**
+ * shell_app_system_lookup_wmclass:
+ * @system: a #ShellAppSystem
+ * @wmclass: A WM_CLASS value
+ *
+ * Find a valid application corresponding to a WM_CLASS value.
+ *
+ * Returns: (transfer none): A #ShellApp for @wmclass
+ */
+ShellApp *
+shell_app_system_lookup_wmclass (ShellAppSystem *system,
+ const char *wmclass)
+{
+ char *canonicalized;
+ char *desktop_file;
+ ShellApp *app;
+
+ if (wmclass == NULL)
+ return NULL;
+
+ canonicalized = g_ascii_strdown (wmclass, -1);
+
+ /* This handles "Fedora Eclipse", probably others.
+ * Note g_strdelimit is modify-in-place. */
+ g_strdelimit (canonicalized, " ", '-');
+
+ desktop_file = g_strconcat (canonicalized, ".desktop", NULL);
+
+ app = shell_app_system_lookup_heuristic_basename (system, desktop_file);
+
+ g_free (canonicalized);
+ g_free (desktop_file);
+
+ return app;
+}
+
+/**
* shell_app_system_get_all:
* @system:
*
diff --git a/src/shell-app-system.h b/src/shell-app-system.h
index c26b728..b76c642 100644
--- a/src/shell-app-system.h
+++ b/src/shell-app-system.h
@@ -49,7 +49,8 @@ ShellApp *shell_app_system_lookup_app_for_path (ShellAppSystem *
const char *desktop_path);
ShellApp *shell_app_system_lookup_heuristic_basename (ShellAppSystem *system,
const char *id);
-
+ShellApp *shell_app_system_lookup_wmclass (ShellAppSystem *system,
+ const char *wmclass);
GSList *shell_app_system_get_all (ShellAppSystem *system);
diff --git a/src/shell-window-tracker.c b/src/shell-window-tracker.c
index cc16fe0..2e2ca48 100644
--- a/src/shell-window-tracker.c
+++ b/src/shell-window-tracker.c
@@ -127,30 +127,6 @@ shell_window_tracker_class_init (ShellWindowTrackerClass *klass)
}
/**
- * get_appid_from_window:
- *
- * Turn the WM_CLASS property into our best guess at a .desktop file id.
- */
-static char *
-get_appid_from_window (MetaWindow *window)
-{
- const char *wmclass;
- char *appid_guess;
-
- wmclass = meta_window_get_wm_class (window);
- if (!wmclass)
- return NULL;
-
- appid_guess = g_ascii_strdown (wmclass, -1);
-
- /* This handles "Fedora Eclipse", probably others.
- * Note g_strdelimit is modify-in-place. */
- g_strdelimit (appid_guess, " ", '-');
-
- return appid_guess;
-}
-
-/**
* shell_window_tracker_is_window_interesting:
*
* The ShellWindowTracker associates certain kinds of windows with
@@ -202,40 +178,6 @@ shell_window_tracker_is_window_interesting (MetaWindow *window)
}
/**
- * get_app_from_window_wmclass:
- *
- * Looks only at the given window, and attempts to determine
- * an application based on WM_CLASS. If one can't be determined,
- * return %NULL.
- *
- * Return value: (transfer full): A newly-referenced #ShellApp, or %NULL
- */
-static ShellApp *
-get_app_from_window_wmclass (MetaWindow *window)
-{
- ShellApp *app;
- ShellAppSystem *appsys;
- char *wmclass;
- char *with_desktop;
-
- appsys = shell_app_system_get_default ();
- wmclass = get_appid_from_window (window);
-
- if (!wmclass)
- return NULL;
-
- with_desktop = g_strjoin (NULL, wmclass, ".desktop", NULL);
- g_free (wmclass);
-
- app = shell_app_system_lookup_heuristic_basename (appsys, with_desktop);
- if (app != NULL)
- g_object_ref (app);
- g_free (with_desktop);
-
- return app;
-}
-
-/**
* get_app_from_window_group:
* @monitor: a #ShellWindowTracker
* @window: a #MetaWindow
@@ -328,9 +270,12 @@ static ShellApp *
get_app_for_window (ShellWindowTracker *tracker,
MetaWindow *window)
{
+ ShellAppSystem *app_system;
ShellApp *result = NULL;
const char *startup_id;
+ app_system = shell_app_system_get_default ();
+
/* First, we check whether we already know about this window,
* if so, just return that.
*/
@@ -351,7 +296,8 @@ get_app_for_window (ShellWindowTracker *tracker,
/* Check if the app's WM_CLASS specifies an app; this is
* canonical if it does.
*/
- result = get_app_from_window_wmclass (window);
+ result = shell_app_system_lookup_wmclass (app_system,
+ meta_window_get_wm_class (window));
if (result != NULL)
return result;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]