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(keyval -
GDK_KEY_0);
127 self.keyswitch.process_preset_key(keyval -
GDK_KEY_KP_0);
131 self.keyswitch.process_bank_key(keyval -
GDK_KEY_a);
134 self.keyswitch.display_key_error();
138 bool Liveplay::on_keyboard_toggle_mute(GtkAccelGroup *accel_group, GObject *acceleratable,
139 guint keyval, GdkModifierType modifier,
Liveplay&
self) {
146 bool Liveplay::on_keyboard_toggle_bypass(GtkAccelGroup *accel_group, GObject *acceleratable,
147 guint keyval, GdkModifierType modifier,
Liveplay&
self) {
154 bool Liveplay::on_keyboard_mode_switch(GtkAccelGroup *accel_group, GObject *acceleratable,
155 guint keyval, GdkModifierType modifier,
Liveplay&
self) {
156 self.machine.tuner_switcher_toggle(
self.actions.livetuner->get_active());
162 Gtk::StateType st = Gtk::STATE_NORMAL;
168 st = Gtk::STATE_SELECTED;
171 st = Gtk::STATE_SELECTED;
174 st = Gtk::STATE_PRELIGHT;
180 liveplay_bank->set_sensitive(sens);
181 liveplay_bank->set_state(st);
182 liveplay_preset->set_sensitive(sens);
183 liveplay_preset->set_state(st);
186 bool Liveplay::on_keyboard_arrows(GtkAccelGroup *accel_group, GObject *acceleratable,
187 guint keyval, GdkModifierType modifier,
Liveplay&
self) {
189 Gtk::Adjustment *a =
self.brightness_slider->get_adjustment();
190 double val = a->get_value();
191 double step = a->get_step_increment();
199 Gtk::Adjustment *a =
self.background_slider->get_adjustment();
200 double val = a->get_value();
201 double step = a->get_step_increment();
214 Gtk::Adjustment *background_adj;
219 return new MyPaintBox(cobject, background_adj); }
220 virtual bool on_expose_event(GdkEventExpose *event);
224 call_paint_func(event);
225 Cairo::RefPtr<Cairo::Context> cr =
Glib::wrap(event->window,
true)->create_cairo_context();
226 gdk_cairo_region(cr->cobj(),
event->region);
228 cr->set_source_rgba(0.0, 0.0, 0.0, 1-background_adj->get_value());
230 foreach(sigc::bind(sigc::mem_fun(
this, &MyPaintBox::propagate_expose), event));
237 const std::string& fname,
const GxActions& actions_)
244 keyswitch(machine_, sigc::mem_fun(this, &
Liveplay::display)),
248 const char *id_list[] = {
"LivePlay", 0};
249 bld = gx_gui::GxBuilder::create_from_file(fname, &machine, id_list);
250 bld->get_toplevel(
"LivePlay", window);
252 bld->find_widget(
"liveplay_bank", liveplay_bank);
253 bld->find_widget(
"liveplay_preset", liveplay_preset);
254 bld->find_widget(
"liveplay_bypass_image", bypass_image);
255 bld->find_widget(
"liveplay_mute_image", mute_image);
256 bld->find_widget(
"liveplay_canvas", liveplay_canvas);
257 bld->find_widget(
"brightness_slider", brightness_slider);
258 bld->find_widget(
"brightness_box", brightness_box);
259 bld->find_widget(
"background_slider", background_slider);
260 bld->find_widget(
"liveplay_exit:barbutton", liveplay_exit);
261 bld->find_widget(
"liveplay_tuner", tuner);
262 bld->find_widget(
"liveplay_midictrl_table", midictrl_table);
263 brightness_adj = brightness_slider->get_adjustment();
264 background_adj = background_slider->get_adjustment();
266 bld->find_widget_derived(
267 "liveplay_paintbox", liveplay_paintbox,
271 Glib::RefPtr<Gdk::Pixbuf> pb;
273 pb = Gdk::Pixbuf::create_from_file(
275 bypass_image->set(pb);
276 }
catch (
const Glib::FileError& ex) {
278 }
catch (
const Gdk::PixbufError& ex) {
281 gx_print_error(
"liveplay",
"failed to load pixmap live_bypass.png");
284 pb = Gdk::Pixbuf::create_from_file(
287 }
catch (
const Glib::FileError& ex) {
289 }
catch (
const Gdk::PixbufError& ex) {
292 gx_print_error(
"liveplay",
"failed to load pixmap live_mute.png");
294 use_composite = window->get_display()->supports_composite();
296 brightness_adj->signal_value_changed().connect(sigc::mem_fun(
this, &Liveplay::on_brightness_changed));
297 liveplay_canvas->signal_realize().connect(sigc::mem_fun(
this, &Liveplay::on_realize));
298 window->signal_expose_event().connect(
299 sigc::mem_fun(
this, &Liveplay::window_expose_event),
true);
301 brightness_box->hide();
303 background_adj->signal_value_changed().connect(
304 sigc::mem_fun(
this, &Liveplay::on_background_changed));
305 Glib::RefPtr<Gdk::Screen> screen = liveplay_canvas->get_screen();
306 Glib::RefPtr<Gdk::Colormap> rgba = screen->get_rgba_colormap();
307 liveplay_canvas->set_colormap(rgba);
308 liveplay_canvas->set_app_paintable(
true);
309 window->signal_delete_event().connect(
310 sigc::mem_fun(
this, &Liveplay::on_delete));
311 window->add_events(Gdk::POINTER_MOTION_HINT_MASK|Gdk::POINTER_MOTION_MASK);
312 window->signal_motion_notify_event().connect(
313 sigc::mem_fun(*
this, &Liveplay::pointer_motion));
315 gtk_activatable_set_related_action(
316 GTK_ACTIVATABLE(liveplay_exit->gobj()), GTK_ACTION(actions.
live_play->gobj()));
317 Glib::RefPtr<Gtk::AccelGroup> ag = Gtk::AccelGroup::create();
318 GClosure *cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.
live_play->gobj()), 0);
319 gtk_accel_group_connect_by_path(ag->gobj(), actions.
live_play->get_accel_path().c_str(), cl);
320 cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.
live_play->gobj()), 0);
321 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_Escape, (GdkModifierType)0, (GtkAccelFlags)0, cl);
323 cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.
livetuner->gobj()), 0);
324 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_Return, (GdkModifierType)0, (GtkAccelFlags)0, cl);
326 cl = g_cclosure_new(G_CALLBACK(do_action), (gpointer)(actions.
quit->gobj()), 0);
327 gtk_accel_group_connect_by_path(ag->gobj(), actions.
quit->get_accel_path().c_str(), cl);
329 cl = g_cclosure_new(G_CALLBACK(on_keyboard_toggle_mute), (gpointer)
this, 0);
330 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_M, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl);
332 cl = g_cclosure_new(G_CALLBACK(on_keyboard_toggle_bypass), (gpointer)
this, 0);
333 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_B, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl);
335 cl = g_cclosure_new(G_CALLBACK(on_keyboard_arrows), (gpointer)
this, 0);
336 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_Left, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl);
337 cl = g_cclosure_new(G_CALLBACK(on_keyboard_arrows), (gpointer)
this, 0);
338 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_Right, 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_Up, 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_Down, GDK_CONTROL_MASK, (GtkAccelFlags)0, cl);
345 cl = g_cclosure_new(G_CALLBACK(on_keyboard_preset_select), (gpointer)
this, 0);
346 gtk_accel_group_connect(ag->gobj(), n, (GdkModifierType)0, (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_mode_switch), (gpointer)
this, 0);
358 gtk_accel_group_connect(ag->gobj(),
GDK_KEY_space, (GdkModifierType)0, (GtkAccelFlags)0, cl);
360 sigc::mem_fun(
this, &Liveplay::display));
362 sigc::mem_fun(
this, &Liveplay::set_display_state));
364 sigc::mem_fun(
this, &Liveplay::on_selection_done));
366 window->add_accel_group(ag);
369 sigc::mem_fun(
this, &Liveplay::on_engine_state_change));
371 sigc::mem_fun(
this, &Liveplay::on_selection_changed));
373 on_engine_state_change(machine.
get_state());
374 on_selection_changed();
381 bool Liveplay::pointer_motion(GdkEventMotion* event) {
383 gdk_event_request_motions(event);
385 if (mouse_hide_conn.connected()) {
386 mouse_hide_conn.disconnect();
388 window->get_window()->set_cursor();
390 mouse_hide_conn = Glib::signal_timeout().connect_seconds(
393 sigc::mem_fun1(window->get_window().operator->(), &Gdk::Window::set_cursor),
394 Gdk::Cursor(Gdk::BLANK_CURSOR)),
408 void Liveplay::on_selection_done(
bool v) {
418 void Liveplay::on_selection_changed() {
428 if (act->get_active()) {
429 window->fullscreen();
431 sigc::mem_fun(
this, &Liveplay::add_midi_elements));
435 midi_conn.disconnect();
443 bool Liveplay::window_expose_event(GdkEventExpose *event) {
444 Cairo::RefPtr<Cairo::Context> cr =
Glib::wrap(event->window,
true)->create_cairo_context();
445 Gtk::Allocation a = liveplay_canvas->get_allocation();
446 Gdk::Region region(a);
447 region.intersect(
Glib::wrap(event->region,
true));
448 Gdk::Cairo::add_region_to_path(cr, region);
450 cr->set_operator(Cairo::OPERATOR_SOURCE);
451 cr->set_source_rgb(0,0,0);
454 gdk_cairo_set_source_pixmap(cr->cobj(), liveplay_canvas->get_window()->gobj(), a.get_x(), a.get_y());
455 cr->paint_with_alpha(pow(brightness_adj->get_value(),2.2));
459 bool Liveplay::on_delete(GdkEventAny *ev) {
460 liveplay_exit->set_active(
false);
464 void Liveplay::on_brightness_changed() {
465 window->queue_draw();
468 void Liveplay::on_background_changed() {
469 window->queue_draw();
473 tuner->set_sensitive(v);
474 tuner->set_visible(v);
477 void Liveplay::on_realize() {
478 liveplay_canvas->get_window()->set_composited(
true);
485 void midi_value_changed(
int ctr,
int val);
492 : Gtk::ProgressBar(), ctr(n) {
494 sigc::mem_fun(
this, &MidiControllerDisplay::midi_value_changed));
495 set_size_request(400, 50);
503 void MidiControllerDisplay::midi_value_changed(
int c,
int v) {
509 set_fraction(v / 127.0);
511 set_sensitive(
false);
515 void Liveplay::add_midi_elements() {
520 Gtk::Table::TableList& tl = midictrl_table->children();
521 tl.erase(tl.begin(), tl.end());
522 for (
int i = 0; i < machine.midi_size(); i++) {
529 v = Glib::ustring::compose(
"%1: ", i);
531 for (gx_engine::midi_controller_list::iterator j = cl.begin(); j != cl.end(); ++j) {
533 v += Glib::ustring::compose(
" %1/%2", p.
l_group(), p.
l_name());
535 midictrl_table->attach(
537 left, left+1, top, top+1, Gtk::AttachOptions(0));
539 if (top >= top_max) {
543 if (left >= left_max) {
547 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
std::string get_style_filepath(const std::string &basename) const
static MyPaintBox * create_from_builder(BaseObjectType *cobject, Gtk::Adjustment *background_adj)
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