/* * Updates the name by using WM_NAME (encoded in COMPOUND_TEXT). We do not * touch what the client sends us but pass it to xcb_image_text_8. To get * proper unicode rendering, the application has to use _NET_WM_NAME (see * window_update_name()). * */ void window_update_name_legacy(i3Window *win, xcb_get_property_reply_t *prop, bool before_mgmt) { if (prop == NULL || xcb_get_property_value_length(prop) == 0) { DLOG("WM_NAME not set (_NET_WM_NAME is what you want anyways).\n"); FREE(prop); return; } /* ignore update when the window is known to already have a UTF-8 name */ if (win->uses_net_wm_name) { free(prop); return; } i3string_free(win->name); win->name = i3string_from_utf8_with_length(xcb_get_property_value(prop), xcb_get_property_value_length(prop)); LOG("WM_NAME changed to \"%s\"\n", i3string_as_utf8(win->name)); LOG("Using legacy window title. Note that in order to get Unicode window " "titles in i3, the application has to set _NET_WM_NAME (UTF-8)\n"); win->name_x_changed = true; if (before_mgmt) { free(prop); return; } run_assignments(win); free(prop); }
/* * Parse a string (change) * */ static int mode_string_cb(void *params_, const unsigned char *val, size_t len) { struct mode_json_params *params = (struct mode_json_params *)params_; if (!strcmp(params->cur_key, "change")) { /* Save the name */ params->mode->name = i3string_from_markup_with_length((const char *)val, len); /* Save its rendered width */ params->mode->width = predict_text_width(params->mode->name); DLOG("Got mode change: %s\n", i3string_as_utf8(params->mode->name)); FREE(params->cur_key); return 1; } return 0; }
/* * Start parsing the received JSON string * */ void parse_mode_json(char *json) { /* FIXME: Fasciliate stream processing, i.e. allow starting to interpret * JSON in chunks */ struct mode_json_params params; mode binding; params.cur_key = NULL; params.json = json; params.mode = &binding; yajl_handle handle; yajl_status state; handle = yajl_alloc(&mode_callbacks, NULL, (void *)¶ms); state = yajl_parse(handle, (const unsigned char *)json, strlen(json)); /* FIXME: Propper error handling for JSON parsing */ switch (state) { case yajl_status_ok: break; case yajl_status_client_canceled: case yajl_status_error: ELOG("Could not parse mode event!\n"); exit(EXIT_FAILURE); break; } /* We don't want to indicate default binding mode */ if (strcmp("default", i3string_as_utf8(params.mode->name)) == 0) I3STRING_FREE(params.mode->name); /* Set the new binding mode */ set_current_mode(&binding); yajl_free(handle); FREE(params.cur_key); }
/* * Updates the name by using _NET_WM_NAME (encoded in UTF-8) for the given * window. Further updates using window_update_name_legacy will be ignored. * */ void window_update_name(i3Window *win, xcb_get_property_reply_t *prop, bool before_mgmt) { if (prop == NULL || xcb_get_property_value_length(prop) == 0) { DLOG("_NET_WM_NAME not specified, not changing\n"); FREE(prop); return; } i3string_free(win->name); win->name = i3string_from_utf8_with_length(xcb_get_property_value(prop), xcb_get_property_value_length(prop)); win->name_x_changed = true; LOG("_NET_WM_NAME changed to \"%s\"\n", i3string_as_utf8(win->name)); win->uses_net_wm_name = true; if (before_mgmt) { free(prop); return; } run_assignments(win); free(prop); }