63 lines
2.1 KiB
C
63 lines
2.1 KiB
C
|
|
||
|
#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);
|
||
|
}
|