fix editpanel wdw lock issues, use undo bracketing to avoid stop playback deadlocks
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / cwindowgui.C
index 19ff101e3f0383a56ba20b8e9df6a2c981922416..610d4e7c9400d17540f7de5ba320afe85f6fad28 100644 (file)
@@ -463,113 +463,144 @@ int CWindowGUI::keypress_event()
        int result = 0;
        int cwindow_operation = CWINDOW_NONE;
 
-       switch(get_keypress())
-       {
-               case 'w':
-               case 'W':
-                       close_event();
-                       result = 1;
-                       break;
-               case '+':
-               case '=':
-                       keyboard_zoomin();
-                       result = 1;
-                       break;
-               case '-':
-                       keyboard_zoomout();
-                       result = 1;
-                       break;
-               case 'f':
+       switch( get_keypress() ) {
+       case 'w':
+       case 'W':
+               close_event();
+               result = 1;
+               break;
+       case '+':
+       case '=':
+               keyboard_zoomin();
+               result = 1;
+               break;
+       case '-':
+               keyboard_zoomout();
+               result = 1;
+               break;
+       case 'f':
+               unlock_window();
+               if(mwindow->session->cwindow_fullscreen)
+                       canvas->stop_fullscreen();
+               else
+                       canvas->start_fullscreen();
+               lock_window("CWindowGUI::keypress_event 1");
+               result = 1;
+               break;
+       case 'x':
+               if( ctrl_down() || shift_down() || alt_down() ) break;
+               unlock_window();
+               mwindow->gui->lock_window("CWindowGUI::keypress_event 2");
+               mwindow->cut();
+               mwindow->gui->unlock_window();
+               lock_window("CWindowGUI::keypress_event 2");
+               result = 1;
+               break;
+       case DELETE:
+               unlock_window();
+               mwindow->gui->lock_window("CWindowGUI::keypress_event 2");
+               mwindow->clear_entry();
+               mwindow->gui->unlock_window();
+               lock_window("CWindowGUI::keypress_event 3");
+               result = 1;
+               break;
+       case ESC:
+               unlock_window();
+               if(mwindow->session->cwindow_fullscreen)
+                       canvas->stop_fullscreen();
+               lock_window("CWindowGUI::keypress_event 4");
+               result = 1;
+               break;
+       case LEFT:
+               if( !ctrl_down() ) {
+                       int alt_down = this->alt_down();
+                       int shift_down = this->shift_down();
                        unlock_window();
-                       if(mwindow->session->cwindow_fullscreen)
-                               canvas->stop_fullscreen();
+                       stop_transport(0);
+                       mwindow->gui->lock_window("CWindowGUI::keypress_event 5");
+                       if( alt_down )
+                               mwindow->prev_edit_handle(shift_down);
                        else
-                               canvas->start_fullscreen();
-                       lock_window("CWindowGUI::keypress_event 1");
-                       break;
-               case 'x':
-                       if( ctrl_down() || shift_down() || alt_down() ) break;
+                               mwindow->move_left();
+                       mwindow->gui->unlock_window();
+                       lock_window("CWindowGUI::keypress_event 6");
+                       result = 1;
+               }
+               break;
+
+       case ',':
+               if( !ctrl_down() && !alt_down() ) {
                        unlock_window();
-                       mwindow->gui->lock_window("CWindowGUI::keypress_event 2");
-                       mwindow->cut();
+                       stop_transport(0);
+                       mwindow->gui->lock_window("CWindowGUI::keypress_event 7");
+                       mwindow->move_left();
                        mwindow->gui->unlock_window();
-                       lock_window("CWindowGUI::keypress_event 2");
-                       break;
-               case DELETE:
+                       lock_window("CWindowGUI::keypress_event 8");
+                       result = 1;
+               }
+               break;
+
+       case RIGHT:
+               if( !ctrl_down() ) {
+                       int alt_down = this->alt_down();
+                       int shift_down = this->shift_down();
                        unlock_window();
-                       mwindow->gui->lock_window("CWindowGUI::keypress_event 2");
-                       mwindow->clear_entry();
+                       stop_transport(0);
+                       mwindow->gui->lock_window("CWindowGUI::keypress_event 8");
+                       if( alt_down )
+                               mwindow->next_edit_handle(shift_down);
+                       else
+                               mwindow->move_right();
                        mwindow->gui->unlock_window();
-                       lock_window("CWindowGUI::keypress_event 3");
-                       break;
-               case ESC:
+                       lock_window("CWindowGUI::keypress_event 9");
+                       result = 1;
+               }
+               break;
+
+       case '.':
+               if( !ctrl_down() && !alt_down() ) {
                        unlock_window();
-                       if(mwindow->session->cwindow_fullscreen)
-                               canvas->stop_fullscreen();
-                       lock_window("CWindowGUI::keypress_event 4");
-                       break;
-               case LEFT:
-                       if( !ctrl_down() ) {
-                               int alt_down = this->alt_down();
-                               int shift_down = this->shift_down();
-                               unlock_window();
-                               stop_transport(0);
-                               mwindow->gui->lock_window("CWindowGUI::keypress_event 5");
-                               if( alt_down )
-                                       mwindow->prev_edit_handle(shift_down);
-                               else
-                                       mwindow->move_left();
-                               mwindow->gui->unlock_window();
-                               lock_window("CWindowGUI::keypress_event 6");
-                               result = 1;
-                       }
-                       break;
+                       stop_transport(0);
+                       mwindow->gui->lock_window("CWindowGUI::keypress_event 10");
+                       mwindow->move_right();
+                       mwindow->gui->unlock_window();
+                       lock_window("CWindowGUI::keypress_event 11");
+                       result = 1;
+               }
+               break;
+       }
 
-               case ',':
-                       if( !ctrl_down() && !alt_down() ) {
-                               unlock_window();
-                               stop_transport(0);
-                               mwindow->gui->lock_window("CWindowGUI::keypress_event 7");
-                               mwindow->move_left();
-                               mwindow->gui->unlock_window();
-                               lock_window("CWindowGUI::keypress_event 8");
-                               result = 1;
-                       }
+       if( !result && cwindow_operation < 0 && ctrl_down() && shift_down() ) {
+               switch( get_keypress() ) {
+               case KEY_F1:
+               case KEY_F2:
+               case KEY_F3:
+               case KEY_F4:
+                       resend_event(mwindow->gui);
+                       result = 1;
                        break;
-
-               case RIGHT:
-                       if( !ctrl_down() ) {
-                               int alt_down = this->alt_down();
-                               int shift_down = this->shift_down();
-                               unlock_window();
-                               stop_transport(0);
-                               mwindow->gui->lock_window("CWindowGUI::keypress_event 8");
-                               if( alt_down )
-                                       mwindow->next_edit_handle(shift_down);
-                               else
-                                       mwindow->move_right();
-                               mwindow->gui->unlock_window();
-                               lock_window("CWindowGUI::keypress_event 9");
-                               result = 1;
+               }
+       }
+       if( !result && !ctrl_down() ) {
+               switch( get_keypress() ) {
+               case KEY_F1:
+                       if( shift_down() ) {
+                               mwindow->toggle_camera_xyz();  result = 1;
                        }
+                       else
+                               cwindow_operation = CWINDOW_PROTECT;
                        break;
-
-               case '.':
-                       if( !ctrl_down() && !alt_down() ) {
-                               unlock_window();
-                               stop_transport(0);
-                               mwindow->gui->lock_window("CWindowGUI::keypress_event 10");
-                               mwindow->move_right();
-                               mwindow->gui->unlock_window();
-                               lock_window("CWindowGUI::keypress_event 11");
-                               result = 1;
+               case KEY_F2:
+                       if( shift_down() ) {
+                               mwindow->toggle_projector_xyz();  result = 1;
                        }
+                       else
+                               cwindow_operation = CWINDOW_ZOOM;
                        break;
-
-               case KEY_F1: if( shift_down() ) { mwindow->toggle_camera_xyz();  break; }
-                               cwindow_operation = CWINDOW_PROTECT;    break;
-               case KEY_F2: if( shift_down() ) { mwindow->toggle_projector_xyz();  break; }
-                               cwindow_operation = CWINDOW_ZOOM;       break;
+               }
+       }
+       if( !result && cwindow_operation < 0 && !ctrl_down() && !shift_down() ) {
+               switch( get_keypress() ) {
                case KEY_F3:    cwindow_operation = CWINDOW_MASK;       break;
                case KEY_F4:    cwindow_operation = CWINDOW_RULER;      break;
                case KEY_F5:    cwindow_operation = CWINDOW_CAMERA;     break;
@@ -578,8 +609,9 @@ int CWindowGUI::keypress_event()
                case KEY_F8:    cwindow_operation = CWINDOW_EYEDROP;    break;
                case KEY_F9:    cwindow_operation = CWINDOW_TOOL_WINDOW; break;
                case KEY_F10:   cwindow_operation = CWINDOW_TITLESAFE;  break;
-               case KEY_F11:   canvas->reset_camera();                 break;
-               case KEY_F12:   canvas->reset_projector();              break;
+               case KEY_F11:   canvas->reset_camera();    result = 1;  break;
+               case KEY_F12:   canvas->reset_projector(); result = 1;  break;
+               }
        }
 
        if( cwindow_operation >= 0 ) {
@@ -587,7 +619,8 @@ int CWindowGUI::keypress_event()
                result = 1;
        }
 
-       if(!result) result = transport->keypress_event();
+       if( !result )
+               result = transport->keypress_event();
 
        return result;
 }
@@ -689,7 +722,7 @@ int CWindowGUI::drag_stop()
                {
                        mwindow->save_backup();
                        mwindow->restart_brender();
-                       mwindow->gui->update(1, 1, 1, 1, 0, 1, 0);
+                       mwindow->gui->update(1, NORMAL_DRAW, 1, 1, 0, 1, 0);
                        mwindow->undo->update_undo_after(_("insert assets"), LOAD_ALL);
                        mwindow->gui->unlock_window();
                        mwindow->sync_parameters(CHANGE_ALL);
@@ -746,8 +779,6 @@ CWindowEditing::CWindowEditing(MWindow *mwindow, CWindow *cwindow)
                1, // use_keyframe
                0, // use_splice
                0, // use_overwrite
-               1, // use_lift
-               1, // use_extract
                1, // use_copy
                1, // use_paste
                1, // use_undo
@@ -765,51 +796,70 @@ CWindowEditing::CWindowEditing(MWindow *mwindow, CWindow *cwindow)
        this->cwindow = cwindow;
 }
 
-#define CWrapper(fn) void CWindowEditing::fn() { \
-       mwindow->gui->lock_window("CWrapper::" #fn); \
-       EditPanel::fn(); \
-       mwindow->gui->unlock_window(); \
-}
+#define relock_cm(s) \
+ cwindow->gui->unlock_window(); \
+ mwindow->gui->lock_window("CWindowEditing::" s)
+#define relock_mc(s) \
+ mwindow->gui->unlock_window(); \
+ cwindow->gui->lock_window("CWindowEditing::" s)
+#define panel_fn(fn, args, s) \
+ CWindowEditing::fn args { relock_cm(#fn); s; relock_mc(#fn); }
 
-CWrapper(copy_selection)
-CWrapper(splice_selection)
-CWrapper(overwrite_selection)
-CWrapper(set_inpoint)
-CWrapper(set_outpoint)
-CWrapper(unset_inoutpoint)
-CWrapper(toggle_label)
+// transmit lock to mwindow, and run mbutton->edit_panel->s
+#define panel_btn(fn, args, s) \
+ panel_fn(panel_##fn, args, mwindow->gui->mbuttons->edit_panel->panel_##s)
 
-#define CWrapper_cut(fn) void CWindowEditing::fn(int cut) { \
-       mwindow->gui->lock_window("CWrapper::" #fn); \
-       EditPanel::fn(cut); \
-       mwindow->gui->unlock_window(); \
+double CWindowEditing::get_position()
+{
+       relock_cm("get_position");
+       double ret = mwindow->edl->local_session->get_selectionstart(1);
+       relock_mc("get_position");
+       return ret;
+}
+
+void CWindowEditing::set_position(double position)
+{
+       relock_cm("set_position");
+       set_position(position);
+       relock_mc("set_position");
 }
-CWrapper_cut(prev_label)
-CWrapper_cut(next_label)
-CWrapper_cut(prev_edit)
-CWrapper_cut(next_edit)
 
-void CWindowEditing::to_clip()
+void CWindowEditing::set_click_to_play(int v)
 {
-       mwindow->to_clip(mwindow->edl, _("composer window: "), 0);
+       relock_cm("set_click_to_play");
+       mwindow->edl->session->cwindow_click2play = v;
+       click2play->update(v);
+       relock_mc("set_click_to_play");
 }
 
+void panel_btn(stop_transport,(), stop_transport())
+void panel_btn(toggle_label,(), toggle_label())
+void panel_btn(next_label,(int cut), next_label(cut))
+void panel_btn(prev_label,(int cut), prev_label(cut))
+void panel_btn(next_edit,(int cut), next_edit(cut))
+void panel_btn(prev_edit,(int cut), prev_edit(cut))
+void panel_fn(panel_copy_selection,(), mwindow->copy())
+void CWindowEditing::panel_overwrite_selection() {} // not used
+void CWindowEditing::panel_splice_selection() {} // not used
+void panel_btn(set_inpoint,(), set_inpoint())
+void panel_btn(set_outpoint,(), set_outpoint())
+void panel_btn(unset_inoutpoint,(), unset_inoutpoint())
+void panel_fn(panel_to_clip,(), mwindow->to_clip(mwindow->edl, _("main window: "), 0))
+void panel_btn(cut,(), cut())
+void panel_btn(paste,(), paste())
+void panel_btn(fit_selection,(), fit_selection())
+void panel_btn(fit_autos,(int all), fit_autos(all))
+void panel_btn(set_editing_mode,(int mode), set_editing_mode(mode))
+void panel_btn(set_auto_keyframes,(int v), set_auto_keyframes(v))
+void panel_btn(set_labels_follow_edits,(int v), set_labels_follow_edits(v))
+
 
 CWindowMeters::CWindowMeters(MWindow *mwindow,
-       CWindowGUI *gui,
-       int x,
-       int y,
-       int h)
- : MeterPanel(mwindow,
-               gui,
-               x,
-               y,
-               -1,
-               h,
+       CWindowGUI *gui, int x, int y, int h)
+ : MeterPanel(mwindow, gui, x, y, -1, h,
                mwindow->edl->session->audio_channels,
                mwindow->edl->session->cwindow_meter,
-               0,
-               0)
+               0, 0)
 {
        this->mwindow = mwindow;
        this->gui = gui;