+gboolean on_gui_key_press(GtkWidget *widget, GdkEventKey *event, AWeatherGui *gui)
+{
+ g_debug("AWeatherGui: on_gui_key_press - key=%x, state=%x",
+ event->keyval, event->state);
+ AWeatherView *view = aweather_gui_get_view(gui);
+ if (event->keyval == GDK_q)
+ gtk_widget_destroy(GTK_WIDGET(gui));
+ else if (event->keyval == GDK_r && event->state & GDK_CONTROL_MASK)
+ aweather_view_refresh(view);
+ else if (event->keyval == GDK_Tab || event->keyval == GDK_ISO_Left_Tab) {
+ GtkNotebook *tabs = GTK_NOTEBOOK(aweather_gui_get_widget(gui, "tabs"));
+ gint num_tabs = gtk_notebook_get_n_pages(tabs);
+ gint cur_tab = gtk_notebook_get_current_page(tabs);
+ if (event->state & GDK_SHIFT_MASK)
+ gtk_notebook_set_current_page(tabs, (cur_tab-1)%num_tabs);
+ else
+ gtk_notebook_set_current_page(tabs, (cur_tab+1)%num_tabs);
+ };
+ return FALSE;
+}
+
+void on_quit(GtkMenuItem *menu, AWeatherGui *gui)
+{
+ gtk_widget_destroy(GTK_WIDGET(gui));
+}
+
+void on_offline(GtkToggleAction *action, AWeatherGui *gui)
+{
+ AWeatherView *view = aweather_gui_get_view(gui);
+ aweather_view_set_offline(view,
+ gtk_toggle_action_get_active(action));
+}
+
+void on_zoomin(GtkAction *action, AWeatherGui *gui)
+{
+ AWeatherView *view = aweather_gui_get_view(gui);
+ aweather_view_zoom(view, 3./4);
+}
+
+void on_zoomout(GtkAction *action, AWeatherGui *gui)
+{
+ AWeatherView *view = aweather_gui_get_view(gui);
+ aweather_view_zoom(view, 4./3);
+}
+
+void on_refresh(GtkAction *action, AWeatherGui *gui)
+{
+ AWeatherView *view = aweather_gui_get_view(gui);
+ aweather_view_refresh(view);
+}
+
+void on_about(GtkAction *action, AWeatherGui *gui)
+{
+ // TODO: use gtk_widget_hide_on_delete()
+ GError *error = NULL;
+ GtkBuilder *builder = gtk_builder_new();
+ if (!gtk_builder_add_from_file(builder, DATADIR "/aweather/about.ui", &error))
+ g_error("Failed to create gtk builder: %s", error->message);
+ gtk_builder_connect_signals(builder, NULL);
+ GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
+ gtk_window_set_transient_for(GTK_WINDOW(window),
+ GTK_WINDOW(aweather_gui_get_widget(gui, "window")));
+ gtk_widget_show_all(window);
+ g_object_unref(builder);
+}
+
+void on_time_changed(GtkTreeView *view, GtkTreePath *path,
+ GtkTreeViewColumn *column, AWeatherGui *gui)
+{
+ gchar *time;
+ GtkTreeIter iter;
+ GtkTreeModel *model = gtk_tree_view_get_model(view);
+ gtk_tree_model_get_iter(model, &iter, path);
+ gtk_tree_model_get(model, &iter, 0, &time, -1);
+ AWeatherView *aview = aweather_gui_get_view(gui);
+ aweather_view_set_time(aview, time);
+ g_free(time);
+}
+
+void on_site_changed(GtkComboBox *combo, AWeatherGui *gui)
+{