tools

various tools I have been using throughout the years
Log | Files | Refs | README | LICENSE

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, &registry_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 }