From 3c772917dcdf0764b6d0a2729eec151877b85e8f Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Feb 01 2019 12:12:19 +0000 Subject: c gtk3: calc-line --- diff --git a/c/gtk3/calc-line/calcline.c b/c/gtk3/calc-line/calcline.c new file mode 100644 index 0000000..4f6a929 --- /dev/null +++ b/c/gtk3/calc-line/calcline.c @@ -0,0 +1,56 @@ +#include +#include +#include +#include + + +void changed(GtkEditable *editable, gpointer data) { + const char *text = gtk_entry_get_text(GTK_ENTRY(editable)); + double result = 0.0; + for(const char *c = text; c; ++c) { + if (*c == '+' || *c == '-' || *c == '*' || *c == '/') { + char *end; + double a = strtof(text, &end); + double b = strtof(c + 1, &end); + if (*c == '+') result = a + b; + if (*c == '-') result = a - b; + if (*c == '*') result = a * b; + if (*c == '/') result = a / b; + } else + if (*c == '=') { + int size = c - text + 1; + char *new_text = malloc(size + 20); + memcpy(new_text, text, size); + sprintf(new_text + size, "%g", result); + gtk_entry_set_text(GTK_ENTRY(editable), new_text); + free(new_text); + break; + } + } +} + +void activate(GtkApplication* app, gpointer data) { + GtkWidget *window = gtk_application_window_new(app); + gtk_container_set_border_width(GTK_CONTAINER(window), 10); + + GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); + gtk_container_add(GTK_CONTAINER(window), vbox); + + GtkWidget *label = gtk_label_new("Enter simple expression like: 2+3="); + gtk_container_add(GTK_CONTAINER(vbox), label); + + GtkWidget *entry = gtk_entry_new(); + g_signal_connect(entry, "changed", G_CALLBACK(changed), NULL); + gtk_container_add(GTK_CONTAINER(vbox), entry); + + gtk_widget_show_all(window); +} + +int main(int argc, char **argv) { + GtkApplication *application = gtk_application_new(NULL, 0); + g_signal_connect(application, "activate", G_CALLBACK(activate), NULL); + int status = g_application_run(G_APPLICATION(application), argc, argv); + g_object_unref(application); + return status; +} +