* in. If set to true, legacy window names are ignored. */
bool uses_net_wm_name;
- /** Holds the WM_CLASS, useful for matching the client in commands */
- char *window_class;
+ /** Holds the WM_CLASS (which consists of two strings, the instance
+ * and the class), useful for matching the client in commands */
+ char *window_class_instance;
+ char *window_class_class;
/** Holds the client’s mark, for vim-like jumping */
char *mark;
bool client_matches_class_name(Client *client, char *to_class, char *to_title,
char *to_title_ucs, int to_title_ucs_len) {
/* Check if the given class is part of the window class */
- if (client->window_class == NULL || strcasestr(client->window_class, to_class) == NULL)
+ if ((client->window_class_instance == NULL ||
+ strcasestr(client->window_class_instance, to_class) == NULL) &&
+ (client->window_class_class == NULL ||
+ strcasestr(client->window_class_class, to_class) == NULL))
return false;
/* If no title was given, we’re done */
client->urgent = false;
workspace_update_urgent_flag(client->workspace);
- FREE(client->window_class);
+ FREE(client->window_class_instance);
+ FREE(client->window_class_class);
FREE(client->name);
free(client);
Client *client = table_get(&by_child, window);
if (client == NULL)
return 1;
- char *new_class;
- if (asprintf(&new_class, "%.*s", xcb_get_property_value_length(prop), (char*)xcb_get_property_value(prop)) == -1) {
- perror("Could not get window class");
- LOG("Could not get window class\n");
- return 1;
- }
- LOG("WM_CLASS changed to %s\n", new_class);
- char *old_class = client->window_class;
- client->window_class = new_class;
- FREE(old_class);
+ /* We cannot use asprintf here since this property contains two
+ * null-terminated strings (for compatibility reasons). Instead, we
+ * use strdup() on both strings */
+ char *new_class = xcb_get_property_value(prop);
- if (!client->initialized)
- return 1;
+ FREE(client->window_class_instance);
+ FREE(client->window_class_class);
- if (strcmp(new_class, "tools") == 0 || strcmp(new_class, "Dialog") == 0) {
- LOG("tool/dialog window, should we put it floating?\n");
- if (client->floating == FLOATING_AUTO_OFF)
- toggle_floating_mode(conn, client, true);
- }
+ client->window_class_instance = strdup(new_class);
+ if ((strlen(new_class) + 1) < xcb_get_property_value_length(prop))
+ client->window_class_class = strdup(new_class + strlen(new_class) + 1);
+ else client->window_class_class = NULL;
+ LOG("WM_CLASS changed to %s (instance), %s (class)\n",
+ client->window_class_instance, client->window_class_class);
- return 1;
+ return 0;
}
/*
Client *client;
SLIST_FOREACH(client, &(ws->focus_stack), focus_clients) {
- LOG("Checking client with class=%s, name=%s\n", client->window_class, client->name);
+ LOG("Checking client with class=%s / %s, name=%s\n", client->window_class_instance,
+ client->window_class_class, client->name);
if (!client_matches_class_name(client, to_class, to_title, to_title_ucs, to_title_ucs_len))
continue;