#include #include #include "main.h" // Context For The Save/Modify Event Dialog struct save_event_data { struct event_location *location; GtkWindow *window; GtkEntry *name; GtkStack *stack; // Sound GtkWidget *sound; GtkEntry *sound_name; // Vibration (Rumble) GtkWidget *vibration_rumble; GtkEntry *vibration_rumble_duration; // Vibration (Periodic) GtkWidget *vibration_periodic; GtkEntry *magnitude; GtkEntry *vibration_periodic_duration; GtkEntry *fade_in_time; GtkEntry *fade_in_level; // LED GtkWidget *led; GtkEntry *color; GtkEntry *frequency; }; // Save Event Handler static void on_save_event(__attribute__((unused)) GtkButton *button, struct save_event_data *data) { JsonObject *event = json_object_new(); int free_obj = 0; if (data->location->id != -1) { JsonNode *node = json_array_get_element(data->location->profile, data->location->id); json_node_set_object(node, event); free_obj = 1; } else { json_array_add_object_element(data->location->profile, event); } json_object_set_string_member(event, "event-name", gtk_entry_get_text(data->name)); GtkWidget *visible_widget = gtk_stack_get_visible_child(data->stack); if (visible_widget == data->sound) { json_object_set_string_member(event, "type", "Sound"); json_object_set_string_member(event, "effect", gtk_entry_get_text(data->sound_name)); } else if (visible_widget == data->vibration_rumble) { json_object_set_string_member(event, "type", "VibraRumble"); json_object_set_int_member(event, "duration", strtol(gtk_entry_get_text(data->vibration_rumble_duration), NULL, 10)); } else if (visible_widget == data->vibration_periodic) { json_object_set_string_member(event, "type", "VibraPeriodic"); json_object_set_int_member(event, "magnitude", strtol(gtk_entry_get_text(data->magnitude), NULL, 10)); json_object_set_int_member(event, "duration", strtol(gtk_entry_get_text(data->vibration_periodic_duration), NULL, 10)); json_object_set_int_member(event, "fade-in-time", strtol(gtk_entry_get_text(data->fade_in_time), NULL, 10)); json_object_set_int_member(event, "fade-in-level", strtol(gtk_entry_get_text(data->fade_in_level), NULL, 10)); } else if (visible_widget == data->led) { json_object_set_string_member(event, "type", "Led"); json_object_set_string_member(event, "color", gtk_entry_get_text(data->color)); json_object_set_int_member(event, "frequency", strtol(gtk_entry_get_text(data->frequency), NULL, 10)); } gtk_window_close(GTK_WINDOW(data->window)); reload_profiles(1); if (free_obj) { json_object_unref(event); } } // Sets Long In GtkEntry Text Field static void set_entry_long(GtkEntry *entry, long x) { gchar *str = g_strdup_printf("%ld", x); gtk_entry_set_text(entry, str); g_free(str); } // Pre-Fill Dialog With Existing Event Data static void apply_event_to_dialog(struct save_event_data *data) { if (data->location->id != -1) { JsonObject *event = json_array_get_object_element(data->location->profile, data->location->id); gtk_entry_set_text(data->name, json_object_get_string_member(event, "event-name")); const gchar *type = json_object_get_string_member(event, "type"); if (g_strcmp0(type, "Sound") == 0) { gtk_stack_set_visible_child(data->stack, data->sound); gtk_entry_set_text(data->sound_name, json_object_get_string_member(event, "effect")); } else if (g_strcmp0(type, "VibraRumble") == 0) { gtk_stack_set_visible_child(data->stack, data->vibration_rumble); set_entry_long(data->vibration_rumble_duration, json_object_get_int_member(event, "duration")); } else if (g_strcmp0(type, "VibraPeriodic") == 0) { gtk_stack_set_visible_child(data->stack, data->vibration_periodic); set_entry_long(data->magnitude, json_object_get_int_member(event, "magnitude")); set_entry_long(data->vibration_periodic_duration, json_object_get_int_member(event, "duration")); set_entry_long(data->fade_in_time, json_object_get_int_member(event, "fade-in-time")); set_entry_long(data->fade_in_level, json_object_get_int_member(event, "fade-in-level")); } else if (g_strcmp0(type, "Led") == 0) { gtk_stack_set_visible_child(data->stack, data->led); gtk_entry_set_text(data->color, json_object_get_string_member(event, "color")); set_entry_long(data->frequency, json_object_get_int_member(event, "frequency")); } } else { gtk_stack_set_visible_child(data->stack, data->sound); } } // Open Create/Modify Event Dialog void open_dialog(GtkWidget *widget, struct event_location *location, int free_location) { GtkBuilder *builder = gtk_builder_new(); GError *err = NULL; if (gtk_builder_add_from_resource(builder, "/dialog_window.glade", &err) == 0) { g_error("Error Loading UI: %s", err->message); } GtkWindow *window = GTK_WINDOW(gtk_builder_get_object(builder, "dialog_window")); gtk_builder_connect_signals(builder, NULL); struct save_event_data *data = malloc(sizeof (struct save_event_data)); data->location = location; data->window = window; data->name = GTK_ENTRY(gtk_builder_get_object(builder, "name")); data->stack = GTK_STACK(gtk_builder_get_object(builder, "stack")); // Sound data->sound = GTK_WIDGET(gtk_builder_get_object(builder, "sound")); data->sound_name = GTK_ENTRY(gtk_builder_get_object(builder, "sound-name")); // Vibration (Rumble) data->vibration_rumble = GTK_WIDGET(gtk_builder_get_object(builder, "vibration-rumble")); data->vibration_rumble_duration = GTK_ENTRY(gtk_builder_get_object(builder, "vibration-rumble-duration")); // Vibration (Periodic) data->vibration_periodic = GTK_WIDGET(gtk_builder_get_object(builder, "vibration-periodic")); data->magnitude = GTK_ENTRY(gtk_builder_get_object(builder, "magnitude")); data->vibration_periodic_duration = GTK_ENTRY(gtk_builder_get_object(builder, "vibration-periodic-duration")); data->fade_in_time = GTK_ENTRY(gtk_builder_get_object(builder, "fade-in-time")); data->fade_in_level = GTK_ENTRY(gtk_builder_get_object(builder, "fade-in-level")); // LED data->led = GTK_WIDGET(gtk_builder_get_object(builder, "led")); data->color = GTK_ENTRY(gtk_builder_get_object(builder, "color")); data->frequency = GTK_ENTRY(gtk_builder_get_object(builder, "frequency")); g_signal_connect(gtk_builder_get_object(builder, "save"), "clicked", G_CALLBACK(on_save_event), data); g_signal_connect(window, "destroy", G_CALLBACK(free_userdata), data); if (free_location) { g_signal_connect(window, "destroy", G_CALLBACK(free_userdata), location); } g_object_unref(builder); apply_event_to_dialog(data); GtkWindow *parent_window = GTK_WINDOW(gtk_widget_get_toplevel(widget)); gtk_window_set_application(window, gtk_window_get_application(parent_window)); gtk_window_set_modal(window, 1); gtk_window_set_transient_for(window, parent_window); gtk_window_present(window); }