wlr-river-title.c (3242B)
1 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <wayland-client.h> 6 #include "river-status.h" 7 8 struct river_status_data { 9 struct zriver_status_manager_v1 *manager; 10 struct zriver_seat_status_v1 *seat_status; 11 struct wl_seat *seat; 12 char *focused_title; 13 int done; 14 }; 15 16 static void seat_status_focused_output(void *data, struct zriver_seat_status_v1 *zriver_seat_status_v1, struct wl_output *output) {} 17 static void seat_status_unfocused_output(void *data, struct zriver_seat_status_v1 *zriver_seat_status_v1, struct wl_output *output) {} 18 static void seat_status_mode(void *data, struct zriver_seat_status_v1 *zriver_seat_status_v1, const char *name) {} 19 20 static void seat_status_focused_view(void *data, struct zriver_seat_status_v1 *zriver_seat_status_v1, const char *title) { 21 struct river_status_data *d = data; 22 if (d->focused_title) free(d->focused_title); 23 d->focused_title = strdup(title); 24 d->done = 1; 25 } 26 27 static const struct zriver_seat_status_v1_listener seat_status_listener = { 28 .focused_output = seat_status_focused_output, 29 .unfocused_output = seat_status_unfocused_output, 30 .focused_view = seat_status_focused_view, 31 .mode = seat_status_mode, 32 }; 33 34 static void registry_handle_global(void *data, struct wl_registry *registry, uint32_t name, const char *interface, uint32_t version) { 35 struct river_status_data *d = data; 36 if (strcmp(interface, zriver_status_manager_v1_interface.name) == 0) { 37 d->manager = wl_registry_bind(registry, name, &zriver_status_manager_v1_interface, 1); 38 } else if (strcmp(interface, "wl_seat") == 0) { 39 d->seat = wl_registry_bind(registry, name, &wl_seat_interface, 1); 40 } 41 } 42 43 static void registry_handle_global_remove(void *data, struct wl_registry *registry, uint32_t name) {} 44 45 static const struct wl_registry_listener registry_listener = { 46 .global = registry_handle_global, 47 .global_remove = registry_handle_global_remove, 48 }; 49 50 int main() { 51 struct wl_display *display = wl_display_connect(NULL); 52 if (!display) { 53 fprintf(stderr, "Failed to connect to wayland display\n"); 54 return 1; 55 } 56 57 struct river_status_data data = {0}; 58 struct wl_registry *registry = wl_display_get_registry(display); 59 wl_registry_add_listener(registry, ®istry_listener, &data); 60 61 // Initial roundtrip to find all globals 62 wl_display_roundtrip(display); 63 64 if (!data.manager || !data.seat) { 65 fprintf(stderr, "Could not find river_status_manager or wl_seat\n"); 66 return 1; 67 } 68 69 // Now bind the seat status 70 data.seat_status = zriver_status_manager_v1_get_river_seat_status(data.manager, data.seat); 71 zriver_seat_status_v1_add_listener(data.seat_status, &seat_status_listener, &data); 72 73 // Wait for events 74 while (!data.done && wl_display_dispatch(display) != -1); 75 76 if (data.focused_title) { 77 printf("%s\n", data.focused_title); 78 free(data.focused_title); 79 } 80 81 if (data.seat_status) zriver_seat_status_v1_destroy(data.seat_status); 82 if (data.manager) zriver_status_manager_v1_destroy(data.manager); 83 if (data.seat) wl_seat_destroy(data.seat); 84 wl_registry_destroy(registry); 85 wl_display_disconnect(display); 86 87 return 0; 88 }