diff --git a/src/animation/client.h b/src/animation/client.h index 8de9b06..7bc47ac 100644 --- a/src/animation/client.h +++ b/src/animation/client.h @@ -1054,11 +1054,20 @@ void client_set_focused_opacity_animation(Client *c) { sizeof(c->opacity_animation.target_border_color)); c->opacity_animation.target_opacity = c->focused_opacity; c->opacity_animation.time_started = get_now_in_ms(); - memcpy(c->opacity_animation.initial_border_color, - c->opacity_animation.current_border_color, - sizeof(c->opacity_animation.initial_border_color)); - c->opacity_animation.initial_opacity = c->opacity_animation.current_opacity; - + if (c->opacity_animation.running) { + memcpy(c->opacity_animation.initial_border_color, + c->opacity_animation.current_border_color, + sizeof(c->opacity_animation.initial_border_color)); + c->opacity_animation.initial_opacity = + c->opacity_animation.current_opacity; + } else { + memcpy(c->opacity_animation.initial_border_color, bordercolor, + sizeof(c->opacity_animation.initial_border_color)); + memcpy(c->opacity_animation.current_border_color, bordercolor, + sizeof(c->opacity_animation.current_border_color)); + c->opacity_animation.initial_opacity = c->unfocused_opacity; + c->opacity_animation.current_opacity = c->unfocused_opacity; + } c->opacity_animation.running = true; } @@ -1078,10 +1087,20 @@ void client_set_unfocused_opacity_animation(Client *c) { c->opacity_animation.target_opacity = c->unfocused_opacity; c->opacity_animation.time_started = get_now_in_ms(); - memcpy(c->opacity_animation.initial_border_color, - c->opacity_animation.current_border_color, - sizeof(c->opacity_animation.initial_border_color)); - c->opacity_animation.initial_opacity = c->opacity_animation.current_opacity; + if (c->opacity_animation.running) { + memcpy(c->opacity_animation.initial_border_color, + c->opacity_animation.current_border_color, + sizeof(c->opacity_animation.initial_border_color)); + c->opacity_animation.initial_opacity = + c->opacity_animation.current_opacity; + } else { + memcpy(c->opacity_animation.initial_border_color, border_color, + sizeof(c->opacity_animation.initial_border_color)); + memcpy(c->opacity_animation.current_border_color, border_color, + sizeof(c->opacity_animation.current_border_color)); + c->opacity_animation.initial_opacity = c->focused_opacity; + c->opacity_animation.current_opacity = c->focused_opacity; + } c->opacity_animation.running = true; } @@ -1116,10 +1135,6 @@ bool client_apply_focus_opacity(Client *c) { if (target_opacity > opacity) { target_opacity = opacity; } - memcpy(c->opacity_animation.current_border_color, - c->opacity_animation.target_border_color, - sizeof(c->opacity_animation.current_border_color)); - c->opacity_animation.current_opacity = target_opacity; client_set_opacity(c, target_opacity); client_set_border_color(c, c->opacity_animation.target_border_color); } else if (animations && c->opacity_animation.running) { diff --git a/src/config/parse_config.h b/src/config/parse_config.h index b795a81..baef79d 100644 --- a/src/config/parse_config.h +++ b/src/config/parse_config.h @@ -405,10 +405,7 @@ int32_t parse_double_array(const char *input, double *output, char *endptr; double val = strtod(token, &endptr); if (endptr == token || *endptr != '\0') { - fprintf( - stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid number in array: %s\n", - token); + fprintf(stderr, "Error: Invalid number in array: %s\n", token); free(dup); return -1; } @@ -460,9 +457,7 @@ void parse_bind_flags(const char *str, KeyBinding *kb) { kb->ispassapply = true; break; default: - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown bind flag: %c\n", - suffix[i]); + // 忽略其他字符或可根据需要处理错误 break; } } @@ -550,58 +545,15 @@ static bool starts_with_ignore_case(const char *str, const char *prefix) { return true; } -static char *combine_args_until_empty(char *values[], int count) { - // find the first empty string - int first_empty = count; - for (int i = 0; i < count; i++) { - // check if it's empty: empty string or only contains "0" (initialized) - if (values[i][0] == '\0' || - (strlen(values[i]) == 1 && values[i][0] == '0')) { - first_empty = i; - break; - } - } - - // if there are no valid parameters, return an empty string - if (first_empty == 0) { - return strdup(""); - } - - // calculate the total length - size_t total_len = 0; - for (int i = 0; i < first_empty; i++) { - total_len += strlen(values[i]); - } - // plus the number of commas (first_empty-1 commas) - total_len += (first_empty - 1); - - // allocate memory and concatenate - char *combined = malloc(total_len + 1); - if (combined == NULL) { - return strdup(""); - } - - combined[0] = '\0'; - for (int i = 0; i < first_empty; i++) { - if (i > 0) { - strcat(combined, ","); - } - strcat(combined, values[i]); - } - - return combined; -} - uint32_t parse_mod(const char *mod_str) { if (!mod_str || !*mod_str) { - return UINT32_MAX; + return 0; } uint32_t mod = 0; char input_copy[256]; char *token; char *saveptr = NULL; - bool match_success = false; // 复制并转换为小写 strncpy(input_copy, mod_str, sizeof(input_copy) - 1); @@ -639,56 +591,35 @@ uint32_t parse_mod(const char *mod_str) { case 108: mod |= WLR_MODIFIER_ALT; break; - default: - fprintf(stderr, - "unknown modifier keycode: \033[1m\033[31m%s\n", - token); - break; } } } else { // 完整的 modifier 检查(保留原始所有检查项) - if (!strcmp(token, "super") || !strcmp(token, "super_l") || - !strcmp(token, "super_r")) { + if (strstr(token, "super") || strstr(token, "super_l") || + strstr(token, "super_r")) { mod |= WLR_MODIFIER_LOGO; - match_success = true; } - if (!strcmp(token, "ctrl") || !strcmp(token, "ctrl_l") || - !strcmp(token, "ctrl_r")) { + if (strstr(token, "ctrl") || strstr(token, "ctrl_l") || + strstr(token, "ctrl_r")) { mod |= WLR_MODIFIER_CTRL; - match_success = true; } - if (!strcmp(token, "shift") || !strcmp(token, "shift_l") || - !strcmp(token, "shift_r")) { + if (strstr(token, "shift") || strstr(token, "shift_l") || + strstr(token, "shift_r")) { mod |= WLR_MODIFIER_SHIFT; - match_success = true; } - if (!strcmp(token, "alt") || !strcmp(token, "alt_l") || - !strcmp(token, "alt_r")) { + if (strstr(token, "alt") || strstr(token, "alt_l") || + strstr(token, "alt_r")) { mod |= WLR_MODIFIER_ALT; - match_success = true; } - if (!strcmp(token, "hyper") || !strcmp(token, "hyper_l") || - !strcmp(token, "hyper_r")) { + if (strstr(token, "hyper") || strstr(token, "hyper_l") || + strstr(token, "hyper_r")) { mod |= WLR_MODIFIER_MOD3; - match_success = true; - } - if (!strcmp(token, "none")) { - match_success = true; } } token = strtok_r(NULL, "+", &saveptr); } - if (!match_success) { - mod = UINT32_MAX; - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown modifier: " - "\033[1m\033[31m%s\n", - mod_str); - } - return mod; } @@ -779,9 +710,8 @@ KeySymCode parse_key(const char *key_str, bool isbindsym) { return kc; } - // change key string to keysym, case insensitive - xkb_keysym_t sym = - xkb_keysym_from_name(key_str, XKB_KEYSYM_CASE_INSENSITIVE); + // 普通键名直接转换 + xkb_keysym_t sym = xkb_keysym_from_name(key_str, XKB_KEYSYM_NO_FLAGS); if (isbindsym) { kc.type = KEY_TYPE_SYM; @@ -805,17 +735,13 @@ KeySymCode parse_key(const char *key_str, bool isbindsym) { // 无法解析的键名 kc.type = KEY_TYPE_SYM; kc.keysym = XKB_KEY_NoSymbol; - fprintf( - stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown key: \033[1m\033[31m%s\n", - key_str); // keycode 字段保持为0 } return kc; } -uint32_t parse_button(const char *str) { +int32_t parse_button(const char *str) { // 将输入字符串转换为小写 char lowerStr[20]; int32_t i = 0; @@ -843,11 +769,7 @@ uint32_t parse_button(const char *str) { } else if (strcmp(lowerStr, "btn_task") == 0) { return BTN_TASK; } else { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown button: " - "\033[1m\033[31m%s\n", - str); - return UINT32_MAX; + return 0; } } @@ -898,12 +820,6 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value, char *arg_value5) { FuncType func = NULL; - (*arg).i = 0; - (*arg).i2 = 0; - (*arg).f = 0.0f; - (*arg).f2 = 0.0f; - (*arg).ui = 0; - (*arg).ui2 = 0; (*arg).v = NULL; (*arg).v2 = NULL; (*arg).v3 = NULL; @@ -1054,14 +970,10 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value, (*arg).ui = atoi(arg_value); } else if (strcmp(func_name, "spawn") == 0) { func = spawn; - char *values[] = {arg_value, arg_value2, arg_value3, arg_value4, - arg_value5}; - (*arg).v = combine_args_until_empty(values, 5); + (*arg).v = strdup(arg_value); } else if (strcmp(func_name, "spawn_shell") == 0) { func = spawn_shell; - char *values[] = {arg_value, arg_value2, arg_value3, arg_value4, - arg_value5}; - (*arg).v = combine_args_until_empty(values, 5); + (*arg).v = strdup(arg_value); } else if (strcmp(func_name, "spawn_on_empty") == 0) { func = spawn_on_empty; (*arg).v = strdup(arg_value); // 注意:之后需要释放这个内存 @@ -1203,7 +1115,7 @@ void run_exec_once() { } } -bool parse_option(Config *config, char *key, char *value) { +void parse_option(Config *config, char *key, char *value) { if (strcmp(key, "keymode") == 0) { snprintf(config->keymode, sizeof(config->keymode), "%.27s", value); } else if (strcmp(key, "animations") == 0) { @@ -1254,70 +1166,53 @@ bool parse_option(Config *config, char *key, char *value) { int32_t num = parse_double_array(value, config->animation_curve_move, 4); if (num != 4) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to parse " - "animation_curve_move: %s\n", + fprintf(stderr, "Error: Failed to parse animation_curve_move: %s\n", value); - return false; } } else if (strcmp(key, "animation_curve_open") == 0) { int32_t num = parse_double_array(value, config->animation_curve_open, 4); if (num != 4) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to parse " - "animation_curve_open: %s\n", + fprintf(stderr, "Error: Failed to parse animation_curve_open: %s\n", value); - return false; } } else if (strcmp(key, "animation_curve_tag") == 0) { int32_t num = parse_double_array(value, config->animation_curve_tag, 4); if (num != 4) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to parse " - "animation_curve_tag: %s\n", + fprintf(stderr, "Error: Failed to parse animation_curve_tag: %s\n", value); - return false; } } else if (strcmp(key, "animation_curve_close") == 0) { int32_t num = parse_double_array(value, config->animation_curve_close, 4); if (num != 4) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to parse " - "animation_curve_close: %s\n", + "Error: Failed to parse animation_curve_close: %s\n", value); - return false; } } else if (strcmp(key, "animation_curve_focus") == 0) { int32_t num = parse_double_array(value, config->animation_curve_focus, 4); if (num != 4) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to parse " - "animation_curve_focus: %s\n", + "Error: Failed to parse animation_curve_focus: %s\n", value); - return false; } } else if (strcmp(key, "animation_curve_opafadein") == 0) { int32_t num = parse_double_array(value, config->animation_curve_opafadein, 4); if (num != 4) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to parse " - "animation_curve_opafadein: %s\n", + "Error: Failed to parse animation_curve_opafadein: %s\n", value); - return false; } } else if (strcmp(key, "animation_curve_opafadeout") == 0) { int32_t num = parse_double_array(value, config->animation_curve_opafadeout, 4); if (num != 4) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to parse " - "animation_curve_opafadeout: %s\n", + "Error: Failed to parse animation_curve_opafadeout: %s\n", value); - return false; } } else if (strcmp(key, "scroller_structs") == 0) { config->scroller_structs = atoi(value); @@ -1438,9 +1333,8 @@ bool parse_option(Config *config, char *key, char *value) { config->scroller_proportion_preset = (float *)malloc(float_count * sizeof(float)); if (!config->scroller_proportion_preset) { - fprintf(stderr, "\033[1m\033[31m[ERROR]:\033[33m Memory " - "allocation failed\n"); - return false; + fprintf(stderr, "Error: Memory allocation failed\n"); + return; } // 3. 解析 value 中的浮点数 @@ -1453,18 +1347,16 @@ bool parse_option(Config *config, char *key, char *value) { while (token != NULL && i < float_count) { if (sscanf(token, "%f", &value_set) != 1) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid float " - "value in " + "Error: Invalid float value in " "scroller_proportion_preset: %s\n", token); free(value_copy); free(config->scroller_proportion_preset); config->scroller_proportion_preset = NULL; - return false; + return; } - // Clamp the value between 0.0 and 1.0 (or your desired - // range) + // Clamp the value between 0.0 and 1.0 (or your desired range) config->scroller_proportion_preset[i] = CLAMP_FLOAT(value_set, 0.1f, 1.0f); @@ -1475,14 +1367,13 @@ bool parse_option(Config *config, char *key, char *value) { // 4. 检查解析的浮点数数量是否匹配 if (i != float_count) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid " - "scroller_proportion_preset format: %s\n", + "Error: Invalid scroller_proportion_preset format: %s\n", value); free(value_copy); free(config->scroller_proportion_preset); // 释放已分配的内存 config->scroller_proportion_preset = NULL; // 防止野指针 config->scroller_proportion_preset_count = 0; - return false; + return; } config->scroller_proportion_preset_count = float_count; @@ -1501,9 +1392,8 @@ bool parse_option(Config *config, char *key, char *value) { config->circle_layout = (char **)malloc(string_count * sizeof(char *)); memset(config->circle_layout, 0, string_count * sizeof(char *)); if (!config->circle_layout) { - fprintf(stderr, "\033[1m\033[31m[ERROR]:\033[33m Memory " - "allocation failed\n"); - return false; + fprintf(stderr, "Error: Memory allocation failed\n"); + return; } // 3. 解析 value 中的字符串 @@ -1518,9 +1408,7 @@ bool parse_option(Config *config, char *key, char *value) { config->circle_layout[i] = strdup(cleaned_token); if (!config->circle_layout[i]) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Memory allocation " - "failed for " - "string: %s\n", + "Error: Memory allocation failed for string: %s\n", token); // 释放之前分配的内存 for (int32_t j = 0; j < i; j++) { @@ -1530,7 +1418,7 @@ bool parse_option(Config *config, char *key, char *value) { free(value_copy); config->circle_layout = NULL; // 防止野指针 config->circle_layout_count = 0; - return false; + return; } token = strtok(NULL, ","); i++; @@ -1538,10 +1426,7 @@ bool parse_option(Config *config, char *key, char *value) { // 4. 检查解析的字符串数量是否匹配 if (i != string_count) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid circle_layout " - "format: %s\n", - value); + fprintf(stderr, "Error: Invalid circle_layout format: %s\n", value); // 释放之前分配的内存 for (int32_t j = 0; j < i; j++) { free(config->circle_layout[j]); @@ -1550,7 +1435,7 @@ bool parse_option(Config *config, char *key, char *value) { free(value_copy); config->circle_layout = NULL; // 防止野指针 config->circle_layout_count = 0; - return false; + return; } config->circle_layout_count = string_count; @@ -1657,12 +1542,7 @@ bool parse_option(Config *config, char *key, char *value) { } else if (strcmp(key, "rootcolor") == 0) { int64_t color = parse_color(value); if (color == -1) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid rootcolor " - "format: " - "%s\n", - value); - return false; + fprintf(stderr, "Error: Invalid rootcolor format: %s\n", value); } else { convert_hex_to_rgba(config->rootcolor, color); } @@ -1670,90 +1550,58 @@ bool parse_option(Config *config, char *key, char *value) { } else if (strcmp(key, "shadowscolor") == 0) { int64_t color = parse_color(value); if (color == -1) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid shadowscolor " - "format: %s\n", - value); - return false; + fprintf(stderr, "Error: Invalid shadowscolor format: %s\n", value); } else { convert_hex_to_rgba(config->shadowscolor, color); } } else if (strcmp(key, "bordercolor") == 0) { int64_t color = parse_color(value); if (color == -1) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid bordercolor " - "format: %s\n", - value); - return false; + fprintf(stderr, "Error: Invalid bordercolor format: %s\n", value); } else { convert_hex_to_rgba(config->bordercolor, color); } } else if (strcmp(key, "focuscolor") == 0) { int64_t color = parse_color(value); if (color == -1) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid focuscolor " - "format: %s\n", - value); - return false; + fprintf(stderr, "Error: Invalid focuscolor format: %s\n", value); } else { convert_hex_to_rgba(config->focuscolor, color); } } else if (strcmp(key, "maximizescreencolor") == 0) { int64_t color = parse_color(value); if (color == -1) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid " - "maximizescreencolor " - "format: %s\n", + fprintf(stderr, "Error: Invalid maximizescreencolor format: %s\n", value); - return false; } else { convert_hex_to_rgba(config->maximizescreencolor, color); } } else if (strcmp(key, "urgentcolor") == 0) { int64_t color = parse_color(value); if (color == -1) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid urgentcolor " - "format: %s\n", - value); - return false; + fprintf(stderr, "Error: Invalid urgentcolor format: %s\n", value); } else { convert_hex_to_rgba(config->urgentcolor, color); } } else if (strcmp(key, "scratchpadcolor") == 0) { int64_t color = parse_color(value); if (color == -1) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid " - "scratchpadcolor " - "format: %s\n", + fprintf(stderr, "Error: Invalid scratchpadcolor format: %s\n", value); - return false; } else { convert_hex_to_rgba(config->scratchpadcolor, color); } } else if (strcmp(key, "globalcolor") == 0) { int64_t color = parse_color(value); if (color == -1) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid globalcolor " - "format: %s\n", - value); - return false; + fprintf(stderr, "Error: Invalid globalcolor format: %s\n", value); } else { convert_hex_to_rgba(config->globalcolor, color); } } else if (strcmp(key, "overlaycolor") == 0) { int64_t color = parse_color(value); if (color == -1) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid overlaycolor " - "format: %s\n", - value); - return false; + fprintf(stderr, "Error: Invalid overlaycolor format: %s\n", value); } else { convert_hex_to_rgba(config->overlaycolor, color); } @@ -1763,9 +1611,8 @@ bool parse_option(Config *config, char *key, char *value) { sizeof(ConfigMonitorRule)); if (!config->monitor_rules) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for monitor rules\n"); - return false; + "Error: Failed to allocate memory for monitor rules\n"); + return; } ConfigMonitorRule *rule = @@ -1783,7 +1630,6 @@ bool parse_option(Config *config, char *key, char *value) { rule->refresh = 0.0f; rule->vrr = 0; - bool parse_error = false; char *token = strtok(value, ","); while (token != NULL) { char *colon = strchr(token, ':'); @@ -1813,29 +1659,19 @@ bool parse_option(Config *config, char *key, char *value) { rule->refresh = CLAMP_FLOAT(atof(val), 0.001f, 1000.0f); } else if (strcmp(key, "vrr") == 0) { rule->vrr = CLAMP_INT(atoi(val), 0, 1); - } else { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown " - "monitor rule " - "option:\033[1m\033[31m %s\n", - key); - parse_error = true; } } token = strtok(NULL, ","); } config->monitor_rules_count++; - return !parse_error; } else if (strcmp(key, "tagrule") == 0) { config->tag_rules = realloc(config->tag_rules, (config->tag_rules_count + 1) * sizeof(ConfigTagRule)); if (!config->tag_rules) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for tag rules\n"); - return false; + fprintf(stderr, "Error: Failed to allocate memory for tag rules\n"); + return; } ConfigTagRule *rule = &config->tag_rules[config->tag_rules_count]; @@ -1850,7 +1686,6 @@ bool parse_option(Config *config, char *key, char *value) { rule->no_render_border = 0; rule->no_hide = 0; - bool parse_error = false; char *token = strtok(value, ","); while (token != NULL) { char *colon = strchr(token, ':'); @@ -1876,29 +1711,20 @@ bool parse_option(Config *config, char *key, char *value) { rule->nmaster = CLAMP_INT(atoi(val), 1, 99); } else if (strcmp(key, "mfact") == 0) { rule->mfact = CLAMP_FLOAT(atof(val), 0.1f, 0.9f); - } else { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown " - "tag rule " - "option:\033[1m\033[31m %s\n", - key); - parse_error = true; } } token = strtok(NULL, ","); } config->tag_rules_count++; - return !parse_error; } else if (strcmp(key, "layerrule") == 0) { config->layer_rules = realloc(config->layer_rules, (config->layer_rules_count + 1) * sizeof(ConfigLayerRule)); if (!config->layer_rules) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for layer rules\n"); - return false; + "Error: Failed to allocate memory for layer rules\n"); + return; } ConfigLayerRule *rule = &config->layer_rules[config->layer_rules_count]; @@ -1912,7 +1738,6 @@ bool parse_option(Config *config, char *key, char *value) { rule->noanim = 0; rule->noshadow = 0; - bool parse_error = false; char *token = strtok(value, ","); while (token != NULL) { char *colon = strchr(token, ':'); @@ -1936,13 +1761,6 @@ bool parse_option(Config *config, char *key, char *value) { rule->noanim = CLAMP_INT(atoi(val), 0, 1); } else if (strcmp(key, "noshadow") == 0) { rule->noshadow = CLAMP_INT(atoi(val), 0, 1); - } else { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown " - "layer rule " - "option:\033[1m\033[31m %s\n", - key); - parse_error = true; } } token = strtok(NULL, ","); @@ -1954,16 +1772,14 @@ bool parse_option(Config *config, char *key, char *value) { } config->layer_rules_count++; - return !parse_error; } else if (strcmp(key, "windowrule") == 0) { config->window_rules = realloc(config->window_rules, (config->window_rules_count + 1) * sizeof(ConfigWinRule)); if (!config->window_rules) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for window rules\n"); - return false; + "Error: Failed to allocate memory for window rules\n"); + return; } ConfigWinRule *rule = &config->window_rules[config->window_rules_count]; @@ -2019,7 +1835,6 @@ bool parse_option(Config *config, char *key, char *value) { rule->globalkeybinding = (KeyBinding){0}; - bool parse_error = false; char *token = strtok(value, ","); while (token != NULL) { char *colon = strchr(token, ':'); @@ -2119,37 +1934,17 @@ bool parse_option(Config *config, char *key, char *value) { rule->globalkeybinding.mod = parse_mod(mod_str); rule->globalkeybinding.keysymcode = parse_key(keysym_str, false); - if (rule->globalkeybinding.mod == UINT32_MAX) { - return false; - } - if (rule->globalkeybinding.keysymcode.type == - KEY_TYPE_SYM && - rule->globalkeybinding.keysymcode.keysym == - XKB_KEY_NoSymbol) { - return false; - } - } else { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown " - "window rule " - "option:\033[1m\033[31m %s\n", - key); - parse_error = true; } } token = strtok(NULL, ","); } config->window_rules_count++; - return !parse_error; } else if (strncmp(key, "env", 3) == 0) { char env_type[256], env_value[256]; if (sscanf(value, "%255[^,],%255[^\n]", env_type, env_value) < 2) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid bind format: " - "\033[1m\033[31m%s\n", - value); - return false; + fprintf(stderr, "Error: Invalid bind format: %s\n", value); + return; } trim_whitespace(env_type); trim_whitespace(env_value); @@ -2164,9 +1959,8 @@ bool parse_option(Config *config, char *key, char *value) { free(env->type); free(env->value); free(env); - fprintf(stderr, "\033[1m\033[31m[ERROR]:\033[33m Failed to " - "allocate memory for env\n"); - return false; + fprintf(stderr, "Error: Failed to allocate memory for env\n"); + return; } config->env[config->env_count] = env; @@ -2176,18 +1970,15 @@ bool parse_option(Config *config, char *key, char *value) { char **new_exec = realloc(config->exec, (config->exec_count + 1) * sizeof(char *)); if (!new_exec) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for exec\n"); - return false; + fprintf(stderr, "Error: Failed to allocate memory for exec\n"); + return; } config->exec = new_exec; config->exec[config->exec_count] = strdup(value); if (!config->exec[config->exec_count]) { - fprintf(stderr, "\033[1m\033[31m[ERROR]:\033[33m Failed to " - "duplicate exec string\n"); - return false; + fprintf(stderr, "Error: Failed to duplicate exec string\n"); + return; } config->exec_count++; @@ -2197,19 +1988,15 @@ bool parse_option(Config *config, char *key, char *value) { char **new_exec_once = realloc( config->exec_once, (config->exec_once_count + 1) * sizeof(char *)); if (!new_exec_once) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for exec_once\n"); - return false; + fprintf(stderr, "Error: Failed to allocate memory for exec_once\n"); + return; } config->exec_once = new_exec_once; config->exec_once[config->exec_once_count] = strdup(value); if (!config->exec_once[config->exec_once_count]) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to duplicate " - "exec_once string\n"); - return false; + fprintf(stderr, "Error: Failed to duplicate exec_once string\n"); + return; } config->exec_once_count++; @@ -2220,9 +2007,8 @@ bool parse_option(Config *config, char *key, char *value) { (config->key_bindings_count + 1) * sizeof(KeyBinding)); if (!config->key_bindings) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for key bindings\n"); - return false; + "Error: Failed to allocate memory for key bindings\n"); + return; } KeyBinding *binding = &config->key_bindings[config->key_bindings_count]; @@ -2233,16 +2019,12 @@ bool parse_option(Config *config, char *key, char *value) { arg_value3[256] = "0\0", arg_value4[256] = "0\0", arg_value5[256] = "0\0"; if (sscanf(value, - "%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[^" - ",],%255[" + "%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[" "^,],%255[^\n]", mod_str, keysym_str, func_name, arg_value, arg_value2, arg_value3, arg_value4, arg_value5) < 3) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid bind format: " - "\033[1m\033[31m%s\n", - value); - return false; + fprintf(stderr, "Error: Invalid bind format: %s\n", value); + return; } trim_whitespace(mod_str); trim_whitespace(keysym_str); @@ -2269,21 +2051,13 @@ bool parse_option(Config *config, char *key, char *value) { binding->keysymcode = parse_key(keysym_str, binding->keysymcode.type == KEY_TYPE_SYM); binding->mod = parse_mod(mod_str); - binding->arg.i = 0; - binding->arg.i2 = 0; - binding->arg.f = 0.0f; - binding->arg.f2 = 0.0f; - binding->arg.ui = 0; - binding->arg.ui2 = 0; binding->arg.v = NULL; binding->arg.v2 = NULL; binding->arg.v3 = NULL; binding->func = parse_func_name(func_name, &binding->arg, arg_value, arg_value2, arg_value3, arg_value4, arg_value5); - if (!binding->func || binding->mod == UINT32_MAX || - (binding->keysymcode.type == KEY_TYPE_SYM && - binding->keysymcode.keysym == XKB_KEY_NoSymbol)) { + if (!binding->func) { if (binding->arg.v) { free(binding->arg.v); binding->arg.v = NULL; @@ -2296,13 +2070,7 @@ bool parse_option(Config *config, char *key, char *value) { free(binding->arg.v3); binding->arg.v3 = NULL; } - if (!binding->func) - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown " - "dispatch in bind: " - "\033[1m\033[31m%s\n", - func_name); - return false; + fprintf(stderr, "Error: Unknown function in bind: %s\n", func_name); } else { config->key_bindings_count++; } @@ -2313,9 +2081,8 @@ bool parse_option(Config *config, char *key, char *value) { (config->mouse_bindings_count + 1) * sizeof(MouseBinding)); if (!config->mouse_bindings) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for mouse bindings\n"); - return false; + "Error: Failed to allocate memory for mouse bindings\n"); + return; } MouseBinding *binding = @@ -2327,17 +2094,12 @@ bool parse_option(Config *config, char *key, char *value) { arg_value3[256] = "0\0", arg_value4[256] = "0\0", arg_value5[256] = "0\0"; if (sscanf(value, - "%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[^" - ",],%255[" + "%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[" "^,],%255[^\n]", mod_str, button_str, func_name, arg_value, arg_value2, arg_value3, arg_value4, arg_value5) < 3) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid mousebind " - "format: " - "%s\n", - value); - return false; + fprintf(stderr, "Error: Invalid mousebind format: %s\n", value); + return; } trim_whitespace(mod_str); trim_whitespace(button_str); @@ -2350,20 +2112,13 @@ bool parse_option(Config *config, char *key, char *value) { binding->mod = parse_mod(mod_str); binding->button = parse_button(button_str); - binding->arg.i = 0; - binding->arg.i2 = 0; - binding->arg.f = 0.0f; - binding->arg.f2 = 0.0f; - binding->arg.ui = 0; - binding->arg.ui2 = 0; binding->arg.v = NULL; binding->arg.v2 = NULL; binding->arg.v3 = NULL; binding->func = parse_func_name(func_name, &binding->arg, arg_value, arg_value2, arg_value3, arg_value4, arg_value5); - if (!binding->func || binding->mod == UINT32_MAX || - binding->button == UINT32_MAX) { + if (!binding->func) { if (binding->arg.v) { free(binding->arg.v); binding->arg.v = NULL; @@ -2376,13 +2131,8 @@ bool parse_option(Config *config, char *key, char *value) { free(binding->arg.v3); binding->arg.v3 = NULL; } - if (!binding->func) - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown " - "dispatch in " - "mousebind: \033[1m\033[31m%s\n", - func_name); - return false; + fprintf(stderr, "Error: Unknown function in mousebind: %s\n", + func_name); } else { config->mouse_bindings_count++; } @@ -2392,9 +2142,8 @@ bool parse_option(Config *config, char *key, char *value) { (config->axis_bindings_count + 1) * sizeof(AxisBinding)); if (!config->axis_bindings) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for axis bindings\n"); - return false; + "Error: Failed to allocate memory for axis bindings\n"); + return; } AxisBinding *binding = @@ -2406,16 +2155,12 @@ bool parse_option(Config *config, char *key, char *value) { arg_value3[256] = "0\0", arg_value4[256] = "0\0", arg_value5[256] = "0\0"; if (sscanf(value, - "%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[^" - ",],%255[" + "%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[" "^,],%255[^\n]", mod_str, dir_str, func_name, arg_value, arg_value2, arg_value3, arg_value4, arg_value5) < 3) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid axisbind " - "format: %s\n", - value); - return false; + fprintf(stderr, "Error: Invalid axisbind format: %s\n", value); + return; } trim_whitespace(mod_str); @@ -2436,7 +2181,7 @@ bool parse_option(Config *config, char *key, char *value) { parse_func_name(func_name, &binding->arg, arg_value, arg_value2, arg_value3, arg_value4, arg_value5); - if (!binding->func || binding->mod == UINT32_MAX) { + if (!binding->func) { if (binding->arg.v) { free(binding->arg.v); binding->arg.v = NULL; @@ -2449,13 +2194,8 @@ bool parse_option(Config *config, char *key, char *value) { free(binding->arg.v3); binding->arg.v3 = NULL; } - if (!binding->func) - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown " - "dispatch in " - "axisbind: \033[1m\033[31m%s\n", - func_name); - return false; + fprintf(stderr, "Error: Unknown function in axisbind: %s\n", + func_name); } else { config->axis_bindings_count++; } @@ -2466,9 +2206,8 @@ bool parse_option(Config *config, char *key, char *value) { sizeof(SwitchBinding)); if (!config->switch_bindings) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for switch bindings\n"); - return false; + "Error: Failed to allocate memory for switch bindings\n"); + return; } SwitchBinding *binding = @@ -2480,16 +2219,12 @@ bool parse_option(Config *config, char *key, char *value) { arg_value3[256] = "0\0", arg_value4[256] = "0\0", arg_value5[256] = "0\0"; if (sscanf(value, - "%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[^" - ",],%255[" + "%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[" "^\n]", fold_str, func_name, arg_value, arg_value2, arg_value3, arg_value4, arg_value5) < 3) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid switchbind " - "format: %s\n", - value); - return false; + fprintf(stderr, "Error: Invalid switchbind format: %s\n", value); + return; } trim_whitespace(fold_str); trim_whitespace(func_name); @@ -2517,13 +2252,8 @@ bool parse_option(Config *config, char *key, char *value) { free(binding->arg.v3); binding->arg.v3 = NULL; } - - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown dispatch in " - "switchbind: " - "\033[1m\033[31m%s\n", + fprintf(stderr, "Error: Unknown function in switchbind: %s\n", func_name); - return false; } else { config->switch_bindings_count++; } @@ -2534,9 +2264,8 @@ bool parse_option(Config *config, char *key, char *value) { (config->gesture_bindings_count + 1) * sizeof(GestureBinding)); if (!config->gesture_bindings) { fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Failed to allocate " - "memory for axis gesturebind\n"); - return false; + "Error: Failed to allocate memory for axis gesturebind\n"); + return; } GestureBinding *binding = @@ -2548,16 +2277,12 @@ bool parse_option(Config *config, char *key, char *value) { arg_value3[256] = "0\0", arg_value4[256] = "0\0", arg_value5[256] = "0\0"; if (sscanf(value, - "%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[^" - ",],%255[" + "%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[^,],%255[" "^,],%255[^,],%255[^\n]", mod_str, motion_str, fingers_count_str, func_name, arg_value, arg_value2, arg_value3, arg_value4, arg_value5) < 4) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid gesturebind " - "format: %s\n", - value); - return false; + fprintf(stderr, "Error: Invalid gesturebind format: %s\n", value); + return; } trim_whitespace(mod_str); @@ -2573,12 +2298,6 @@ bool parse_option(Config *config, char *key, char *value) { binding->mod = parse_mod(mod_str); binding->motion = parse_direction(motion_str); binding->fingers_count = atoi(fingers_count_str); - binding->arg.i = 0; - binding->arg.i2 = 0; - binding->arg.f = 0.0f; - binding->arg.f2 = 0.0f; - binding->arg.ui = 0; - binding->arg.ui2 = 0; binding->arg.v = NULL; binding->arg.v2 = NULL; binding->arg.v3 = NULL; @@ -2586,7 +2305,7 @@ bool parse_option(Config *config, char *key, char *value) { parse_func_name(func_name, &binding->arg, arg_value, arg_value2, arg_value3, arg_value4, arg_value5); - if (!binding->func || binding->mod == UINT32_MAX) { + if (!binding->func) { if (binding->arg.v) { free(binding->arg.v); binding->arg.v = NULL; @@ -2599,13 +2318,8 @@ bool parse_option(Config *config, char *key, char *value) { free(binding->arg.v3); binding->arg.v3 = NULL; } - if (!binding->func) - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown " - "dispatch in " - "axisbind: \033[1m\033[31m%s\n", - func_name); - return false; + fprintf(stderr, "Error: Unknown function in axisbind: %s\n", + func_name); } else { config->gesture_bindings_count++; } @@ -2613,30 +2327,22 @@ bool parse_option(Config *config, char *key, char *value) { } else if (strncmp(key, "source", 6) == 0) { parse_config_file(config, value); } else { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Unknown keyword: " - "\033[1m\033[31m%s\n", - key); - return false; + fprintf(stderr, "Error: Unknown key: %s\n", key); } - - return true; } -bool parse_config_line(Config *config, const char *line) { +void parse_config_line(Config *config, const char *line) { char key[256], value[256]; if (sscanf(line, "%255[^=]=%255[^\n]", key, value) != 2) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m Invalid line format: %s", - line); - return false; + // fprintf(stderr, "Error: Invalid line format: %s\n", line); + return; } // Then trim each part separately trim_whitespace(key); trim_whitespace(value); - return parse_option(config, key, value); + parse_option(config, key, value); } void parse_config_file(Config *config, const char *file_path) { @@ -2655,9 +2361,7 @@ void parse_config_file(Config *config, const char *file_path) { } else { const char *home = getenv("HOME"); if (!home) { - fprintf(stderr, - "\033[1m\033[31m[ERROR]:\033[33m HOME environment " - "variable not set.\n"); + fprintf(stderr, "Error: HOME environment variable not set.\n"); return; } snprintf(full_path, sizeof(full_path), "%s/.config/mango/%s", home, @@ -2671,8 +2375,7 @@ void parse_config_file(Config *config, const char *file_path) { const char *home = getenv("HOME"); if (!home) { - fprintf(stderr, "\033[1m\033[31m[ERROR]:\033[33m HOME environment " - "variable not set.\n"); + fprintf(stderr, "Error: HOME environment variable not set.\n"); return; } snprintf(full_path, sizeof(full_path), "%s%s", home, file_path + 1); @@ -2684,29 +2387,16 @@ void parse_config_file(Config *config, const char *file_path) { } if (!file) { - fprintf(stderr, - "\033[1;31m\033[1;33m[ERROR]:\033[0m Failed to open " - "config file: %s\n", - file_path); + perror("Error opening file"); return; } char line[512]; - bool parse_correct = true; - uint32_t line_count = 0; while (fgets(line, sizeof(line), file)) { - line_count++; if (line[0] == '#' || line[0] == '\n') { continue; } - parse_correct = parse_config_line(config, line); - if (!parse_correct) { - fprintf(stderr, - "\033[1;31m╰─\033[1;33m[Index]\033[0m " - "\033[1;36m%s\033[0m:\033[1;35m%d\033[0m\n" - " \033[1;36m╰─\033[0;33m%s\033[0m\n\n", - file_path, line_count, line); - } + parse_config_line(config, line); } fclose(file); @@ -3219,8 +2909,8 @@ void set_value_default() { config.hotarea_size = hotarea_size; // 热区大小,10x10 config.hotarea_corner = hotarea_corner; config.enable_hotarea = enable_hotarea; // 是否启用鼠标热区 - config.smartgaps = smartgaps; /* 1 means no outer gap when there is - only one window */ + config.smartgaps = + smartgaps; /* 1 means no outer gap when there is only one window */ config.sloppyfocus = sloppyfocus; /* focus follows mouse */ config.gappih = gappih; /* horiz inner gap between windows */ config.gappiv = gappiv; /* vert inner gap between windows */ diff --git a/src/config/preset.h b/src/config/preset.h index ae4424f..3d05161 100644 --- a/src/config/preset.h +++ b/src/config/preset.h @@ -108,8 +108,7 @@ int32_t drag_warp_cursor = 1; int32_t xwayland_persistence = 1; /* xwayland persistence */ int32_t syncobj_enable = 0; int32_t allow_lock_transparent = 0; -double drag_tile_refresh_interval = 16.0; -double drag_floating_refresh_interval = 8.0; +double drag_refresh_interval = 16.0; int32_t allow_tearing = TEARING_DISABLED; int32_t allow_shortcuts_inhibit = SHORTCUTS_INHIBIT_ENABLE; diff --git a/src/layout/arrange.h b/src/layout/arrange.h index 3721364..6ff1dd2 100644 --- a/src/layout/arrange.h +++ b/src/layout/arrange.h @@ -210,7 +210,7 @@ void resize_tile_master_horizontal(Client *grabc, bool isdrag, int32_t offsetx, } if (last_apply_drap_time == 0 || - time - last_apply_drap_time > drag_tile_refresh_interval) { + time - last_apply_drap_time > drag_refresh_interval) { arrange(grabc->mon, false, false); last_apply_drap_time = time; } @@ -367,7 +367,7 @@ void resize_tile_master_vertical(Client *grabc, bool isdrag, int32_t offsetx, } if (last_apply_drap_time == 0 || - time - last_apply_drap_time > drag_tile_refresh_interval) { + time - last_apply_drap_time > drag_refresh_interval) { arrange(grabc->mon, false, false); last_apply_drap_time = time; } @@ -548,7 +548,7 @@ void resize_tile_scroller(Client *grabc, bool isdrag, int32_t offsetx, } if (last_apply_drap_time == 0 || - time - last_apply_drap_time > drag_tile_refresh_interval) { + time - last_apply_drap_time > drag_refresh_interval) { arrange(grabc->mon, false, false); last_apply_drap_time = time; } diff --git a/src/mango.c b/src/mango.c index 591d4f6..1d332c4 100644 --- a/src/mango.c +++ b/src/mango.c @@ -969,6 +969,7 @@ static struct wlr_xwayland *xwayland; void client_change_mon(Client *c, Monitor *m) { setmon(c, m, c->tags, true); + reset_foreign_tolevel(c); if (c->isfloating) { c->float_geom = c->geom = setclient_coordinate_center(c, c->mon, c->geom, 0, 0); @@ -1070,9 +1071,6 @@ void swallow(Client *c, Client *w) { c->tags = w->tags; c->geom = w->geom; c->float_geom = w->float_geom; - c->stack_inner_per = w->stack_inner_per; - c->master_inner_per = w->master_inner_per; - c->master_mfact_per = w->master_mfact_per; c->scroller_proportion = w->scroller_proportion; c->next_in_stack = w->next_in_stack; c->prev_in_stack = w->prev_in_stack; @@ -2025,6 +2023,7 @@ buttonpress(struct wl_listener *listener, void *data) { selmon = xytomon(cursor->x, cursor->y); client_update_oldmonname_record(grabc, selmon); setmon(grabc, selmon, 0, true); + reset_foreign_tolevel(grabc); selmon->prevsel = ISTILED(selmon->sel) ? selmon->sel : NULL; selmon->sel = grabc; tmpc = grabc; @@ -3826,12 +3825,6 @@ void init_client_properties(Client *c) { c->stack_proportion = 0.0f; c->next_in_stack = NULL; c->prev_in_stack = NULL; - memcpy(c->opacity_animation.initial_border_color, bordercolor, - sizeof(c->opacity_animation.initial_border_color)); - memcpy(c->opacity_animation.current_border_color, bordercolor, - sizeof(c->opacity_animation.current_border_color)); - c->opacity_animation.initial_opacity = c->unfocused_opacity; - c->opacity_animation.current_opacity = c->unfocused_opacity; } void // old fix to 0.5 @@ -4150,7 +4143,7 @@ void motionnotify(uint32_t time, struct wlr_input_device *device, double dx, if (grabc->isfloating) { grabc->iscustomsize = 1; if (last_apply_drap_time == 0 || - time - last_apply_drap_time > drag_floating_refresh_interval) { + time - last_apply_drap_time > drag_refresh_interval) { resize_floating_window(grabc); last_apply_drap_time = time; } @@ -4679,7 +4672,6 @@ setfloating(Client *c, int32_t floating) { Client *fc = NULL; struct wlr_box target_box; - int32_t old_floating_state = c->isfloating; c->isfloating = floating; bool window_size_outofrange = false; @@ -4749,7 +4741,7 @@ setfloating(Client *c, int32_t floating) { layers[c->isfloating ? LyrTop : LyrTile]); } - if (!c->isfloating && old_floating_state) { + if (!c->isfloating) { set_size_per(c->mon, c); } @@ -4798,7 +4790,6 @@ void setmaximizescreen(Client *c, int32_t maximizescreen) { if (c->mon->isoverview) return; - int32_t old_maximizescreen_state = c->ismaximizescreen; c->ismaximizescreen = maximizescreen; if (maximizescreen) { @@ -4828,7 +4819,7 @@ void setmaximizescreen(Client *c, int32_t maximizescreen) { wlr_scene_node_reparent(&c->scene->node, layers[c->isfloating ? LyrTop : LyrTile]); - if (!c->ismaximizescreen && old_maximizescreen_state) { + if (!c->ismaximizescreen) { set_size_per(c->mon, c); } @@ -4861,7 +4852,6 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自 if (c->mon->isoverview) return; - int32_t old_fullscreen_state = c->isfullscreen; c->isfullscreen = fullscreen; client_set_fullscreen(c, fullscreen); @@ -4899,7 +4889,7 @@ void setfullscreen(Client *c, int32_t fullscreen) // 用自定义全屏代理自 layers[fullscreen || c->isfloating ? LyrTop : LyrTile]); } - if (!c->isfullscreen && old_fullscreen_state) { + if (!c->isfullscreen) { set_size_per(c->mon, c); } @@ -5028,7 +5018,6 @@ void setmon(Client *c, Monitor *m, uint32_t newtags, bool focus) { arrange(oldmon, false, false); if (m) { /* Make sure window actually overlaps with the monitor */ - reset_foreign_tolevel(c); resize(c, c->geom, 0); c->tags = newtags ? newtags @@ -5040,6 +5029,21 @@ void setmon(Client *c, Monitor *m, uint32_t newtags, bool focus) { if (focus && !client_is_x11_popup(c)) { focusclient(focustop(selmon), 1); } + + if (m) { + + if (c->foreign_toplevel) { + remove_foreign_topleve(c); + } + + add_foreign_toplevel(c); + if (m->sel && m->sel->foreign_toplevel) + wlr_foreign_toplevel_handle_v1_set_activated( + m->sel->foreign_toplevel, false); + if (c->foreign_toplevel) + wlr_foreign_toplevel_handle_v1_set_activated(c->foreign_toplevel, + true); + } } void setpsel(struct wl_listener *listener, void *data) { @@ -5794,8 +5798,7 @@ void updatemons(struct wl_listener *listener, void *data) { if (selmon && selmon->wlr_output->enabled) { wl_list_for_each(c, &clients, link) { if (!c->mon && client_surface(c)->mapped) { - c->mon = selmon; - reset_foreign_tolevel(c); + client_change_mon(c, selmon); } } focusclient(focustop(selmon), 1); @@ -6157,22 +6160,17 @@ int32_t main(int32_t argc, char *argv[]) { char *startup_cmd = NULL; int32_t c; - while ((c = getopt(argc, argv, "s:c:hdvp")) != -1) { - if (c == 's') { + while ((c = getopt(argc, argv, "s:c:hdv")) != -1) { + if (c == 's') startup_cmd = optarg; - } else if (c == 'd') { + else if (c == 'd') log_level = WLR_DEBUG; - } else if (c == 'v') { - printf("mango " VERSION "\n"); - return EXIT_SUCCESS; - } else if (c == 'c') { + else if (c == 'v') + die("mango " VERSION); + else if (c == 'c') cli_config_path = optarg; - } else if (c == 'p') { - parse_config(); - return EXIT_SUCCESS; - } else { + else goto usage; - } } if (optind < argc) goto usage; @@ -6186,14 +6184,7 @@ int32_t main(int32_t argc, char *argv[]) { run(startup_cmd); cleanup(); return EXIT_SUCCESS; + usage: - printf("Usage: mango [OPTIONS]\n" - "\n" - "Options:\n" - " -v Show mango version\n" - " -d Enable debug log\n" - " -c Use custom configuration file\n" - " -s Execute startup command\n" - " -p Check configuration file error\n"); - return EXIT_SUCCESS; + die("Usage: %s [-v] [-d] [-c config file] [-s startup command]", argv[0]); }