diff --git a/docs/bindings/keys.md b/docs/bindings/keys.md index 5abc716b..be8757c2 100644 --- a/docs/bindings/keys.md +++ b/docs/bindings/keys.md @@ -88,7 +88,7 @@ bindr=Super,Super_L,spawn,rofi -show run | Command | Param | Description | | :--- | :--- | :--- | -| `killclient` | - | Close the focused window. | +| `killclient` | `force` | Close the focused window. If `force` is specified, sends `SIGKILL`. | | `togglefloating` | - | Toggle floating state. | | `toggle_all_floating` | - | Toggle all visible clients floating state. | | `togglefullscreen` | - | Toggle fullscreen. | diff --git a/src/action/client.h b/src/action/client.h index b7960d70..f374ca14 100644 --- a/src/action/client.h +++ b/src/action/client.h @@ -86,4 +86,10 @@ void client_active(Client *c) { target = get_tags_first_tag(c->tags); view_in_mon(&(Arg){.ui = target}, true, c->mon, true); focusclient(c, 1); +} + +void client_pending_force_kill(Client *c) { + if (!c) + return; + kill(c->pid, SIGKILL); } \ No newline at end of file diff --git a/src/config/parse_config.h b/src/config/parse_config.h index b15e34a5..5379ddca 100644 --- a/src/config/parse_config.h +++ b/src/config/parse_config.h @@ -559,6 +559,26 @@ int32_t parse_direction(const char *str) { } } +int32_t parse_force(const char *str) { + // 将输入字符串转换为小写 + char lowerStr[10]; + int32_t i = 0; + while (str[i] && i < 9) { + lowerStr[i] = tolower(str[i]); + i++; + } + lowerStr[i] = '\0'; + + // 根据转换后的小写字符串返回对应的枚举值 + if (strcmp(lowerStr, "unforce") == 0) { + return UNFORCE; + } else if (strcmp(lowerStr, "force") == 0) { + return FORCE; + } else { + return UNFORCE; + } +} + int32_t parse_fold_state(const char *str) { // 将输入字符串转换为小写 char lowerStr[10]; @@ -1029,6 +1049,7 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value, (*arg).i = atoi(arg_value); } else if (strcmp(func_name, "killclient") == 0) { func = killclient; + (*arg).i = parse_force(arg_value); } else if (strcmp(func_name, "centerwin") == 0) { func = centerwin; } else if (strcmp(func_name, "focuslast") == 0) { diff --git a/src/dispatch/bind_define.h b/src/dispatch/bind_define.h index b834ff5f..cf0f770a 100644 --- a/src/dispatch/bind_define.h +++ b/src/dispatch/bind_define.h @@ -345,7 +345,11 @@ int32_t setmfact(const Arg *arg) { int32_t killclient(const Arg *arg) { Client *c = arg->tc ? arg->tc : (selmon ? selmon->sel : NULL); if (c) { - pending_kill_client(c); + if (arg->i == FORCE) { + client_pending_force_kill(c); + } else { + pending_kill_client(c); + } } return 0; } diff --git a/src/mango.c b/src/mango.c index 47f12325..2f503a5e 100644 --- a/src/mango.c +++ b/src/mango.c @@ -190,6 +190,7 @@ enum { NONE, OPEN, MOVE, CLOSE, TAG, FOCUS, OPAFADEIN, OPAFADEOUT, OVERVIEW }; enum { UNFOLD, FOLD, INVALIDFOLD }; enum { PREV, NEXT }; enum { STATE_UNSPECIFIED = 0, STATE_ENABLED, STATE_DISABLED }; +enum { FORCE, UNFORCE }; enum tearing_mode { TEARING_DISABLED = 0,