feat: add force option in killclient

This commit is contained in:
Davide Greco 2026-06-04 10:42:26 +08:00 committed by DreamMaoMao
parent 13e9cfb237
commit cc20d5cff0
5 changed files with 34 additions and 2 deletions

View file

@ -88,7 +88,7 @@ bindr=Super,Super_L,spawn,rofi -show run
| Command | Param | Description | | Command | Param | Description |
| :--- | :--- | :--- | | :--- | :--- | :--- |
| `killclient` | - | Close the focused window. | | `killclient` | `force` | Close the focused window. If `force` is specified, sends `SIGKILL`. |
| `togglefloating` | - | Toggle floating state. | | `togglefloating` | - | Toggle floating state. |
| `toggle_all_floating` | - | Toggle all visible clients floating state. | | `toggle_all_floating` | - | Toggle all visible clients floating state. |
| `togglefullscreen` | - | Toggle fullscreen. | | `togglefullscreen` | - | Toggle fullscreen. |

View file

@ -87,3 +87,9 @@ void client_active(Client *c) {
view_in_mon(&(Arg){.ui = target}, true, c->mon, true); view_in_mon(&(Arg){.ui = target}, true, c->mon, true);
focusclient(c, 1); focusclient(c, 1);
} }
void client_pending_force_kill(Client *c) {
if (!c)
return;
kill(c->pid, SIGKILL);
}

View file

@ -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) { int32_t parse_fold_state(const char *str) {
// 将输入字符串转换为小写 // 将输入字符串转换为小写
char lowerStr[10]; char lowerStr[10];
@ -1029,6 +1049,7 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value,
(*arg).i = atoi(arg_value); (*arg).i = atoi(arg_value);
} else if (strcmp(func_name, "killclient") == 0) { } else if (strcmp(func_name, "killclient") == 0) {
func = killclient; func = killclient;
(*arg).i = parse_force(arg_value);
} else if (strcmp(func_name, "centerwin") == 0) { } else if (strcmp(func_name, "centerwin") == 0) {
func = centerwin; func = centerwin;
} else if (strcmp(func_name, "focuslast") == 0) { } else if (strcmp(func_name, "focuslast") == 0) {

View file

@ -345,8 +345,12 @@ int32_t setmfact(const Arg *arg) {
int32_t killclient(const Arg *arg) { int32_t killclient(const Arg *arg) {
Client *c = arg->tc ? arg->tc : (selmon ? selmon->sel : NULL); Client *c = arg->tc ? arg->tc : (selmon ? selmon->sel : NULL);
if (c) { if (c) {
if (arg->i == FORCE) {
client_pending_force_kill(c);
} else {
pending_kill_client(c); pending_kill_client(c);
} }
}
return 0; return 0;
} }

View file

@ -190,6 +190,7 @@ enum { NONE, OPEN, MOVE, CLOSE, TAG, FOCUS, OPAFADEIN, OPAFADEOUT, OVERVIEW };
enum { UNFOLD, FOLD, INVALIDFOLD }; enum { UNFOLD, FOLD, INVALIDFOLD };
enum { PREV, NEXT }; enum { PREV, NEXT };
enum { STATE_UNSPECIFIED = 0, STATE_ENABLED, STATE_DISABLED }; enum { STATE_UNSPECIFIED = 0, STATE_ENABLED, STATE_DISABLED };
enum { FORCE, UNFORCE };
enum tearing_mode { enum tearing_mode {
TEARING_DISABLED = 0, TEARING_DISABLED = 0,