summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2005-11-29 22:48:54 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2005-11-29 22:48:54 +0000
commitad8028554827f9e72dd978e218a3d9538e30d8de (patch)
tree800b8e3066f01328a7ebc72a892abccb727b9861
parent0f5dc815418c20de2658c27e59a7ef9bc451907d (diff)
more fixes to get things moving along
git-svn-id: svn://localhost/trunk/ardour2@151 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/actions.cc7
-rw-r--r--gtk2_ardour/ardour.bindings4
-rw-r--r--gtk2_ardour/ardour_ui.cc4
-rw-r--r--gtk2_ardour/ardour_ui_dependents.cc12
-rw-r--r--gtk2_ardour/editor.cc2
-rw-r--r--gtk2_ardour/main.cc6
-rw-r--r--gtk2_ardour/mixer_ui.cc324
-rw-r--r--gtk2_ardour/mixer_ui.h5
-rw-r--r--gtk2_ardour/utils.cc14
9 files changed, 206 insertions, 172 deletions
diff --git a/gtk2_ardour/actions.cc b/gtk2_ardour/actions.cc
index 1ac2ea7228..19af1dfd07 100644
--- a/gtk2_ardour/actions.cc
+++ b/gtk2_ardour/actions.cc
@@ -55,13 +55,8 @@ ActionManager::init ()
} catch (Glib::MarkupError& err) {
error << "badly formatted UI definition file" << endmsg;
} catch (...) {
- cerr << "ardour action xml file not found" << endl;
+ error << "Ardour menu definition file not found" << endmsg;
}
-
- RefPtr<ActionGroup> grp = ActionGroup::create ("misc");
- register_action (grp, "null", "relax");
-
- ui_manager->insert_action_group (grp);
}
RefPtr<Action>
diff --git a/gtk2_ardour/ardour.bindings b/gtk2_ardour/ardour.bindings
new file mode 100644
index 0000000000..fccdd07620
--- /dev/null
+++ b/gtk2_ardour/ardour.bindings
@@ -0,0 +1,4 @@
+ this file is an automated accelerator map dump
+
+(gtk_accel_path "<Actions>/Common/Quit" "<Control>q")
+
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 794833b353..203a1ab10d 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -832,6 +832,10 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
theArdourUI = this;
}
+ // allow run-time rebinding of accels
+
+ Settings::get_default()->property_gtk_can_change_accels() = true;
+
ActionManager::init ();
m_new_session_dialog = 0;
diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc
index 45a047f1d1..8240073da9 100644
--- a/gtk2_ardour/ardour_ui_dependents.cc
+++ b/gtk2_ardour/ardour_ui_dependents.cc
@@ -23,6 +23,9 @@
*/
#include <cstdio>
+
+#include <gtkmm/accelmap.h>
+
#include <pbd/error.h>
#include "ardour_ui.h"
#include "public_editor.h"
@@ -32,7 +35,7 @@
#include "i18n.h"
using namespace sigc;
-
+using namespace Gtk;
namespace ARDOUR {
class Session;
@@ -52,7 +55,6 @@ ARDOUR_UI::shutdown ()
void
ARDOUR_UI::we_have_dependents ()
{
- cerr << "have dependents\n";
setup_keybindings ();
}
@@ -62,6 +64,12 @@ ARDOUR_UI::setup_keybindings ()
install_actions ();
editor->register_actions ();
RedirectBox::register_actions ();
+
+ try {
+ AccelMap::load (ARDOUR::find_config_file ("ardour.bindings"));
+ } catch (...) {
+ error << "ardour key bindings file not found" << endmsg;
+ }
}
void
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 508cce1557..62655bff13 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -66,6 +66,7 @@
#include "crossfade_edit.h"
#include "audio_time_axis.h"
#include "canvas_impl.h"
+#include "actions.h"
#include "gui_thread.h"
#include "i18n.h"
@@ -679,6 +680,7 @@ Editor::Editor (AudioEngine& eng)
global_hpacker.pack_start (global_vpacker, true, true);
set_name ("EditorWindow");
+ add_accel_group (ActionManager::ui_manager->get_accel_group());
vpacker.pack_end (global_hpacker, true, true);
diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc
index 05394f8b0f..dfacbc788a 100644
--- a/gtk2_ardour/main.cc
+++ b/gtk2_ardour/main.cc
@@ -186,8 +186,6 @@ catch_signals (void)
pthread_t signal_thread_id;
sigset_t signals;
- return 0;
-
// if (setpgid (0,0)) {
if (setsid ()) {
warning << string_compose (_("cannot become new process group leader (%1)"),
@@ -361,10 +359,6 @@ main (int argc, char *argv[])
gtk_rc_set_default_files (null_file_list);
- // allow run-time rebinding of accels
-
- Settings::get_default()->property_gtk_can_change_accels() = true;
-
cout << _("Ardour/GTK ")
<< VERSIONSTRING
<< _("\n (built using ")
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc
index 70a32b0cf8..5d8f88eeeb 100644
--- a/gtk2_ardour/mixer_ui.cc
+++ b/gtk2_ardour/mixer_ui.cc
@@ -21,6 +21,8 @@
#include <algorithm>
#include <sigc++/bind.h>
+#include <gtkmm/accelmap.h>
+
#include <pbd/lockmonitor.h>
#include <gtkmm2ext/gtk_ui.h>
#include <gtkmm2ext/utils.h>
@@ -38,12 +40,14 @@
#include "ardour_ui.h"
#include "prompter.h"
#include "utils.h"
+#include "actions.h"
#include "gui_thread.h"
#include "i18n.h"
using namespace ARDOUR;
using namespace Gtk;
+using namespace Glib;
using namespace Gtkmm2ext;
using namespace sigc;
@@ -154,11 +158,13 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
set_title (_("ardour: mixer"));
set_wmclass (_("ardour_mixer"), "Ardour");
+ add_accel_group (ActionManager::ui_manager->get_accel_group());
+
signal_delete_event().connect (bind (ptr_fun (just_hide_it), static_cast<Gtk::Window *>(this)));
add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
track_display.get_selection()->signal_changed().connect (mem_fun(*this, &Mixer_UI::track_display_selection_changed));
- track_display_model->signal_rows_reordered().connect (mem_fun (*this, &Mixer_UI::track_display_reordered_proxy));
+ reorder_connection = track_display_model->signal_rows_reordered().connect (mem_fun (*this, &Mixer_UI::track_display_reordered_proxy));
group_display.signal_button_press_event().connect (mem_fun (*this, &Mixer_UI::group_display_button_press));
group_display.get_selection()->signal_changed().connect (mem_fun (*this, &Mixer_UI::group_display_selection_changed));
@@ -206,7 +212,7 @@ Mixer_UI::add_strip (Route* route)
ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::add_strip), route));
MixerStrip* strip;
-
+
if (route->hidden()) {
return;
}
@@ -217,14 +223,18 @@ Mixer_UI::add_strip (Route* route)
strip->set_width (_strip_width);
show_strip (strip);
+ reorder_connection.block();
+
TreeModel::Row row = *(track_display_model->append());
row[track_display_columns.text] = route->name();
row[track_display_columns.route] = route;
row[track_display_columns.strip] = strip;
- if (strip->marked_for_display() || strip->packed()) {
- track_display.get_selection()->select (row);
- }
+ reorder_connection.unblock();
+
+ // if (strip->marked_for_display() || strip->packed()) {
+ // track_display.get_selection()->select (row);
+ // }
route->name_changed.connect (bind (mem_fun(*this, &Mixer_UI::strip_name_changed), strip));
strip->GoingAway.connect (bind (mem_fun(*this, &Mixer_UI::remove_strip), strip));
@@ -298,14 +308,11 @@ Mixer_UI::connect_to_session (Session* sess)
wintitle += session->name();
set_title (wintitle);
- // GTK2FIX
- // track_display_list.freeze ();
-
+ // GTK2FIX: do we really need to do this?
+ // track_display.set_model (RefPtr<TreeStore>(0));
track_display_model->clear ();
-
session->foreach_route (this, &Mixer_UI::add_strip);
-
- // track_display_list.thaw ();
+ // track_display.set_model (track_display_model);
session->going_away.connect (mem_fun(*this, &Mixer_UI::disconnect_from_session));
session->RouteAdded.connect (mem_fun(*this, &Mixer_UI::add_strip));
@@ -428,156 +435,161 @@ Mixer_UI::show_strip (MixerStrip* ms)
if (ms->route().master() || ms->route().control()) {
out_packer.pack_start (*ms, false, false);
+ cerr << "Packed master strip @ " << ms << endl;
} else {
- strip_packer.pack_start (*ms, false, false);
+ strip_packer.pack_start (*ms, false, false);
+ cerr << "Packed strip @ " << ms << endl;
}
ms->set_packed (true);
ms->show ();
- }
-}
-
-void
-Mixer_UI::hide_strip (MixerStrip* ms)
-{
- if (ms->packed()) {
- if (ms->route().master() || ms->route().control()) {
- out_packer.remove (*ms);
- } else {
- strip_packer.remove (*ms);
- }
- ms->set_packed (false);
- }
-}
-
-gint
-Mixer_UI::start_updating ()
-{
- screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::update_strips));
- fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::fast_update_strips));
- return 0;
-}
-
-gint
-Mixer_UI::stop_updating ()
-{
- screen_update_connection.disconnect();
- fast_screen_update_connection.disconnect();
- return 0;
-}
-
-void
-Mixer_UI::update_strips ()
-{
- if (is_mapped () && session) {
- for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
- (*i)->update ();
- }
- }
-}
-
-void
-Mixer_UI::fast_update_strips ()
-{
- if (is_mapped () && session) {
- for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
- (*i)->fast_update ();
- }
- }
-}
-
-void
-Mixer_UI::snapshot_display_selection_changed ()
-{
- TreeModel::iterator i = snapshot_display.get_selection()->get_selected();
-
- Glib::ustring snap_name = (*i)[snapshot_display_columns.real_name];
-
- if (session->snap_name() == snap_name) {
- return;
- }
-
- ARDOUR_UI::instance()->load_session(session->path(), string (snap_name));
-}
-
-bool
-Mixer_UI::snapshot_display_button_press (GdkEventButton* ev)
-{
- return false;
-}
-
-void
-Mixer_UI::track_display_selection_changed ()
-{
- MixerStrip* strip;
- TreeModel::Children rows = track_display_model->children();
- TreeModel::Children::iterator i;
- Glib::RefPtr<TreeSelection> selection = track_display.get_selection();
-
- for (i = rows.begin(); i != rows.end(); ++i) {
- if (selection->is_selected (i)) {
- strip = (*i)[track_display_columns.strip];
- strip->set_marked_for_display (true);
- show_strip (strip);
- } else {
- strip = (*i)[track_display_columns.strip];
- strip->set_marked_for_display (false);
- hide_strip (strip);
- }
- }
-
- track_display_reordered ();
-}
-
-void
-Mixer_UI::select_strip_op (MixerStrip *strip, bool yn)
-{
- TreeModel::Children rows = track_display_model->children();
- TreeModel::Children::iterator i;
- Glib::RefPtr<TreeSelection> selection = track_display.get_selection();
-
- for (i = rows.begin(); i != rows.end(); ++i) {
- if ((*i)[track_display_columns.strip] == strip) {
- if (yn) {
- selection->select (*i);
- } else {
- selection->unselect (*i);
- }
- break;
- }
- }
-}
-
-void
-Mixer_UI::unselect_strip_in_display (MixerStrip *strip)
-{
- select_strip_op (strip, true);
-}
-void
-Mixer_UI::select_strip_in_display (MixerStrip *strip)
-{
- select_strip_op (strip, false);
-}
-
-void
-Mixer_UI::track_display_reordered_proxy (const TreeModel::Path& path, const TreeModel::iterator& i, int* n)
-{
- track_display_reordered ();
-}
-
-void
-Mixer_UI::track_display_reordered ()
-{
- TreeModel::Children rows = track_display_model->children();
- TreeModel::Children::iterator i;
- long order;
-
- for (order = 0, i = rows.begin(); i != rows.end(); ++i, ++order) {
- MixerStrip* strip = (*i)[track_display_columns.strip];
-
- if (strip->marked_for_display()) {
- strip->route().set_order_key (N_("signal"), order);
- strip_packer.reorder_child (*strip, -1); /* put at end */
+ }
+ }
+
+ void
+ Mixer_UI::hide_strip (MixerStrip* ms)
+ {
+ if (ms->packed()) {
+ if (ms->route().master() || ms->route().control()) {
+ out_packer.remove (*ms);
+ } else {
+ strip_packer.remove (*ms);
+ }
+ ms->set_packed (false);
+ }
+ }
+
+ gint
+ Mixer_UI::start_updating ()
+ {
+ screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::update_strips));
+ fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::fast_update_strips));
+ return 0;
+ }
+
+ gint
+ Mixer_UI::stop_updating ()
+ {
+ screen_update_connection.disconnect();
+ fast_screen_update_connection.disconnect();
+ return 0;
+ }
+
+ void
+ Mixer_UI::update_strips ()
+ {
+ if (is_mapped () && session) {
+ for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
+ (*i)->update ();
+ }
+ }
+ }
+
+ void
+ Mixer_UI::fast_update_strips ()
+ {
+ if (is_mapped () && session) {
+ for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
+ (*i)->fast_update ();
+ }
+ }
+ }
+
+ void
+ Mixer_UI::snapshot_display_selection_changed ()
+ {
+ TreeModel::iterator i = snapshot_display.get_selection()->get_selected();
+
+ Glib::ustring snap_name = (*i)[snapshot_display_columns.real_name];
+
+ if (session->snap_name() == snap_name) {
+ return;
+ }
+
+ ARDOUR_UI::instance()->load_session(session->path(), string (snap_name));
+ }
+
+ bool
+ Mixer_UI::snapshot_display_button_press (GdkEventButton* ev)
+ {
+ return false;
+ }
+
+ void
+ Mixer_UI::track_display_selection_changed ()
+ {
+ MixerStrip* strip;
+ TreeModel::Children rows = track_display_model->children();
+ TreeModel::Children::iterator i;
+ Glib::RefPtr<TreeSelection> selection = track_display.get_selection();
+
+ for (i = rows.begin(); i != rows.end(); ++i) {
+ if (selection->is_selected (i)) {
+ strip = (*i)[track_display_columns.strip];
+ strip->set_marked_for_display (true);
+ show_strip (strip);
+ } else {
+ strip = (*i)[track_display_columns.strip];
+ strip->set_marked_for_display (false);
+ hide_strip (strip);
+ }
+ }
+
+ track_display_reordered ();
+ }
+
+ void
+ Mixer_UI::select_strip_op (MixerStrip *strip, bool yn)
+ {
+ TreeModel::Children rows = track_display_model->children();
+ TreeModel::Children::iterator i;
+ Glib::RefPtr<TreeSelection> selection = track_display.get_selection();
+
+ for (i = rows.begin(); i != rows.end(); ++i) {
+ if ((*i)[track_display_columns.strip] == strip) {
+ if (yn) {
+ selection->select (*i);
+ } else {
+ selection->unselect (*i);
+ }
+ break;
+ }
+ }
+ }
+
+ void
+ Mixer_UI::unselect_strip_in_display (MixerStrip *strip)
+ {
+ select_strip_op (strip, true);
+ }
+ void
+ Mixer_UI::select_strip_in_display (MixerStrip *strip)
+ {
+ select_strip_op (strip, false);
+ }
+
+ void
+ Mixer_UI::track_display_reordered_proxy (const TreeModel::Path& path, const TreeModel::iterator& i, int* n)
+ {
+ track_display_reordered ();
+ }
+
+ void
+ Mixer_UI::track_display_reordered ()
+ {
+ TreeModel::Children rows = track_display_model->children();
+ TreeModel::Children::iterator i;
+ long order;
+
+ for (order = 0, i = rows.begin(); i != rows.end(); ++i, ++order) {
+ MixerStrip* strip = (*i)[track_display_columns.strip];
+
+ if (strip->marked_for_display()) {
+ strip->route().set_order_key (N_("signal"), order);
+ if (strip->packed()) {
+ cerr << "reorder strip @ " << strip << endl;
+ strip_packer.reorder_child (*strip, -1); /* put at end */
+ }
}
}
}
diff --git a/gtk2_ardour/mixer_ui.h b/gtk2_ardour/mixer_ui.h
index f1f004351a..71443a6896 100644
--- a/gtk2_ardour/mixer_ui.h
+++ b/gtk2_ardour/mixer_ui.h
@@ -139,10 +139,11 @@ class Mixer_UI : public Gtk::Window
void track_display_selected (gint row, gint col, GdkEvent *ev);
void track_display_unselected (gint row, gint col, GdkEvent *ev);
- void queue_track_display_reordered (gint row, gint col);
+ void track_name_changed (MixerStrip *);
+
void track_display_reordered_proxy (const Gtk::TreePath& path, const Gtk::TreeIter& i, int* n);
void track_display_reordered ();
- void track_name_changed (MixerStrip *);
+ sigc::connection reorder_connection;
void group_selected (gint row, gint col, GdkEvent *ev);
void group_unselected (gint row, gint col, GdkEvent *ev);
diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc
index 8998b56229..9d1966b10e 100644
--- a/gtk2_ardour/utils.cc
+++ b/gtk2_ardour/utils.cc
@@ -480,8 +480,20 @@ pane_handler (GdkEventButton* ev, Gtk::Paned* pane)
uint32_t
rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a)
{
+ /* In GTK+2, styles aren't set up correctly if the widget is not
+ attached to a toplevel window that has a screen pointer.
+ */
+
+ static Gtk::Window* window = 0;
+
+ if (window == 0) {
+ window = new Window (WINDOW_TOPLEVEL);
+ }
+
Gtk::Label foo;
+ window->add (foo);
+
foo.set_name (style);
foo.ensure_style ();
@@ -499,6 +511,8 @@ rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a)
} else {
warning << string_compose (_("missing RGBA style for \"%1\""), style) << endl;
}
+
+ window->remove ();
return (uint32_t) RGBA_TO_UINT(r,g,b,a);
}