/* * 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 #include #include #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); }