diff --git a/protocols/dwl-ipc-unstable-v2.xml b/protocols/dwl-ipc-unstable-v2.xml index fb85bfa..e24f367 100644 --- a/protocols/dwl-ipc-unstable-v2.xml +++ b/protocols/dwl-ipc-unstable-v2.xml @@ -172,6 +172,8 @@ I would probably just submit raphi's patchset but I don't think that would be po + + diff --git a/src/config/parse_config.h b/src/config/parse_config.h index 67ae6cb..307c264 100644 --- a/src/config/parse_config.h +++ b/src/config/parse_config.h @@ -419,10 +419,11 @@ unsigned int parse_num_type(char *str) { } } -FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value, char *arg_value2) { +FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value, char *arg_value2, char *arg_value3, char *arg_value4) { FuncType func = NULL; (*arg).v = NULL; + (*arg).v2 = NULL; if (strcmp(func_name, "focusstack") == 0) { func = focusstack; @@ -1079,9 +1080,9 @@ void parse_config_line(Config *config, const char *line) { KeyBinding *binding = &config->key_bindings[config->key_bindings_count]; memset(binding, 0, sizeof(KeyBinding)); - char mod_str[256], keysym_str[256], func_name[256], arg_value[256] = "none",arg_value2[256] = "none"; - if (sscanf(value, "%[^,],%[^,],%[^,],%[^,],%[^\n]", mod_str, keysym_str, - func_name, arg_value, arg_value2) < 3) { + char mod_str[256], keysym_str[256], func_name[256], arg_value[256] = "none",arg_value2[256] = "none", arg_value3[256] = "none", arg_value4[256] = "none"; + if (sscanf(value, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^\n]", mod_str, keysym_str, + func_name, arg_value, arg_value2, arg_value3, arg_value4) < 3) { fprintf(stderr, "Error: Invalid bind format: %s\n", value); return; } @@ -1089,12 +1090,17 @@ void parse_config_line(Config *config, const char *line) { binding->mod = parse_mod(mod_str); binding->keysym = parse_keysym(keysym_str); binding->arg.v = NULL; - binding->func = parse_func_name(func_name, &binding->arg, arg_value, arg_value2); + binding->arg.v2 = NULL; + binding->func = parse_func_name(func_name, &binding->arg, arg_value, arg_value2, arg_value3, arg_value4); if (!binding->func) { if (binding->arg.v) { free(binding->arg.v); binding->arg.v = NULL; } + if (binding->arg.v2) { + free(binding->arg.v2); + binding->arg.v2 = NULL; + } fprintf(stderr, "Error: Unknown function in bind: %s\n", func_name); } else { config->key_bindings_count++; @@ -1113,9 +1119,9 @@ void parse_config_line(Config *config, const char *line) { &config->mouse_bindings[config->mouse_bindings_count]; memset(binding, 0, sizeof(MouseBinding)); - char mod_str[256], button_str[256], func_name[256], arg_value[256] = "none", arg_value2[256] = "none"; - if (sscanf(value, "%[^,],%[^,],%[^,],%[^,],%[^\n]", mod_str, button_str, - func_name, arg_value, arg_value2) < 3) { + char mod_str[256], button_str[256], func_name[256], arg_value[256] = "none", arg_value2[256] = "none", arg_value3[256] = "none", arg_value4[256] = "none"; + if (sscanf(value, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^\n]", mod_str, button_str, + func_name, arg_value, arg_value2, arg_value3, arg_value4) < 3) { fprintf(stderr, "Error: Invalid mousebind format: %s\n", value); return; } @@ -1123,12 +1129,17 @@ void parse_config_line(Config *config, const char *line) { binding->mod = parse_mod(mod_str); binding->button = parse_button(button_str); binding->arg.v = NULL; - binding->func = parse_func_name(func_name, &binding->arg, arg_value, arg_value2); + binding->arg.v2 = NULL; + binding->func = parse_func_name(func_name, &binding->arg, arg_value, arg_value2, arg_value3, arg_value4); if (!binding->func) { if (binding->arg.v) { free(binding->arg.v); binding->arg.v = NULL; } + if (binding->arg.v2) { + free(binding->arg.v2); + binding->arg.v2 = NULL; + } fprintf(stderr, "Error: Unknown function in mousebind: %s\n", func_name); } else { config->mouse_bindings_count++; @@ -1145,9 +1156,9 @@ void parse_config_line(Config *config, const char *line) { AxisBinding *binding = &config->axis_bindings[config->axis_bindings_count]; memset(binding, 0, sizeof(AxisBinding)); - char mod_str[256], dir_str[256], func_name[256], arg_value[256] = "none", arg_value2[256] = "none"; - if (sscanf(value, "%[^,],%[^,],%[^,],%[^,],%[^\n]", mod_str, dir_str, func_name, - arg_value, arg_value2) < 3) { + char mod_str[256], dir_str[256], func_name[256], arg_value[256] = "none", arg_value2[256] = "none", arg_value3[256] = "none", arg_value4[256] = "none"; + if (sscanf(value, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^\n]", mod_str, dir_str, func_name, + arg_value, arg_value2, arg_value3, arg_value4) < 3) { fprintf(stderr, "Error: Invalid axisbind format: %s\n", value); return; } @@ -1155,13 +1166,18 @@ void parse_config_line(Config *config, const char *line) { binding->mod = parse_mod(mod_str); binding->dir = parse_direction(dir_str); binding->arg.v = NULL; - binding->func = parse_func_name(func_name, &binding->arg, arg_value, arg_value2); + binding->arg.v2 = NULL; + binding->func = parse_func_name(func_name, &binding->arg, arg_value, arg_value2, arg_value3, arg_value4); if (!binding->func) { if (binding->arg.v) { free(binding->arg.v); binding->arg.v = NULL; } + if (binding->arg.v2) { + free(binding->arg.v2); + binding->arg.v2 = NULL; + } fprintf(stderr, "Error: Unknown function in axisbind: %s\n", func_name); } else { config->axis_bindings_count++; @@ -1182,9 +1198,9 @@ void parse_config_line(Config *config, const char *line) { memset(binding, 0, sizeof(GestureBinding)); char mod_str[256], motion_str[256], fingers_count_str[256], func_name[256], - arg_value[256] = "none", arg_value2[256] = "none"; - if (sscanf(value, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^\n]", mod_str, motion_str, - fingers_count_str, func_name, arg_value, arg_value2) < 4) { + arg_value[256] = "none", arg_value2[256] = "none", arg_value3[256] = "none", arg_value4[256] = "none"; + if (sscanf(value, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^\n]", mod_str, motion_str, + fingers_count_str, func_name, arg_value, arg_value2, arg_value3, arg_value4) < 4) { fprintf(stderr, "Error: Invalid gesturebind format: %s\n", value); return; } @@ -1193,13 +1209,18 @@ void parse_config_line(Config *config, const char *line) { binding->motion = parse_direction(motion_str); binding->fingers_count = atoi(fingers_count_str); binding->arg.v = NULL; - binding->func = parse_func_name(func_name, &binding->arg, arg_value, arg_value2); + binding->arg.v2 = NULL; + binding->func = parse_func_name(func_name, &binding->arg, arg_value, arg_value2, arg_value3, arg_value4); if (!binding->func) { if (binding->arg.v) { free(binding->arg.v); binding->arg.v = NULL; } + if (binding->arg.v2) { + free(binding->arg.v2); + binding->arg.v2 = NULL; + } fprintf(stderr, "Error: Unknown function in axisbind: %s\n", func_name); } else { config->gesture_bindings_count++; @@ -1303,6 +1324,10 @@ void free_config(void) { free((void *)config.key_bindings[i].arg.v); config.key_bindings[i].arg.v = NULL; } + if (config.key_bindings[i].arg.v2) { + free((void *)config.key_bindings[i].arg.v2); + config.key_bindings[i].arg.v2 = NULL; + } } free(config.key_bindings); config.key_bindings = NULL; @@ -1316,6 +1341,10 @@ void free_config(void) { free((void *)config.mouse_bindings[i].arg.v); config.mouse_bindings[i].arg.v = NULL; } + if (config.mouse_bindings[i].arg.v2) { + free((void *)config.mouse_bindings[i].arg.v2); + config.mouse_bindings[i].arg.v2 = NULL; + } } free(config.mouse_bindings); config.mouse_bindings = NULL; @@ -1329,6 +1358,10 @@ void free_config(void) { free((void *)config.axis_bindings[i].arg.v); config.axis_bindings[i].arg.v = NULL; } + if (config.axis_bindings[i].arg.v2) { + free((void *)config.axis_bindings[i].arg.v2); + config.axis_bindings[i].arg.v2 = NULL; + } } free(config.axis_bindings); config.axis_bindings = NULL; @@ -1342,6 +1375,10 @@ void free_config(void) { free((void *)config.gesture_bindings[i].arg.v); config.gesture_bindings[i].arg.v = NULL; } + if (config.gesture_bindings[i].arg.v2) { + free((void *)config.gesture_bindings[i].arg.v2); + config.gesture_bindings[i].arg.v2 = NULL; + } } free(config.gesture_bindings); config.gesture_bindings = NULL; diff --git a/src/maomao.c b/src/maomao.c index 3f51edd..4a0ed06 100644 --- a/src/maomao.c +++ b/src/maomao.c @@ -153,6 +153,7 @@ typedef struct { float f; float f2; char *v; + char *v2; unsigned int ui; unsigned int ui2; } Arg; @@ -495,7 +496,12 @@ static void dwl_ipc_output_set_tags(struct wl_client *client, static void dwl_ipc_output_quit(struct wl_client *client, struct wl_resource *resource); static void dwl_ipc_output_dispatch(struct wl_client *client, - struct wl_resource *resource,const char *dispatch,const char* arg1,const char* arg2); + struct wl_resource *resource, + const char *dispatch, + const char* arg1, + const char* arg2, + const char* arg3, + const char* arg4); static void dwl_ipc_output_release(struct wl_client *client, struct wl_resource *resource); static void focusclient(Client *c, int lift); @@ -3497,11 +3503,11 @@ void dwl_ipc_output_quit(struct wl_client *client, void dwl_ipc_output_dispatch(struct wl_client *client, struct wl_resource *resource, const char *dispatch, const char *arg1, - const char *arg2) { + const char *arg2, const char *arg3, const char *arg4) { void (*func)(const Arg *); Arg arg; - func = parse_func_name((char*)dispatch, &arg, (char*)arg1, (char*)arg2); + func = parse_func_name((char*)dispatch, &arg, (char*)arg1, (char*)arg2, (char*)arg3, (char*)arg4); if(func) { func(&arg); }