/*
- * Copyright (C) 2009-2010 Andy Spencer <andy753421@gmail.com>
+ * Copyright (C) 2009-2011 Andy Spencer <andy753421@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include <gtk/gtk.h>
#include <glib/gstdio.h>
+#ifdef MAC_INTEGRATION
+#include <gtkosxapplication.h>
+#endif
+
#include <grits.h>
#include "aweather-gui.h"
}
}
+#if ! GTK_CHECK_VERSION(3,0,0)
+static void xdg_open(GtkWidget *widget, const gchar *link, gpointer user_data)
+{
+ gchar *argv[] = {"xdg-open", (gchar*)link, NULL};
+ g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL);
+}
+#endif
+
static void on_log_level_changed(GtkSpinButton *spinner, AWeatherGui *self)
{
g_message("main: log_level_changed");
/* Set time
* Do this before setting setting location
* so that it doesn't refresh twice */
- struct tm tm = {};
- strptime(time, "%Y-%m-%d %H:%M", &tm);
- time_t sec = mktime(&tm);
- if (sec > 0)
- grits_viewer_set_time(gui->viewer, sec);
- g_debug("date = [%s] == %lu\n", time, sec);
+ if (time) {
+ int year, mon, day, hour, min;
+ sscanf(time, "%d-%d-%d %d:%d", &year, &mon, &day, &hour, &min);
+ time_t sec = mktime(&(struct tm){0, year-1900, mon-1, day, hour, min});
+ if (sec > 0)
+ grits_viewer_set_time(gui->viewer, sec);
+ g_debug("date = [%s] == %lu\n", time, sec);
+ }
/* Set location */
- for (city_t *city = cities; city->type; city++) {
- if (city->type == LOCATION_CITY && g_str_equal(city->code, site)) {
- grits_viewer_set_location(gui->viewer,
- city->pos.lat, city->pos.lon, EARTH_R/35);
- break;
+ if (site) {
+ for (city_t *city = cities; city->type; city++) {
+ if (city->type == LOCATION_CITY && g_str_equal(city->code, site)) {
+ grits_viewer_set_location(gui->viewer,
+ city->pos.lat, city->pos.lon, EARTH_R/35);
+ break;
+ }
}
}
}
gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(object), enabled);
}
+static void setup_mac(AWeatherGui *gui)
+{
+#ifdef MAC_INTEGRATION
+ GtkWidget *menu = aweather_gui_get_widget(gui, "main_menu");
+ GtkosxApplication *app = g_object_new(GTKOSX_TYPE_APPLICATION, NULL);
+ gtk_widget_hide(menu);
+ gtkosx_application_set_menu_bar(app, GTK_MENU_SHELL(menu));
+ gtkosx_application_set_use_quartz_accelerators(app, TRUE);
+ gtkosx_application_ready(app);
+ //gtkosx_application_sync_menubar(app)
+#endif
+}
+
/********
* Main *
********/
{
/* Defaults */
gint debug = 2; // G_LOG_LEVEL_WARNING
- gchar *site = "";
- gchar *time = "";
+ gchar *site = NULL;
+ gchar *time = NULL;
gboolean autoupdate = FALSE;
gboolean offline = FALSE;
gboolean fullscreen = FALSE;
{NULL}
};
+ /* All times in UTC */
+ g_setenv("TZ", "UTC", TRUE);
+
/* Init */
GError *error = NULL;
- g_thread_init(NULL);
- gdk_threads_init();
if (!gtk_init_with_args(&argc, &argv, "aweather", entries, NULL, &error)) {
g_print("%s\n", error->message);
g_error_free(error);
return -1;
}
+ /* Use external handler for link buttons */
+#if ! GTK_CHECK_VERSION(3,0,0)
+ gtk_link_button_set_uri_hook((GtkLinkButtonUriFunc)xdg_open, NULL, NULL);
+ gtk_about_dialog_set_url_hook((GtkAboutDialogActivateLinkFunc)xdg_open, NULL, NULL);
+ gtk_about_dialog_set_email_hook((GtkAboutDialogActivateLinkFunc)xdg_open, NULL, NULL);
+#endif
+
/* Setup debug level for aweather_gui_new */
g_log_set_handler(NULL, G_LOG_LEVEL_MASK, log_func, NULL);
log_levels = int2log(opt_debug >= 0 ? opt_debug : debug);
/* Set up AWeather */
- gdk_threads_enter();
/* Pre-load some types for gtkbuilder */
GRITS_TYPE_OPENGL;
AWEATHER_TYPE_GUI;
grits_viewer_set_offline(gui->viewer, offline);
set_toggle_action(gui, "update", autoupdate);
set_toggle_action(gui, "fullscreen", fullscreen);
+ g_free(prefs_site);
/* Done with init, show gui */
gtk_widget_show_all(GTK_WIDGET(gui));
set_toggle_action(gui, "fullscreen", fullscreen); // Resest widget hiding
+ setup_mac(gui); // done after show_all
gtk_main();
- gdk_threads_leave();
- gdk_display_close(gdk_display_get_default());
+ //gdk_display_close(gdk_display_get_default());
return 0;
}