diff --git a/src/xwindow.c b/src/xwindow.c index 51852f4..41050f7 100644 --- a/src/xwindow.c +++ b/src/xwindow.c @@ -177,27 +177,29 @@ void xwindow_focus(xcb_window_t window) { * 获取目标窗口的文本属性 * @param window 目标窗口 * @param property 属性名 - * @returns 返回的信息使用后记得使用 free 释放 + * @param out 返回的信息使用后记得使用 free 释放 */ -char *xwindow_get_text_property(xcb_window_t window, xcb_atom_t property) { +void xwindow_get_text_property(xcb_window_t window, xcb_atom_t property, + char **out) { + if (out == nullptr) return; + xcb_get_property_cookie_t cookie = xcb_get_property_unchecked( wm.xcb_conn, false, window, property, XCB_ATOM_STRING, 0, UINT32_MAX); xcb_get_property_reply_t *reply = xcb_get_property_reply(wm.xcb_conn, cookie, nullptr); int length = xcb_get_property_value_length(reply); - - char *value = nullptr; + char *value = xcb_get_property_value(reply); if (reply && (reply->type == XCB_ATOM_STRING || reply->type == UTF8_STRING || reply->type == COMPOUND_TEXT) && - reply->format == 8 && length) { - value = p_new(char, length + 1); - memcpy(value, xcb_get_property_value(reply), length); - value[length] = '\0'; + reply->format == 8 && length && + (*out == nullptr || strncmp(*out, value, length) != 0)) { + if (*out) p_delete(out); + *out = p_new(char, length + 1); + memcpy(*out, value, length); + (*out)[length] = '\0'; } p_delete(&reply); - - return value; } diff --git a/src/xwindow.h b/src/xwindow.h index 9cc1716..c65d931 100644 --- a/src/xwindow.h +++ b/src/xwindow.h @@ -18,7 +18,8 @@ void xwindow_grab_keys(xcb_window_t window, const keyboard_t *keys, int keys_length); bool xwindow_send_event(xcb_window_t window, xcb_atom_t atom); void xwindow_focus(xcb_window_t window); -char *xwindow_get_text_property(xcb_window_t window, xcb_atom_t property); +void xwindow_get_text_property(xcb_window_t window, xcb_atom_t property, + char **out); #define xwindow_set_name_static(window, name) \ xcb_icccm_set_wm_name(wm.xcb_conn, window, XCB_ATOM_STRING, 8, \