From a9e9ad905f1cfe2227ab484420a80c4cc38d6043 Mon Sep 17 00:00:00 2001 From: DreamMaoMao <2523610504@qq.com> Date: Mon, 27 Oct 2025 11:24:16 +0800 Subject: [PATCH] opt: mmsg add ack confirm --- mmsg/mmsg.c | 45 +++++++++++++++++++++++++++++++ protocols/dwl-ipc-unstable-v2.xml | 7 +++++ src/ext-protocol/dwl-ipc.h | 23 ++++++++++++++++ 3 files changed, 75 insertions(+) diff --git a/mmsg/mmsg.c b/mmsg/mmsg.c index ae9270d..aba0939 100644 --- a/mmsg/mmsg.c +++ b/mmsg/mmsg.c @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include @@ -56,6 +58,9 @@ static char *dispatch_arg3; static char *dispatch_arg4; static char *dispatch_arg5; +static int request_completed = 0; +static uint32_t starttimestamp = 0; + struct output { char *output_name; uint32_t name; @@ -296,6 +301,13 @@ static void dwl_ipc_output_floating(void *data, printf("floating %u\n", is_floating); } +static void dwl_ipc_output_askconfirm(void *data, + struct zdwl_ipc_output_v2 *dwl_ipc_output, + const uint32_t askconfirm) { + request_completed = askconfirm; + printf("askconfirm %d\n", askconfirm); +} + static void dwl_ipc_output_frame(void *data, struct zdwl_ipc_output_v2 *dwl_ipc_output) { if (mode & SET) { @@ -373,6 +385,38 @@ static void dwl_ipc_output_frame(void *data, dispatch_arg3, dispatch_arg4, dispatch_arg5); } wl_display_flush(display); + struct timespec start; + clock_gettime(CLOCK_MONOTONIC, &start); + starttimestamp = (uint32_t)(start.tv_sec * 1000 + + start.tv_nsec / 1000000); // 毫秒时间戳 + + int display_fd = wl_display_get_fd(display); + struct pollfd pfd = {.fd = display_fd, .events = POLLIN}; + + while (request_completed > starttimestamp) { + // 非阻塞地检查事件 + wl_display_dispatch_pending(display); + wl_display_flush(display); + + if (request_completed) + break; + + // 使用poll等待事件,超时时间为1000毫秒 + int poll_ret = poll(&pfd, 1, 1000); + if (poll_ret == 0) { + fprintf(stderr, "CLIENT: Timeout waiting for confirmation\n"); + break; + } else if (poll_ret < 0) { + perror("poll"); + break; + } else { + // 有事件到达,调用wl_display_dispatch来处理事件 + if (wl_display_dispatch(display) < 0) { + fprintf(stderr, "CLIENT: wl_display_dispatch failed\n"); + break; + } + } + } exit(0); } else { if (tflag) { @@ -411,6 +455,7 @@ static const struct zdwl_ipc_output_v2_listener dwl_ipc_output_listener = { .last_layer = dwl_ipc_output_last_layer, .kb_layout = dwl_ipc_output_kb_layout, .keymode = dwl_ipc_output_keymode, + .askconfirm = dwl_ipc_output_askconfirm, .frame = dwl_ipc_output_frame, }; diff --git a/protocols/dwl-ipc-unstable-v2.xml b/protocols/dwl-ipc-unstable-v2.xml index a43a7f0..78ef245 100644 --- a/protocols/dwl-ipc-unstable-v2.xml +++ b/protocols/dwl-ipc-unstable-v2.xml @@ -241,6 +241,13 @@ I would probably just submit raphi's patchset but I don't think that would be po + + + already receive the request. + + + + diff --git a/src/ext-protocol/dwl-ipc.h b/src/ext-protocol/dwl-ipc.h index 23207d0..5b29799 100644 --- a/src/ext-protocol/dwl-ipc.h +++ b/src/ext-protocol/dwl-ipc.h @@ -207,6 +207,16 @@ void dwl_ipc_output_printstatus_to(DwlIpcOutput *ipc_output) { zdwl_ipc_output_v2_send_frame(ipc_output->resource); } +void dwl_ipc_output_askconfirm(DwlIpcOutput *ipc_output) { + // 发送当前时间戳而不是固定的1 + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + uint32_t timestamp = + (uint32_t)(ts.tv_sec * 1000 + ts.tv_nsec / 1000000); // 毫秒时间戳 + + zdwl_ipc_output_v2_send_askconfirm(ipc_output->resource, timestamp); +} + void dwl_ipc_output_set_client_tags(struct wl_client *client, struct wl_resource *resource, unsigned int and_tags, @@ -234,6 +244,7 @@ void dwl_ipc_output_set_client_tags(struct wl_client *client, focusclient(focustop(monitor), 1); arrange(selmon, false); printstatus(); + dwl_ipc_output_askconfirm(ipc_output); } void dwl_ipc_output_set_layout(struct wl_client *client, @@ -253,6 +264,7 @@ void dwl_ipc_output_set_layout(struct wl_client *client, monitor->pertag->ltidxs[monitor->pertag->curtag] = &layouts[index]; arrange(monitor, false); printstatus(); + dwl_ipc_output_askconfirm(ipc_output); } void dwl_ipc_output_set_tags(struct wl_client *client, @@ -268,11 +280,17 @@ void dwl_ipc_output_set_tags(struct wl_client *client, monitor = ipc_output->mon; view_in_mon(&(Arg){.ui = newtags}, true, monitor, true); + dwl_ipc_output_askconfirm(ipc_output); } void dwl_ipc_output_quit(struct wl_client *client, struct wl_resource *resource) { + DwlIpcOutput *ipc_output; + ipc_output = wl_resource_get_user_data(resource); + if (!ipc_output) + return; quit(&(Arg){0}); + dwl_ipc_output_askconfirm(ipc_output); } void dwl_ipc_output_dispatch(struct wl_client *client, @@ -283,6 +301,10 @@ void dwl_ipc_output_dispatch(struct wl_client *client, int (*func)(const Arg *); Arg arg; + DwlIpcOutput *ipc_output; + ipc_output = wl_resource_get_user_data(resource); + if (!ipc_output) + return; func = parse_func_name((char *)dispatch, &arg, (char *)arg1, (char *)arg2, (char *)arg3, (char *)arg4, (char *)arg5); if (func) { @@ -295,6 +317,7 @@ void dwl_ipc_output_dispatch(struct wl_client *client, free(arg.v2); if (arg.v3) free(arg.v3); + dwl_ipc_output_askconfirm(ipc_output); } void dwl_ipc_output_release(struct wl_client *client,