From 0fd55176b99cd6bd3230afdf350687a04702bd92 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 12 May 2009 04:34:08 +0000 Subject: Detach/Reattach from/to Jack from UI (ticket #180). git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@1985 a436a847-0d15-0410-975c-d299462d15a1 --- src/engine/Driver.hpp | 3 +- src/engine/Engine.cpp | 68 ++- src/engine/EventSource.hpp | 4 +- src/engine/HTTPEngineReceiver.cpp | 8 +- src/engine/HTTPEngineReceiver.hpp | 4 +- src/engine/JackAudioDriver.cpp | 119 +++-- src/engine/JackAudioDriver.hpp | 21 +- src/engine/JackMidiDriver.cpp | 45 +- src/engine/JackMidiDriver.hpp | 7 +- src/engine/MidiDriver.hpp | 3 + src/engine/OSCEngineReceiver.cpp | 8 +- src/engine/OSCEngineReceiver.hpp | 4 +- src/engine/PostProcessor.cpp | 16 +- src/engine/QueuedEngineInterface.cpp | 14 +- src/engine/QueuedEventSource.hpp | 4 +- src/engine/events/ClearPatchEvent.cpp | 2 +- src/engine/events/DeactivateEvent.cpp | 54 --- src/engine/events/DeactivateEvent.hpp | 12 +- src/engine/events/DestroyEvent.cpp | 2 +- src/engine/wscript | 1 - src/gui/ConnectWindow.cpp | 24 +- src/gui/ConnectWindow.hpp | 4 + src/gui/ingen_gui.glade | 844 ++++++++++++++++++---------------- 23 files changed, 681 insertions(+), 590 deletions(-) delete mode 100644 src/engine/events/DeactivateEvent.cpp (limited to 'src') diff --git a/src/engine/Driver.hpp b/src/engine/Driver.hpp index a2ca6b15..e03c316d 100644 --- a/src/engine/Driver.hpp +++ b/src/engine/Driver.hpp @@ -46,7 +46,8 @@ public: /** Set the name of the system port */ virtual void set_name(const std::string& name) = 0; - virtual void unregister() = 0; + virtual void create() = 0; + virtual void destroy() = 0; bool is_input() const { return _patch_port->is_input(); } DuplexPort* patch_port() const { return _patch_port; } diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 41004b97..4d984916 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -22,26 +22,26 @@ #include "raul/Deletable.hpp" #include "raul/Maid.hpp" #include "raul/SharedPtr.hpp" -#include "Engine.hpp" -#include "tuning.hpp" -#include "Event.hpp" -#include "common/interface/EventType.hpp" -#include "shared/Store.hpp" -#include "NodeFactory.hpp" +#include "AudioDriver.hpp" #include "ClientBroadcaster.hpp" -#include "PatchImpl.hpp" +#include "Engine.hpp" #include "EngineStore.hpp" +#include "Event.hpp" +#include "MessageContext.hpp" #include "MidiDriver.hpp" +#include "NodeFactory.hpp" #include "OSCDriver.hpp" -#include "QueuedEventSource.hpp" +#include "PatchImpl.hpp" #include "PostProcessor.hpp" -#include "events/CreatePatchEvent.hpp" #include "PostProcessor.hpp" -#include "AudioDriver.hpp" -#include "ProcessSlave.hpp" #include "ProcessContext.hpp" -#include "MessageContext.hpp" +#include "ProcessSlave.hpp" +#include "QueuedEventSource.hpp" #include "ThreadManager.hpp" +#include "common/interface/EventType.hpp" +#include "events/CreatePatchEvent.hpp" +#include "shared/Store.hpp" +#include "tuning.hpp" using namespace std; namespace Ingen { @@ -182,20 +182,21 @@ Engine::activate(size_t parallelism) _midi_driver = new DummyMidiDriver(); for (EventSources::iterator i = _event_sources.begin(); i != _event_sources.end(); ++i) - (*i)->activate(); + (*i)->activate_source(); // Create root patch - - PatchImpl* root_patch = new PatchImpl(*this, "", 1, NULL, - _audio_driver->sample_rate(), _audio_driver->buffer_size(), 1); - root_patch->activate(); - _world->store->add(root_patch); - root_patch->compiled_patch(root_patch->compile()); - - assert(_audio_driver->root_patch() == NULL); - _audio_driver->set_root_patch(root_patch); + PatchImpl* root_patch = _audio_driver->root_patch(); + if (!root_patch) { + root_patch = new PatchImpl(*this, "", 1, NULL, + _audio_driver->sample_rate(), _audio_driver->buffer_size(), 1); + root_patch->activate(); + _world->store->add(root_patch); + root_patch->compiled_patch(root_patch->compile()); + _audio_driver->set_root_patch(root_patch); + } _audio_driver->activate(); + _midi_driver->attach(*_audio_driver.get()); _process_slaves.clear(); _process_slaves.reserve(parallelism); @@ -219,34 +220,31 @@ Engine::deactivate() return; for (EventSources::iterator i = _event_sources.begin(); i != _event_sources.end(); ++i) - (*i)->deactivate(); + (*i)->deactivate_source(); /*for (Tree::iterator i = _engine_store->objects().begin(); i != _engine_store->objects().end(); ++i) if ((*i)->as_node() != NULL && (*i)->as_node()->parent() == NULL) (*i)->as_node()->deactivate();*/ - _audio_driver->deactivate(); - - if (_midi_driver != NULL) { + if (_midi_driver) _midi_driver->deactivate(); - delete _midi_driver; - _midi_driver = NULL; - } + + _audio_driver->deactivate(); _audio_driver->root_patch()->deactivate(); - for (size_t i=0; i < _process_slaves.size(); ++i) { + /*for (size_t i=0; i < _process_slaves.size(); ++i) { delete _process_slaves[i]; - } + }*/ - _process_slaves.clear(); + //_process_slaves.clear(); // Finalize any lingering events (unlikely) - _post_processor->process(); + //_post_processor->process(); - _audio_driver.reset(); - _event_sources.clear(); + //_audio_driver.reset(); + //_event_sources.clear(); _activated = false; } diff --git a/src/engine/EventSource.hpp b/src/engine/EventSource.hpp index f3377393..1e36c2da 100644 --- a/src/engine/EventSource.hpp +++ b/src/engine/EventSource.hpp @@ -43,8 +43,8 @@ class EventSource public: virtual ~EventSource() {} - virtual void activate() = 0; - virtual void deactivate() = 0; + virtual void activate_source() = 0; + virtual void deactivate_source() = 0; virtual void process(PostProcessor& dest, ProcessContext& context) = 0; }; diff --git a/src/engine/HTTPEngineReceiver.cpp b/src/engine/HTTPEngineReceiver.cpp index 98008a16..4e279455 100644 --- a/src/engine/HTTPEngineReceiver.cpp +++ b/src/engine/HTTPEngineReceiver.cpp @@ -86,20 +86,20 @@ HTTPEngineReceiver::~HTTPEngineReceiver() void -HTTPEngineReceiver::activate() +HTTPEngineReceiver::activate_source() { - QueuedEventSource::activate(); + QueuedEventSource::activate_source(); _receive_thread->set_name("HTTP Receiver"); _receive_thread->start(); } void -HTTPEngineReceiver::deactivate() +HTTPEngineReceiver::deactivate_source() { cout << "[HTTPEngineReceiver] Stopped HTTP listening thread" << endl; _receive_thread->stop(); - QueuedEventSource::deactivate(); + QueuedEventSource::deactivate_source(); } diff --git a/src/engine/HTTPEngineReceiver.hpp b/src/engine/HTTPEngineReceiver.hpp index d47e9747..88f71aaf 100644 --- a/src/engine/HTTPEngineReceiver.hpp +++ b/src/engine/HTTPEngineReceiver.hpp @@ -31,8 +31,8 @@ public: HTTPEngineReceiver(Engine& engine, uint16_t port); ~HTTPEngineReceiver(); - void activate(); - void deactivate(); + void activate_source(); + void deactivate_source(); private: struct ReceiveThread : public Raul::Thread { diff --git a/src/engine/JackAudioDriver.cpp b/src/engine/JackAudioDriver.cpp index d7cfece2..f1f814c9 100644 --- a/src/engine/JackAudioDriver.cpp +++ b/src/engine/JackAudioDriver.cpp @@ -53,15 +53,7 @@ JackAudioPort::JackAudioPort(JackAudioDriver* driver, DuplexPort* patch_port) { assert(patch_port->poly() == 1); - _jack_port = jack_port_register(_driver->jack_client(), - patch_port->path().c_str(), JACK_DEFAULT_AUDIO_TYPE, - (patch_port->is_input()) ? JackPortIsInput : JackPortIsOutput, - 0); - - if (_jack_port == NULL) { - cerr << "[JackAudioPort] ERROR: Failed to register port " << patch_port->path() << endl; - throw JackAudioDriver::PortRegistrationFailedException(); - } + create(); patch_port->buffer(0)->clear(); patch_port->fixed_buffers(true); @@ -75,7 +67,22 @@ JackAudioPort::~JackAudioPort() void -JackAudioPort::unregister() +JackAudioPort::create() +{ + _jack_port = jack_port_register(_driver->jack_client(), + _patch_port->path().c_str(), JACK_DEFAULT_AUDIO_TYPE, + (_patch_port->is_input()) ? JackPortIsInput : JackPortIsOutput, + 0); + + if (_jack_port == NULL) { + cerr << "[JackAudioPort] ERROR: Failed to register port " << _patch_port->path() << endl; + throw JackAudioDriver::PortRegistrationFailedException(); + } +} + + +void +JackAudioPort::destroy() { assert(_jack_port); if (jack_port_unregister(_driver->jack_client(), _jack_port)) @@ -103,24 +110,42 @@ JackAudioPort::prepare_buffer(jack_nframes_t nframes) //// JackAudioDriver //// -JackAudioDriver::JackAudioDriver(Engine& engine, - std::string server_name, - std::string client_name, - jack_client_t* jack_client) +JackAudioDriver::JackAudioDriver(Engine& engine) : _engine(engine) , _jack_thread(NULL) - , _client(jack_client) - , _buffer_size(jack_client ? jack_get_buffer_size(jack_client) : 0) - , _sample_rate(jack_client ? jack_get_sample_rate(jack_client) : 0) + , _sem(0) + , _flag(0) + , _client(NULL) + , _buffer_size(0) + , _sample_rate(0) , _is_activated(false) - , _local_client(true) // FIXME + , _local_client(true) , _process_context(engine) , _root_patch(NULL) { - if (!_client) { +} + + +JackAudioDriver::~JackAudioDriver() +{ + deactivate(); + + if (_local_client) + jack_client_close(_client); +} + + +bool +JackAudioDriver::attach(const std::string& server_name, + const std::string& client_name, + void* jack_client) +{ + assert(!_client); + if (!jack_client) { // Try supplied server name if (server_name != "") { - _client = jack_client_open(client_name.c_str(), JackServerName, NULL, server_name.c_str()); + _client = jack_client_open(client_name.c_str(), + JackServerName, NULL, server_name.c_str()); if (_client) cerr << "[JackAudioDriver] Connected to JACK server '" << server_name << "'" << endl; @@ -138,27 +163,27 @@ JackAudioDriver::JackAudioDriver(Engine& engine, // Still failed if (!_client) { cerr << "[JackAudioDriver] Unable to connect to Jack. Exiting." << endl; - exit(EXIT_FAILURE); + return false; } - - _buffer_size = jack_get_buffer_size(_client); - _sample_rate = jack_get_sample_rate(_client); + } else { + _client = (jack_client_t*)jack_client; } + _local_client = (jack_client == NULL); + + _buffer_size = jack_get_buffer_size(_client); + _sample_rate = jack_get_sample_rate(_client); + jack_on_shutdown(_client, shutdown_cb, this); jack_set_thread_init_callback(_client, thread_init_cb, this); jack_set_sample_rate_callback(_client, sample_rate_cb, this); jack_set_buffer_size_callback(_client, buffer_size_cb, this); -} - - -JackAudioDriver::~JackAudioDriver() -{ - deactivate(); - if (_local_client) - jack_client_close(_client); + for (Raul::List::iterator i = _ports.begin(); i != _ports.end(); ++i) + (*i)->create(); + + return true; } @@ -170,6 +195,9 @@ JackAudioDriver::activate() return; } + if (!_client) + attach("", "ingen", NULL); + jack_set_process_callback(_client, process_cb, this); _is_activated = true; @@ -181,8 +209,11 @@ JackAudioDriver::activate() cout << "[JackAudioDriver] Activated Jack client." << endl; } - if (!_engine.midi_driver() || dynamic_cast(_engine.midi_driver())) - _engine.set_midi_driver(new JackMidiDriver(_engine, _client)); + if (!_engine.midi_driver() || dynamic_cast(_engine.midi_driver())) { + JackMidiDriver* midi_driver = new JackMidiDriver(_engine); + midi_driver->attach(*this); + _engine.set_midi_driver(midi_driver); + } } @@ -190,12 +221,17 @@ void JackAudioDriver::deactivate() { if (_is_activated) { - for (Raul::List::iterator i = _ports.begin(); i != _ports.end(); ++i) - (*i)->unregister(); + _flag = 1; _is_activated = false; + _sem.wait(); + for (Raul::List::iterator i = _ports.begin(); i != _ports.end(); ++i) + (*i)->destroy(); jack_deactivate(_client); + if (_local_client) { + jack_client_close(_client); + _client = NULL; + } _jack_thread->stop(); - _ports.clear(); cout << "[JackAudioDriver] Deactivated Jack client." << endl; } } @@ -288,8 +324,11 @@ JackAudioDriver::driver_port(const Path& path) int JackAudioDriver::_process_cb(jack_nframes_t nframes) { - if (nframes == 0 || ! _is_activated) + if (nframes == 0 || ! _is_activated) { + if (_flag == 1) + _sem.post(); return 0; + } // FIXME: all of this time stuff is screwy @@ -396,7 +435,9 @@ new_jack_audio_driver( const std::string client_name, void* jack_client) { - return new Ingen::JackAudioDriver(engine, server_name, client_name, (jack_client_t*)jack_client); + Ingen::JackAudioDriver* driver = new Ingen::JackAudioDriver(engine); + driver->attach(server_name, client_name, jack_client); + return driver; } } diff --git a/src/engine/JackAudioDriver.hpp b/src/engine/JackAudioDriver.hpp index a7f4c2ff..aa952197 100644 --- a/src/engine/JackAudioDriver.hpp +++ b/src/engine/JackAudioDriver.hpp @@ -20,8 +20,10 @@ #include #include -#include "raul/Thread.hpp" +#include "raul/AtomicInt.hpp" #include "raul/List.hpp" +#include "raul/Semaphore.hpp" +#include "raul/Thread.hpp" #include "AudioDriver.hpp" #include "Buffer.hpp" #include "ProcessContext.hpp" @@ -48,7 +50,8 @@ public: JackAudioPort(JackAudioDriver* driver, DuplexPort* patch_port); ~JackAudioPort(); - void unregister(); + void create(); + void destroy(); void set_name(const std::string& name) { jack_port_set_name(_jack_port, name.c_str()); }; @@ -75,13 +78,13 @@ private: class JackAudioDriver : public AudioDriver { public: - JackAudioDriver(Engine& engine, - std::string server_name = "default", - std::string client_name = "ingen", - jack_client_t* jack_client = 0); - + JackAudioDriver(Engine& engine); ~JackAudioDriver(); + bool attach(const std::string& server_name, + const std::string& client_name, + void* jack_client); + void activate(); void deactivate(); void enable(); @@ -112,7 +115,7 @@ public: SampleCount sample_rate() const { return _sample_rate; } bool is_activated() const { return _is_activated; } - inline SampleCount frame_time() const { return jack_frame_time(_client); } + inline SampleCount frame_time() const { return _client ? jack_frame_time(_client) : 0; } class PortRegistrationFailedException : public std::exception {}; @@ -136,6 +139,8 @@ private: Engine& _engine; Raul::Thread* _jack_thread; + Raul::Semaphore _sem; + Raul::AtomicInt _flag; jack_client_t* _client; jack_nframes_t _buffer_size; jack_nframes_t _sample_rate; diff --git a/src/engine/JackMidiDriver.cpp b/src/engine/JackMidiDriver.cpp index 9551b6be..ec94f962 100644 --- a/src/engine/JackMidiDriver.cpp +++ b/src/engine/JackMidiDriver.cpp @@ -47,15 +47,7 @@ JackMidiPort::JackMidiPort(JackMidiDriver* driver, DuplexPort* patch_port) { assert(patch_port->poly() == 1); - _jack_port = jack_port_register(_driver->jack_client(), - patch_port->path().c_str(), JACK_DEFAULT_MIDI_TYPE, - (patch_port->is_input()) ? JackPortIsInput : JackPortIsOutput, - 0); - - if (_jack_port == NULL) { - cerr << "[JackMidiPort] ERROR: Failed to register port " << patch_port->path() << endl; - throw JackAudioDriver::PortRegistrationFailedException(); - } + create(); patch_port->buffer(0)->clear(); } @@ -68,7 +60,22 @@ JackMidiPort::~JackMidiPort() void -JackMidiPort::unregister() +JackMidiPort::create() +{ + _jack_port = jack_port_register(_driver->jack_client(), + _patch_port->path().c_str(), JACK_DEFAULT_MIDI_TYPE, + (_patch_port->is_input()) ? JackPortIsInput : JackPortIsOutput, + 0); + + if (_jack_port == NULL) { + cerr << "[JackMidiPort] ERROR: Failed to register port " << _patch_port->path() << endl; + throw JackAudioDriver::PortRegistrationFailedException(); + } +} + + +void +JackMidiPort::destroy() { assert(_jack_port); if (jack_port_unregister(_driver->jack_client(), _jack_port)) @@ -157,9 +164,9 @@ JackMidiPort::post_process(ProcessContext& context) bool JackMidiDriver::_midi_thread_exit_flag = true; -JackMidiDriver::JackMidiDriver(Engine& engine, jack_client_t* client) +JackMidiDriver::JackMidiDriver(Engine& engine) : _engine(engine) - , _client(client) + , _client(NULL) , _is_activated(false) , _is_enabled(false) { @@ -175,6 +182,17 @@ JackMidiDriver::~JackMidiDriver() } +void +JackMidiDriver::attach(AudioDriver& driver) +{ + JackAudioDriver* jad = dynamic_cast(&driver); + assert(jad); + _client = jad->jack_client(); + for (Raul::List::iterator i = _ports.begin(); i != _ports.end(); ++i) + (*i)->create(); +} + + /** Launch and start the MIDI thread. */ void @@ -190,9 +208,8 @@ void JackMidiDriver::deactivate() { for (Raul::List::iterator i = _ports.begin(); i != _ports.end(); ++i) - (*i)->unregister(); + (*i)->destroy(); _is_activated = false; - _ports.clear(); } diff --git a/src/engine/JackMidiDriver.hpp b/src/engine/JackMidiDriver.hpp index af885766..d0e81396 100644 --- a/src/engine/JackMidiDriver.hpp +++ b/src/engine/JackMidiDriver.hpp @@ -41,7 +41,8 @@ public: JackMidiPort(JackMidiDriver* driver, DuplexPort* port); virtual ~JackMidiPort(); - void unregister(); + void create(); + void destroy(); void pre_process(ProcessContext& context); void post_process(ProcessContext& context); @@ -64,9 +65,11 @@ private: class JackMidiDriver : public MidiDriver { public: - JackMidiDriver(Engine& engine, jack_client_t* client); + JackMidiDriver(Engine& engine); ~JackMidiDriver(); + void attach(AudioDriver& driver); + void activate(); void deactivate(); void enable() { _is_enabled = true; } diff --git a/src/engine/MidiDriver.hpp b/src/engine/MidiDriver.hpp index 75da9db5..da465293 100644 --- a/src/engine/MidiDriver.hpp +++ b/src/engine/MidiDriver.hpp @@ -26,6 +26,7 @@ namespace Ingen { class ProcessContext; +class AudioDriver; /** Midi driver abstract base class. @@ -37,6 +38,8 @@ class MidiDriver : public Driver public: MidiDriver() : Driver(DataType::EVENT) {} + virtual void attach(AudioDriver& master) {} + /** Prepare input for the specified (upcoming) cycle. * * Realtime safe, run in audio thread before executing the graph for a cycle. diff --git a/src/engine/OSCEngineReceiver.cpp b/src/engine/OSCEngineReceiver.cpp index b5505f86..26b8aeeb 100644 --- a/src/engine/OSCEngineReceiver.cpp +++ b/src/engine/OSCEngineReceiver.cpp @@ -143,9 +143,9 @@ OSCEngineReceiver::~OSCEngineReceiver() void -OSCEngineReceiver::activate() +OSCEngineReceiver::activate_source() { - QueuedEventSource::activate(); + QueuedEventSource::activate_source(); _receive_thread->set_name("OSC Receiver"); _receive_thread->start(); _receive_thread->set_scheduling(SCHED_FIFO, 5); // Jack default appears to be 10 @@ -153,11 +153,11 @@ OSCEngineReceiver::activate() void -OSCEngineReceiver::deactivate() +OSCEngineReceiver::deactivate_source() { cout << "[OSCEngineReceiver] Stopped OSC listening thread" << endl; _receive_thread->stop(); - QueuedEventSource::deactivate(); + QueuedEventSource::deactivate_source(); } diff --git a/src/engine/OSCEngineReceiver.hpp b/src/engine/OSCEngineReceiver.hpp index 75094f55..6ab017d0 100644 --- a/src/engine/OSCEngineReceiver.hpp +++ b/src/engine/OSCEngineReceiver.hpp @@ -63,8 +63,8 @@ public: OSCEngineReceiver(Engine& engine, size_t queue_size, uint16_t port); ~OSCEngineReceiver(); - void activate(); - void deactivate(); + void activate_source(); + void deactivate_source(); private: struct ReceiveThread : public Raul::Thread { diff --git a/src/engine/PostProcessor.cpp b/src/engine/PostProcessor.cpp index b90f7ddc..1595ac38 100644 --- a/src/engine/PostProcessor.cpp +++ b/src/engine/PostProcessor.cpp @@ -55,14 +55,18 @@ PostProcessor::process() /* FIXME: process events from all threads if parallel */ /* Process audio thread generated events */ - while (_engine.audio_driver()->context().event_sink().read( - _event_buffer_size, _event_buffer)) { - if (((Event*)_event_buffer)->time() > end_time) { - cerr << "WARNING: Lost event with time " - << ((Event*)_event_buffer)->time() << " > " << end_time << endl; + while (true) { + AudioDriver* driver = _engine.audio_driver(); + if (driver && driver->context().event_sink().read(_event_buffer_size, _event_buffer)) { + if (((Event*)_event_buffer)->time() > end_time) { + cerr << "WARNING: Lost event with time " + << ((Event*)_event_buffer)->time() << " > " << end_time << endl; + break; + } + ((Event*)_event_buffer)->post_process(); + } else { break; } - ((Event*)_event_buffer)->post_process(); } /* Process normal events */ diff --git a/src/engine/QueuedEngineInterface.cpp b/src/engine/QueuedEngineInterface.cpp index 6a322e16..9a2cea1b 100644 --- a/src/engine/QueuedEngineInterface.cpp +++ b/src/engine/QueuedEngineInterface.cpp @@ -39,8 +39,10 @@ QueuedEngineInterface::now() const { // Exactly one cycle latency (some could run ASAP if we get lucky, but not always, and a slight // constant latency is far better than jittery lower (average) latency - assert(_engine.audio_driver()); - return _engine.audio_driver()->frame_time() + _engine.audio_driver()->buffer_size(); + if (_engine.audio_driver()) + return _engine.audio_driver()->frame_time() + _engine.audio_driver()->buffer_size(); + else + return 0; } @@ -99,8 +101,14 @@ QueuedEngineInterface::load_plugins() void QueuedEngineInterface::activate() { - QueuedEventSource::activate(); + static bool in_activate = false; + if (!in_activate) { + in_activate = true; + _engine.activate(1); + } + QueuedEventSource::activate_source(); push_queued(new PingQueuedEvent(_engine, _responder, now())); + in_activate = false; } diff --git a/src/engine/QueuedEventSource.hpp b/src/engine/QueuedEventSource.hpp index f8ff2783..3054d910 100644 --- a/src/engine/QueuedEventSource.hpp +++ b/src/engine/QueuedEventSource.hpp @@ -48,8 +48,8 @@ public: QueuedEventSource(size_t queue_size); ~QueuedEventSource(); - void activate() { Slave::start(); } - void deactivate() { Slave::stop(); } + void activate_source() { Slave::start(); } + void deactivate_source() { Slave::stop(); } void process(PostProcessor& dest, ProcessContext& context); diff --git a/src/engine/events/ClearPatchEvent.cpp b/src/engine/events/ClearPatchEvent.cpp index c37d1910..9122281b 100644 --- a/src/engine/events/ClearPatchEvent.cpp +++ b/src/engine/events/ClearPatchEvent.cpp @@ -143,7 +143,7 @@ ClearPatchEvent::post_process() for (size_t i = 0; i < _driver_ports->size(); ++i) { Raul::List::Node* ln = _driver_ports->at(i); if (ln) { - ln->elem()->unregister(); + ln->elem()->destroy(); _engine.maid()->push(ln); } } diff --git a/src/engine/events/DeactivateEvent.cpp b/src/engine/events/DeactivateEvent.cpp deleted file mode 100644 index a68419f0..00000000 --- a/src/engine/events/DeactivateEvent.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* This file is part of Ingen. - * Copyright (C) 2007 Dave Robillard - * - * Ingen is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "DeactivateEvent.hpp" -#include "Responder.hpp" -#include "Engine.hpp" - -namespace Ingen { - - -DeactivateEvent::DeactivateEvent(Engine& engine, SharedPtr responder, SampleCount timestamp) -: QueuedEvent(engine, responder, timestamp) -{ -} - - -void -DeactivateEvent::pre_process() -{ - QueuedEvent::pre_process(); -} - - -void -DeactivateEvent::execute(ProcessContext& context) -{ - QueuedEvent::execute(context); -} - - -void -DeactivateEvent::post_process() -{ - _responder->respond_ok(); - _engine.deactivate(); -} - - -} // namespace Ingen - diff --git a/src/engine/events/DeactivateEvent.hpp b/src/engine/events/DeactivateEvent.hpp index 5a6750ba..eaa7e9cb 100644 --- a/src/engine/events/DeactivateEvent.hpp +++ b/src/engine/events/DeactivateEvent.hpp @@ -19,6 +19,7 @@ #define DEACTIVATEEVENT_H #include "QueuedEvent.hpp" +#include "Engine.hpp" namespace Ingen { @@ -30,11 +31,14 @@ namespace Ingen { class DeactivateEvent : public QueuedEvent { public: - DeactivateEvent(Engine& engine, SharedPtr responder, SampleCount timestamp); + DeactivateEvent(Engine& engine, SharedPtr responder, SampleCount timestamp) + : QueuedEvent(engine, responder, timestamp) + {} - void pre_process(); - void execute(ProcessContext& context); - void post_process(); + void post_process() { + _responder->respond_ok(); + _engine.deactivate(); + } }; diff --git a/src/engine/events/DestroyEvent.cpp b/src/engine/events/DestroyEvent.cpp index 52c19945..a9597638 100644 --- a/src/engine/events/DestroyEvent.cpp +++ b/src/engine/events/DestroyEvent.cpp @@ -200,7 +200,7 @@ DestroyEvent::post_process() } if (_driver_port) { - _driver_port->elem()->unregister(); + _driver_port->elem()->destroy(); _engine.maid()->push(_driver_port); } } diff --git a/src/engine/wscript b/src/engine/wscript index e6f38c0c..66d6f29e 100644 --- a/src/engine/wscript +++ b/src/engine/wscript @@ -63,7 +63,6 @@ def build(bld): events/CreateNodeEvent.cpp events/CreatePatchEvent.cpp events/CreatePortEvent.cpp - events/DeactivateEvent.cpp events/DestroyEvent.cpp events/DisconnectAllEvent.cpp events/DisconnectionEvent.cpp diff --git a/src/gui/ConnectWindow.cpp b/src/gui/ConnectWindow.cpp index da801075..028ce1df 100644 --- a/src/gui/ConnectWindow.cpp +++ b/src/gui/ConnectWindow.cpp @@ -269,15 +269,29 @@ ConnectWindow::disconnect() if (!_widgets_loaded) return; + _activate_button->set_sensitive(false); + _deactivate_button->set_sensitive(false); + _progress_bar->set_fraction(0.0); - _connect_button->set_sensitive(false); - _disconnect_button->set_sensitive(false); - _connect_button->set_sensitive(true); _disconnect_button->set_sensitive(false); } +void +ConnectWindow::activate() +{ + App::instance().engine()->activate(); +} + + +void +ConnectWindow::deactivate() +{ + App::instance().engine()->deactivate(); +} + + void ConnectWindow::on_show() { @@ -302,6 +316,8 @@ ConnectWindow::load_widgets() _xml->get_widget("connect_launch_radiobutton", _launch_radio); _xml->get_widget("connect_port_spinbutton", _port_spinbutton); _xml->get_widget("connect_internal_radiobutton", _internal_radio); + _xml->get_widget("connect_activate_button", _activate_button); + _xml->get_widget("connect_deactivate_button", _deactivate_button); _xml->get_widget("connect_disconnect_button", _disconnect_button); _xml->get_widget("connect_connect_button", _connect_button); _xml->get_widget("connect_quit_button", _quit_button); @@ -309,6 +325,8 @@ ConnectWindow::load_widgets() _server_radio->signal_toggled().connect(sigc::mem_fun(this, &ConnectWindow::server_toggled)); _launch_radio->signal_toggled().connect(sigc::mem_fun(this, &ConnectWindow::launch_toggled)); _internal_radio->signal_clicked().connect(sigc::mem_fun(this, &ConnectWindow::internal_toggled)); + _activate_button->signal_clicked().connect(sigc::mem_fun(this, &ConnectWindow::activate)); + _deactivate_button->signal_clicked().connect(sigc::mem_fun(this, &ConnectWindow::deactivate)); _disconnect_button->signal_clicked().connect(sigc::mem_fun(this, &ConnectWindow::disconnect)); _connect_button->signal_clicked().connect(sigc::bind( sigc::mem_fun(this, &ConnectWindow::connect), false)); diff --git a/src/gui/ConnectWindow.hpp b/src/gui/ConnectWindow.hpp index 0a34d8df..a435e900 100644 --- a/src/gui/ConnectWindow.hpp +++ b/src/gui/ConnectWindow.hpp @@ -66,6 +66,8 @@ private: void disconnect(); void connect(bool existing); + void activate(); + void deactivate(); void quit(); void on_show(); void on_hide(); @@ -96,6 +98,8 @@ private: Gtk::SpinButton* _port_spinbutton; Gtk::RadioButton* _launch_radio; Gtk::RadioButton* _internal_radio; + Gtk::Button* _activate_button; + Gtk::Button* _deactivate_button; Gtk::Button* _disconnect_button; Gtk::Button* _connect_button; Gtk::Button* _quit_button; diff --git a/src/gui/ingen_gui.glade b/src/gui/ingen_gui.glade index c5f03375..c5a2fb6e 100644 --- a/src/gui/ingen_gui.glade +++ b/src/gui/ingen_gui.glade @@ -1,7 +1,7 @@ - - - + + + Ingen 640 @@ -21,36 +21,24 @@ + _Import... True Load a patch into the current patch (merge with existing contents). - _Import... True + True - - - - True - gtk-open - 1 - - + + Import _Location... True Import a patch from a URI - Import _Location... True + True - - - - True - gtk-open - 1 - - + @@ -60,9 +48,9 @@ + gtk-save True Save this patch - gtk-save True True @@ -70,51 +58,33 @@ + Save _As... True Save this patch to a specific file name - Save _As... True + True - - - - True - gtk-save-as - 1 - - + + _Upload... True - _Upload... True + True - - - - True - gtk-network - 1 - - + + _Draw... True - _Draw... True + True - - - - True - gtk-print - 1 - - + @@ -124,9 +94,9 @@ + gtk-close True Close this window (patch will not be destroyed) - gtk-close True True @@ -139,9 +109,9 @@ + gtk-quit True Quit GUI (engine may continue running) - gtk-quit True True @@ -165,7 +135,7 @@ _Edit connections True True - + @@ -175,9 +145,9 @@ + gtk-cut True False - gtk-cut True True @@ -185,8 +155,8 @@ - True gtk-copy + True True True @@ -194,9 +164,9 @@ + gtk-paste True False - gtk-paste True True @@ -204,24 +174,24 @@ + gtk-delete True Delete the selected object(s) - gtk-delete True True - + + gtk-select-all True Select all objects in a patch - gtk-select-all True True - + @@ -231,25 +201,19 @@ + Arrange True Automatically arrange canvas - Arrange True - - - - True - gtk-sort-ascending - 1 - - + True + + gtk-clear True Remove all objects from patch - gtk-clear True True @@ -262,36 +226,24 @@ + C_ontrols... True View/Edit controls for this patch - C_ontrols... True + True - - - - True - gtk-preferences - 1 - - + + P_roperties... True View/Edit properties for this patch - P_roperties... True + True - - - - True - gtk-properties - 1 - - + @@ -307,12 +259,12 @@ - True gtk-fullscreen + True True True - + @@ -322,7 +274,7 @@ _Human names True True - + @@ -332,7 +284,7 @@ Port _Names True True - + @@ -341,7 +293,7 @@ _Status Bar True True - + @@ -358,53 +310,35 @@ + _Engine... True Connect to, Disconnect from, or Launch Engine - _Engine... True + True - - - - True - gtk-execute - 1 - - + + _Patch Tree... True View all patches in the engine as a heirarchial list - _Patch Tree... True + True - - - - True - gtk-index - 1 - - + + _Messages... True View error messages from the engine - _Messages... True + True - - - - True - gtk-info - 1 - - + @@ -421,30 +355,18 @@ + Right-click the canvas to add objects True - Right-click the canvas to add objects True - - - True - gtk-info - 1 - - + True + Press 'e' to toggle edit mode True - Press 'e' to toggle edit mode True - - - True - gtk-info - 1 - - + True @@ -454,8 +376,8 @@ - True gtk-about + True True True @@ -469,18 +391,19 @@ False False + 0 True True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC + automatic + automatic True - GTK_SHADOW_NONE + none @@ -507,7 +430,7 @@ 8 Load Plugin - GTK_WIN_POS_CENTER_ON_PARENT + center-on-parent 640 480 @@ -519,8 +442,8 @@ True True 2 - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC + automatic + automatic True @@ -531,6 +454,9 @@ + + 0 + @@ -596,16 +522,18 @@ True True Name of new Module - * + + 0 + + Polyphonic True True - Polyphonic + False True - 0 True True @@ -629,13 +557,13 @@ + gtk-add True False True + False Add selected plugin to patch - gtk-add True - 0 2 @@ -652,7 +580,6 @@ True True Search string to filter plugin list - * 1 @@ -672,12 +599,12 @@ + gtk-clear True True + False Clear filter text (show all plugins) - gtk-clear True - 0 2 @@ -701,8 +628,8 @@ 8 Create Subpatch False - GTK_WIN_POS_CENTER_ON_PARENT - GDK_WINDOW_TYPE_HINT_DIALOG + center-on-parent + dialog True @@ -759,7 +686,6 @@ True True True - * True @@ -770,6 +696,9 @@ + + 0 + @@ -786,15 +715,20 @@ True 4 - GTK_BUTTONBOX_END + end + gtk-cancel True True - gtk-cancel + False True - 0 + + False + False + 0 + @@ -802,7 +736,7 @@ True True True - 0 + False True @@ -820,6 +754,7 @@ False False + 0 @@ -840,6 +775,8 @@ + False + False 1 @@ -853,8 +790,8 @@ Load Subpatch - GTK_WIN_POS_CENTER_ON_PARENT - GDK_WINDOW_TYPE_HINT_DIALOG + center-on-parent + dialog True @@ -894,12 +831,12 @@ + Load from file True True + False Use the name stored in the patch file - Load from file True - 0 True True @@ -912,12 +849,12 @@ + Load from file True True + False Use the polyphony value stored in the patch file - Load from file True - 0 True True @@ -935,18 +872,19 @@ True + Specify: True True + False Specify a custom polyphony value for new patch - Specify: True - 0 True load_subpatch_poly_from_file_radio False False + 0 @@ -975,12 +913,12 @@ + Same as parent (?) True True + False Set polyphony to the same value as the parent (containing) patch - Same as parent (?) True - 0 True load_subpatch_poly_from_file_radio @@ -1010,18 +948,19 @@ True + Specify: True True + False Specify the name for the new patch - Specify: True - 0 True load_subpatch_name_from_file_radio False False + 0 @@ -1030,7 +969,6 @@ False True Specify the name for the new patch - * True @@ -1054,35 +992,45 @@ True - GTK_BUTTONBOX_END + end + gtk-cancel + -6 True True True - gtk-cancel + False True - -6 + + False + False + 0 + + gtk-open + -5 True True True True - gtk-open + False True - -5 + False + False 1 False - GTK_PACK_END + end + 0 @@ -1090,15 +1038,14 @@ Load Patch - GTK_WIN_POS_CENTER_ON_PARENT - GDK_WINDOW_TYPE_HINT_DIALOG + center-on-parent + dialog 24 True - 1 4 12 4 @@ -1116,12 +1063,12 @@ + Keep current True True + False Use the same polyphony as the current patch - Keep current True - 0 True True @@ -1134,12 +1081,12 @@ + Load from file True True + False Use the polyphony value stored in the patch file - Load from file True - 0 True load_patch_poly_from_current_radio @@ -1155,17 +1102,18 @@ True + Specify: True True - Specify: + False True - 0 True load_patch_poly_from_current_radio False False + 0 @@ -1199,35 +1147,45 @@ True - GTK_BUTTONBOX_END + end + gtk-cancel + -6 True True True - gtk-cancel + False True - -6 + + False + False + 0 + + gtk-open + -5 True True True True - gtk-open + False True - -5 + False + False 1 False - GTK_PACK_END + end + 0 @@ -1240,21 +1198,6 @@ True 5 2 - - - - - - - - - - - - - - - True @@ -1276,6 +1219,7 @@ False False + 0 @@ -1300,7 +1244,7 @@ True True - 0 + False True @@ -1312,6 +1256,7 @@ False False + 0 @@ -1332,12 +1277,12 @@ True True - GTK_POLICY_NEVER - GTK_POLICY_AUTOMATIC + never + automatic True - GTK_SHADOW_NONE + none True @@ -1349,6 +1294,9 @@ + + 0 + @@ -1356,17 +1304,18 @@ True + All Voices True True + False Apply changed controls to all voices - All Voices True - 0 True False False + 0 @@ -1375,18 +1324,19 @@ 5 + Specific Voice: True True + False Apply changed controls to one voice only - Specific Voice: True - 0 True control_panel_all_voices_radio False False + 0 @@ -1428,7 +1378,7 @@ True - GTK_TOOLBAR_ICONS + icons True @@ -1438,15 +1388,17 @@ False - False + + 0 + True - GTK_TOOLBAR_ICONS + icons False @@ -1458,6 +1410,7 @@ False + True @@ -1473,7 +1426,6 @@ False - False @@ -1493,7 +1445,6 @@ False - False @@ -1502,7 +1453,6 @@ False - False @@ -1513,6 +1463,7 @@ False + True @@ -1524,6 +1475,7 @@ False + True @@ -1532,7 +1484,6 @@ False - False @@ -1543,6 +1494,7 @@ False + True @@ -1554,6 +1506,7 @@ False + True @@ -1565,6 +1518,7 @@ False + True @@ -1574,7 +1528,6 @@ False - False @@ -1588,6 +1541,7 @@ False + True @@ -1600,6 +1554,7 @@ False False + 0 @@ -1612,7 +1567,7 @@ True GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON1_MOTION_MASK | GDK_BUTTON2_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK | GDK_VISIBILITY_NOTIFY_MASK | GDK_PROXIMITY_IN_MASK | GDK_PROXIMITY_OUT_MASK | GDK_SUBSTRUCTURE_MASK | GDK_SCROLL_MASK 1 - GTK_SHADOW_IN + in @@ -1659,6 +1614,7 @@ False False + 0 @@ -1698,6 +1654,7 @@ False False + 0 @@ -1721,6 +1678,21 @@ 8 + + + + + + + + + + + + + + + @@ -1737,9 +1709,9 @@ True True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN + automatic + automatic + in True @@ -1748,7 +1720,7 @@ 5 5 False - GTK_WRAP_WORD + word 5 5 False @@ -1756,32 +1728,42 @@ + + 0 + True 6 - GTK_BUTTONBOX_END + end + gtk-clear True False True True - gtk-clear + False True - 0 + + False + False + 0 + + gtk-close True True - gtk-close + False True - 0 + False + False 1 @@ -1821,7 +1803,6 @@ True True - * 1 @@ -1859,45 +1840,55 @@ False + 0 True 6 - GTK_BUTTONBOX_END + end + gtk-save True True + False Save these settings for future sessions - gtk-save True - 0 + + False + False + 0 + + gtk-cancel True True - gtk-cancel + False True - 0 + False + False 1 + gtk-ok True True + False Apply these settings to this session only - gtk-ok True - 0 + False + False 2 @@ -1915,7 +1906,7 @@ 200 8 Patch Description - GTK_WIN_POS_CENTER_ON_PARENT + center-on-parent True @@ -1940,7 +1931,6 @@ True True - * 1 @@ -1951,7 +1941,6 @@ True True - * 1 @@ -1974,21 +1963,22 @@ False + 0 True True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN + automatic + automatic + in True True A short description of the patch to be included in the patch file - GTK_WRAP_WORD + word @@ -2000,28 +1990,35 @@ True 5 - GTK_BUTTONBOX_END + end + gtk-cancel True True True - gtk-cancel + False True - 0 + + False + False + 0 + + gtk-ok True True True + False Apply these changes to be saved the next time the patch is saved - gtk-ok True - 0 + False + False 1 @@ -2038,7 +2035,7 @@ 250 Rename - GTK_WIN_POS_CENTER_ON_PARENT + center-on-parent True @@ -2054,13 +2051,13 @@ False False + 0 True True - * True @@ -2068,6 +2065,9 @@ + + 0 + @@ -2084,16 +2084,21 @@ True 5 - GTK_BUTTONBOX_END + end + gtk-cancel True True True - gtk-cancel + False True - 0 + + False + False + 0 + @@ -2101,7 +2106,7 @@ True True True - 0 + False True @@ -2119,6 +2124,7 @@ False False + 0 @@ -2139,6 +2145,8 @@ + False + False 1 @@ -2154,7 +2162,7 @@ 8 Node Properties - Ingen - GTK_WIN_POS_MOUSE + mouse True @@ -2168,6 +2176,7 @@ False False + 0 @@ -2187,6 +2196,7 @@ False False + 0 @@ -2204,16 +2214,17 @@ False False + 0 + Polyphonic True False True - Polyphonic + False True - 0 True @@ -2340,7 +2351,7 @@ True - GDK_WINDOW_TYPE_HINT_NORMAL + normal Copyright (C) 2005-2008 Dave Robillard <http://drobilla.net> http://drobilla.net/software/ingen Licensed under the GNU GPL, Version 2. @@ -2361,11 +2372,11 @@ Contributors: - - + False - GTK_PACK_END + end + 0 @@ -2381,9 +2392,9 @@ Contributors: True True 3 - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN + automatic + automatic + in True @@ -2399,7 +2410,7 @@ Contributors: 6 Engine - Ingen False - GDK_WINDOW_TYPE_HINT_DIALOG + dialog True @@ -2415,10 +2426,11 @@ Contributors: True 12 gtk-disconnect - 3 + 3 False + 0 @@ -2430,11 +2442,11 @@ Contributors: True 0.10000000149 - False False + 0 @@ -2456,6 +2468,7 @@ Contributors: False + 0 @@ -2489,6 +2502,7 @@ Contributors: False False + 0 @@ -2508,11 +2522,13 @@ Contributors: True True - * True 28 osc.udp://localhost:16180 + + 0 + @@ -2525,11 +2541,11 @@ Contributors: + Connect to running server at: True True - Connect to running server at: + False True - 0 True @@ -2539,11 +2555,11 @@ Contributors: + Launch and connect to server on port: True True - Launch and connect to server on port: + False True - 0 True connect_server_radiobutton @@ -2556,12 +2572,12 @@ Contributors: + Use internal engine True False True - Use internal engine + False True - 0 True connect_server_radiobutton @@ -2591,6 +2607,52 @@ Contributors: 2 + + + True + + + False + 3 + + + + + True + 6 + start + + + Deactivate + True + True + True + + + False + False + 0 + + + + + Activate + True + True + True + + + False + False + 1 + + + + + 6 + 4 + + 2 @@ -2599,42 +2661,53 @@ Contributors: True - GTK_BUTTONBOX_END + end + gtk-quit True True True - gtk-quit + False True - 0 + + False + False + 0 + + gtk-disconnect + -6 True False True True - gtk-disconnect + False True - -6 + False + False 1 + gtk-connect + -6 True True True True - gtk-connect + False True - -6 + False + False 2 @@ -2642,7 +2715,8 @@ Contributors: False False - GTK_PACK_END + end + 0 @@ -2652,9 +2726,10 @@ Contributors: True + _Input True - _Input True + True @@ -2686,20 +2761,14 @@ Contributors: - - - True - gtk-connect - 1 - - + _Output True - _Output True + True @@ -2731,68 +2800,43 @@ Contributors: - - - True - gtk-connect - 1 - - + _Find Plugin... True Load a plugin as a child of this patch - _Find Plugin... True + True - - - True - gtk-execute - 1 - - + _Load Patch... True Load a patch as a child of this patch - _Load Patch... True + True - - - True - gtk-open - 1 - - + _New Patch... True Create a new (empty) patch as a child of this patch - _New Patch... True + True - - - True - gtk-new - 1 - - 8 Load Remote Patch - GDK_WINDOW_TYPE_HINT_DIALOG + dialog True @@ -2806,9 +2850,9 @@ Contributors: True True True - GTK_POLICY_AUTOMATIC - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN + automatic + automatic + in True @@ -2816,6 +2860,9 @@ Contributors: + + 0 + @@ -2828,13 +2875,13 @@ Contributors: False False + 0 True True - * 78 @@ -2855,36 +2902,46 @@ Contributors: True - GTK_BUTTONBOX_END + end + gtk-cancel + -6 True True True - gtk-cancel + False True - -6 + + False + False + 0 + + gtk-open + -5 True False True True True - gtk-open + False True - -5 + False + False 1 False - GTK_PACK_END + end + 0 @@ -2894,7 +2951,7 @@ Contributors: 8 Upload Patch False - GDK_WINDOW_TYPE_HINT_DIALOG + dialog True @@ -2913,7 +2970,6 @@ Contributors: The first character must be one of _, a-z or A-Z and subsequenct characters can be from _, a-z, A-Z or 0-9. - * True @@ -2927,7 +2983,6 @@ The first character must be one of _, a-z or A-Z and subsequenct characters can True True Enter a short name for this patch, e.g. "Mega Synth" - * True @@ -2999,25 +3054,32 @@ Thank you for contributing. True - GTK_BUTTONBOX_END + end + gtk-close + -7 True True True - gtk-close + False True - -7 + + False + False + 0 + + -5 True False True True True - -5 + False True @@ -3035,6 +3097,7 @@ Thank you for contributing. False False + 0 @@ -3055,13 +3118,16 @@ Thank you for contributing. + False + False 1 False - GTK_PACK_END + end + 0 @@ -3070,17 +3136,11 @@ Thank you for contributing. + _Properties... True - _Properties... True + True - - - True - gtk-properties - 1 - - @@ -3088,7 +3148,7 @@ Thank you for contributing. 8 Port Properties - Ingen False - GTK_WIN_POS_MOUSE + mouse True @@ -3164,35 +3224,43 @@ Thank you for contributing. True - GTK_BUTTONBOX_END + end + gtk-cancel True True True - gtk-cancel + False True - -6 + + False + False + 0 + + gtk-ok True True True True - gtk-ok + False True - -5 + False + False 1 False - GTK_PACK_END + end + 0 @@ -3212,40 +3280,30 @@ Thank you for contributing. + Dis_connect True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Disconnect all connections - Dis_connect True - - - gtk-disconnect - - + True + _Rename... True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Rename this object - _Rename... True - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-find-and-replace - - + True + gtk-delete True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Destroy this object - gtk-delete True True @@ -3257,10 +3315,10 @@ Thank you for contributing. + gtk-properties True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK View and edit properties - gtk-properties True True @@ -3271,46 +3329,32 @@ Thank you for contributing. GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + _Learn True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Learn from the next received event - _Learn True - - - gtk-media-record - - + True + Con_trols... True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Manipulate controls in a separate window - Con_trols... True - - - gtk-edit - - + True + _GUI... True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Show this node's custom graphical interface in a separate window - _GUI... True - - - True - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - gtk-edit - - + True @@ -3324,15 +3368,11 @@ Thank you for contributing. + R_andomize True Set all controls on this node to random values - R_andomize True - - - gtk-dialog-warning - - + True -- cgit v1.2.1