31 last_bank_key.clear();
32 if (key_timeout.connected()) {
33 key_timeout.disconnect();
39 display_empty(
"??",
"??");
42 void KeySwitcher::display_empty(
const Glib::ustring& bank,
const Glib::ustring& preset) {
43 display(bank, preset);
44 key_timeout.disconnect();
45 if (last_bank_key.empty()) {
46 key_timeout = Glib::signal_timeout().connect(
47 sigc::mem_fun(
this, &KeySwitcher::display_current), 400);
49 key_timeout = Glib::signal_timeout().connect(
50 sigc::mem_fun(
this, &KeySwitcher::display_selected_bank), 400);
54 bool KeySwitcher::display_selected_bank() {
55 display(last_bank_key,
"");
56 key_timeout = Glib::signal_timeout().connect(
57 sigc::mem_fun(
this, &KeySwitcher::display_current), 2000);
61 bool KeySwitcher::display_current() {
62 last_bank_key.clear();
72 key_timeout.disconnect();
73 Glib::ustring bank = last_bank_key;
82 if (idx >= f->
size()) {
92 key_timeout.disconnect();
95 display_empty(
"--",
"--");
99 display_selected_bank();
108 void Liveplay::display(
const Glib::ustring& bank,
const Glib::ustring& preset) {
109 liveplay_bank->set_text(bank);
110 liveplay_preset->set_text(preset);
113 bool Liveplay::do_action(GtkAccelGroup *accel_group, GObject *acceleratable,
114 guint keyval, GdkModifierType modifier,
116 gtk_action_activate(act);
120 bool Liveplay::on_keyboard_preset_select(GtkAccelGroup *accel_group, GObject *acceleratable,
121 guint keyval, GdkModifierType modifier,
Liveplay&
self) {
123 self.keyswitch.process_preset_key(9);
127 self.keyswitch.process_preset_key(keyval -
GDK_KEY_1);
131 self.keyswitch.process_preset_key(keyval -
GDK_KEY_KP_1);
135 self.keyswitch.process_bank_key(keyval -
GDK_KEY_a);
138 self.keyswitch.display_key_error();
142 bool Liveplay::on_keyboard_toggle_mute(GtkAccelGroup *accel_group, GObject *acceleratable,
143 guint keyval, GdkModifierType modifier,
Liveplay&
self) {
150 bool Liveplay::on_keyboard_toggle_bypass(GtkAccelGroup *accel_group, GObject *acceleratable,
151 guint keyval, GdkModifierType modifier,
Liveplay&
self) {
158 bool Liveplay::on_keyboard_mode_switch(GtkAccelGroup *accel_group, GObject *acceleratable,
159 guint keyval, GdkModifierType modifier,
Liveplay&
self) {
160 self.machine.tuner_switcher_toggle(
self.actions.livetuner->get_active());
166 Gtk::StateType st = Gtk::STATE_NORMAL;
172 st = Gtk::STATE_SELECTED;
175 st = Gtk::STATE_SELECTED;
178 st = Gtk::STATE_PRELIGHT;
184 liveplay_bank->set_sensitive(sens);
185 liveplay_bank->set_state(st);
186 liveplay_preset->set_sensitive(sens);
187 liveplay_preset->set_state(st);
190 bool Liveplay::on_keyboard_arrows(GtkAccelGroup *accel_group, GObject *acceleratable,
191 guint keyval, GdkModifierType modifier,
Liveplay&
self) {
193 Gtk::Adjustment *a =
self.brightness_slider->get_adjustment();
194 double val = a->get_value();
195 double step = a->get_step_increment();
203 Gtk::Adjustment *a =
self.background_slider->get_adjustment();
204 double val = a->get_value();
205 double step = a->get_step_increment();
218 Gtk::Adjustment *background_adj;
223 return new MyPaintBox(cobject, background_adj); }
224 virtual bool on_expose_event(GdkEventExpose *event);
228 call_paint_func(event);
229 Cairo::RefPtr<Cairo::Context> cr =
Glib::wrap(event->window,
true)->create_cairo_context();
230 gdk_cairo_region(cr->cobj(),
event->region);
232 cr->set_source_rgba(0.0, 0.0, 0.0, 1-background_adj->get_value());
234 foreach(sigc::bind(sigc::mem_fun(
this, &MyPaintBox::propagate_expose), event));
241 const std::string& fname,
const GxActions& actions_)
248 keyswitch(machine_, sigc::mem_fun(this, &
Liveplay::display)),
252 const char *id_list[] = {
"LivePlay", 0};
253 bld = gx_gui::GxBuilder::create_from_file(fname, &machine, id_list);
254 bld->get_toplevel(
"LivePlay", window);
256 bld->find_widget(
"liveplay_bank", liveplay_bank);
257 bld->find_widget(
"liveplay_preset", liveplay_preset);
258 bld->find_widget(
"liveplay_bypass_image", bypass_image);
259 bld->find_widget(
"liveplay_mute_image", mute_image);
260 bld->find_widget(
"liveplay_canvas", liveplay_canvas);
261 bld->find_widget(
"brightness_slider", brightness_slider);
262 bld->find_widget(
"brightness_box", brightness_box);
263 bld->find_widget(
"background_slider", background_slider);
264 bld->find_widget(
"liveplay_exit:barbutton", liveplay_exit);
265 bld->find_widget(
"liveplay_tuner", tuner);
266 bld->find_widget(
"liveplay_midictrl_table", midictrl_table);
267 brightness_adj = brightness_slider->get_adjustment();
268 background_adj = background_slider->get_adjustment();
270 bld->find_widget_derived(
271 "liveplay_paintbox", liveplay_paintbox,
275 Glib::RefPtr<Gdk::Pixbuf> pb;
277 pb = Gdk::Pixbuf::create_from_file(
279 bypass_image->set(pb);
280 }
catch (
const Glib::FileError& ex) {
282 }
catch (
const Gdk::PixbufError& ex) {
285 gx_print_error(
"liveplay",
"failed to load pixmap live_bypass.png");
288 pb = Gdk::Pixbuf::create_from_file(
291 }
catch (
const Glib::FileError& ex) {
293 }
catch (
const Gdk::PixbufError& ex) {
296 gx_print_error(
"liveplay",
"failed to load pixmap live_mute.png");
298 use_composite = window->get_display()->supports_composite();
300 brightness_adj->signal_value_changed().connect(sigc::mem_fun(
this, &Liveplay::on_brightness_changed));
301 liveplay_canvas->signal_realize().connect(sigc::mem_fun(
this, &Liveplay::on_realize));
302 window->signal_expose_event().connect(
303 sigc::mem_fun(
this, &Liveplay::window_expose_event),
true);
305 brightness_box->hide();
307 background_adj->signal_value_changed().connect(
308 sigc::mem_fun(
this, &Liveplay::on_background_changed));
309 Glib::RefPtr<Gdk::Screen> screen = liveplay_canvas->get_screen();
310 Glib::RefPtr<Gdk::Colormap> rgba = screen->get_rgba_colormap();
311 liveplay_canvas->set_colormap(rgba);
312 liveplay_canvas->set_app_paintable(
true);
313 window->signal_delete_event().connect(
314 sigc::mem_fun(
this, &Liveplay::on_delete));
315 window->add_events(Gdk::POINTER_MOTION_HINT_MASK|Gdk::POINTER_MOTION_MASK);
316 window->signal_motion_notify_event().connect(
317 sigc::mem_fun(*
this, &Liveplay::pointer_motion));
319 gtk_activatable_set_related_action(
320 GTK_ACTIVATABLE(liveplay_exit->gobj()), GTK_ACTION(actions.
live_play->gobj()));
321 Glib::RefPtr<Gtk::AccelGroup> ag = Gtk::AccelGroup::create();
322 GClosure *cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.
live_play->gobj()), 0);
323 gtk_accel_group_connect_by_path(ag->gobj(), actions.
live_play->get_accel_path().c_str(), cl);
324 cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.
live_play->gobj()), 0);
325 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_Escape, (GdkModifierType)0, (GtkAccelFlags)0, cl);
327 cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.
livetuner->gobj()), 0);
328 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_Return, (GdkModifierType)0, (GtkAccelFlags)0, cl);
330 cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.
quit->gobj()), 0);
331 gtk_accel_group_connect_by_path(ag->gobj(), actions.
quit->get_accel_path().c_str(), cl);
333 cl = g_cclosure_new(G_CALLBACK(on_keyboard_toggle_mute), (gpointer)
this, 0);
334 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_M, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl);
336 cl = g_cclosure_new(G_CALLBACK(on_keyboard_toggle_bypass), (gpointer)
this, 0);
337 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_B, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl);
339 cl = g_cclosure_new(G_CALLBACK(on_keyboard_arrows), (gpointer)
this, 0);
340 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_Left, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl);
341 cl = g_cclosure_new(G_CALLBACK(on_keyboard_arrows), (gpointer)
this, 0);
342 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_Right, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl);
343 cl = g_cclosure_new(G_CALLBACK(on_keyboard_arrows), (gpointer)
this, 0);
344 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_Up, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl);
345 cl = g_cclosure_new(G_CALLBACK(on_keyboard_arrows), (gpointer)
this, 0);
346 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_Down, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl);
349 cl = g_cclosure_new(G_CALLBACK(on_keyboard_preset_select), (gpointer)
this, 0);
350 gtk_accel_group_connect(ag->gobj(), n, (GdkModifierType)0, (GtkAccelFlags)0, cl);
353 cl = g_cclosure_new(G_CALLBACK(on_keyboard_preset_select), (gpointer)
this, 0);
354 gtk_accel_group_connect(ag->gobj(), n, (GdkModifierType)0, (GtkAccelFlags)0, cl);
357 cl = g_cclosure_new(G_CALLBACK(on_keyboard_preset_select), (gpointer)
this, 0);
358 gtk_accel_group_connect(ag->gobj(), n, (GdkModifierType)0, (GtkAccelFlags)0, cl);
361 cl = g_cclosure_new(G_CALLBACK(on_keyboard_mode_switch), (gpointer)
this, 0);
362 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_space, (GdkModifierType)0, (GtkAccelFlags)0, cl);
364 sigc::mem_fun(
this, &Liveplay::display));
366 sigc::mem_fun(
this, &Liveplay::set_display_state));
368 sigc::mem_fun(
this, &Liveplay::on_selection_done));
370 window->add_accel_group(ag);
373 sigc::mem_fun(
this, &Liveplay::on_engine_state_change));
375 sigc::mem_fun(
this, &Liveplay::on_selection_changed));
377 on_engine_state_change(machine.
get_state());
378 on_selection_changed();
385 bool Liveplay::pointer_motion(GdkEventMotion* event) {
387 gdk_event_request_motions(event);
389 if (mouse_hide_conn.connected()) {
390 mouse_hide_conn.disconnect();
392 window->get_window()->set_cursor();
394 mouse_hide_conn = Glib::signal_timeout().connect_seconds(
397 sigc::mem_fun1(window->get_window().operator->(), &Gdk::Window::set_cursor),
398 Gdk::Cursor(Gdk::BLANK_CURSOR)),
412 void Liveplay::on_selection_done(
bool v) {
422 void Liveplay::on_selection_changed() {
432 if (act->get_active()) {
433 window->fullscreen();
435 sigc::mem_fun(
this, &Liveplay::add_midi_elements));
439 midi_conn.disconnect();
447 bool Liveplay::window_expose_event(GdkEventExpose *event) {
448 Cairo::RefPtr<Cairo::Context> cr =
Glib::wrap(event->window,
true)->create_cairo_context();
449 Gtk::Allocation a = liveplay_canvas->get_allocation();
450 Gdk::Region region(a);
451 region.intersect(
Glib::wrap(event->region,
true));
452 Gdk::Cairo::add_region_to_path(cr, region);
454 cr->set_operator(Cairo::OPERATOR_SOURCE);
455 cr->set_source_rgb(0,0,0);
458 gdk_cairo_set_source_pixmap(cr->cobj(), liveplay_canvas->get_window()->gobj(), a.get_x(), a.get_y());
459 cr->paint_with_alpha(pow(brightness_adj->get_value(),2.2));
463 bool Liveplay::on_delete(GdkEventAny *ev) {
464 liveplay_exit->set_active(
false);
468 void Liveplay::on_brightness_changed() {
469 window->queue_draw();
472 void Liveplay::on_background_changed() {
473 window->queue_draw();
477 tuner->set_sensitive(v);
478 tuner->set_visible(v);
481 void Liveplay::on_realize() {
482 liveplay_canvas->get_window()->set_composited(
true);
489 void midi_value_changed(
int ctr,
int val);
496 : Gtk::ProgressBar(), ctr(n) {
498 sigc::mem_fun(
this, &MidiControllerDisplay::midi_value_changed));
499 set_size_request(300, 50);
507 void MidiControllerDisplay::midi_value_changed(
int c,
int v) {
513 set_fraction(v / 127.0);
515 set_sensitive(
false);
519 void Liveplay::add_midi_elements() {
524 Gtk::Table::TableList& tl = midictrl_table->children();
525 tl.erase(tl.begin(), tl.end());
526 for (
int i = 0; i < machine.midi_size(); i++) {
533 v = Glib::ustring::compose(
"%1: ", i);
535 for (gx_engine::midi_controller_list::iterator j = cl.begin(); j != cl.end(); ++j) {
537 v += Glib::ustring::compose(
" %1/%2", p.
l_group(), p.
l_name());
539 midictrl_table->attach(
541 left, left+1, top, top+1, Gtk::AttachOptions(0));
543 if (top >= top_max) {
547 if (left >= left_max) {
551 midictrl_table->show_all();
virtual GxEngineState get_state()=0
MidiStandardControllers midi_std_ctr
virtual sigc::signal< void, GxEngineState > & signal_state_change()=0
virtual sigc::signal< void, TunerSwitcher::SwitcherState > & tuner_switcher_signal_set_state()=0
virtual int bank_size()=0
Glib::RefPtr< UiBoolToggleAction > livetuner
virtual gx_system::PresetFileGui * get_bank_file(const Glib::ustring &bank) const =0
virtual bool on_expose_event(GdkEventExpose *event)
virtual Glib::ustring get_bank_name(int n)=0
bool process_bank_key(int idx)
MidiControllerDisplay(gx_engine::GxMachineBase &machine, unsigned int n, const gx_engine::midi_controller_list &ctrl, const Glib::ustring &name)
virtual bool setting_is_preset()=0
static MyPaintBox * create_from_builder(BaseObjectType *cobject, Gtk::Adjustment *background_adj)
std::string get_style_filepath(const std::string &basename) const
void gx_print_error(const char *, const std::string &)
virtual const Glib::ustring & get_current_bank()=0
Glib::RefPtr< Gtk::Action > quit
virtual sigc::signal< void > & signal_midi_changed()=0
virtual void tuner_switcher_deactivate()=0
virtual sigc::signal< void > & signal_selection_changed()=0
std::string to_string(const T &t)
bool process_preset_key(int idx)
Glib::RefPtr< Gtk::ToggleAction > live_play
virtual void load_preset(gx_system::PresetFileGui *pf, const Glib::ustring &name)=0
Liveplay(const gx_system::CmdlineOptions &options, gx_engine::GxMachineBase &machine, const std::string &fname, const GxActions &actions)
list< MidiController > midi_controller_list
virtual sigc::signal< void, const Glib::ustring &, const Glib::ustring & > & tuner_switcher_signal_display()=0
void display_tuner(bool v)
Gxw::BigKnob * wrap(GxBigKnob *object, bool take_copy)
virtual sigc::signal< void, bool > & tuner_switcher_signal_selection_done()=0
const Glib::ustring & get_name(int n)
virtual const Glib::ustring & get_current_name()=0
GxPaintBox BaseObjectType
void on_live_play(Glib::RefPtr< Gtk::ToggleAction > act)
virtual sigc::signal< void, int, int > & signal_midi_value_changed()=0
virtual void request_midi_value_update()=0