/[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 1660 by schoenebeck, Sun Feb 3 00:19:55 2008 UTC revision 2471 by persson, Sun Sep 15 17:06:45 2013 UTC
# Line 1  Line 1 
1  /*  /*
2   * Copyright (C) 2007, 2008 Andreas Persson   * Copyright (C) 2007-2009 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 19  Line 19 
19    
20  #include "gigedit.h"  #include "gigedit.h"
21    
22  #include <gtkmm/main.h>  #include <glibmm/dispatcher.h>
23  #include <glibmm/main.h>  #include <glibmm/main.h>
24    #include <gtkmm/main.h>
25    
26  #include "mainwindow.h"  #include "mainwindow.h"
27    
28  #include "global.h"  #include "global.h"
29    
30    #ifdef __APPLE__
31    #include <dlfcn.h>
32    #include <glibmm/fileutils.h>
33    #include <glibmm/miscutils.h>
34    #endif
35    
36  namespace {  namespace {
37    
38  // State for a gigedit thread.  // State for a gigedit thread.
# Line 48  private: Line 56  private:
56      class Cond {      class Cond {
57      private:      private:
58          bool pred;          bool pred;
59          Glib::Mutex mutex;          Glib::Threads::Mutex mutex;
60          Glib::Cond cond;          Glib::Threads::Cond cond;
61      public:      public:
62          Cond() : pred(false) { }          Cond() : pred(false) { }
63          void signal() {          void signal() {
64              Glib::Mutex::Lock lock(mutex);              Glib::Threads::Mutex::Lock lock(mutex);
65              pred = true;              pred = true;
66              cond.signal();              cond.signal();
67          }          }
68          void wait() {          void wait() {
69              Glib::Mutex::Lock lock(mutex);              Glib::Threads::Mutex::Lock lock(mutex);
70              while (!pred) cond.wait(mutex);              while (!pred) cond.wait(mutex);
71          }          }
72      };      };
73    
74    #ifdef OLD_THREADS
75      static Glib::StaticMutex mutex;      static Glib::StaticMutex mutex;
76    #else
77        static Glib::Threads::Mutex mutex;
78    #endif
79      static Glib::Dispatcher* dispatcher;      static Glib::Dispatcher* dispatcher;
80      static GigEditState* current;      static GigEditState* current;
81    
# Line 79  private: Line 91  private:
91      void close_window();      void close_window();
92  };  };
93    
94    #ifdef WIN32
95    HINSTANCE gigedit_dll_handle = 0;
96    #endif
97    
98    #ifdef __APPLE__
99    std::string gigedit_localedir;
100    #endif
101    
102  void init_app() {  void init_app() {
103      static bool process_initialized = false;      static bool process_initialized = false;
104      if (!process_initialized) {      if (!process_initialized) {
# Line 86  void init_app() { Line 106  void init_app() {
106                    << std::flush;                    << std::flush;
107          setlocale(LC_ALL, "");          setlocale(LC_ALL, "");
108    
109    #ifdef __APPLE__
110            // Look for pango.modules, gdk-pixbuf.loaders and locale files
111            // under the same dir as the gigedit dylib is installed in.
112            Dl_info info;
113            if (dladdr((void*)&init_app, &info)) {
114                std::string libdir = Glib::path_get_dirname(info.dli_fname);
115    
116                if (Glib::getenv("PANGO_SYSCONFDIR") == "" &&
117                    Glib::file_test(Glib::build_filename(libdir,
118                                                         "pango/pango.modules"),
119                                    Glib::FILE_TEST_EXISTS)) {
120                    Glib::setenv("PANGO_SYSCONFDIR", libdir, true);
121                }
122                if (Glib::getenv("GDK_PIXBUF_MODULE_FILE") == "") {
123                    std::string module_file =
124                        Glib::build_filename(libdir,
125                                             "gtk-2.0/gdk-pixbuf.loaders");
126                    if (Glib::file_test(module_file, Glib::FILE_TEST_EXISTS)) {
127                        Glib::setenv("GDK_PIXBUF_MODULE_FILE", module_file, true);
128                    }
129                }
130    #if HAVE_GETTEXT
131                std::string localedir = Glib::build_filename(libdir, "locale");
132                if (Glib::file_test(localedir, Glib::FILE_TEST_EXISTS)) {
133                    gigedit_localedir = localedir;
134                    bindtextdomain(GETTEXT_PACKAGE, gigedit_localedir.c_str());
135                } else {
136                    bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
137                }
138    #endif
139            }
140    
141            // The gtk file dialog stores its recent files state in
142            // ~/.local/share
143            g_mkdir_with_parents(
144                Glib::build_filename(Glib::get_home_dir(),
145                                     ".local/share").c_str(), 0777);
146    #endif
147    
148  #if HAVE_GETTEXT  #if HAVE_GETTEXT
149    
150    #ifdef WIN32
151    #if GLIB_CHECK_VERSION(2, 16, 0)
152            gchar* root =
153                g_win32_get_package_installation_directory_of_module(gigedit_dll_handle);
154    #else
155            gchar* root =
156                g_win32_get_package_installation_directory(NULL, NULL);
157    #endif
158            gchar* temp = g_build_filename(root, "/share/locale", NULL);
159            g_free(root);
160            gchar* localedir = g_win32_locale_filename_from_utf8(temp);
161            g_free(temp);
162            bindtextdomain(GETTEXT_PACKAGE, localedir);
163            g_free(localedir);
164    #elif !defined(__APPLE__)
165          bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);          bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
166    #endif
167          bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");          bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
168          textdomain(GETTEXT_PACKAGE);          textdomain(GETTEXT_PACKAGE);
169  #endif // HAVE_GETTEXT  #endif // HAVE_GETTEXT
170    
171    #ifdef OLD_THREADS
172          // make sure thread_init() is called once and ONLY once per process          // make sure thread_init() is called once and ONLY once per process
173          if (!Glib::thread_supported()) Glib::thread_init();          if (!Glib::thread_supported()) Glib::thread_init();
174    #endif
175          process_initialized = true;          process_initialized = true;
176      }      }
177  }  }
# Line 127  void connect_signals(GigEdit* gigedit, M Line 204  void connect_signals(GigEdit* gigedit, M
204      mainwindow->signal_dimreg_changed().connect(      mainwindow->signal_dimreg_changed().connect(
205          gigedit->signal_dimreg_changed().make_slot()          gigedit->signal_dimreg_changed().make_slot()
206      );      );
207        mainwindow->signal_sample_changed().connect(
208            gigedit->signal_sample_changed().make_slot()
209        );
210      mainwindow->signal_sample_ref_changed().connect(      mainwindow->signal_sample_ref_changed().connect(
211          gigedit->signal_sample_ref_changed().make_slot()          gigedit->signal_sample_ref_changed().make_slot()
212      );      );
# Line 148  int GigEdit::run(int argc, char* argv[]) Line 228  int GigEdit::run(int argc, char* argv[])
228      init_app();      init_app();
229    
230      Gtk::Main kit(argc, argv);      Gtk::Main kit(argc, argv);
231    
232    #if HAVE_GETTEXT && defined(__APPLE__)
233        // Gtk::Main binds the gtk locale to a possible non-existent
234        // directory. If we have bundled gtk locale files, we rebind here,
235        // after the Gtk::Main constructor.
236        if (!gigedit_localedir.empty()) {
237            bindtextdomain("gtk20", gigedit_localedir.c_str());
238        }
239    #endif
240    
241      MainWindow window;      MainWindow window;
242      connect_signals(this, &window);      connect_signals(this, &window);
243      if (argc >= 2) window.load_file(argv[1]);      if (argc >= 2) window.load_file(argv[1]);
# Line 209  sigc::signal<void, gig::DimensionRegion* Line 299  sigc::signal<void, gig::DimensionRegion*
299      return dimreg_changed_signal;      return dimreg_changed_signal;
300  }  }
301    
302    sigc::signal<void, gig::Sample*>& GigEdit::signal_sample_changed() {
303        return sample_changed_signal;
304    }
305    
306  sigc::signal<void, gig::Sample*/*old*/, gig::Sample*/*new*/>& GigEdit::signal_sample_ref_changed() {  sigc::signal<void, gig::Sample*/*old*/, gig::Sample*/*new*/>& GigEdit::signal_sample_ref_changed() {
307      return sample_ref_changed_signal;      return sample_ref_changed_signal;
308  }  }
# Line 221  sigc::signal<void, int/*key*/, int/*velo Line 315  sigc::signal<void, int/*key*/, int/*velo
315      return keyboard_key_released_signal;      return keyboard_key_released_signal;
316  }  }
317    
318    #ifdef OLD_THREADS
319  Glib::StaticMutex GigEditState::mutex = GLIBMM_STATIC_MUTEX_INIT;  Glib::StaticMutex GigEditState::mutex = GLIBMM_STATIC_MUTEX_INIT;
320    #else
321    Glib::Threads::Mutex GigEditState::mutex;
322    #endif
323  Glib::Dispatcher* GigEditState::dispatcher = 0;  Glib::Dispatcher* GigEditState::dispatcher = 0;
324  GigEditState* GigEditState::current = 0;  GigEditState* GigEditState::current = 0;
325    
# Line 252  void GigEditState::main_loop_run(Cond* i Line 350  void GigEditState::main_loop_run(Cond* i
350      const char* argv_c[] = { "gigedit" };      const char* argv_c[] = { "gigedit" };
351      char** argv = const_cast<char**>(argv_c);      char** argv = const_cast<char**>(argv_c);
352      Gtk::Main main_loop(argc, argv);      Gtk::Main main_loop(argc, argv);
353    #if HAVE_GETTEXT && defined(__APPLE__)
354        if (!gigedit_localedir.empty()) {
355            bindtextdomain("gtk20", gigedit_localedir.c_str());
356        }
357    #endif
358    
359      dispatcher = new Glib::Dispatcher();      dispatcher = new Glib::Dispatcher();
360      dispatcher->connect(sigc::ptr_fun(&GigEditState::open_window_static));      dispatcher->connect(sigc::ptr_fun(&GigEditState::open_window_static));
# Line 266  void GigEditState::run(gig::Instrument* Line 369  void GigEditState::run(gig::Instrument*
369      static bool main_loop_started = false;      static bool main_loop_started = false;
370      if (!main_loop_started) {      if (!main_loop_started) {
371          Cond initialized;          Cond initialized;
372    #ifdef OLD_THREADS
373          Glib::Thread::create(          Glib::Thread::create(
374              sigc::bind(sigc::ptr_fun(&GigEditState::main_loop_run),              sigc::bind(sigc::ptr_fun(&GigEditState::main_loop_run),
375                         &initialized),                         &initialized),
376              false);              false);
377    #else
378            Glib::Threads::Thread::create(
379                sigc::bind(sigc::ptr_fun(&GigEditState::main_loop_run),
380                           &initialized));
381    #endif
382          initialized.wait();          initialized.wait();
383          main_loop_started = true;          main_loop_started = true;
384      }      }
# Line 280  void GigEditState::run(gig::Instrument* Line 389  void GigEditState::run(gig::Instrument*
389      mutex.unlock();      mutex.unlock();
390      close.wait(); // sleep until window is closed      close.wait(); // sleep until window is closed
391  }  }
392    
393    #if defined(WIN32)
394    extern "C" {
395        BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved)
396        {
397            switch (reason) {
398            case DLL_PROCESS_ATTACH:
399                gigedit_dll_handle = instance;
400                break;
401            }
402            return TRUE;
403        }
404    }
405    #endif

Legend:
Removed from v.1660  
changed lines
  Added in v.2471

  ViewVC Help
Powered by ViewVC