#include "waybar_cffi_module.h" typedef struct { GtkContainer* root; GtkBox* container; GtkButton* button; } Instance; // This static variable is shared between all instances of this module static int instance_count = 0; void onclicked(GtkButton* button) { char text[256]; snprintf(text, 256, "Dice throw result: %d", rand() % 6 + 1); gtk_button_set_label(button, text); } // You must const size_t wbcffi_version = 1; void* wbcffi_init(GtkContainer* root, const struct wbcffi_config_entry* config_entries, size_t config_entries_len) { printf("cffi_example: init config:\n"); for (size_t i = 0; i < config_entries_len; i++) { printf(" %s = %s\n", config_entries[i].key, config_entries[i].value); } // Allocate the instance object Instance* inst = malloc(sizeof(Instance)); inst->root = root; // Add a container for displaying the next widgets inst->container = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5)); gtk_container_add(GTK_CONTAINER(inst->root), GTK_WIDGET(inst->container)); // Add a label GtkLabel* label = GTK_LABEL(gtk_label_new("[Example C FFI Module:")); gtk_container_add(GTK_CONTAINER(inst->container), GTK_WIDGET(label)); // Add a button inst->button = GTK_BUTTON(gtk_button_new_with_label("click me !")); g_signal_connect(inst->button, "clicked", G_CALLBACK(onclicked), NULL); gtk_container_add(GTK_CONTAINER(inst->container), GTK_WIDGET(inst->button)); // Add a label label = GTK_LABEL(gtk_label_new("]")); gtk_container_add(GTK_CONTAINER(inst->container), GTK_WIDGET(label)); // Return instance object printf("cffi_example inst=%p: init success ! (%d total instances)\n", inst, ++instance_count); return inst; } void wbcffi_deinit(void* instance) { printf("cffi_example inst=%p: free memory\n", instance); free(instance); } void wbcffi_refresh(void* instance, int signal) { printf("cffi_example inst=%p: Received refresh signal %d\n", instance, signal); } void wbcffi_doaction(void* instance, const char* name) { printf("cffi_example inst=%p: doAction(%s)\n", instance, name); }