mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2025-11-16 06:59:52 -05:00
fix: miss free kb_layout string
This commit is contained in:
parent
3243de5db8
commit
bc9accd08d
3 changed files with 31 additions and 35 deletions
|
|
@ -113,7 +113,8 @@ void dwl_ipc_output_printstatus_to(DwlIpcOutput *ipc_output) {
|
|||
struct wlr_keyboard *keyboard;
|
||||
xkb_layout_index_t current;
|
||||
int tagmask, state, numclients, focused_client, tag;
|
||||
const char *title, *appid, *symbol, *kb_layout;
|
||||
const char *title, *appid, *symbol;
|
||||
char kb_layout[32];
|
||||
focused = focustop(monitor);
|
||||
zdwl_ipc_output_v2_send_active(ipc_output->resource, monitor == selmon);
|
||||
|
||||
|
|
@ -151,8 +152,8 @@ void dwl_ipc_output_printstatus_to(DwlIpcOutput *ipc_output) {
|
|||
keyboard = &kb_group->wlr_group->keyboard;
|
||||
current = xkb_state_serialize_layout(keyboard->xkb_state,
|
||||
XKB_STATE_LAYOUT_EFFECTIVE);
|
||||
kb_layout =
|
||||
get_layout_abbr(xkb_keymap_layout_get_name(keyboard->keymap, current));
|
||||
get_layout_abbr(kb_layout,
|
||||
xkb_keymap_layout_get_name(keyboard->keymap, current));
|
||||
|
||||
zdwl_ipc_output_v2_send_layout(
|
||||
ipc_output->resource,
|
||||
|
|
|
|||
|
|
@ -44,11 +44,15 @@ char *get_autostart_path(char *autostart_path, unsigned int buf_size) {
|
|||
return autostart_path;
|
||||
}
|
||||
|
||||
const char *get_layout_abbr(const char *full_name) {
|
||||
void get_layout_abbr(char *abbr, const char *full_name) {
|
||||
// 清空输出缓冲区
|
||||
abbr[0] = '\0';
|
||||
|
||||
// 1. 尝试在映射表中查找
|
||||
for (int i = 0; layout_mappings[i].full_name != NULL; i++) {
|
||||
if (strcmp(full_name, layout_mappings[i].full_name) == 0) {
|
||||
return layout_mappings[i].abbr;
|
||||
strcpy(abbr, layout_mappings[i].abbr);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -58,21 +62,16 @@ const char *get_layout_abbr(const char *full_name) {
|
|||
if (open && close && close > open) {
|
||||
unsigned int len = close - open - 1;
|
||||
if (len > 0 && len <= 4) {
|
||||
char *abbr = malloc(len + 1);
|
||||
if (abbr) {
|
||||
// 提取并转换为小写
|
||||
for (unsigned int j = 0; j < len; j++) {
|
||||
abbr[j] = tolower(open[j + 1]);
|
||||
}
|
||||
abbr[len] = '\0';
|
||||
return abbr;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 提取前2-3个字母并转换为小写
|
||||
char *abbr = malloc(4);
|
||||
if (abbr) {
|
||||
unsigned int j = 0;
|
||||
for (unsigned int i = 0; full_name[i] != '\0' && j < 3; i++) {
|
||||
if (isalpha(full_name[i])) {
|
||||
|
|
@ -82,22 +81,18 @@ const char *get_layout_abbr(const char *full_name) {
|
|||
abbr[j] = '\0';
|
||||
|
||||
// 确保至少2个字符
|
||||
if (j >= 2)
|
||||
return abbr;
|
||||
free(abbr);
|
||||
if (j >= 2) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 4. 回退方案:使用首字母小写
|
||||
char *fallback = malloc(3);
|
||||
if (fallback) {
|
||||
fallback[0] = tolower(full_name[0]);
|
||||
fallback[1] = full_name[1] ? tolower(full_name[1]) : '\0';
|
||||
fallback[2] = '\0';
|
||||
return fallback;
|
||||
}
|
||||
|
||||
if (j == 1) {
|
||||
abbr[1] = full_name[1] ? tolower(full_name[1]) : '\0';
|
||||
abbr[2] = '\0';
|
||||
} else {
|
||||
// 5. 最终回退:返回 "xx"
|
||||
return strdup("xx");
|
||||
strcpy(abbr, "xx");
|
||||
}
|
||||
}
|
||||
|
||||
void xytonode(double x, double y, struct wlr_surface **psurface, Client **pc,
|
||||
|
|
|
|||
|
|
@ -693,7 +693,7 @@ wlr_scene_tree_snapshot(struct wlr_scene_node *node,
|
|||
struct wlr_scene_tree *parent);
|
||||
static bool is_scroller_layout(Monitor *m);
|
||||
static void create_output(struct wlr_backend *backend, void *data);
|
||||
static const char *get_layout_abbr(const char *full_name);
|
||||
static void get_layout_abbr(char *abbr, const char *full_name);
|
||||
static void apply_named_scratchpad(Client *target_client);
|
||||
static Client *get_client_by_id_or_title(const char *arg_id,
|
||||
const char *arg_title);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue