/** * get_app_for_window: * * Determines the application associated with a window, using * all available information such as the window's MetaGroup, * and what we know about other windows. */ static ShellApp * get_app_for_window (ShellWindowTracker *monitor, MetaWindow *window) { ShellApp *result; const char *startup_id; result = NULL; /* First, we check whether we already know about this window, * if so, just return that. */ if (meta_window_get_window_type (window) == META_WINDOW_NORMAL) { result = g_hash_table_lookup (monitor->window_to_app, window); if (result != NULL) { g_object_ref (result); return result; } } /* Check if the app's WM_CLASS specifies an app */ result = get_app_from_window_wmclass (window); if (result != NULL) return result; /* Now we check whether we have a match through startup-notification */ startup_id = meta_window_get_startup_id (window); if (startup_id) { GSList *iter, *sequences; sequences = shell_window_tracker_get_startup_sequences (monitor); for (iter = sequences; iter; iter = iter->next) { ShellStartupSequence *sequence = iter->data; const char *id = shell_startup_sequence_get_id (sequence); if (strcmp (id, startup_id) != 0) continue; result = shell_startup_sequence_get_app (sequence); if (result) break; } } /* If we didn't get a startup-notification match, see if we matched * any other windows in the group. */ if (result == NULL) result = get_app_from_window_group (monitor, window); /* Our last resort - we create a fake app from the window */ if (result == NULL) result = shell_app_system_get_app_for_window (shell_app_system_get_default (), window); return result; }
/** * get_app_for_window: * * Determines the application associated with a window, using * all available information such as the window's MetaGroup, * and what we know about other windows. * * Returns: (transfer full): a #CinnamonApp, or NULL if none is found */ static CinnamonApp * get_app_for_window (CinnamonWindowTracker *tracker, MetaWindow *window) { CinnamonApp *result = NULL; const char *startup_id; /* First, we check whether we already know about this window, * if so, just return that. */ if (meta_window_get_window_type (window) == META_WINDOW_NORMAL || meta_window_is_remote (window)) { result = g_hash_table_lookup (tracker->window_to_app, window); if (result != NULL) { g_object_ref (result); return result; } } if (meta_window_is_remote (window)) return _cinnamon_app_new_for_window (window); /* Check if the window has a GApplication ID attached; this is * canonical if it does */ result = get_app_from_gapplication_id (window); if (result != NULL) return result; /* Check if the app's WM_CLASS specifies an app; this is * canonical if it does. */ result = get_app_from_window_wmclass (window); if (result != NULL) return result; result = get_app_from_window_pid (tracker, window); if (result != NULL) return result; /* Now we check whether we have a match through startup-notification */ startup_id = meta_window_get_startup_id (window); if (startup_id) { GSList *iter, *sequences; sequences = cinnamon_window_tracker_get_startup_sequences (tracker); for (iter = sequences; iter; iter = iter->next) { CinnamonStartupSequence *sequence = iter->data; const char *id = cinnamon_startup_sequence_get_id (sequence); if (strcmp (id, startup_id) != 0) continue; result = cinnamon_startup_sequence_get_app (sequence); if (result) { result = g_object_ref (result); break; } } } /* If we didn't get a startup-notification match, see if we matched * any other windows in the group. */ if (result == NULL) result = get_app_from_window_group (tracker, window); /* Our last resort - we create a fake app from the window */ if (result == NULL) result = _cinnamon_app_new_for_window (window); return result; }