/[svn]/gigedit/trunk/src/gigedit/gigedit.cpp
ViewVC logotype

Diff of /gigedit/trunk/src/gigedit/gigedit.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1456 by persson, Sun Oct 21 15:32:36 2007 UTC revision 1654 by schoenebeck, Wed Jan 30 02:20:48 2008 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (C) 2007 Andreas Persson   * Copyright (C) 2007, 2008 Andreas Persson
3   *   *
4   * This program is free software; you can redistribute it and/or   * This program is free software; you can redistribute it and/or
5   * modify it under the terms of the GNU General Public License as   * modify it under the terms of the GNU General Public License as
# Line 20  Line 20 
20  #include "gigedit.h"  #include "gigedit.h"
21    
22  #include <gtkmm/main.h>  #include <gtkmm/main.h>
23    #include <glibmm/main.h>
24  #include "mainwindow.h"  #include "mainwindow.h"
25    
26  #include "global.h"  #include "global.h"
27    
28    GigEditJob::GigEditJob() {
29        _msecs = 100; // 100ms by default
30    }
31    
32    int GigEditJob::msecs() {
33        return _msecs;
34    }
35    
36  namespace {  namespace {
37    
38  // State for a gigedit thread.  // State for a gigedit thread.
# Line 39  public: Line 48  public:
48      GigEditState(GigEdit* parent) : parent(parent) { }      GigEditState(GigEdit* parent) : parent(parent) { }
49      void run(gig::Instrument* pInstrument);      void run(gig::Instrument* pInstrument);
50    
51        static std::vector< GigEditJob* > timeoutJobs;
52        MainWindow* window;
53    
54  private:  private:
55    
56      // simple condition variable abstraction      // simple condition variable abstraction
# Line 71  private: Line 83  private:
83      Cond open;      Cond open;
84      Cond close;      Cond close;
85      gig::Instrument* instrument;      gig::Instrument* instrument;
     MainWindow* window;  
86    
87      void open_window();      void open_window();
88      void close_window();      void close_window();
# Line 130  void connect_signals(GigEdit* gigedit, M Line 141  void connect_signals(GigEdit* gigedit, M
141      );      );
142  }  }
143    
144  }  } // namespace
145    
146    GigEdit::GigEdit() {
147        state = NULL;
148    }
149    
150  int GigEdit::run(int argc, char* argv[]) {  int GigEdit::run(int argc, char* argv[]) {
151      init_app();      init_app();
# Line 148  int GigEdit::run(gig::Instrument* pInstr Line 162  int GigEdit::run(gig::Instrument* pInstr
162      init_app();      init_app();
163    
164      GigEditState state(this);      GigEditState state(this);
165        this->state = &state;
166      state.run(pInstrument);      state.run(pInstrument);
167        this->state = NULL;
168      return 0;      return 0;
169  }  }
170    
171    void GigEdit::add_timeout_job(GigEditJob* job) {
172        GigEditState::timeoutJobs.push_back(job);
173    }
174    
175    void GigEdit::on_note_on_event(int key, int velocity) {
176        if (!this->state) return;
177        GigEditState* state = (GigEditState*) this->state;
178        state->window->signal_note_on().emit(key, velocity);
179    }
180    
181    void GigEdit::on_note_off_event(int key, int velocity) {
182        if (!this->state) return;
183        GigEditState* state = (GigEditState*) this->state;
184        state->window->signal_note_off().emit(key, velocity);
185    }
186    
187  sigc::signal<void, gig::File*>& GigEdit::signal_file_structure_to_be_changed() {  sigc::signal<void, gig::File*>& GigEdit::signal_file_structure_to_be_changed() {
188      return file_structure_to_be_changed_signal;      return file_structure_to_be_changed_signal;
189  }  }
# Line 192  sigc::signal<void, gig::Sample*/*old*/, Line 224  sigc::signal<void, gig::Sample*/*old*/,
224  Glib::StaticMutex GigEditState::mutex = GLIBMM_STATIC_MUTEX_INIT;  Glib::StaticMutex GigEditState::mutex = GLIBMM_STATIC_MUTEX_INIT;
225  Glib::Dispatcher* GigEditState::dispatcher = 0;  Glib::Dispatcher* GigEditState::dispatcher = 0;
226  GigEditState* GigEditState::current = 0;  GigEditState* GigEditState::current = 0;
227    std::vector<GigEditJob*> GigEditState::timeoutJobs;
228    
229  void GigEditState::open_window_static() {  void GigEditState::open_window_static() {
230      GigEditState* c = GigEditState::current;      GigEditState* c = GigEditState::current;
# Line 225  void GigEditState::main_loop_run(Cond* i Line 258  void GigEditState::main_loop_run(Cond* i
258      dispatcher->connect(sigc::ptr_fun(&GigEditState::open_window_static));      dispatcher->connect(sigc::ptr_fun(&GigEditState::open_window_static));
259      initialized->signal();      initialized->signal();
260    
261        for (int i = 0; i < GigEditState::timeoutJobs.size(); i++) {
262            GigEditJob* job = timeoutJobs[i];
263            const Glib::RefPtr<Glib::TimeoutSource> timeout_source =
264                Glib::TimeoutSource::create(job->msecs());
265            timeout_source->connect(
266                sigc::mem_fun(*job, &GigEditJob::runGigEditJob)
267            );
268            timeout_source->attach(Glib::MainContext::get_default());
269        }
270    
271      main_loop.run();      main_loop.run();
272  }  }
273    

Legend:
Removed from v.1456  
changed lines
  Added in v.1654

  ViewVC Help
Powered by ViewVC