diff options
author | 2018-05-08 23:56:30 +0300 | |
---|---|---|
committer | 2018-05-08 23:56:30 +0300 | |
commit | ba43745c2b8a764088a3bf39485849c0ec64a1ac (patch) | |
tree | a07edfdc0221c4a7e0e7824c215c9702e5e8f7cd /src/server/gtk.c | |
parent | 92c7163d6c0ddf0ffb958db5528ee35bb0460293 (diff) | |
download | coffeetemp-ba43745c2b8a764088a3bf39485849c0ec64a1ac.tar.gz coffeetemp-ba43745c2b8a764088a3bf39485849c0ec64a1ac.tar.bz2 coffeetemp-ba43745c2b8a764088a3bf39485849c0ec64a1ac.zip |
server: add an initial GTK UI front-end.
Diffstat (limited to 'src/server/gtk.c')
-rw-r--r-- | src/server/gtk.c | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/server/gtk.c b/src/server/gtk.c new file mode 100644 index 0000000..8b850cf --- /dev/null +++ b/src/server/gtk.c @@ -0,0 +1,149 @@ +/* + * Hot Beverage Companion – desktop application gtk ui + * + * Copyright (C) 2018 Gediminas Jakutis + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; version 2.1 + * of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <gtk/gtk.h> +#include <time.h> +#include <string.h> +#include "util.h" +#include "gtk.h" + +struct settings { + int nd; + struct timespec period; +}; + +struct gtkui { + GtkBuilder *builder; + GObject *window; + GObject *tempvalue; + GObject *resistance; + GObject *voltage; + GObject *reslabel; + GObject *voltlabel; + GObject *showmorebutton; + GObject *button_on; + GObject *button_off; + GObject *ticker; + GError *error; + int showmore; +}; + +static struct settings settings; +static struct gtkui gtkui; + +static int gtkui_update(void *data); +static void gtkui_die(void *data); +static void gtkui_togglemore(void); + +int gtkui_init(int *argc, char ***argv, int nd, struct timespec period) +{ + int ret = A_OK; + + settings.nd = nd; + settings.period = period; + + if (!gtk_init_check(argc, argv)) { + ret = ERROR; + goto fail; + } + + gtkui.builder = gtk_builder_new(); + + if (!gtk_builder_add_from_file(gtkui.builder, "gtklayout.ui", >kui.error)) { + ret = ERROR; + goto fail; + } + + gtkui.window = gtk_builder_get_object(gtkui.builder, "window"); + gtkui.tempvalue = gtk_builder_get_object(gtkui.builder, "tempvalue"); + gtkui.resistance = gtk_builder_get_object(gtkui.builder, "resistance"); + gtkui.voltage = gtk_builder_get_object(gtkui.builder, "voltage"); + gtkui.reslabel = gtk_builder_get_object(gtkui.builder, "reslabel"); + gtkui.voltlabel = gtk_builder_get_object(gtkui.builder, "voltlabel"); + gtkui.showmorebutton = gtk_builder_get_object(gtkui.builder, "showmore"); + gtkui.button_on = gtk_builder_get_object(gtkui.builder, "button_on"); + gtkui.button_off = gtk_builder_get_object(gtkui.builder, "button_off"); + gtkui.ticker = gtk_builder_get_object(gtkui.builder, "ticker"); + g_signal_connect(gtkui.window, "destroy", G_CALLBACK(gtk_main_quit), NULL); + g_signal_connect(gtkui.showmorebutton, "toggled", G_CALLBACK(gtkui_togglemore), NULL); + gtkui.showmore = 1; /* we are setting this so we can toggle this off on the following call */ + gtkui_togglemore(); + +fail: + return ret; +} +int gtkui_loop(void) +{ + int ret; + g_timeout_add_full(G_PRIORITY_DEFAULT, settings.period.tv_nsec / (1000 * 1000), gtkui_update, &ret, gtkui_die); + gtk_main(); + + return ret; +} + +static int gtkui_update(void *data) +{ + static const char ticker[] = "|/-\\"; + static const char waitmsg[] = "Waiting."; + static int statechange = 1; + static struct tempmodule_state state; + char textbuf[32]; + int *ret; + + ret = data; + *ret = refresh_data(settings.nd, &state); + if (*ret == A_OK) { + textbuf[0] = ticker[state.sequence % strlen(ticker)]; + textbuf[1] = '\0'; + gtk_label_set_text(GTK_LABEL(gtkui.ticker), textbuf); + sprintf(textbuf, "%.1f°C", state.temperature); + gtk_label_set_text(GTK_LABEL(gtkui.tempvalue), textbuf); + sprintf(textbuf, "%hdΩ", state.resistance); + gtk_label_set_text(GTK_LABEL(gtkui.resistance), textbuf); + sprintf(textbuf, "%.3fV", state.voltage); + gtk_label_set_text(GTK_LABEL(gtkui.voltage), textbuf); + statechange = 1; + } else if (*ret == DEAD && statechange) { + gtk_label_set_text(GTK_LABEL(gtkui.tempvalue), waitmsg); + gtk_label_set_text(GTK_LABEL(gtkui.resistance), waitmsg); + gtk_label_set_text(GTK_LABEL(gtkui.voltage), waitmsg); + statechange = 0; + } + + return *ret != ERROR; +} + +static void gtkui_die(void *data) +{ + (void) data; /* silence unused variable warning */ + gtk_main_quit(); + return; +} + +static void gtkui_togglemore(void) +{ + gtkui.showmore = !gtkui.showmore; + gtkui.showmore ? gtk_button_set_image(GTK_BUTTON(gtkui.showmorebutton), GTK_WIDGET(gtkui.button_on)) : + gtk_button_set_image(GTK_BUTTON(gtkui.showmorebutton), GTK_WIDGET(gtkui.button_off)); + gtk_widget_set_visible (GTK_WIDGET(gtkui.resistance), gtkui.showmore); + gtk_widget_set_visible (GTK_WIDGET(gtkui.voltage), gtkui.showmore); + gtk_widget_set_visible (GTK_WIDGET(gtkui.reslabel), gtkui.showmore); + gtk_widget_set_visible (GTK_WIDGET(gtkui.voltlabel), gtkui.showmore); +} |