/** * 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; }
const char * cinnamon_app_get_name (CinnamonApp *app) { if (app->entry) return g_app_info_get_name (G_APP_INFO (gmenu_tree_entry_get_app_info (app->entry))); else if (app->running_state == NULL) return _("Unknown"); else { MetaWindow *window = window_backed_app_get_window (app); const char *name; name = meta_window_get_wm_class (window); if (!name) name = _("Unknown"); return name; } }
char * shell_app_info_get_name (ShellAppInfo *info) { switch (info->type) { case SHELL_APP_INFO_TYPE_ENTRY: return g_strdup (gmenu_tree_entry_get_name ((GMenuTreeEntry*)info->entry)); case SHELL_APP_INFO_TYPE_DESKTOP_FILE: return g_key_file_get_locale_string (info->keyfile, DESKTOP_ENTRY_GROUP, "Name", NULL, NULL); case SHELL_APP_INFO_TYPE_WINDOW: { const char *name; name = meta_window_get_wm_class (info->window); if (!name) name = _("Unknown"); return g_strdup (name); } } g_assert_not_reached (); return NULL; }
/** * 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 #CinnamonApp, or %NULL */ static CinnamonApp * get_app_from_window_wmclass (MetaWindow *window) { CinnamonApp *app; CinnamonAppSystem *appsys; const char *wm_class; const char *wm_instance; appsys = cinnamon_app_system_get_default (); /* Notes on the heuristics used here: much of the complexity here comes from the desire to support Chrome apps. From https://bugzilla.gnome.org/show_bug.cgi?id=673657#c13 Currently chrome sets WM_CLASS as follows (the first string is the 'instance', the second one is the 'class': For the normal browser: WM_CLASS(STRING) = "chromium", "Chromium" For a bookmarked page (through 'Tools -> Create application shortcuts') WM_CLASS(STRING) = "wiki.gnome.org__GnomeShell_ApplicationBased", "Chromium" For an application from the chrome store (with a .desktop file created through right click, "Create shortcuts" from Chrome's apps overview) WM_CLASS(STRING) = "crx_blpcfgokakmgnkcojhhkbfbldkacnbeo", "Chromium" The .desktop file has a matching StartupWMClass, but the name differs, e.g. for the store app (youtube) there is .local/share/applications/chrome-blpcfgokakmgnkcojhhkbfbldkacnbeo-Default.desktop with StartupWMClass=crx_blpcfgokakmgnkcojhhkbfbldkacnbeo Note that chromium (but not google-chrome!) includes a StartupWMClass=chromium in their .desktop file, so we must match the instance first. Also note that in the good case (regular gtk+ app without hacks), instance and class are the same except for case and there is no StartupWMClass at all. */ /* first try a match from WM_CLASS (instance part) to StartupWMClass */ wm_instance = meta_window_get_wm_class_instance (window); app = cinnamon_app_system_lookup_startup_wmclass (appsys, wm_instance); if (app != NULL) return g_object_ref (app); /* then try a match from WM_CLASS to StartupWMClass */ wm_class = meta_window_get_wm_class (window); app = cinnamon_app_system_lookup_startup_wmclass (appsys, wm_class); if (app != NULL) return g_object_ref (app); /* then try a match from WM_CLASS (instance part) to .desktop */ app = cinnamon_app_system_lookup_desktop_wmclass (appsys, wm_instance); if (app != NULL) return g_object_ref (app); /* finally, try a match from WM_CLASS to .desktop */ app = cinnamon_app_system_lookup_desktop_wmclass (appsys, wm_class); if (app != NULL) return g_object_ref (app); return NULL; }