Fix connect accumulation; add display sinks to enum-devices

- controller_cli: drain semaphore and reset pending_cmd in do_connect
  so stale posts from old connection don't unblock the next command
- protocol: add Proto_Display_Device_Info; extend
  proto_write_enum_devices_response and proto_read_enum_devices_response
  with display section; backward-compatible (absent in older messages)
- node: handle_enum_devices snapshots active Display_Slots under mutex
  and includes them in the response
- controller_cli: on_display callback prints display window info in
  enum-devices output
- query_cli: updated to pass NULL on_display (no display interest)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-29 19:48:22 +00:00
parent 961933e714
commit 835cbbafba
5 changed files with 120 additions and 5 deletions

View File

@@ -829,10 +829,31 @@ static void handle_enum_devices(struct Node *node,
standalone_count++;
}
struct Proto_Display_Device_Info disp_infos[MAX_DISPLAYS];
int disp_count = 0;
for (int i = 0; i < MAX_DISPLAYS; i++) {
struct Display_Slot *d = &node->displays[i];
pthread_mutex_lock(&d->mutex);
int snap = d->allocated && d->wanted_state == DISP_OPEN;
struct Proto_Display_Device_Info info = {
.stream_id = d->stream_id,
.win_x = (int16_t)d->win_x,
.win_y = (int16_t)d->win_y,
.win_w = (uint16_t)d->win_w,
.win_h = (uint16_t)d->win_h,
.scale = (uint8_t)d->scale,
.anchor = (uint8_t)d->anchor,
};
pthread_mutex_unlock(&d->mutex);
if (!snap) { continue; }
disp_infos[disp_count++] = info;
}
struct App_Error e = proto_write_enum_devices_response(conn,
request_id, PROTO_STATUS_OK,
mdevs, (uint16_t)node->devices.media_count,
standalone, (uint16_t)standalone_count);
standalone, (uint16_t)standalone_count,
disp_infos, (uint16_t)disp_count);
if (!APP_IS_OK(e)) { app_error_print(&e); }
}