spek

Acoustic spectrum analyser
git clone http://git.hanabi.in/repos/spek.git
Log | Files | Refs | README

commit 0d2514e018d1077c32b8ff1388f990e9de1e8c18
parent 47fc4b95d6d86338673ee048b335af087e0f1696
Author: Alexander Kojevnikov <alexander@kojevnikov.com>
Date:   Tue, 21 Aug 2012 10:32:16 -0700

Check for a new version

Diffstat:
Msrc/spek-window.cc | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/spek-window.hh | 1+
Msrc/spek-window.vala | 43-------------------------------------------
3 files changed, 63 insertions(+), 43 deletions(-)

diff --git a/src/spek-window.cc b/src/spek-window.cc @@ -16,23 +16,33 @@ * along with Spek. If not, see <http://www.gnu.org/licenses/>. */ +#include <pthread.h> + #include <wx/aboutdlg.h> #include <wx/artprov.h> #include <wx/dnd.h> #include <wx/filename.h> +#include "spek-preferences.hh" #include "spek-spectrogram.hh" #include "spek-window.hh" +DECLARE_EVENT_TYPE(SPEK_NOTIFY_EVENT, -1) +DEFINE_EVENT_TYPE(SPEK_NOTIFY_EVENT) + BEGIN_EVENT_TABLE(SpekWindow, wxFrame) EVT_MENU(wxID_OPEN, SpekWindow::on_open) EVT_MENU(wxID_SAVE, SpekWindow::on_save) EVT_MENU(wxID_EXIT, SpekWindow::on_exit) EVT_MENU(wxID_PREFERENCES, SpekWindow::on_preferences) EVT_MENU(wxID_ABOUT, SpekWindow::on_about) + EVT_COMMAND(-1, SPEK_NOTIFY_EVENT, SpekWindow::on_notify) END_EVENT_TABLE() +// Forward declarations. +static void * check_version(void *); + class SpekDropTarget : public wxFileDropTarget { public: @@ -104,6 +114,7 @@ SpekWindow::SpekWindow(const wxString& path) : // wxInfoBar is too limited, construct a custom one. wxPanel *info_bar = new wxPanel(this); + info_bar->Hide(); info_bar->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOTEXT)); info_bar->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_INFOBK)); wxSizer *info_sizer = new wxBoxSizer(wxHORIZONTAL); @@ -135,6 +146,9 @@ SpekWindow::SpekWindow(const wxString& path) : SetDropTarget(new SpekDropTarget(this)); SetSizer(sizer); + + pthread_t thread; + pthread_create(&thread, NULL, &check_version, this); } void SpekWindow::open(const wxString& path) @@ -294,6 +308,12 @@ void SpekWindow::on_about(wxCommandEvent& event) wxAboutBox(info); } +void SpekWindow::on_notify(wxCommandEvent& event) +{ + this->GetSizer()->Show((size_t)0); + this->Layout(); +} + void SpekWindow::on_visit(wxCommandEvent& event) { wxLaunchDefaultBrowser(wxT("http://spek-project.org")); @@ -305,3 +325,45 @@ void SpekWindow::on_close(wxCommandEvent& event) self->GetSizer()->Hide((size_t)0); self->Layout(); } + +static void * check_version(void *p) +{ + // Does the user want to check for updates? + SpekPreferences& prefs = SpekPreferences::get(); + if (!prefs.get_check_update()) { + return NULL; + } + + // Calculate the number of days since 0001-01-01, borrowed from GLib. + wxDateTime now = wxDateTime::Now(); + int year = now.GetYear() - 1; + int days = year * 365; + days += (year >>= 2); // divide by 4 and add + days -= (year /= 25); // divides original # years by 100 + days += year >> 2; // divides by 4, which divides original by 400 + days += now.GetDayOfYear(); + + // When was the last update? + int diff = days - prefs.get_last_update(); + if (diff < 7) { + return NULL; + } + + // Get the version number. + wxString version = wxT("0.8.1"); //Platform.read_line ("http://www.spek-project.org/version"); + if (version.IsEmpty()) { + return NULL; + } + + if (version > wxT(PACKAGE_VERSION)) { + SpekWindow *self = (SpekWindow *)p; + wxCommandEvent event(SPEK_NOTIFY_EVENT, -1); + event.SetEventObject(self); + wxPostEvent(self, event); + } + + // Update the preferences. + prefs.set_check_update(true); + prefs.set_last_update(days); + return NULL; +} diff --git a/src/spek-window.hh b/src/spek-window.hh @@ -35,6 +35,7 @@ private: void on_exit(wxCommandEvent& event); void on_preferences(wxCommandEvent& event); void on_about(wxCommandEvent& event); + void on_notify(wxCommandEvent& event); void on_visit(wxCommandEvent& event); void on_close(wxCommandEvent& event); diff --git a/src/spek-window.vala b/src/spek-window.vala @@ -22,53 +22,10 @@ using Gtk; namespace Spek { public class Window : Gtk.Window { - public Window (string? file_name) { - try { - Thread.create<void*> (check_version, false); - } catch (ThreadError e) { - } - } - private void on_edit_preferences () { var dlg = new PreferencesDialog (); dlg.transient_for = this; dlg.run (); } - - private void * check_version () { - // Does the user want to check for updates? - var prefs = Preferences.instance; - var check = prefs.check_update; - if (!check) { - return null; - } - - // When was the last update? - var time_val = TimeVal (); - time_val.get_current_time (); - Date today = Date (); - today.set_time_val (time_val); - int day = prefs.last_update; - int diff = (int) today.get_julian () - day; - if (diff < 7) { - return null; - } - - // Get the version number. - var version = Platform.read_line ("http://www.spek-project.org/version"); - if (version == null) { - return null; - } - - if (version != null && version > Config.PACKAGE_VERSION) { - Idle.add (() => { info_bar.show_all (); return false; }); - } - - // Update the preferences. - prefs.check_update = check; - prefs.last_update = (int) today.get_julian (); - prefs.save (); - return null; - } } }