|
|
3c7729 |
#include <stdlib.h></stdlib.h>
|
|
|
3c7729 |
#include <stdio.h></stdio.h>
|
|
|
3c7729 |
#include <string.h></string.h>
|
|
|
3c7729 |
#include <gtk gtk.h=""></gtk>
|
|
|
3c7729 |
|
|
|
3c7729 |
|
|
|
3c7729 |
void changed(GtkEditable *editable, gpointer data) {
|
|
|
3c7729 |
const char *text = gtk_entry_get_text(GTK_ENTRY(editable));
|
|
|
3c7729 |
double result = 0.0;
|
|
|
3c7729 |
for(const char *c = text; c; ++c) {
|
|
|
3c7729 |
if (*c == '+' || *c == '-' || *c == '*' || *c == '/') {
|
|
|
3c7729 |
char *end;
|
|
|
3c7729 |
double a = strtof(text, &end);
|
|
|
3c7729 |
double b = strtof(c + 1, &end);
|
|
|
3c7729 |
if (*c == '+') result = a + b;
|
|
|
3c7729 |
if (*c == '-') result = a - b;
|
|
|
3c7729 |
if (*c == '*') result = a * b;
|
|
|
3c7729 |
if (*c == '/') result = a / b;
|
|
|
3c7729 |
} else
|
|
|
3c7729 |
if (*c == '=') {
|
|
|
3c7729 |
int size = c - text + 1;
|
|
|
3c7729 |
char *new_text = malloc(size + 20);
|
|
|
3c7729 |
memcpy(new_text, text, size);
|
|
|
3c7729 |
sprintf(new_text + size, "%g", result);
|
|
|
3c7729 |
gtk_entry_set_text(GTK_ENTRY(editable), new_text);
|
|
|
3c7729 |
free(new_text);
|
|
|
3c7729 |
break;
|
|
|
3c7729 |
}
|
|
|
3c7729 |
}
|
|
|
3c7729 |
}
|
|
|
3c7729 |
|
|
|
3c7729 |
void activate(GtkApplication* app, gpointer data) {
|
|
|
3c7729 |
GtkWidget *window = gtk_application_window_new(app);
|
|
|
3c7729 |
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
|
|
|
3c7729 |
|
|
|
3c7729 |
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
|
|
|
3c7729 |
gtk_container_add(GTK_CONTAINER(window), vbox);
|
|
|
3c7729 |
|
|
|
3c7729 |
GtkWidget *label = gtk_label_new("Enter simple expression like: 2+3=");
|
|
|
3c7729 |
gtk_container_add(GTK_CONTAINER(vbox), label);
|
|
|
3c7729 |
|
|
|
3c7729 |
GtkWidget *entry = gtk_entry_new();
|
|
|
3c7729 |
g_signal_connect(entry, "changed", G_CALLBACK(changed), NULL);
|
|
|
3c7729 |
gtk_container_add(GTK_CONTAINER(vbox), entry);
|
|
|
3c7729 |
|
|
|
3c7729 |
gtk_widget_show_all(window);
|
|
|
3c7729 |
}
|
|
|
3c7729 |
|
|
|
3c7729 |
int main(int argc, char **argv) {
|
|
|
3c7729 |
GtkApplication *application = gtk_application_new(NULL, 0);
|
|
|
3c7729 |
g_signal_connect(application, "activate", G_CALLBACK(activate), NULL);
|
|
|
3c7729 |
int status = g_application_run(G_APPLICATION(application), argc, argv);
|
|
|
3c7729 |
g_object_unref(application);
|
|
|
3c7729 |
return status;
|
|
|
3c7729 |
}
|
|
|
3c7729 |
|